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