Alter.Org.UA  
 << Back Home EN en   Donate Donate www/www1/www2

Building NT kernel mode drivers in MS Visual Studio 8.0 (VS 2005)

Итак, продолжение банкета. Ниже приведена инструкция по созданию проекта для 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.

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
    
    Это все есть в примерах:
    Warning: filesize() [function.filesize]: stat failed for /usr/home/alter/html/../../..//docs/nt_kernel/vc6_proj/driver_template_v7.rar in /usr/home/alter/html/common.inc.php on line 429

    Warning: filesize() [function.filesize]: stat failed for /usr/home/alter/html/../../..//docs/nt_kernel/vc6_proj/driver_template_v7.tgz in /usr/home/alter/html/common.inc.php on line 430
    driver_template_v7.rar/tgz ( bytes/ bytes)
  • Project -> Properties
  • Выбираем в "Settings for" (слева вверху) вариант "All Configurations"
  • Configuration Properties -> General
    • В "Output Directory" имеет смысл заменить $(SolutionDir) на $(ProjectDir).
    • "Character Set" = Not Set
    • "Whole Program Optimization" = No Whole Program Optimization
  • Configuration Properties -> C/C++
    • -> General
      • Вводим пути к INCLUDE каталогам от DDK в поле "Additional include directories":
        $(BASEDIR2K3)\inc\ddk\wxp,$(BASEDIR2K3)\inc\ifs\wxp,$(BASEDIR2K3)\inc\wxp,
            $(BASEDIR2K3)\inc\crt
        
        Note 1: разделитель здесь - запятая. Кавычки вокруг путей не нужны.
      • "Debug Information Format" = "Program Database (/Zi)".
      • "Detect 64-bit Portability Issues" - по вкусу. Это на самом деле доп. проверки на операции с указателями.
    • -> Optimization
      • "Whole Program Optimization" = No
    • -> Preprocessor
      • Вводим следующие предопределенные константы в поле "Preprocessor definitions" (thanks to Emusic from http://www.rsdn.ru). Это обеспечит правильную компиляцию всех .H из DDK:
        WIN32, _WINDOWS, i386=1, _X86_=1, STD_CALL, CONDITION_HANDLING=1,
        NT_INST=0, _NT1X_=100, WINNT=1,
        _WIN32_WINNT=0x0400 /* minimum required OS version */
        WIN32_LEAN_AND_MEAN=1, DEVL=1, FPO=1
        
        Для конфигурации "Win32 Debug" следует еще добавить следующие константы:
        DBG, DEBUG, _DEBUG
        
        Note 1: разделитель здесь - запятая. Кавычки не нужны.
        Note 2: Если вы пользуетесь precompiled headers, можно эти определения занести в .H, используемый для построения .PCH или в общем заголовочном файле. Пример для проекта, использующего *.cpp находится в каталоге pch_cpp, а *.c - в каталоге pch_c в
        Warning: filesize() [function.filesize]: stat failed for /usr/home/alter/html/../../..//docs/nt_kernel/vc6_proj/driver_template_v7.rar in /usr/home/alter/html/common.inc.php on line 429

        Warning: filesize() [function.filesize]: stat failed for /usr/home/alter/html/../../..//docs/nt_kernel/vc6_proj/driver_template_v7.tgz in /usr/home/alter/html/common.inc.php on line 430
        driver_template_v7.rar/tgz ( bytes/ bytes)).
    • -> 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\wxp\i386,
        
      • Справа от "Additional Library Directories" нажимаем кнопку [...] и снимаем там галку "Inherit from parent or project defaults".
    • "Input"
      • В "Additional Dependencies" прописываем библиотеки DDK:
        ntoskrnl.lib
        int64.lib
        Hal.lib
        
        Note: разделитель здесь - пробел. Кавычки вокруг путей не нужны.
      • Справа от "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".
      • Для каждой конфигурации отдельно находим ключ "/subsystem:native" и если нужна поддержка старых ОС заменяем на "/subsystem:native,4.00".
  • OK
  • File -> Save All
  • А теперь имеет смысл этот пустой проект куда-нибудь скопировать и использовать в качестве заготовки :) Например вот такой:
    Warning: filesize() [function.filesize]: stat failed for /usr/home/alter/html/../../..//docs/nt_kernel/vc6_proj/driver_template_v7.rar in /usr/home/alter/html/common.inc.php on line 429

    Warning: filesize() [function.filesize]: stat failed for /usr/home/alter/html/../../..//docs/nt_kernel/vc6_proj/driver_template_v7.tgz in /usr/home/alter/html/common.inc.php on line 430
    driver_template_v7.rar/tgz ( bytes/ bytes)

2006.12.07

См. также:

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