Драйвер библа r0

Тема в разделе "WASM.NT.KERNEL", создана пользователем lborokl, 13 фев 2011.

  1. x64

    x64 New Member

    Публикаций:
    0
    Регистрация:
    29 июл 2008
    Сообщения:
    1.370
    Адрес:
    Россия
    Во-первых, не LIBRARY, а DRIVER_LIBRARY, во-вторых автору нужен не статический .lib (т.е. содержащий непосредственно код), а экспортирующий .sys, т.е. тип надо выставлять в EXPORT_DRIVER.
     
  2. lborokl

    lborokl New Member

    Публикаций:
    0
    Регистрация:
    13 фев 2011
    Сообщения:
    22
    x64
    Спасибо! С твоими параметрами всё скомпилировалось. Но, когда я пытаюсь заргрузить драйвер в память, то он не загружается, код ошибки "Не удаётся найти указанный файл".При этом експортирующий находится в памяти. Я так понимаю это мой .lib.. Но я его положил в одну директорию с импортирующим драйвером и один фиг. Если закоментить функцию ExpTest, то импортирующий драйвер запускается, где он ищет мой .lib не пойму.

    Хотя .lib нужен на стадии компоновки и он выполняет свою задачу. Может експортирующий драйвер нужно запускать с определёнными параметрами, отличными от тех, что нужны для обычного драйвера, который ни чего не экспортирует.
     
  3. x64

    x64 New Member

    Публикаций:
    0
    Регистрация:
    29 июл 2008
    Сообщения:
    1.370
    Адрес:
    Россия
  4. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.323
    с помощью деф-файла можно сделать и импорты)))
     
  5. lborokl

    lborokl New Member

    Публикаций:
    0
    Регистрация:
    13 фев 2011
    Сообщения:
    22
    x64
    хм, сделал такое объявление для експорта:
    Код (Text):
    1. EXPAPI DECLSPEC_EXPORT NTSTATUS ExpTest(PCHAR);
    и такое для импорта:
    Код (Text):
    1. EXPAPI DECLSPEC_IMPORT NTSTATUS ExpTest(PCHAR);
    В sources экспорта:
    Код (Text):
    1. TARGETNAME=export
    2. TARGETTYPE=EXPORT_DRIVER
    3.            
    4. DLLDEF=export.def
    5. SOURCES=export.c
    В sources импорта:
    Код (Text):
    1. TARGETNAME=test_exp
    2. TARGETTYPE=DRIVER
    3.  
    4. TARGETLIBS = export.lib
    5. SOURCES=test_exp.c
    Делу это не помогло. По ссылке, что ты дал, написано, что в драйвере экспорта нужно использовать DllInitialize и DllUnload, а сам драйвер должен находится в \ System32 \ Drivers. Но DriverEntry всё равно нужно использовать для удовлетворения сборки. Тогда я не пойму как драйвер экспорта будет загружаться? каждый раз как только загружается драйвер импорта? или его нужно самому загружать?
     
  6. x64

    x64 New Member

    Публикаций:
    0
    Регистрация:
    29 июл 2008
    Сообщения:
    1.370
    Адрес:
    Россия
    Всё вроде верно.

    Что именно сейчас происходит не так? Какая ошибка?

    Верно, согласно документации, всё это обязательно.

    Да.

    Да.
     
  7. lborokl

    lborokl New Member

    Публикаций:
    0
    Регистрация:
    13 фев 2011
    Сообщения:
    22
    Да тоже самое всё "Не удаётся найти указанный файл". Опишу подробно что делал, с полным кодом.
    Компилирую драйвер экспорта:
    export.c:
    Код (Text):
    1. #include<ntddk.h>
    2.  
    3. #ifdef __cplusplus
    4. #define EXPAPI extern "C"
    5. #else
    6. #define EXPAPI
    7. #endif
    8.  
    9.  
    10. #ifndef DECLSPEC_EXPORT
    11. #define DECLSPEC_EXPORT __declspec(dllexport)
    12. #endif
    13.  
    14. EXPAPI DECLSPEC_EXPORT NTSTATUS ExpTest(PCHAR);
    15.  
    16.  
    17. NTSTATUS
    18. DriverEntry(
    19.     IN PDRIVER_OBJECT pDriverObject,
    20.     IN PUNICODE_STRING pRegistryPath
    21.     )
    22. {
    23.     return STATUS_SUCCESS;
    24. }
    25.  
    26.  
    27. NTSTATUS DllUnload(void)
    28. {
    29.     return STATUS_SUCCESS;
    30. }
    31.  
    32. NTSTATUS DllInitialize(
    33.   __in  PUNICODE_STRING RegistryPath
    34. )
    35. {
    36.     return STATUS_SUCCESS;
    37. }
    38.  
    39.  
    40. NTSTATUS ExpTest(PCHAR msg)
    41. {
    42.  
    43.     DbgPrint(msg);
    44.    
    45.   return STATUS_SUCCESS;
    46. }
    sources:
    Код (Text):
    1. TARGETNAME=export
    2. TARGETTYPE=EXPORT_DRIVER
    3.            
    4. DLLDEF=export.def
    5. SOURCES=export.c
    export.def:
    Код (Text):
    1. EXPORTS
    2.     ExpTest
    Скомпилировал, кладу export.sys в \system32\drivers\, а export.lib в директорию с драйвером импорта.
    Компилирую драйвер импорта:
    test_exp.c:
    Код (Text):
    1. #include <ntddk.h>
    2. #include<Ntdef.h>
    3.  
    4. #ifdef __cplusplus
    5. #define EXPAPI extern "C"
    6. #else
    7. #define EXPAPI
    8. #endif
    9.  
    10.  
    11. EXPAPI DECLSPEC_IMPORT NTSTATUS ExpTest(PCHAR);
    12.  
    13.  
    14. VOID DriverUnload( IN PDRIVER_OBJECT pDriverObject )
    15. {
    16.     DbgPrint("unloaded\n");
    17. }
    18.  
    19. NTSTATUS
    20. DriverEntry(
    21.     IN PDRIVER_OBJECT pDriverObject,
    22.     IN PUNICODE_STRING pRegistryPath
    23.     )
    24. {
    25.     DbgPrint("loaded\n");
    26.    
    27.     ExpTest("New DbgPrint!\n");
    28.    
    29.     pDriverObject->DriverUnload = DriverUnload;
    30.     return STATUS_SUCCESS;
    31. }
    sources:
    Код (Text):
    1. TARGETNAME=test_exp
    2. TARGETTYPE=DRIVER
    3.  
    4. TARGETLIBS=export.lib
    5. SOURCES=test_exp.c
    Скомпилировал. Загружаю test_exp.sys с помощью kmd manager, run-->"Не удаётся найти указанный файл". я так понимаю, он export.sys не может найти, но почему.

    P.S: DllInitialize/DllUnload я думаю там используется как флаг загрузки/выгрузки драйвера.
     
  8. x64

    x64 New Member

    Публикаций:
    0
    Регистрация:
    29 июл 2008
    Сообщения:
    1.370
    Адрес:
    Россия
    lborokl
    Проверь (например, Dependency Walker-ом), что export.sys действительно экспортирует функцию ExpTest(), мало ли. То же самое проверь и для драйвера, который импортирует функции. На всякий случай, попробуй ещё в export.def задать директиву NAME; вряд ли это на что-то повлияет, но не помешает точно. А так я лично пока не вижу проблем у тебя, должно работать. Единственное, что смущает, что ты в этом проекте используешь сразу два метода экспорта: через __declspec(dllexport) и через .def-файл. Я всегда делал через .def-файл и этого более чем достаточно, попробуй выкинуть из кода вообще все __declspec(...) и всё, что с ними связано.
     
  9. lborokl

    lborokl New Member

    Публикаций:
    0
    Регистрация:
    13 фев 2011
    Сообщения:
    22
    Действительно, программа показала интересную картину у импортирующего драйвера:
    [​IMG]
    почему dll? и что за директория? Почему-то не верно всё прописывается, а почему? хз... Какбуд-то я функции не из драйвера импортирую, а с чего-то юзермодного.
     
  10. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.323
    наверное деф-файл не верен... попробуй прописать LIBRARY EXPORT.SYS... и еще ординал попробуй поставить к функции ExpTest...
     
  11. x64

    x64 New Member

    Публикаций:
    0
    Регистрация:
    29 июл 2008
    Сообщения:
    1.370
    Адрес:
    Россия
    Да, это может помочь в данном случае.
    После этого собрать и ещё раз проверить Dependency Walker-ом.
     
  12. lborokl

    lborokl New Member

    Публикаций:
    0
    Регистрация:
    13 фев 2011
    Сообщения:
    22
    дык деф файл у меня тока у драйвера экспорта, Dependency Walker там всё нормально отобразил.
    а где это прописать, в сорсе или деф -файле? попробовал, не поменялось.
     
  13. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.323
    дык либ-файл генерируется по деф-файлу... импорт неправильно генерируется потому, что неправильный либ-файл,потому что неправильный деф-файл...

    первой строкой деф-файла...
     
  14. lborokl

    lborokl New Member

    Публикаций:
    0
    Регистрация:
    13 фев 2011
    Сообщения:
    22
    Rel
    =(
    Скомпилил lib с новым def файлом, кинул lib к драйвероу импорта, скомпилил его, изменений нет.
    Может кому не лень попробовать это скомпилировать? исходные файлы все приложены...
    вера умирает, но всё же.. как мне явно задать ординал 1, в експорте он отображается.
     
  15. krabz

    krabz New Member

    Публикаций:
    0
    Регистрация:
    26 май 2010
    Сообщения:
    135
    дык где они приложены? уже самому хочется взглянуть что там за шляпа-то такая
     
  16. lborokl

    lborokl New Member

    Публикаций:
    0
    Регистрация:
    13 фев 2011
    Сообщения:
    22
  17. krabz

    krabz New Member

    Публикаций:
    0
    Регистрация:
    26 май 2010
    Сообщения:
    135
    у меня всё скомпилировалось и завелось как надо.
    ничего не менял, только компилировал батниками вот такого содержания:
    Код (Text):
    1. C:
    2. cd \winddk\7600.16385.1\bin
    3. setenv.bat C:\winddk\7600.16385.1 fre WXP no_oacr && D: && cd \tmp\libdriver\export && build
    Код (Text):
    1. C:
    2. cd \winddk\7600.16385.1\bin
    3. setenv.bat C:\winddk\7600.16385.1 fre WXP no_oacr && D: && cd \tmp\libdriver\import && build
     
  18. x64

    x64 New Member

    Публикаций:
    0
    Регистрация:
    29 июл 2008
    Сообщения:
    1.370
    Адрес:
    Россия
    Поднял таки свои старые исходники.
    Расширение файла-образа экспорт-драйвера должно быть .dll.
    Это правило жёстко зашито в ядре, обычное .sys здесь не подходит.
    Экспорт-драйвер регистрировать и запускать не нужно, это будет сделано автоматически.
    Минимально рабочий исходник для экспортирующего и импортирующего драйверов брать здесь.
     
  19. krabz

    krabz New Member

    Публикаций:
    0
    Регистрация:
    26 май 2010
    Сообщения:
    135
    Дык у меня собралось и запустилось. Кинул оба драйвера в system32/drivers, и через NtLoadDriver запустил импортирующий. Запустился нормально и вывел строку. Windows XP SP3.
     
  20. x64

    x64 New Member

    Публикаций:
    0
    Регистрация:
    29 июл 2008
    Сообщения:
    1.370
    Адрес:
    Россия
    Проверь таблицу импорта импортирующего драйвера, что там?