NtWaitForDebugEvent
NTSTATUS __fastcall NtWaitForDebugEvent(VOID *Handle, BOOL a2, LARGE_INTEGER *a3, _OWORD *a4){
bool v5;
char v7;
KPROCESSOR_MODE v8;
__int64 v9;
NTSTATUS v10;
BOOLEAN v11;
char *v12;
int v13;
__int64 v14;
_QWORD *v15;
INT64 i;
INT64 v17;
_QWORD *v18;
int v19;
bool v20;
_OWORD *v21;
IRP *Object;
bool Alertable;
LONGLONG QuadPart;
PLARGE_INTEGER Timeout;
PVOID VirtualAddress;
__int64 v27;
PVOID v28;
PVOID v29;
__int128 result[11];
__int64 v31;
v5 = a2;
Alertable = a2;
Timeout = a3;
v7 = 0;
QuadPart = 0i64;
v27 = 0i64;
v8 = *((_BYTE *)KeGetCurrentThread() + 562);
memset((INT64)result, 0i64);
if( Timeout )
{
QuadPart = Timeout->QuadPart;
Timeout = (PLARGE_INTEGER)&QuadPart;
v27 = *(_QWORD *)&KUSER_SHARED_DATA.SystemTime.LowPart;
}
if( v8 )
{
v9 = (__int64)a4;
if( (unsigned __int64)a4 >= 0x7FFFFFFF0000i64 )
v9 = 0x7FFFFFFF0000i64;
*(_BYTE *)v9 = *(_BYTE *)v9;
*(_BYTE *)(v9 + 183) = *(_BYTE *)(v9 + 183);
}
VirtualAddress = 0i64;
v10 = ObReferenceObjectByHandle(Handle, 1u, DbgkDebugObjectType, v8, &VirtualAddress, 0i64);
if( v10 >= 0 )
{
v28 = 0i64;
v29 = 0i64;
v11 = v5;
v12 = (char *)VirtualAddress;
while( 1 )
{
v19 = KeWaitForSingleObject(v12, Executive, v8, v11, Timeout);
if( v19 < 0 || v19 == 192 || (unsigned int)(v19 - 257) <= 1 )
break;
ExAcquireFastMutex((FAST_MUTEX *)(v12 + 24));
if( (*((_DWORD *)v12 + 24) & 1) != 0 )
{
v19 = -1073740972;
}
else
{
v15 = v12 + 80;
for( i = *((_QWORD *)v12 + 10); ; i = *(_QWORD *)i )
{
if( (_QWORD *)i == v15 )
{
KeResetEvent(v12, (UINT64)v15, v13, v14, Object);
goto LABEL_25;
}
v17 = i;
v13 = *(_DWORD *)(i + 76);
if( (v13 & 5) == 0 )
{
v7 = 1;
v18 = (_QWORD *)*v15;
if( *v15 != i )
{
v14 = *(_QWORD *)(i + 40);
while( v14 != v18[5] )
{
v18 = (_QWORD *)*v18;
if( v18 == (_QWORD *)i )
goto LABEL_20;
}
v13 |= 4u;
*(_DWORD *)(i + 76) = v13;
*(_QWORD *)(i + 80) = 0i64;
v7 = 0;
}
LABEL_20:
if( v7 )
break;
}
}
v28 = *(PVOID *)(i + 56);
v29 = *(PVOID *)(i + 64);
ObfReferenceObjectWithTag(v29, 0x4F676244u);
ObfReferenceObjectWithTag(v28, 0x4F676244u);
DbgkpConvertKernelToUserStateChange((INT64)result, v17);
*(_DWORD *)(v17 + 76) |= 1u;
LABEL_25:
v19 = 0;
}
KeReleaseGuardedMutex((_FAST_MUTEX *)(v12 + 24));
if( v19 < 0 )
break;
if( v7 )
{
DbgkpOpenHandles((INT64)result, v28, v29);
ObfDereferenceObjectWithTag(v29, 0x4F676244ui64);
ObfDereferenceObjectWithTag(v28, 0x4F676244ui64);
break;
}
v7 = 0;
if( QuadPart < 0 )
{
v20 = *(_QWORD *)&KUSER_SHARED_DATA.SystemTime.LowPart - v27 + QuadPart < 0;
QuadPart += *(_QWORD *)&KUSER_SHARED_DATA.SystemTime.LowPart - v27;
v27 = *(_QWORD *)&KUSER_SHARED_DATA.SystemTime.LowPart;
v12 = (char *)VirtualAddress;
if( !v20 )
{
v19 = 258;
break;
}
}
v11 = Alertable;
}
HalPutDmaAdapter((PADAPTER_OBJECT)v12);
*a4 = result[0];
a4[1] = result[1];
a4[2] = result[2];
a4[3] = result[3];
a4[4] = result[4];
a4[5] = result[5];
a4[6] = result[6];
v21 = a4 + 8;
*(v21 - 1) = result[7];
*v21 = result[8];
v21[1] = result[9];
v21[2] = result[10];
*((_QWORD *)v21 + 6) = v31;
return v19;
}
return v10;
}Referenced by:
No references.