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?... ============================================================================== --- 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; }