Я пытаюсь отладить печать LPCWSTR
строка, но я получаю проблему во время sprintf
продвиньте в буфере, потому что он получает только первый символ от строки.
Вот код:
HANDLE WINAPI hookedCreateFileW(LPCWSTR lpFileName, DWORD dwDesiredAccess, DWORD dwShareMode, LPSECURITY_ATTRIBUTES lpSecurityAttributes, DWORD dwCreationDisposition, DWORD dwFlagsAndAttributes, HANDLE hTemplateFile) {
char buffer[1024];
sprintf_s(buffer, 1024, "CreateFileW: %s", lpFileName);
OutputDebugString(buffer);
return trueCreateFileW(lpFileName, dwDesiredAccess, dwShareMode, lpSecurityAttributes, dwFlagsAndAttributes, dwCreationDisposition, hTemplateFile);
}
Например, я добираюсь CreateFileW: C
или CreateFileW: \
.
Как я правильно продвигаю его в буфер?
Спасибо.
Вам нужно сообщить sprintf (), что вы передаете строку широких символов. Используйте спецификатор% ls:
sprintf_s(buffer, 1024, "CreateFileW: %ls", lpFileName);
Обратите внимание, насколько это непродуктивно. Ваш код работает в операционной системе Unicode. Он должен преобразовать вашу строку char [] обратно в широкую строку, прежде чем она сможет отправить ее отладчику. Это просто потраченные впустую циклы ЦП со значительным риском потери данных при загрузке. Когда вы находитесь в Риме, ведите себя как римлянин и используйте wchar_t + wsprintf (). И #define UNICODE, чтобы вы автоматически вызывали быстрый OutputDebugStringW (), тот, который не должен преобразовывать строку. Смысл использования C ++ в том, чтобы писать быстрый код, намеренно делать медленный бессмысленно.
Если у вас нет конкретной причины использовать Unicode в этой единственной функции (а не, скажем, во всем вашем проекте), было бы разумно использовать макросы, не зависящие от кодировки, везде, где это возможно:
HANDLE WINAPI hookedCreateFile(LPCTSTR lpFileName, DWORD dwDesiredAccess, DWORD dwShareMode, LPSECURITY_ATTRIBUTES lpSecurityAttributes, DWORD dwCreationDisposition, DWORD dwFlagsAndAttributes, HANDLE hTemplateFile) {
TCHAR buffer[1024];
_stprintf_s(buffer, 1024, _T("CreateFileW: %s"), lpFileName);
OutputDebugString(buffer);
return trueCreateFile(lpFileName, dwDesiredAccess, dwShareMode, lpSecurityAttributes, dwFlagsAndAttributes, dwCreationDisposition, hTemplateFile);
}
Используйте swprintf_s , который является версией sprintf_s, разработанной для строк с расширенными символами.
Вам также понадобится массив wchar_t
вместо char
и для использования OutputDebugStringW ()
Также обратите внимание, что swprintf_w
может быть не совсем то, что вы хотите назвать. Если он встречает строку, длина которой превышает заданный вами размер, он выполняет какое-то утверждение. Предлагаю вам конкретно протестировать эту ситуацию.