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( &params );
+}
+
+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( &params );
+}
+
+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( &params );
+}
+
+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( &params );
+}
+
+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