From: Thomas Portal <portal.thomas@protonmail.com> Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=59891 Signed-off-by: Thomas Portal <portal.thomas@protonmail.com> --- dlls/dnsapi/dnsapi.spec | 2 ++ dlls/dnsapi/main.c | 59 +++++++++++++++++++++++++++++++++++++++++ include/windns.h | 17 ++++++++++++ 3 files changed, 78 insertions(+) diff --git a/dlls/dnsapi/dnsapi.spec b/dlls/dnsapi/dnsapi.spec index a8ffa40a0ae..a9bac0a1375 100644 --- a/dlls/dnsapi/dnsapi.spec +++ b/dlls/dnsapi/dnsapi.spec @@ -104,6 +104,8 @@ @ stdcall DnsReplaceRecordSetW(ptr long ptr ptr ptr) @ stub DnsReplaceRecordSet_W @ stdcall DnsServiceBrowse(ptr ptr) +@ stdcall DnsServiceConstructInstance(wstr wstr ptr ptr long long long long ptr ptr) +@ stdcall DnsServiceFreeInstance(ptr) @ stub DnsServiceNotificationDeregister_A @ stub DnsServiceNotificationDeregister_UTF8 @ stub DnsServiceNotificationDeregister_W diff --git a/dlls/dnsapi/main.c b/dlls/dnsapi/main.c index 9b057a09a05..07411243c0f 100644 --- a/dlls/dnsapi/main.c +++ b/dlls/dnsapi/main.c @@ -243,3 +243,62 @@ DNS_STATUS WINAPI DnsServiceBrowse( PDNS_SERVICE_BROWSE_REQUEST request, PDNS_SE FIXME( "(%p, %p) stub\n", request, cancel ); return ERROR_SUCCESS; } + +/****************************************************************************** + * DnsServiceConstructInstance [DNSAPI.@] + * + */ +PDNS_SERVICE_INSTANCE WINAPI DnsServiceConstructInstance( PCWSTR name, PCWSTR host, + PIP4_ADDRESS ip4, PIP6_ADDRESS ip6, WORD port, WORD priority, WORD weight, + DWORD count, PCWSTR *keys, PCWSTR *values ) +{ + DNS_SERVICE_INSTANCE *instance; + DWORD i; + + TRACE( "(%s, %s, %p, %p, %u, %u, %u, %lu, %p, %p)\n", debugstr_w(name), debugstr_w(host), + ip4, ip6, port, priority, weight, count, keys, values ); + + if (!(instance = calloc( 1, sizeof(*instance) ))) return NULL; + + if (name) instance->pszInstanceName = wcsdup( name ); + if (host) instance->pszHostName = wcsdup( host ); + if (ip4 && (instance->ip4Address = malloc( sizeof(*ip4) ))) *instance->ip4Address = *ip4; + if (ip6 && (instance->ip6Address = malloc( sizeof(*ip6) ))) *instance->ip6Address = *ip6; + instance->wPort = port; + instance->wPriority = priority; + instance->wWeight = weight; + instance->dwPropertyCount = count; + + if (count && (instance->keys = calloc( count, sizeof(*keys) ))) + for (i = 0; i < count; i++) instance->keys[i] = wcsdup( keys[i] ); + if (count && (instance->values = calloc( count, sizeof(*values) ))) + for (i = 0; i < count; i++) instance->values[i] = wcsdup( values[i] ); + + return instance; +} + +/****************************************************************************** + * DnsServiceFreeInstance [DNSAPI.@] + * + */ +void WINAPI DnsServiceFreeInstance( PDNS_SERVICE_INSTANCE instance ) +{ + DWORD i; + + TRACE( "(%p)\n", instance ); + + if (!instance) return; + + free( instance->pszInstanceName ); + free( instance->pszHostName ); + free( instance->ip4Address ); + free( instance->ip6Address ); + for (i = 0; i < instance->dwPropertyCount; i++) + { + if (instance->keys) free( instance->keys[i] ); + if (instance->values) free( instance->values[i] ); + } + free( instance->keys ); + free( instance->values ); + free( instance ); +} diff --git a/include/windns.h b/include/windns.h index 87e8dad37da..544b02bbfdc 100644 --- a/include/windns.h +++ b/include/windns.h @@ -781,6 +781,21 @@ typedef struct _DNS_SERVICE_CANCEL void *reserved; } DNS_SERVICE_CANCEL, *PDNS_SERVICE_CANCEL; +typedef struct _DNS_SERVICE_INSTANCE +{ + LPWSTR pszInstanceName; + LPWSTR pszHostName; + IP4_ADDRESS *ip4Address; + IP6_ADDRESS *ip6Address; + WORD wPort; + WORD wPriority; + WORD wWeight; + DWORD dwPropertyCount; + PWSTR *keys; + PWSTR *values; + DWORD dwInterfaceIndex; +} DNS_SERVICE_INSTANCE, *PDNS_SERVICE_INSTANCE; + DNS_STATUS WINAPI DnsAcquireContextHandle_A(DWORD,PVOID,PHANDLE); DNS_STATUS WINAPI DnsAcquireContextHandle_W(DWORD,PVOID,PHANDLE); #define DnsAcquireContextHandle WINELIB_NAME_AW(DnsAcquireContextHandle_) @@ -813,6 +828,8 @@ DNS_STATUS WINAPI DnsReplaceRecordSetW(PDNS_RECORDW,DWORD,HANDLE,PVOID,PVOID); DNS_STATUS WINAPI DnsReplaceRecordSetUTF8(PDNS_RECORDA,DWORD,HANDLE,PVOID,PVOID); #define DnsReplaceRecordSet WINELIB_NAME_AW(DnsReplaceRecordSet) DNS_STATUS WINAPI DnsServiceBrowse(PDNS_SERVICE_BROWSE_REQUEST, PDNS_SERVICE_CANCEL); +PDNS_SERVICE_INSTANCE WINAPI DnsServiceConstructInstance(PCWSTR,PCWSTR,PIP4_ADDRESS,PIP6_ADDRESS,WORD,WORD,WORD,DWORD,PCWSTR*,PCWSTR*); +VOID WINAPI DnsServiceFreeInstance(PDNS_SERVICE_INSTANCE); DNS_STATUS WINAPI DnsValidateName_A(PCSTR,DNS_NAME_FORMAT); DNS_STATUS WINAPI DnsValidateName_W(PCWSTR, DNS_NAME_FORMAT); DNS_STATUS WINAPI DnsValidateName_UTF8(PCSTR,DNS_NAME_FORMAT); -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/11200