ObSetSecurityDescriptorInfo
NTSTATUS __stdcall ObSetSecurityDescriptorInfo(
PVOID Object,
UINT64 *SecurityInformation,
PVOID SecurityDescriptor,
PVOID *ObjectsSecurityDescriptor,
_POOL_TYPE PoolType,
_GENERIC_MAPPING *GenericMapping){
_ETHREAD *CurrentThread;
unsigned int v7;
void *v11;
NTSTATUS v12;
__int64 v13;
char v14;
PSECURITY_DESCRIPTOR ObjectsSecurityDescriptora;
void *OutputSecurityDescriptor[4];
UINT64 Size;
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
v7 = 0;
LODWORD(Size) = 0;
OutputSecurityDescriptor[0] = 0i64;
--*((_WORD *)CurrentThread + 242);
ExAcquirePushLockExclusiveEx((UINT64)Object - 32, 0i64);
v11 = (void *)(*((_QWORD *)Object - 1) & 0xFFFFFFFFFFFFFFF0ui64);
ObjectsSecurityDescriptora = v11;
v12 = SeSetSecurityDescriptorInfo(
Object,
SecurityInformation,
SecurityDescriptor,
&ObjectsSecurityDescriptora,
PoolType,
GenericMapping);
if( v12 < 0 )
{
ObjectsSecurityDescriptora = 0i64;
}
else
{
v12 = ObLogSecurityDescriptor(ObjectsSecurityDescriptora, OutputSecurityDescriptor, 0x10ui64);
if( v12 >= 0 )
{
v12 = SeComputeQuotaInformationSize(ObjectsSecurityDescriptora, &Size);
if( v12 >= 0 )
{
v12 = ObAdjustSecurityQuota(Object, (unsigned int)Size);
if( v12 >= 0 )
{
v13 = 0i64;
if( OutputSecurityDescriptor[0] )
v13 = (unsigned __int64)OutputSecurityDescriptor[0] | 0xF;
v14 = _InterlockedExchange64((volatile __int64 *)Object - 1, v13);
OutputSecurityDescriptor[0] = 0i64;
if( v11 )
v7 = (v14 & 0xF) + 1;
}
}
}
}
ExReleasePushLockEx((UINT64)Object - 32, 0i64);
KeLeaveCriticalRegionThread((__int64)KeGetCurrentThread());
if( OutputSecurityDescriptor[0] )
ObDereferenceSecurityDescriptor(OutputSecurityDescriptor[0], 0x10ui64);
if( v11 && v7 )
ObDereferenceSecurityDescriptor(v11, v7);
if( ObjectsSecurityDescriptora )
ExFreePoolWithTag(ObjectsSecurityDescriptora, 0);
return v12;
}Referenced by:
SeDefaultObjectMethod
WmipSecurityMethod