diff --git a/ntoskrnl/kd64/kdapi.c b/ntoskrnl/kd64/kdapi.c index f604779bc39..f6e375dbc7d 100644 --- a/ntoskrnl/kd64/kdapi.c +++ b/ntoskrnl/kd64/kdapi.c @@ -2304,6 +2304,35 @@ KdSystemDebugControl( case SysDbgReadVirtual: case SysDbgWriteVirtual: + if (InputBufferLength != sizeof(SYSDBG_VIRTUAL)) + { + Status = STATUS_INFO_LENGTH_MISMATCH; + } + else + { + SYSDBG_VIRTUAL Request = *(PSYSDBG_VIRTUAL)InputBuffer; + PVOID LockedBuffer; + PMDL LockVariable; + + Status = ExLockUserBuffer(Request.Buffer, + Request.Request, + PreviousMode, + Command == SysDbgReadVirtual ? IoWriteAccess : IoReadAccess, + &LockedBuffer, + &LockVariable); + if (NT_SUCCESS(Status)) + { + Status = KdpCopyMemoryChunks((ULONG64)(ULONG_PTR)Request.Address, + Request.Buffer, + Request.Request, + 0, + Command == SysDbgReadVirtual ? 0 : MMDBG_COPY_WRITE, + &Length); + ExUnlockUserBuffer(LockVariable); + } + } + break; + case SysDbgReadPhysical: case SysDbgWritePhysical: case SysDbgReadControlSpace: