【问题标题】:RtlStringCbCopyW Does copy only first char of the string why?RtlStringCbCopyW 为什么只复制字符串的第一个字符?
【发布时间】:2016-11-15 17:31:42
【问题描述】:

我在将字符串从一种类型复制到另一种类型时遇到问题。我在下面给出的有问题的代码。

DbgPrint("Value of ProcessName =%wZ \n",&ProcessName);
//The Type of ProcessName is UNICODE_STRING

RtlStringCbCopyW(myBuffer,((MAX_PATH+90)*sizeof(WCHAR)),ProcessName.Buffer);
//try to copy from ProcessName.Buffer to myBuffer

DbgPrint("Value of MyBuffer =%s \n",MyBuffer);
//The Type of MyBuffer is Array of WCHAR

DbgPrint("Value of ProcessName.Buffer =%s \n",ProcessName.Buffer);

输出:-

Value of ProcesssName =\Device\HarddiskVolume1\Windows\explorer.exe
Value of MyBuffer =\
Value of ProcesssName.Buffer =\

为什么会这样?

【问题讨论】:

    标签: unicode-string


    【解决方案1】:

    您的问题在DbgPrint 中的格式无效%s - 您需要改用%S。你的情况下的字符串复制正确,你只是不正确地显示它 - %s 在第一个 \0 字节(在第一个 WCHAR 符号中)之后的停止处假定 ansi 字符串。但是在一般情况下,使用 RtlStringCbCopyW 是错误的 - 因为 UNICODE_STRING 不能以空值结尾并且可以包含空字符。需要使用RtlCopyUnicodeString。最后这与driver minifilterkernel-mode 无关,仅与unicode-string 无关

    【讨论】:

    • 非常感谢..它现在可以工作了。实际上我正在对 minifilter 驱动程序进行内核模式编程,这就是我添加这些标签的原因..
    • 我还有一个问题,如果我想从 \Device\HarddiskVolume1\Windows\explorer.exe 中提取 \Windows\explorer.exe 我需要做什么?
    • @KashifMeo-您在“提取”下的意思是什么?如果您只想从完整的 nt-path 获取 FS 路径 - 可以打开文件然后查询它FileNameInformation
    • 意味着我想要来自这个字符串 \Device\HarddiskVolume1\Windows\explorer.exe 的这个子字符串 Windows\explorer.exe。实际上我必须比较两个字符串,这就是我想要这个子字符串的原因
    • 其他字符串来自用户模式。形式为 Windows\explorer.exe
    猜你喜欢
    • 2021-01-28
    • 1970-01-01
    • 2016-09-15
    • 2014-11-22
    • 2021-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多