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
}
/*----------------------------------------------------------------------------*/
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.