KdpSendWaitContinue

NTSTATUS __fastcall KdpSendWaitContinue(
        UINT64 OutPacketType,
        _STRING *OutMessageHeader,
        _STRING *OutMessageData,
        _CONTEXT *ContextRecord){
  int v7; 
  _KD_CONTEXT *v8; 
  __int128 *v9; 
  _STRING *p_AdditionalData; 
  UINT8 v11; 
  int v12; 
  NTSTATUS result; 
  UINT64 Flags; 
  UINT64 *ActualSize; 
  _STRING AdditionalData; 
  int v17; 
  UINT64 Data; 
  UINT64 v19; 
  _QWORD v20[2]; 
  UINT64 Actual; 
  UINT64 v22; 
  __int128 v23; 
  _QWORD v24[2]; 
  _QWORD v25[2]; 
  _QWORD v26[2]; 
  _QWORD v27[2]; 
  _QWORD v28[2]; 
  _QWORD v29[2]; 
  _QWORD v30[2]; 
  _QWORD v31[2]; 
  _QWORD v32[2]; 
  _QWORD v33[2]; 
  _QWORD v34[2]; 
  _QWORD v35[2]; 
  _DBGKD_MANIPULATE_STATE64 m; 

  v20[0] = 3670016i64;
  *(_QWORD *)&AdditionalData.Length = 0x10000000i64;
  v17 = 0;
  *(&KiSwapEvent + 480) = 0;
  v20[1] = &m;
  AdditionalData.Buffer = (char *)&KdpMessageBuffer;
  memset(&m, 0, sizeof(m));
  KdSendPacket(7i64, OutMessageHeader, OutMessageData, &KdpContext);
  while( !(_BYTE)KdDebuggerNotPresent )
  {
    while( 1 )
    {
      if( (_DWORD)KeNumberProcessors_0 == 1 )
        KeQueryPerformanceCounter(0i64);
      v7 = KdReceivePacket(2i64, v20, &AdditionalData, &v17, &KdpContext);
      if( v7 == 2 )
        break;
      if( v7 != 1 )
      {
        switch( m.ApiNumber )
        {
          case 0x3130u:
            KdpReadVirtualMemory(&m, &AdditionalData);
            continue;
          case 0x3131u:
            LODWORD(Flags) = 5;
            v23 = 0i64;
            m.ReturnStatus = KdpCopyMemoryChunks(
                               m.u.ReadMemory.TargetBaseAddress,
                               AdditionalData.Buffer,
                               AdditionalData.Length,
                               0i64,
                               Flags,
                               &m.u.Continue2.AnyControlSet.Arm64ControlSet.CurrentSymbolStart);
            v9 = &v23;
            p_AdditionalData = 0i64;
            LOWORD(v23) = 56;
            *((_QWORD *)&v23 + 1) = &m;
            goto LABEL_45;
          case 0x3132u:
            v25[0] = 56i64;
            v25[1] = &m;
            KdpGetContext(&m, &AdditionalData, ContextRecord);
            if( !m.ReturnStatus )
              *(&KiSwapEvent + 480) = 1;
            v9 = (__int128 *)v25;
            goto LABEL_44;
          case 0x3133u:
            KdpSetContext(&m, &AdditionalData, ContextRecord);
            continue;
          case 0x3134u:
            v26[0] = 56i64;
            v26[1] = &m;
            m.u.ReadMemory.TransferCount = KdpAddBreakpoint((VOID *)m.u.ReadMemory.TargetBaseAddress, 0xCCui64, 1u, 0);
            v9 = (__int128 *)v26;
            m.ReturnStatus = m.u.ReadMemory.TransferCount == 0 ? 0xC0000001 : 0;
            p_AdditionalData = 0i64;
            goto LABEL_45;
          case 0x3135u:
            v27[0] = 56i64;
            v27[1] = &m;
            v11 = KdpDeleteBreakpoint(m.u.GetContext.Unused);
            v9 = (__int128 *)v27;
            m.ReturnStatus = v11 == 0 ? 0xC0000001 : 0;
            p_AdditionalData = 0i64;
            goto LABEL_45;
          case 0x3136u:
            return m.u.Continue.ContinueStatus >= 0;
          case 0x3137u:
            KdpReadControlSpace(&m, &AdditionalData);
            continue;
          case 0x3138u:
            KdpWriteControlSpace(&m, &AdditionalData);
            continue;
          case 0x3139u:
            m.u.ReadMemory.ActualBytesRead = 0;
            v28[0] = 56i64;
            v28[1] = &m;
            LODWORD(ActualSize) = m.u.ReadMemory.TransferCount;
            m.ReturnStatus = KdpSysReadIoSpace(
                               Isa,
                               0i64,
                               1ui64,
                               m.u.ReadMemory.TargetBaseAddress,
                               (char *)&m.u.SetSpecialCall + 12,
                               (UINT64)ActualSize,
                               &Actual);
            v9 = (__int128 *)v28;
            p_AdditionalData = 0i64;
            goto LABEL_45;
          case 0x313Au:
            v29[0] = 56i64;
            v29[1] = &m;
            LODWORD(ActualSize) = m.u.ReadMemory.TransferCount;
            m.ReturnStatus = KdpSysWriteIoSpace(
                               Isa,
                               0i64,
                               1ui64,
                               m.u.ReadMemory.TargetBaseAddress,
                               (char *)&m.u.SetSpecialCall + 12,
                               (UINT64)ActualSize,
                               (UINT64 *)((char *)&Actual + 4));
            v9 = (__int128 *)v29;
            p_AdditionalData = 0i64;
            goto LABEL_45;
          case 0x313Bu:
            KiResumeForReboot = 1;
            KdExitDebugger(0);
            ((void(__fastcall *)(_QWORD))off_140C008A8)(0i64);
            HalReturnToFirmware(HalRebootRoutine);
            return result;
          case 0x313Cu:
            if( m.u.Continue.ContinueStatus < 0 )
              return 0;
            KdpGetStateChange(&m, ContextRecord);
            return 1;
          case 0x313Du:
            KdpReadPhysicalMemory(&m, &AdditionalData, v8, &KdpContext);
            continue;
          case 0x313Eu:
            KdpWritePhysicalMemory(&m, &AdditionalData);
            continue;
          case 0x3140u:
          case 0x3141u:
          case 0x3142u:
          case 0x315Au:
            continue;
          case 0x3144u:
            v30[0] = 56i64;
            v30[1] = &m;
            LODWORD(ActualSize) = m.u.GetContext.Unused;
            m.u.ReadWriteIoExtended.DataValue = 0;
            m.ReturnStatus = KdpSysReadIoSpace(
                               (_INTERFACE_TYPE)m.u.Continue2.ControlSet.TraceFlag,
                               m.u.ReadMemory.TransferCount,
                               m.u.ReadMemory.ActualBytesRead,
                               m.u.Continue2.ControlSet.CurrentSymbolStart,
                               &m.u.SetContextEx + 2,
                               (UINT64)ActualSize,
                               &v22);
            v9 = (__int128 *)v30;
            p_AdditionalData = 0i64;
            goto LABEL_45;
          case 0x3145u:
            v31[0] = 56i64;
            v31[1] = &m;
            LODWORD(ActualSize) = m.u.GetContext.Unused;
            m.ReturnStatus = KdpSysWriteIoSpace(
                               (_INTERFACE_TYPE)m.u.Continue2.ControlSet.TraceFlag,
                               m.u.ReadMemory.TransferCount,
                               m.u.ReadMemory.ActualBytesRead,
                               m.u.Continue2.ControlSet.CurrentSymbolStart,
                               &m.u.SetContextEx + 2,
                               (UINT64)ActualSize,
                               (UINT64 *)((char *)&v22 + 4));
            v9 = (__int128 *)v31;
            p_AdditionalData = 0i64;
            goto LABEL_45;
          case 0x3146u:
            m.ReturnStatus = 0;
            m.ApiNumber = 12614;
            v34[0] = 56i64;
            v34[1] = &m;
            v9 = (__int128 *)v34;
            m.u = *(union {_DBGKD_READ_MEMORY64 ReadMemory;_DBGKD_WRITE_MEMORY64 WriteMemory;_DBGKD_GET_CONTEXT GetContext;_DBGKD_SET_CONTEXT SetContext;_DBGKD_WRITE_BREAKPOINT64 WriteBreakPoint;_DBGKD_RESTORE_BREAKPOINT RestoreBreakPoint;_DBGKD_CONTINUE Continue;_DBGKD_CONTINUE2 Continue2;_DBGKD_READ_WRITE_IO64 ReadWriteIo;_DBGKD_READ_WRITE_IO_EXTENDED64 ReadWriteIoExtended;_DBGKD_QUERY_SPECIAL_CALLS QuerySpecialCalls;_DBGKD_SET_SPECIAL_CALL64 SetSpecialCall;_DBGKD_SET_INTERNAL_BREAKPOINT64 SetInternalBreakpoint;_DBGKD_GET_INTERNAL_BREAKPOINT64 GetInternalBreakpoint;_DBGKD_GET_VERSION64 GetVersion64;_DBGKD_BREAKPOINTEX BreakPointEx;_DBGKD_READ_WRITE_MSR ReadWriteMsr;_DBGKD_SEARCH_MEMORY SearchMemory;_DBGKD_GET_SET_BUS_DATA GetSetBusData;_DBGKD_FILL_MEMORY FillMemory;_DBGKD_QUERY_MEMORY QueryMemory;_DBGKD_SWITCH_PARTITION SwitchPartition;_DBGKD_CONTEXT_EX GetContextEx;_DBGKD_CONTEXT_EX SetContextEx;_DBGKD_WRITE_CUSTOM_BREAKPOINT WriteCustomBreakPoint;} *)KdVersionBlock;
            p_AdditionalData = 0i64;
            goto LABEL_45;
          case 0x3147u:
            if( !KdpWriteBreakPointEx(&m, &AdditionalData) )
              continue;
            return 0;
          case 0x3148u:
            KdpRestoreBreakPointEx(&m, &AdditionalData);
            continue;
          case 0x3149u:
            KdExitDebugger(0);
            KeBugCheckEx(0xE2u, 0i64, 0i64, 0i64, 0i64);
            return result;
          case 0x3150u:
            return KeSwitchFrozenProcessor(m.Processor);
          case 0x3151u:
            m.ReturnStatus = -1073741823;
            v9 = (__int128 *)v35;
            v35[0] = 56i64;
            p_AdditionalData = 0i64;
            v35[1] = &m;
            goto LABEL_45;
          case 0x3152u:
            Data = 0i64;
            v32[0] = 56i64;
            v32[1] = &m;
            KdpSysReadMsr(m.u.GetContext.Unused, &Data);
            m.ReturnStatus = v12;
            v9 = (__int128 *)v32;
            p_AdditionalData = 0i64;
            *(_QWORD *)(&m.u.SetContext + 1) = Data;
            goto LABEL_45;
          case 0x3153u:
            v33[0] = 56i64;
            v33[1] = &m;
            v19 = *(_QWORD *)(&m.u.SetContext + 1);
            m.ReturnStatus = KdpSysWriteMsr(m.u.GetContext.Unused, &v19);
            v9 = (__int128 *)v33;
            p_AdditionalData = 0i64;
            goto LABEL_45;
          case 0x3156u:
            KdpSearchMemory(&m, &AdditionalData, (_CONTEXT *)v8);
            continue;
          case 0x3157u:
            KdpGetBusData(&m, &AdditionalData);
            continue;
          case 0x3158u:
            KdpSetBusData(&m, &AdditionalData);
            continue;
          case 0x3159u:
            v24[0] = 56i64;
            v24[1] = &m;
            if( KdpSearchInProgress )
              KdpSearchPhysicalPageRange(4ui64);
            m.ReturnStatus = 0;
            v9 = (__int128 *)v24;
            p_AdditionalData = 0i64;
            goto LABEL_45;
          case 0x315Bu:
            KdpFillMemory(&m, &AdditionalData);
            continue;
          case 0x315Cu:
            KdpQueryMemory(&m);
            continue;
          case 0x315Fu:
            KdpGetContextEx(&m, &AdditionalData, ContextRecord);
            continue;
          case 0x3160u:
            KdpSetContextEx(&m, &AdditionalData, ContextRecord);
            continue;
          case 0x3161u:
            KdpWriteCustomBreakpoint(&m, (_STRING *)0x140000000i64, (_CONTEXT *)v8);
            continue;
          case 0x3162u:
            KdpReadPhysicalMemoryLong(&m, &AdditionalData);
            continue;
          default:
            AdditionalData.Length = 0;
            v9 = (__int128 *)v20;
            m.ReturnStatus = -1073741823;
LABEL_44:
            p_AdditionalData = &AdditionalData;
LABEL_45:
            KdSendPacket(2i64, v9, p_AdditionalData, &KdpContext);
            continue;
        }
      }
    }
    KdSendPacket(7i64, OutMessageHeader, OutMessageData, &KdpContext);
  }
  return 1;
}

Referenced by:

KdpReportCommandStringStateChange
KdpReportExceptionStateChange
KdpReportLoadSymbolsStateChange