Chris Robinson wrote:
On Sunday 13 August 2006 06:45, Robert Reif wrote:
This patch also adds a partial implementation of GetComputerObjectNameW.
The GetComputerObjectNameA function appears to be broken. When GetComputerObjectNameW fails due to too little memory in the name buffer, it sets the buffer size as specified by MSDN. However, when GetComputerObjectNameA calls GetComputerObjectNameW and receives an error code, this isn't copied into its nSize parameter.
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 15:29:25 -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,25 @@ 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; + } + else + *nSize = sizeW; + HeapFree(GetProcessHeap(), 0, bufferW); + return rc; }
/*********************************************************************** @@ -873,8 +893,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(