将PUNICODE_STRING写入文件,得到垃圾数据

时间:2017-03-14 12:48:03

标签: c++ windows visual-c++

我正在尝试将两个PUNICODE_STRING结构写入文件,但写入的数据无效,有什么想法吗?

(在这种情况下,data1为123,data2为456

DWORD dwBytesWritten = 0;
WCHAR buffer[1024];
HANDLE hFile = CreateFile(L"c:\\log.txt", FILE_APPEND_DATA, 0, NULL, 
    OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);

if (hFile != INVALID_HANDLE_VALUE)
{
    memset(buffer, 0, sizeof(buffer));
    wsprintf(buffer, L"%s :: %s\r\n", Data1->Buffer, Data2->Buffer);

    WriteFile(hFile, buffer, wcslen(buffer), &dwBytesWritten, NULL);
    CloseHandle(hFile);
}

1 个答案:

答案 0 :(得分:1)

主要错误是

WriteFile(hFile, buffer, wcslen(buffer), &dwBytesWritten, NULL);

WriteFile始终将 bytes 的数量写入文件。但wcslen会返回字符的数量,以防UINICODE减少2次 - 需要* sizeof(WCHAR)<< 1

然后格式UNICODE_STRING需要使用%wZ格式 - 因为通常情况下Buffer不能终止。最好使用swprintf_snwprintf代替wsprintf

在最后总是更好的动态分配所需的缓冲区,然后使用硬编码大小,可以覆盖

所以我将使用下一个代码:

void test(PCUNICODE_STRING Data1, PCUNICODE_STRING Data2)
{
    DWORD dwBytesWritten;
    PWSTR buffer = (PWSTR)alloca(Data1->Length + Data2->Length + sizeof(L" :: \r\n"));
    int n = swprintf(buffer, L"%wZ :: %wZ\r\n", Data1, Data2) * sizeof(WCHAR);

    HANDLE hFile = CreateFile(L"c:\\log.txt", FILE_APPEND_DATA, 0, NULL, 
        OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);

    if (hFile != INVALID_HANDLE_VALUE)
    {
        WriteFile(hFile, buffer, n, &dwBytesWritten, NULL);
        CloseHandle(hFile);
    }
}