VOID
NTAPI
-KdpSetContextState(IN PDBGKD_WAIT_STATE_CHANGE64 WaitStateChange,
+KdpSetContextState(IN PDBGKD_ANY_WAIT_STATE_CHANGE WaitStateChange,
IN PCONTEXT Context)
{
PKPRCB Prcb = KeGetCurrentPrcb();
KdpSysReadBusData(IN ULONG BusDataType,
IN ULONG BusNumber,
IN ULONG SlotNumber,
- IN PVOID Buffer,
IN ULONG Offset,
+ IN PVOID Buffer,
IN ULONG Length,
OUT PULONG ActualLength)
{
KdpSysWriteBusData(IN ULONG BusDataType,
IN ULONG BusNumber,
IN ULONG SlotNumber,
- IN PVOID Buffer,
IN ULONG Offset,
+ IN PVOID Buffer,
IN ULONG Length,
OUT PULONG ActualLength)
{
OUT PULONG ActualLength)
{
PVOID ControlStart;
- ULONG RealLength;
+ PKPRCB Prcb = KiProcessorBlock[Processor];
+ PKIPCR Pcr = CONTAINING_RECORD(Prcb, KIPCR, Prcb);
- if ((ULONG)BaseAddress <= 2)
+ switch (BaseAddress)
{
- PKPRCB Prcb = KiProcessorBlock[Processor];
- PKIPCR Pcr = CONTAINING_RECORD(Prcb, KIPCR, Prcb);
+ case AMD64_DEBUG_CONTROL_SPACE_KPCR:
+ /* Copy a pointer to the Pcr */
+ ControlStart = &Pcr;
+ *ActualLength = sizeof(PVOID);
+ break;
- switch ((ULONG_PTR)BaseAddress)
- {
- case DEBUG_CONTROL_SPACE_KPCR:
- /* Copy a pointer to the Pcr */
- ControlStart = &Pcr;
- RealLength = sizeof(PVOID);
- break;
-
- case DEBUG_CONTROL_SPACE_KPRCB:
- /* Copy a pointer to the Prcb */
- ControlStart = &Prcb;
- RealLength = sizeof(PVOID);
- break;
-
- case DEBUG_CONTROL_SPACE_KSPECIAL:
- /* Copy SpecialRegisters */
- ControlStart = &Prcb->ProcessorState.SpecialRegisters;
- RealLength = sizeof(KSPECIAL_REGISTERS);
- break;
-
- case DEBUG_CONTROL_SPACE_KTHREAD:
- /* Copy a pointer to the current Thread */
- ControlStart = &Prcb->CurrentThread;
- RealLength = sizeof(PVOID);
- break;
-
- default:
- RealLength = 0;
- ControlStart = NULL;
- ASSERT(FALSE);
- return STATUS_UNSUCCESSFUL;
- }
+ case AMD64_DEBUG_CONTROL_SPACE_KPRCB:
+ /* Copy a pointer to the Prcb */
+ ControlStart = &Prcb;
+ *ActualLength = sizeof(PVOID);
+ break;
- if (RealLength < Length) Length = RealLength;
+ case AMD64_DEBUG_CONTROL_SPACE_KSPECIAL:
+ /* Copy SpecialRegisters */
+ ControlStart = &Prcb->ProcessorState.SpecialRegisters;
+ *ActualLength = sizeof(KSPECIAL_REGISTERS);
+ break;
- /* Copy the memory */
- RtlCopyMemory(Buffer, ControlStart, Length);
- *ActualLength = Length;
+ case AMD64_DEBUG_CONTROL_SPACE_KTHREAD:
+ /* Copy a pointer to the current Thread */
+ ControlStart = &Prcb->CurrentThread;
+ *ActualLength = sizeof(PVOID);
+ break;
- /* Finish up */
- return STATUS_SUCCESS;
- }
- else
- {
- /* Invalid request */
- *ActualLength = 0;
- return STATUS_UNSUCCESSFUL;
+ default:
+ *ActualLength = 0;
+ ASSERT(FALSE);
+ return STATUS_UNSUCCESSFUL;
}
+
+ /* Copy the memory */
+ RtlCopyMemory(Buffer, ControlStart, min(Length, *ActualLength));
+
+ /* Finish up */
+ return STATUS_SUCCESS;
}
NTSTATUS
return STATUS_INVALID_PARAMETER;
}
+ /* Check for correct alignment */
+ if ((IoAddress & (DataSize - 1)))
+ {
+ /* Invalid alignment */
+ *ActualDataSize = 0;
+ return STATUS_DATATYPE_MISALIGNMENT;
+ }
+
switch (DataSize)
{
case sizeof(UCHAR):
- /* read one UCHAR */
+ /* Read one UCHAR */
*(PUCHAR)DataValue = READ_PORT_UCHAR((PUCHAR)IoAddress);
break;
default:
/* Invalid data size */
*ActualDataSize = 0;
- return STATUS_UNSUCCESSFUL;
+ return STATUS_INVALID_PARAMETER;
}
/* Return the size of the data */
return STATUS_INVALID_PARAMETER;
}
+ /* Check for correct alignment */
+ if ((IoAddress & (DataSize - 1)))
+ {
+ /* Invalid alignment */
+ *ActualDataSize = 0;
+ return STATUS_DATATYPE_MISALIGNMENT;
+ }
+
switch (DataSize)
{
case sizeof(UCHAR):
- /* read one UCHAR */
+ /* Write one UCHAR */
WRITE_PORT_UCHAR((PUCHAR)IoAddress, *(PUCHAR)DataValue);
break;
case sizeof(USHORT):
- /* Read one USHORT */
+ /* Write one USHORT */
WRITE_PORT_USHORT((PUSHORT)IoAddress, *(PUSHORT)DataValue);
break;
case sizeof(ULONG):
- /* Read one ULONG */
+ /* Write one ULONG */
WRITE_PORT_ULONG((PULONG)IoAddress, *(PULONG)DataValue);
break;
default:
/* Invalid data size */
*ActualDataSize = 0;
- return STATUS_UNSUCCESSFUL;
+ return STATUS_INVALID_PARAMETER;
}
/* Return the size of the data */