ObSetSecurityDescriptorInfo
NTSTATUS __stdcall ObSetSecurityDescriptorInfo(
VOID *Object,
UINT64 *SecurityInformation,
VOID *SecurityDescriptor,
VOID **ObjectsSecurityDescriptor,
POOL_TYPE PoolType,
_GENERIC_MAPPING *GenericMapping){
_ETHREAD *CurrentThread;
unsigned int v7;
VOID *v11;
int v12;
__int64 v13;
char v14;
PSECURITY_DESCRIPTOR ObjectsSecurityDescriptora;
PVOID OutputSecurityDescriptor;
UINT64 Size;
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
v7 = 0;
LODWORD(Size) = 0;
OutputSecurityDescriptor = 0i64;
--CurrentThread->Tcb.KernelApcDisable;
ExAcquirePushLockExclusiveEx((_EX_PUSH_LOCK *)Object - 4, 0i64);
v11 = (VOID *)(*((_QWORD *)Object - 1) & 0xFFFFFFFFFFFFFFF0ui64);
v12 = SeSetSecurityDescriptorInfo(
Object,
SecurityInformation,
SecurityDescriptor,
&ObjectsSecurityDescriptora,
PoolType,
GenericMapping,
(INT64)v11,
OutputSecurityDescriptor);
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 )
v13 = (unsigned __int64)OutputSecurityDescriptor | 0xF;
v14 = _InterlockedExchange64((volatile __int64 *)Object - 1, v13);
OutputSecurityDescriptor = 0i64;
if( v11 )
v7 = (v14 & 0xF) + 1;
}
}
}
}
ExReleasePushLockEx((_DWORD)Object - 32, 0);
KeLeaveCriticalRegionThread(KeGetCurrentThread());
if( OutputSecurityDescriptor )
ObDereferenceSecurityDescriptor(OutputSecurityDescriptor, 0x10ui64);
if( v11 && v7 )
ObDereferenceSecurityDescriptor(v11, v7);
if( ObjectsSecurityDescriptora )
ExFreePoolWithTag(ObjectsSecurityDescriptora, 0);
return v12;
}Referenced by:
SeDefaultObjectMethod
WmipSecurityMethod