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