【发布时间】:2022-01-10 16:32:59
【问题描述】:
我目前正在使用 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 (Driver\Driver.sys) - x64-Debug F:\Program Files\Microsoft Visual Studio\2019\BuildTools\VC\Tools\MSVC\14.28.29910\include\cstdio 38
Error (active) E0282 the global scope has no "snprintf" Driver.sys (Driver\Driver.sys) - x64-Debug F:\Program Files\Microsoft Visual Studio\2019\BuildTools\VC\Tools\MSVC\14.28.29910\include\cstdio 84
Error (active) E0282 the global scope has no "vfscanf" Driver.sys (Driver\Driver.sys) - x64-Debug F:\Program Files\Microsoft Visual Studio\2019\BuildTools\VC\Tools\MSVC\14.28.29910\include\cstdio 86
Error (active) E0282 the global scope has no "vscanf" Driver.sys (Driver\Driver.sys) - x64-Debug F:\Program Files\Microsoft Visual Studio\2019\BuildTools\VC\Tools\MSVC\14.28.29910\include\cstdio 87
Error (active) E0282 the global scope has no "vsscanf" Driver.sys (Driver\Driver.sys) - x64-Debug F:\Program Files\Microsoft Visual Studio\2019\BuildTools\VC\Tools\MSVC\14.28.29910\include\cstdio 88
Error (active) E0282 the global scope has no "lldiv_t" Driver.sys (Driver\Driver.sys) - x64-Debug F:\Program Files\Microsoft Visual Studio\2019\BuildTools\VC\Tools\MSVC\14.28.29910\include\cstdlib 66
Error (active) E0282 the global scope has no "atoll" Driver.sys (Driver\Driver.sys) - x64-Debug F:\Program Files\Microsoft Visual Studio\2019\BuildTools\VC\Tools\MSVC\14.28.29910\include\cstdlib 73
Error (active) E0282 the global scope has no "llabs" Driver.sys (Driver\Driver.sys) - x64-Debug F:\Program Files\Microsoft Visual Studio\2019\BuildTools\VC\Tools\MSVC\14.28.29910\include\cstdlib 74
Error (active) E0282 the global scope has no "lldiv" Driver.sys (Driver\Driver.sys) - x64-Debug F:\Program Files\Microsoft Visual Studio\2019\BuildTools\VC\Tools\MSVC\14.28.29910\include\cstdlib 75
Error (active) E0282 the global scope has no "strtof" Driver.sys (Driver\Driver.sys) - x64-Debug F:\Program Files\Microsoft Visual Studio\2019\BuildTools\VC\Tools\MSVC\14.28.29910\include\cstdlib 76
Error (active) E0282 the global scope has no "strtold" Driver.sys (Driver\Driver.sys) - x64-Debug F:\Program Files\Microsoft Visual Studio\2019\BuildTools\VC\Tools\MSVC\14.28.29910\include\cstdlib 77
Error (active) E0282 the global scope has no "strtoll" Driver.sys (Driver\Driver.sys) - x64-Debug F:\Program Files\Microsoft Visual Studio\2019\BuildTools\VC\Tools\MSVC\14.28.29910\include\cstdlib 78
Error (active) E0282 the global scope has no "strtoull" Driver.sys (Driver\Driver.sys) - x64-Debug F:\Program Files\Microsoft Visual Studio\2019\BuildTools\VC\Tools\MSVC\14.28.29910\include\cstdlib 79
Error (active) E0282 the global scope has no "_Exit" Driver.sys (Driver\Driver.sys) - x64-Debug F:\Program Files\Microsoft Visual Studio\2019\BuildTools\VC\Tools\MSVC\14.28.29910\include\cstdlib 81
Error (active) E0282 the global scope has no "at_quick_exit" Driver.sys (Driver\Driver.sys) - x64-Debug F:\Program Files\Microsoft Visual Studio\2019\BuildTools\VC\Tools\MSVC\14.28.29910\include\cstdlib 82
Error (active) E0282 the global scope has no "quick_exit" Driver.sys (Driver\Driver.sys) - x64-Debug F:\Program Files\Microsoft Visual Studio\2019\BuildTools\VC\Tools\MSVC\14.28.29910\include\cstdlib 83
Error (active) E0282 the global scope has no "vfwscanf" Driver.sys (Driver\Driver.sys) - x64-Debug F:\Program Files\Microsoft Visual Studio\2019\BuildTools\VC\Tools\MSVC\14.28.29910\include\cwchar 88
Error (active) E0282 the global scope has no "vswscanf" Driver.sys (Driver\Driver.sys) - x64-Debug F:\Program Files\Microsoft Visual Studio\2019\BuildTools\VC\Tools\MSVC\14.28.29910\include\cwchar 89
Error (active) E0282 the global scope has no "vwscanf" Driver.sys (Driver\Driver.sys) - x64-Debug F:\Program Files\Microsoft Visual Studio\2019\BuildTools\VC\Tools\MSVC\14.28.29910\include\cwchar 90
Error (active) E0282 the global scope has no "wcstof" Driver.sys (Driver\Driver.sys) - x64-Debug F:\Program Files\Microsoft Visual Studio\2019\BuildTools\VC\Tools\MSVC\14.28.29910\include\cwchar 91
Error (active) E0282 the global scope has no "wcstold" Driver.sys (Driver\Driver.sys) - x64-Debug F:\Program Files\Microsoft Visual Studio\2019\BuildTools\VC\Tools\MSVC\14.28.29910\include\cwchar 92
Error (active) E0282 the global scope has no "wcstoll" Driver.sys (Driver\Driver.sys) - x64-Debug F:\Program Files\Microsoft Visual Studio\2019\BuildTools\VC\Tools\MSVC\14.28.29910\include\cwchar 93
Error (active) E0282 the global scope has no "wcstoull" Driver.sys (Driver\Driver.sys) - x64-Debug F:\Program Files\Microsoft Visual Studio\2019\BuildTools\VC\Tools\MSVC\14.28.29910\include\cwchar 94
Error (active) E0864 enable_if_t is not a template Driver.sys (Driver\Driver.sys) - x64-Debug F:\Program Files\Microsoft Visual Studio\2019\BuildTools\VC\Tools\MSVC\14.28.29910\include\limits 1094
Error (active) E0864 enable_if_t is not a template Driver.sys (Driver\Driver.sys) - x64-Debug F:\Program Files\Microsoft Visual Studio\2019\BuildTools\VC\Tools\MSVC\14.28.29910\include\memory 3578
Error (active) E0864 enable_if_t is not a template Driver.sys (Driver\Driver.sys) - x64-Debug F:\Program Files\Microsoft Visual Studio\2019\BuildTools\VC\Tools\MSVC\14.28.29910\include\memory 3583
Error (active) E0864 enable_if_t is not a template Driver.sys (Driver\Driver.sys) - x64-Debug F:\Program Files\Microsoft Visual Studio\2019\BuildTools\VC\Tools\MSVC\14.28.29910\include\memory 3589
Error (active) E0864 enable_if_t is not a template Driver.sys (Driver\Driver.sys) - x64-Debug F:\Program Files\Microsoft Visual Studio\2019\BuildTools\VC\Tools\MSVC\14.28.29910\include\memory 3610
Error (active) E0864 enable_if_t is not a template Driver.sys (Driver\Driver.sys) - x64-Debug F:\Program Files\Microsoft Visual Studio\2019\BuildTools\VC\Tools\MSVC\14.28.29910\include\memory 3717
F:\Program Files\Microsoft Visual Studio\2019\BuildTools\VC\Tools\MSVC\14.28.29910\include\vcruntime.h(61): error C2220: the following warning is treated as an error
F:\Program Files\Microsoft Visual Studio\2019\BuildTools\VC\Tools\MSVC\14.28.29910\include\vcruntime.h(61): warning C4083: expected ')'; found identifier '_VCRUNTIME_DISABLED_WARNINGS'
F:\Program Files\Microsoft Visual Studio\2019\BuildTools\VC\Tools\MSVC\14.28.29910\include\vcruntime.h(111): warning C4005: '_CRT_STRINGIZE': macro redefinition
F:\Program Files\Windows Kits\10\Include\10.0.22000.0\km\crt\crtdefs.h(85): note: see previous definition of '_CRT_STRINGIZE'
F:\Program Files\Microsoft Visual Studio\2019\BuildTools\VC\Tools\MSVC\14.28.29910\include\vcruntime.h(114): warning C4005: '_CRT_WIDE': macro redefinition
F:\Program Files\Windows Kits\10\Include\10.0.22000.0\km\crt\crtdefs.h(88): note: see previous definition of '_CRT_WIDE'
F:\Program Files\Microsoft Visual Studio\2019\BuildTools\VC\Tools\MSVC\14.28.29910\include\vcruntime.h(155): warning C4005: '__CRTDECL': macro redefinition
F:\Program Files\Windows Kits\10\Include\10.0.22000.0\km\crt\crtdefs.h(640): note: see previous definition of '__CRTDECL'
F:\Program Files\Windows Kits\10\Include\10.0.22000.0\km\crt\yvals.h(35): warning C4005: '_STD': macro redefinition
F:\Program Files\Microsoft Visual Studio\2019\BuildTools\VC\Tools\MSVC\14.28.29910\include\yvals_core.h(1281): note: see previous definition of '_STD'
F:\Program Files\Windows Kits\10\Include\10.0.22000.0\km\crt\yvals.h(37): warning C4005: '_STD_END': macro redefinition
F:\Program Files\Microsoft Visual Studio\2019\BuildTools\VC\Tools\MSVC\14.28.29910\include\yvals_core.h(1280): note: see previous definition of '_STD_END'
F:\Program Files\Windows Kits\10\Include\10.0.22000.0\km\crt\xstddef(26): fatal error C1189: #error: "_HAS_EXCEPTIONS == 0 is not supported."
ninja: build stopped: subcommand failed.
我使用的是最新的Windows 11 EWDK。
是否有任何解决方法,或者无法在驱动程序中使用std::unique_ptr?否则我只会创建一个简单的包装类来为我处理清理工作,但使用智能指针会更好,因为这几乎是在重新发明轮子。
问候阿图尔
【问题讨论】:
-
为什么包含
<utility>而std::unique_ptr在<memory>中?您最好发布完整的错误消息而不是您的描述。 -
@S.M.我用确切的代码和错误编辑了最初的问题。我不知何故在我的坏处感到困惑。
<utility>代表std::pair -
错误在输出选项卡中。您发布的是错误列表。
-
你不能在内核模式下使用 c/c++ 运行时
-
@S.M.添加了@RbMm 您是否知道创建包装类然后在 dtor 中调用
ExFreePoolWithTag以不手动处理清理的任何其他更好的方法?