Kernel: unresolved external symbol __imp__IoGetCurrentProcess

Тема в разделе "WASM.BEGINNERS", создана пользователем Clyde, 8 фев 2012.

  1. Clyde

    Clyde New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2009
    Сообщения:
    154
    Доброго времени суток, возник следующий вопрос.
    Собираю драйвер, используя Visual Studio. Настроить студию удалось, вот такой драйвер собирается и линкуется нормально.
    Код (Text):
    1. #include "ntddk.h"
    2. #pragma comment (linker,"/ENTRY:DrvEntry")
    3.  
    4. NTSTATUS DrvEntry(PDRIVER_OBJECT  DriverObject, PUNICODE_STRING  RegistryPath)
    5. {
    6. //IoGetCurrentProcess();
    7. DbgPrint("Loaded");
    8. return STATUS_SUCCESS;
    9. }
    Как только я раскомментировал строчку с IoGetCurrentProcess() то получаю ошибку линкера unresolved external symbol __imp__IoGetCurrentProcess
    Поясните пожалуйста, почему так, и что с этим делать?
     
  2. kweed

    kweed New Member

    Публикаций:
    0
    Регистрация:
    17 июн 2009
    Сообщения:
    81
    Нужно подключить библиотеку, которая этот символ экспортирует (?)
     
  3. kweed

    kweed New Member

    Публикаций:
    0
    Регистрация:
    17 июн 2009
    Сообщения:
    81
    Clyde
    Я получал такие сообщения раньше на студии, вот только не помню наверняка с чем связано, и как исправлял: Скорее всего требуется что-то вроде pragma comment(lib, "mylib.lib"). Хотя я и не в курсе почему он добавляет __imp__, но добавляет, и такие ошибки в общем-то иногда появляются, и это наверное должно значить примерно то-жо, что было-бы и без __imp__. Попробуй поискать в справочных материалах, какая библиотека импорта соответствует этой функции, и потом подключи ее с помощью pragma comment.

    ЗЫ. Я не работал с драйверами, а получал такие ошибки в обычном режиме.
     
  4. Mika0x65

    Mika0x65 New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2005
    Сообщения:
    1.384
    Clyde
    Ntoskrnl.lib подключена? Вообще, странно, насколько я понимаю, DbgPrint тоже из Ntoskrnl.lib, но с ней компилируется...
     
  5. Clyde

    Clyde New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2009
    Сообщения:
    154
    Mika0x65 именно это и хочу сказать, разумеется подключена, ntoskrnl.lib hal.lib добавлены на вкладке линкер, можно через прагму как предложил kweed, разницы нет.
    DbgPrint я тут привел не ради красного словца, а чтобы показать что либа одна. Могут ли это быть глюки в ддк?

    PS #pragma comment(lib,"ntoskrnl.lib")
    1>main.obj : error LNK2001: unresolved external symbol __imp__IoGetCurrentProcess
    1>C:\mydrivers\exec\Release\exec.sys : fatal error LNK1120: 1 unresolved externals
    1>
     
  6. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    Clyde
    Проблема в том, что IoGetCurrentProcess у Вас декорируется, как переменная __stdcall или как функция __cdecl, а не как функция __stdcall. Как функция __stdcall без параметров она должна декорироваться так: __imp__IoGetCurrentProcess@0 . Очевидно, Вы забыли выставить __stdcall в настройках проекта (ключ /Gz). На DbgPrint это не влияет, т.к. она __cdecl.
     
  7. Clyde

    Clyde New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2009
    Сообщения:
    154
    l_inc могу сказать одно - респект :)
     
  8. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    Clyde
    Не обращайте внимание на мою глупость "переменная __stdcall". Перестарался с копипастом латиницы. У переменных, естесственно, никаких конвенций вызова не предусмотрено. :)