From c78fce9e5b85780c1825667c4f4a99702be4fcbe Mon Sep 17 00:00:00 2001 From: Alexandre Julliard Date: Mon, 8 Nov 2021 20:54:16 +0100 Subject: [PATCH] dnsapi: Implement Wow64 entry points in the Unix library. Signed-off-by: Alexandre Julliard --- 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( ¶ms ); +} + +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( ¶ms ); +} + +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( ¶ms ); +} + +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)