NtReleaseKeyedEvent
NTSTATUS __stdcall NtReleaseKeyedEvent(
VOID *KeyedEventHandle,
VOID *KeyValue,
UINT8 Alertable,
_LARGE_INTEGER *Timeout){
NTSTATUS v5;
char v6;
NTSTATUS result;
_ETHREAD *CurrentThread;
INT8 PreviousMode;
char *v10;
_EX_PUSH_LOCK *v11;
_EX_PUSH_LOCK *v12;
_BYTE *v13;
_BYTE *v14;
_EX_PUSH_LOCK *bf_0;
_EX_PUSH_LOCK *v16;
_QWORD *v17;
_QWORD *v18;
_EX_PUSH_LOCK *v19;
_EX_PUSH_LOCK **v20;
_BYTE *v21;
_BYTE *v22;
_QWORD *v23;
__int64 v24;
_QWORD *v25;
INT8 WaitMode;
LONGLONG QuadPart;
PVOID Object;
_TERMINATION_PORT *TerminationPort;
PADAPTER_OBJECT DmaAdapter;
_EPROCESS *Process;
_LARGE_INTEGER *Timeouta;
Timeouta = Timeout;
v5 = 0;
QuadPart = 0i64;
TerminationPort = 0i64;
v6 = 1;
if( ((unsigned __int8)KeyValue & 1) != 0 )
return -1073741585;
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
PreviousMode = CurrentThread->Tcb.PreviousMode;
WaitMode = PreviousMode;
if( Timeout )
{
if( PreviousMode && ((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, 2ui64, ExpKeyedEventObjectType, PreviousMode, &Object, 0i64);
v5 = result;
v10 = (char *)Object;
DmaAdapter = (PADAPTER_OBJECT)Object;
if( result < 0 )
return result;
}
else
{
v10 = (char *)*(&WheapDeferredInternalLogsEventLock + 72);
DmaAdapter = (PADAPTER_OBJECT)*(&WheapDeferredInternalLogsEventLock + 72);
}
CurrentThread->SameThreadPassiveFlags |= 0x20u;
Process = CurrentThread->Tcb.ApcState.Process;
v11 = (_EX_PUSH_LOCK *)&v10[24 * (((unsigned __int64)KeyValue >> 5) & 0x3F)];
v12 = v11 + 1;
--CurrentThread->Tcb.KernelApcDisable;
v13 = KeAbPreAcquire(v11, 0i64, 0i64);
v14 = v13;
if( _interlockedbittestandset64((volatile signed __int32 *)v11, 0i64) )
ExfAcquirePushLockExclusiveEx(v11, v13, v11);
if( v14 )
v14[26] |= 1u;
bf_0 = (_EX_PUSH_LOCK *)v12->_bf_0;
if( (_EX_PUSH_LOCK *)v12->_bf_0 == v12 )
{
LABEL_21:
TerminationPort = CurrentThread->TerminationPort;
CurrentThread->TerminationPort = (_TERMINATION_PORT *)((unsigned __int64)KeyValue | 1);
v17 = CurrentThread->gap438;
v18 = (_QWORD *)v12->_bf_0;
if( *(_EX_PUSH_LOCK **)(v12->_bf_0 + 8) != v12 )
goto LABEL_47;
*v17 = v18;
*(_QWORD *)&CurrentThread->gap438[8] = v12;
v18[1] = v17;
v12->_bf_0 = (__int64)v17;
v16 = 0i64;
}
else
{
while( 1 )
{
v16 = bf_0 - 135;
if( bf_0[4].Ptr == KeyValue && (_EPROCESS *)v16[68]._bf_0 == Process )
break;
bf_0 = (_EX_PUSH_LOCK *)bf_0->_bf_0;
if( bf_0 == v12 )
goto LABEL_21;
}
v19 = (_EX_PUSH_LOCK *)bf_0->_bf_0;
v20 = (_EX_PUSH_LOCK **)bf_0[1]._bf_0;
if( *(_EX_PUSH_LOCK **)(bf_0->_bf_0 + 8) != bf_0 || *v20 != bf_0 )
goto LABEL_47;
*v20 = v19;
v19[1]._bf_0 = (__int64)v20;
bf_0[1]._bf_0 = (__int64)bf_0;
bf_0->_bf_0 = (__int64)bf_0;
}
if( (_InterlockedExchangeAdd64(&v11->_bf_0, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
ExfTryToWakePushLock(v11);
KeAbPostRelease(v11);
if( !v16 )
{
KeLeaveCriticalRegionThread(&CurrentThread->Tcb);
v5 = KeWaitForSingleObject((UINT64)&CurrentThread->1160, 21, WaitMode, Alertable, (INT64)Timeouta);
if( !v5 )
{
LABEL_43:
CurrentThread->TerminationPort = TerminationPort;
goto LABEL_44;
}
--CurrentThread->Tcb.KernelApcDisable;
v21 = KeAbPreAcquire(v11, 0i64, 0i64);
v22 = v21;
if( _interlockedbittestandset64((volatile signed __int32 *)v11, 0i64) )
ExfAcquirePushLockExclusiveEx(v11, v21, v11);
if( v22 )
v22[26] |= 1u;
v23 = CurrentThread->gap438;
v24 = *(_QWORD *)CurrentThread->gap438;
if( (_BYTE *)v24 == CurrentThread->gap438 )
{
LABEL_39:
if( (_InterlockedExchangeAdd64(&v11->_bf_0, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
ExfTryToWakePushLock(v11);
KeAbPostRelease(v11);
KeLeaveCriticalRegionThread(&CurrentThread->Tcb);
if( v6 )
v5 = KeWaitForSingleObject((UINT64)&CurrentThread->1160, 21, 0, 0, 0i64);
goto LABEL_43;
}
v25 = *(_QWORD **)&CurrentThread->gap438[8];
if( *(_QWORD **)(v24 + 8) == v23 && (_QWORD *)*v25 == v23 )
{
*v25 = v24;
*(_QWORD *)(v24 + 8) = v25;
*(_QWORD *)&CurrentThread->gap438[8] = CurrentThread->gap438;
*v23 = v23;
v6 = 0;
goto LABEL_39;
}
LABEL_47:
__fastfail(3u);
}
KeReleaseSemaphore((_KSEMAPHORE *)&v16[145], 1i64, 1i64, 0);
KeLeaveCriticalRegionThread(&CurrentThread->Tcb);
LABEL_44:
CurrentThread->SameThreadPassiveFlags &= ~0x20u;
if( KeyedEventHandle )
HalPutDmaAdapter(DmaAdapter);
return v5;
}Referenced by:
No references.