内核开发中的UNICODE String
来源:互联网 发布:豚鼠实验 知乎 编辑:程序博客网 时间:2024/05/22 03:40
UNICODE 和 ExAllocatePool
内核在UNICODE拼接或其他临时操作时,经常使用ExAllocatePool动态分配UNICODE的Buffer,简单情况:
UNICODE_STRING str;
str.Buffer = ExAllocatePool(NonPagedPool, 50*sizeof(WCHAR));
str.Length = 0;
str.MaximumLength = 50*sizeof(WCHAR);
但若是定义一个UNICODE的指针,则如何初始化UNICODE ?
PUNICODE_STRING pStr;
因为定义了一个指针,但指针目前并没有指向可用的内存地址,故先分配一块内存(NonPagedPool),让pStr指向这块内存。
pStr = ExAllocatePool(NonPagedPool, 50*sizeof(WCHAR));
接着初始化成员:
pStr.Length = 0;
pStr.MaximumLength = ???;
如何初始化Buffer ?
因为UNICODE_STRING 是一个数据结构,我们申请一块内存来存储这个数据结构,所以这块内存不仅存储了Buffer这个我们最关心的字符串,而且还储存这个数据结构,即Length 、 MaximumLength 和 Buffer (指针)成员。因为pStr是这块内存的起始地址,所以:
&pStr.Length = (USHORT*)pStr
&pStr.MaximumLength = (USHORT*)pStr + 1
&pStr.Buffer = (USHORT*)pStr + 2
所以得:
pStr.Buffer = (WCHAR*)((USHORT*)pStr + 2 + 2 ) 因为一个USHORT占2个字节,一个指针占4个字节。这时得出,pStr.MaximumLength = 50*sizeof(WCHAR) - (2+2+4);
(注意,以上是为了方便观察特意写成赋值形式,但在编译器中并不适用,因为=左边得为左值。)
完整:
PUNICODE_STRING pStr;
pStr = ExAllocatePool(NonPagedPool, 50*sizeof(WCHAR));
pStr.Buffer = (WCHAR*)( (USHORT*)pStr + 2 + 2 ) ;
pStr.Length = 0;
pStr.MaximumLength = 50*sizeof(WCHAR) - (2+2+4);
总结:
定义UNICODE_STRING 时,编译器在栈上自动分配了存储UNICODE_STRING这个数据结构的空间,我们唯一要做的就是给Buffer这个指针成员(指向)分配内存。
而定义PUNICODE_STRING时,在堆上分配了一块内存,这块内存不仅存储了Buffer,而且还存储了UNICODE_STRING这个数据结构。所以定义为PUNICODE_STRING时,要比预期的字符串至少多8个字节,就因为此。
- 内核开发中的UNICODE String
- 关于python2中的string和unicode
- Python 2.x 中的 String 与 Unicode
- python的中的字符串类型:byte string和unicode string
- STL中的std::string与Unicode的使用
- 将string中的unicode转为汉字 其他不变
- string 转 unicode
- java String与unicode
- unicode CString -> std::string
- String Manipulations in Unicode
- java String与unicode
- unicode string 转化
- java String unicode 转换
- .net string unicode 转换
- unicode string javascript
- python string unicode字符串
- python unicode转string
- 编码问题,unicode,string
- 单文档多视图切换的解决办法
- ZOJ 2000 Palindrome Numbers
- return false 在js中用法
- java生产者与消费者问题
- Android 实现歌词同步
- 内核开发中的UNICODE String
- window fat and ntfs 文件系统
- 通过_stat结构体获取文件大小
- (Spring -ssh)避免循环依赖 (AOP)
- 开源绘图软件MyPaint 0.9
- 在VC++中读写INI文件
- 今天把自己的诺基亚5530XpressMusic软格了一下
- 802.1ad中的S-vlan C-Vlan
- eclipse 生成 dao 的分析,以及百度知道的问题