Сразу извиняюсь за тупой вопрос, только начинаю и в информации некоторого рода испытываю голод. Если простым языком, нужно написать драйвер, чтоб висел в памяти и его експорт функции можно было использовать в обычном драйвере. Пример хеловёрда с драйверентри много, а такого не нашёл. Полез в вдк смотреть, как такое делают. Определил, что тип должен быть 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, то всё нормально. Плз, сильно не пинать, охото просто разобраться с примером. нечто похожего нагуглить не удалось.
ну поскольку вам kernel32.lib думаю не понадобится, попробуйте заменить его на ntoskrnl.lib в 4-й строке
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 обьявлял и хз...
это драйвер. Все юзермодные либы (поголовно) под запретом в ядре. Хоть kernel, хоть ntdll. Драйвер просто не запустится, если линкован с такой либой. Если нужны функции kernel32 - в ядре есть всё, к чему обращается эта либа.
x64 Ну у меня без него не линкуется. error LNK2019: unresolved external symbol __imp__DisableThreadLibraryCalls@4 referenced in function __DllMainCRTStartupForGS@12 и т.д. cresta хз почему но не линкуется у меня без kernel32.lib и вообще я это в сорцах wdk подсмотрел.
даже если и слинкуешь - не запустится. В этой юзермодный код не учитывает специфику ядра и приведет к неизбежному бсоду. DbgPrint есть в ntoskrnl, оттуда и нужно импортировать, а не из kernel32
бугагашечка... причем тут dll вообще? в ядре нет dll, есть только драйвер, тем более CRT в принципе не должна участвовать... у вас неправильные настройки проекта... в интернете куча статей про то, как в студии настроить проект для сборки драйверов... гуглите...
Rel Драйвер я собрать могу, мне хочется использовать его как библиотеку в юзер моде, ну только это драйвер r0. В 1ом посте я описал подробно проблему. Сдаётся мне, так называемая библа и будет обычным драйвером, как только ей своим функционалом поделится... cresta Я уже понял, что пошёл не верным путём, спасибо за пояснение.
еще раз: в ядре нет dll и в ядре не может быть юзермодной CRT... драйвер (.sys), динамическая библиотека (.dll), исполняемый файл (.exe) и еще помоему .ocx - это все один и тот же PE-формат... они между собой различаются одним или несколькими флагами по сути дела... и драйвер может экспортировать функции для других драйверов... и вам нужно собирать драйвер...
Rel Это как раз таки я понял))) насчёт экспорта функций не понял, беру объявляю её например: #ifdef __cplusplus extern "C" NTSTATUS ExpTest(PCHAR); #endif Загружаю драйвер в память. Потом беру компилю другой, но функция ExpTest,, не известна. Если даже предварительно объявить её с extern.
Делаете обычный проект драйвера. Обычный. SYS. И просто добавляете .def файл следующего содержания Код (Text): EXPORTS func_a func_b ExpTest И ентри фнкцию пустую, она не будет никогда вызвана. А советских газет не читайте) А для экспорта: Код (Text): #ifdef __cplusplus #define EXPAPI extern "C" #else #define EXPAPI #endif EXPAPI NTSTATUS ExpTest(PCHAR); Это нужно включить и в сорс экспортирующего драйвера, и в сорс импортирующего
Great Спасибо, именно такой ответ и ждал. Сделал всё как вы написали, но что-то функция моя всё равно не линкуется. Експортирующий драйвер: Код (Text): #include<ntddk.h> #include"exp.h" NTSTATUS DriverEntry( IN PDRIVER_OBJECT pDriverObject, IN PUNICODE_STRING pRegistryPath ) { return STATUS_SUCCESS; } NTSTATUS ExpTest(PCHAR msg) { DbgPrint(msg); return STATUS_SUCCESS; } export.def: Код (Text): EXPORTS ExpTest Импортирующий драйвер: Код (Text): #include <ntddk.h> #include"exp.h" 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!\n"); // !!!!!!!!!!!!!!!! pDriverObject->DriverUnload = DriverUnload; return STATUS_SUCCESS; } exp.h: Код (Text): #ifdef __cplusplus #define EXPAPI extern "C" #else #define EXPAPI #endif EXPAPI NTSTATUS ExpTest(PCHAR); Експортирующий загружаю с помощью kmd Manager, потом пытаюсь скомпилировать импортирующий и: Код (Text): error LNK2019: unresolved external symbol _ExpTest@4 referenced in function _DriverEntry@8
ну правильно, теперь надо чтобы функция попала в таблицу импорта)) я вообще удивлен той магии, о которой вы с Грейтом говорите... я бы в импортирующем драйвере искал базовый адрес экспортирующего драйвера, затем искал смещение функции по таблице экспорта... а тут, ух... автоматика какая... загрузил два драйвера они бац - и слинковались друг с другом)))
Rel Дык я думал есть определённые стандарты, часто в сорцах встречаются. Ваш метод похож на выкрутас какой-то, но если так принято импортировать функции из других драйверов то ок. krabz Дак у меня и нет ни какой lib, тут драйвер експортирует функцию.
есть таблица импорта, драйвер может в таблице импорта иметь функцию из другого драйвера... кстати интересно, как эти линковки происходят на уровне ядра и что будет произходить, если экспортируемый драйвер не загружен на момент загрузки импортируемого... мой метод - динамический импорт, это не выкрутас, это вполне логично и вполне легально, как GetModuleHandle + GetProcAddress в режиме пользователя... Дак надо было сделать из проекта экспортирующего драйвера) но проще наверное подключить деф-файл со ссылками на модуль экспортирующего драйвера в проект импортирующего драйвера))) как то так))
Rel Хм, теперь ясно, но всё же не ясно как это заставить работать. def файл втулил один и для експортирующего драйвера и для импортирующего. Быть может надо что-то в файле sources прописать дополнительно? Т.к. я компилю не в vs, а средствами build из ddk. И если я компилирую как TARGETTYPE=DRIVER, то .lib у меня соответственно нет.
.def-файл нужен только для экспортирующего драйвера. Для импортирующего драйвера необходимо указать .lib-файл: Код (Text): TARGETLIBS = export.lib Для экспортирующего драйвера правильно писать так: Код (Text): TARGETTYPE = EXPORT_DRIVER