From b187662f3930ea3244d26fd7c47e052c76ffa998 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Herv=C3=A9=20Poussineau?= Date: Sun, 22 Sep 2024 21:39:47 +0200 Subject: [PATCH] [NTOS:KD64] Implement KdSystemDebugControl: SysDbgReadIoSpace/SysDbgWriteIoSpace --- ntoskrnl/kd64/kdapi.c | 60 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 60 insertions(+) diff --git a/ntoskrnl/kd64/kdapi.c b/ntoskrnl/kd64/kdapi.c index 899e225f013..ed1a74e9ee1 100644 --- a/ntoskrnl/kd64/kdapi.c +++ b/ntoskrnl/kd64/kdapi.c @@ -2423,7 +2423,67 @@ KdSystemDebugControl( break; case SysDbgReadIoSpace: + if (InputBufferLength != sizeof(SYSDBG_IO_SPACE)) + { + Status = STATUS_INFO_LENGTH_MISMATCH; + } + else + { + SYSDBG_IO_SPACE Request = *(PSYSDBG_IO_SPACE)InputBuffer; + PVOID LockedBuffer; + PMDL LockVariable; + + Status = ExLockUserBuffer(Request.Buffer, + Request.Request, + PreviousMode, + IoWriteAccess, + &LockedBuffer, + &LockVariable); + if (NT_SUCCESS(Status)) + { + Status = KdpSysReadIoSpace(Request.InterfaceType, + Request.BusNumber, + Request.AddressSpace, + Request.Address, + LockedBuffer, + Request.Request, + &Length); + ExUnlockUserBuffer(LockVariable); + } + } + break; + case SysDbgWriteIoSpace: + if (InputBufferLength != sizeof(SYSDBG_IO_SPACE)) + { + Status = STATUS_INFO_LENGTH_MISMATCH; + } + else + { + SYSDBG_IO_SPACE Request = *(PSYSDBG_IO_SPACE)InputBuffer; + PVOID LockedBuffer; + PMDL LockVariable; + + Status = ExLockUserBuffer(Request.Buffer, + Request.Request, + PreviousMode, + IoReadAccess, + &LockedBuffer, + &LockVariable); + if (NT_SUCCESS(Status)) + { + Status = KdpSysWriteIoSpace(Request.InterfaceType, + Request.BusNumber, + Request.AddressSpace, + Request.Address, + LockedBuffer, + Request.Request, + &Length); + ExUnlockUserBuffer(LockVariable); + } + } + break; + case SysDbgReadMsr: case SysDbgWriteMsr: case SysDbgReadBusData: