我正在尝试将两个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);
}
答案 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);
}
}