Alter.Org.UA
 << Back Home EN en   Donate Donate

Building NT kernel mode drivers in MS Visual Studio 8.0 (VS 2005)
for x64 (AMD64) platform

Приветствую! Ниже приведена инструкция по созданию 64-битного (x64) проекта для NT kernel драйвера в MS Visual Studio 8.0

Содержание

Настройка переменных окружения

Настраиваем переменные окружения (рекомендую системные, а не пользовательские) BASEDIRNT4, BASEDIR2K, BASEDIRXP, BASEDIR2K3 примерно следующим образом

BASEDIRNT4 = C:\Develop\DDKNT4
BASEDIR2K  = C:\Develop\DDK2000
BASEDIRXP  = C:\Develop\DDKXP
BASEDIR2K3 = C:\Develop\DDK2003

А также переменную BASEDIR, содержащую путь к наиболее любимому DDK (у меня это NT4, т.к. люблю писать хорошо совместимые драйвера). Последнее время весьма распространен DDK2003. Поэтому шаблонный проект мы заточим под него. См. также портирование проекта драйвера из VC6 в VC8 с DDK 2003, особенно специфику DDK 2003.
Внимание! Если вы хотите собирать драйвер в среде VC8, прверьте, что установлена поддержка платформы x64. Кроме того, DDK 2003 просто необходим.

BASEDIR = %BASEDIR2K3%

Создание проекта

  • File -> New... -> Project
  • В дереве Project Types выбираем Visual C++ -> Win32
  • Выбираем Win32 Project в списке шаблонов (Templates).
  • Вводим имя проекта, путь и имя solution'а. Все как обычно. Можете убрать галку Create directory for solution, тогда проектный файл (.VCPROJ) и .SLN создатутся в одном каталоге. А по умолчанию для проекта создается отдельный подкаталог.
  • OK -> DLL, Empty project -> Finish

Добавление файлов

  • Просто добавляем файлы в проект :) Project -> Add Existing Item или Project -> Add Item
  • Если пользуетесь .PCH'ами, не забудьте во все *.c и *.cpp включить строчку
    #include "stdafx.h"
    
    вместо
    #include <ntddk.h>
    .....
    

Настройка проекта

  • Чтобы все необходимые настройки были доступны, в проекте должен быть хотя бы 1 .C/.CPP файл. Я бы порекомендовал сразу ориентироваться на использование .PCH и создать/добавить
    driver_template.cpp
    drv_common.h
    StdAfx.cpp
    StdAfx.h
    
    Это все есть в примерах: driver_template_v7.rar/tgz (9.4 Kb/10.1 Kb)
  • Project -> Properties
  • Жмем кнопку "Configuration" (справа вверху)
  • Выбираем в "Settings for" (слева вверху) вариант "All Configurations"
    • В "Active Solution Platform" выбираем <New...>.
    • "Type or select new platform" = x64
    • "Copy settings from" = Win32
    • OK
    • Если платформа Win32 не нужна, в "Active Solution Platform" выбираем <Edit...> и удаляем ее.
    • А теперь в "Active Solution Platform" выбираем x64.
    • Close
  • Configuration Properties -> General
    • В "Output Directory" имеет смысл заменить $(SolutionDir) на $(ProjectDir), и в самом конце дописать "-amd64". Получится $(ProjectDir)\$(ConfigurationName)-amd64.
    • "Character Set" = Not Set
    • "Whole Program Optimization" = No Whole Program Optimization
  • Configuration Properties -> C/C++
    • -> General
      • Вводим пути к INCLUDE каталогам от DDK в поле "Additional include directories":
        $(BASEDIR2K3)\inc\ddk\wnet,$(BASEDIR2K3)\inc\ifs\wnet,$(BASEDIR2K3)\inc\wnet,
            $(BASEDIR2K3)\inc\crt
        
        Note 1: разделитель здесь - запятая. Кавычки вокруг путей не нужны.
        Note 2: здесь используются каталоги wnet в отличие от wxp из предыдущих инструкций.
      • "Debug Information Format" = "Program Database (/Zi)".
      • "Detect 64-bit Portability Issues" - по вкусу. Это на самом деле доп. проверки на операции с указателями.
    • -> Optimization
      • "Whole Program Optimization" = No
    • -> Preprocessor
      • Вводим следующие предопределенные константы в поле "Preprocessor definitions" Это обеспечит правильную компиляцию всех .H из DDK:
        WIN64, _WIN64, _AMD64_=1, _M_AMD64
        _WINDOWS, STD_CALL, CONDITION_HANDLING=1,
        NT_INST=0, _NT1X_=100, WINNT=1,
        WIN32_LEAN_AND_MEAN=1, DEVL=1, FPO=1
        
        Для конфигурации "x64 Debug" следует еще добавить следующие константы:
        DBG, DEBUG, _DEBUG
        
        Note 1: разделитель здесь - запятая. Кавычки не нужны.
        Note 2: Можно также эти определения занести в .H, используемый для построения .PCH или в общем заголовочном файле. Пример для проекта, использующего *.cpp находится в каталоге pch_cpp_x64, а *.c - в каталоге pch_c в driver_template_v7.rar/tgz (9.4 Kb/10.1 Kb)). Note 3: А если хочется и Win32 и x64, то в заголовочный файл - общие константы, а в настройках проекта - платформозависимые.
    • -> Code Generation
      • "Enable String Pooling" = "Yes (/GF)"
      • "Enable C++ Exceptions" = "Yes (/EHsc)"
      • "Basic Runtime Checks" = "Default"
      • "Struct member alignment" = "8 Bytes (/Zp8)"
      • "Buffer Security Check" = "No (/GS-)"
    • -> Language
      • "Enable Run-Time Type Info" = "No (/GR-)"
    • -> Precompiled Headers
      • "Create/Use Precompiled Header" = "Create Precompiled Header (/Yc)"
      • "Create/Use PCH Through File" = "StdAfx.h"
    • -> Advanced
      • "Calling convention" = "__stdcall (/Gz)"
    • -> Command Line Находим ключ "/GZ" и удаляем его в конфигурации "Win32 Debug". Это во многих случаях спасет от головной боли формата "Debug работает, а Release глючит". Глючить если и будет, то одинаково ( неинициализированные переменные, блоки памяти, переполнения и т.п.). Кроме того, этот неполезный ключик говорит компилятору, что нужно встраивать код проверки целостности стека, выливающийся в unresolved external _chkesp во время линковки.
  • Configuration Properties -> Linker
    • "General"
      • Устанавливаем имя .SYS файла (например "driver_template.sys") в поле "Output File".
      • "Enable Incremental Linking" = "No (/INCREMENTAL:NO)"
      • "Ignore Import Library" = "Yes"
      • Устанавливаем пути к библиотекам DDK в "Additional Library Directories". Например
        $(BASEDIR2K3)\lib\wnet\amd64,
        
      • Справа от "Additional Library Directories" нажимаем кнопку [...] и снимаем там галку "Inherit from parent or project defaults".
    • "Input"
      • В "Additional Dependencies" прописываем библиотеки DDK:
        ntoskrnl.lib
        Hal.lib
        
        Note 1: разделитель здесь - пробел. Кавычки вокруг путей не нужны.
        Note 2: int64.lib для x64 нет.
      • Справа от "Additional Dependencies" нажимаем кнопку [...] и снимаем там галку "Inherit from parent or project defaults".
      • "Ignore all default libraries" = "Yes (/NODEFAULTLIB)"
    • "Debugging"
      • "Generate Debug Info" = "Yes (/DEBUG)"
    • "System"
      • "SubSystem" = "Native (/SUBSYSTEM:NATIVE)"
      • "Driver" = "Driver (/DRIVER)"
    • "Advanced"
      • "Entry point symbol" = "DriverEntry"
    • -> Command Line
      • Для каждой конфигурации отдельно добавляем ключ "/safeseh:no".
  • OK
  • File -> Save All
  • А теперь имеет смысл этот пустой проект куда-нибудь скопировать и использовать в качестве заготовки :) Например вот такой: driver_template_v7.rar/tgz (9.4 Kb/10.1 Kb)

Комментарии к примеру

В архиве помимо основной вещи - pch_cpp_x64 содержатся еще старые примеры (несколько исправленые). Внутри pch_cpp_x64 лежит проект для VC8 с Win32 и x64 конфигурациями. Для работы этого проекта необходимо, чтобы при установке VC8 была включена поддержка платформы x64. Кроме того рядом лежит Makefile, который может работать как с nmake'ом от VC6, так и от VC8. Проекта для VC6 нет, т.к. я не знаю как там указать компилятор для определенной конфигурации. А Makefile рассчитан на DDK 2003 для x64 и DDK NT4 для Win32.

FolderPlatformVStudioSourcesPrecompiled headersMakefile
pch_cpp_x64x86/x64VC8.CPPYesYes
vc8_pch_cppx86VC8.CPPYesNo
pch_cppx86VC6/VC8.CPPYesYes
pch_cx86VC6.CYesYes
simplex86VC6.CNoYes
2007.10.30

См. также:

<< Back Автор: Alter (Александр А. Телятников) Сервер: Apache+PHP под FBSD © 2002-2024