Добрый всем день.
Собственно, все должно быть просто: обращение к портам...но
в WindowsXP — работает, в Windows 7 (в 32 и 64) — нет
Код прилагаю, WDM
KDPrint (убрал из кода) отображает правильные значения и адреса (Address) и данных (uValue.ulongValue).
При операции чтении из портов возвращается 0xFFFFFFFF (в Windows 7)
Где я ошибаюсь
/*----------------------------------------------------------------------------*/
NTSTATUS
DEV_WRITE_PORT_ULONG(
PRF_DEVICE_INFO devInfo,
PIRP irp)
{
NTSTATUS status = STATUS_SUCCESS;
PVOID pIOBuffer; // Pointer to transfer buffer
ULONG Address; // Address of port
UCHAR PortIdx;
PIO_STACK_LOCATION irpStack;
pIOBuffer = (PVOID)irp->AssociatedIrp.SystemBuffer;
PortIdx= ((PPORT_ACCESS_BUFFER)pIOBuffer)->PortIdx;
if (PortIdx <= PCI_TYPE0_ADDRESSES) {
Address = (USHORT)(devInfo->ResourceList.IOPorts[PortIdx]);
if (Address != 0) {
Address += (USHORT)(((PPORT_ACCESS_BUFFER)pIOBuffer)->PortOffs);
WRITE_PORT_ULONG((PULONG)Address,
((PPORT_ACCESS_BUFFER)pIOBuffer)->uValue.ulongValue
);
irpStack = IoGetCurrentIrpStackLocation(irp);
// Indicate # of bytes to return to user mode
irp->IoStatus.Information = 0;
return STATUS_SUCCESS;
}
else
return STATUS_INVALID_PARAMETER; //specified port not present
}
else
return STATUS_INVALID_PARAMETER; // our of range from range PCI_PORT
}
/*----------------------------------------------------------------------------*/
Здравствуйте, acDev, Вы писали:
D>Здравствуйте, flashRSDN, Вы писали:
RSD>>При операции чтении из портов возвращается 0xFFFFFFFF (в Windows 7)
D>А где собственно код чтения?
Собственно, вот, но там ничего нет примечательного (IMHO)...
Устройство: плата в шине PCI-33, контроллер шины реализован на ALTERA.
Если бы это были аппаратные проблемы, то Windows не находил бы устройство и не назначал ему порты IO ?
Тем более, что не меняя "железа", на Windows XP — работает.
Хотя, есть другое устройство, на нем контроллер PCI реализован ресурсами процессора TMS6416, для этого устройства
с драйверами для Windows 7 все нормально ( и IO порты, и DMA...)
/*----------------------------------------------------------------------------*/
NTSTATUS
DEV_READ_PORT_ULONG(
PRF_DEVICE_INFO devInfo,
PIRP irp)
{
NTSTATUS status = STATUS_SUCCESS;
PVOID pIOBuffer; // Pointer to transfer buffer
ULONG Address; // Address of port
UCHAR PortIdx;
PIO_STACK_LOCATION irpStack;
pIOBuffer = (PVOID)irp->AssociatedIrp.SystemBuffer;
PortIdx= ((PPORT_ACCESS_BUFFER)pIOBuffer)->PortIdx;
if (PortIdx <= PCI_TYPE0_ADDRESSES) {
Address = (USHORT)(devInfo->ResourceList.IOPorts[PortIdx]);
if (Address != 0) {
Address += (USHORT)(((PPORT_ACCESS_BUFFER)pIOBuffer)->PortOffs);
((PPORT_ACCESS_BUFFER)pIOBuffer)->uValue.ulongValue = READ_PORT_ULONG((PULONG)Address);
irpStack = IoGetCurrentIrpStackLocation(irp);
// Indicate # of bytes to return to user mode
if (irpStack->Parameters.DeviceIoControl.OutputBufferLength >= sizeof(ULONG)) {
irp->IoStatus.Information = irpStack->Parameters.DeviceIoControl.OutputBufferLength;
return STATUS_SUCCESS;
}
else {
irp->IoStatus.Information = 0;
return STATUS_INVALID_BUFFER_SIZE;
}
}
else
return STATUS_INVALID_PARAMETER; //specified port not present
}
else
return STATUS_INVALID_PARAMETER; // our of range from range PCI_PORT
}
/*----------------------------------------------------------------------------*/