diff --git a/reactos/include/reactos/windbgkd.h b/reactos/include/reactos/windbgkd.h index 582afbda4f2..e1758874ae8 100644 --- a/reactos/include/reactos/windbgkd.h +++ b/reactos/include/reactos/windbgkd.h @@ -125,6 +125,22 @@ #define DBGKD_64BIT_PROTOCOL_VERSION1 5 #define DBGKD_64BIT_PROTOCOL_VERSION2 6 +// +// Query Memory Address Spaces +// +#define DBGKD_QUERY_MEMORY_VIRTUAL 0 +#define DBGKD_QUERY_MEMORY_PROCESS 0 +#define DBGKD_QUERY_MEMORY_SESSION 1 +#define DBGKD_QUERY_MEMORY_KERNEL 2 + +// +// Query Memory Flags +// +#define DBGKD_QUERY_MEMORY_READ 0x01 +#define DBGKD_QUERY_MEMORY_WRITE 0x02 +#define DBGKD_QUERY_MEMORY_EXECUTE 0x04 +#define DBGKD_QUERY_MEMORY_FIXED 0x08 + // // KD Packet Structure // diff --git a/reactos/ntoskrnl/kd64/kdapi.c b/reactos/ntoskrnl/kd64/kdapi.c index 5e5c044ad3d..e8854d64546 100644 --- a/reactos/ntoskrnl/kd64/kdapi.c +++ b/reactos/ntoskrnl/kd64/kdapi.c @@ -14,6 +14,56 @@ /* PRIVATE FUNCTIONS *********************************************************/ +VOID +NTAPI +KdpQueryMemory(IN PDBGKD_MANIPULATE_STATE64 State, + IN PCONTEXT Context) +{ + PDBGKD_QUERY_MEMORY Memory = &State->u.QueryMemory; + STRING Header; + NTSTATUS Status = STATUS_SUCCESS; + + /* Validate the address space */ + if (Memory->AddressSpace == DBGKD_QUERY_MEMORY_VIRTUAL) + { + /* Check if this is process memory */ + if ((PVOID)(LONG_PTR)Memory->Address < MmHighestUserAddress) + { + /* It is */ + Memory->AddressSpace = DBGKD_QUERY_MEMORY_PROCESS; + } + else + { + /* FIXME: Check if it's session space */ + Memory->AddressSpace = DBGKD_QUERY_MEMORY_KERNEL; + } + + /* Set flags */ + Memory->Flags = DBGKD_QUERY_MEMORY_READ | + DBGKD_QUERY_MEMORY_WRITE | + DBGKD_QUERY_MEMORY_EXECUTE; + } + else + { + /* Invalid */ + Status = STATUS_INVALID_PARAMETER; + } + + /* Return structure */ + State->ReturnStatus = Status; + Memory->Reserved = 0; + + /* Build header */ + Header.Length = sizeof(DBGKD_MANIPULATE_STATE64); + Header.Buffer = (PCHAR)State; + + /* Send the packet */ + KdSendPacket(PACKET_TYPE_KD_STATE_MANIPULATE, + &Header, + NULL, + &KdpContext); +} + VOID NTAPI KdpWriteBreakpoint(IN PDBGKD_MANIPULATE_STATE64 State, @@ -22,7 +72,6 @@ KdpWriteBreakpoint(IN PDBGKD_MANIPULATE_STATE64 State, { PDBGKD_WRITE_BREAKPOINT64 Breakpoint = &State->u.WriteBreakPoint; STRING Header; - NTSTATUS Status; /* Build header */ Header.Length = sizeof(DBGKD_MANIPULATE_STATE64); @@ -35,7 +84,12 @@ KdpWriteBreakpoint(IN PDBGKD_MANIPULATE_STATE64 State, if (!Breakpoint->BreakPointHandle) { /* We failed */ - Status = STATUS_UNSUCCESSFUL; + State->ReturnStatus = STATUS_UNSUCCESSFUL; + } + else + { + /* Success! */ + State->ReturnStatus = STATUS_SUCCESS; } /* Send the packet */ @@ -816,9 +870,8 @@ SendPacket: case DbgKdQueryMemoryApi: - /* FIXME: TODO */ - Ke386SetCr2(DbgKdQueryMemoryApi); - while (TRUE); + /* Query memory */ + KdpQueryMemory(&ManipulateState, Context); break; case DbgKdSwitchPartition: