Глава 1. Анатомия Wizarda.
п1. Причины создания.
На этапе разработки драйверов режима ядра (kernel-mode) для систем Windows каждый сталкивается с проблемой того, что в комплект поставки Visual Studio 6.0 или более ранних (VS) не входит мастер, позволяющий создавать проекты такого характера.
Можно, конечно, воспользоваться VS как редактором, а проводить компиляцию драйвера утилитами, поставляемыми вместе с NTDDK (build.exe, link.exe ), но это не самый лучший выход. Неплохой альтернативой этого является создание проекта при помощи внешнего мастера, такого, как представленный здесь. Этот мастер специально настроен на создание проекта драйвера режима ядра.
п2. Что делать.
Вообще-то, практически ничего - только создать командную строку вида:
w2k_wiz.exe <путь к пректуимя проекта>
и посмотреть туда, куда указывает путь. А там там лежит горячий и готовый к употреблению проект. Дрожащими руками запускаем VS, открываем проект, выбираем нужную конфигурацию, делаем BUILD и получаем от ворот поворот!!! В чем же дело?!
Да все просто пути то не прописаны, а значит, кому-то нужно прописать их. Раз кроме нас здесь никого нет, то прописывать будем сами.
* Лезем в Tools->Options->Directories
* В Show directories for : выбираем Include files и добавляем новую учетную запись вида <NTDDK Root>inc
* Переместить эту строчку в самый верх списка
* В Show directories for : выбираем Library files и добавляем новую учетную запись вида <NTDDK Root>libfreei386 или <NTDDK Root>libchki386 для Debug версии
* Переместить эту строчку в самый верх списка
* Создать файл DrvInfo.h, для правильной обработки ресурсного файла; этот файл можно поместить в одну из стандартных директорий VS
Содержание DrvInfo.h:
Код:
// __________________________________________________________
//
// DrvInfo.h
// Driver Info Definitions V1.00
// 06-02-2000 Sven B. Schreiber
//
[email protected]
// __________________________________________________________
#ifndef _DRVINFO_H_
#define _DRVINFO_H_
// =================================================================
// REVISION HISTORY
// =================================================================
/*
05-26-2000 V1.00 Original version (SBS).
*/
// =================================================================
// BASIC TYPES
// =================================================================
typedef UCHAR BYTE, *PBYTE, **PPBYTE;
typedef USHORT WORD, *PWORD, **PPWORD;
typedef ULONG DWORD, *PDWORD, **PPDWORD;
typedef unsigned __int64 QWORD, *PQWORD, **PPQWORD;
typedef int BOOL, *PBOOL, **PPBOOL;
typedef void **PPVOID;
// -----------------------------------------------------------------
#define BYTE_ sizeof (BYTE)
#define WORD_ sizeof (WORD)
#define DWORD_ sizeof (DWORD)
#define QWORD_ sizeof (QWORD)
#define BOOL_ sizeof (BOOL)
#define PVOID_ sizeof (PVOID)
#define HANDLE_ sizeof (HANDLE)
#define PHYSICAL_ADDRESS_ sizeof (PHYSICAL_ADDRESS)
// =================================================================
// MACROS
// =================================================================
#define _DRV_DEVICE(_name) \Device\ ## _name
#define _DRV_LINK(_name) \DosDevices\ ## _name
#define _DRV_PATH(_name) \\.\ ## _name
// -----------------------------------------------------------------
#define _CSTRING(_text) #_text
#define CSTRING(_text) _CSTRING (_text)
#define _USTRING(_text) L##_text
#define USTRING(_text) _USTRING (_text)
#define PRESET_UNICODE_STRING(_symbol,_buffer)
UNICODE_STRING _symbol =
{
sizeof (USTRING (_buffer)) - sizeof (WORD),
sizeof (USTRING (_buffer)),
USTRING (_buffer)
};
// -----------------------------------------------------------------
#if DRV_VERSION_LOW < 10
#define _DRV_V2(_a,_b) _a ## .0 ## _b
#define _DRV_V2X(_a,_b) V ## _a ## .0 ## _b
#else // #if DRV_VERSION_LOW < 10
#define _DRV_V2(_a,_b) _a ## . ## _b
#define _DRV_V2X(_a,_b) V ## _a ## . ## _b
#endif // #if DRV_VERSION_LOW < 10 #else
#define DRV_V2(_a,_b) _DRV_V2(_a,_b)
#define DRV_V2X(_a,_b) _DRV_V2X(_a,_b)
// -----------------------------------------------------------------
#define _DRV_V4(_a,_b,_c) _a ## . ## _b ## .0. ## _c
#define DRV_V4(_a,_b,_c) _DRV_V4(_a,_b,_c)
// -----------------------------------------------------------------
#define DRV_V DRV_V2X (DRV_VERSION_HIGH,
DRV_VERSION_LOW)
#define DRV_VERSION DRV_V2 (DRV_VERSION_HIGH,
DRV_VERSION_LOW)
#define DRV_VERSION_QUAD DRV_V4 (DRV_VERSION_HIGH,
DRV_VERSION_LOW,
DRV_BUILD)
#define DRV_VERSION_BINARY ((DRV_VERSION_HIGH * 100)
+ DRV_VERSION_LOW)
// =================================================================
// DRIVER INFORMATION
// =================================================================
#define DRV_ID DRV_PREFIX.DRV_MODULE
#define DRV_ID_VERSION DRV_ID.DRV_VERSION_HIGH
#define DRV_FILENAME DRV_MODULE.DRV_EXTENSION
#define DRV_CAPTION DRV_NAME DRV_V
#define DRV_COMMENT DRV_DATE DRV_AUTHOR
// -----------------------------------------------------------------
#define DRV_DEVICE _DRV_DEVICE (DRV_MODULE)
#define DRV_LINK _DRV_LINK (DRV_MODULE)
#define DRV_PATH _DRV_PATH (DRV_MODULE)
#define DRV_EXTENSION sys
// -----------------------------------------------------------------
#define DRV_CLASS DRV_MODULE.DRV_VERSION_QUAD
#define DRV_ICON DRV_MODULE.Icon
// -----------------------------------------------------------------
#define DRV_COPYRIGHT Copyright xA9 DRV_YEAR
#define DRV_COPYRIGHT_EX DRV_COPYRIGHT DRV_COMPANY
// -----------------------------------------------------------------
#define DRV_DATE_US DRV_MONTH-DRV_DAY-DRV_YEAR
#define DRV_DATE_GERMAN DRV_DAY.DRV_MONTH.DRV_YEAR
#define DRV_DATE DRV_DATE_US
// =================================================================
// NT4 COMPATIBILITY
// =================================================================
#ifndef IRP_MJ_QUERY_POWER
#define IRP_MJ_QUERY_POWER 0x16
#endif
#ifndef IRP_MJ_SET_POWER
#define IRP_MJ_SET_POWER 0x17
#endif
#ifndef IRP_MJ_PNP_POWER
#define IRP_MJ_PNP_POWER 0x1B
#endif
////////////////////////////////////////////////////////////////////
#ifdef _RC_PASS_
////////////////////////////////////////////////////////////////////
// =================================================================
// HEADER FILES
// =================================================================
#include <winver.h>
// =================================================================
// VERSION INFO
// =================================================================
#define DRV_RC_VERSION
VS_VERSION_INFO VERSIONINFO
FILEVERSION DRV_VERSION_HIGH, DRV_VERSION_LOW, 0, DRV_BUILD
PRODUCTVERSION DRV_VERSION_HIGH, DRV_VERSION_LOW, 0, DRV_BUILD
FILEFLAGSMASK VS_FFI_FILEFLAGSMASK
FILEFLAGS 0
FILEOS VOS_NT
FILETYPE VFT_DRV
FILESUBTYPE VFT2_UNKNOWN
{
BLOCK "StringFileInfo"
{
BLOCK "040904B0"
{
VALUE "OriginalFilename", CSTRING (DRV_FILENAME)
VALUE "InternalName", CSTRING (DRV_MODULE)
VALUE "ProductName", CSTRING (DRV_NAME)
VALUE "FileDescription", CSTRING (DRV_CAPTION)
VALUE "CompanyName", CSTRING (DRV_COMPANY)
VALUE "ProductVersion", CSTRING (DRV_VERSION_QUAD)
VALUE "FileVersion", CSTRING (DRV_VERSION_QUAD)
VALUE "LegalCopyright", CSTRING (DRV_COPYRIGHT_EX)
VALUE "Comments", CSTRING (DRV_COMMENT)
}
}
BLOCK "VarFileInfo"
{
VALUE "Translation", 0x0409, 0x04B0
}
}
// =================================================================
// RESOURCES
// =================================================================
#define DRV_RC_ICON DRV_ICON ICON DRV_MODULE.ico
////////////////////////////////////////////////////////////////////
#endif // #ifdef _RC_PASS_
////////////////////////////////////////////////////////////////////
#endif // #ifndef _DRVINFO_H_
// =================================================================
// END OF FILE
// ================================================================= //
Вот теперь все готово к компиляции. Компилируйте в свое удовольствие, а у меня пока все.
Продолжение следует.
Автор: lekarion