CmSetCallbackObjectContext

NTSTATUS __stdcall CmSetCallbackObjectContext(PVOID Object, LARGE_INTEGER *Cookie, PVOID NewContext, PVOID *OldContext){
  char v4; 
  NTSTATUS v9; 
  _ETHREAD *CurrentThread; 
  _ETHREAD *v11; 
  _QWORD *v12; 
  _QWORD *v13; 
  LARGE_INTEGER v14; 
  _ETHREAD *v15; 
  LARGE_INTEGER *PoolWithTag; 
  LONGLONG *v17; 
  LONGLONG v18; 
  LARGE_INTEGER *v19; 
  LARGE_INTEGER **v20; 
  LONGLONG v21; 
  LONGLONG v22; 
  LONGLONG QuadPart; 
  void *v25; 

  v4 = 0;
  v9 = -1073741275;
  if( !Object || *(_DWORD *)Object != 1803104306 )
    return -1073741585;
  if( OldContext )
    *OldContext = 0i64;
  CurrentThread = (_ETHREAD *)KeGetCurrentThread();
  --CurrentThread->Tcb.KernelApcDisable;
  ExAcquirePushLockSharedEx((_EX_PUSH_LOCK *)&CmpDummyThreadEvent + 251, 0i64);
  v11 = (_ETHREAD *)KeGetCurrentThread();
  --v11->Tcb.KernelApcDisable;
  ExAcquirePushLockSharedEx((_EX_PUSH_LOCK *)&CmpDummyThreadEvent + 254, 0i64);
  v12 = (char *)Object + 72;
  while( 1 )
  {
    v13 = (_QWORD *)*v12;
    if( (_QWORD *)*v12 != v12 )
    {
      QuadPart = Cookie->QuadPart;
      while( v13[4] != QuadPart )
      {
        if( v13[4] >= QuadPart )
        {
          v13 = (_QWORD *)*v13;
          if( v13 != v12 )
            continue;
        }
        goto LABEL_7;
      }
      v25 = (void *)_InterlockedExchange64(v13 + 7, (__int64)NewContext);
      if( OldContext )
        *OldContext = v25;
      v9 = 0;
    }
LABEL_7:
    if( v9 >= 0 )
      break;
    if( v4 )
    {
      v14 = (LARGE_INTEGER)*(&CmpDummyThreadEvent + 252);
      if( (_UNKNOWN *)*(&CmpDummyThreadEvent + 252) == (_UNKNOWN *)((char *)&CmpDummyThreadEvent + 2016) )
      {
LABEL_28:
        v14.QuadPart = 0i64;
      }
      else
      {
        while( Cookie->QuadPart != *(_QWORD *)(v14.QuadPart + 24) )
        {
          v14 = *(LARGE_INTEGER *)v14.QuadPart;
          if( (_UNKNOWN *)v14.QuadPart == (_UNKNOWN *)((char *)&CmpDummyThreadEvent + 2016) )
            goto LABEL_28;
        }
      }
      if( v14.QuadPart )
      {
        v9 = 0;
        PoolWithTag = (LARGE_INTEGER *)ExAllocatePoolWithTag(1ui64, 0x40ui64, 1667452227i64);
        v17 = (LONGLONG *)PoolWithTag;
        if( PoolWithTag )
        {
          PoolWithTag[5] = v14;
          v18 = v14.QuadPart + 64;
          PoolWithTag[4] = *Cookie;
          v19 = PoolWithTag + 2;
          v17[7] = (LONGLONG)NewContext;
          v17[6] = (LONGLONG)Object;
          v20 = *(LARGE_INTEGER ***)(v18 + 8);
          if( *v20 != (LARGE_INTEGER *)v18
            || (v19->QuadPart = v18,
                v17[3] = (LONGLONG)v20,
                *v20 = v19,
                *(_QWORD *)(v18 + 8) = v19,
                v21 = v13[1],
                v22 = *(_QWORD *)v21,
                *(_QWORD *)(*(_QWORD *)v21 + 8i64) != v21) )
          {
            __fastfail(3u);
          }
          *v17 = v22;
          v17[1] = v21;
          *(_QWORD *)(v22 + 8) = v17;
          *(_QWORD *)v21 = v17;
        }
        else
        {
          v9 = -1073741670;
        }
      }
      else
      {
        v9 = -1073741584;
      }
      break;
    }
    ExReleasePushLockEx((ULONG_PTR)&CmpDummyThreadEvent + 2032, 0);
    KeLeaveCriticalRegionThread(KeGetCurrentThread());
    v15 = (_ETHREAD *)KeGetCurrentThread();
    v4 = 1;
    --v15->Tcb.KernelApcDisable;
    ExAcquirePushLockExclusiveEx((_EX_PUSH_LOCK *)&CmpDummyThreadEvent + 254, 0i64);
  }
  ExReleasePushLockEx((ULONG_PTR)&CmpDummyThreadEvent + 2032, 0);
  KeLeaveCriticalRegionThread(KeGetCurrentThread());
  ExReleasePushLockEx((ULONG_PTR)&CmpDummyThreadEvent + 2008, 0);
  KeLeaveCriticalRegionThread(KeGetCurrentThread());
  return v9;
}

Referenced by:

VrpHandleIoctlInitializeJobForVreg
VrpPostOpenOrCreate
VrpPreLoadKey