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.