 |
Портирование проекта драйвера из 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).
Решение 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
См. также:
|
 |