[NETAPI32] Implement DsGetSiteNameA
authorEric Kohl <eric.kohl@reactos.org>
Sat, 24 Aug 2019 11:15:41 +0000 (13:15 +0200)
committerEric Kohl <eric.kohl@reactos.org>
Sat, 24 Aug 2019 11:15:41 +0000 (13:15 +0200)
Also add the NetpAllocAnsiStrFromWStr helper function.

dll/win32/netapi32/misc.c
dll/win32/netapi32/netapi32.h
dll/win32/netapi32/netlogon.c

index 5e541b6..129dda8 100644 (file)
@@ -135,6 +135,38 @@ NetUnregisterDomainNameChangeNotification(
 }
 
 
+PSTR
+WINAPI
+NetpAllocAnsiStrFromWStr(
+    _In_ PWSTR InString)
+{
+    UNICODE_STRING UnicodeString;
+    ANSI_STRING AnsiString;
+    ULONG Size;
+    NET_API_STATUS NetStatus;
+    NTSTATUS Status;
+
+    RtlInitUnicodeString(&UnicodeString, InString);
+
+    Size = RtlUnicodeStringToAnsiSize(&UnicodeString);
+    NetStatus = NetApiBufferAllocate(Size,
+                                     (PVOID*)&AnsiString.Buffer);
+    if (NetStatus != NERR_Success)
+        return NULL;
+
+    Status = RtlUnicodeStringToAnsiString(&AnsiString,
+                                          &UnicodeString,
+                                          FALSE);
+    if (!NT_SUCCESS(Status))
+    {
+        NetApiBufferFree(AnsiString.Buffer);
+        return NULL;
+    }
+
+    return AnsiString.Buffer;
+}
+
+
 PWSTR
 WINAPI
 NetpAllocWStrFromAnsiStr(
index 7a839ef..35004bb 100644 (file)
@@ -64,6 +64,11 @@ CopySidFromSidAndRid(
     _In_ PSID SrcSid,
     _In_ ULONG RelativeId);
 
+PSTR
+WINAPI
+NetpAllocAnsiStrFromWStr(
+    _In_ PWSTR InString);
+
 PWSTR
 WINAPI
 NetpAllocWStrFromAnsiStr(
index 98dc5c7..fd93fad 100644 (file)
@@ -604,19 +604,52 @@ DsGetForestTrustInformationW(
 DWORD
 WINAPI
 DsGetSiteNameA(
-    _In_ LPCSTR ComputerName,
+    _In_opt_ LPCSTR ComputerName,
     _Out_ LPSTR *SiteName)
 {
-    FIXME("DsGetSiteNameA(%s, %p)\n",
+    PWSTR pComputerNameW = NULL;
+    PWSTR pSiteNameW = NULL;
+    DWORD dwError = ERROR_SUCCESS;
+
+    TRACE("DsGetSiteNameA(%s, %p)\n",
           debugstr_a(ComputerName), SiteName);
-    return ERROR_CALL_NOT_IMPLEMENTED;
+
+    if (ComputerName != NULL)
+    {
+        pComputerNameW = NetpAllocWStrFromAnsiStr((PSTR)ComputerName);
+        if (pComputerNameW == NULL)
+        {
+            dwError = ERROR_NOT_ENOUGH_MEMORY;
+            goto done;
+        }
+    }
+
+    dwError = DsGetSiteNameW(pComputerNameW,
+                             &pSiteNameW);
+    if (dwError != ERROR_SUCCESS)
+        goto done;
+
+    *SiteName = NetpAllocAnsiStrFromWStr(pSiteNameW);
+    if (*SiteName == NULL)
+    {
+        dwError = ERROR_NOT_ENOUGH_MEMORY;
+    }
+
+done:
+    if (pSiteNameW != NULL)
+        NetApiBufferFree(pSiteNameW);
+
+    if (pComputerNameW != NULL)
+        NetApiBufferFree(pComputerNameW);
+
+    return dwError;
 }
 
 
 DWORD
 WINAPI
 DsGetSiteNameW(
-    _In_ LPCWSTR ComputerName,
+    _In_opt_ LPCWSTR ComputerName,
     _Out_ LPWSTR *SiteName)
 {
     NET_API_STATUS status;