[prev in list] [next in list] [prev in thread] [next in thread] 

List:       ros-diffs
Subject:    [ros-diffs] [dchapyshev] 39250: - Implement
From:       dchapyshev () svn ! reactos ! org
Date:       2009-01-31 20:22:17
Message-ID: 20090131214252.6A5BA989AA () mail ! reactos ! org
[Download RAW message or body]

Author: dchapyshev
Date: Sat Jan 31 14:22:17 2009
New Revision: 39250

URL: http://svn.reactos.org/svn/reactos?rev=39250&view=rev
Log:
- Implement GetComputerObjectNameA/W (from Wine)

Modified:
    trunk/reactos/dll/win32/secur32/secext.c

Modified: trunk/reactos/dll/win32/secur32/secext.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/secur32/secext.c?rev=39250&r1=39249&r2=39250&view=diff
 ==============================================================================
--- trunk/reactos/dll/win32/secur32/secext.c [iso-8859-1] (original)
+++ trunk/reactos/dll/win32/secur32/secext.c [iso-8859-1] Sat Jan 31 14:22:17 2009
@@ -1,31 +1,191 @@
+/*
+ * Copyright (C) 2004 Juan Lang
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
 #include <precomp.h>
 
 #define NDEBUG
 #include <debug.h>
 
 
-BOOLEAN
-WINAPI
-GetComputerObjectNameA (
-	EXTENDED_NAME_FORMAT extended_name_format,
-	LPSTR lpstr,
-	PULONG pulong
-	)
-{
-	UNIMPLEMENTED;
-	return ERROR_CALL_NOT_IMPLEMENTED;
-}
-
-BOOLEAN
-WINAPI
-GetComputerObjectNameW (
-	EXTENDED_NAME_FORMAT extended_name_format,
-	LPWSTR lpstr,
-	PULONG pulong
-	)
-{
-	UNIMPLEMENTED;
-	return ERROR_CALL_NOT_IMPLEMENTED;
+/***********************************************************************
+ *		GetComputerObjectNameA (SECUR32.@) Wine 1.1.14
+ *
+ * Get the local computer's name using the format specified.
+ *
+ * PARAMS
+ *  NameFormat   [I] The format for the name.
+ *  lpNameBuffer [O] Pointer to buffer to receive the name.
+ *  nSize        [I/O] Size in characters of buffer.
+ *
+ * RETURNS
+ *  TRUE  If the name was written to lpNameBuffer.
+ *  FALSE If the name couldn't be written.
+ *
+ * NOTES
+ *  If lpNameBuffer is NULL, then the size of the buffer needed to hold the
+ *  name will be returned in *nSize.
+ *
+ *  nSize returns the number of characters written when lpNameBuffer is not
+ *  NULL or the size of the buffer needed to hold the name when the buffer
+ *  is too short or lpNameBuffer is NULL.
+ * 
+ *  It the buffer is too short, ERROR_INSUFFICIENT_BUFFER error will be set.
+ */
+BOOLEAN WINAPI GetComputerObjectNameA(
+  EXTENDED_NAME_FORMAT NameFormat, LPSTR lpNameBuffer, PULONG nSize)
+{
+    BOOLEAN rc;
+    LPWSTR bufferW = NULL;
+    ULONG sizeW = *nSize;
+    DPRINT("(%d %p %p)\n", NameFormat, lpNameBuffer, nSize);
+    if (lpNameBuffer) {
+        bufferW = HeapAlloc(GetProcessHeap(), 0, sizeW * sizeof(WCHAR));
+        if (bufferW == NULL) {
+            SetLastError(ERROR_NOT_ENOUGH_MEMORY);
+            return FALSE;
+        }
+    }
+    rc = GetComputerObjectNameW(NameFormat, bufferW, &sizeW);
+    if (rc && bufferW) {
+        ULONG len = WideCharToMultiByte(CP_ACP, 0, bufferW, -1, NULL, 0, NULL, \
NULL); +        WideCharToMultiByte(CP_ACP, 0, bufferW, -1, lpNameBuffer, *nSize, \
NULL, NULL); +        *nSize = len;
+    }
+    else
+        *nSize = sizeW;
+    HeapFree(GetProcessHeap(), 0, bufferW);
+    return rc;
+}
+
+/***********************************************************************
+ *		GetComputerObjectNameW (SECUR32.@) Wine 1.1.14
+ */
+BOOLEAN WINAPI GetComputerObjectNameW(
+  EXTENDED_NAME_FORMAT NameFormat, LPWSTR lpNameBuffer, PULONG nSize)
+{
+    LSA_HANDLE policyHandle;
+    LSA_OBJECT_ATTRIBUTES objectAttributes;
+    PPOLICY_DNS_DOMAIN_INFO domainInfo;
+    NTSTATUS ntStatus;
+    BOOLEAN status;
+    DPRINT("(%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));
+        DPRINT1("LsaOpenPolicy failed with NT status %u\n", GetLastError());
+        return FALSE;
+    }
+
+    ntStatus = LsaQueryInformationPolicy(policyHandle,
+                                         PolicyDnsDomainInformation,
+                                         (PVOID *)&domainInfo);
+    if (ntStatus != STATUS_SUCCESS)
+    {
+        SetLastError(LsaNtStatusToWinError(ntStatus));
+        DPRINT1("LsaQueryInformationPolicy failed with NT status %u\n",
+             GetLastError());
+        LsaClose(policyHandle);
+        return FALSE;
+    }
+
+    if (domainInfo->Sid)
+    {
+        switch (NameFormat)
+        {
+        case NameSamCompatible:
+            {
+                WCHAR name[MAX_COMPUTERNAME_LENGTH + 1];
+                DWORD size = sizeof(name)/sizeof(name[0]);
+                if (GetComputerNameW(name, &size))
+                {
+                    DWORD len = domainInfo->Name.Length + size + 3;
+                    if (lpNameBuffer)
+                    {
+                        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	/* just requesting length required */
+                    {
+                        *nSize = len;
+                        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:
+            DPRINT1("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;
 }
 
 


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic