secur32: make GetComputerObjectNameA use GetComputerObjectNameW (revised)

Robert Reif reif at earthlink.net
Sun Aug 13 08:45:40 CDT 2006


This patch also adds a partial implementation of GetComputerObjectNameW.
-------------- next part --------------
diff -p -u -r1.19 secur32.c
--- dlls/secur32/secur32.c	23 May 2006 12:48:34 -0000	1.19
+++ dlls/secur32/secur32.c	13 Aug 2006 13:39:11 -0000
@@ -18,6 +18,9 @@
  */
 #include <assert.h>
 #include <stdarg.h>
+
+#include "ntstatus.h"
+#define WIN32_NO_STATUS
 #include "windef.h"
 #include "winbase.h"
 #include "winnls.h"
@@ -863,8 +866,23 @@ SECURITY_STATUS WINAPI EnumerateSecurity
 BOOLEAN WINAPI GetComputerObjectNameA(
   EXTENDED_NAME_FORMAT NameFormat, LPSTR lpNameBuffer, PULONG nSize)
 {
-    FIXME("%d %p %p\n", NameFormat, lpNameBuffer, nSize);
-    return FALSE;
+    BOOLEAN rc;
+    LPWSTR bufferW;
+    ULONG sizeW = *nSize * sizeof(WCHAR);
+    TRACE("(%d %p %p)\n", NameFormat, lpNameBuffer, nSize);
+    bufferW = HeapAlloc(GetProcessHeap(), 0, sizeW);
+    if (bufferW == NULL) {
+        SetLastError(ERROR_NOT_ENOUGH_MEMORY);
+        return FALSE;
+    }
+    rc = GetComputerObjectNameW(NameFormat, bufferW, &sizeW);
+    if (rc) {
+        ULONG len = WideCharToMultiByte(CP_ACP, 0, bufferW, -1, NULL, 0, NULL, NULL);
+        WideCharToMultiByte(CP_ACP, 0, bufferW, -1, lpNameBuffer, len, NULL, NULL);
+        *nSize = len;
+    }
+    HeapFree(GetProcessHeap(), 0, bufferW);
+    return rc;
 }
 
 /***********************************************************************
@@ -873,8 +891,106 @@ BOOLEAN WINAPI GetComputerObjectNameA(
 BOOLEAN WINAPI GetComputerObjectNameW(
   EXTENDED_NAME_FORMAT NameFormat, LPWSTR lpNameBuffer, PULONG nSize)
 {
-    FIXME("%d %p %p\n", NameFormat, lpNameBuffer, nSize);
-    return FALSE;
+    LSA_HANDLE policyHandle;
+    LSA_OBJECT_ATTRIBUTES objectAttributes;
+    PPOLICY_DNS_DOMAIN_INFO domainInfo;
+    NTSTATUS ntStatus;
+    BOOLEAN status;
+    TRACE("(%d %p %p)\n", NameFormat, lpNameBuffer, nSize);
+
+    if (NameFormat == NameUnknown)
+    {
+        SetLastError(ERROR_INVALID_PARAMETER);
+        return FALSE;
+    }
+
+    ZeroMemory(&objectAttributes, sizeof(objectAttributes));
+    objectAttributes.Length = sizeof(objectAttributes);
+
+    ntStatus = LsaOpenPolicy(NULL, &objectAttributes,
+                             POLICY_VIEW_LOCAL_INFORMATION,
+                             &policyHandle);
+    if (ntStatus != STATUS_SUCCESS)
+    {
+        SetLastError(LsaNtStatusToWinError(ntStatus));
+        WARN("LsaOpenPolicy failed with NT status %lx\n", GetLastError());
+        return FALSE;
+    }
+
+    ntStatus = LsaQueryInformationPolicy(policyHandle,
+                                         PolicyDnsDomainInformation,
+                                         (PVOID *)&domainInfo);
+    if (ntStatus != STATUS_SUCCESS)
+    {
+        SetLastError(LsaNtStatusToWinError(ntStatus));
+        WARN("LsaQueryInformationPolicy failed with NT status %lx\n",
+             GetLastError());
+        LsaClose(policyHandle);
+        return FALSE;
+    }
+
+    if (domainInfo->Sid)
+    {
+        switch (NameFormat)
+        {
+        case NameSamCompatible:
+            {
+                WCHAR name[MAX_COMPUTERNAME_LENGTH + 1];
+                DWORD size = sizeof(name);
+                if (GetComputerNameW(name, &size))
+                {
+                    int len = domainInfo->Name.Length + size + 3;
+                    if (*nSize < len)
+                    {
+                        *nSize = len;
+                        SetLastError(ERROR_INSUFFICIENT_BUFFER);
+                        status = FALSE;
+                    }
+                    else
+                    {
+                        WCHAR bs[] = { '\\', 0 };
+                        WCHAR ds[] = { '$', 0 };
+                        lstrcpyW(lpNameBuffer, domainInfo->Name.Buffer);
+                        lstrcatW(lpNameBuffer, bs);
+                        lstrcatW(lpNameBuffer, name);
+                        lstrcatW(lpNameBuffer, ds);
+                        status = TRUE;
+                    }
+                }
+                else
+                {
+                    SetLastError(ERROR_INTERNAL_ERROR);
+                    status = FALSE;
+                }
+            }
+            break;
+        case NameFullyQualifiedDN:
+        case NameDisplay:
+        case NameUniqueId:
+        case NameCanonical:
+        case NameUserPrincipal:
+        case NameCanonicalEx:
+        case NameServicePrincipal:
+        case NameDnsDomain:
+            FIXME("NameFormat %d not implemented\n", NameFormat);
+            SetLastError(ERROR_CANT_ACCESS_DOMAIN_INFO);
+            status = FALSE;
+            break;
+        default:
+            SetLastError(ERROR_INVALID_PARAMETER);
+            status = FALSE;
+        }
+    }
+    else
+    {
+        SetLastError(ERROR_CANT_ACCESS_DOMAIN_INFO);
+        status = FALSE;
+    }
+
+    LsaFreeMemory(domainInfo);
+    LsaClose(policyHandle);
+
+    return status;
 }
 
 BOOLEAN WINAPI GetUserNameExA(


More information about the wine-patches mailing list