parport.sys, ECP mode & DMA
От: imhotep  
Дата: 13.08.07 11:24
Оценка:
Здравствуйте.

Вопрос собственно такой:
Как в 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 другим способом.
Может проще в реестр сходить?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.