Статья
Версия для печати
Обсудить на форуме
Пояснительная записка к Wizard template драйвера типа WDM (часть 1)



Глава 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
//                        sbs@orgon.com
// __________________________________________________________

#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
Версия для печати
Обсудить на форуме