字符串的初始化
定义一个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的对比
操作
|
ANSI串函数
|
Unicode串函数
|
Length
|
Strlen
|
wcslen
|
Concatenate
|
Strcat
strncat
|
Wcscat
wcsncat
RtlAppendUnicodeStringToString
RtlAppendUnicodeToString
|
Copy
|
Strcpy
strncpy
RtlCopyString
|
Wcscpy
wcsncpy
TrlCopyUnicodeString
|
Reverse
|
_strrev
|
_wcsrev
|
Compare
|
Strcmp
Strncmp
_stricmp
_strnicmp
RtlCompareString
RtlEqualString
|
Wcscmp
Wcsncmp
_wcsicmp
_wcsnicmp
RtlCompareUnicodeString
RtlEqualUnicodeString
RtlPrefixUnicodeString
|
Initialize
|
_strset
_strnset
RtlInitAnsiString
RtlInitString
|
_wcsnset
RtlInitUnicodeString
|
Search
|
Strchr
strrchr
strspn
strstr
|
Wcschr
wcsrchr
wcsspn
wcsstr
|
Upper/Lowercase
|
_strlwr
_strupr
RtlUpperString,
|
_wcslwr
_wcsupr
RtlUpcaseUnicodeString
|
Character
|
isdigit
islower
isprint
isspace
isupper
isxdigit
tolower
toupper
RtlUpperChar
|
Towolower
towupper
RtlUpcaseUnicodeString
|
Format
|
Sprintf
vsprintf
_snprintf
_vsnprintf
|
Swprintf
_snwprintf
|
String Conversion
|
Atoi
Atoll
_itoa
|
_itow
RtlIntegerToUnicodeString
RtlUnicodeStringToInteger
|
Type conversion
|
RtlAnsiStringToUnicodeString
RtlAnsiStringToUnicodeString
|
RtlUnicodeStringToAnsiString
|
Memory Release
|
RtlFreeAnsiString
|
RtlFreeUnicodeString
|