swprintf意外结果

时间:2014-07-09 10:46:04

标签: c++ c

我正在尝试使用RtlStringCbPrintfW(swprintf的安全版本),并在将int附加到字符串时获得意外结果。  如果我在int之后附加相同的字符串 - 所有工作。所以我的代码:

WCHAR buffer[256];

    LPCWSTR pszFormat = L"%s %d";

    WCHAR* pszTxt = dataPath.Buffer;//*

    status = RtlStringCbPrintfW(buffer, sizeof(buffer), pszFormat, pszTxt, 1);
  • 此处dataPath为UNICODE_STRING。所以dataPath.Buffer是PWCH
    这里看到缓冲区值是:buffer = wchar_t [168]“\ Device \ HarddiskVolume2 \ foo \ Data ?? C ???”

当监视缓冲区数组时,我可以看到'?'是:

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自动正确处理?

2 个答案:

答案 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结构。