UNICODE_STRING的拷贝复制
2021-07-01
514
0
由于UNICODE_STRING和ANSI_STRING字符串是一个结构体,所以UNICODE_STRING和ANSI_STRING字符串的拷贝就不能使用wcscpy和strcpy来进行拷贝了。
微软的WDK中提供了专门的函数RtlCopyUnicodeString和RtlCopyString来进行UNICODE_STRING和RtlCopyString字符串的拷贝。
注意:
由于字符串在拷贝时,两源字符串拷贝到目标字符串时,会比较目标字符串内存空间的长度和源字符串的长度。所以当源字符串的长度大于目标字符串的内存长度时,会自动进行截短。
说明:
在WDK中,为了使用上的方便,使用typedef将ANSI_STRING重新定义成了STRING了。所以函数名也变成了以STRING命名的函数了。
typedef STRING *PSTRING;
typedef STRING ANSI_STRING;
typedef PSTRING PANSI_STRING;
下面举一个例子。
UNICODE_STRNG示例
UNICODE_STRING dst; // 目标字符串
WCHAR dst_buf[256]; // 我们现在还不会分配内存,所以先定义缓冲区
UNICODE_STRING src = RTL_CONST_STRING(L"www.pnpon.com");
// 把目标字符串初始化为拥有缓冲区长度为256的UNICODE_STRING空串。
RtlInitEmptyString(dst,dst_buf,256*sizeof(WCHAR));
RtlCopyUnicodeString(&dst,&src); // 字符串拷贝!
以上这个拷贝之所以可以成功,是因为256比 L”www.pnpon.com” 的长度要大。如果小,则拷贝也不会出现任何明示的错误。但是拷贝结束之后,与使用者的目标不符,字符串实际上被截短了。
STRING/ANSI_STRING示例
STRING dst; // 目标字符串
char dst_buf[256]; // 我们现在还不会分配内存,所以先定义缓冲区
STRING src = RTL_CONSTANT_STRING("www.pnpon.com");
// 把目标字符串初始化为拥有缓冲区长度为256的STRING空串。
RtlInitEmptyAnsiString(&dst, dst_buf, 256 * sizeof(char));
RtlCopyString(&dst, &src); // 字符串拷贝!
我曾经犯过的一个错误是没有调用RtlInitEmptyString。结果dst字符串被初始化认为缓冲区长度为0。虽然程序没有崩溃,却实际上没有拷贝任何内容。
在拷贝之前,最谨慎的方法是根据源字符串的长度动态分配空间。