swprintf出现意外结果

swprintf unexpected results

本文关键字:结果 意外 swprintf      更新时间:2023-10-16

我正在尝试使用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 "DeviceHarddiskVolume2fooData"
      +0x000 Length           : 0x8c
      +0x002 MaximumLength    : 0x8c
      +0x008 Buffer           : 0xffffc000`01cd1d00  "DeviceHarddiskVolume2fooData"

那么reson,以null结尾的字符是什么呢?swprintf不应该自动正确处理吗?

链接到的UNICODE_STRING文档指出,Buffer不一定以null结尾,%s格式需要以null结尾的字符串。

您可以通过指定精度来限制用%s打印的字符串的长度:

WCHAR* pszTxt = dataPath.Buffer;
int Len = dataPath.Length;
RtlStringCbPrintfW(buffer, sizeof(buffer), L"%.*s %d", Len, pszTxt, 1);
%wZ 

类型字段字符应用于UNICODE_STRING结构。