CmpGetCallbackObjectContext

VOID *__stdcall CmpGetCallbackObjectContext(VOID *Object, LARGE_INTEGER *Cookie){
  VOID *v2; 
  _QWORD *v4; 
  _ETHREAD *CurrentThread; 
  _QWORD *v7; 
  LONGLONG QuadPart; 

  v2 = 0i64;
  if( !Object )
    return 0i64;
  if( *(_DWORD *)Object != 1803104306 )
    return 0i64;
  v4 = (char *)Object + 72;
  if( (_QWORD *)*v4 == v4 )
    return 0i64;
  CurrentThread = (_ETHREAD *)KeGetCurrentThread();
  --CurrentThread->Tcb.KernelApcDisable;
  ExAcquirePushLockSharedEx((_EX_PUSH_LOCK *)&CmpDummyThreadEvent + 254, 0i64);
  v7 = (_QWORD *)*v4;
  if( (_QWORD *)*v4 != v4 )
  {
    QuadPart = Cookie->QuadPart;
    while( v7[4] != QuadPart )
    {
      if( v7[4] >= QuadPart )
      {
        v7 = (_QWORD *)*v7;
        if( v7 != v4 )
          continue;
      }
      goto LABEL_9;
    }
    v2 = (VOID *)v7[7];
  }
LABEL_9:
  ExReleasePushLockEx((ULONG_PTR)&CmpDummyThreadEvent + 2032, 0);
  KeLeaveCriticalRegionThread(KeGetCurrentThread());
  return v2;
}

Referenced by:

CmpCallbackFillObjectContext