NtDebugContinue
NTSTATUS __fastcall NtDebugContinue(VOID *a1, __int128 *a2, int a3){
char PreviousMode;
NTSTATUS result;
NTSTATUS v6;
char v7;
_DEBUG_EVENT *v8;
char *v9;
__int64 *v10;
__int64 *v11;
__int64 **v12;
__int128 v13;
PVOID Object;
PreviousMode = KeGetCurrentThread()->PreviousMode;
v13 = *a2;
if( a3 != -2147418111 && (a3 <= 0x10000 || a3 > 65538 && a3 != 1073807361 && (a3 <= 1073807362 || a3 > 1073807364)) )
return -1073741811;
Object = 0i64;
result = ObReferenceObjectByHandle(a1, 1ui64, DbgkDebugObjectType, PreviousMode, &Object, 0i64);
v6 = result;
if( result >= 0 )
{
v7 = 0;
v8 = 0i64;
v9 = (char *)Object;
ExAcquireFastMutex((PFAST_MUTEX)((char *)Object + 24));
v10 = (__int64 *)*((_QWORD *)v9 + 10);
if( v10 == (__int64 *)(v9 + 80) )
goto LABEL_21;
while( 1 )
{
if( v10[5] == (_QWORD)v13 )
{
if( v7 )
{
*((_DWORD *)v10 + 19) &= ~4u;
KeSetEvent((PRKEVENT)v9, 0, 0);
LABEL_21:
KeReleaseGuardedMutex((PKGUARDED_MUTEX)(v9 + 24));
HalPutDmaAdapter((PADAPTER_OBJECT)v9);
if( !v7 )
return -1073741811;
v8[33] = a3;
v8[18] = 0;
DbgkpWakeTarget(v8);
return v6;
}
if( v10[6] == *((_QWORD *)&v13 + 1) && (*((_DWORD *)v10 + 19) & 1) != 0 )
{
v11 = (__int64 *)*v10;
v12 = (__int64 **)v10[1];
if( *(__int64 **)(*v10 + 8) != v10 || *v12 != v10 )
__fastfail(3u);
*v12 = v11;
v11[1] = (__int64)v12;
v8 = (_DEBUG_EVENT *)v10;
v7 = 1;
}
}
v10 = (__int64 *)*v10;
if( v10 == (__int64 *)(v9 + 80) )
goto LABEL_21;
}
}
return result;
}Referenced by:
No references.