【问题标题】:swprintf unexpected resultsswprintf 意外结果
【发布时间】:2014-07-09 10:46:04
【问题描述】:

我正在尝试使用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"

那么,什么是 reson,null 终止字符?不应该用 swprintf 自动正确处理吗?

【问题讨论】:

    标签: c++ c


    【解决方案1】:

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

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

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

    【讨论】:

    • 为什么这个不起作用? RtlStringCbPrintfW(buffer, sizeof(buffer), L"%.*s%s", dataPath.Length, dataPath.Buffer, L"\\"); ..L"\\" 为空终止
    • 什么不行? buffer 的值是多少?
    • 喜欢“\Device\HarddiskVolume2\foo\Data??C???” .我发现正确的答案有 UNICODE_STRING 的特殊参数 %wZ,它有效,所以解决了
    • 好的,所以使用%wZ 是您问题的实际答案。抱歉误导了。
    【解决方案2】:
    %wZ 
    

    Type Field Character 应该用于 UNICODE_STRING 结构。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-10-09
      • 2018-09-04
      • 2017-06-02
      • 2021-11-11
      • 2019-03-23
      • 1970-01-01
      • 2014-03-21
      • 2011-09-15
      相关资源
      最近更新 更多