NtSignalAndWaitForSingleObject
NTSTATUS __stdcall NtSignalAndWaitForSingleObject(
VOID *SignalHandle,
VOID *WaitHandle,
UINT8 Alertable,
_LARGE_INTEGER *Timeout){
char PreviousMode;
_LARGE_INTEGER *v7;
__int64 v8;
int v9;
__int64 v10;
VOID *WaitObject;
POBJECT_TYPE *v12;
UINT64 Tag;
UINT64 Taga;
PVOID Object;
_OBJECT_HANDLE_INFORMATION HandleInformation;
PVOID v18;
LONGLONG v19;
HandleInformation = 0i64;
Object = 0i64;
v19 = 0i64;
v18 = 0i64;
PreviousMode = KeGetCurrentThread()->PreviousMode;
v7 = Timeout;
if( Timeout && PreviousMode )
{
v8 = 0x7FFFFFFF0000i64;
if( (unsigned __int64)Timeout < 0x7FFFFFFF0000i64 )
v8 = (__int64)Timeout;
v19 = *(_QWORD *)v8;
v7 = (_LARGE_INTEGER *)&v19;
}
LODWORD(Tag) = 1951883855;
v9 = ObReferenceObjectByHandleWithTag(SignalHandle, 0i64, 0i64, PreviousMode, Tag, &Object, &HandleInformation);
if( v9 >= 0 )
{
LODWORD(Taga) = 1951883855;
v9 = ObReferenceObjectByHandleWithTag(WaitHandle, 0x100000ui64, 0i64, PreviousMode, Taga, &v18, 0i64);
if( v9 < 0 )
{
LABEL_23:
ObfDereferenceObjectWithTag(Object, 0x7457624Fui64);
return v9;
}
WaitObject = ObpGetWaitObject((_OBJECT_HEADER *)((char *)v18 - 48));
if( !*(&WheapDeferredInternalLogsEventLock + 56)
|| ObTypeIndexTable[(unsigned __int8)ObHeaderCookie ^ *(unsigned __int8 *)(v10 - 24) ^ (unsigned __int64)(unsigned __int8)((unsigned __int16)(v10 - 48) >> 8)] != *(&WheapDeferredInternalLogsEventLock + 56) )
{
v12 = (POBJECT_TYPE *)ObTypeIndexTable[(unsigned __int8)ObHeaderCookie ^ (unsigned __int8)*((char *)Object - 24) ^ (unsigned __int64)(unsigned __int8)((unsigned __int16)((_WORD)Object - 48) >> 8)];
v9 = -1073741790;
if( v12 == ExEventObjectType )
{
if( PreviousMode && (~LOBYTE(HandleInformation.GrantedAccess) & 2) != 0 )
goto LABEL_22;
KeSetEvent((PRKEVENT)Object, 1, 1u);
goto LABEL_20;
}
if( v12 == (POBJECT_TYPE *)ExMutantObjectType )
{
KeReleaseMutant((_KMUTANT *)Object, 1i64, 0, 1u);
LABEL_20:
v9 = KeWaitForSingleObject((UINT64)WaitObject, 6, PreviousMode, Alertable, (INT64)v7);
LABEL_22:
ObfDereferenceObjectWithTag(v18, 0x7457624Fui64);
goto LABEL_23;
}
if( v12 == ExSemaphoreObjectType )
{
if( PreviousMode && (~LOBYTE(HandleInformation.GrantedAccess) & 2) != 0 )
goto LABEL_22;
KeReleaseSemaphore((_KSEMAPHORE *)Object, 1i64, 1i64, 1u);
goto LABEL_20;
}
}
v9 = -1073741788;
goto LABEL_22;
}
return v9;
}Referenced by:
No references.