gphoto2.ds: Implement Wow64 entry points in the Unix library.

Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
Alexandre Julliard 2021-11-08 20:54:25 +01:00
parent c78fce9e5b
commit 8a4b818a2d
5 changed files with 133 additions and 47 deletions

View file

@ -50,7 +50,7 @@ static boolean _jpeg_resync_to_restart(j_decompress_ptr cinfo, int desired) {
} }
static void _jpeg_term_source(j_decompress_ptr cinfo) { } static void _jpeg_term_source(j_decompress_ptr cinfo) { }
static void close_file( void *handle ) static void close_file( UINT64 handle )
{ {
struct close_file_params params = { handle }; struct close_file_params params = { handle };
GPHOTO2_CALL( close_file, &params ); GPHOTO2_CALL( close_file, &params );
@ -59,7 +59,7 @@ static void close_file( void *handle )
static void close_current_file(void) static void close_current_file(void)
{ {
close_file( activeDS.file_handle ); close_file( activeDS.file_handle );
activeDS.file_handle = NULL; activeDS.file_handle = 0;
free( activeDS.file_data ); free( activeDS.file_data );
} }
@ -522,7 +522,7 @@ _get_gphoto2_file_as_DIB( unsigned int idx, BOOL preview, HWND hwnd, HBITMAP *hD
JSAMPROW samprow, oldsamprow; JSAMPROW samprow, oldsamprow;
struct open_file_params open_params; struct open_file_params open_params;
struct get_file_data_params get_data_params; struct get_file_data_params get_data_params;
void *file_handle; UINT64 file_handle;
unsigned int filesize; unsigned int filesize;
open_params.idx = idx; open_params.idx = idx;

View file

@ -55,7 +55,7 @@ struct tagActiveDS
BOOL *download_flags; BOOL *download_flags;
/* Download and decode JPEG STATE */ /* Download and decode JPEG STATE */
void *file_handle; UINT64 file_handle;
unsigned char *file_data; unsigned char *file_data;
unsigned int file_size; unsigned int file_size;
struct jpeg_source_mgr xjsm; struct jpeg_source_mgr xjsm;

View file

@ -410,8 +410,7 @@ static TW_UINT16 GPHOTO2_EnableDSUserInterface (pTW_IDENTITY pOrigin,
TW_MEMREF pData) TW_MEMREF pData)
{ {
pTW_USERINTERFACE pUserInterface = (pTW_USERINTERFACE) pData; pTW_USERINTERFACE pUserInterface = (pTW_USERINTERFACE) pData;
static const char *extensions[] = { ".jpg", ".JPG", NULL }; struct load_file_list_params params = { "/", &activeDS.file_count };
struct load_file_list_params params = { "/", extensions, &activeDS.file_count };
GPHOTO2_CALL( load_file_list, &params ); GPHOTO2_CALL( load_file_list, &params );
activeDS.download_flags = calloc( activeDS.file_count, sizeof(*activeDS.download_flags) ); activeDS.download_flags = calloc( activeDS.file_count, sizeof(*activeDS.download_flags) );
@ -499,8 +498,6 @@ BOOL WINAPI DllMain (HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
static TW_UINT16 GPHOTO2_OpenDS( pTW_IDENTITY pOrigin, pTW_IDENTITY self ) static TW_UINT16 GPHOTO2_OpenDS( pTW_IDENTITY pOrigin, pTW_IDENTITY self )
{ {
struct open_ds_params params = { self };
if (GPHOTO2_dsmentry == NULL) if (GPHOTO2_dsmentry == NULL)
{ {
HMODULE moddsm = GetModuleHandleW(L"twain_32"); HMODULE moddsm = GetModuleHandleW(L"twain_32");
@ -515,10 +512,10 @@ static TW_UINT16 GPHOTO2_OpenDS( pTW_IDENTITY pOrigin, pTW_IDENTITY self )
} }
} }
if (GPHOTO2_CALL( open_ds, &params )) return TWRC_FAILURE; if (GPHOTO2_CALL( open_ds, self )) return TWRC_FAILURE;
activeDS.file_count = 0; activeDS.file_count = 0;
activeDS.file_handle = NULL; activeDS.file_handle = 0;
activeDS.download_count = 0; activeDS.download_count = 0;
activeDS.currentState = 4; activeDS.currentState = 4;
activeDS.twCC = TWRC_SUCCESS; activeDS.twCC = TWRC_SUCCESS;
@ -548,11 +545,8 @@ static TW_UINT16 GPHOTO2_SourceControlHandler (
GPHOTO2_CALL( close_ds, NULL ); GPHOTO2_CALL( close_ds, NULL );
break; break;
case MSG_GET: case MSG_GET:
{ if (GPHOTO2_CALL( get_identity, pData )) twRC = TWRC_FAILURE;
struct get_identity_params params = { pData };
if (GPHOTO2_CALL( get_identity, &params )) twRC = TWRC_FAILURE;
break; break;
}
case MSG_OPENDS: case MSG_OPENDS:
twRC = GPHOTO2_OpenDS(pOrigin,(pTW_IDENTITY)pData); twRC = GPHOTO2_OpenDS(pOrigin,(pTW_IDENTITY)pData);
break; break;

View file

@ -48,9 +48,9 @@ static char **files;
static unsigned int files_count; static unsigned int files_count;
static unsigned int files_size; static unsigned int files_size;
static void load_filesystem( const char *folder, const char **extensions ) static void load_filesystem( const char *folder )
{ {
const char *name, *ext, **p; const char *name, *ext;
char *fullname; char *fullname;
int i, count, ret; int i, count, ret;
CameraList *list; CameraList *list;
@ -75,8 +75,7 @@ static void load_filesystem( const char *folder, const char **extensions )
if (ret < GP_OK) if (ret < GP_OK)
continue; continue;
if (!(ext = strrchr( name, '.' ))) continue; if (!(ext = strrchr( name, '.' ))) continue;
for (p = extensions; *p; p++) if (!strcmp( ext, *p )) break; if (strcmp( ext, ".jpg" ) && strcmp( ext, ".JPG" )) continue;
if (!*p) continue;
if (files_count == files_size) if (files_count == files_size)
{ {
@ -112,7 +111,7 @@ static void load_filesystem( const char *folder, const char **extensions )
TRACE("recursing into %s\n", name); TRACE("recursing into %s\n", name);
fullname = malloc( strlen(folder) + 1 + strlen(name) + 1 ); fullname = malloc( strlen(folder) + 1 + strlen(name) + 1 );
sprintf( fullname, "%s/%s", folder[1] ? folder : "", name ); sprintf( fullname, "%s/%s", folder[1] ? folder : "", name );
load_filesystem( fullname, extensions ); load_filesystem( fullname );
free( fullname ); free( fullname );
} }
gp_list_free (list); gp_list_free (list);
@ -120,10 +119,10 @@ static void load_filesystem( const char *folder, const char **extensions )
static NTSTATUS load_file_list( void *args ) static NTSTATUS load_file_list( void *args )
{ {
struct load_file_list_params *params = args; const struct load_file_list_params *params = args;
if (!context) context = gp_context_new (); if (!context) context = gp_context_new ();
load_filesystem( params->root, params->extensions ); load_filesystem( params->root );
*params->count = files_count; *params->count = files_count;
return STATUS_SUCCESS; return STATUS_SUCCESS;
} }
@ -138,7 +137,7 @@ static void free_file_list(void)
static NTSTATUS get_file_name( void *args ) static NTSTATUS get_file_name( void *args )
{ {
struct get_file_name_params *params = args; const struct get_file_name_params *params = args;
char *name; char *name;
unsigned int len; unsigned int len;
@ -155,7 +154,7 @@ static NTSTATUS get_file_name( void *args )
static NTSTATUS open_file( void *args ) static NTSTATUS open_file( void *args )
{ {
struct open_file_params *params = args; const struct open_file_params *params = args;
CameraFileType type = params->preview ? GP_FILE_TYPE_PREVIEW : GP_FILE_TYPE_NORMAL; CameraFileType type = params->preview ? GP_FILE_TYPE_PREVIEW : GP_FILE_TYPE_NORMAL;
CameraFile *file; CameraFile *file;
char *folder, *filename; char *folder, *filename;
@ -183,15 +182,15 @@ static NTSTATUS open_file( void *args )
gp_file_unref( file ); gp_file_unref( file );
return STATUS_NO_SUCH_FILE; return STATUS_NO_SUCH_FILE;
} }
*params->handle = file; *params->handle = (ULONG_PTR)file;
*params->size = filesize; *params->size = filesize;
return STATUS_SUCCESS; return STATUS_SUCCESS;
} }
static NTSTATUS get_file_data( void *args ) static NTSTATUS get_file_data( void *args )
{ {
struct get_file_data_params *params = args; const struct get_file_data_params *params = args;
CameraFile *file = params->handle; CameraFile *file = (CameraFile *)(ULONG_PTR)params->handle;
const char *filedata; const char *filedata;
unsigned long filesize; unsigned long filesize;
int ret; int ret;
@ -205,8 +204,8 @@ static NTSTATUS get_file_data( void *args )
static NTSTATUS close_file( void *args ) static NTSTATUS close_file( void *args )
{ {
struct close_file_params *params = args; const struct close_file_params *params = args;
CameraFile *file = params->handle; CameraFile *file = (CameraFile *)(ULONG_PTR)params->handle;
gp_file_unref( file ); gp_file_unref( file );
return STATUS_SUCCESS; return STATUS_SUCCESS;
@ -261,8 +260,7 @@ static BOOL gphoto2_auto_detect(void)
static NTSTATUS get_identity( void *args ) static NTSTATUS get_identity( void *args )
{ {
struct get_identity_params *params = args; TW_IDENTITY *id = args;
TW_IDENTITY *id = params->id;
int count; int count;
const char *cname, *pname; const char *cname, *pname;
@ -296,8 +294,7 @@ static NTSTATUS get_identity( void *args )
static NTSTATUS open_ds( void *args ) static NTSTATUS open_ds( void *args )
{ {
struct open_ds_params *params = args; TW_IDENTITY *id = args;
TW_IDENTITY *id = params->id;
int ret, m, p, count, i; int ret, m, p, count, i;
CameraAbilities a; CameraAbilities a;
GPPortInfo info; GPPortInfo info;
@ -408,7 +405,7 @@ static NTSTATUS close_ds( void *args )
#endif /* HAVE_GPHOTO2_PORT */ #endif /* HAVE_GPHOTO2_PORT */
unixlib_entry_t __wine_unix_call_funcs[] = const unixlib_entry_t __wine_unix_call_funcs[] =
{ {
get_identity, get_identity,
open_ds, open_ds,
@ -419,3 +416,109 @@ unixlib_entry_t __wine_unix_call_funcs[] =
get_file_data, get_file_data,
close_file, close_file,
}; };
#ifdef _WIN64
typedef ULONG PTR32;
static NTSTATUS wow64_load_file_list( void *args )
{
struct
{
PTR32 root;
PTR32 count;
} const *params32 = args;
struct load_file_list_params params =
{
ULongToPtr(params32->root),
ULongToPtr(params32->count)
};
return load_file_list( &params );
}
static NTSTATUS wow64_get_file_name( void *args )
{
struct
{
unsigned int idx;
unsigned int size;
PTR32 buffer;
} const *params32 = args;
struct get_file_name_params params =
{
params32->idx,
params32->size,
ULongToPtr(params32->buffer)
};
return get_file_name( &params );
}
static NTSTATUS wow64_open_file( void *args )
{
struct
{
unsigned int idx;
BOOL preview;
PTR32 handle;
PTR32 size;
} const *params32 = args;
struct open_file_params params =
{
params32->idx,
params32->preview,
ULongToPtr(params32->handle),
ULongToPtr(params32->size)
};
return open_file( &params );
}
static NTSTATUS wow64_get_file_data( void *args )
{
struct
{
UINT64 handle;
PTR32 data;
unsigned int size;
} const *params32 = args;
struct get_file_data_params params =
{
params32->handle,
ULongToPtr(params32->data),
params32->size
};
return get_file_data( &params );
}
static NTSTATUS wow64_close_file( void *args )
{
struct
{
UINT64 handle;
} const *params32 = args;
struct close_file_params params = { params32->handle };
return close_file( &params );
}
const unixlib_entry_t __wine_unix_call_wow64_funcs[] =
{
get_identity,
open_ds,
close_ds,
wow64_load_file_list,
wow64_get_file_name,
wow64_open_file,
wow64_get_file_data,
wow64_close_file,
};
#endif /* _WIN64 */

View file

@ -26,20 +26,9 @@
#include "wine/unixlib.h" #include "wine/unixlib.h"
#include "twain.h" #include "twain.h"
struct get_identity_params
{
TW_IDENTITY *id;
};
struct open_ds_params
{
TW_IDENTITY *id;
};
struct load_file_list_params struct load_file_list_params
{ {
const char *root; const char *root;
const char **extensions;
unsigned int *count; unsigned int *count;
}; };
@ -54,20 +43,20 @@ struct open_file_params
{ {
unsigned int idx; unsigned int idx;
BOOL preview; BOOL preview;
void **handle; UINT64 *handle;
unsigned int *size; unsigned int *size;
}; };
struct get_file_data_params struct get_file_data_params
{ {
void *handle; UINT64 handle;
void *data; void *data;
unsigned int size; unsigned int size;
}; };
struct close_file_params struct close_file_params
{ {
void *handle; UINT64 handle;
}; };
enum gphoto2_funcs enum gphoto2_funcs