Загрузчик VMM32 (NTKERN) в Win98

Тема в разделе "WASM.RESEARCH", создана пользователем Volynkin, 23 янв 2006.

  1. Volynkin

    Volynkin New Member

    Публикаций:
    0
    Регистрация:
    11 окт 2004
    Сообщения:
    30
    Есть драйвер 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 в сайсе, дамп текущих событий всегда пуст. Каким образом выяснить, что всеже приводит к ошибке загрузки драйвера?
     
  2. NullSessi0n

    NullSessi0n New Member

    Публикаций:
    0
    Регистрация:
    20 янв 2006
    Сообщения:
    322
    Как ты устанавливаешь драйвер? Если загрузка драйвера вообще не происходит, значит записи о нём некорректны либо Windows не опознаёт формат драйвера (последнее наврядли, так как ты используешь подходящую DDK). К сожалению, плохо знаком с VXD. И попробуй найти перевод сообщения с кодом 2, может тогда понятно будет в чём дело.
     
  3. infern0

    infern0 New Member

    Публикаций:
    0
    Регистрация:
    7 окт 2003
    Сообщения:
    811
    Адрес:
    Russia
    DDK может быть правильным, а вот версия VXD неверная.
     
  4. Volynkin

    Volynkin New Member

    Публикаций:
    0
    Регистрация:
    11 окт 2004
    Сообщения:
    30
    Драйвер ставлю вручную, через девайс менеджер. Драйвер WDM, не VXD, ntkern.vxd как раз и служит интерфейсом для WDM драйверов чтоб можно было кроссплатформенные WDM драйвера штамповать. Код ошибки не имеет никакого смысла... означает что файл не найден. Все файлы там где они должны быть.

    Вопрос собственно даже не в том как мне решить проблему загрузки, а в том как узнать через дебаггер что всеже ненравится этому ntkern...
     
  5. Volynkin

    Volynkin New Member

    Публикаций:
    0
    Регистрация:
    11 окт 2004
    Сообщения:
    30
    infern0

    есть у меня подозрения на формат файла... я с VXD не на ты. Тут еще есть один нюанс, существует старый драйвер для сходного устройства, писаный и компиленый не мной, поэтому сырцов к нему нет. Так вот при вскрытии IDA показывает совсем другой формат, нежеле тот что я получаю из Win98 DDK.... как выяснить не VXD ли это случаем?
     
  6. Foamplast

    Foamplast New Member

    Публикаций:
    0
    Регистрация:
    6 ноя 2003
    Сообщения:
    80
    Адрес:
    Russia
    Мужики, у меня вчера была такая же проблема. Дело в том, что в Win9X нет некоторых функций, вот дрова и не грузятся.



    А именно:



    KeEnterCriticalRegion()

    KeLeaveCriticalRegion()

    RtlCreateRegistryKey()



    и другие...



    В книге "Programming The Windows Driver Model" это описано и даже сказано, что автор написал свой VXD, который якобы некоторые из отсутсвующих функций эмулирует. У меня книга есть, а кода нету, так что поверьте на слово.
     
  7. Volynkin

    Volynkin New Member

    Публикаций:
    0
    Регистрация:
    11 окт 2004
    Сообщения:
    30
    Foamplast

    хмм... однако сайс не вываливается по int3 даже на DriverEntry, никакой вызов функций оттуда не происходит. Значит ntkern проверяет таблицу импорта драйвера при загрузке и если находит чтото нето, просто не загружает...

    Возможно.



    Спасибо за наводку, вечером почитаю книжку, в какой главе про это сказано?



    И все же интересно, почему .NTKERN дамп в сайсе мне ничего не выдает...ведь должен?
     
  8. Foamplast

    Foamplast New Member

    Публикаций:
    0
    Регистрация:
    6 ноя 2003
    Сообщения:
    80
    Адрес:
    Russia
    "и если находит чтото нето, просто не загружает" - естественно. Разрешение имён функций в адреса должно происходить ДО выполнения кода. В общем у меня тоже до DriverEntry() дело не доходило и я написал простейший драйвер, который заявляет о успешной загрузке записью в реестр. Он точно работает под 98. См. приложение.



    Кстати я не нашёл ничего похожего на DbgPrint() для 98. DbgView от Sysinternals пишет, что может захватывать Out_Debug_String(), однако никакого описания в DDK я не нашёл, поэтому драйвер пишет в реестр. Для успешного выполнения нужно создать ключ "HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\XSERV

    ".

    [​IMG] _1908087031__testwdm.zip
     
  9. _BC_

    _BC_ БЦ

    Публикаций:
    0
    Регистрация:
    20 янв 2005
    Сообщения:
    759
    ещё оттуда:



    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.
     
  10. Volynkin

    Volynkin New Member

    Публикаций:
    0
    Регистрация:
    11 окт 2004
    Сообщения:
    30
    проверил таблицу импорта... все чисто. WDMCHECK из книги также ничего не показал. Видимо чтото другое.



    Foamplast

    Твой тест драйвер загрузился без проблем, не смотря на то что у него таблица импорта идет в начале файла. Видимо чтото еще... Читаю книгу, но на первый взгляд ничего.



    Продолжаю эксперименты...
     
  11. Foamplast

    Foamplast New Member

    Публикаций:
    0
    Регистрация:
    6 ноя 2003
    Сообщения:
    80
    Адрес:
    Russia
    Раз есть драйвер, который грузится без проблем и отличающийся от него драйвер, который не грузится, то необходимо проверить 2 вещи:



    1) Синтаксис INF файла. Для Win9X должны быть отдельные разделы и другая "сигнатура" (CHICAGO вместо WindowsNT).



    2) И всё-таки наличие функций, импортируемых из "ядра". У меня именно за-за этого до DriverEntry() дело не доходило.
     
  12. Volynkin

    Volynkin New Member

    Публикаций:
    0
    Регистрация:
    11 окт 2004
    Сообщения:
    30
    Все проблемы разрешились. Выяснилось вся заморочка была в проблемном USBD.sys на Win98.

    Идем по порядку:



    Методом проб и ошибок нахожу что мой драйвер не грузится при вызове USBD_ParseConfigurationDescriptorEx, этот вызов приводит к usbd.sys, драйверу поддержки USB в винде. Однако как упоминал ранее, у меня был старый схожий драйвер (от cypress), который работает под Win98 нормально имея тот же вызов к USBD. Вскрытие старого и нового драйвера Идой показало, что все вызовы к USBD кроме USBD_GetUSBDIVersion имеют различную структуру в таблице импорта, а именно:



    Старый рабочий драйвер имел
    Код (Text):
    1.  
    2. ; __stdcall USBD_CreateConfigurationRequestEx(x,x)
    3.                 extrn _USBD_CreateConfigurationRequestEx@8:dword
    4.  




    А новый нерабочий драйвер:
    Код (Text):
    1.  
    2. extrn USBD_ParseConfigurationDescriptorEx:dword
    3.  




    Похоже Win98 USBD не принимает вызовы без __stdcall...



    Идем далее, той же идой вскрываем USBD.SYS для винды 98 и XP, и идем прямо в таблицу экспорта:



    USBD.SYS Win98:
    Код (Text):
    1.  
    2. Exported entry  21. _USBD_ParseConfigurationDescriptorEx@28
    3.  




    USBD.SYS WinXP:
    Код (Text):
    1.  
    2. ; Exported entry   2. USBD_ParseConfigurationDescriptorEx
    3. ; Exported entry  26. _USBD_ParseConfigurationDescriptorEx@28
    4.  




    Просто замечательно! похоже Win98 не имеет представления о существовании USBD_ParseConfigurationDescriptorEx (как собственно и многих других USBD функций), в то время как WinXP принимает и обрабатывает оба формата.



    Дальнейшее исследование гуглом приводик к посту Вальтера Оней (того самого кто написал книжку по разработке дров) на osronline http://www.osronline.com/lists_archive/ntdev/thread7263.html







    В итоге замена существующего usbd.lib в WINXP DDK, старой либой из WIN98 DDK решила все мои проблемы совместимости. При замене либы, вызовы компилируются в формат типа _USBD_ParseConfigurationDescriptorEx@28, поддерживаемый всеми платформами.



    Всем ответившим спасибо за идеи. Надеюсь мое пояснение избавит других от головной боли в будущем.
     
  13. CARDINAL

    CARDINAL Member

    Публикаций:
    0
    Регистрация:
    23 янв 2004
    Сообщения:
    551
    Адрес:
    Moscow
    мда.... вообщето как бы внимательней ДДК 98 читать надо )о соглашениях вызова функций
     
  14. Volynkin

    Volynkin New Member

    Публикаций:
    0
    Регистрация:
    11 окт 2004
    Сообщения:
    30




    ну да, вот только это как бы не решит мою проблему... я как бы не разрабатываю драйвера для Win98, однако нужна совместимость с этой осью... компилиться и работать все должно WinXP DDK...