всем доброго времени суток! Уже 2 дня мучаюсь, не могу понять в чем проблема Объясняю по порядку: два модуля: MainMod - главный модуль "С", с точкой входа DriverEntry; SecMod - вторичный модуль "Ассемблер": представляет весь одну процедуру которая вызывается с главного модуля. ~MainMod~ Код (Text): #include "ntddk.h" #pragma comment(lib,"prog.lib") extern void asmFun(void); \\ <<------Процедура со второго модуля NTSTATUS DriverEntry(IN PDRIVER_OBJECT pDriverObject, IN PUNICODE_STRING RegistryPath) { asmFun(); return STATUS_SUCCESS; } ~SecMod~ Код (Text): .386p .model flat, C _TEXT segment dword public use32 'CODE' asmFun proc near push ebp mov ebp, esp xor eax, eax pop ebp ret asmFun endp _TEXT ends public asmFun end MainMod компилирую в DDK Второй на масме. Все проходит отлично! Далее с помощью ДДК-ашного линкера делаю SecMod.lib и кладу его в "\BASE_DIR_DDK\lib\wxp\i386" И вот самое интересное начинается.... ввожу в консоль билдера: build -l - только линковка - выскакивают 2 ошибки: --------------------------------------------------------------------------------- unresolved external symbol _asmFun@0 referenced in function _DriverEntry@8 1 unresolved externals -------------------------------------------------------------------------------- пробовал и отдельно линкером ДДКашным с ключем указания пути..... тоже самое! Странно вроде везде объявил функцию как внешнюю.... Помогите пожалуйста! Уже реально бесит DDK.......... 2600.1106 BUILD........ 4.22.3614 CL............ 13.00.9176 LINK......... 7.00.9210 Главный модуль, без внешних объявлений, в одиночку билдится ОТЛИЧНО до самого "sys" драйвера!!!!!
Код: .386p _TEXT segment _asmFun@0 proc push ebp mov ebp, esp xor eax, eax pop ebp ret _asmFun@0 endp _TEXT ends end
__MAX__, к сожалению не помогло..... Думаю проблема в указании билдеру пути к вторичному модулю. и главное не видно такого ключа..... А может еще синтаксис первого модуля как то поправить?
_asmFun@0 именно в таком виде нужно объявлять функцию в asm (asmFun proc - 100% ошибка). далее 'ml.exe /c /Cp SecMod.asm' -> SecMod.obj . и дальше 'link.exe ... SecMod.obj...'
Выход найден! Оказывается надо было в файл SOURCES вставить следующую строку: Код (Text): TARGETLIBS = $(DDK_LIB_PATH)\SecMod.lib Но не тут то было.... Теперь драйвер не запускается (режим запуска "StartService")!! Линкую только один главный модуль - все идеально просто: и загружается, и выгружается, и сервис закрывается с хендлами! Линкую вдвоем - на стадии "StartService", "GetLastError" возвращает "2" -> файл не найден(MSDN) как я делаю "Lib" --> запускаю "Link.exe" c ключами /EXPORT:_asmFun@0 /NOENTRY Что такое не могу понять! Может билдить надо с какими-то ключами?