Есть драйвер USB девайся написаный для WinXP и Win98... Драйвер WDM один для обеих платформ. Компилю в WinXPDDK и Win98DDK без проблем, все прекрасно работает под XP, однако не желает на Win98. При установке драйвера система пишет ошибку (Code 2) NTKERN.VXD device loader(s) for this device could not load the device driver. Проверку делаю из под VMWare/Win98SE сайсом из пакета 2.7 версии 4.05 по мойму. Сайс со скрипом, но всеже работает во всем этом бардаке. Это все предисловие, теперь вопрос: Выясняю, что вход в драйвер не происходит никаким образом, ошибка идет гдето в VMM32 при загрузке моего драйвера. Проблема в том, что на запрос .NTKERN в сайсе, дамп текущих событий всегда пуст. Каким образом выяснить, что всеже приводит к ошибке загрузки драйвера?
Как ты устанавливаешь драйвер? Если загрузка драйвера вообще не происходит, значит записи о нём некорректны либо Windows не опознаёт формат драйвера (последнее наврядли, так как ты используешь подходящую DDK). К сожалению, плохо знаком с VXD. И попробуй найти перевод сообщения с кодом 2, может тогда понятно будет в чём дело.
Драйвер ставлю вручную, через девайс менеджер. Драйвер WDM, не VXD, ntkern.vxd как раз и служит интерфейсом для WDM драйверов чтоб можно было кроссплатформенные WDM драйвера штамповать. Код ошибки не имеет никакого смысла... означает что файл не найден. Все файлы там где они должны быть. Вопрос собственно даже не в том как мне решить проблему загрузки, а в том как узнать через дебаггер что всеже ненравится этому ntkern...
infern0 есть у меня подозрения на формат файла... я с VXD не на ты. Тут еще есть один нюанс, существует старый драйвер для сходного устройства, писаный и компиленый не мной, поэтому сырцов к нему нет. Так вот при вскрытии IDA показывает совсем другой формат, нежеле тот что я получаю из Win98 DDK.... как выяснить не VXD ли это случаем?
Мужики, у меня вчера была такая же проблема. Дело в том, что в Win9X нет некоторых функций, вот дрова и не грузятся. А именно: KeEnterCriticalRegion() KeLeaveCriticalRegion() RtlCreateRegistryKey() и другие... В книге "Programming The Windows Driver Model" это описано и даже сказано, что автор написал свой VXD, который якобы некоторые из отсутсвующих функций эмулирует. У меня книга есть, а кода нету, так что поверьте на слово.
Foamplast хмм... однако сайс не вываливается по int3 даже на DriverEntry, никакой вызов функций оттуда не происходит. Значит ntkern проверяет таблицу импорта драйвера при загрузке и если находит чтото нето, просто не загружает... Возможно. Спасибо за наводку, вечером почитаю книжку, в какой главе про это сказано? И все же интересно, почему .NTKERN дамп в сайсе мне ничего не выдает...ведь должен?
"и если находит чтото нето, просто не загружает" - естественно. Разрешение имён функций в адреса должно происходить ДО выполнения кода. В общем у меня тоже до DriverEntry() дело не доходило и я написал простейший драйвер, который заявляет о успешной загрузке записью в реестр. Он точно работает под 98. См. приложение. Кстати я не нашёл ничего похожего на DbgPrint() для 98. DbgView от Sysinternals пишет, что может захватывать Out_Debug_String(), однако никакого описания в DDK я не нашёл, поэтому драйвер пишет в реестр. Для успешного выполнения нужно создать ключ "HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\XSERV ". _1908087031__testwdm.zip
ещё оттуда: Windows 98/Me Compatibility Notes Windows 98/Me handles some of the details surrounding device object creation and driver loading differently than Windows XP. This section explains the differences that might affect your driver. I’ve already mentioned a few of these, but repetition can’t hurt. Differences in DriverEntry Call As I indicated earlier, the DriverEntry routine receives a UNICODE_STRING argument naming the service key for the driver. In Windows XP, the string is a full registry path of the form \Registry\Machine\System\CurrentControlSet\Services\xxx (where xxx is the name of the service entry for your driver). In Windows 98/Me, however, the string is of the form System\CurrentControlSet\Services\<classname >\<instance#> (where <classname> is the class name of your device and <instance#> is an instance number such as 0000 indicating which device of that class you happen to be). You can open the key in either environment by calling ZwOpenKey, however. DriverUnload Windows 98/Me will call DriverUnload within a call to IoDeleteDevice that occurs within DriverEntry. You care about this only if (1) your DriverEntry function calls IoCreateDevice and then (2) decides to return an error status, whereupon it (3) cleans up by calling IoDeleteDevice. The \GLOBAL?? Directory Windows 98/Me doesn’t understand the directory name \GLOBAL??. Consequently, you need to put symbolic link names in the \DosDevices directory. You can use \DosDevices in Windows XP also because it’s a symbolic link to the \?? directory, whose (virtual) contents include \GLOBAL??. Unimplemented Device Types Windows 98 didn’t support creating device objects for mass storage devices. These are devices with types FILE_DEVICE_DISK, FILE_DEVICE_TAPE, FILE_DEVICE_CD_ROM, and FILE_DEVICE_VIRTUAL_DISK. You can call IoCreateDevice, and it will even return with a status code of STATUS_SUCCESS, but it won’t have actually created a device object or modified the PDEVICE_OBJECT variable whose address you gave as the last argument.
проверил таблицу импорта... все чисто. WDMCHECK из книги также ничего не показал. Видимо чтото другое. Foamplast Твой тест драйвер загрузился без проблем, не смотря на то что у него таблица импорта идет в начале файла. Видимо чтото еще... Читаю книгу, но на первый взгляд ничего. Продолжаю эксперименты...
Раз есть драйвер, который грузится без проблем и отличающийся от него драйвер, который не грузится, то необходимо проверить 2 вещи: 1) Синтаксис INF файла. Для Win9X должны быть отдельные разделы и другая "сигнатура" (CHICAGO вместо WindowsNT). 2) И всё-таки наличие функций, импортируемых из "ядра". У меня именно за-за этого до DriverEntry() дело не доходило.
Все проблемы разрешились. Выяснилось вся заморочка была в проблемном USBD.sys на Win98. Идем по порядку: Методом проб и ошибок нахожу что мой драйвер не грузится при вызове USBD_ParseConfigurationDescriptorEx, этот вызов приводит к usbd.sys, драйверу поддержки USB в винде. Однако как упоминал ранее, у меня был старый схожий драйвер (от cypress), который работает под Win98 нормально имея тот же вызов к USBD. Вскрытие старого и нового драйвера Идой показало, что все вызовы к USBD кроме USBD_GetUSBDIVersion имеют различную структуру в таблице импорта, а именно: Старый рабочий драйвер имел Код (Text): ; __stdcall USBD_CreateConfigurationRequestEx(x,x) extrn _USBD_CreateConfigurationRequestEx@8:dword А новый нерабочий драйвер: Код (Text): extrn USBD_ParseConfigurationDescriptorEx:dword Похоже Win98 USBD не принимает вызовы без __stdcall... Идем далее, той же идой вскрываем USBD.SYS для винды 98 и XP, и идем прямо в таблицу экспорта: USBD.SYS Win98: Код (Text): Exported entry 21. _USBD_ParseConfigurationDescriptorEx@28 USBD.SYS WinXP: Код (Text): ; Exported entry 2. USBD_ParseConfigurationDescriptorEx ; Exported entry 26. _USBD_ParseConfigurationDescriptorEx@28 Просто замечательно! похоже Win98 не имеет представления о существовании USBD_ParseConfigurationDescriptorEx (как собственно и многих других USBD функций), в то время как WinXP принимает и обрабатывает оба формата. Дальнейшее исследование гуглом приводик к посту Вальтера Оней (того самого кто написал книжку по разработке дров) на osronline http://www.osronline.com/lists_archive/ntdev/thread7263.html В итоге замена существующего usbd.lib в WINXP DDK, старой либой из WIN98 DDK решила все мои проблемы совместимости. При замене либы, вызовы компилируются в формат типа _USBD_ParseConfigurationDescriptorEx@28, поддерживаемый всеми платформами. Всем ответившим спасибо за идеи. Надеюсь мое пояснение избавит других от головной боли в будущем.
ну да, вот только это как бы не решит мою проблему... я как бы не разрабатываю драйвера для Win98, однако нужна совместимость с этой осью... компилиться и работать все должно WinXP DDK...