钓鱼太郎
驱动牛犊
驱动牛犊
  • 注册日期2006-03-24
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分8分
  • 威望91点
  • 贡献值0点
  • 好评度24点
  • 原创分0分
  • 专家分0分
阅读:3287回复:6

关于RtlInitEmptyUnicodeString

楼主#
更多 发布于:2009-06-02 10:55
不好意思,我是初学者,对这个函数有点疑问

这个函数的定义里面有一个参数IN PCWSTR  Buffer,
文档里面说这个参数是一个指向调用者分配的WCHAR类型的buffer,


我不明白的是既然是初始化一个空的UnicodeString,那为什么还需要这个参数呢。

函数原型:
VOID
  RtlInitEmptyUnicodeString(
    IN OUT PUNICODE_STRING  DestinationString,
    IN PCWSTR  Buffer,
    IN USHORT  BufferSize
    );


另外在Windows驱动编程基础教程里面
字符串的拷贝这一段里面使用了以下的做法,
只是声明了一个WCHAR dst_buf[256];(注意他的解释,这个解释我没明白什么意思)
然后传给这个函数,不明白到底为什么要传这个参数,如果仅仅是为了内存的大小,
那第三个参数不是BufferSize已经起到这个作用了么
UNICODE_STRING dst;            // 目标字符串
    WCHAR dst_buf[256];                // [color=#FF0000]我们现在还不会分配内存,所以先定义缓冲区[/color]
    UNICODE_STRING src = RTL_CONST_STRING(L”My source string!”);
   
    // 把目标字符串初始化为拥有缓冲区长度为256的UNICODE_STRING空串。
    RtlInitEmptyString(dst,dst_buf,256*sizeof(WCHAR));
    RtlCopyUnicodeString(&dst,&src);    // 字符串拷贝!


先谢谢各位高手


bjjxh
驱动牛犊
驱动牛犊
  • 注册日期2009-04-21
  • 最后登录2010-09-20
  • 粉丝0
  • 关注0
  • 积分23分
  • 威望231点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分1分
沙发#
发布于:2009-06-02 16:51
我的理解是,
要用IN PCWSTR  Buffer,
     IN USHORT  BufferSize
去初始化
  IN OUT PUNICODE_STRING  DestinationString
中的Length
  MaximumLength
  Buffer
试想,如果没有了第一个参数,你去初始化啥?
没看到它的解释吗:
DestinationString
Pointer to the UNICODE_STRING structure to be initialized
"to be initialized"
钓鱼太郎
驱动牛犊
驱动牛犊
  • 注册日期2006-03-24
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分8分
  • 威望91点
  • 贡献值0点
  • 好评度24点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2009-06-02 17:20
先谢谢楼上的回复。

如果dst_buf仅仅是初始化一个长度为256的空字符串,开辟一块内存空间的话,
那我不如声明一个UNICODE_STRING,
然后手工初始化3个域(麻烦程度和调用这个函数我觉得差不多),也达到了目的,
为什么还需要用RtlInitEmptyUnicodeString这个方法来初始化呢。
znsoft
管理员
管理员
  • 注册日期2001-03-23
  • 最后登录2023-10-25
  • 粉丝300
  • 关注6
  • 积分910分
  • 威望14796点
  • 贡献值7点
  • 好评度2410点
  • 原创分5分
  • 专家分100分
  • 社区居民
  • 最爱沙发
  • 社区明星
地板#
发布于:2009-06-02 21:19
unicodestring是一个结构,实际的存贮区要你分配。
你看它的结构,再看这个宏的实现就明白了。
它是把你的分析的缓冲区指针给这个结构,然后设置相关的长度,比如最大长度,目前实际长度(清空是为0)
我建议你看一下这个结构是怎么样的,可以看看walter oney 的 programmin the wdm
http://www.zndev.com 免费源码交换网 ----------------------------- 软件创造价值,驱动提供力量! 淡泊以明志,宁静以致远。 ---------------------------------- 勤用搜索,多查资料,先搜再问。
znsoft
管理员
管理员
  • 注册日期2001-03-23
  • 最后登录2023-10-25
  • 粉丝300
  • 关注6
  • 积分910分
  • 威望14796点
  • 贡献值7点
  • 好评度2410点
  • 原创分5分
  • 专家分100分
  • 社区居民
  • 最爱沙发
  • 社区明星
地下室#
发布于:2009-06-02 21:22
你可以这样理解,unicode_string 结构就象是一个桶架子,上面有一块铭牌记录桶的容量和已经使用的容量,这架子本身不能装东东。你得自己分配一块内存传给它(相当于你自己去买一只桶,放到架子上去),这个数的作用就是,把桶放好,然后告诉系统,我是空的,容量是(分配的缓冲长度)xxx,实际已经用的是0(就是还没使用)。
http://www.zndev.com 免费源码交换网 ----------------------------- 软件创造价值,驱动提供力量! 淡泊以明志,宁静以致远。 ---------------------------------- 勤用搜索,多查资料,先搜再问。
钓鱼太郎
驱动牛犊
驱动牛犊
  • 注册日期2006-03-24
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分8分
  • 威望91点
  • 贡献值0点
  • 好评度24点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2009-06-02 23:18
谢谢管理员,这个比喻非常易懂,对于unicode_string 结构大致明白,这部分概念看来还要多体会。

不过后面还有一些没想通,
就是用RtlInitEmptyUnicodeString方法来初始化empty UnicodeString和直接声明一个UnicodeString然后手工去初始化它的3个域(貌似都是买桶水放到架子上),是不是性质一样呢,

还是说即使是声明一个UnicodeString然后手工去初始化它以后,还必须使用RtlInitEmptyUnicodeString来告诉系统我是空的,容量是(分配的缓冲长度)xxx,实际已经用的是0(就是还没使用)?
xinlingzhihuo
驱动牛犊
驱动牛犊
  • 注册日期2009-03-24
  • 最后登录2011-02-24
  • 粉丝0
  • 关注0
  • 积分31分
  • 威望281点
  • 贡献值2点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2009-06-05 08:52
RtlInitEmptyUnicodeString作用就是初始化UNICODE_STRING 中的三个域,你都自己初始化了,还用它做什么呢?
游客

返回顶部