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

Портирование проекта драйвера из VC6 в VC8 с DDK 2003

Задача

Есть проект драйвера для VC6, настроеный как описано в статье Creating Driver project for Visual Studio 6.0. Задача - минимальными усилиями собрать его под Visual Studio 8 с использованием DDK 2003. Кроме того, мы хотим сохранить совместимость проекта с предыдущими версиями Visual Studio и DDK. По крайней мере, чтобы .MAK файл, созданый по VC6 проекту собирался утилитой nmake в любой среде.

Note: Иногда DDK 2003 почему-то идет под именем DDK XP, но у 2003-го есть очень характерное отличие в структуре каталогов inc и lib:

XP DDK DDK 2003
\inc
\lib
  \i386
 
\inc
  \atl21, \atl30, \crt, \ddk, \ifs,
  \inc16, \mfc42, \w2k, \wnet, \wxp
\lib
  \lib16
  \w2k
    \i386
  \wnet
    \amd64, \i386, \ia64
  \wxp
    \i386, \ia64

Проблемы

  • другая структура каталогов (см. выше) и как следствие - невозможность найти заголовочные файлы .H и библиотеки .LIB
  • новые опции компилятора (cl.exe) и линкера (link.exe)
    cl : Command line warning D9035 : option 'GX' has been deprecated and will be removed
        in a future release
    cl : Command line warning D9036 : use 'EHsc' instead of 'GX'
    
  • ругань на использование "опасных" функций работы со строками (posix)
    c:\projects\src\driver\mycpp.cpp(22) :
        warning C4996: 'strcpy' was declared deprecated
            C:\Program Files\Microsoft Visual Studio 8\VC\INCLUDE\string.h(73) :
                see declaration of 'strcpy'
            Message: 'This function or variable may be unsafe. Consider using
                strcpy_s instead. To disable deprecation, use _CRT_SECURE_NO_DEPRECATE.
                See online help for details.'
    
    
  • ошибки "unresolved external"
    mycpp.obj : error LNK2001: unresolved external symbol ___security_cookie
    mycpp.obj : error LNK2001: unresolved external symbol @__security_check_cookie@4
    mycpp.obj : error LNK2001: unresolved external symbol __except_handler4
    LINK : error LNK2001: unresolved external symbol __load_config_used
    

Решение N1 (by Alter)

Note: Все это нужно сделать для каждой конфигурации сборки (Debug/Release).

  • Настраиваем еще одну переменную окружения (рекомендую системную, а не пользовательскую) - BASEDIR2K3 примерно следующим образом
    BASEDIR2K3 = C:\Develop\DDK2003
    
  • Заходим в настройки проекта VC6 в раздел C/C++
    • добавляем (в конец списка) к путям поиска заголовочных файлов
      $(BASEDIR2K3)\inc\ddk\wxp,$(BASEDIR2K3)\inc\ifs\wxp, $(BASEDIR2K3)\inc\wxp,
        $(BASEDIR2K3)\inc\crt
      
      мой список INCLUDE каталогов выглядит так:
      $(BASEDIRNT4)\inc,$(BASEDIR2K)\src\filesys\inc,$(BASEDIRXP)\inc\ddk,$(BASEDIRXP)\inc\ifs,
        $(BASEDIRXP)\inc,$(BASEDIR2K3)\inc\ddk\wxp,$(BASEDIR2K3)\inc\ifs\wxp,
        $(BASEDIR2K3)\inc\wxp,$(BASEDIR2K3)\inc\crt
      
      Note: Я указал подкаталог wxp исходя из предположения, что проект раньше умел собираться с XP DDK. Есть еще варианты w2k и wnet.
    • Заменяем опцию /GX на /EHsc. Это понятно зачем и VC6 эту опцию понимает.
    • добавляем следующие предустановленные константы:
      _CRT_SECURE_NO_DEPRECATE
      _CRT_NONSTDC_NO_DEPRECATE
      _CRT_NON_CONFORMING_SWPRINTFS
      
      Это решит проблему с "warning C4996: 'strcpy' was declared deprecated". Если хотите, можете определить их в самом начале общего заголовочного файла.
      #define _CRT_SECURE_NO_DEPRECATE        // For VS 2005
      #define _CRT_NONSTDC_NO_DEPRECATE       // For VS 2005
      #define _CRT_NON_CONFORMING_SWPRINTFS   // For VS 2005
      
    • А еще дописываем опцию /GS-, это решит проблему с ___security_cookie и __except_handler4. VC6 при сборке будет на нее поругиваться, но это не так страшно.
  • Заходим в раздел Link
    • добавляем к путям поиска библиотек в конец списка
      $(BASEDIR2K3)\lib\wxp\i386
      
    • Дописываем опцию /safeseh:no, это решит проблему с __load_config_used. VC6 при сборке тоже будет на нее ругаться, и это тоже не страшно.
  • Теперь можно экспортировать .MAK файл и собирать по нему в Visual Studio 8.
    Note: по умолчанию Visual Studio 8 не устанавливает переменные окружения INCLUDE и LIB, которые могут быть нужны при сборке. Поэтому имеет смысл запустить Visual Studio 2005 command prompt и запускать nmake уже оттуда.

Решение N2 (by DeathSoft)

Чтобы были ___security_cookie, нужно добавить файлик BufferOverflowK.lib. Он есть в новых DDK. Сделать /entry:"GsDriverEntry@8", это кстати в MSDN описано. Чтобы было /safeseh:yes (оно в новых студиях по умолчанию) надо тоже пару файликов из создать:

safeseh.c:
extern ULONG_PTR __security_cookie;  /* /GS security cookie */

/*
 * The following two names are automatically created by the linker for any
 * image that has the safe exception table present.
* /

extern  PVOID __safe_se_handler_table[]; /* base of safe handler entry table * /
extern  UCHAR  __safe_se_handler_count;  /* absolute symbol whose address is
                                           the count of table entries * /
typedef struct {
    ULONG       Size;
    ULONG       TimeDateStamp;
    USHORT      MajorVersion;
    USHORT      MinorVersion;
    ULONG       GlobalFlagsClear;
    ULONG       GlobalFlagsSet;
    ULONG       CriticalSectionDefaultTimeout;
    ULONG       DeCommitFreeBlockThreshold;
    ULONG       DeCommitTotalFreeThreshold;
    ULONG       LockPrefixTable;            // VA
    ULONG       MaximumAllocationSize;
    ULONG       VirtualMemoryThreshold;
    ULONG       ProcessHeapFlags;
    ULONG       ProcessAffinityMask;
    USHORT      CSDVersion;
    USHORT      Reserved1;
    ULONG       EditList;                   // VA
    ULONG_PTR   *SecurityCookie;
    PVOID       *SEHandlerTable;
    ULONG       SEHandlerCount;
} IMAGE_LOAD_CONFIG_DIRECTORY32_2;

extern
const IMAGE_LOAD_CONFIG_DIRECTORY32_2 _load_config_used = {
    sizeof(IMAGE_LOAD_CONFIG_DIRECTORY32_2),
    0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0,
    &__security_cookie,
    __safe_se_handler_table,
    (ULONG)(ULONG_PTR) &__safe_se_handler_count
};

Решение N3

Взять готовый пустой проект драйверв для VS 2005 и добавить туда свои исходники. А взять его можно вместе с VC6 project for kernel mode driver. В архиве, в подкаталоге pch_cpp. Или создать самому, руководствуясь VC8 project for kernel mode driver.

По сути, это уже будет почти что конвертация проекта из VS6 в VS8.


2006.11.23, обновлено 2006.12.02

См. также:

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