我正在尝试调试打印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: CCreateFileW: \

如何正确将其插入缓冲区?

谢谢你。

最佳答案

您需要告诉sprintf()您传递一个宽字符串。使用%ls说明符:

 sprintf_s(buffer, 1024, "CreateFileW: %ls", lpFileName);

请注意这是多么无用的。您的代码在Unicode操作系统上运行。它必须将char []字符串转换回宽字符串,然后才能将其发送到调试器。这只是浪费了CPU周期,并且存在丢失引导数据的巨大风险。在罗马时,请像罗马人一样使用wchar_t + wsprintf()。然后#define UNICODE,因此您将自动调用快速的OutputDebugStringW(),它不必转换字符串。使用C++的重点是编写快速代码,故意使速度变慢是没有意义的。

08-18 15:19