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