Alexandre Julliard : crypt32: Implement Wow64 entry points in the Unix library.
Alexandre Julliard
julliard at winehq.org
Tue Dec 7 15:58:45 CST 2021
Module: wine
Branch: master
Commit: b52c6bfbb138ea2e516c757710ad7272c40b74ec
URL: https://source.winehq.org/git/wine.git/?a=commit;h=b52c6bfbb138ea2e516c757710ad7272c40b74ec
Author: Alexandre Julliard <julliard at winehq.org>
Date: Tue Dec 7 17:54:01 2021 +0100
crypt32: Implement Wow64 entry points in the Unix library.
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/crypt32/crypt32_private.h | 10 ++--
dlls/crypt32/pfx.c | 4 +-
dlls/crypt32/unixlib.c | 121 +++++++++++++++++++++++++++++++++++++++--
3 files changed, 122 insertions(+), 13 deletions(-)
diff --git a/dlls/crypt32/crypt32_private.h b/dlls/crypt32/crypt32_private.h
index 7fed1665d56..f4131bf2694 100644
--- a/dlls/crypt32/crypt32_private.h
+++ b/dlls/crypt32/crypt32_private.h
@@ -461,25 +461,25 @@ void init_empty_store(void) DECLSPEC_HIDDEN;
/* Unix interface */
-struct cert_store_data;
+typedef UINT64 cert_store_data_t;
struct open_cert_store_params
{
CRYPT_DATA_BLOB *pfx;
const WCHAR *password;
- struct cert_store_data **data_ret;
+ cert_store_data_t *data_ret;
};
struct import_store_key_params
{
- struct cert_store_data *data;
+ cert_store_data_t data;
void *buf;
DWORD *buf_size;
};
struct import_store_cert_params
{
- struct cert_store_data *data;
+ cert_store_data_t data;
unsigned int index;
void *buf;
DWORD *buf_size;
@@ -487,7 +487,7 @@ struct import_store_cert_params
struct close_cert_store_params
{
- struct cert_store_data *data;
+ cert_store_data_t data;
};
struct enum_root_certs_params
diff --git a/dlls/crypt32/pfx.c b/dlls/crypt32/pfx.c
index 1dd048c2b67..ca29c2aadfc 100644
--- a/dlls/crypt32/pfx.c
+++ b/dlls/crypt32/pfx.c
@@ -32,7 +32,7 @@
WINE_DEFAULT_DEBUG_CHANNEL(crypt);
-static HCRYPTPROV import_key( struct cert_store_data *data, DWORD flags )
+static HCRYPTPROV import_key( cert_store_data_t data, DWORD flags )
{
HCRYPTPROV prov = 0;
HCRYPTKEY cryptkey;
@@ -145,7 +145,7 @@ HCERTSTORE WINAPI PFXImportCertStore( CRYPT_DATA_BLOB *pfx, const WCHAR *passwor
DWORD i = 0, size;
HCERTSTORE store = NULL;
HCRYPTPROV prov = 0;
- struct cert_store_data *data = NULL;
+ cert_store_data_t data = 0;
struct open_cert_store_params open_params = { pfx, password, &data };
struct close_cert_store_params close_params;
diff --git a/dlls/crypt32/unixlib.c b/dlls/crypt32/unixlib.c
index 7cb521eb98b..a345b5e6ac8 100644
--- a/dlls/crypt32/unixlib.c
+++ b/dlls/crypt32/unixlib.c
@@ -161,10 +161,15 @@ struct cert_store_data
unsigned int chain_len;
};
+static struct cert_store_data *get_store_data( cert_store_data_t data )
+{
+ return (struct cert_store_data *)(ULONG_PTR)data;
+}
+
static NTSTATUS import_store_key( void *args )
{
struct import_store_key_params *params = args;
- struct cert_store_data *data = params->data;
+ struct cert_store_data *data = get_store_data( params->data );
int i, ret;
unsigned int bitlen = data->key_bitlen;
gnutls_datum_t m, e, d, p, q, u, e1, e2;
@@ -303,7 +308,7 @@ static NTSTATUS open_cert_store( void *args )
store_data->chain = chain;
store_data->key_bitlen = bitlen;
store_data->chain_len = chain_len;
- *params->data_ret = store_data;
+ *params->data_ret = (ULONG_PTR)store_data;
return STATUS_SUCCESS;
error:
@@ -316,7 +321,7 @@ error:
static NTSTATUS import_store_cert( void *args )
{
struct import_store_cert_params *params = args;
- struct cert_store_data *data = params->data;
+ struct cert_store_data *data = get_store_data( params->data );
size_t size = 0;
int ret;
@@ -339,11 +344,12 @@ static NTSTATUS import_store_cert( void *args )
static NTSTATUS close_cert_store( void *args )
{
struct close_cert_store_params *params = args;
+ struct cert_store_data *data = get_store_data( params->data );
if (params->data)
{
- pgnutls_pkcs12_deinit( params->data->p12 );
- free( params->data );
+ pgnutls_pkcs12_deinit( data->p12 );
+ free( data );
}
return STATUS_SUCCESS;
}
@@ -678,7 +684,7 @@ static NTSTATUS enum_root_certs( void *args )
return STATUS_SUCCESS;
}
-unixlib_entry_t __wine_unix_call_funcs[] =
+const unixlib_entry_t __wine_unix_call_funcs[] =
{
process_attach,
process_detach,
@@ -688,3 +694,106 @@ unixlib_entry_t __wine_unix_call_funcs[] =
close_cert_store,
enum_root_certs,
};
+
+#ifdef _WIN64
+
+typedef ULONG PTR32;
+
+typedef struct
+{
+ DWORD cbData;
+ PTR32 pbData;
+} CRYPT_DATA_BLOB32;
+
+static NTSTATUS wow64_open_cert_store( void *args )
+{
+ struct
+ {
+ PTR32 pfx;
+ PTR32 password;
+ PTR32 data_ret;
+ } const *params32 = args;
+
+ const CRYPT_DATA_BLOB32 *pfx32 = ULongToPtr( params32->pfx );
+ CRYPT_DATA_BLOB pfx = { pfx32->cbData, ULongToPtr( pfx32->pbData ) };
+ struct open_cert_store_params params =
+ {
+ &pfx,
+ ULongToPtr( params32->password ),
+ ULongToPtr( params32->data_ret )
+ };
+
+ return open_cert_store( ¶ms );
+}
+
+static NTSTATUS wow64_import_store_key( void *args )
+{
+ struct
+ {
+ cert_store_data_t data;
+ PTR32 buf;
+ PTR32 buf_size;
+ } const *params32 = args;
+
+ struct import_store_key_params params =
+ {
+ params32->data,
+ ULongToPtr( params32->buf ),
+ ULongToPtr( params32->buf_size )
+ };
+
+ return import_store_key( ¶ms );
+}
+
+static NTSTATUS wow64_import_store_cert( void *args )
+{
+ struct
+ {
+ cert_store_data_t data;
+ unsigned int index;
+ PTR32 buf;
+ PTR32 buf_size;
+ } const *params32 = args;
+
+ struct import_store_cert_params params =
+ {
+ params32->data,
+ params32->index,
+ ULongToPtr( params32->buf ),
+ ULongToPtr( params32->buf_size )
+ };
+
+ return import_store_cert( ¶ms );
+}
+
+static NTSTATUS wow64_enum_root_certs( void *args )
+{
+ struct
+ {
+ PTR32 buffer;
+ DWORD size;
+ PTR32 needed;
+ } const *params32 = args;
+
+ struct enum_root_certs_params params =
+ {
+ ULongToPtr( params32->buffer ),
+ params32->size,
+ ULongToPtr( params32->needed )
+ };
+
+ return enum_root_certs( ¶ms );
+}
+
+const unixlib_entry_t __wine_unix_call_wow64_funcs[] =
+{
+ process_attach,
+ process_detach,
+ wow64_open_cert_store,
+ wow64_import_store_key,
+ wow64_import_store_cert,
+ close_cert_store,
+ wow64_enum_root_certs,
+};
+
+#endif /* _WIN64 */
More information about the wine-cvs
mailing list