Написал драйвер для 32 бит. Необходимо его перенести на 64 битную платформу. Юзаю "1830 usa ddk" и MVS 2005 + Windows XP 32 bit build 2600 sp3. Определил в проекте в менеджере конфигурации 64 бит архитектуру, пути до WinDDK прописал для них те же что и для 32 бита. Пытаюсь компилить, выдаёт: fatal error C1189: #error : "No Target Architecture" C:\WINDDK\3790.1830\inc\wnet\ntdef.h Напрашиваются вопросы: - что это за ошибка и как её устранить? Я так понимаю дело в определинии архитектуры проекта - Можно ли компилировать драйвера под х64 из под 32 битной Windows с моим WinDKK? Или необходима 64 битная винда? К гуглу и поиску не отправляйте, уже гуглил и статьи некоторые прочитал про х64. Ничего про это сказано не было (
Ага.. понял. Сорь... указал. Куча ошибок вылезло сразу ( Буду разбираться, драйвер не маленький, переделывать кучу надо скорее всего. Если что не будет получаться буду здесь писать. Так что пожалуйста пока не закрывайте эту тему пока
nonstandard extension used : '__asm' keyword not supported on this architecture Судя из гугла и моих личных заключений на х64 не поддерживается эта директива =\ Люди пишут что необходимо в отдельный файл ассемблерные вставки пихать и как то их соединять с файлом проекта. Я впервые об этом слышу и хочу спросить как это делается ну или хотя бы дайте толчок в каком направлении двигаться. Спасибо за внимание
Вообщем-то мне надо сбросить и восстановить содержимое CR0 Код (Text): /*__asm { cli mov eax,cr0 mov CR0Reg,eax and eax,0xFFFEFFFF mov cr0,eax }*/ ...Мой код... /*__asm { mov eax,CR0Reg mov cr0,eax sti }*/ Создал файл .asm. Его содержимое: Код (Text): public InstallHooks1 public InstallHooks2 .CODE InstallHooks1 PROC cli mov eax,cr0 mov CR0Reg,eax and eax,0xFFFEFFFF mov cr0,eax InstallHooks1 ENDP InstallHooks2 PROC mov eax,CR0Reg mov cr0,eax sti InstallHooks2 ENDP END Определил эти процедуры в проекте : extern void InstallHooks1(); extern void InstallHooks2(); Но дело в том что CR0Reg это переменная которую надо передать в InstallHooks1 чтобы в нее записалось значение а потом его восстановить передав в процедуру InstallHooks2. Я асмом не дружу к сожалению, в идеале знаю Делфи и Си нормально. Не подскажете как решать данную проблему ? Как написать на асме процедуру InstallHooks1 с входящим и исходящим параметром CR0Reg и процедуру InstallHooks2 с входящим CR0Reg. Буду очень благодарен
С ходу фиг разберёшься... Есть такой флаг я понял AMD64_SOURCES. Код моего АСМовского файла я привел. Используя AMD64_SOURCES в проекте как использовать процедуры из моего .asm файла? Как написать на асме процедуру InstallHooks1 с входящим и исходящим параметром CR0Reg и процедуру InstallHooks2 с входящим CR0Reg Простите за глупые вопросы, просто для меня это реально проблема (
Можно и без асма. Код (Text): #include <intrin.h> #pragma intrinsic(_disable) #pragma intrinsic(_enable) __int64 InstallHooks1() { __int64 CR0Reg; _disable(); CR0Reg = __readcr0(); __writecr0(CR0Reg & ~0x10000); return CR0Reg; } void InstallHooks2(__int64 CR0Reg) { __writecr0(CR0Reg); _enable(); } На выходе:
Спасибо за исчерпывающий овтет!) осталось разобраться с 2мя нюансами: KeQueryTickCount и KeGetCurrentIrql они не определны... Ошибки: Код (Text): Error 20 error LNK2001: unresolved external symbol KeTickCount Error 21 error LNK2019: unresolved external symbol __imp_KeGetCurrentIrql referenced in function ProcNotifyRoutine Гуглить не получилось (
Пробую загрузить драйвер под Windows XP 64 bit. Если через мою программу то пишет: Код (Text): 21/05/09 01:22:46 - Client.exe (552 ) : ZwLoadDriver failed with error #3221225569 Если через KmdManager из набора Four-F то вот что: Код (Text): REGISTER - Success - The operation colpleted successfully START - Success - The specified procedure could not be found STOP - Fail - The service has not been started UNREGISTER - Success - The operation colpleted successfully Не подскажете в чем дело ? Что за процедура не найдена? Процедура точки входа в драйвер DriverEntry ? Как решить эту проблему?
Теперь при загрузке пишет Код (Text): ZwLoadDriver failed with error STATUS_DRIVER_ENTRYPOINT_NOT_FOUND Параметры проекта: Код (Text): /OUT:"C:\Driver_Project\mydriver.sys" /NOLOGO /MANIFEST:NO /NODEFAULTLIB /SUBSYSTEM:NATIVE /DRIVER /ENTRY:"DriverEntry" /BASE:"0x10000" /MACHINE:X64 /ERRORREPORT:PROMPT ntoskrnl.lib hal.lib Что может быть не так? Компилю под х64, драйвер под х32 работает отлично.
Я не знаю как через мейкфайл собирать х64. Какие параметры прописывать ? не могли бы пример привести? и что такое -icZ. За что этот параметр отвечает?