Hooked NtOpenFile завершается ошибкой, когда в стеке определено std :: wstring

Я написал перехватив 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, о котором я ничего не знаю.

2

Решение

Задача ещё не решена.

Другие решения


По вопросам рекламы [email protected]