Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Как "захватить" ресурсы портов в ОС Win XP?  (Прочитано 9901 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Vitaly
Гость
« : 15-04-2007 16:12 » 

Подскажите пожалуйста!

У меня не PnP ISA-плата. Как "захватить" ресурсы портов в ОС Win XP? Я использовал ф-цию
IoReportDetectedDevice. Может быть я неправильно передаю параметры.
« Последнее редактирование: 15-04-2007 18:31 от Vitaly » Записан
Ochkarik
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #1 : 16-04-2007 10:38 » 

на практике не сталкивался, но судя по описанию IoReportDetectedDevice - пододит.
а насчет правильно или нет - нужны поясления, что именно и где вы делаете.
Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
Vitaly
Гость
« Ответ #2 : 17-04-2007 16:19 » 

Мне непонятно, как использовать последний параметр ф-ции IoReportDetectedDevice?
В Win DDK 2000 он указан как входной/выходной (IN OUT PDEVICE_OBJECT  DeviceObject).
Я так понял, если DeviceObject=NULL, то PnP менеджер создает новый PDO и возвращает его
в этом параметре, т.е. DeviceObject является выходным.
Вопрос. Где его использовать? Куда его нужно передать?
А если использовать как входной параметр, как получить его?
Записан
Ochkarik
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #3 : 18-04-2007 10:43 » 

я так понимаю что в вашем случае плата драйвером шины не обнаруживается, следовательно PDO для нее еще не создано. а раз так - вы его и должны создать.
насчет того где - в DDK рекомендуют "A driver typically calls this routine from its DriverEntry routine. A few drivers, like certain NDIS or EISA drivers, might call this routine from an AddDevice routine." думаю что скорее в DriverEntry.

а вообще... в DDK пример есть! вы его смотрели?
DDK\src\kernel\serial\
Код:
DriverEntry:

      newPdo = NULL;
      status = IoReportDetectedDevice(
                   DriverObject,
                   InterfaceTypeUndefined,
                   -1,
                   -1,
                   resourceList,
                   pRequiredList,
                   FALSE,
                   &newPdo
               );
      lowerDevice = IoAttachDeviceToDeviceStack(newDevObj, newPdo);
« Последнее редактирование: 18-04-2007 10:52 от Ochkarik » Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
Vitaly
Гость
« Ответ #4 : 19-04-2007 16:48 » 

Здравствуйте Ochkarik!
В DDK ..\serial я смотрел этот пример, тем более, что этот пример единственный и очень сложный, где используется IoReportDetectedDevice. Вызывал ф-цию  из DriverEntry().
Но когда я устанавливал свой драйвер B_026.sys с помощью B_026.inf файла ( inf-файл я немного переделал из inf-файла  DDK ..\portio )Диспетчер устройств прописывал два драйвера:
один ROOT\Unknown\0000, другой ROOT\B_026\0000. У первого драйвера зарегистрированы порты,
которые я указал в ResourceList. Может быть ненадо создавать новый PDO, а как-то получить PDO?
 
Записан
Ochkarik
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #5 : 20-04-2007 08:36 » new

да не такой он сложный. просто не надо на подробности его работы внимания обращать)) только то что надо.
получить... не получится) потому что никто об этом оборудовании кроме вас не знает. соответственно и не найдет. по идее PDO должен создавать драйвер шины. если он в курсе происходящего.
а строка ключик ROOT\Unknown\0000 появился потому, что скорее всего вы вызвали IoReportDetectedDevice со вторым параметром InterfaceTypeUndefined. если он вас так смущает - попробуйте поменять тип интерфейса на Isa из варинатов INTERFACE_TYPE.
и еще... из каких разделов ключи? оба в HKEY_CURRENT_CONFIG\System\CurrentControlSet\Enum?
или HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum
« Последнее редактирование: 20-04-2007 08:40 от Ochkarik » Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
Vitaly
Гость
« Ответ #6 : 20-04-2007 15:46 » 

Здравствуйте Ockarik!
Сегодня на работе вроде как получилось. Насколько это правильно - незнаю.
Сам драйвер "в стиле-NT ", т.е. я не обрабатываю IOCTL_MJ_PNP запросы, а также
нет ф-ции AddDevice. Но сегодня я добавил эту функцию и вызвал IoReportDetectedDevice()
после IoCreatDevice(), а параметр PDO получил от входного параметра  AddDevice.
В диспетчере устройств прописался мой драйвер с указанными реусрсами. Но!
Когда я стал обращаться к нему через консольную программу, консольная программа возвращала
ошибку CreateFile(), т.е. нету доступа к драйверу. Прада я "не причесывал" драйвер, может быть где-то ошибка. О результатах напишу.
Записан
Ochkarik
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #7 : 21-04-2007 11:09 » 

по поводу имени... вы символическую ссылку как создали?
я обычно делаю так:
Код:
#define PCI_DEVICE_NAME_1   L"\\Device\\имя_1" //имя физического устройства (device)
#define DOS_DEVICE_NAME_1   L"\\DosDevices\\имя_драйвера_1"


    RtlInitUnicodeString(&uniNtDeviceName,PCI_DEVICE_NAME_1);
    status = IoCreateDevice(    DriverObject,
                sizeof(DEVICE_EXTENSION_MY),
                &uniNtDeviceName,       //имя
                FILE_DEVICE_UNKNOWN,    //тип
                0,                      //FILE_AUTOGENERATED_DEVICE_NAME, //характеристики
                FALSE,          //эксклюзивность процесса(толкьо один handle)
                &DeviceObject);

        RtlInitUnicodeString(&uniWin32NameString, DOS_DEVICE_NAME_1);
        status = IoCreateSymbolicLink(&uniWin32NameString,&uniNtDeviceName);

обращаюсь по DOS_DEVICE_NAME_1
а проверить - запустите DDK3790.1830\tools\devicetree\x86\devicetree.exe
и посмотрите зарегистрированные имена.
вторая причина в DriverEntry должны быть определены:     
DriverObject->MajorFunction[IRP_MJ_CREATE]
и IRP_MJ_CLOSE, IRP_MJ_READ, IRP_MJ_WRITE (или IRP_MJ_DEVICE_CONTROL) смотря как интерфейс писать.
PS ну и само собой без ошибок в них)
« Последнее редактирование: 21-04-2007 11:15 от Ochkarik » Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
Vitaly
Гость
« Ответ #8 : 24-04-2007 16:21 » 

Здравствуй Ochkarik!
Нашел свою ошибку. Я не инициализировал одну переменную в DeviceExtension структуре.
Ochkarik, СПАСИБО за участие!
« Последнее редактирование: 24-04-2007 16:22 от Vitaly » Записан
Ochkarik
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #9 : 27-04-2007 08:53 » 

всегда пожалуйста)
Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines