驱动中字符串的操作
/如果本文有不对的地方,望即时指点!
字符串的初始化
定义一个UNICODE_STRING类型的变量,这只是一个空的结构体而已,我们并没有给它分配任何的内存。如果直接对其进行字符串拷贝等操作,肯定会 引起异常的,当我们定义这样类型的一个变量,我们应该就把它看作一个WCHAR型的指针,没有“new”空间,所以我们必须去“new”空间给它。
typedef struct
{
USHORT Length;
USHORT MaximumLength;
PWCHAR Buffer;
}UNICODE_STRING, *PUNICODE_STRING;
有以下几种方式:
1.RtlInitEmptyUnicodeString
UNICODE_STRING str;
WCHAR wcsBuffer[1024] = {0};
RtlEmptyUnicodeString(&str, wcsBuffer, sizeof(wcsBuffer));
这种方式就像定义一个静态的串 WCHAR wcsBuffer[1024] = {0}。
2.动态申请空间
UNICODE_STRING str;
str.Buffer = (PWCHAR)ExAllocatePoolWithTag(NonpagePool, 1024, ‘1234’);
str.Length = 0;
str.MaximumLength = 1024;
这种方式就像定义一个WCHAR* pwcsBuffer = new WCHAR[1024];
使用完之后,必须释放内存。
ExFreePool或者是ExFreePoolWithTag。
3.定义常量UNICODE_STRING
可以使用宏RTL_CONSTANT_STRING
UNICODE_STRING str = RTL_CONSTANT_STRING(L”my first string”);
记住这个字符串不能再被修改,因为这就像定义了char *str = “123”; 该字符串不能再被修改。
字符串的拷贝
RtlCopyUnicodeString(&dst, &src);
字符串的连接
RtlAppendUnicodeToString(&dst, L”123”);
RtlAppendUnicodeToUnicodeString(&dst, &src);
//下面的表格是转载的,找不到出处了,见谅!
驱动中使用的字符串操作函数 ,这里给出ANSI和UNICODE的对比
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|