阅读:3613回复:6
关于RtlInitEmptyUnicodeString
不好意思,我是初学者,对这个函数有点疑问
这个函数的定义里面有一个参数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); // 字符串拷贝! 先谢谢各位高手 |
|
沙发#
发布于: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" |
|
板凳#
发布于:2009-06-02 17:20
先谢谢楼上的回复。
如果dst_buf仅仅是初始化一个长度为256的空字符串,开辟一块内存空间的话, 那我不如声明一个UNICODE_STRING, 然后手工初始化3个域(麻烦程度和调用这个函数我觉得差不多),也达到了目的, 为什么还需要用RtlInitEmptyUnicodeString这个方法来初始化呢。 |
|
地板#
发布于:2009-06-02 21:19
unicodestring是一个结构,实际的存贮区要你分配。
你看它的结构,再看这个宏的实现就明白了。 它是把你的分析的缓冲区指针给这个结构,然后设置相关的长度,比如最大长度,目前实际长度(清空是为0) 我建议你看一下这个结构是怎么样的,可以看看walter oney 的 programmin the wdm |
|
|
地下室#
发布于:2009-06-02 21:22
你可以这样理解,unicode_string 结构就象是一个桶架子,上面有一块铭牌记录桶的容量和已经使用的容量,这架子本身不能装东东。你得自己分配一块内存传给它(相当于你自己去买一只桶,放到架子上去),这个数的作用就是,把桶放好,然后告诉系统,我是空的,容量是(分配的缓冲长度)xxx,实际已经用的是0(就是还没使用)。
|
|
|
5楼#
发布于:2009-06-02 23:18
谢谢管理员,这个比喻非常易懂,对于unicode_string 结构大致明白,这部分概念看来还要多体会。
不过后面还有一些没想通, 就是用RtlInitEmptyUnicodeString方法来初始化empty UnicodeString和直接声明一个UnicodeString然后手工去初始化它的3个域(貌似都是买桶水放到架子上),是不是性质一样呢, 还是说即使是声明一个UnicodeString然后手工去初始化它以后,还必须使用RtlInitEmptyUnicodeString来告诉系统我是空的,容量是(分配的缓冲长度)xxx,实际已经用的是0(就是还没使用)? |
|
6楼#
发布于:2009-06-05 08:52
RtlInitEmptyUnicodeString作用就是初始化UNICODE_STRING 中的三个域,你都自己初始化了,还用它做什么呢?
|
|