PortIO в Windows XP и Windows 7(32 и 64)
От: flashRSDN  
Дата: 31.07.12 13:46
Оценка:
Добрый всем день.
Собственно, все должно быть просто: обращение к портам...но
в 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
}
/*----------------------------------------------------------------------------*/
Re: PortIO в Windows XP и Windows 7(32 и 64)
От: acDev Россия  
Дата: 03.08.12 07:18
Оценка:
Здравствуйте, flashRSDN, Вы писали:

RSD>При операции чтении из портов возвращается 0xFFFFFFFF (в Windows 7)


А где собственно код чтения?
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
}
/*----------------------------------------------------------------------------*/
Re[3]: PortIO в Windows XP и Windows 7(32 и 64)
От: flashRSDN  
Дата: 23.08.12 06:29
Оценка:
Окончание истории:
по неустановленным мною причинам W7 (32 и 64), для PCI-устройства, требует наличия в конфигурационном
пространстве регистров управления питанием.
Причем,абсолютно законно установить сигнал от устройства, который информирует,что функции управления питанием не реализованы,но...

Если этих регистров нет, то W7 не включает пространство IO для платы.

Обошел этот факт принудительным включением в Command Register конфигурационного пространства IO для платы
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.