CmpGetCallbackObjectContext

NTSTATUS __stdcall CmpGetCallbackObjectContext(PVOID Object, LARGE_INTEGER *Cookie){
  __int64 v2; 
  _QWORD *v4; 
  _ETHREAD *CurrentThread; 
  _QWORD *v7; 
  LONGLONG QuadPart; 
  LODWORD(v2) = 0;
  if( !Object )
    return 0;
  if( *(_DWORD *)Object != 1803104306 )
    return 0;
  v4 = (char *)Object + 72;
  if( (_QWORD *)*v4 == v4 )
    return 0;
  CurrentThread = (_ETHREAD *)KeGetCurrentThread();
  --*((_WORD *)CurrentThread + 242);
  ExAcquirePushLockSharedEx((UINT64)&CmpContextListLock, 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 = v7[7];
  }
LABEL_9:
  ExReleasePushLockEx((UINT64)&CmpContextListLock, 0i64);
  KeLeaveCriticalRegionThread((__int64)KeGetCurrentThread());
  return v2;
}

Referenced by:

CmpCallbackFillObjectContext