#c #windows #driver #wdk
#c #Windows #драйвер #wdk
Вопрос:
В настоящее время я играю с WDK и хотел использовать std ::unique_ptr с пользовательским удалителем, чтобы избежать вызова ObDereferenceObject, ExFreePoolWithTag
. Но кажется, что при включении <utility>
проект просто прерывается и не работает, т.е. Показывает, что перегрузка не соответствует (нет T*
) вводу для моего уникального ptr. При использовании того же кода в «обычном» проекте все работает нормально.
#include <memory>
struct PoolDeleter
{
void operator( )(void* arg) const
{
if (arg)
ExFreePoolWithTag(arg, 0);
}
};
using PoolBuffer = std::unique_ptr<void, PoolDeleter>;
// Example inside functions
PoolBuffer buffer{ ExAllocatePoolZero(NonPagedPool, 0x2000, POOL_TAG) };
Это приводит к
Severity Code Description Project File Line Suppression State
Error (active) E0289 no instance of constructor "std::unique_ptr<_Ty, _Dx>::unique_ptr [with _Ty=void, _Dx=PoolDeleter]" matches the argument list
указывает на отсутствие перегрузки T*
. Также при добавлении <memory>
всего решения возникают ошибки с несколькими ошибками.
Severity Code Description Project File Line Suppression State
Error (active) E0282 the global scope has no "_Mbstatet" Driver.sys (DriverDriver.sys) - x64-Debug F:Program FilesMicrosoft Visual Studio2019BuildToolsVCToolsMSVC14.28.29910includecstdio 38
Error (active) E0282 the global scope has no "snprintf" Driver.sys (DriverDriver.sys) - x64-Debug F:Program FilesMicrosoft Visual Studio2019BuildToolsVCToolsMSVC14.28.29910includecstdio 84
Error (active) E0282 the global scope has no "vfscanf" Driver.sys (DriverDriver.sys) - x64-Debug F:Program FilesMicrosoft Visual Studio2019BuildToolsVCToolsMSVC14.28.29910includecstdio 86
Error (active) E0282 the global scope has no "vscanf" Driver.sys (DriverDriver.sys) - x64-Debug F:Program FilesMicrosoft Visual Studio2019BuildToolsVCToolsMSVC14.28.29910includecstdio 87
Error (active) E0282 the global scope has no "vsscanf" Driver.sys (DriverDriver.sys) - x64-Debug F:Program FilesMicrosoft Visual Studio2019BuildToolsVCToolsMSVC14.28.29910includecstdio 88
Error (active) E0282 the global scope has no "lldiv_t" Driver.sys (DriverDriver.sys) - x64-Debug F:Program FilesMicrosoft Visual Studio2019BuildToolsVCToolsMSVC14.28.29910includecstdlib 66
Error (active) E0282 the global scope has no "atoll" Driver.sys (DriverDriver.sys) - x64-Debug F:Program FilesMicrosoft Visual Studio2019BuildToolsVCToolsMSVC14.28.29910includecstdlib 73
Error (active) E0282 the global scope has no "llabs" Driver.sys (DriverDriver.sys) - x64-Debug F:Program FilesMicrosoft Visual Studio2019BuildToolsVCToolsMSVC14.28.29910includecstdlib 74
Error (active) E0282 the global scope has no "lldiv" Driver.sys (DriverDriver.sys) - x64-Debug F:Program FilesMicrosoft Visual Studio2019BuildToolsVCToolsMSVC14.28.29910includecstdlib 75
Error (active) E0282 the global scope has no "strtof" Driver.sys (DriverDriver.sys) - x64-Debug F:Program FilesMicrosoft Visual Studio2019BuildToolsVCToolsMSVC14.28.29910includecstdlib 76
Error (active) E0282 the global scope has no "strtold" Driver.sys (DriverDriver.sys) - x64-Debug F:Program FilesMicrosoft Visual Studio2019BuildToolsVCToolsMSVC14.28.29910includecstdlib 77
Error (active) E0282 the global scope has no "strtoll" Driver.sys (DriverDriver.sys) - x64-Debug F:Program FilesMicrosoft Visual Studio2019BuildToolsVCToolsMSVC14.28.29910includecstdlib 78
Error (active) E0282 the global scope has no "strtoull" Driver.sys (DriverDriver.sys) - x64-Debug F:Program FilesMicrosoft Visual Studio2019BuildToolsVCToolsMSVC14.28.29910includecstdlib 79
Error (active) E0282 the global scope has no "_Exit" Driver.sys (DriverDriver.sys) - x64-Debug F:Program FilesMicrosoft Visual Studio2019BuildToolsVCToolsMSVC14.28.29910includecstdlib 81
Error (active) E0282 the global scope has no "at_quick_exit" Driver.sys (DriverDriver.sys) - x64-Debug F:Program FilesMicrosoft Visual Studio2019BuildToolsVCToolsMSVC14.28.29910includecstdlib 82
Error (active) E0282 the global scope has no "quick_exit" Driver.sys (DriverDriver.sys) - x64-Debug F:Program FilesMicrosoft Visual Studio2019BuildToolsVCToolsMSVC14.28.29910includecstdlib 83
Error (active) E0282 the global scope has no "vfwscanf" Driver.sys (DriverDriver.sys) - x64-Debug F:Program FilesMicrosoft Visual Studio2019BuildToolsVCToolsMSVC14.28.29910includecwchar 88
Error (active) E0282 the global scope has no "vswscanf" Driver.sys (DriverDriver.sys) - x64-Debug F:Program FilesMicrosoft Visual Studio2019BuildToolsVCToolsMSVC14.28.29910includecwchar 89
Error (active) E0282 the global scope has no "vwscanf" Driver.sys (DriverDriver.sys) - x64-Debug F:Program FilesMicrosoft Visual Studio2019BuildToolsVCToolsMSVC14.28.29910includecwchar 90
Error (active) E0282 the global scope has no "wcstof" Driver.sys (DriverDriver.sys) - x64-Debug F:Program FilesMicrosoft Visual Studio2019BuildToolsVCToolsMSVC14.28.29910includecwchar 91
Error (active) E0282 the global scope has no "wcstold" Driver.sys (DriverDriver.sys) - x64-Debug F:Program FilesMicrosoft Visual Studio2019BuildToolsVCToolsMSVC14.28.29910includecwchar 92
Error (active) E0282 the global scope has no "wcstoll" Driver.sys (DriverDriver.sys) - x64-Debug F:Program FilesMicrosoft Visual Studio2019BuildToolsVCToolsMSVC14.28.29910includecwchar 93
Error (active) E0282 the global scope has no "wcstoull" Driver.sys (DriverDriver.sys) - x64-Debug F:Program FilesMicrosoft Visual Studio2019BuildToolsVCToolsMSVC14.28.29910includecwchar 94
Error (active) E0864 enable_if_t is not a template Driver.sys (DriverDriver.sys) - x64-Debug F:Program FilesMicrosoft Visual Studio2019BuildToolsVCToolsMSVC14.28.29910includelimits 1094
Error (active) E0864 enable_if_t is not a template Driver.sys (DriverDriver.sys) - x64-Debug F:Program FilesMicrosoft Visual Studio2019BuildToolsVCToolsMSVC14.28.29910includememory 3578
Error (active) E0864 enable_if_t is not a template Driver.sys (DriverDriver.sys) - x64-Debug F:Program FilesMicrosoft Visual Studio2019BuildToolsVCToolsMSVC14.28.29910includememory 3583
Error (active) E0864 enable_if_t is not a template Driver.sys (DriverDriver.sys) - x64-Debug F:Program FilesMicrosoft Visual Studio2019BuildToolsVCToolsMSVC14.28.29910includememory 3589
Error (active) E0864 enable_if_t is not a template Driver.sys (DriverDriver.sys) - x64-Debug F:Program FilesMicrosoft Visual Studio2019BuildToolsVCToolsMSVC14.28.29910includememory 3610
Error (active) E0864 enable_if_t is not a template Driver.sys (DriverDriver.sys) - x64-Debug F:Program FilesMicrosoft Visual Studio2019BuildToolsVCToolsMSVC14.28.29910includememory 3717
F:Program FilesMicrosoft Visual Studio2019BuildToolsVCToolsMSVC14.28.29910includevcruntime.h(61): error C2220: the following warning is treated as an error
F:Program FilesMicrosoft Visual Studio2019BuildToolsVCToolsMSVC14.28.29910includevcruntime.h(61): warning C4083: expected ')'; found identifier '_VCRUNTIME_DISABLED_WARNINGS'
F:Program FilesMicrosoft Visual Studio2019BuildToolsVCToolsMSVC14.28.29910includevcruntime.h(111): warning C4005: '_CRT_STRINGIZE': macro redefinition
F:Program FilesWindows Kits10Include10.0.22000.0kmcrtcrtdefs.h(85): note: see previous definition of '_CRT_STRINGIZE'
F:Program FilesMicrosoft Visual Studio2019BuildToolsVCToolsMSVC14.28.29910includevcruntime.h(114): warning C4005: '_CRT_WIDE': macro redefinition
F:Program FilesWindows Kits10Include10.0.22000.0kmcrtcrtdefs.h(88): note: see previous definition of '_CRT_WIDE'
F:Program FilesMicrosoft Visual Studio2019BuildToolsVCToolsMSVC14.28.29910includevcruntime.h(155): warning C4005: '__CRTDECL': macro redefinition
F:Program FilesWindows Kits10Include10.0.22000.0kmcrtcrtdefs.h(640): note: see previous definition of '__CRTDECL'
F:Program FilesWindows Kits10Include10.0.22000.0kmcrtyvals.h(35): warning C4005: '_STD': macro redefinition
F:Program FilesMicrosoft Visual Studio2019BuildToolsVCToolsMSVC14.28.29910includeyvals_core.h(1281): note: see previous definition of '_STD'
F:Program FilesWindows Kits10Include10.0.22000.0kmcrtyvals.h(37): warning C4005: '_STD_END': macro redefinition
F:Program FilesMicrosoft Visual Studio2019BuildToolsVCToolsMSVC14.28.29910includeyvals_core.h(1280): note: see previous definition of '_STD_END'
F:Program FilesWindows Kits10Include10.0.22000.0kmcrtxstddef(26): fatal error C1189: #error: "_HAS_EXCEPTIONS == 0 is not supported."
ninja: build stopped: subcommand failed.
Я использую последнюю Windows 11 EWDK
версию.
Есть ли какое-либо исправление для этого или его просто невозможно использовать std::unique_ptr
в драйвере? В противном случае я бы просто создал простой класс-оболочку, который обрабатывает очистку для меня, но использование интеллектуальных указателей было бы лучше, поскольку это в значительной степени изобретает велосипед.
С уважением, Артур
Комментарии:
1. Почему вы включаете
<utility>
std::unique_ptr
wherefore в<memory>
? Вам лучше опубликовать полное сообщение об ошибках вместо вашего описания.2. @S.M. Я отредактировал первоначальный вопрос с точным кодом и ошибками. Я как-то запутался там, мой плохой.
<utility>
дляstd::pair
3. Ошибки находятся на вкладке вывода. То, что вы опубликовали, — это список ошибок.
4. вы не можете использовать среду выполнения c / c в режиме ядра
5. @S.M. Добавлено @RbMm Знаете ли вы о каком-либо другом лучшем способе создания класса-оболочки и последующего вызова
ExFreePoolWithTag
dtor, чтобы не обрабатывать очистку вручную?
Ответ №1:
Среда выполнения C для ядра NT не включает поддержку исключений C . К сожалению, это нарушает большую часть C STL. Официальная спецификация C (пока) не содержит каких-либо исключений для подмножества STL без исключений, и разработчики Microsoft STL (пока) официально не обязались поддерживать такое подмножество.
Неофициально разработчики Microsoft STL хотят, чтобы несколько базовых заголовков, например <type_traits>
, можно было использовать в контексте ядра NT. Таким образом, вы можете обнаружить, что несколько заголовков работают в режиме ядра максимально эффективно. Поскольку Microsoft STL имеет открытый исходный код, вы можете помочь с их неофициальным проектом, чтобы заставить части их STL работать в ядре NT.
Кроме того, существует несколько библиотек C , которые предоставляют функции, подобные STL, не требуя поддержки исключений C . Например, библиотека wil включает в себя a wistd_memory.h
, которая предлагает примерно тот же интерфейс, <memory>
что и, за исключением wistd::
пространства имен, включая a wistd::unique_ptr<T>
. Библиотека wil поддерживается командой Windows в Microsoft и широко используется в кодовой базе Windows, в том числе в нескольких основных драйверах ядра.
Вероятно, вы можете найти несколько других библиотек C , которые предлагают разумную std::unique_ptr
замену, если вы ищете библиотеки C , которые не генерируют исключения. Вы можете быстро определить, что библиотека не подходит для ядра NT, если grep показывает ее с помощью ключевых throw
слов или catch
.
Помимо исключений C , в среде выполнения C в ядре NT есть еще одна ошибка: среда выполнения не поставляется с глобальным operator new
и operator delete
. Вам нужно будет предоставить свой собственный operator new
, либо глобально и / или как член для всех ваших классов. К счастью, это небольшое количество шаблонов, которые вы можете просто добавить в любой проект драйвера C .
Комментарии:
1. Спасибо за этот потрясающий ответ. Я проверю библиотеку wil и посмотрю, достаточно ли этого, поскольку я просто заинтересован в автоматической очистке пулов, поскольку иногда за этим трудно уследить.