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.