ObpCaptureObjectCreateInformation
NTSTATUS __stdcall ObpCaptureObjectCreateInformation(
INT8 ProbeMode,
INT8 CreatorMode,
_OBJECT_ATTRIBUTES *ObjectAttributes,
_UNICODE_STRING *CapturedObjectName,
_OBJECT_CREATE_INFORMATION *ObjectCreateInfo,
UINT64 UseLookaside){
int Attributes;
_UNICODE_STRING *ObjectName;
void *SecurityDescriptor;
_SECURITY_QUALITY_OF_SERVICE *SecurityQualityOfService;
int v12;
void **p_SecurityDescriptor;
void *v15;
INT64 v16;
INT64 v17;
int Size_4;
int v19;
_SECURITY_QUALITY_OF_SERVICE *v20;
_UNICODE_STRING *v21;
void *v22;
_ETHREAD *CurrentThread;
_ETHREAD *v24;
HIDWORD(v17) = 0;
*CapturedObjectName = 0i64;
*(_OWORD *)&ObjectCreateInfo->Attributes = 0i64;
*(_OWORD *)&ObjectCreateInfo->ProbeMode = 0i64;
*(_OWORD *)&ObjectCreateInfo->SecurityDescriptor = 0i64;
*(_OWORD *)&ObjectCreateInfo->SecurityQualityOfService.Length = 0i64;
if( !ObjectAttributes )
return 0;
ObjectCreateInfo->ProbeMode = ProbeMode;
if( ProbeMode )
{
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
if( CurrentThread->Tcb.PreviousMode )
{
if( ((unsigned __int8)ObjectAttributes & 7) != 0 )
goto LABEL_18;
}
}
if( ObjectAttributes->Length != 48 )
{
v12 = -1073741811;
Size_4 = -1073741811;
goto LABEL_33;
}
ObjectCreateInfo->RootDirectory = ObjectAttributes->RootDirectory;
Attributes = ObjectAttributes->Attributes;
v19 = Attributes;
if( CreatorMode )
{
Attributes &= ~0x200u;
v19 = Attributes;
}
if( (Attributes & 0xFFFEE00D) != 0 )
{
v12 = -1073741811;
Size_4 = -1073741811;
goto LABEL_33;
}
ObjectCreateInfo->Attributes = Attributes;
ObjectName = ObjectAttributes->ObjectName;
v21 = ObjectName;
SecurityDescriptor = ObjectAttributes->SecurityDescriptor;
v22 = SecurityDescriptor;
SecurityQualityOfService = (_SECURITY_QUALITY_OF_SERVICE *)ObjectAttributes->SecurityQualityOfService;
v20 = SecurityQualityOfService;
if( SecurityQualityOfService )
{
if( !ProbeMode )
{
LABEL_14:
ObjectCreateInfo->SecurityQualityOfService = *SecurityQualityOfService;
goto LABEL_19;
}
v24 = (_ETHREAD *)KeGetCurrentThread();
BYTE1(v17) = v24->Tcb.PreviousMode;
if( !BYTE1(v17) || ((unsigned __int8)v20 & 3) == 0 )
{
SecurityQualityOfService = v20;
SecurityDescriptor = v22;
ObjectName = v21;
goto LABEL_14;
}
LABEL_18:
ExRaiseDatatypeMisalignment();
}
LABEL_19:
if( SecurityDescriptor )
{
p_SecurityDescriptor = &ObjectCreateInfo->SecurityDescriptor;
v12 = SeCaptureSecurityDescriptor(
SecurityDescriptor,
ProbeMode,
PagedPool,
1u,
&ObjectCreateInfo->SecurityDescriptor,
v16,
v17);
if( v12 < 0 )
{
*p_SecurityDescriptor = 0i64;
goto LABEL_33;
}
SeComputeQuotaInformationSize(*p_SecurityDescriptor, (UINT64 *)((char *)&v17 + 4));
ObjectCreateInfo->SecurityDescriptorCharge = HIDWORD(v17);
}
if( !SecurityQualityOfService )
goto LABEL_21;
ObjectCreateInfo->SecurityQualityOfService.Length = 12;
ObjectCreateInfo->SecurityQos = &ObjectCreateInfo->SecurityQualityOfService;
if( ObjectCreateInfo->SecurityQualityOfService.ContextTrackingMode >= 2u )
{
v12 = -1073741811;
goto LABEL_33;
}
if( ObjectCreateInfo->SecurityQualityOfService.ImpersonationLevel > (unsigned int)SecurityDelegation )
{
v12 = -1073741659;
}
else
{
LABEL_21:
if( ObjectName )
{
v12 = ObpCaptureObjectName(ProbeMode, ObjectName, CapturedObjectName, (unsigned int)UseLookaside);
if( v12 >= 0 )
return 0;
}
else
{
if( !ObjectCreateInfo->RootDirectory )
return 0;
v12 = -1073741773;
}
}
LABEL_33:
v15 = ObjectCreateInfo->SecurityDescriptor;
if( v15 )
{
SeReleaseSecurityDescriptor(v15, ObjectCreateInfo->ProbeMode, 1u);
ObjectCreateInfo->SecurityDescriptor = 0i64;
}
return v12;
}Referenced by:
CmpCreateKeyBody
IopAllocRealFileObject
ObCreateObjectEx
ObOpenObjectByNameEx
ObReferenceObjectByNameEx