Я написал перехватив DLL, используя mhook library
. В особом случае 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, о котором я ничего не знаю.
Задача ещё не решена.