advapi32: Implement GetSecurityInfo.
This commit is contained in:
parent
790e6dcd29
commit
62e5b6270b
|
@ -2710,6 +2710,22 @@ BOOL WINAPI PrivilegedServiceAuditAlarmW( LPCWSTR SubsystemName, LPCWSTR Service
|
||||||
|
|
||||||
/******************************************************************************
|
/******************************************************************************
|
||||||
* GetSecurityInfo [ADVAPI32.@]
|
* GetSecurityInfo [ADVAPI32.@]
|
||||||
|
*
|
||||||
|
* Retrieves a copy of the security descriptor associated with an object.
|
||||||
|
*
|
||||||
|
* PARAMS
|
||||||
|
* hObject [I] A handle for the object.
|
||||||
|
* ObjectType [I] The type of object.
|
||||||
|
* SecurityInfo [I] A bitmask indicating what info to retrieve.
|
||||||
|
* ppsidOwner [O] If non-null, receives a pointer to the owner SID.
|
||||||
|
* ppsidGroup [O] If non-null, receives a pointer to the group SID.
|
||||||
|
* ppDacl [O] If non-null, receives a pointer to the DACL.
|
||||||
|
* ppSacl [O] If non-null, receives a pointer to the SACL.
|
||||||
|
* ppSecurityDescriptor [O] Receives a pointer to the security descriptor,
|
||||||
|
* which must be freed with LocalFree.
|
||||||
|
*
|
||||||
|
* RETURNS
|
||||||
|
* ERROR_SUCCESS if all's well, and a WIN32 error code otherwise.
|
||||||
*/
|
*/
|
||||||
DWORD WINAPI GetSecurityInfo(
|
DWORD WINAPI GetSecurityInfo(
|
||||||
HANDLE hObject, SE_OBJECT_TYPE ObjectType,
|
HANDLE hObject, SE_OBJECT_TYPE ObjectType,
|
||||||
|
@ -2718,8 +2734,50 @@ DWORD WINAPI GetSecurityInfo(
|
||||||
PSECURITY_DESCRIPTOR *ppSecurityDescriptor
|
PSECURITY_DESCRIPTOR *ppSecurityDescriptor
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
FIXME("stub!\n");
|
PSECURITY_DESCRIPTOR sd;
|
||||||
return ERROR_BAD_PROVIDER;
|
NTSTATUS status;
|
||||||
|
ULONG n1, n2;
|
||||||
|
BOOL present, defaulted;
|
||||||
|
|
||||||
|
status = NtQuerySecurityObject(hObject, SecurityInfo, NULL, 0, &n1);
|
||||||
|
if (status != STATUS_BUFFER_TOO_SMALL && status != STATUS_SUCCESS)
|
||||||
|
return RtlNtStatusToDosError(status);
|
||||||
|
|
||||||
|
sd = LocalAlloc(0, n1);
|
||||||
|
if (!sd)
|
||||||
|
return ERROR_NOT_ENOUGH_MEMORY;
|
||||||
|
|
||||||
|
status = NtQuerySecurityObject(hObject, SecurityInfo, sd, n1, &n2);
|
||||||
|
if (status != STATUS_SUCCESS)
|
||||||
|
{
|
||||||
|
LocalFree(sd);
|
||||||
|
return RtlNtStatusToDosError(status);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ppsidOwner)
|
||||||
|
{
|
||||||
|
*ppsidOwner = NULL;
|
||||||
|
GetSecurityDescriptorOwner(sd, ppsidOwner, &defaulted);
|
||||||
|
}
|
||||||
|
if (ppsidGroup)
|
||||||
|
{
|
||||||
|
*ppsidGroup = NULL;
|
||||||
|
GetSecurityDescriptorGroup(sd, ppsidGroup, &defaulted);
|
||||||
|
}
|
||||||
|
if (ppDacl)
|
||||||
|
{
|
||||||
|
*ppDacl = NULL;
|
||||||
|
GetSecurityDescriptorDacl(sd, &present, ppDacl, &defaulted);
|
||||||
|
}
|
||||||
|
if (ppSacl)
|
||||||
|
{
|
||||||
|
*ppSacl = NULL;
|
||||||
|
GetSecurityDescriptorSacl(sd, &present, ppSacl, &defaulted);
|
||||||
|
}
|
||||||
|
if (ppSecurityDescriptor)
|
||||||
|
*ppSecurityDescriptor = sd;
|
||||||
|
|
||||||
|
return ERROR_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
/******************************************************************************
|
/******************************************************************************
|
||||||
|
|
|
@ -2483,6 +2483,37 @@ static void test_acls(void)
|
||||||
ok(!ret && GetLastError() == ERROR_INVALID_PARAMETER, "InitializeAcl(-1) failed with error %d\n", GetLastError());
|
ok(!ret && GetLastError() == ERROR_INVALID_PARAMETER, "InitializeAcl(-1) failed with error %d\n", GetLastError());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void test_GetSecurityInfo(void)
|
||||||
|
{
|
||||||
|
HANDLE obj;
|
||||||
|
PSECURITY_DESCRIPTOR sd;
|
||||||
|
PSID owner, group;
|
||||||
|
PACL dacl;
|
||||||
|
DWORD ret;
|
||||||
|
|
||||||
|
/* Create something. Files have lots of associated security info. */
|
||||||
|
obj = CreateFile(myARGV[0], GENERIC_READ, FILE_SHARE_READ, NULL,
|
||||||
|
OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
|
||||||
|
if (!obj)
|
||||||
|
{
|
||||||
|
skip("Couldn't create an object for GetSecurityInfo test\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
ret = GetSecurityInfo(obj, SE_FILE_OBJECT,
|
||||||
|
OWNER_SECURITY_INFORMATION | GROUP_SECURITY_INFORMATION | DACL_SECURITY_INFORMATION,
|
||||||
|
&owner, &group, &dacl, NULL, &sd);
|
||||||
|
ok(ret == ERROR_SUCCESS, "GetSecurityInfo returned %d\n", ret);
|
||||||
|
ok(sd != NULL, "GetSecurityInfo\n");
|
||||||
|
ok(owner != NULL, "GetSecurityInfo\n");
|
||||||
|
ok(group != NULL, "GetSecurityInfo\n");
|
||||||
|
ok(dacl != NULL, "GetSecurityInfo\n");
|
||||||
|
ok(IsValidAcl(dacl), "GetSecurityInfo\n");
|
||||||
|
|
||||||
|
LocalFree(sd);
|
||||||
|
CloseHandle(obj);
|
||||||
|
}
|
||||||
|
|
||||||
START_TEST(security)
|
START_TEST(security)
|
||||||
{
|
{
|
||||||
init();
|
init();
|
||||||
|
@ -2511,4 +2542,5 @@ START_TEST(security)
|
||||||
test_ConvertSecurityDescriptorToString();
|
test_ConvertSecurityDescriptorToString();
|
||||||
test_PrivateObjectSecurity();
|
test_PrivateObjectSecurity();
|
||||||
test_acls();
|
test_acls();
|
||||||
|
test_GetSecurityInfo();
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue