Вопрос собственно такой:
Как в kernel mode узнать номер канала ДМА о котором рапортует parport.sys ?
Предыстория:
Несколько лет назад соорудил неким товарищам драйвер для их железки, которая гонит данные в пар. порт. Операционка — WinXP.
Работает это дело в ECP режиме с использованием системного slave DMA.
Мой драйвер узнавал у parport.sys диапазон портов, номер прерывания и канал DMA.
Все, кроме канала ДМА, я штатно 'спрашиваю' у parport.sys, используя IOCTL_INTERNAL_GET_PARALLEL_PORT_INFO
IOCTL_INTERNAL_GET_MORE_PARALLEL_PORT_INFO
IOCTL_INTERNAL_GET_PARALLEL_PNP_INFO
Канал ДМА, я достаю (видимо через задницу) вот так:
1. Получаю DeviceObject пар. порта.
IoGetDeviceObjectPointer(&symlink, ...); ( symlink == \Device\ParallelPort0 )
2. Достаю PDO порта, делая запрос к этому DeviceObject с минором IRP_MN_QUERY_DEVICE_RELATIONS и параметром TargetDeviceRelation.
3. Далее вызываю IoGetDeviceProperty(...) для этого PDO c DeviceProperty == DevicePropertyBootConfiguration, и уже отсюда вытаскиваю канал DMA.
На большинстве машин со встроенным пар. портом это срабатывает.
Но вот скажем на моем стареньком ноутбуке вызов IoGetDeviceProperty — отваливается с ошибкой 0xc0000034 STATUS_OBJECT_NAME_NOT_FOUND.
И у товарищей похоже теперь аналогичная проблема, после покупки 'матерей' без встроенного пар. порта и попыток использовать PCI плату с пар. портом на борту.
Ткните носом, плиз, в чем может быть проблема или как достать канал DMA другим способом.
Может проще в реестр сходить?