能力值:
( LV12,RANK:300 )
2 楼
//CODE1
dst.Length=dst.MaximumLength=256;
显然dst.Length应该为0
//CODE2
RtlInitEmptyUnicodeString(&dst,buf,256*sizeof(WCHAR));
RtlInitUnicodeString(&dst,L"myunicode");
这两行是有问题的,因为后一行的RtlInitUnicodeString使得前一行的RtlInitEmptyUnicodeString没有了作用。
注意RtlInitUnicodeString的MSDM解释:
VOID
RtlInitUnicodeString(
IN OUT PUNICODE_STRING DestinationString,
IN PCWSTR SourceString
);
Comments
The Buffer member of DestinationString is initialized to point to SourceString. The length and maximum length for DestinationString are initialized to the length of SourceString. If SourceString is NULL, the length is zero.
也就是说调用RtlInitUnicodeString就相当于dst.Buffer变成了指向L"myunicode"这个宽字符串的常量指针(而不是原来的buf),同时MaximumLength也改为了L"myunicode"的长度(而不是原来的256*sizeof(WCHAR))。因此你后面的RtlAppendUnicodeStringToString调用因为目标UNICODE_STRING的最大长度太小,而没有写进去。 你试试这么写:
RtlInitEmptyUnicodeString(&dst,buf,256*sizeof(WCHAR));
RtlInitUnicodeString(&src,L"myunicode");
RtlCopyUnicodeString(&dst,&src);
RtlInitUnicodeString(&src,L"string");
RtlAppendUnicodeStringToString(&dst,&src);
KdPrint(("%wZ",&dst));
能力值:
( LV12,RANK:210 )
3 楼
//CODE2解决了 谢谢小聪 但是CODE1没搞定
能力值:
( LV12,RANK:210 )
4 楼
//CODE1搞定
dst.Buffer=(PWCHAR)ExAllocatePoolWithTag(NonPagedPool,256,MEM_TAG);
dst.Length=dst.MaximumLength=256;
RtlInitUnicodeString(&src,L"myunicode");
RtlCopyUnicodeString(&dst,&src);
//UNICODE_STRING src;
RtlInitUnicodeString(&src,L"string");
RtlAppendUnicodeStringToString(&dst,&src);
KdPrint(("%wZ",&dst));
ExFreePool(dst.Buffer);
能力值:
( LV2,RANK:10 )
5 楼
真是晕 也不知道你们怎么喜欢这样的编码的
不是一般难看啊
能力值:
( LV12,RANK:210 )
6 楼
内核主要字符串编码,安全