我正在尝试使用RtlStringCbPrintfW(swprintf的安全版本),并在将int附加到字符串时获得意外结果。 如果我在int之后附加相同的字符串 - 所有工作。所以我的代码:
WCHAR buffer[256];
LPCWSTR pszFormat = L"%s %d";
WCHAR* pszTxt = dataPath.Buffer;//*
status = RtlStringCbPrintfW(buffer, sizeof(buffer), pszFormat, pszTxt, 1);
当监视缓冲区数组时,我可以看到'?'是:
0xcc00 '?'
0xcccc '?'
然后在一些字节后实际找到目标值1。 dataPath.Buffer的值:
+0x048 DataPath : _UNICODE_STRING "\Device\HarddiskVolume2\foo\Data"
+0x000 Length : 0x8c
+0x002 MaximumLength : 0x8c
+0x008 Buffer : 0xffffc000`01cd1d00 "\Device\HarddiskVolume2\foo\Data"
那么什么是共振,空终止的char?不能用swprintf自动正确处理?
答案 0 :(得分:2)
链接到UNICODE_STRING
的{{1}}文档,Buffer
不一定以空终止,%s
格式需要以空字符结尾的字符串。
您可以通过指定精度来限制使用%s
打印的字符串的长度:
WCHAR* pszTxt = dataPath.Buffer;
int Len = dataPath.Length;
RtlStringCbPrintfW(buffer, sizeof(buffer), L"%.*s %d", Len, pszTxt, 1);
答案 1 :(得分:0)
%wZ
Type Field Character应该用于UNICODE_STRING结构。