From 5781991967dc652ab108c6a6fff696bc97a88694 Mon Sep 17 00:00:00 2001 From: Amine Khaldi Date: Sat, 25 Oct 2014 12:30:01 +0000 Subject: [PATCH] [ADVAPI32] * Move some functions from sec/misc.c to security.c. CORE-8540 svn path=/trunk/; revision=64978 --- reactos/dll/win32/advapi32/sec/misc.c | 715 --------------------- reactos/dll/win32/advapi32/wine/security.c | 689 ++++++++++++++++++++ 2 files changed, 689 insertions(+), 715 deletions(-) diff --git a/reactos/dll/win32/advapi32/sec/misc.c b/reactos/dll/win32/advapi32/sec/misc.c index a8f92ef63c8..a83f22993f1 100644 --- a/reactos/dll/win32/advapi32/sec/misc.c +++ b/reactos/dll/win32/advapi32/sec/misc.c @@ -125,337 +125,6 @@ UnloadNtMarta(VOID) /******************************************************************************/ -/* - * @implemented - */ -BOOL -WINAPI -AreAllAccessesGranted(DWORD GrantedAccess, - DWORD DesiredAccess) -{ - return (BOOL)RtlAreAllAccessesGranted(GrantedAccess, - DesiredAccess); -} - - -/* - * @implemented - */ -BOOL -WINAPI -AreAnyAccessesGranted(DWORD GrantedAccess, - DWORD DesiredAccess) -{ - return (BOOL)RtlAreAnyAccessesGranted(GrantedAccess, - DesiredAccess); -} - - -/************************************************************ - * ADVAPI_IsLocalComputer - * - * Checks whether the server name indicates local machine. - */ -BOOL ADVAPI_IsLocalComputer(LPCWSTR ServerName) -{ - DWORD dwSize = MAX_COMPUTERNAME_LENGTH + 1; - BOOL Result; - LPWSTR buf; - - if (!ServerName || !ServerName[0]) - return TRUE; - - buf = HeapAlloc(GetProcessHeap(), 0, dwSize * sizeof(WCHAR)); - Result = GetComputerNameW(buf, &dwSize); - if (Result && (ServerName[0] == '\\') && (ServerName[1] == '\\')) - ServerName += 2; - Result = Result && !lstrcmpW(ServerName, buf); - HeapFree(GetProcessHeap(), 0, buf); - - return Result; -} - - -/****************************************************************************** - * GetFileSecurityA [ADVAPI32.@] - * - * Obtains Specified information about the security of a file or directory. - * - * PARAMS - * lpFileName [I] Name of the file to get info for - * RequestedInformation [I] SE_ flags from "winnt.h" - * pSecurityDescriptor [O] Destination for security information - * nLength [I] Length of pSecurityDescriptor - * lpnLengthNeeded [O] Destination for length of returned security information - * - * RETURNS - * Success: TRUE. pSecurityDescriptor contains the requested information. - * Failure: FALSE. lpnLengthNeeded contains the required space to return the info. - * - * NOTES - * The information returned is constrained by the callers access rights and - * privileges. - * - * @implemented - */ -BOOL -WINAPI -GetFileSecurityA(LPCSTR lpFileName, - SECURITY_INFORMATION RequestedInformation, - PSECURITY_DESCRIPTOR pSecurityDescriptor, - DWORD nLength, - LPDWORD lpnLengthNeeded) -{ - UNICODE_STRING FileName; - BOOL bResult; - - if (!RtlCreateUnicodeStringFromAsciiz(&FileName, lpFileName)) - { - SetLastError(ERROR_NOT_ENOUGH_MEMORY); - return FALSE; - } - - bResult = GetFileSecurityW(FileName.Buffer, - RequestedInformation, - pSecurityDescriptor, - nLength, - lpnLengthNeeded); - - RtlFreeUnicodeString(&FileName); - - return bResult; -} - - -/* - * @implemented - */ -BOOL -WINAPI -GetFileSecurityW(LPCWSTR lpFileName, - SECURITY_INFORMATION RequestedInformation, - PSECURITY_DESCRIPTOR pSecurityDescriptor, - DWORD nLength, - LPDWORD lpnLengthNeeded) -{ - OBJECT_ATTRIBUTES ObjectAttributes; - IO_STATUS_BLOCK StatusBlock; - UNICODE_STRING FileName; - ULONG AccessMask = 0; - HANDLE FileHandle; - NTSTATUS Status; - - TRACE("GetFileSecurityW() called\n"); - - QuerySecurityAccessMask(RequestedInformation, &AccessMask); - - if (!RtlDosPathNameToNtPathName_U(lpFileName, - &FileName, - NULL, - NULL)) - { - ERR("Invalid path\n"); - SetLastError(ERROR_INVALID_NAME); - return FALSE; - } - - InitializeObjectAttributes(&ObjectAttributes, - &FileName, - OBJ_CASE_INSENSITIVE, - NULL, - NULL); - - Status = NtOpenFile(&FileHandle, - AccessMask, - &ObjectAttributes, - &StatusBlock, - FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, - 0); - - RtlFreeHeap(RtlGetProcessHeap(), - 0, - FileName.Buffer); - - if (!NT_SUCCESS(Status)) - { - ERR("NtOpenFile() failed (Status %lx)\n", Status); - SetLastError(RtlNtStatusToDosError(Status)); - return FALSE; - } - - Status = NtQuerySecurityObject(FileHandle, - RequestedInformation, - pSecurityDescriptor, - nLength, - lpnLengthNeeded); - NtClose(FileHandle); - if (!NT_SUCCESS(Status)) - { - ERR("NtQuerySecurityObject() failed (Status %lx)\n", Status); - SetLastError(RtlNtStatusToDosError(Status)); - return FALSE; - } - - return TRUE; -} - - -/* - * @implemented - */ -BOOL -WINAPI -GetKernelObjectSecurity(HANDLE Handle, - SECURITY_INFORMATION RequestedInformation, - PSECURITY_DESCRIPTOR pSecurityDescriptor, - DWORD nLength, - LPDWORD lpnLengthNeeded) -{ - NTSTATUS Status; - - Status = NtQuerySecurityObject(Handle, - RequestedInformation, - pSecurityDescriptor, - nLength, - lpnLengthNeeded); - if (!NT_SUCCESS(Status)) - { - SetLastError(RtlNtStatusToDosError(Status)); - return FALSE; - } - - return TRUE; -} - - -/****************************************************************************** - * SetFileSecurityA [ADVAPI32.@] - * Sets the security of a file or directory - * - * @implemented - */ -BOOL -WINAPI -SetFileSecurityA(LPCSTR lpFileName, - SECURITY_INFORMATION SecurityInformation, - PSECURITY_DESCRIPTOR pSecurityDescriptor) -{ - UNICODE_STRING FileName; - BOOL bResult; - - if (!RtlCreateUnicodeStringFromAsciiz(&FileName, lpFileName)) - { - SetLastError(ERROR_NOT_ENOUGH_MEMORY); - return FALSE; - } - - bResult = SetFileSecurityW(FileName.Buffer, - SecurityInformation, - pSecurityDescriptor); - - RtlFreeUnicodeString(&FileName); - - return bResult; -} - - -/****************************************************************************** - * SetFileSecurityW [ADVAPI32.@] - * Sets the security of a file or directory - * - * @implemented - */ -BOOL -WINAPI -SetFileSecurityW(LPCWSTR lpFileName, - SECURITY_INFORMATION SecurityInformation, - PSECURITY_DESCRIPTOR pSecurityDescriptor) -{ - OBJECT_ATTRIBUTES ObjectAttributes; - IO_STATUS_BLOCK StatusBlock; - UNICODE_STRING FileName; - ULONG AccessMask = 0; - HANDLE FileHandle; - NTSTATUS Status; - - TRACE("SetFileSecurityW() called\n"); - - SetSecurityAccessMask(SecurityInformation, &AccessMask); - - if (!RtlDosPathNameToNtPathName_U(lpFileName, - &FileName, - NULL, - NULL)) - { - ERR("Invalid path\n"); - SetLastError(ERROR_INVALID_NAME); - return FALSE; - } - - InitializeObjectAttributes(&ObjectAttributes, - &FileName, - OBJ_CASE_INSENSITIVE, - NULL, - NULL); - - Status = NtOpenFile(&FileHandle, - AccessMask, - &ObjectAttributes, - &StatusBlock, - FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, - 0); - - RtlFreeHeap(RtlGetProcessHeap(), - 0, - FileName.Buffer); - - if (!NT_SUCCESS(Status)) - { - ERR("NtOpenFile() failed (Status %lx)\n", Status); - SetLastError(RtlNtStatusToDosError(Status)); - return FALSE; - } - - Status = NtSetSecurityObject(FileHandle, - SecurityInformation, - pSecurityDescriptor); - NtClose(FileHandle); - - if (!NT_SUCCESS(Status)) - { - ERR("NtSetSecurityObject() failed (Status %lx)\n", Status); - SetLastError(RtlNtStatusToDosError(Status)); - return FALSE; - } - - return TRUE; -} - - -/* - * @implemented - */ -BOOL -WINAPI -SetKernelObjectSecurity(HANDLE Handle, - SECURITY_INFORMATION SecurityInformation, - PSECURITY_DESCRIPTOR SecurityDescriptor) -{ - NTSTATUS Status; - - Status = NtSetSecurityObject(Handle, - SecurityInformation, - SecurityDescriptor); - if (!NT_SUCCESS(Status)) - { - SetLastError(RtlNtStatusToDosError(Status)); - return FALSE; - } - - return TRUE; -} - - /* * @implemented */ @@ -475,7 +144,6 @@ ImpersonateAnonymousToken(IN HANDLE ThreadHandle) return TRUE; } - /* * @implemented */ @@ -561,51 +229,6 @@ ImpersonateLoggedOnUser(HANDLE hToken) return TRUE; } - -/* - * @implemented - */ -BOOL -WINAPI -ImpersonateSelf(SECURITY_IMPERSONATION_LEVEL ImpersonationLevel) -{ - NTSTATUS Status; - - Status = RtlImpersonateSelf(ImpersonationLevel); - if (!NT_SUCCESS(Status)) - { - SetLastError(RtlNtStatusToDosError(Status)); - return FALSE; - } - - return TRUE; -} - - -/* - * @implemented - */ -BOOL -WINAPI -RevertToSelf(VOID) -{ - NTSTATUS Status; - HANDLE Token = NULL; - - Status = NtSetInformationThread(NtCurrentThread(), - ThreadImpersonationToken, - &Token, - sizeof(HANDLE)); - if (!NT_SUCCESS(Status)) - { - SetLastError(RtlNtStatusToDosError(Status)); - return FALSE; - } - - return TRUE; -} - - /****************************************************************************** * GetUserNameA [ADVAPI32.@] * @@ -656,7 +279,6 @@ GetUserNameA(LPSTR lpszName, return Ret; } - /****************************************************************************** * GetUserNameW [ADVAPI32.@] * @@ -994,63 +616,6 @@ LookupAccountSidW(LPCWSTR pSystemName, return ret; } - -/****************************************************************************** - * LookupAccountNameA [ADVAPI32.@] - * - * @implemented - */ -BOOL -WINAPI -LookupAccountNameA(LPCSTR SystemName, - LPCSTR AccountName, - PSID Sid, - LPDWORD SidLength, - LPSTR ReferencedDomainName, - LPDWORD hReferencedDomainNameLength, - PSID_NAME_USE SidNameUse) -{ - BOOL ret; - UNICODE_STRING lpSystemW; - UNICODE_STRING lpAccountW; - LPWSTR lpReferencedDomainNameW = NULL; - - RtlCreateUnicodeStringFromAsciiz(&lpSystemW, SystemName); - RtlCreateUnicodeStringFromAsciiz(&lpAccountW, AccountName); - - if (ReferencedDomainName) - lpReferencedDomainNameW = HeapAlloc(GetProcessHeap(), - 0, - *hReferencedDomainNameLength * sizeof(WCHAR)); - - ret = LookupAccountNameW(lpSystemW.Buffer, - lpAccountW.Buffer, - Sid, - SidLength, - lpReferencedDomainNameW, - hReferencedDomainNameLength, - SidNameUse); - - if (ret && lpReferencedDomainNameW) - { - WideCharToMultiByte(CP_ACP, - 0, - lpReferencedDomainNameW, - *hReferencedDomainNameLength + 1, - ReferencedDomainName, - *hReferencedDomainNameLength + 1, - NULL, - NULL); - } - - RtlFreeUnicodeString(&lpSystemW); - RtlFreeUnicodeString(&lpAccountW); - HeapFree(GetProcessHeap(), 0, lpReferencedDomainNameW); - - return ret; -} - - /****************************************************************************** * LookupAccountNameW [ADVAPI32.@] * @@ -1257,103 +822,6 @@ LookupPrivilegeValueW(LPCWSTR lpSystemName, return TRUE; } - -/********************************************************************** - * LookupPrivilegeDisplayNameA EXPORTED - * - * @unimplemented - */ -BOOL -WINAPI -LookupPrivilegeDisplayNameA(LPCSTR lpSystemName, - LPCSTR lpName, - LPSTR lpDisplayName, - LPDWORD cbDisplayName, - LPDWORD lpLanguageId) -{ - FIXME("%s() not implemented!\n", __FUNCTION__); - SetLastError (ERROR_CALL_NOT_IMPLEMENTED); - return FALSE; -} - - -/********************************************************************** - * LookupPrivilegeDisplayNameW EXPORTED - * - * @unimplemented - */ -BOOL -WINAPI -LookupPrivilegeDisplayNameW(LPCWSTR lpSystemName, - LPCWSTR lpName, - LPWSTR lpDisplayName, - LPDWORD cbDisplayName, - LPDWORD lpLanguageId) -{ - FIXME("%s() not implemented!\n", __FUNCTION__); - SetLastError (ERROR_CALL_NOT_IMPLEMENTED); - return FALSE; -} - - -/********************************************************************** - * LookupPrivilegeNameA EXPORTED - * - * @implemented - */ -BOOL -WINAPI -LookupPrivilegeNameA(LPCSTR lpSystemName, - PLUID lpLuid, - LPSTR lpName, - 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; -} - - /********************************************************************** * LookupPrivilegeNameW EXPORTED * @@ -1650,46 +1118,6 @@ GetNamedSecurityInfoW(LPWSTR pObjectName, return ErrorCode; } - -/********************************************************************** - * GetNamedSecurityInfoA EXPORTED - * - * @implemented - */ -DWORD -WINAPI -GetNamedSecurityInfoA(LPSTR pObjectName, - SE_OBJECT_TYPE ObjectType, - SECURITY_INFORMATION SecurityInfo, - PSID *ppsidOwner, - PSID *ppsidGroup, - PACL *ppDacl, - PACL *ppSacl, - PSECURITY_DESCRIPTOR *ppSecurityDescriptor) -{ - DWORD len; - LPWSTR wstr = NULL; - DWORD r; - - TRACE("%s %d %d %p %p %p %p %p\n", pObjectName, ObjectType, SecurityInfo, - ppsidOwner, ppsidGroup, ppDacl, ppSacl, ppSecurityDescriptor); - - if( pObjectName ) - { - len = MultiByteToWideChar( CP_ACP, 0, pObjectName, -1, NULL, 0 ); - wstr = HeapAlloc( GetProcessHeap(), 0, len*sizeof(WCHAR)); - MultiByteToWideChar( CP_ACP, 0, pObjectName, -1, wstr, len ); - } - - r = GetNamedSecurityInfoW( wstr, ObjectType, SecurityInfo, ppsidOwner, - ppsidGroup, ppDacl, ppSacl, ppSecurityDescriptor ); - - HeapFree( GetProcessHeap(), 0, wstr ); - - return r; -} - - /********************************************************************** * SetNamedSecurityInfoW EXPORTED * @@ -1737,44 +1165,6 @@ SetNamedSecurityInfoW(LPWSTR pObjectName, return ErrorCode; } - -/********************************************************************** - * SetNamedSecurityInfoA EXPORTED - * - * @implemented - */ -DWORD -WINAPI -SetNamedSecurityInfoA(LPSTR pObjectName, - SE_OBJECT_TYPE ObjectType, - SECURITY_INFORMATION SecurityInfo, - PSID psidOwner, - PSID psidGroup, - PACL pDacl, - PACL pSacl) -{ - UNICODE_STRING ObjectName; - DWORD Ret; - - if (!RtlCreateUnicodeStringFromAsciiz(&ObjectName, pObjectName)) - { - return ERROR_NOT_ENOUGH_MEMORY; - } - - Ret = SetNamedSecurityInfoW(ObjectName.Buffer, - ObjectType, - SecurityInfo, - psidOwner, - psidGroup, - pDacl, - pSacl); - - RtlFreeUnicodeString(&ObjectName); - - return Ret; -} - - /********************************************************************** * GetSecurityInfo EXPORTED * @@ -1873,81 +1263,6 @@ SetSecurityInfo(HANDLE handle, return ErrorCode; } - -/****************************************************************************** - * GetSecurityInfoExW EXPORTED - */ -DWORD -WINAPI -GetSecurityInfoExA(HANDLE hObject, - SE_OBJECT_TYPE ObjectType, - SECURITY_INFORMATION SecurityInfo, - LPCSTR lpProvider, - LPCSTR lpProperty, - PACTRL_ACCESSA *ppAccessList, - PACTRL_AUDITA *ppAuditList, - LPSTR *lppOwner, - LPSTR *lppGroup) -{ - FIXME("%s() not implemented!\n", __FUNCTION__); - return ERROR_BAD_PROVIDER; -} - - -/****************************************************************************** - * GetSecurityInfoExW EXPORTED - */ -DWORD -WINAPI -GetSecurityInfoExW(HANDLE hObject, - SE_OBJECT_TYPE ObjectType, - SECURITY_INFORMATION SecurityInfo, - LPCWSTR lpProvider, - LPCWSTR lpProperty, - PACTRL_ACCESSW *ppAccessList, - PACTRL_AUDITW *ppAuditList, - LPWSTR *lppOwner, - LPWSTR *lppGroup) -{ - FIXME("%s() not implemented!\n", __FUNCTION__); - return ERROR_BAD_PROVIDER; -} - - -/********************************************************************** - * ImpersonateNamedPipeClient EXPORTED - * - * @implemented - */ -BOOL -WINAPI -ImpersonateNamedPipeClient(HANDLE hNamedPipe) -{ - IO_STATUS_BLOCK StatusBlock; - NTSTATUS Status; - - TRACE("ImpersonateNamedPipeClient() called\n"); - - Status = NtFsControlFile(hNamedPipe, - NULL, - NULL, - NULL, - &StatusBlock, - FSCTL_PIPE_IMPERSONATE, - NULL, - 0, - NULL, - 0); - if (!NT_SUCCESS(Status)) - { - SetLastError(RtlNtStatusToDosError(Status)); - return FALSE; - } - - return TRUE; -} - - /* * @implemented */ @@ -2281,34 +1596,4 @@ TreeResetNamedSecurityInfoA(LPSTR pObjectName, #endif } -/****************************************************************************** - * QueryWindows31FilesMigration [ADVAPI32.@] - * - * PARAMS - * x1 [] - */ -BOOL WINAPI -QueryWindows31FilesMigration( DWORD x1 ) -{ - FIXME("(%d):stub\n",x1); - return TRUE; -} - -/****************************************************************************** - * SynchronizeWindows31FilesAndWindowsNTRegistry [ADVAPI32.@] - * - * PARAMS - * x1 [] - * x2 [] - * x3 [] - * x4 [] - */ -BOOL WINAPI -SynchronizeWindows31FilesAndWindowsNTRegistry( DWORD x1, DWORD x2, DWORD x3, - DWORD x4 ) -{ - FIXME("(0x%08x,0x%08x,0x%08x,0x%08x):stub\n",x1,x2,x3,x4); - return TRUE; -} - /* EOF */ diff --git a/reactos/dll/win32/advapi32/wine/security.c b/reactos/dll/win32/advapi32/wine/security.c index edfea353f83..c3364a9d473 100644 --- a/reactos/dll/win32/advapi32/wine/security.c +++ b/reactos/dll/win32/advapi32/wine/security.c @@ -311,6 +311,30 @@ static const RECORD SidTable[] = { NULL, 0 }, }; +/************************************************************ + * ADVAPI_IsLocalComputer + * + * Checks whether the server name indicates local machine. + */ +BOOL ADVAPI_IsLocalComputer(LPCWSTR ServerName) +{ + DWORD dwSize = MAX_COMPUTERNAME_LENGTH + 1; + BOOL Result; + LPWSTR buf; + + if (!ServerName || !ServerName[0]) + return TRUE; + + buf = HeapAlloc(GetProcessHeap(), 0, dwSize * sizeof(WCHAR)); + Result = GetComputerNameW(buf, &dwSize); + if (Result && (ServerName[0] == '\\') && (ServerName[1] == '\\')) + ServerName += 2; + Result = Result && !lstrcmpW(ServerName, buf); + HeapFree(GetProcessHeap(), 0, buf); + + return Result; +} + /* Exported functions */ /* @@ -799,6 +823,33 @@ GetLengthSid(PSID pSid) return (DWORD)RtlLengthSid(pSid); } +/* + * @implemented + */ +BOOL +WINAPI +GetKernelObjectSecurity(HANDLE Handle, + SECURITY_INFORMATION RequestedInformation, + PSECURITY_DESCRIPTOR pSecurityDescriptor, + DWORD nLength, + LPDWORD lpnLengthNeeded) +{ + NTSTATUS Status; + + Status = NtQuerySecurityObject(Handle, + RequestedInformation, + pSecurityDescriptor, + nLength, + lpnLengthNeeded); + if (!NT_SUCCESS(Status)) + { + SetLastError(RtlNtStatusToDosError(Status)); + return FALSE; + } + + return TRUE; +} + /* * @implemented */ @@ -822,6 +873,39 @@ InitializeAcl(PACL pAcl, return TRUE; } +/********************************************************************** + * ImpersonateNamedPipeClient EXPORTED + * + * @implemented + */ +BOOL +WINAPI +ImpersonateNamedPipeClient(HANDLE hNamedPipe) +{ + IO_STATUS_BLOCK StatusBlock; + NTSTATUS Status; + + TRACE("ImpersonateNamedPipeClient() called\n"); + + Status = NtFsControlFile(hNamedPipe, + NULL, + NULL, + NULL, + &StatusBlock, + FSCTL_PIPE_IMPERSONATE, + NULL, + 0, + NULL, + 0); + if (!NT_SUCCESS(Status)) + { + SetLastError(RtlNtStatusToDosError(Status)); + return FALSE; + } + + return TRUE; +} + /* * @implemented */ @@ -1061,6 +1145,396 @@ AllocateLocallyUniqueId(PLUID Luid) return TRUE; } +/********************************************************************** + * LookupPrivilegeDisplayNameA EXPORTED + * + * @unimplemented + */ +BOOL +WINAPI +LookupPrivilegeDisplayNameA(LPCSTR lpSystemName, + LPCSTR lpName, + LPSTR lpDisplayName, + LPDWORD cbDisplayName, + LPDWORD lpLanguageId) +{ + FIXME("%s() not implemented!\n", __FUNCTION__); + SetLastError (ERROR_CALL_NOT_IMPLEMENTED); + return FALSE; +} + + +/********************************************************************** + * LookupPrivilegeDisplayNameW EXPORTED + * + * @unimplemented + */ +BOOL +WINAPI +LookupPrivilegeDisplayNameW(LPCWSTR lpSystemName, + LPCWSTR lpName, + LPWSTR lpDisplayName, + LPDWORD cbDisplayName, + LPDWORD lpLanguageId) +{ + FIXME("%s() not implemented!\n", __FUNCTION__); + SetLastError (ERROR_CALL_NOT_IMPLEMENTED); + return FALSE; +} + +/********************************************************************** + * LookupPrivilegeNameA EXPORTED + * + * @implemented + */ +BOOL +WINAPI +LookupPrivilegeNameA(LPCSTR lpSystemName, + PLUID lpLuid, + LPSTR lpName, + 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; +} + +/****************************************************************************** + * GetFileSecurityA [ADVAPI32.@] + * + * Obtains Specified information about the security of a file or directory. + * + * PARAMS + * lpFileName [I] Name of the file to get info for + * RequestedInformation [I] SE_ flags from "winnt.h" + * pSecurityDescriptor [O] Destination for security information + * nLength [I] Length of pSecurityDescriptor + * lpnLengthNeeded [O] Destination for length of returned security information + * + * RETURNS + * Success: TRUE. pSecurityDescriptor contains the requested information. + * Failure: FALSE. lpnLengthNeeded contains the required space to return the info. + * + * NOTES + * The information returned is constrained by the callers access rights and + * privileges. + * + * @implemented + */ +BOOL +WINAPI +GetFileSecurityA(LPCSTR lpFileName, + SECURITY_INFORMATION RequestedInformation, + PSECURITY_DESCRIPTOR pSecurityDescriptor, + DWORD nLength, + LPDWORD lpnLengthNeeded) +{ + UNICODE_STRING FileName; + BOOL bResult; + + if (!RtlCreateUnicodeStringFromAsciiz(&FileName, lpFileName)) + { + SetLastError(ERROR_NOT_ENOUGH_MEMORY); + return FALSE; + } + + bResult = GetFileSecurityW(FileName.Buffer, + RequestedInformation, + pSecurityDescriptor, + nLength, + lpnLengthNeeded); + + RtlFreeUnicodeString(&FileName); + + return bResult; +} + +/* + * @implemented + */ +BOOL +WINAPI +GetFileSecurityW(LPCWSTR lpFileName, + SECURITY_INFORMATION RequestedInformation, + PSECURITY_DESCRIPTOR pSecurityDescriptor, + DWORD nLength, + LPDWORD lpnLengthNeeded) +{ + OBJECT_ATTRIBUTES ObjectAttributes; + IO_STATUS_BLOCK StatusBlock; + UNICODE_STRING FileName; + ULONG AccessMask = 0; + HANDLE FileHandle; + NTSTATUS Status; + + TRACE("GetFileSecurityW() called\n"); + + QuerySecurityAccessMask(RequestedInformation, &AccessMask); + + if (!RtlDosPathNameToNtPathName_U(lpFileName, + &FileName, + NULL, + NULL)) + { + ERR("Invalid path\n"); + SetLastError(ERROR_INVALID_NAME); + return FALSE; + } + + InitializeObjectAttributes(&ObjectAttributes, + &FileName, + OBJ_CASE_INSENSITIVE, + NULL, + NULL); + + Status = NtOpenFile(&FileHandle, + AccessMask, + &ObjectAttributes, + &StatusBlock, + FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, + 0); + + RtlFreeHeap(RtlGetProcessHeap(), + 0, + FileName.Buffer); + + if (!NT_SUCCESS(Status)) + { + ERR("NtOpenFile() failed (Status %lx)\n", Status); + SetLastError(RtlNtStatusToDosError(Status)); + return FALSE; + } + + Status = NtQuerySecurityObject(FileHandle, + RequestedInformation, + pSecurityDescriptor, + nLength, + lpnLengthNeeded); + NtClose(FileHandle); + if (!NT_SUCCESS(Status)) + { + ERR("NtQuerySecurityObject() failed (Status %lx)\n", Status); + SetLastError(RtlNtStatusToDosError(Status)); + return FALSE; + } + + return TRUE; +} + +/****************************************************************************** + * SetFileSecurityA [ADVAPI32.@] + * Sets the security of a file or directory + * + * @implemented + */ +BOOL +WINAPI +SetFileSecurityA(LPCSTR lpFileName, + SECURITY_INFORMATION SecurityInformation, + PSECURITY_DESCRIPTOR pSecurityDescriptor) +{ + UNICODE_STRING FileName; + BOOL bResult; + + if (!RtlCreateUnicodeStringFromAsciiz(&FileName, lpFileName)) + { + SetLastError(ERROR_NOT_ENOUGH_MEMORY); + return FALSE; + } + + bResult = SetFileSecurityW(FileName.Buffer, + SecurityInformation, + pSecurityDescriptor); + + RtlFreeUnicodeString(&FileName); + + return bResult; +} + +/****************************************************************************** + * SetFileSecurityW [ADVAPI32.@] + * Sets the security of a file or directory + * + * @implemented + */ +BOOL +WINAPI +SetFileSecurityW(LPCWSTR lpFileName, + SECURITY_INFORMATION SecurityInformation, + PSECURITY_DESCRIPTOR pSecurityDescriptor) +{ + OBJECT_ATTRIBUTES ObjectAttributes; + IO_STATUS_BLOCK StatusBlock; + UNICODE_STRING FileName; + ULONG AccessMask = 0; + HANDLE FileHandle; + NTSTATUS Status; + + TRACE("SetFileSecurityW() called\n"); + + SetSecurityAccessMask(SecurityInformation, &AccessMask); + + if (!RtlDosPathNameToNtPathName_U(lpFileName, + &FileName, + NULL, + NULL)) + { + ERR("Invalid path\n"); + SetLastError(ERROR_INVALID_NAME); + return FALSE; + } + + InitializeObjectAttributes(&ObjectAttributes, + &FileName, + OBJ_CASE_INSENSITIVE, + NULL, + NULL); + + Status = NtOpenFile(&FileHandle, + AccessMask, + &ObjectAttributes, + &StatusBlock, + FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, + 0); + + RtlFreeHeap(RtlGetProcessHeap(), + 0, + FileName.Buffer); + + if (!NT_SUCCESS(Status)) + { + ERR("NtOpenFile() failed (Status %lx)\n", Status); + SetLastError(RtlNtStatusToDosError(Status)); + return FALSE; + } + + Status = NtSetSecurityObject(FileHandle, + SecurityInformation, + pSecurityDescriptor); + NtClose(FileHandle); + + if (!NT_SUCCESS(Status)) + { + ERR("NtSetSecurityObject() failed (Status %lx)\n", Status); + SetLastError(RtlNtStatusToDosError(Status)); + return FALSE; + } + + return TRUE; +} + +/****************************************************************************** + * QueryWindows31FilesMigration [ADVAPI32.@] + * + * PARAMS + * x1 [] + */ +BOOL WINAPI +QueryWindows31FilesMigration( DWORD x1 ) +{ + FIXME("(%d):stub\n",x1); + return TRUE; +} + +/****************************************************************************** + * SynchronizeWindows31FilesAndWindowsNTRegistry [ADVAPI32.@] + * + * PARAMS + * x1 [] + * x2 [] + * x3 [] + * x4 [] + */ +BOOL WINAPI +SynchronizeWindows31FilesAndWindowsNTRegistry( DWORD x1, DWORD x2, DWORD x3, + DWORD x4 ) +{ + FIXME("(0x%08x,0x%08x,0x%08x,0x%08x):stub\n",x1,x2,x3,x4); + return TRUE; +} + +/* + * @implemented + */ +BOOL +WINAPI +RevertToSelf(VOID) +{ + NTSTATUS Status; + HANDLE Token = NULL; + + Status = NtSetInformationThread(NtCurrentThread(), + ThreadImpersonationToken, + &Token, + sizeof(HANDLE)); + if (!NT_SUCCESS(Status)) + { + SetLastError(RtlNtStatusToDosError(Status)); + return FALSE; + } + + return TRUE; +} + +/* + * @implemented + */ +BOOL +WINAPI +ImpersonateSelf(SECURITY_IMPERSONATION_LEVEL ImpersonationLevel) +{ + NTSTATUS Status; + + Status = RtlImpersonateSelf(ImpersonationLevel); + if (!NT_SUCCESS(Status)) + { + SetLastError(RtlNtStatusToDosError(Status)); + return FALSE; + } + + return TRUE; +} + /* * @implemented */ @@ -1136,6 +1610,29 @@ BOOL WINAPI AccessCheckByType( return !*AccessStatus; } +/* + * @implemented + */ +BOOL +WINAPI +SetKernelObjectSecurity(HANDLE Handle, + SECURITY_INFORMATION SecurityInformation, + PSECURITY_DESCRIPTOR SecurityDescriptor) +{ + NTSTATUS Status; + + Status = NtSetSecurityObject(Handle, + SecurityInformation, + SecurityDescriptor); + if (!NT_SUCCESS(Status)) + { + SetLastError(RtlNtStatusToDosError(Status)); + return FALSE; + } + + return TRUE; +} + /* * @implemented */ @@ -1195,6 +1692,61 @@ AddAuditAccessAceEx(PACL pAcl, return TRUE; } +/****************************************************************************** + * LookupAccountNameA [ADVAPI32.@] + * + * @implemented + */ +BOOL +WINAPI +LookupAccountNameA(LPCSTR SystemName, + LPCSTR AccountName, + PSID Sid, + LPDWORD SidLength, + LPSTR ReferencedDomainName, + LPDWORD hReferencedDomainNameLength, + PSID_NAME_USE SidNameUse) +{ + BOOL ret; + UNICODE_STRING lpSystemW; + UNICODE_STRING lpAccountW; + LPWSTR lpReferencedDomainNameW = NULL; + + RtlCreateUnicodeStringFromAsciiz(&lpSystemW, SystemName); + RtlCreateUnicodeStringFromAsciiz(&lpAccountW, AccountName); + + if (ReferencedDomainName) + lpReferencedDomainNameW = HeapAlloc(GetProcessHeap(), + 0, + *hReferencedDomainNameLength * sizeof(WCHAR)); + + ret = LookupAccountNameW(lpSystemW.Buffer, + lpAccountW.Buffer, + Sid, + SidLength, + lpReferencedDomainNameW, + hReferencedDomainNameLength, + SidNameUse); + + if (ret && lpReferencedDomainNameW) + { + WideCharToMultiByte(CP_ACP, + 0, + lpReferencedDomainNameW, + *hReferencedDomainNameLength + 1, + ReferencedDomainName, + *hReferencedDomainNameLength + 1, + NULL, + NULL); + } + + RtlFreeUnicodeString(&lpSystemW); + RtlFreeUnicodeString(&lpAccountW); + HeapFree(GetProcessHeap(), 0, lpReferencedDomainNameW); + + return ret; +} + /********************************************************************** * PrivilegeCheck EXPORTED * @@ -1222,6 +1774,45 @@ PrivilegeCheck(HANDLE ClientToken, return TRUE; } +/****************************************************************************** + * GetSecurityInfoExW EXPORTED + */ +DWORD +WINAPI +GetSecurityInfoExA(HANDLE hObject, + SE_OBJECT_TYPE ObjectType, + SECURITY_INFORMATION SecurityInfo, + LPCSTR lpProvider, + LPCSTR lpProperty, + PACTRL_ACCESSA *ppAccessList, + PACTRL_AUDITA *ppAuditList, + LPSTR *lppOwner, + LPSTR *lppGroup) +{ + FIXME("%s() not implemented!\n", __FUNCTION__); + return ERROR_BAD_PROVIDER; +} + + +/****************************************************************************** + * GetSecurityInfoExW EXPORTED + */ +DWORD +WINAPI +GetSecurityInfoExW(HANDLE hObject, + SE_OBJECT_TYPE ObjectType, + SECURITY_INFORMATION SecurityInfo, + LPCWSTR lpProvider, + LPCWSTR lpProperty, + PACTRL_ACCESSW *ppAccessList, + PACTRL_AUDITW *ppAuditList, + LPWSTR *lppOwner, + LPWSTR *lppGroup) +{ + FIXME("%s() not implemented!\n", __FUNCTION__); + return ERROR_BAD_PROVIDER; +} + /* * @implemented */ @@ -1247,6 +1838,66 @@ SetAclInformation(PACL pAcl, return TRUE; } +/********************************************************************** + * SetNamedSecurityInfoA EXPORTED + * + * @implemented + */ +DWORD +WINAPI +SetNamedSecurityInfoA(LPSTR pObjectName, + SE_OBJECT_TYPE ObjectType, + SECURITY_INFORMATION SecurityInfo, + PSID psidOwner, + PSID psidGroup, + PACL pDacl, + PACL pSacl) +{ + UNICODE_STRING ObjectName; + DWORD Ret; + + if (!RtlCreateUnicodeStringFromAsciiz(&ObjectName, pObjectName)) + { + return ERROR_NOT_ENOUGH_MEMORY; + } + + Ret = SetNamedSecurityInfoW(ObjectName.Buffer, + ObjectType, + SecurityInfo, + psidOwner, + psidGroup, + pDacl, + pSacl); + + RtlFreeUnicodeString(&ObjectName); + + return Ret; +} + +/* + * @implemented + */ +BOOL +WINAPI +AreAllAccessesGranted(DWORD GrantedAccess, + DWORD DesiredAccess) +{ + return (BOOL)RtlAreAllAccessesGranted(GrantedAccess, + DesiredAccess); +} + +/* + * @implemented + */ +BOOL +WINAPI +AreAnyAccessesGranted(DWORD GrantedAccess, + DWORD DesiredAccess) +{ + return (BOOL)RtlAreAnyAccessesGranted(GrantedAccess, + DesiredAccess); +} + /****************************************************************************** * ParseAclStringFlags */ @@ -2687,6 +3338,44 @@ lend: return bret; } +/********************************************************************** + * GetNamedSecurityInfoA EXPORTED + * + * @implemented + */ +DWORD +WINAPI +GetNamedSecurityInfoA(LPSTR pObjectName, + SE_OBJECT_TYPE ObjectType, + SECURITY_INFORMATION SecurityInfo, + PSID *ppsidOwner, + PSID *ppsidGroup, + PACL *ppDacl, + PACL *ppSacl, + PSECURITY_DESCRIPTOR *ppSecurityDescriptor) +{ + DWORD len; + LPWSTR wstr = NULL; + DWORD r; + + TRACE("%s %d %d %p %p %p %p %p\n", pObjectName, ObjectType, SecurityInfo, + ppsidOwner, ppsidGroup, ppDacl, ppSacl, ppSecurityDescriptor); + + if( pObjectName ) + { + len = MultiByteToWideChar( CP_ACP, 0, pObjectName, -1, NULL, 0 ); + wstr = HeapAlloc( GetProcessHeap(), 0, len*sizeof(WCHAR)); + MultiByteToWideChar( CP_ACP, 0, pObjectName, -1, wstr, len ); + } + + r = GetNamedSecurityInfoW( wstr, ObjectType, SecurityInfo, ppsidOwner, + ppsidGroup, ppDacl, ppSacl, ppSecurityDescriptor ); + + HeapFree( GetProcessHeap(), 0, wstr ); + + return r; +} + /* * @unimplemented */