Доброго времени суток, возник следующий вопрос. Собираю драйвер, используя Visual Studio. Настроить студию удалось, вот такой драйвер собирается и линкуется нормально. Код (Text): #include "ntddk.h" #pragma comment (linker,"/ENTRY:DrvEntry") NTSTATUS DrvEntry(PDRIVER_OBJECT DriverObject, PUNICODE_STRING RegistryPath) { //IoGetCurrentProcess(); DbgPrint("Loaded"); return STATUS_SUCCESS; } Как только я раскомментировал строчку с IoGetCurrentProcess() то получаю ошибку линкера unresolved external symbol __imp__IoGetCurrentProcess Поясните пожалуйста, почему так, и что с этим делать?
Clyde Я получал такие сообщения раньше на студии, вот только не помню наверняка с чем связано, и как исправлял: Скорее всего требуется что-то вроде pragma comment(lib, "mylib.lib"). Хотя я и не в курсе почему он добавляет __imp__, но добавляет, и такие ошибки в общем-то иногда появляются, и это наверное должно значить примерно то-жо, что было-бы и без __imp__. Попробуй поискать в справочных материалах, какая библиотека импорта соответствует этой функции, и потом подключи ее с помощью pragma comment. ЗЫ. Я не работал с драйверами, а получал такие ошибки в обычном режиме.
Clyde Ntoskrnl.lib подключена? Вообще, странно, насколько я понимаю, DbgPrint тоже из Ntoskrnl.lib, но с ней компилируется...
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>
Clyde Проблема в том, что IoGetCurrentProcess у Вас декорируется, как переменная __stdcall или как функция __cdecl, а не как функция __stdcall. Как функция __stdcall без параметров она должна декорироваться так: __imp__IoGetCurrentProcess@0 . Очевидно, Вы забыли выставить __stdcall в настройках проекта (ключ /Gz). На DbgPrint это не влияет, т.к. она __cdecl.
Clyde Не обращайте внимание на мою глупость "переменная __stdcall". Перестарался с копипастом латиницы. У переменных, естесственно, никаких конвенций вызова не предусмотрено.