ObpCallPreOperationCallbacks
NTSTATUS __stdcall ObpCallPreOperationCallbacks(
_OBJECT_TYPE *ObjectType,
_OB_PRE_OPERATION_INFORMATION *PreOperationInfo,
_LIST_ENTRY *PostCallbackListHead){
_EX_PUSH_LOCK *p_TypeLock;
_LIST_ENTRY *v4;
_EX_RUNDOWN_REF *p_Blink;
_ETHREAD *CurrentThread;
_LIST_ENTRY *p_CallbackList;
_ETHREAD *v10;
_LIST_ENTRY *i;
_ETHREAD *v12;
bool v13;
_LIST_ENTRY *v14;
_ETHREAD *v15;
_ETHREAD *v16;
_LIST_ENTRY *PoolWithTag;
_LIST_ENTRY *Blink;
_OB_POST_OPERATION_INFORMATION PostOperationInfo;
p_TypeLock = &ObjectType->TypeLock;
memset(&PostOperationInfo, 0, sizeof(PostOperationInfo));
v4 = 0i64;
p_Blink = 0i64;
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
p_CallbackList = &ObjectType->CallbackList;
--CurrentThread->Tcb.KernelApcDisable;
ObfReferenceObjectWithTag(PreOperationInfo->Object, 0x6243624Fui64);
v10 = (_ETHREAD *)KeGetCurrentThread();
--v10->Tcb.SpecialApcDisable;
ExAcquirePushLockSharedEx(p_TypeLock, 0i64);
for( i = p_CallbackList->Flink; i != p_CallbackList; i = i->Flink )
{
if( (HIDWORD(i[1].Flink) & 1) != 0
&& ((__int64)i[1].Flink & PreOperationInfo->Operation) != 0
&& ExAcquireRundownProtection((_EX_RUNDOWN_REF *)&i[3].Blink) )
{
ExReleasePushLockEx((ULONG_PTR)p_TypeLock, 0);
v12 = (_ETHREAD *)KeGetCurrentThread();
v13 = v12->Tcb.SpecialApcDisable++ == -1;
if( v13 && ($F25F8C4BA33AF922A5F1AF68CD89DDDF *)v12->Tcb.ApcState.ApcListHead[0].Flink != &v12->Tcb.152 )
KiCheckForKernelApcDelivery();
if( p_Blink )
{
ExReleaseRundownProtection(p_Blink);
p_Blink = 0i64;
}
if( i[3].Flink )
{
PoolWithTag = (_LIST_ENTRY *)ExAllocatePoolWithTag(1ui64, 0x20ui64, 1816552015i64);
v4 = PoolWithTag;
if( !PoolWithTag )
{
ExReleaseRundownProtection((_EX_RUNDOWN_REF *)&i[3].Blink);
if( PostCallbackListHead->Flink == PostCallbackListHead )
{
KeLeaveCriticalRegion();
ObfDereferenceObjectWithTag(PreOperationInfo->Object, 0x6243624Fui64);
}
else
{
PostOperationInfo.ReturnStatus = -1073741670;
PostOperationInfo.CallContext = 0i64;
*(_QWORD *)(&PostOperationInfo.ReturnStatus + 1) = 0i64;
HIDWORD(PostOperationInfo.Parameters) = 0;
PostOperationInfo.Operation = PreOperationInfo->Operation;
PostOperationInfo.Flags = PreOperationInfo->Flags;
PostOperationInfo.ObjectType = PreOperationInfo->ObjectType;
PostOperationInfo.Object = PreOperationInfo->Object;
ObpCallPostOperationCallbacks(&PostOperationInfo, PostCallbackListHead);
}
return -1073741670;
}
PoolWithTag[1].Flink = i;
PoolWithTag[1].Blink = 0i64;
Blink = PostCallbackListHead->Blink;
if( Blink->Flink != PostCallbackListHead )
__fastfail(3u);
PoolWithTag->Flink = PostCallbackListHead;
PoolWithTag->Blink = Blink;
Blink->Flink = PoolWithTag;
PostCallbackListHead->Blink = PoolWithTag;
}
v14 = i[2].Blink;
if( v14 )
{
((void(__fastcall *)(_LIST_ENTRY *, _OB_PRE_OPERATION_INFORMATION *))v14)(i[1].Blink->Blink, PreOperationInfo);
if( i[3].Flink )
v4[1].Blink = (_LIST_ENTRY *)PreOperationInfo->CallContext;
else
p_Blink = (_EX_RUNDOWN_REF *)&i[3].Blink;
PreOperationInfo->CallContext = 0i64;
}
v15 = (_ETHREAD *)KeGetCurrentThread();
--v15->Tcb.SpecialApcDisable;
ExAcquirePushLockSharedEx(p_TypeLock, 0i64);
}
}
ExReleasePushLockEx((ULONG_PTR)p_TypeLock, 0);
v16 = (_ETHREAD *)KeGetCurrentThread();
v13 = v16->Tcb.SpecialApcDisable++ == -1;
if( v13 && ($F25F8C4BA33AF922A5F1AF68CD89DDDF *)v16->Tcb.ApcState.ApcListHead[0].Flink != &v16->Tcb.152 )
KiCheckForKernelApcDelivery();
if( p_Blink )
ExReleaseRundownProtection(p_Blink);
if( PostCallbackListHead->Flink == PostCallbackListHead )
{
ObfDereferenceObjectWithTag(PreOperationInfo->Object, 0x6243624Fui64);
KeLeaveCriticalRegion();
}
return 0;
}Referenced by:
ObpPreInterceptHandleCreate
ObpPreInterceptHandleDuplicate