HyperDbg Debugger
Loading...
Searching...
No Matches
ExtensionCommands.c File Reference

Implementation of Debugger Commands (Extensions). More...

#include "pch.h"

Functions

UINT32 ExtensionCommandPerformActionsForApicRequests (PDEBUGGER_APIC_REQUEST ApicRequest)
 Perform actions regarding APIC.
VOID ExtensionCommandPerformQueryIdtEntriesRequest (PINTERRUPT_DESCRIPTOR_TABLE_ENTRIES_PACKETS IdtQueryRequest, BOOLEAN ReadFromVmxRoot)
 Perform query for IDT entries.
VOID ExtensionCommandVa2paAndPa2va (PDEBUGGER_VA2PA_AND_PA2VA_COMMANDS AddressDetails, BOOLEAN OperateOnVmxRoot)
 routines for !va2pa and !pa2va commands
BOOLEAN ExtensionCommandPte (PDEBUGGER_READ_PAGE_TABLE_ENTRIES_DETAILS PteDetails, BOOLEAN IsOperatingInVmxRoot)
 routines for !pte command
VOID ExtensionCommandChangeAllMsrBitmapReadAllCores (UINT64 BitmapMask)
 routines for !msrread command which
VOID ExtensionCommandResetChangeAllMsrBitmapReadAllCores ()
 routines for disable (reset) !msrread command
VOID ExtensionCommandChangeAllMsrBitmapWriteAllCores (UINT64 BitmapMask)
 routines for !msrwrite command which
VOID ExtensionCommandResetAllMsrBitmapWriteAllCores ()
 routines for reset !msrwrite command which
VOID ExtensionCommandEnableRdtscExitingAllCores ()
 routines for !tsc command
VOID ExtensionCommandDisableRdtscExitingAllCores ()
 routines for disabling rdtsc/p exiting
VOID ExtensionCommandDisableRdtscExitingForClearingEventsAllCores ()
 routines ONLY for disabling !tsc command
VOID ExtensionCommandDisableMov2ControlRegsExitingForClearingEventsAllCores (PDEBUGGER_EVENT Event)
 routines ONLY for disabling !crwrite command
VOID ExtensionCommandDisableMov2DebugRegsExitingForClearingEventsAllCores ()
 routines ONLY for disabling !dr command
VOID ExtensionCommandEnableRdpmcExitingAllCores ()
 routines for !pmc
VOID ExtensionCommandDisableRdpmcExitingAllCores ()
 routines for disabling !pmc
VOID ExtensionCommandSetExceptionBitmapAllCores (UINT64 ExceptionIndex)
 routines for !exception command which
VOID ExtensionCommandUnsetExceptionBitmapAllCores (UINT64 ExceptionIndex)
 routines for disabling exception bitmap
VOID ExtensionCommandResetExceptionBitmapAllCores ()
 routines for reset !exception command
VOID ExtensionCommandEnableMovControlRegisterExitingAllCores (PDEBUGGER_EVENT Event)
 routines for !crwrite
VOID ExtensionCommandDisableMovToControlRegistersExitingAllCores (PDEBUGGER_EVENT Event)
 routines for disabling !crwrite
VOID ExtensionCommandEnableMovDebugRegistersExitingAllCores ()
 routines for !dr
VOID ExtensionCommandDisableMovDebugRegistersExitingAllCores ()
 routines for disabling !dr
VOID ExtensionCommandSetExternalInterruptExitingAllCores ()
 routines for !interrupt command which
VOID ExtensionCommandUnsetExternalInterruptExitingOnlyOnClearingInterruptEventsAllCores ()
 routines for ONLY terminate !interrupt command
VOID ExtensionCommandIoBitmapChangeAllCores (UINT64 Port)
 routines for !ioin and !ioout command which
VOID ExtensionCommandIoBitmapResetAllCores ()
 routines for reset !ioin and !ioout command
VOID ExtensionCommandPcitree (PDEBUGGEE_PCITREE_REQUEST_RESPONSE_PACKET PcitreePacket, BOOLEAN OperateOnVmxRoot)
 routines for PCIe tree
VOID ExtensionCommandPcidevinfo (PDEBUGGEE_PCIDEVINFO_REQUEST_RESPONSE_PACKET PcidevinfoPacket, BOOLEAN OperateOnVmxRoot)
 Request PCI device info.

Detailed Description

Implementation of Debugger Commands (Extensions).

Author
Sina Karvandi (sina@.nosp@m.hype.nosp@m.rdbg..nosp@m.org)

Debugger Commands that start with "!"

Version
0.1
Date
2020-04-11

Function Documentation

◆ ExtensionCommandChangeAllMsrBitmapReadAllCores()

VOID ExtensionCommandChangeAllMsrBitmapReadAllCores ( UINT64 BitmapMask)

routines for !msrread command which

causes vm-exit on all msr reads

Parameters
BitmapMaskBit mask of msr to put on msr bitmap
Returns
VOID
392{
393 //
394 // Broadcast to all cores
395 //
397}
IMPORT_EXPORT_VMM VOID BroadcastChangeAllMsrBitmapReadAllCores(UINT64 BitmapMask)
routines for !msrread command which
Definition Broadcast.c:160

◆ ExtensionCommandChangeAllMsrBitmapWriteAllCores()

VOID ExtensionCommandChangeAllMsrBitmapWriteAllCores ( UINT64 BitmapMask)

routines for !msrwrite command which

causes vm-exit on all msr writes

Returns
VOID
419{
420 //
421 // Broadcast to all cores
422 //
424}
IMPORT_EXPORT_VMM VOID BroadcastChangeAllMsrBitmapWriteAllCores(UINT64 BitmapMask)
routines for !msrwrite command which
Definition Broadcast.c:187

◆ ExtensionCommandDisableMov2ControlRegsExitingForClearingEventsAllCores()

VOID ExtensionCommandDisableMov2ControlRegsExitingForClearingEventsAllCores ( PDEBUGGER_EVENT Event)

routines ONLY for disabling !crwrite command

Parameters
Event
Returns
VOID
486{
487 //
488 // Broadcast to all cores
489 //
491}
IMPORT_EXPORT_VMM VOID BroadcastDisableMov2ControlRegsExitingForClearingEventsAllCores(PDEBUGGER_EVENT_OPTIONS BroadcastingOption)
routines ONLY for disabling !crwrite command
Definition Broadcast.c:227
DEBUGGER_EVENT_OPTIONS Options
Definition Debugger.h:132

◆ ExtensionCommandDisableMov2DebugRegsExitingForClearingEventsAllCores()

VOID ExtensionCommandDisableMov2DebugRegsExitingForClearingEventsAllCores ( )

routines ONLY for disabling !dr command

Returns
VOID
499{
500 //
501 // Broadcast to all cores
502 //
504}
IMPORT_EXPORT_VMM VOID BroadcastDisableMov2DebugRegsExitingForClearingEventsAllCores()
routines ONLY for disabling !dr command
Definition Broadcast.c:240

◆ ExtensionCommandDisableMovDebugRegistersExitingAllCores()

VOID ExtensionCommandDisableMovDebugRegistersExitingAllCores ( )

routines for disabling !dr

Returns
VOID
627{
628 //
629 // Broadcast to all cores
630 //
632}
IMPORT_EXPORT_VMM VOID BroadcastDisableMovDebugRegistersExitingAllCores()
routines for disabling !dr
Definition Broadcast.c:368

◆ ExtensionCommandDisableMovToControlRegistersExitingAllCores()

VOID ExtensionCommandDisableMovToControlRegistersExitingAllCores ( PDEBUGGER_EVENT Event)

routines for disabling !crwrite

Parameters
Event
Returns
VOID
600{
601 //
602 // Broadcast to all cores
603 //
605}
IMPORT_EXPORT_VMM VOID BroadcastDisableMovToControlRegistersExitingAllCores(PDEBUGGER_EVENT_OPTIONS BroadcastingOption)
routines for disabling !crwrite
Definition Broadcast.c:341

◆ ExtensionCommandDisableRdpmcExitingAllCores()

VOID ExtensionCommandDisableRdpmcExitingAllCores ( )

routines for disabling !pmc

Returns
VOID
526{
527 //
528 // Broadcast to all cores
529 //
531}
IMPORT_EXPORT_VMM VOID BroadcastDisableRdpmcExitingAllCores()
routines for disabling !pmc
Definition Broadcast.c:267

◆ ExtensionCommandDisableRdtscExitingAllCores()

VOID ExtensionCommandDisableRdtscExitingAllCores ( )

routines for disabling rdtsc/p exiting

Returns
VOID
459{
460 //
461 // Broadcast to all cores
462 //
464}
IMPORT_EXPORT_VMM VOID BroadcastDisableRdtscExitingAllCores()
a broadcast that causes for disabling rdtsc/p exiting
Definition Broadcast.c:145

◆ ExtensionCommandDisableRdtscExitingForClearingEventsAllCores()

VOID ExtensionCommandDisableRdtscExitingForClearingEventsAllCores ( )

routines ONLY for disabling !tsc command

Returns
VOID
472{
473 //
474 // Broadcast to all cores
475 //
477}
IMPORT_EXPORT_VMM VOID BroadcastDisableRdtscExitingForClearingEventsAllCores()
routines ONLY for disabling !tsc command
Definition Broadcast.c:213

◆ ExtensionCommandEnableMovControlRegisterExitingAllCores()

VOID ExtensionCommandEnableMovControlRegisterExitingAllCores ( PDEBUGGER_EVENT Event)

routines for !crwrite

causes vm-exit on all accesses to debug registers

Parameters
Event
Returns
VOID
586{
587 //
588 // Broadcast to all cores
589 //
591}
IMPORT_EXPORT_VMM VOID BroadcastEnableMovControlRegisterExitingAllCores(PDEBUGGER_EVENT_OPTIONS BroadcastingOption)
routines for !crwrite
Definition Broadcast.c:327

◆ ExtensionCommandEnableMovDebugRegistersExitingAllCores()

VOID ExtensionCommandEnableMovDebugRegistersExitingAllCores ( )

routines for !dr

causes vm-exit on all accesses to debug registers

Returns
VOID
614{
615 //
616 // Broadcast to all cores
617 //
619}
IMPORT_EXPORT_VMM VOID BroadcastEnableMovDebugRegistersExitingAllCores()
routines for !dr
Definition Broadcast.c:355

◆ ExtensionCommandEnableRdpmcExitingAllCores()

VOID ExtensionCommandEnableRdpmcExitingAllCores ( )

routines for !pmc

causes vm-exit on all execution of rdpmc

Returns
VOID
513{
514 //
515 // Broadcast to all cores
516 //
518}
IMPORT_EXPORT_VMM VOID BroadcastEnableRdpmcExitingAllCores()
routines for !pmc
Definition Broadcast.c:254

◆ ExtensionCommandEnableRdtscExitingAllCores()

VOID ExtensionCommandEnableRdtscExitingAllCores ( )

routines for !tsc command

causes vm-exit on all execution of rdtsc/rdtscp

Returns
VOID
446{
447 //
448 // Broadcast to all cores
449 //
451}
IMPORT_EXPORT_VMM VOID BroadcastEnableRdtscExitingAllCores()
a broadcast that causes vm-exit on all execution of rdtsc/rdtscp
Definition Broadcast.c:132

◆ ExtensionCommandIoBitmapChangeAllCores()

VOID ExtensionCommandIoBitmapChangeAllCores ( UINT64 Port)

routines for !ioin and !ioout command which

causes vm-exit on all i/o instructions or one port

Returns
VOID
668{
669 //
670 // Broadcast to all cores
671 //
673}
IMPORT_EXPORT_VMM VOID BroadcastIoBitmapChangeAllCores(UINT64 Port)
routines for !ioin and !ioout command which
Definition Broadcast.c:409

◆ ExtensionCommandIoBitmapResetAllCores()

VOID ExtensionCommandIoBitmapResetAllCores ( )

routines for reset !ioin and !ioout command

Returns
VOID
681{
682 //
683 // Broadcast to all cores
684 //
686}
IMPORT_EXPORT_VMM VOID BroadcastIoBitmapResetAllCores()
routines for reset !ioin and !ioout command
Definition Broadcast.c:422

◆ ExtensionCommandPcidevinfo()

VOID ExtensionCommandPcidevinfo ( PDEBUGGEE_PCIDEVINFO_REQUEST_RESPONSE_PACKET PcidevinfoPacket,
BOOLEAN OperateOnVmxRoot )

Request PCI device info.

Parameters
PcidevinfoPacket
OperateOnVmxRoot
Returns
VOID
761{
762 DWORD DeviceIdVendorId = 0xFFFFFFFF;
763
764 //
765 // We currently don't use OperateOnVmxRoot, but we might in the future
766 //
767 UNREFERENCED_PARAMETER(OperateOnVmxRoot);
768
769 DeviceIdVendorId = (DWORD)PciReadCam(PcidevinfoPacket->DeviceInfo.Bus, PcidevinfoPacket->DeviceInfo.Device, PcidevinfoPacket->DeviceInfo.Function, 0, 4);
770 if (DeviceIdVendorId != 0xFFFFFFFF)
771 {
772 DWORD * cs = (DWORD *)&PcidevinfoPacket->DeviceInfo.ConfigSpace; // Overflows into .ConfigSpaceAdditional - no padding due to pack(0)
773 for (UINT16 i = 0; i < CAM_CONFIG_SPACE_LENGTH; i += 4)
774 {
775 *cs = (DWORD)PciReadCam(PcidevinfoPacket->DeviceInfo.Bus, PcidevinfoPacket->DeviceInfo.Device, PcidevinfoPacket->DeviceInfo.Function, (BYTE)i, 4);
776 cs++;
777 }
778
779 //
780 // For endpoints, determine MMIO BAR addressable range and size (if any).
781 // Do not determine BAR size if user has requested raw dump.
782 //
783 if ((PcidevinfoPacket->DeviceInfo.ConfigSpace.CommonHeader.HeaderType & 0x01) << 7 == 0 // Endpoint
784 && !PcidevinfoPacket->PrintRaw)
785 {
786 for (UINT8 i = 0; i < 5; i++)
787 {
788 if ((PcidevinfoPacket->DeviceInfo.ConfigSpace.DeviceHeader.ConfigSpaceEp.Bar[i] & 0x1) == 0) // Memory I/O
789 {
790 if (((PcidevinfoPacket->DeviceInfo.ConfigSpace.DeviceHeader.ConfigSpaceEp.Bar[i] & 0x6) >> 1) == 2) // 64-bit BAR
791 {
792 UINT64 BarMsb = PcidevinfoPacket->DeviceInfo.ConfigSpace.DeviceHeader.ConfigSpaceEp.Bar[i + 1];
793 UINT64 BarLsb = PcidevinfoPacket->DeviceInfo.ConfigSpace.DeviceHeader.ConfigSpaceEp.Bar[i];
794 UINT64 Bar64 = ((BarMsb & 0xFFFFFFFF) << 32) + (BarLsb & 0xFFFFFFF0);
795
796 PcidevinfoPacket->DeviceInfo.MmioBarInfo[i].Is64Bit = TRUE;
797 if (Bar64 == 0)
798 {
799 PcidevinfoPacket->DeviceInfo.MmioBarInfo[i].IsEnabled = FALSE;
800 continue;
801 }
802
803 PcidevinfoPacket->DeviceInfo.MmioBarInfo[i].Is64Bit = TRUE;
804 PcidevinfoPacket->DeviceInfo.MmioBarInfo[i].IsEnabled = TRUE;
805
806 i++;
807 }
808 else // 32-bit BAR
809 {
810 UINT32 Bar32 = (PcidevinfoPacket->DeviceInfo.ConfigSpace.DeviceHeader.ConfigSpaceEp.Bar[i] & 0xFFFFFFF0);
811
812 PcidevinfoPacket->DeviceInfo.MmioBarInfo[i].Is64Bit = FALSE;
813 if (Bar32 == 0)
814 {
815 PcidevinfoPacket->DeviceInfo.MmioBarInfo[i].IsEnabled = FALSE;
816 continue;
817 }
818
819 PcidevinfoPacket->DeviceInfo.MmioBarInfo[i].Is64Bit = FALSE;
820 PcidevinfoPacket->DeviceInfo.MmioBarInfo[i].IsEnabled = TRUE;
821 }
822 }
823 }
824 }
825
827 }
828 else
829 {
830 PcidevinfoPacket->DeviceInfo.ConfigSpace.CommonHeader.DeviceId = 0xFFFF;
831 PcidevinfoPacket->DeviceInfo.ConfigSpace.CommonHeader.VendorId = 0xFFFF;
833 }
834}
unsigned short UINT16
Definition BasicTypes.h:53
unsigned char BYTE
Definition BasicTypes.h:40
#define TRUE
Definition BasicTypes.h:114
#define FALSE
Definition BasicTypes.h:113
unsigned char UINT8
Definition BasicTypes.h:52
unsigned long DWORD
Definition BasicTypes.h:38
unsigned int UINT32
Definition BasicTypes.h:54
#define DEBUGGER_ERROR_INVALID_ADDRESS
error, invalid address specified for debugger
Definition ErrorCodes.h:63
#define DEBUGGER_OPERATION_WAS_SUCCESSFUL
General value to indicate that the operation or request was successful.
Definition ErrorCodes.h:23
#define CAM_CONFIG_SPACE_LENGTH
Definition Pcie.h:43
IMPORT_EXPORT_VMM QWORD PciReadCam(WORD Bus, WORD Device, WORD Function, BYTE Offset, UINT8 Width)
Read from PCI configuration space (CAM) at given offset.
Definition Pci.c:25
PCI_DEV DeviceInfo
Definition RequestStructures.h:1674
UINT32 KernelStatus
Definition RequestStructures.h:1672
BOOL PrintRaw
Definition RequestStructures.h:1673
BOOL IsEnabled
Definition Pcie.h:147
BOOL Is64Bit
Definition Pcie.h:146
UINT8 Device
Definition Pcie.h:169
UINT8 Bus
Definition Pcie.h:168
UINT8 Function
Definition Pcie.h:170
PCI_DEV_MMIOBAR_INFO MmioBarInfo[6]
Definition Pcie.h:173
PORTABLE_PCI_CONFIG_SPACE_HEADER ConfigSpace
Definition Pcie.h:171
UINT16 VendorId
Definition Pcie.h:51
UINT16 DeviceId
Definition Pcie.h:52
UINT8 HeaderType
Definition Pcie.h:59
PORTABLE_PCI_COMMON_HEADER CommonHeader
Definition Pcie.h:158
PORTABLE_PCI_DEVICE_HEADER DeviceHeader
Definition Pcie.h:159
struct _PORTABLE_PCI_DEVICE_HEADER::_PORTABLE_PCI_EP_HEADER ConfigSpaceEp

◆ ExtensionCommandPcitree()

VOID ExtensionCommandPcitree ( PDEBUGGEE_PCITREE_REQUEST_RESPONSE_PACKET PcitreePacket,
BOOLEAN OperateOnVmxRoot )

routines for PCIe tree

Parameters
PcitreePacket
OperateOnVmxRoot
Returns
VOID
698{
699 DWORD DeviceIdVendorId = 0xFFFFFFFF;
700 DWORD ClassCode = 0xFFFFFFFF;
701 UINT8 DevNum = 0;
702
703 //
704 // We currently don't use OperateOnVmxRoot, but we might in the future
705 //
706 UNREFERENCED_PARAMETER(OperateOnVmxRoot);
707
708 for (UINT8 b = 0; b < BUS_MAX_NUM; b++)
709 {
710 for (UINT8 d = 0; d < DEVICE_MAX_NUM; d++)
711 {
712 for (UINT8 f = 0; f < FUNCTION_MAX_NUM; f++)
713 {
714 DeviceIdVendorId = (DWORD)PciReadCam(b, d, f, 0, sizeof(DWORD));
715
716 if (DeviceIdVendorId != 0xFFFFFFFF)
717 {
718 PcitreePacket->DeviceInfoList[DevNum].Bus = b;
719 PcitreePacket->DeviceInfoList[DevNum].Device = d;
720 PcitreePacket->DeviceInfoList[DevNum].Function = f;
721 PcitreePacket->DeviceInfoList[DevNum].ConfigSpace.VendorId = (UINT16)(DeviceIdVendorId & 0xFFFF);
722 PcitreePacket->DeviceInfoList[DevNum].ConfigSpace.DeviceId = (UINT16)(DeviceIdVendorId >> 16);
723
724 ClassCode = (DWORD)PciReadCam(b, d, f, 0, sizeof(DWORD));
725 PcitreePacket->DeviceInfoList[DevNum].ConfigSpace.ClassCode[0] = (UINT8)((ClassCode >> 24) & 0xFF);
726 PcitreePacket->DeviceInfoList[DevNum].ConfigSpace.ClassCode[1] = (UINT8)((ClassCode >> 16) & 0xFF);
727 PcitreePacket->DeviceInfoList[DevNum].ConfigSpace.ClassCode[2] = (UINT8)((ClassCode >> 8) & 0xFF);
728
729 DevNum++;
730 if (DevNum == DEV_MAX_NUM)
731 {
732 LogError("Reached maximum number of devices (%u) that can be stored in debuggee response packet.\n", DEV_MAX_NUM);
733 break;
734 }
735 }
736 }
737 }
738 }
739 PcitreePacket->DeviceInfoListNum = DevNum;
740
741 if (PcitreePacket->DeviceInfoListNum)
742 {
744 }
745 else
746 {
748 }
749}
#define DEV_MAX_NUM
Definition Pcie.h:42
#define FUNCTION_MAX_NUM
Definition Pcie.h:41
#define DEVICE_MAX_NUM
Definition Pcie.h:40
#define BUS_MAX_NUM
Definition Pcie.h:39
#define LogError(format,...)
Log in the case of error.
Definition HyperDbgHyperLogIntrinsics.h:113
f
Definition test-case-generator.py:581
UINT8 DeviceInfoListNum
Definition RequestStructures.h:1649
UINT32 KernelStatus
Definition RequestStructures.h:1648
PCI_DEV_MINIMAL DeviceInfoList[DEV_MAX_NUM]
Definition RequestStructures.h:1650
PORTABLE_PCI_CONFIG_SPACE_HEADER_MINIMAL ConfigSpace
Definition Pcie.h:137
UINT8 Bus
Definition Pcie.h:134
UINT8 Function
Definition Pcie.h:136
UINT8 Device
Definition Pcie.h:135
UINT8 ClassCode[3]
Definition Pcie.h:125
UINT16 VendorId
Definition Pcie.h:123
UINT16 DeviceId
Definition Pcie.h:124

◆ ExtensionCommandPerformActionsForApicRequests()

UINT32 ExtensionCommandPerformActionsForApicRequests ( PDEBUGGER_APIC_REQUEST ApicRequest)

Perform actions regarding APIC.

Parameters
ApicRequest
Returns
UINT32 Size to send to the debuggee
24{
25 BOOLEAN IsUsingX2APIC = FALSE;
26 PLAPIC_PAGE BufferToStoreLApic = (LAPIC_PAGE *)(((CHAR *)ApicRequest) + sizeof(DEBUGGER_APIC_REQUEST));
27 PIO_APIC_ENTRY_PACKETS BufferToStoreIoApic = (IO_APIC_ENTRY_PACKETS *)(((CHAR *)ApicRequest) + sizeof(DEBUGGER_APIC_REQUEST));
28
29 if (ApicRequest->ApicType == DEBUGGER_APIC_REQUEST_TYPE_READ_LOCAL_APIC)
30 {
31 if (VmFuncApicStoreLocalApicFields(BufferToStoreLApic, &IsUsingX2APIC))
32 {
33 //
34 // The status was okay
35 //
36 ApicRequest->KernelStatus = DEBUGGER_OPERATION_WAS_SUCCESSFUL;
37 ApicRequest->IsUsingX2APIC = IsUsingX2APIC;
38
39 return sizeof(DEBUGGER_APIC_REQUEST) + sizeof(LAPIC_PAGE);
40 }
41 else
42 {
43 //
44 // There was an error performing the action
45 //
46 ApicRequest->KernelStatus = DEBUGGER_ERROR_APIC_ACTIONS_ERROR;
47
48 return sizeof(DEBUGGER_APIC_REQUEST);
49 }
50 }
51 else if (ApicRequest->ApicType == DEBUGGER_APIC_REQUEST_TYPE_READ_IO_APIC)
52 {
53 if (VmFuncApicStoreIoApicFields(BufferToStoreIoApic))
54 {
55 //
56 // The status was okay
57 //
58 ApicRequest->KernelStatus = DEBUGGER_OPERATION_WAS_SUCCESSFUL;
59
60 return sizeof(DEBUGGER_APIC_REQUEST) + sizeof(IO_APIC_ENTRY_PACKETS);
61 }
62 else
63 {
64 //
65 // There was an error performing the action
66 //
67 ApicRequest->KernelStatus = DEBUGGER_ERROR_APIC_ACTIONS_ERROR;
68
69 return sizeof(DEBUGGER_APIC_REQUEST);
70 }
71 }
72 else
73 {
74 //
75 // Invalid request
76 //
77 ApicRequest->KernelStatus = DEBUGGER_ERROR_APIC_ACTIONS_ERROR;
78
79 return sizeof(DEBUGGER_APIC_REQUEST);
80 }
81}
UCHAR BOOLEAN
Definition BasicTypes.h:35
char CHAR
Definition BasicTypes.h:33
#define DEBUGGER_ERROR_APIC_ACTIONS_ERROR
error, could not perform APIC actions
Definition ErrorCodes.h:546
struct _LAPIC_PAGE * PLAPIC_PAGE
@ DEBUGGER_APIC_REQUEST_TYPE_READ_IO_APIC
Definition RequestStructures.h:1088
@ DEBUGGER_APIC_REQUEST_TYPE_READ_LOCAL_APIC
Definition RequestStructures.h:1087
struct _IO_APIC_ENTRY_PACKETS IO_APIC_ENTRY_PACKETS
The structure of I/O APIC result packet in HyperDbg.
struct _IO_APIC_ENTRY_PACKETS * PIO_APIC_ENTRY_PACKETS
struct _LAPIC_PAGE LAPIC_PAGE
LAPIC structure and offsets.
struct _DEBUGGER_APIC_REQUEST DEBUGGER_APIC_REQUEST
The structure of actions for APIC.
IMPORT_EXPORT_VMM BOOLEAN VmFuncApicStoreLocalApicFields(PLAPIC_PAGE LocalApicBuffer, PBOOLEAN IsUsingX2APIC)
Store the details Local APIC in xapic or x2apic modes.
Definition Export.c:1099
IMPORT_EXPORT_VMM BOOLEAN VmFuncApicStoreIoApicFields(IO_APIC_ENTRY_PACKETS *IoApicPackets)
Store the details of I/O APIC.
Definition Export.c:1111

◆ ExtensionCommandPerformQueryIdtEntriesRequest()

VOID ExtensionCommandPerformQueryIdtEntriesRequest ( PINTERRUPT_DESCRIPTOR_TABLE_ENTRIES_PACKETS IdtQueryRequest,
BOOLEAN ReadFromVmxRoot )

Perform query for IDT entries.

Parameters
IdtQueryRequest
ReadFromVmxRoot
Returns
VOID
94{
95 //
96 // Perform the query
97 //
98 VmFuncIdtQueryEntries(IdtQueryRequest, ReadFromVmxRoot);
99
100 //
101 // Operation was successful
102 //
104}
IMPORT_EXPORT_VMM VOID VmFuncIdtQueryEntries(PINTERRUPT_DESCRIPTOR_TABLE_ENTRIES_PACKETS IdtQueryRequest, BOOLEAN ReadFromVmxRoot)
Perform query for IDT entries.
Definition Export.c:1125
UINT32 KernelStatus
Definition RequestStructures.h:1465

◆ ExtensionCommandPte()

BOOLEAN ExtensionCommandPte ( PDEBUGGER_READ_PAGE_TABLE_ENTRIES_DETAILS PteDetails,
BOOLEAN IsOperatingInVmxRoot )

routines for !pte command

Parameters
PteDetails
IsOperatingInVmxRoot
Returns
BOOLEAN
262{
263 BOOLEAN Result = FALSE;
264 CR3_TYPE RestoreCr3 = {0};
265
266 //
267 // Check for validations
268 //
269 if (IsOperatingInVmxRoot)
270 {
272 {
273 //
274 // Address is not valid (doesn't have Physical Address)
275 //
277 return FALSE;
278 }
279
280 //
281 // Switch on running process's cr3
282 //
284 }
285 else
286 {
287 if (PteDetails->ProcessId != HANDLE_TO_UINT32(PsGetCurrentProcessId()))
288 {
289 //
290 // It's on another process address space
291 //
292
293 //
294 // Check if pid is valid
295 //
296 if (!CommonIsProcessExist(PteDetails->ProcessId))
297 {
298 //
299 // Process id is invalid
300 //
302 return FALSE;
303 }
304
305 //
306 // Switch to new process's memory layout
307 //
308 RestoreCr3.Flags = SwitchToProcessMemoryLayout(PteDetails->ProcessId).Flags;
309 }
310
311 //
312 // Check if address is valid
313 //
315 {
316 //
317 // Address is not valid (doesn't have Physical Address)
318 //
320 Result = FALSE;
321 goto RestoreTheState;
322 }
323 }
324
325 //
326 // Read the PML4E
327 //
329 if (Pml4e)
330 {
331 PteDetails->Pml4eVirtualAddress = (UINT64)Pml4e;
332 PteDetails->Pml4eValue = Pml4e->Flags;
333 }
334
335 //
336 // Read the PDPTE
337 //
339 if (Pdpte)
340 {
341 PteDetails->PdpteVirtualAddress = (UINT64)Pdpte;
342 PteDetails->PdpteValue = Pdpte->Flags;
343 }
344
345 //
346 // Read the PDE
347 //
349 if (Pde)
350 {
351 PteDetails->PdeVirtualAddress = (UINT64)Pde;
352 PteDetails->PdeValue = Pde->Flags;
353 }
354
355 //
356 // Read the PTE
357 //
359 if (Pte)
360 {
361 PteDetails->PteVirtualAddress = (UINT64)Pte;
362 PteDetails->PteValue = Pte->Flags;
363 }
364
365 //
366 // Show that the details we retrieved successfully
367 //
369 Result = TRUE;
370
371RestoreTheState:
372
373 //
374 // Check to restore the current cr3 if it's changed
375 //
376 if (RestoreCr3.Flags != (UINT64)NULL)
377 {
378 SwitchToPreviousProcess(RestoreCr3);
379 }
380
381 return Result;
382}
struct _PAGE_ENTRY * PPAGE_ENTRY
#define HANDLE_TO_UINT32(_var)
Definition MetaMacros.h:39
void * PVOID
Definition BasicTypes.h:56
struct _CR3_TYPE CR3_TYPE
CR3 Structure.
@ PagingLevelPageDirectoryPointerTable
Definition DataTypes.h:27
@ PagingLevelPageDirectory
Definition DataTypes.h:26
@ PagingLevelPageTable
Definition DataTypes.h:25
@ PagingLevelPageMapLevel4
Definition DataTypes.h:28
#define DEBUGGER_ERROR_INVALID_PROCESS_ID
error, the process id is invalid
Definition ErrorCodes.h:220
IMPORT_EXPORT_VMM CR3_TYPE SwitchToCurrentProcessMemoryLayout()
Switch to guest's running process's cr3.
Definition SwitchLayout.c:70
IMPORT_EXPORT_VMM VOID SwitchToPreviousProcess(_In_ CR3_TYPE PreviousProcess)
IMPORT_EXPORT_VMM UINT64 VirtualAddressToPhysicalAddressOnTargetProcess(_In_ PVOID VirtualAddress)
IMPORT_EXPORT_VMM PVOID MemoryMapperGetPteVa(_In_ PVOID Va, _In_ PAGING_LEVEL Level)
IMPORT_EXPORT_VMM CR3_TYPE SwitchToProcessMemoryLayout(_In_ UINT32 ProcessId)
IMPORT_EXPORT_VMM UINT64 VirtualAddressToPhysicalAddress(_In_ PVOID VirtualAddress)
Converts Virtual Address to Physical Address.
Definition Conversion.c:154
BOOLEAN CommonIsProcessExist(UINT32 ProcId)
Checks whether the process with ProcId exists or not.
Definition Common.c:24
UINT64 Flags
Definition BasicTypes.h:239
UINT64 PdeValue
Definition RequestStructures.h:65
UINT64 PdpteValue
Definition RequestStructures.h:62
UINT64 PdpteVirtualAddress
Definition RequestStructures.h:61
UINT64 VirtualAddress
Definition RequestStructures.h:55
UINT64 PteVirtualAddress
Definition RequestStructures.h:67
UINT64 Pml4eValue
Definition RequestStructures.h:59
UINT64 Pml4eVirtualAddress
Definition RequestStructures.h:58
UINT32 ProcessId
Definition RequestStructures.h:56
UINT32 KernelStatus
Definition RequestStructures.h:70
UINT64 PteValue
Definition RequestStructures.h:68
UINT64 PdeVirtualAddress
Definition RequestStructures.h:64
UINT64 Flags
Definition MemoryMapper.h:66

◆ ExtensionCommandResetAllMsrBitmapWriteAllCores()

VOID ExtensionCommandResetAllMsrBitmapWriteAllCores ( )

routines for reset !msrwrite command which

Returns
VOID
432{
433 //
434 // Broadcast to all cores
435 //
437}
IMPORT_EXPORT_VMM VOID BroadcastResetAllMsrBitmapWriteAllCores()
routines for reset !msrwrite command which
Definition Broadcast.c:200

◆ ExtensionCommandResetChangeAllMsrBitmapReadAllCores()

VOID ExtensionCommandResetChangeAllMsrBitmapReadAllCores ( )

routines for disable (reset) !msrread command

Returns
VOID
405{
406 //
407 // Broadcast to all cores
408 //
410}
IMPORT_EXPORT_VMM VOID BroadcastResetChangeAllMsrBitmapReadAllCores()
routines for disable (reset) !msrread command
Definition Broadcast.c:173

◆ ExtensionCommandResetExceptionBitmapAllCores()

VOID ExtensionCommandResetExceptionBitmapAllCores ( )

routines for reset !exception command

Returns
VOID
571{
572 //
573 // Broadcast to all cores
574 //
576}
IMPORT_EXPORT_VMM VOID BroadcastResetExceptionBitmapAllCores()
routines for reset !exception command
Definition Broadcast.c:312

◆ ExtensionCommandSetExceptionBitmapAllCores()

VOID ExtensionCommandSetExceptionBitmapAllCores ( UINT64 ExceptionIndex)

routines for !exception command which

causes vm-exit when exception occurred

Parameters
ExceptionIndexindex of exception on IDT
Returns
VOID
542{
543 //
544 // Broadcast to all cores
545 //
547}
IMPORT_EXPORT_VMM VOID BroadcastSetExceptionBitmapAllCores(UINT64 ExceptionIndex)
routines for !exception command which
Definition Broadcast.c:283

◆ ExtensionCommandSetExternalInterruptExitingAllCores()

VOID ExtensionCommandSetExternalInterruptExitingAllCores ( )

routines for !interrupt command which

causes vm-exit when external interrupt occurs

Returns
VOID
641{
642 //
643 // Broadcast to all cores
644 //
646}
IMPORT_EXPORT_VMM VOID BroadcastSetExternalInterruptExitingAllCores()
routines for !interrupt command which
Definition Broadcast.c:382

◆ ExtensionCommandUnsetExceptionBitmapAllCores()

VOID ExtensionCommandUnsetExceptionBitmapAllCores ( UINT64 ExceptionIndex)

routines for disabling exception bitmap

removes vm-exit when exception occurred

Parameters
ExceptionIndexindex of exception on IDT
Returns
VOID
558{
559 //
560 // Broadcast to all cores
561 //
563}
IMPORT_EXPORT_VMM VOID BroadcastUnsetExceptionBitmapAllCores(UINT64 ExceptionIndex)
routines for disabling exception bitmap
Definition Broadcast.c:299

◆ ExtensionCommandUnsetExternalInterruptExitingOnlyOnClearingInterruptEventsAllCores()

VOID ExtensionCommandUnsetExternalInterruptExitingOnlyOnClearingInterruptEventsAllCores ( )

routines for ONLY terminate !interrupt command

Returns
VOID
654{
655 //
656 // Broadcast to all cores
657 //
659}
IMPORT_EXPORT_VMM VOID BroadcastUnsetExternalInterruptExitingOnlyOnClearingInterruptEventsAllCores()
routines for ONLY terminate !interrupt command
Definition Broadcast.c:395

◆ ExtensionCommandVa2paAndPa2va()

VOID ExtensionCommandVa2paAndPa2va ( PDEBUGGER_VA2PA_AND_PA2VA_COMMANDS AddressDetails,
BOOLEAN OperateOnVmxRoot )

routines for !va2pa and !pa2va commands

Parameters
AddressDetails
OperateOnVmxRoot
Returns
VOID
115{
116 if (OperateOnVmxRoot)
117 {
118 //
119 // *** !va2pa and !pa2va in Debugger Mode
120 //
121 if (AddressDetails->IsVirtual2Physical)
122 {
124
125 //
126 // Check if address is valid or invalid
127 //
128 if (AddressDetails->PhysicalAddress == (UINT64)NULL)
129 {
130 //
131 // Invalid address
132 //
134 }
135 else
136 {
137 //
138 // Operation was successful
139 //
141 }
142 }
143 else
144 {
145 AddressDetails->VirtualAddress =
147
148 //
149 // We don't know a way for checking physical address validity
150 //
152 }
153 }
154 else
155 {
156 //
157 // *** regular !va2pa and !pa2va in VMI Mode
158 //
159
160 if (AddressDetails->ProcessId == HANDLE_TO_UINT32(PsGetCurrentProcessId()))
161 {
162 //
163 // It's on current process address space (we process the request
164 // based on system process layout (pid = 4))
165 //
166 if (AddressDetails->IsVirtual2Physical)
167 {
168 AddressDetails->PhysicalAddress = VirtualAddressToPhysicalAddress((PVOID)AddressDetails->VirtualAddress);
169
170 //
171 // Check if address is valid or invalid
172 //
173 if (AddressDetails->PhysicalAddress == (UINT64)NULL)
174 {
175 //
176 // Invalid address
177 //
179 }
180 else
181 {
182 //
183 // Operation was successful
184 //
186 }
187 }
188 else
189 {
190 AddressDetails->VirtualAddress = PhysicalAddressToVirtualAddress(AddressDetails->PhysicalAddress);
191
192 //
193 // We don't know a way for checking physical address validity
194 //
196 }
197 }
198 else
199 {
200 //
201 // It's on another process address space
202 //
203
204 //
205 // Check if pid is valid
206 //
207 if (!CommonIsProcessExist(AddressDetails->ProcessId))
208 {
209 //
210 // Process id is invalid
211 //
213 return;
214 }
215
216 if (AddressDetails->IsVirtual2Physical)
217 {
218 AddressDetails->PhysicalAddress = VirtualAddressToPhysicalAddressByProcessId((PVOID)AddressDetails->VirtualAddress, AddressDetails->ProcessId);
219
220 //
221 // Check if address is valid or invalid
222 //
223 if (AddressDetails->PhysicalAddress == (UINT64)NULL)
224 {
225 //
226 // Invalid address
227 //
229 }
230 else
231 {
232 //
233 // Operation was successful
234 //
236 }
237 }
238 else
239 {
240 AddressDetails->VirtualAddress =
242 AddressDetails->ProcessId);
243
244 //
245 // We don't know a way for checking physical address validity
246 //
248 }
249 }
250 }
251}
IMPORT_EXPORT_VMM UINT64 PhysicalAddressToVirtualAddressOnTargetProcess(_In_ PVOID PhysicalAddress)
IMPORT_EXPORT_VMM UINT64 PhysicalAddressToVirtualAddress(_In_ UINT64 PhysicalAddress)
IMPORT_EXPORT_VMM UINT64 VirtualAddressToPhysicalAddressByProcessId(_In_ PVOID VirtualAddress, _In_ UINT32 ProcessId)
IMPORT_EXPORT_VMM UINT64 PhysicalAddressToVirtualAddressByProcessId(_In_ PVOID PhysicalAddress, _In_ UINT32 ProcessId)
BOOLEAN IsVirtual2Physical
Definition RequestStructures.h:89
UINT32 KernelStatus
Definition RequestStructures.h:90
UINT64 PhysicalAddress
Definition RequestStructures.h:87
UINT32 ProcessId
Definition RequestStructures.h:88
UINT64 VirtualAddress
Definition RequestStructures.h:86