WDK (Комплект драйверов Windows) проблемы с библиотекой утилит (std ::unique_ptr)

#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 и посмотрю, достаточно ли этого, поскольку я просто заинтересован в автоматической очистке пулов, поскольку иногда за этим трудно уследить.