驱动中字符串的操作

/如果本文有不对的地方,望即时指点!

字符串的初始化

定义一个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

posted @ 2015-05-24 21:12  紫旭  阅读(4144)  评论(0编辑  收藏  举报