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

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Как "захватить" ресурсы портов в ОС Win XP?  (Прочитано 9829 раз)
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 » 

да не такой он сложный. просто не надо на подробности его работы внимания обращать)) только то что надо.
получить... не получится) потому что никто об этом оборудовании кроме вас не знает. соответственно и не найдет. по идее 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