ObReferenceObjectByNameEx
NTSTATUS __stdcall ObReferenceObjectByNameEx(
_OBJECT_ATTRIBUTES *ObjectAttributes,
UINT64 DesiredAccess,
_OBJECT_TYPE *ObjectType,
CHAR AccessMode,
VOID *ParseContext,
VOID **Object){
_OBJECT_TYPE *v6;
unsigned int v7;
struct _KPRCB *CurrentPrcb;
_GENERAL_LOOKASIDE *P;
PSLIST_ENTRY v12;
unsigned int Number;
_SLIST_ENTRY *v14;
_EJOB *Silo;
__int64 v16;
INT64 *v17;
CHAR v18;
_SLIST_ENTRY *Next;
struct _KPRCB *v20;
_GENERAL_LOOKASIDE *v21;
_GENERAL_LOOKASIDE *L;
__int64 Size;
void *(__fastcall *AllocateEx)(_POOL_TYPE, unsigned __int64, unsigned int, _LOOKASIDE_LIST_EX *);
__int64 Tag;
__int64 Type;
INT64 UseLookaside;
VOID *Objecta;
_UNICODE_STRING CapturedObjectName;
_LEARNING_MODE_OBJECT_INFORMATION ObjectInformation[4];
__int128 v32;
__int128 v33;
__int64 v34;
int v35;
PADAPTER_OBJECT *a7;
Objecta = 0i64;
v6 = (_OBJECT_TYPE *)AccessMode;
v34 = 0i64;
v7 = (unsigned int)ObjectType;
CapturedObjectName = 0i64;
*(_OWORD *)ObjectInformation = 0i64;
v32 = 0i64;
v33 = 0i64;
if( !ObjectAttributes || !AccessMode )
return -1073741811;
CurrentPrcb = KeGetCurrentPrcb();
P = CurrentPrcb->PPLookasideList[8].P;
++P->TotalAllocates;
v12 = RtlpInterlockedPopEntrySList(&P->ListHead);
if( !v12 )
{
++P->AllocateMisses;
L = CurrentPrcb->PPLookasideList[8].L;
++L->TotalAllocates;
v12 = RtlpInterlockedPopEntrySList(&L->ListHead);
if( !v12 )
{
Size = L->Size;
AllocateEx = L->AllocateEx;
Tag = L->Tag;
Type = (unsigned int)L->Type;
++L->AllocateMisses;
v12 = (PSLIST_ENTRY)((__int64(__fastcall *)(__int64, __int64, __int64))AllocateEx)(Type, Size, Tag);
if( !v12 )
return -1073741670;
}
}
Number = CurrentPrcb->Number;
v14 = v12 + 10;
LODWORD(UseLookaside) = 1;
LODWORD(v12->Next) = Number;
v35 = ObpCaptureObjectCreateInformation(
(INT8)ParseContext,
(INT8)ParseContext,
ObjectAttributes,
&CapturedObjectName,
(_OBJECT_CREATE_INFORMATION *)&v12[10],
UseLookaside);
if( v35 >= 0 )
{
if( !DesiredAccess )
{
v35 = SeCreateAccessState((_ACCESS_STATE *)v12, (_AUX_ACCESS_DATA *)&v12[14], v7, &v6->TypeInfo.GenericMapping);
if( v35 < 0 )
{
LABEL_14:
if( (PSLIST_ENTRY)DesiredAccess == v12 )
{
SepDeleteAccessState((_ACCESS_STATE *)DesiredAccess);
SeReleaseSubjectContext((PSECURITY_SUBJECT_CONTEXT)(DesiredAccess + 32));
}
Next = v12[12].Next;
if( Next )
{
SeReleaseSecurityDescriptor(Next, (CHAR)v12[11].Next, 1u);
v12[12].Next = 0i64;
}
if( CapturedObjectName.Buffer )
ObpFreeObjectNameBuffer(&CapturedObjectName);
goto LABEL_20;
}
DesiredAccess = (UINT64)v12;
}
v35 = ObpAdjustAccessMask((_ACCESS_STATE *)DesiredAccess);
if( v35 >= 0 )
{
Silo = PsGetCurrentSilo();
v35 = ObpLookupObjectName(
*((VOID **)&v12[10].Next + 1),
&CapturedObjectName,
LODWORD(v14->Next),
v6,
(INT8)ParseContext,
Object,
0i64,
0i64,
Silo,
(_ACCESS_STATE *)DesiredAccess,
(_OBP_LOOKUP_CONTEXT *)&v12[28],
0i64,
&Objecta);
if( v35 >= 0 )
{
ObpReleaseLookupContext((_OBP_LOOKUP_CONTEXT *)&v12[28]);
v16 = ObTypeIndexTable[(unsigned __int8)ObHeaderCookie ^ (unsigned __int8)*((char *)Objecta - 24) ^ (unsigned __int64)(unsigned __int8)((unsigned __int16)((_WORD)Objecta - 48) >> 8)];
if( (*(_DWORD *)(v16 + 72) & (__int64)v14->Next) != 0 )
{
HalPutDmaAdapter((PADAPTER_OBJECT)Objecta);
v35 = -1073741811;
}
else
{
*(_QWORD *)&v32 = v16 + 16;
*((_QWORD *)&v32 + 1) = &CapturedObjectName;
*(_QWORD *)&v33 = *((_QWORD *)&v12[10].Next + 1);
SeSetLearningModeObjectInformation(ObjectInformation);
LOBYTE(v17) = (_BYTE)ParseContext;
if( ObpCheckObjectReference(Objecta, (_ACCESS_STATE *)DesiredAccess, v18, v17) )
*a7 = (PADAPTER_OBJECT)Objecta;
else
HalPutDmaAdapter((PADAPTER_OBJECT)Objecta);
SeClearLearningModeObjectInformation();
}
}
}
goto LABEL_14;
}
LABEL_20:
v20 = KeGetCurrentPrcb();
v21 = v20->PPLookasideList[8].P;
++v21->TotalFrees;
if( LOWORD(v21->ListHead.Alignment) < v21->Depth
|| (++v21->FreeMisses,
v21 = v20->PPLookasideList[8].L,
++v21->TotalFrees,
LOWORD(v21->ListHead.Alignment) < v21->Depth) )
{
RtlpInterlockedPushEntrySList(&v21->ListHead, v12);
}
else
{
++v21->FreeMisses;
((void(__fastcall *)(PSLIST_ENTRY))v21->FreeEx)(v12);
}
return v35;
}Referenced by:
AlpcpCreateClientPort
CmObReferenceObjectByName
CmUnloadKey
CmpResolveHiveLoadConflict
NtQueryOpenSubKeys
NtQueryOpenSubKeysEx
ObInitServerSilo