内核中的字符串常用函数

初始化字符串

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。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值