初始化字符串
NTSYSAPI VOID RtlInitUnicodeString(
PUNICODE_STRING DestinationString,
__drv_aliasesMem PCWSTR SourceString
);
参数1:
指向UNICODE_STRING的指针
参数2:
被转换的字符串常量
例如:
UNICODE_STRING Symbol;
RtlInitUnicodeString(&Symbol,L"my name is dale");
复制字符串
NTSYSAPI VOID RtlCopyUnicodeString(
PUNICODE_STRING DestinationString,
PCUNICODE_STRING SourceString
);
参数1:
复制字符串的接收目标
参数2:
被复制的字符串
例如:
RtlInitUnicodeString(&Symbol, L"nihaoa");
UNICODE_STRING Symbol;
UNICODE_STRING Symbol2;
//对目标进行初始化,需要自己为buffer申请一个内存。可以看出UNICODE_STRING初始化函数也肯定申请了内存。
Symbol2.Length=8;
Symbol2.MaximumLength=0xff;
Symbol2.Buffer = (PWSTR)ExAllocatePool(PagedPool, 0xff);
RtlCopyUnicodeString(&Symbol2, &Symbol);
RtlFreeUnicodeString(&Symbol2); //驱动卸载时,自己申请的内存一定要释放掉
比较字符串
NTSYSAPI LONG RtlCompareUnicodeString(
PCUNICODE_STRING String1,
PCUNICODE_STRING String2,
BOOLEAN CaseInSensitive
);
参数3:
如果为真,则在进行比较时应忽略大小写。
返回值:
如果返回值为0,两个字符串相等,否则两个字符串不相等。
宽字符与窄字符的转换
NTSYSAPI NTSTATUS RtlUnicodeStringToAnsiString(
PANSI_STRING DestinationString,
PCUNICODE_STRING SourceString,
BOOLEAN AllocateDestinationString
);
参数3:
如果该参数为true,则系统回为DestinationString分配内存,自己要使用RtlFreeAnsiString
来释放内存
如果为false,就需要像下面这样为DestinationString分配一个内存,否则会出现蓝屏
ANSI_STRING astrString = {0};
astrString.Buffer = (PSTR)ExAllocatePool(PagedPool, 1024);
astrString.MaxBufferLength = 1024;
返回值:
如果成功返回STATUS_SUCCESS。