Alexandre Julliard : winspool.drv: Implement Wow64 entry points in the Unix library.
Alexandre Julliard
julliard at winehq.org
Tue Nov 9 15:55:06 CST 2021
Module: wine
Branch: master
Commit: e5d37832ee66d011ba572a9b571e9fb44a7b2b4d
URL: https://source.winehq.org/git/wine.git/?a=commit;h=e5d37832ee66d011ba572a9b571e9fb44a7b2b4d
Author: Alexandre Julliard <julliard at winehq.org>
Date: Tue Nov 9 11:46:02 2021 +0100
winspool.drv: Implement Wow64 entry points in the Unix library.
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/winspool.drv/cups.c | 144 ++++++++++++++++++++++++++++++++++++++++-----
dlls/winspool.drv/info.c | 21 +++----
dlls/winspool.drv/wspool.h | 6 +-
3 files changed, 143 insertions(+), 28 deletions(-)
diff --git a/dlls/winspool.drv/cups.c b/dlls/winspool.drv/cups.c
index 1cc9bd23a20..830f0c91332 100644
--- a/dlls/winspool.drv/cups.c
+++ b/dlls/winspool.drv/cups.c
@@ -337,14 +337,14 @@ static int get_cups_default_options( const char *printer, int num_options, cups_
static NTSTATUS enum_printers( void *args )
{
- struct enum_printers_params *params = args;
+ const struct enum_printers_params *params = args;
#ifdef SONAME_LIBCUPS
unsigned int num, i, name_len, comment_len, location_len, needed;
WCHAR *comment, *location, *ptr;
struct printer_info *info;
cups_dest_t *dests;
- params->num = 0;
+ *params->num = 0;
if (!pcupsGetDests) return STATUS_NOT_SUPPORTED;
num = pcupsGetDests( &dests );
@@ -357,12 +357,12 @@ static NTSTATUS enum_printers( void *args )
continue;
}
TRACE( "Printer %d: %s\n", i, debugstr_a( dests[i].name ) );
- params->num++;
+ (*params->num)++;
}
- needed = sizeof( *info ) * params->num;
+ needed = sizeof( *info ) * *params->num;
info = params->printers;
- ptr = (WCHAR *)(info + params->num);
+ ptr = (WCHAR *)(info + *params->num);
for (i = 0; i < num; i++)
{
@@ -376,7 +376,7 @@ static NTSTATUS enum_printers( void *args )
location_len = location ? strlenW( location ) + 1 : 0;
needed += (name_len + comment_len + location_len) * sizeof(WCHAR);
- if (needed <= params->size)
+ if (needed <= *params->size)
{
info->name = ptr;
ntdll_umbstowcs( dests[i].name, name_len, info->name, name_len );
@@ -393,21 +393,21 @@ static NTSTATUS enum_printers( void *args )
}
pcupsFreeDests( num, dests );
- if (needed > params->size)
+ if (needed > *params->size)
{
- params->size = needed;
+ *params->size = needed;
return STATUS_BUFFER_OVERFLOW;
}
return STATUS_SUCCESS;
#else
- params->num = 0;
+ *params->num = 0;
return STATUS_NOT_SUPPORTED;
#endif /* SONAME_LIBCUPS */
}
static NTSTATUS get_ppd( void *args )
{
- struct get_ppd_params *params = args;
+ const struct get_ppd_params *params = args;
char *unix_ppd = get_unix_file_name( params->ppd );
NTSTATUS status = STATUS_SUCCESS;
@@ -449,7 +449,7 @@ static NTSTATUS get_ppd( void *args )
static NTSTATUS get_default_page_size( void *args )
{
#ifdef HAVE_APPLICATIONSERVICES_APPLICATIONSERVICES_H
- struct get_default_page_size_params *params = args;
+ const struct get_default_page_size_params *params = args;
NTSTATUS status = STATUS_UNSUCCESSFUL;
PMPrintSession session = NULL;
PMPageFormat format = NULL;
@@ -468,7 +468,7 @@ static NTSTATUS get_default_page_size( void *args )
range.length = CFStringGetLength( paper_name );
size = (range.length + 1) * sizeof(WCHAR);
- if (params->name_size >= size)
+ if (*params->name_size >= size)
{
CFStringGetCharacters( paper_name, range, (UniChar*)params->name );
params->name[range.length] = 0;
@@ -476,7 +476,7 @@ static NTSTATUS get_default_page_size( void *args )
}
else
status = STATUS_BUFFER_OVERFLOW;
- params->name_size = size;
+ *params->name_size = size;
end:
if (format) PMRelease( format );
@@ -663,7 +663,7 @@ static BOOL schedule_cups( const WCHAR *printer_name, const WCHAR *filename, con
static NTSTATUS schedule_job( void *args )
{
- struct schedule_job_params *params = args;
+ const struct schedule_job_params *params = args;
if (params->wine_port[0] == '|')
return schedule_pipe( params->wine_port + 1, params->filename );
@@ -680,7 +680,7 @@ static NTSTATUS schedule_job( void *args )
return FALSE;
}
-unixlib_entry_t __wine_unix_call_funcs[] =
+const unixlib_entry_t __wine_unix_call_funcs[] =
{
process_attach,
enum_printers,
@@ -688,3 +688,117 @@ unixlib_entry_t __wine_unix_call_funcs[] =
get_ppd,
schedule_job,
};
+
+#ifdef _WIN64
+
+typedef ULONG PTR32;
+
+struct printer_info32
+{
+ PTR32 name;
+ PTR32 comment;
+ PTR32 location;
+ BOOL is_default;
+};
+
+static NTSTATUS wow64_enum_printers( void *args )
+{
+ struct
+ {
+ PTR32 printers;
+ PTR32 size;
+ PTR32 num;
+ } const *params32 = args;
+
+ NTSTATUS status;
+ unsigned int i;
+ struct enum_printers_params params =
+ {
+ ULongToPtr( params32->printers ),
+ ULongToPtr( params32->size ),
+ ULongToPtr( params32->num )
+ };
+
+ if (!(status = enum_printers( ¶ms )))
+ {
+ /* convert structures in place */
+ struct printer_info *info = ULongToPtr( params32->printers );
+ struct printer_info32 *info32 = (struct printer_info32 *)info;
+ unsigned int num = *(unsigned int *)ULongToPtr( params32->num );
+
+ for (i = 0; i < num; i++)
+ {
+ info32[i].name = PtrToUlong(info[i].name);
+ info32[i].comment = PtrToUlong(info[i].comment);
+ info32[i].location = PtrToUlong(info[i].location);
+ info32[i].is_default = info[i].is_default;
+ }
+ }
+ return status;
+}
+
+static NTSTATUS wow64_get_default_page_size( void *args )
+{
+ struct
+ {
+ PTR32 name;
+ PTR32 name_size;
+ } const *params32 = args;
+
+ struct get_default_page_size_params params =
+ {
+ ULongToPtr( params32->name ),
+ ULongToPtr( params32->name_size )
+ };
+
+ return get_default_page_size( ¶ms );
+}
+
+static NTSTATUS wow64_get_ppd( void *args )
+{
+ struct
+ {
+ PTR32 printer;
+ PTR32 ppd;
+ } const *params32 = args;
+
+ struct get_ppd_params params =
+ {
+ ULongToPtr( params32->printer ),
+ ULongToPtr( params32->ppd )
+ };
+
+ return get_ppd( ¶ms );
+}
+
+static NTSTATUS wow64_schedule_job( void *args )
+{
+ struct
+ {
+ PTR32 filename;
+ PTR32 port;
+ PTR32 document_title;
+ PTR32 wine_port;
+ } const *params32 = args;
+
+ struct schedule_job_params params =
+ {
+ ULongToPtr( params32->filename ),
+ ULongToPtr( params32->port ),
+ ULongToPtr( params32->document_title ),
+ ULongToPtr( params32->wine_port )
+ };
+
+ return schedule_job( ¶ms );
+}
+
+const unixlib_entry_t __wine_unix_call_wow64_funcs[] =
+{
+ process_attach,
+ wow64_enum_printers,
+ wow64_get_default_page_size,
+ wow64_get_ppd,
+ wow64_schedule_job,
+};
+
+#endif /* _WIN64 */
diff --git a/dlls/winspool.drv/info.c b/dlls/winspool.drv/info.c
index 1b9586f9c52..3424c69d196 100644
--- a/dlls/winspool.drv/info.c
+++ b/dlls/winspool.drv/info.c
@@ -728,7 +728,8 @@ static WCHAR *get_ppd_dir( void )
static BOOL init_unix_printers( void )
{
WCHAR *port, *ppd_dir = NULL, *default_printer = NULL;
- struct enum_printers_params enum_params;
+ unsigned int size, num;
+ struct enum_printers_params enum_params = { NULL, &size, &num };
HKEY printer_key, printers_key;
HANDLE added_printer;
PRINTER_INFO_2W pi2;
@@ -742,19 +743,18 @@ static BOOL init_unix_printers( void )
return FALSE;
}
- enum_params.size = 10000;
- enum_params.printers = NULL;
+ size = 10000;
do
{
- enum_params.size *= 2;
+ size *= 2;
heap_free( enum_params.printers );
- enum_params.printers = heap_alloc( enum_params.size );
+ enum_params.printers = heap_alloc( size );
status = UNIX_CALL( enum_printers, &enum_params );
} while (status == STATUS_BUFFER_OVERFLOW);
if (status) goto end;
- TRACE( "Found %d CUPS %s:\n", enum_params.num, (enum_params.num == 1) ? "printer" : "printers" );
- for (i = 0; i < enum_params.num; i++)
+ TRACE( "Found %d CUPS %s:\n", num, (num == 1) ? "printer" : "printers" );
+ for (i = 0; i < num; i++)
{
struct printer_info *printer = enum_params.printers + i;
@@ -817,7 +817,8 @@ end:
static void set_ppd_overrides( HANDLE printer )
{
WCHAR buffer[256];
- struct get_default_page_size_params params = { .name = buffer, .name_size = sizeof(buffer) };
+ unsigned int name_size = sizeof(buffer);
+ struct get_default_page_size_params params = { .name = buffer, .name_size = &name_size };
NTSTATUS status;
while (1)
@@ -825,10 +826,10 @@ static void set_ppd_overrides( HANDLE printer )
status = UNIX_CALL( get_default_page_size, ¶ms );
if (status != STATUS_BUFFER_OVERFLOW) break;
if (params.name != buffer) heap_free( params.name );
- params.name = heap_alloc( params.name_size );
+ params.name = heap_alloc( name_size );
if (!params.name) break;
}
- if (!status) SetPrinterDataExW( printer, L"PPD Overrides", L"DefaultPageSize", REG_SZ, (BYTE*)params.name, params.name_size );
+ if (!status) SetPrinterDataExW( printer, L"PPD Overrides", L"DefaultPageSize", REG_SZ, (BYTE*)params.name, name_size );
if (params.name != buffer) heap_free( params.name );
}
diff --git a/dlls/winspool.drv/wspool.h b/dlls/winspool.drv/wspool.h
index 39c14f24358..a464e2aaf12 100644
--- a/dlls/winspool.drv/wspool.h
+++ b/dlls/winspool.drv/wspool.h
@@ -48,14 +48,14 @@ struct printer_info
struct enum_printers_params
{
struct printer_info *printers;
- unsigned int size;
- unsigned int num;
+ unsigned int *size;
+ unsigned int *num;
};
struct get_default_page_size_params
{
WCHAR *name;
- unsigned int name_size;
+ unsigned int *name_size;
};
struct get_ppd_params
More information about the wine-cvs
mailing list