我已经使用mhook library
. 在特殊情况下,当 a定义为NtOpenFile()
时失败。在代码上定义它是.std::wstring
stack var
heap
working
代码可以正常工作,除非某个win32 application
(我们称之为 nuisance.exe)尝试打开现有的测试文件(如 c:\temp\anyfile.log)access fails
。大多数情况下返回 STATUS_INVALID_ACL (0xC0000077)。
我reduced my code
一行一行地发现错误发生在一个被调用的函数中定义了一个 std::wstring (下面这个例子)。每次在不同的操作系统上都会发生错误
NTSTATUS NtOpenFileApiHook::NtOpenFileHook(PHANDLE FileHandle,
ACCESS_MASK DesiredAccess,
POBJECT_ATTRIBUTES ObjectAttributes,
PIO_STATUS_BLOCK IoStatusBlock,
ULONG ShareAccess,
ULONG OpenOptions
)
{
NTSTATUS Status = STATUS_SUCCESS;
// using this function the call will fail
AfterThis_NtOpenFile_WillFail();
// using this function INSTEAD the call will work
AfterThis_NtOpenFile_WillWork();
// calling the real NtOpenFile using a pointer
// nothing was changed hier, the original parameters are passed
Status = RealNtOpenFile(FileHandle, ...);
return Status;
}
int AfterThis_NtOpenFile_WillFail()
{
std::wstring String = L"";
return 0;
}
int AfterThis_NtOpenFile_WillWork()
{
std::wstring * pString = new std::wstring();
pString->assign(L"");
delete pString;
return 0;
}
我已经为这个电话修复了这种方式。但我担心其他情况下的其他功能可能会失败,所以我正在寻找原因并(可能)寻找解决方案。
Nuisance.exe 是一个 C# 应用程序,默认堆栈大小调用一个我一无所知的 win32 dll。