mirror of
https://github.com/reactos/reactos.git
synced 2024-08-12 06:06:27 +00:00
[ADVAPI32]
* Move some functions from sec/misc.c to security.c. CORE-8540 svn path=/trunk/; revision=64978
This commit is contained in:
parent
2d07e343d6
commit
5781991967
|
@ -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 */
|
||||
|
|
|
@ -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
|
||||
*/
|
||||
|
|
Loading…
Reference in a new issue