驱动中的设置字符串

驱动中的字符串一般使用一个结构来容纳,而不是直接使用字符串的指针.

typedef struct _UNICODE_STRING{

USHORT Length; //存储在缓冲区中的字符串的长度,以字节为单位

USHORT MaximumLength; //缓冲区的长度,以字节为单位

PWSTR Buffer; //包含宽字符串的缓冲区的指针

} UNICODE_STRING *PUNICODE_STRING;

字符串是宽字符的,双字节.

UNICODE_STRING 结构是用来传递Unicode字符串的,使用 RtlUnicodeStringInit 或者 RtlUnicodeStringInitEx 来初始化结构

如果字符串长度为空,长度不包括结尾空字符

MaximumLength 声明缓冲区的最大长度,通过 RtlAnsiStringToUnicodeString 转换返回的长度将不超过这个长度.

列子:

UNICODE_STRING str = RTL_CONSTANT_STRING(L"misaka: hello world");

DbgPrint("%wZ",&str);

上面例子中的形式设置完成后不能在修改,可以使用以下方法(形如定义一个静态的串 WCHAR wcsBuffer[1024] = {0})

UNICODE_STRING str;

WCHAR wcsBuffer[1024] = {0};

RtlEmptyUnicodeString(&str, wcsBuffer, sizeof(wcsBuffer));

实例:

WCAHR temp[] = L"Hello World!";//定义宽字符串

UNICODE_STRING str;

str.Buffer = temp;//字符串的指针地址

str.Length = wcslen(temp)*sizeof(WCHAR);//这个长度为UNICODE字符串所占用的字节数,即字符的个数乘以每个字符所占的字节数.通常为:字符个数*2

str.MaximumLength = str.Length;//缓冲区的长度就是字符串的长度

或者动态申请空间(形如定义一个WCHAR* pwcsBuffer = new WCHAR[1024];)

UNICODE_STRING str;

str.Buffer = (PWCHAR)ExAllocatePoolWithTag(NonpagePool, 1024, '1234');

str.Length = 0;

str.MaximumLength = 1024;

使用完之后,使用 ExFreePool 或者 ExFreePoolWithTag 释放内存

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,779评论 18 399
  • Unicode字符串结构,一个字符为双字节,内核使用这个编码 typedef struct _UNICODE_ST...
    f675b1a02698阅读 1,157评论 0 0
  • 字符的 Unicode 表示法 codePointAt() String.fromCodePoint() 字符串的...
    卞卞村长L阅读 778评论 0 0
  • 在编写程序的过程中,不了避免的要用到字符串,所以String类的常用方法的用法是必须掌握的。学习一个类的使用方法最...
    Geg_Wuz阅读 1,306评论 0 4
  • 狗不能喂的太饱,人不能对他太好! 忍一时得寸进尺, 退一步变本加厉。玩笑别太过,要不都是祸。情不够,钱来凑,有钱身...
    一片落葉_5b5e阅读 212评论 0 0