ObpCallPreOperationCallbacks
__int64 __fastcall ObpCallPreOperationCallbacks(__int64 a1, __int64 a2, _QWORD *a3){
UINT64 v3;
_QWORD *v4;
struct _EX_RUNDOWN_REF *v5;
_ETHREAD *CurrentThread;
struct _EX_RUNDOWN_REF **v9;
_ETHREAD *v10;
struct _EX_RUNDOWN_REF *i;
_ETHREAD *v12;
bool v13;
void(__fastcall *Count)(_QWORD, __int64);
_ETHREAD *v15;
_ETHREAD *v16;
_QWORD *PoolWithTag;
_QWORD **v19;
_OB_POST_OPERATION_INFORMATION PostOperationInfo;
v3 = a1 + 184;
memset(&PostOperationInfo, 0, sizeof(PostOperationInfo));
v4 = 0i64;
v5 = 0i64;
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
v9 = (struct _EX_RUNDOWN_REF **)(a1 + 200);
--*((_WORD *)CurrentThread + 242);
ObfReferenceObjectWithTag(*(PVOID *)(a2 + 8), 0x6243624Fu);
v10 = (_ETHREAD *)KeGetCurrentThread();
--*((_WORD *)v10 + 243);
ExAcquirePushLockSharedEx(v3, 0i64);
for( i = *v9; i != (struct _EX_RUNDOWN_REF *)v9; i = (struct _EX_RUNDOWN_REF *)i->Count )
{
if( (HIDWORD(i[2].Ptr) & 1) != 0 && (i[2].Count & *(_DWORD *)a2) != 0 && ExAcquireRundownProtection(i + 7) )
{
ExReleasePushLockEx(v3, 0i64);
v12 = (_ETHREAD *)KeGetCurrentThread();
v13 = (*((_WORD *)v12 + 243))++ == 0xFFFF;
if( v13 && *((_ETHREAD **)v12 + 19) != (_ETHREAD *)((char *)v12 + 152) )
KiCheckForKernelApcDelivery();
if( v5 )
{
ExReleaseRundownProtection(v5);
v5 = 0i64;
}
if( i[6].Count )
{
PoolWithTag = ExAllocatePoolWithTag(PagedPool, 0x20ui64, 0x6C46624Fui64);
v4 = PoolWithTag;
if( !PoolWithTag )
{
ExReleaseRundownProtection(i + 7);
if( (_QWORD *)*a3 == a3 )
{
KeLeaveCriticalRegion();
ObfDereferenceObjectWithTag(*(PVOID *)(a2 + 8), 0x6243624Fui64);
}
else
{
PostOperationInfo.ReturnStatus = -1073741670;
PostOperationInfo.CallContext = 0i64;
*(_QWORD *)(&PostOperationInfo.ReturnStatus + 1) = 0i64;
HIDWORD(PostOperationInfo.Parameters) = 0;
PostOperationInfo.Operation = *(_DWORD *)a2;
PostOperationInfo.Flags = *(_DWORD *)(a2 + 4);
PostOperationInfo.ObjectType = *(POBJECT_TYPE *)(a2 + 16);
PostOperationInfo.Object = *(PVOID *)(a2 + 8);
ObpCallPostOperationCallbacks(&PostOperationInfo, (_LIST_ENTRY *)a3);
}
return 3221225626i64;
}
PoolWithTag[2] = i;
PoolWithTag[3] = 0i64;
v19 = (_QWORD **)a3[1];
if( *v19 != a3 )
__fastfail(3u);
*PoolWithTag = a3;
PoolWithTag[1] = v19;
*v19 = PoolWithTag;
a3[1] = PoolWithTag;
}
Count = (void(__fastcall *)(_QWORD, __int64))i[5].Count;
if( Count )
{
Count(*(_QWORD *)(i[3].Count + 8), a2);
if( i[6].Count )
v4[3] = *(_QWORD *)(a2 + 24);
else
v5 = i + 7;
*(_QWORD *)(a2 + 24) = 0i64;
}
v15 = (_ETHREAD *)KeGetCurrentThread();
--*((_WORD *)v15 + 243);
ExAcquirePushLockSharedEx(v3, 0i64);
}
}
ExReleasePushLockEx(v3, 0i64);
v16 = (_ETHREAD *)KeGetCurrentThread();
v13 = (*((_WORD *)v16 + 243))++ == 0xFFFF;
if( v13 && *((_ETHREAD **)v16 + 19) != (_ETHREAD *)((char *)v16 + 152) )
KiCheckForKernelApcDelivery();
if( v5 )
ExReleaseRundownProtection(v5);
if( (_QWORD *)*a3 == a3 )
{
ObfDereferenceObjectWithTag(*(PVOID *)(a2 + 8), 0x6243624Fui64);
KeLeaveCriticalRegion();
}
return 0i64;
}Referenced by:
ObpPreInterceptHandleCreate
ObpPreInterceptHandleDuplicate