Многомодульный драйвер не линкуется.

Тема в разделе "WASM.NT.KERNEL", создана пользователем Antonios, 25 янв 2012.

  1. Antonios

    Antonios New Member

    Публикаций:
    0
    Регистрация:
    3 июн 2010
    Сообщения:
    10
    всем доброго времени суток!
    Уже 2 дня мучаюсь, не могу понять в чем проблема
    Объясняю по порядку:

    два модуля:
    MainMod - главный модуль "С", с точкой входа DriverEntry;
    SecMod - вторичный модуль "Ассемблер": представляет весь одну процедуру которая вызывается с главного модуля.

    ~MainMod~
    Код (Text):
    1. #include "ntddk.h"
    2. #pragma comment(lib,"prog.lib")
    3. extern void asmFun(void);             \\ <<------Процедура со второго модуля
    4. NTSTATUS DriverEntry(IN PDRIVER_OBJECT pDriverObject, IN PUNICODE_STRING RegistryPath)
    5. {
    6.   asmFun();
    7.   return STATUS_SUCCESS;
    8. }
    ~SecMod~
    Код (Text):
    1. .386p
    2. .model flat, C
    3. _TEXT segment dword public use32 'CODE'
    4. asmFun proc near
    5. push ebp
    6. mov ebp, esp
    7. xor eax, eax
    8. pop ebp
    9. ret
    10. asmFun endp
    11. _TEXT ends
    12. public asmFun
    13. 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" драйвера!!!!!
     
  2. __MAX__

    __MAX__ New Member

    Публикаций:
    0
    Регистрация:
    21 май 2007
    Сообщения:
    19
    Код:

    .386p
    _TEXT segment
    _asmFun@0 proc
    push ebp
    mov ebp, esp
    xor eax, eax
    pop ebp
    ret
    _asmFun@0 endp
    _TEXT ends
    end
     
  3. Antonios

    Antonios New Member

    Публикаций:
    0
    Регистрация:
    3 июн 2010
    Сообщения:
    10
    __MAX__, к сожалению не помогло.....
    Думаю проблема в указании билдеру пути к вторичному модулю.
    и главное не видно такого ключа.....

    А может еще синтаксис первого модуля как то поправить?
     
  4. __MAX__

    __MAX__ New Member

    Публикаций:
    0
    Регистрация:
    21 май 2007
    Сообщения:
    19
    _asmFun@0 именно в таком виде нужно объявлять функцию в asm (asmFun proc - 100% ошибка). далее 'ml.exe /c /Cp SecMod.asm' -> SecMod.obj . и дальше 'link.exe ... SecMod.obj...'
     
  5. Antonios

    Antonios New Member

    Публикаций:
    0
    Регистрация:
    3 июн 2010
    Сообщения:
    10
    Выход найден! Оказывается надо было в файл SOURCES вставить следующую строку:

    Код (Text):
    1. TARGETLIBS = $(DDK_LIB_PATH)\SecMod.lib
    Но не тут то было.... Теперь драйвер не запускается (режим запуска "StartService")!!

    Линкую только один главный модуль - все идеально просто: и загружается, и выгружается, и сервис закрывается с хендлами!
    Линкую вдвоем - на стадии "StartService", "GetLastError" возвращает "2" -> файл не найден(MSDN)

    как я делаю "Lib" --> запускаю "Link.exe" c ключами /EXPORT:_asmFun@0 /NOENTRY

    Что такое не могу понять! Может билдить надо с какими-то ключами?