Во-первых, не LIBRARY, а DRIVER_LIBRARY, во-вторых автору нужен не статический .lib (т.е. содержащий непосредственно код), а экспортирующий .sys, т.е. тип надо выставлять в EXPORT_DRIVER.
x64 Спасибо! С твоими параметрами всё скомпилировалось. Но, когда я пытаюсь заргрузить драйвер в память, то он не загружается, код ошибки "Не удаётся найти указанный файл".При этом експортирующий находится в памяти. Я так понимаю это мой .lib.. Но я его положил в одну директорию с импортирующим драйвером и один фиг. Если закоментить функцию ExpTest, то импортирующий драйвер запускается, где он ищет мой .lib не пойму. Хотя .lib нужен на стадии компоновки и он выполняет свою задачу. Может експортирующий драйвер нужно запускать с определёнными параметрами, отличными от тех, что нужны для обычного драйвера, который ни чего не экспортирует.
x64 хм, сделал такое объявление для експорта: Код (Text): EXPAPI DECLSPEC_EXPORT NTSTATUS ExpTest(PCHAR); и такое для импорта: Код (Text): EXPAPI DECLSPEC_IMPORT NTSTATUS ExpTest(PCHAR); В sources экспорта: Код (Text): TARGETNAME=export TARGETTYPE=EXPORT_DRIVER DLLDEF=export.def SOURCES=export.c В sources импорта: Код (Text): TARGETNAME=test_exp TARGETTYPE=DRIVER TARGETLIBS = export.lib SOURCES=test_exp.c Делу это не помогло. По ссылке, что ты дал, написано, что в драйвере экспорта нужно использовать DllInitialize и DllUnload, а сам драйвер должен находится в \ System32 \ Drivers. Но DriverEntry всё равно нужно использовать для удовлетворения сборки. Тогда я не пойму как драйвер экспорта будет загружаться? каждый раз как только загружается драйвер импорта? или его нужно самому загружать?
Всё вроде верно. Что именно сейчас происходит не так? Какая ошибка? Верно, согласно документации, всё это обязательно. Да. Да.
Да тоже самое всё "Не удаётся найти указанный файл". Опишу подробно что делал, с полным кодом. Компилирую драйвер экспорта: export.c: Код (Text): #include<ntddk.h> #ifdef __cplusplus #define EXPAPI extern "C" #else #define EXPAPI #endif #ifndef DECLSPEC_EXPORT #define DECLSPEC_EXPORT __declspec(dllexport) #endif EXPAPI DECLSPEC_EXPORT NTSTATUS ExpTest(PCHAR); NTSTATUS DriverEntry( IN PDRIVER_OBJECT pDriverObject, IN PUNICODE_STRING pRegistryPath ) { return STATUS_SUCCESS; } NTSTATUS DllUnload(void) { return STATUS_SUCCESS; } NTSTATUS DllInitialize( __in PUNICODE_STRING RegistryPath ) { return STATUS_SUCCESS; } NTSTATUS ExpTest(PCHAR msg) { DbgPrint(msg); return STATUS_SUCCESS; } sources: Код (Text): TARGETNAME=export TARGETTYPE=EXPORT_DRIVER DLLDEF=export.def SOURCES=export.c export.def: Код (Text): EXPORTS ExpTest Скомпилировал, кладу export.sys в \system32\drivers\, а export.lib в директорию с драйвером импорта. Компилирую драйвер импорта: test_exp.c: Код (Text): #include <ntddk.h> #include<Ntdef.h> #ifdef __cplusplus #define EXPAPI extern "C" #else #define EXPAPI #endif EXPAPI DECLSPEC_IMPORT NTSTATUS ExpTest(PCHAR); 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; } sources: Код (Text): TARGETNAME=test_exp TARGETTYPE=DRIVER TARGETLIBS=export.lib SOURCES=test_exp.c Скомпилировал. Загружаю test_exp.sys с помощью kmd manager, run-->"Не удаётся найти указанный файл". я так понимаю, он export.sys не может найти, но почему. P.S: DllInitialize/DllUnload я думаю там используется как флаг загрузки/выгрузки драйвера.
lborokl Проверь (например, Dependency Walker-ом), что export.sys действительно экспортирует функцию ExpTest(), мало ли. То же самое проверь и для драйвера, который импортирует функции. На всякий случай, попробуй ещё в export.def задать директиву NAME; вряд ли это на что-то повлияет, но не помешает точно. А так я лично пока не вижу проблем у тебя, должно работать. Единственное, что смущает, что ты в этом проекте используешь сразу два метода экспорта: через __declspec(dllexport) и через .def-файл. Я всегда делал через .def-файл и этого более чем достаточно, попробуй выкинуть из кода вообще все __declspec(...) и всё, что с ними связано.
Действительно, программа показала интересную картину у импортирующего драйвера: почему dll? и что за директория? Почему-то не верно всё прописывается, а почему? хз... Какбуд-то я функции не из драйвера импортирую, а с чего-то юзермодного.
наверное деф-файл не верен... попробуй прописать LIBRARY EXPORT.SYS... и еще ординал попробуй поставить к функции ExpTest...
дык деф файл у меня тока у драйвера экспорта, Dependency Walker там всё нормально отобразил. а где это прописать, в сорсе или деф -файле? попробовал, не поменялось.
дык либ-файл генерируется по деф-файлу... импорт неправильно генерируется потому, что неправильный либ-файл,потому что неправильный деф-файл... первой строкой деф-файла...
Rel =( Скомпилил lib с новым def файлом, кинул lib к драйвероу импорта, скомпилил его, изменений нет. Может кому не лень попробовать это скомпилировать? исходные файлы все приложены... вера умирает, но всё же.. как мне явно задать ординал 1, в експорте он отображается.
у меня всё скомпилировалось и завелось как надо. ничего не менял, только компилировал батниками вот такого содержания: Код (Text): C: cd \winddk\7600.16385.1\bin setenv.bat C:\winddk\7600.16385.1 fre WXP no_oacr && D: && cd \tmp\libdriver\export && build Код (Text): C: cd \winddk\7600.16385.1\bin setenv.bat C:\winddk\7600.16385.1 fre WXP no_oacr && D: && cd \tmp\libdriver\import && build
Поднял таки свои старые исходники. Расширение файла-образа экспорт-драйвера должно быть .dll. Это правило жёстко зашито в ядре, обычное .sys здесь не подходит. Экспорт-драйвер регистрировать и запускать не нужно, это будет сделано автоматически. Минимально рабочий исходник для экспортирующего и импортирующего драйверов брать здесь.
Дык у меня собралось и запустилось. Кинул оба драйвера в system32/drivers, и через NtLoadDriver запустил импортирующий. Запустился нормально и вывел строку. Windows XP SP3.