Программирование драйверов Windows

         

Настройки проекта в Visual Studio 7 Net


Настройка проекта для компиляции и сборки драйвера режима ядра существенно отличаются от настроек, которые используются для работы с приложениями и динамическими библиотеками пользовательского режима. Ниже приводится точный текст файл Example.sln ("sln" является сокращением от "solution"), который описывает проект драйвера Example, рассматриваемого в следующей главе.

Microsoft Visual Studio Solution File, Format Version 7.00 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Example", "Example.vcproj", "{E524BA09-7993-4528-91A9-7E27FAA3565F}" EndProject Global GlobalSection(SolutionConfiguration) = preSolution ConfigName.0 = Checked EndGlobalSection GlobalSection(ProjectDependencies) = postSolution EndGlobalSection GlobalSection(ProjectConfiguration) = postSolution {E524BA09-7993-4528-91A9-7E27FAA3565F}.Checked.ActiveCfg = Checked|Win32 {E524BA09-7993-4528-91A9-7E27FAA3565F}.Checked.Build.0 = Checked|Win32 EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution EndGlobalSection GlobalSection(ExtensibilityAddIns) = postSolution EndGlobalSection EndGlobal

Значительно более важным в проекте Example является файл Example.vcproj, который содержит конкретные значения настроек и описания используемых файлов. Точный текст Example.vcproj (файла настроек для компиляции и сборки простейшего не-WDM драйвера checked-версии в среде Visual Studio 7 Net) приводится ниже.

&#60?xml version="1.0" encoding = "windows-1251"?&#62 &#60VisualStudioProject ProjectType="Visual C++" Version="7.00" Name="Example" SccProjectName="" SccLocalPath=""&#62 &#60Platforms&#62&#60Platform Name="Win32"/&#62&#60/Platforms&#62 &#60Configurations&#62 &#60Configuration Name="Release|Win32" OutputDirectory=".\checked" IntermediateDirectory=".\checked" ConfigurationType="2" UseOfMFC="0" ATLMinimizesCRunTimeLibraryUsage="FALSE" CharacterSet="1"&#62 &#60Tool Name="VCCLCompilerTool" AdditionalOptions="/Zel -cbstring /QIfdiv- /QIf /Gi- /Gm- /GX" Optimization="0" EnableIntrinsicFunctions="FALSE" OmitFramePointers="TRUE" OptimizeForProcessor="2" AdditionalIncludeDirectories="C:\WinDDK\2600\inc\ddk\w2k; C:\WinDDK\2600\inc\w2k;C:\WinDDK\2 600\inc\crt" PreprocessorDefinitions="_X86_=l;i386=l; CONDITION_HANDLING=1;NT_UP=1; NT_INST=0; WIN32=100;_NT1X_=100;WINNT=l; _WIN32_WINNT=0x0400;WIN32_LEAN_AND_MEAN=1; DEVL=l;DBG=l;FPO=0" IgnoreStandardIncludePath="TRUE" StringPooling="TRUE" ExceptionHandling="TRUE" RuntimeLibrary="O" StructMemberAlignment="4" BufferSecurityCheck="FALSE" EnableFunctionLevelLinking="TRUE" PrecompiledHeaderFile=".\checked/Example.pch" AssemblerListingLocation=".\checked/" ObjectFile=".\checked/" ProgramDataBaseFileName=".\checked\Example.pdb" WarningLevel="3" SuppressStartupBanner="TRUE" DebugInformationFormat="l" CallingConvention="2" CompileAs="0" ForcedIncludeFiles="warning.h"/&#62 &#60Tool Name="VCCustomBuildTool"/&#62 &#60Tool Name="VCLinkerTool" AdditionalOptions="" AdditionalDependencies="hal.lib ntoskrnl.lib int64.1ib msvcrt.lib " OutputFile=".\checked\Example.sys" Version="5.0" LinkIncremental="l" SuppressStartupBanner="TRUE" AdditionalLibraryDirectories="C:\WinDDK\2 600\lib\w2k\i386" IgnoreAllDefaultLibraries="TRUE" ProgramDatabaseFile=".\checked/Example.pdb" GenerateMapFile="TRUE" MapFileName="Example.map" StackReserveSize="262144" StackCommitSize="4096" OptimizeReferences="2" EnableCOMDATFolding="2" EntryPointSymbol="DriverEntry" SetChecksum="TRUE" BaseAddress="0x10000" ImportLibrary="" MergeSections=".rdata=.text" TargetMachine="1"/&#62 &#60Tool Name="VCMIDLTool" MkTypLibCompatible="TRUE" SuppressStartupBanner="TRUE" TargetEnvironment="1" TypeLibraryName=".\checked/Example.tlb"/&#62 &#60Tool Name="VCPostBuildEventTool"/&#62 &#60Tool Name="VCPreBuildEventTool"&#62 &#60Tool Name="VCPreLinkEventTool"/&#62 &#60Tool Name="VCResourceCompilerTool"/&#62 &#60Tool Name="VCWebServiceProxyGeneratorTool"/&#62 &#60Tool Name="VCWebDeploymentTool"/&#62 &#60/Configuration&#62 &#60/Configurations&#62 &#60Files&#62 &#60Filter Name="Header Files" Filter=".h"&#62 &#60File RelativePath=".\Driver.h"&#62 &#60/File&#62 &#60/Filter&#62 &#60Filter Name="Source Files" Filter=".c;.cpp"&#62 &#60File RelativePath="Init.cpp"&#62 &#60/File&#62 &#60/Filter&#62 &#60/Files&#62 &#60Globals&#62&#60/Globals&#62 &#60/VisualStudioProject&#62


Приведенный выше текст переформатирован (для удобства чтения в формате книги), поэтому расположение слов несколько отличается от их размещения в оригинальных .vcproj файлах, генерируемых средой Visual Studio 7 Net. Значения строковых параметров AdditionalIncludeDirectories и PreprocessorDefinitions обязательно должны быть записаны в одну строку.

Следует отметить, что особую важность для компиляции имеют значения пара метров IgnoreStandardIncludePath (здесь он отменяет стандартные пути для обнаружения заголовочных файлов, которые явно заданы теперь в параметре AdditionalIncludeDirectories), AdditionalOptions и PreprocessOrDefinitions (значения которых рекомендуется повторить в точности), CallingConvention (здесь определяет __stdcall).

Из параметров сборки следует отметить параметры IgnoreAllDefaultLibraries (здесь он отменяет использование библиотек, назначаемых в Visual Studio по умолчанию), AdditionalLibraryDirectories и AdditionalDependencies (они определяют используемые библиотеки — в данном случае для сборки не-WDM драйвера под Windows 2000), BaseAddress (обязательно следует указать равным 0x10000) и "неприметный" коварный параметр SetChecksum (должен быть "TRUE").

Все эти параметры можно настроить интерактивно и в самой интегрированной среде Visual Studio, однако, затем рекомендуется сравнить содержимое файла .vcproj с приведенным текстом, стараясь получить полное совпадение.


Содержание раздела