Alexandre Julliard : dnsapi: Implement Wow64 entry points in the Unix library.

Alexandre Julliard julliard at winehq.org
Mon Nov 8 15:45:07 CST 2021


Module: wine
Branch: master
Commit: c78fce9e5b85780c1825667c4f4a99702be4fcbe
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=c78fce9e5b85780c1825667c4f4a99702be4fcbe

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Mon Nov  8 20:54:16 2021 +0100

dnsapi: Implement Wow64 entry points in the Unix library.

Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/dnsapi/dnsapi.h    |  5 ---
 dlls/dnsapi/libresolv.c | 86 +++++++++++++++++++++++++++++++++++++++++++++----
 dlls/dnsapi/query.c     |  3 +-
 3 files changed, 80 insertions(+), 14 deletions(-)

diff --git a/dlls/dnsapi/dnsapi.h b/dlls/dnsapi/dnsapi.h
index af3dee45bb9..f27cce9a99d 100644
--- a/dlls/dnsapi/dnsapi.h
+++ b/dlls/dnsapi/dnsapi.h
@@ -139,11 +139,6 @@ struct get_serverlist_params
     DWORD           *len;
 };
 
-struct set_serverlist_params
-{
-    const IP4_ARRAY *addrs;
-};
-
 struct query_params
 {
     const char      *name;
diff --git a/dlls/dnsapi/libresolv.c b/dlls/dnsapi/libresolv.c
index 9e12683b8a8..0871348fb22 100644
--- a/dlls/dnsapi/libresolv.c
+++ b/dlls/dnsapi/libresolv.c
@@ -124,7 +124,7 @@ static DNS_STATUS map_h_errno( int error )
 
 static NTSTATUS resolv_get_searchlist( void *args )
 {
-    struct get_searchlist_params *params = args;
+    const struct get_searchlist_params *params = args;
     DNS_TXT_DATAW *list = params->list;
     DWORD i, needed, str_needed = 0;
     char *ptr, *end;
@@ -170,7 +170,7 @@ static inline int filter( unsigned short sin_family, USHORT family )
 
 static NTSTATUS resolv_get_serverlist( void *args )
 {
-    struct get_serverlist_params *params = args;
+    const struct get_serverlist_params *params = args;
     DNS_ADDR_ARRAY *addrs = params->addrs;
     struct __res_state *state = &_res;
     DWORD i, found, total, needed;
@@ -238,7 +238,7 @@ static NTSTATUS resolv_get_serverlist( void *args )
 
 static NTSTATUS resolv_get_serverlist( void *args )
 {
-    struct get_serverlist_params *params = args;
+    const struct get_serverlist_params *params = args;
     DNS_ADDR_ARRAY *addrs = params->addrs;
     DWORD needed, found, i;
 
@@ -305,8 +305,7 @@ static NTSTATUS resolv_get_serverlist( void *args )
 
 static NTSTATUS resolv_set_serverlist( void *args )
 {
-    struct set_serverlist_params *params = args;
-    const IP4_ARRAY *addrs = params->addrs;
+    const IP4_ARRAY *addrs = args;
     int i;
 
     init_resolver();
@@ -328,7 +327,7 @@ static NTSTATUS resolv_set_serverlist( void *args )
 
 static NTSTATUS resolv_query( void *args )
 {
-    struct query_params *params = args;
+    const struct query_params *params = args;
     DNS_STATUS ret = ERROR_SUCCESS;
     int len;
 
@@ -342,7 +341,7 @@ static NTSTATUS resolv_query( void *args )
     return ret;
 }
 
-unixlib_entry_t __wine_unix_call_funcs[] =
+const unixlib_entry_t __wine_unix_call_funcs[] =
 {
     resolv_get_searchlist,
     resolv_get_serverlist,
@@ -350,4 +349,77 @@ unixlib_entry_t __wine_unix_call_funcs[] =
     resolv_query,
 };
 
+#ifdef _WIN64
+
+typedef ULONG PTR32;
+
+static NTSTATUS wow64_resolv_get_searchlist( void *args )
+{
+    struct
+    {
+        PTR32  list;
+        PTR32  len;
+    } const *params32 = args;
+
+    struct get_searchlist_params params =
+    {
+        ULongToPtr(params32->list),
+        ULongToPtr(params32->len)
+    };
+
+    return resolv_get_searchlist( &params );
+}
+
+static NTSTATUS wow64_resolv_get_serverlist( void *args )
+{
+    struct
+    {
+        USHORT family;
+        PTR32  addrs;
+        PTR32  len;
+    } const *params32 = args;
+
+    struct get_serverlist_params params =
+    {
+        params32->family,
+        ULongToPtr(params32->addrs),
+        ULongToPtr(params32->len)
+    };
+
+    return resolv_get_serverlist( &params );
+}
+
+static NTSTATUS wow64_resolv_query( void *args )
+{
+    struct
+    {
+        PTR32  name;
+        WORD   type;
+        DWORD  options;
+        PTR32  buf;
+        PTR32  len;
+    } const *params32 = args;
+
+    struct query_params params =
+    {
+        ULongToPtr(params32->name),
+        params32->type,
+        params32->options,
+        ULongToPtr(params32->buf),
+        ULongToPtr(params32->len)
+    };
+
+    return resolv_query( &params );
+}
+
+const unixlib_entry_t __wine_unix_call_wow64_funcs[] =
+{
+    wow64_resolv_get_searchlist,
+    wow64_resolv_get_serverlist,
+    resolv_set_serverlist,
+    wow64_resolv_query,
+};
+
+#endif  /* _WIN64 */
+
 #endif /* HAVE_RESOLV */
diff --git a/dlls/dnsapi/query.c b/dlls/dnsapi/query.c
index 7bfaf78cc7f..f732c6a6c65 100644
--- a/dlls/dnsapi/query.c
+++ b/dlls/dnsapi/query.c
@@ -170,7 +170,6 @@ DNS_STATUS WINAPI DnsQuery_UTF8( PCSTR name, WORD type, DWORD options, PVOID ser
     DNS_STATUS ret = DNS_ERROR_RCODE_NOT_IMPLEMENTED;
     unsigned char answer[4096];
     DWORD len = sizeof(answer);
-    struct set_serverlist_params servlist_params = { servers };
     struct query_params query_params = { name, type, options, answer, &len };
 
     TRACE( "(%s,%s,0x%08x,%p,%p,%p)\n", debugstr_a(name), debugstr_type( type ),
@@ -179,7 +178,7 @@ DNS_STATUS WINAPI DnsQuery_UTF8( PCSTR name, WORD type, DWORD options, PVOID ser
     if (!name || !result)
         return ERROR_INVALID_PARAMETER;
 
-    if ((ret = RESOLV_CALL( set_serverlist, &servlist_params ))) return ret;
+    if ((ret = RESOLV_CALL( set_serverlist, servers ))) return ret;
 
     ret = RESOLV_CALL( query, &query_params );
     if (!ret)




More information about the wine-cvs mailing list