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

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Две одинаковые PCI платы на один драйвер  (Прочитано 10517 раз)
0 Пользователей и 1 Гость смотрят эту тему.
anatolich
Гость
« : 14-11-2006 10:54 » 

Через inf и менеджера для первой платы нормально ставится драйвер, вижу как попадаю в AddDevice и получаю ресурсы. Для второй платы все нормально ставится , но в дебагере уже ничего не видно и ресурсы на вторую плату не выделяются. Что такое хитрое нужно в DriverEntrу прописать?
Записан
Ochkarik
Модератор

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

« Ответ #1 : 14-11-2006 12:54 » 

насколько я знаю ничего. для разных плат создаются разные объекты, код один.
главное чтобы в обработке глобальных переменных не использовалось)
и со статическими переменныеми порой проблеммы бывают при инициализации, если вы их использовали.
или работают обе нормльно? и проблемма только в том что в дебагере вторую не видно?
Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
anatolich
Гость
« Ответ #2 : 15-11-2006 06:39 » 

Понемногу разбираюсь. Когда вторую плату инициализирую то в коде моего AddDevice
IoCreateDevice(
                DriverObject,
                sizeof (_DEVICE_EXTENSION),
                &ntName,
                FILE_DEVICE_UNKNOWN,
                0, // Do not use if binary intended for 9x
                FALSE,
                &deviceObject
                );
выдает status не SUCCESS. То ли из-за того, что ntName уже зарегистрирован, толи
DriverObject содержит в полях что-то не то.
Из глобальных я использую только структуру
typedef struct _my_DATA {
    UNICODE_STRING      RegistryPath;           // saved registry path
    ULONG               InstanceCount;          // FDO instance count
    USHORT              WdmVersion;             // os version
} my_DATA, *Pmy_DATA;
Записан
Ochkarik
Модератор

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

« Ответ #3 : 15-11-2006 08:23 » 

 UNICODE_STRING      RegistryPath;           // saved registry path
если хранится путь к ключу драйвера- он второй раз перезаписывается? хотя имя одно и то же должно быть.

и наконец, главное:
ntName - вы пытаетесь создать два объекта для разных плат с одним и тем же именем. естественно винда на это обидится)))

PS я думаю просто надо расширить имя добавлением номера InstanceCount (если я правильно понял)
кстати если получится, пожалуйста - выложите код которым строковую переменную сформировали. а то мне тоже надо делать - все руки не доходят со строковыми функциями разобраться С ума сойти...
точнее - надо еще символическую ссылку так же сформировать. (я с ними из приложения работаю)
« Последнее редактирование: 15-11-2006 08:32 от Ochkarik » Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
anatolich
Гость
« Ответ #4 : 16-11-2006 06:52 » 

Hi,
вот так в DDK можно конвертировать строки
UNICODE_STRING ntName = RTL_CONSTANT_STRING(L"\\Device\\MyDevice");
Это, то что я использую в IoCreateDevice.

А по моей проблеме
наши платы сделаны одинаково совершенно и при опросе из IoCreateDevice
дают одинаковый ID. Можно ли это обойти? IoCreateDeviceSecure еще строже
Записан
Ochkarik
Модератор

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

« Ответ #5 : 16-11-2006 08:36 » 

стоп)
то что у них ID одинаковый-  совершенно без разницы. платы различаются драйвером шины PCI по их месторасположению.
еще раз:
драйвер шины создает экземпляр DriverObject1 для вашего зарегестрированного драйвера и, вызывает DriverEntry для первой платы. где вы регистрите свой AddDevice.

Потом драйвер создает PhysicalDeviceObject1 (для первой платы) и вызывает ваш AddDevice.
в AddDevice вы при помощи IoCreateDevice создаете Объект-устройство N1(DeviceObject1) c симолическим именем ntName1.
и т.д.

потом драйвер шины создает второй объект PhysicalDeviceObject2 (для второй платы)
и опять вызывает AddDevice (уже для PhysicalDeviceObject2)
а вы по прежнему пытаетесь IoCreateDevice создать Объект N2(DeviceObject2) с ТЕМ же именем ntName1.
это неправильно. два различных объекта не могут иметь одно имя.
это вопервых.

во вторых  RTL_CONSTANT_STRING - макрос.

функции будут такими:
#define PCI_DEVICE_NAME L"\\Device\\MyDev_01" //имя физического устройства (device)
...
UNICODE_STRING       uniNtDeviceName;
    RtlInitUnicodeString(&uniNtDeviceName,PCI_DEVICE_NAME);

итого: для первого устройства вы должны задать имя например "\\Device\\MyDev_01".
для второго - уже MyDev_02 и т.д. для 3,4,5 и сколько плат воткнете.

так же необходимо поступать в случае если вы используете символические ссылки на объекты (IoCreateSymbolicLink) из ветки "\\DosDevices\\имя символической ссылки"

и наконец меня то интересовал как раз подход - которым вы формируете различные имена (как показывал выше) с добавлением номера платы.
а именно - преобразования из InstanceCount счетчика в строковую переменную.
типа
wsprintf(TextBuff, "\\Device\\MyDev_%.2lu", InstanceCount )  - Не понял??
потом наверное RtlInitAnsiString
потом возможно RtlAnsiStringToUnicodeString....
вот это меня и интересовало)

Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
anatolich
Гость
« Ответ #6 : 16-11-2006 13:48 » 

Вы действительно полностью правы. Большое спасибо.
А вот как это работает
UNICODE_STRING                      ntName= RTL_CONSTANT_STRING(L"\\Device\\MyDevice");
UNICODE_STRING                      win32Name = RTL_CONSTANT_STRING(L"\\??\\MyDevice");
WCHAR pszDest[30];
size_t cbDest = 30 * sizeof(WCHAR);
LPCWSTR pszFormat = L"%s%03d";
WCHAR* pszTxt = L"\\Device\\MyDevice_";
WCHAR* pszTxtW = L"\\??\\MyDevice_";
status = RtlStringCbPrintfW(pszDest, cbDest, pszFormat, pszTxt,g_Data.InstanceCount);
RtlInitUnicodeString(&ntName,pszDest);
status = RtlStringCbPrintfW(pszDest, cbDest, pszFormat, pszTxtW,g_Data.InstanceCount);
RtlInitUnicodeString(&win32Name,pszDest);
// Create our function device object.
status = IoCreateDevice(
                DriverObject,
                sizeof (My_DEVICE_EXTENSION),
                &ntName,
                FILE_DEVICE_UNKNOWN,
                FILE_DEVICE_SECURE_OPEN,   
                FALSE,   &deviceObject
                );
Записан
Ochkarik
Модератор

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

« Ответ #7 : 16-11-2006 17:16 » 

и вам сенькс! а то год уже ленюсь ядреную функцию форматирования текста в DDK найти:)
Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
Ochkarik
Модератор

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

« Ответ #8 : 17-11-2006 15:27 » 

PPS
начал у себя встраивать. помоему ntName и win32Name инициализировать необязательно теперь...
все равно будет: ntName.Buffer == pszDest
или ошибаюсь? RtlInitUnicodeString ведь память не размещает, просто поля UNICODE_STRING заполняет длинной строки, максимально возможной длинной строки и указателем на память где собственно текст содержится...
Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
Ochkarik
Модератор

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

« Ответ #9 : 17-11-2006 17:27 » 

а еще я допрыгался Прыгаем вместе... VS2003 студию уронил Главное - кучность!... теперь больше не грузится Это все.... перезагрузка Да можно... не помогает Ж...
Записан

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

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines