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

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

  1. lborokl

    lborokl New Member

    Публикаций:
    0
    Регистрация:
    13 фев 2011
    Сообщения:
    22
    Сразу извиняюсь за тупой вопрос, только начинаю и в информации некоторого рода испытываю голод.
    Если простым языком, нужно написать драйвер, чтоб висел в памяти и его експорт функции можно было использовать в обычном драйвере.
    Пример хеловёрда с драйверентри много, а такого не нашёл. Полез в вдк смотреть, как такое делают. Определил, что тип должен быть DYNLINK, хотя хз, может другой. Сделал простейший пример по сорцам, что нашёл:
    sources:
    TARGETNAME=export
    TARGETTYPE=DYNLINK

    TARGETLIBS=$(SDK_LIB_PATH)\kernel32.lib

    SOURCES=export.c
    ###################

    export.def:
    LIBRARY export

    EXPORTS
    ExpTest
    ##################
    export.c:
    #include "ntddk.h"

    NTSTATUS ExpTest(PCHAR msg)
    {

    DbgPrint(msg);

    return STATUS_SUCCESS;
    }


    Но оно, с DbgPrint не компилется, выдаёт:
    error LNK2019: unresolved external symbol _DbgPrint referenced in function _ExpTest@4

    Если убрать DbgPrint, то всё нормально.

    Плз, сильно не пинать, охото просто разобраться с примером. нечто похожего нагуглить не удалось.
     
  2. krabz

    krabz New Member

    Публикаций:
    0
    Регистрация:
    26 май 2010
    Сообщения:
    135
    ну поскольку вам kernel32.lib думаю не понадобится, попробуйте заменить его на ntoskrnl.lib в 4-й строке
     
  3. lborokl

    lborokl New Member

    Публикаций:
    0
    Регистрация:
    13 фев 2011
    Сообщения:
    22
    krabz
    Спасибо, вот так работает:
    $(SDK_LIB_PATH)\kernel32.lib
    $(SDK_LIB_PATH)\ntoskrnl.lib

    kernel32.lib всё же нужен.
    Теперь у меня на выходе получились файлы: export.dll, export.lib. И нужно как-то заставить это работать. Пишу простой драйвер:
    #include <ntddk.h>
    #pragma comment(lib, "export.lib")

    VOID DriverUnload( IN PDRIVER_OBJECT pDriverObject )
    {
    DbgPrint("unloaded\n");
    }

    NTSTATUS
    DriverEntry(
    IN PDRIVER_OBJECT pDriverObject,
    IN PUNICODE_STRING pRegistryPath
    )
    {
    DbgPrint("loaded\n");

    ExpTest("New DbgPrint!");

    pDriverObject->DriverUnload = DriverUnload;
    return STATUS_SUCCESS;
    }

    Но не получается заставить видеть мою функцию:
    error C4013: 'ExpTest' undefined; assuming extern returning int

    как extern обьявлял и хз...
     
  4. x64

    x64 New Member

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

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    это драйвер.
    Все юзермодные либы (поголовно) под запретом в ядре. Хоть kernel, хоть ntdll.
    Драйвер просто не запустится, если линкован с такой либой.
    Если нужны функции kernel32 - в ядре есть всё, к чему обращается эта либа.
     
  6. lborokl

    lborokl New Member

    Публикаций:
    0
    Регистрация:
    13 фев 2011
    Сообщения:
    22
    x64
    Ну у меня без него не линкуется.
    error LNK2019: unresolved external symbol __imp__DisableThreadLibraryCalls@4 referenced in function __DllMainCRTStartupForGS@12
    и т.д.
    cresta
    хз почему но не линкуется у меня без kernel32.lib и вообще я это в сорцах wdk подсмотрел.
     
  7. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    даже если и слинкуешь - не запустится. В этой юзермодный код не учитывает специфику ядра и приведет к неизбежному бсоду.
    DbgPrint есть в ntoskrnl, оттуда и нужно импортировать, а не из kernel32
     
  8. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.323
    бугагашечка...

    причем тут dll вообще? в ядре нет dll, есть только драйвер, тем более CRT в принципе не должна участвовать... у вас неправильные настройки проекта... в интернете куча статей про то, как в студии настроить проект для сборки драйверов... гуглите...
     
  9. lborokl

    lborokl New Member

    Публикаций:
    0
    Регистрация:
    13 фев 2011
    Сообщения:
    22
    Rel
    Драйвер я собрать могу, мне хочется использовать его как библиотеку в юзер моде, ну только это драйвер r0. В 1ом посте я описал подробно проблему. Сдаётся мне, так называемая библа и будет обычным драйвером, как только ей своим функционалом поделится...
    cresta
    Я уже понял, что пошёл не верным путём, спасибо за пояснение.
     
  10. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.323
    еще раз: в ядре нет dll и в ядре не может быть юзермодной CRT... драйвер (.sys), динамическая библиотека (.dll), исполняемый файл (.exe) и еще помоему .ocx - это все один и тот же PE-формат... они между собой различаются одним или несколькими флагами по сути дела... и драйвер может экспортировать функции для других драйверов... и вам нужно собирать драйвер...
     
  11. lborokl

    lborokl New Member

    Публикаций:
    0
    Регистрация:
    13 фев 2011
    Сообщения:
    22
    Rel
    Это как раз таки я понял))) насчёт экспорта функций не понял, беру объявляю её например:
    #ifdef __cplusplus
    extern "C" NTSTATUS ExpTest(PCHAR);
    #endif

    Загружаю драйвер в память. Потом беру компилю другой, но функция ExpTest,, не известна. Если даже предварительно объявить её с extern.
     
  12. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Делаете обычный проект драйвера. Обычный. SYS.
    И просто добавляете .def файл следующего содержания
    Код (Text):
    1. EXPORTS
    2.  func_a
    3.  func_b
    4.  ExpTest
    И ентри фнкцию пустую, она не будет никогда вызвана.

    А советских газет не читайте)

    А для экспорта:
    Код (Text):
    1. #ifdef __cplusplus
    2. #define EXPAPI extern "C"
    3. #else
    4. #define EXPAPI
    5. #endif
    6.  
    7. EXPAPI NTSTATUS ExpTest(PCHAR);
    Это нужно включить и в сорс экспортирующего драйвера, и в сорс импортирующего
     
  13. lborokl

    lborokl New Member

    Публикаций:
    0
    Регистрация:
    13 фев 2011
    Сообщения:
    22
    Great
    Спасибо, именно такой ответ и ждал.
    Сделал всё как вы написали, но что-то функция моя всё равно не линкуется.
    Експортирующий драйвер:
    Код (Text):
    1. #include<ntddk.h>
    2. #include"exp.h"
    3.  
    4. NTSTATUS
    5. DriverEntry(
    6.     IN PDRIVER_OBJECT pDriverObject,
    7.     IN PUNICODE_STRING pRegistryPath
    8.     )
    9. {
    10.     return STATUS_SUCCESS;
    11. }
    12.  
    13.  
    14. NTSTATUS ExpTest(PCHAR msg)
    15. {
    16.     DbgPrint(msg);
    17.    
    18.     return STATUS_SUCCESS;
    19. }
    export.def:
    Код (Text):
    1. EXPORTS
    2.     ExpTest
    Импортирующий драйвер:
    Код (Text):
    1. #include <ntddk.h>
    2. #include"exp.h"
    3.  
    4. VOID DriverUnload( IN PDRIVER_OBJECT pDriverObject )
    5. {
    6.     DbgPrint("unloaded\n");
    7. }
    8.  
    9. NTSTATUS
    10. DriverEntry(
    11.     IN PDRIVER_OBJECT pDriverObject,
    12.     IN PUNICODE_STRING pRegistryPath
    13.     )
    14. {
    15.     DbgPrint("loaded\n");
    16.    
    17.     ExpTest("New DbgPrint!\n"); //  !!!!!!!!!!!!!!!!
    18.    
    19.     pDriverObject->DriverUnload = DriverUnload;
    20.     return STATUS_SUCCESS;
    21. }
    exp.h:
    Код (Text):
    1. #ifdef __cplusplus
    2. #define EXPAPI extern "C"
    3. #else
    4. #define EXPAPI
    5. #endif
    6.  
    7. EXPAPI NTSTATUS ExpTest(PCHAR);
    Експортирующий загружаю с помощью kmd Manager, потом пытаюсь скомпилировать импортирующий и:
    Код (Text):
    1. error LNK2019: unresolved external symbol _ExpTest@4 referenced in function _DriverEntry@8
     
  14. Rel

    Rel Well-Known Member

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

    krabz New Member

    Публикаций:
    0
    Регистрация:
    26 май 2010
    Сообщения:
    135
    это .lib не подключен
     
  16. lborokl

    lborokl New Member

    Публикаций:
    0
    Регистрация:
    13 фев 2011
    Сообщения:
    22
    Rel
    Дык я думал есть определённые стандарты, часто в сорцах встречаются. Ваш метод похож на выкрутас какой-то, но если так принято импортировать функции из других драйверов то ок.
    krabz
    Дак у меня и нет ни какой lib, тут драйвер експортирует функцию.
     
  17. Rel

    Rel Well-Known Member

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

    Дак надо было сделать из проекта экспортирующего драйвера) но проще наверное подключить деф-файл со ссылками на модуль экспортирующего драйвера в проект импортирующего драйвера))) как то так))
     
  18. lborokl

    lborokl New Member

    Публикаций:
    0
    Регистрация:
    13 фев 2011
    Сообщения:
    22
    Rel
    Хм, теперь ясно, но всё же не ясно как это заставить работать.
    def файл втулил один и для експортирующего драйвера и для импортирующего. Быть может надо что-то в файле sources прописать дополнительно? Т.к. я компилю не в vs, а средствами build из ddk. И если я компилирую как TARGETTYPE=DRIVER, то .lib у меня соответственно нет.
     
  19. x64

    x64 New Member

    Публикаций:
    0
    Регистрация:
    29 июл 2008
    Сообщения:
    1.370
    Адрес:
    Россия
    .def-файл нужен только для экспортирующего драйвера.

    Для импортирующего драйвера необходимо указать .lib-файл:

    Код (Text):
    1. TARGETLIBS = export.lib
    Для экспортирующего драйвера правильно писать так:

    Код (Text):
    1. TARGETTYPE = EXPORT_DRIVER
     
  20. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    для lib
    TARGETTYPE=LIBRARY