NtWaitForKeyedEvent

NTSTATUS __stdcall NtWaitForKeyedEvent(PVOID KeyedEventHandle, PVOID KeyValue, UINT8 Alertable, LARGE_INTEGER *Timeout){
  char v5; 
  NTSTATUS result; 
  _ETHREAD *CurrentThread; 
  KPROCESSOR_MODE v8; 
  char *v9; 
  char *v10; 
  _QWORD **v11; 
  _BYTE *v12; 
  _BYTE *v13; 
  _QWORD *v14; 
  _QWORD *v15; 
  __int64 v16; 
  _QWORD *v17; 
  _QWORD *v18; 
  _BYTE *v19; 
  _BYTE *v20; 
  _QWORD *v21; 
  __int64 v22; 
  _QWORD *v23; 
  _QWORD *v24; 
  _QWORD *v25; 
  KPROCESSOR_MODE WaitMode; 
  NTSTATUS v27; 
  LONGLONG QuadPart; 
  PVOID Object; 
  __int64 v30; 
  PADAPTER_OBJECT DmaAdapter; 
  __int64 v32; 
  LARGE_INTEGER *Timeouta; 
  Timeouta = Timeout;
  v27 = 0;
  QuadPart = 0i64;
  v30 = 0i64;
  v5 = 1;
  if( ((unsigned __int8)KeyValue & 1) != 0 )
    return -1073741585;
  CurrentThread = (_ETHREAD *)KeGetCurrentThread();
  v8 = *((_BYTE *)CurrentThread + 562);
  WaitMode = v8;
  if( Timeout )
  {
    if( v8 && ((unsigned __int64)&Timeout[1] > 0x7FFFFFFF0000i64 || &Timeout[1] < Timeout) )
      MEMORY[0x7FFFFFFF0000] = 0;
    QuadPart = Timeout->QuadPart;
    Timeouta = (LARGE_INTEGER *)&QuadPart;
  }
  if( KeyedEventHandle )
  {
    Object = 0i64;
    result = ObReferenceObjectByHandle(KeyedEventHandle, 1u, ExpKeyedEventObjectType, v8, &Object, 0i64);
    v27 = result;
    v9 = (char *)Object;
    DmaAdapter = (PADAPTER_OBJECT)Object;
    if( result < 0 )
      return result;
  }
  else
  {
    v9 = (char *)ExpCritSecOutOfMemoryEvent;
    DmaAdapter = (PADAPTER_OBJECT)ExpCritSecOutOfMemoryEvent;
  }
  *((_DWORD *)CurrentThread + 325) |= 0x20u;
  v32 = *((_QWORD *)CurrentThread + 23);
  v10 = &v9[24 * (((unsigned __int64)KeyValue >> 5) & 0x3F)];
  v11 = (_QWORD **)(v10 + 8);
  --*((_WORD *)CurrentThread + 242);
  LODWORD(v12) = KeAbPreAcquire(v10, 0i64, 0i64);
  v13 = v12;
  if( _interlockedbittestandset64((volatile signed __int32 *)v10, 0i64) )
    ExfAcquirePushLockExclusiveEx((UINT64 *)v10, v12, v10);
  if( v13 )
    v13[26] |= 1u;
  v14 = *v11;
  if( *v11 == v11 )
  {
LABEL_22:
    v30 = *((_QWORD *)CurrentThread + 139);
    *((_QWORD *)CurrentThread + 139) = KeyValue;
    v17 = (_QWORD *)((char *)CurrentThread + 1080);
    v18 = (_QWORD *)*((_QWORD *)v10 + 2);
    if( (_QWORD **)*v18 != v11 )
      goto LABEL_48;
    *v17 = v11;
    *((_QWORD *)CurrentThread + 136) = v18;
    *v18 = v17;
    *((_QWORD *)v10 + 2) = v17;
    v15 = 0i64;
  }
  else
  {
    while( 1 )
    {
      v15 = v14 - 135;
      v16 = v14[4];
      if( (v16 & 1) == 0 )
        goto LABEL_22;
      if( v16 == ((unsigned __int64)KeyValue | 1) && v15[68] == v32 )
        break;
      v14 = (_QWORD *)*v14;
      if( v14 == v11 )
        goto LABEL_22;
    }
    v24 = (_QWORD *)*v14;
    v25 = (_QWORD *)v14[1];
    if( *(_QWORD **)(*v14 + 8i64) != v14 || (_QWORD *)*v25 != v14 )
      goto LABEL_48;
    *v25 = v24;
    v24[1] = v25;
    v14[1] = v14;
    *v14 = v14;
  }
  if( (_InterlockedExchangeAdd64((volatile signed __int64 *)v10, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
    ExfTryToWakePushLock((volatile INT64 *)v10);
  KeAbPostRelease(v10);
  if( v15 )
  {
    KeReleaseSemaphore((_KSEMAPHORE *)(v15 + 145), 1i64, 1i64, 0);
    KeLeaveCriticalRegionThread((__int64)CurrentThread);
    goto LABEL_45;
  }
  KeLeaveCriticalRegionThread((__int64)CurrentThread);
  v27 = KeWaitForSingleObject((char *)CurrentThread + 1160, WrKeyedEvent, WaitMode, Alertable, Timeouta);
  if( v27 )
  {
    --*((_WORD *)CurrentThread + 242);
    LODWORD(v19) = KeAbPreAcquire(v10, 0i64, 0i64);
    v20 = v19;
    if( _interlockedbittestandset64((volatile signed __int32 *)v10, 0i64) )
      ExfAcquirePushLockExclusiveEx((UINT64 *)v10, v19, v10);
    if( v20 )
      v20[26] |= 1u;
    v21 = (_QWORD *)((char *)CurrentThread + 1080);
    v22 = *((_QWORD *)CurrentThread + 135);
    if( (_ETHREAD *)v22 == (_ETHREAD *)((char *)CurrentThread + 1080) )
      goto LABEL_36;
    v23 = (_QWORD *)*((_QWORD *)CurrentThread + 136);
    if( *(_QWORD **)(v22 + 8) == v21 && (_QWORD *)*v23 == v21 )
    {
      *v23 = v22;
      *(_QWORD *)(v22 + 8) = v23;
      *((_QWORD *)CurrentThread + 136) = (char *)CurrentThread + 1080;
      *v21 = v21;
      v5 = 0;
LABEL_36:
      if( (_InterlockedExchangeAdd64((volatile signed __int64 *)v10, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
        ExfTryToWakePushLock((volatile INT64 *)v10);
      KeAbPostRelease(v10);
      KeLeaveCriticalRegionThread((__int64)CurrentThread);
      if( v5 )
        v27 = KeWaitForSingleObject((char *)CurrentThread + 1160, WrKeyedEvent, 0, 0, 0i64);
      goto LABEL_40;
    }
LABEL_48:
    __fastfail(3u);
  }
LABEL_40:
  *((_QWORD *)CurrentThread + 139) = v30;
LABEL_45:
  *((_DWORD *)CurrentThread + 325) &= ~0x20u;
  if( KeyedEventHandle )
    HalPutDmaAdapter(DmaAdapter);
  return v27;
}

Referenced by:

No references.