Author: cwittich Date: Sun Oct 26 07:35:42 2008 New Revision: 36986
URL: http://svn.reactos.org/svn/reactos?rev=36986&view=rev Log: import LookupPrivilegeNameA from wine
Modified: trunk/reactos/dll/win32/advapi32/sec/misc.c
Modified: trunk/reactos/dll/win32/advapi32/sec/misc.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/advapi32/sec/misc... ============================================================================== --- trunk/reactos/dll/win32/advapi32/sec/misc.c [iso-8859-1] (original) +++ trunk/reactos/dll/win32/advapi32/sec/misc.c [iso-8859-1] Sun Oct 26 07:35:42 2008 @@ -1396,11 +1396,51 @@ LookupPrivilegeNameA(LPCSTR lpSystemName, PLUID lpLuid, LPSTR lpName, - LPDWORD cbName) -{ - FIXME("%s() not implemented!\n", __FUNCTION__); - SetLastError (ERROR_CALL_NOT_IMPLEMENTED); - return FALSE; + LPDWORD cchName) +{ + UNICODE_STRING lpSystemNameW; + BOOL ret; + DWORD wLen = 0; + + TRACE("%s %p %p %p\n", debugstr_a(lpSystemName), lpLuid, lpName, cchName); + + RtlCreateUnicodeStringFromAsciiz(&lpSystemNameW, lpSystemName); + ret = LookupPrivilegeNameW(lpSystemNameW.Buffer, lpLuid, NULL, &wLen); + if (!ret && GetLastError() == ERROR_INSUFFICIENT_BUFFER) + { + LPWSTR lpNameW = HeapAlloc(GetProcessHeap(), 0, wLen * sizeof(WCHAR)); + + ret = LookupPrivilegeNameW(lpSystemNameW.Buffer, lpLuid, lpNameW, + &wLen); + if (ret) + { + /* Windows crashes if cchName is NULL, so will I */ + unsigned int len = WideCharToMultiByte(CP_ACP, 0, lpNameW, -1, lpName, + *cchName, NULL, NULL); + + if (len == 0) + { + /* WideCharToMultiByte failed */ + ret = FALSE; + } + else if (len > *cchName) + { + *cchName = len; + SetLastError(ERROR_INSUFFICIENT_BUFFER); + ret = FALSE; + } + else + { + /* WideCharToMultiByte succeeded, output length needs to be + * length not including NULL terminator + */ + *cchName = len - 1; + } + } + HeapFree(GetProcessHeap(), 0, lpNameW); + } + RtlFreeUnicodeString(&lpSystemNameW); + return ret; }