Re[2]: PortIO в Windows XP и Windows 7(32 и 64)
От: flashRSDN  
Дата: 03.08.12 13:09
Оценка:
Здравствуйте, 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
}
/*----------------------------------------------------------------------------*/
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.