Memory management 手动操作UNICODE_字符串时崩溃

Memory management 手动操作UNICODE_字符串时崩溃,memory-management,unicode-string,Memory Management,Unicode String,手动操作UNICODE_字符串时,我遇到了一个非常奇怪的崩溃: UNICODE_字符串名称; UNICODE_字符串和端口名; UNICODE_字符串链接名; UCHAR m_COMPortName[6]; RtlInitUnicodeString&ustname,LPortName; 状态=WdfStringCreateNULL、WDF_NO_OBJECT_属性和strPortName; ifNT\u SUCCESSstatus//已创建字符串 {status=WdfRegistryQuery

手动操作UNICODE_字符串时,我遇到了一个非常奇怪的崩溃:

UNICODE_字符串名称; UNICODE_字符串和端口名; UNICODE_字符串链接名; UCHAR m_COMPortName[6]; RtlInitUnicodeString&ustname,LPortName; 状态=WdfStringCreateNULL、WDF_NO_OBJECT_属性和strPortName; ifNT\u SUCCESSstatus//已创建字符串 {status=WdfRegistryQueryString hKey,&ustrName,strPortName;//strPortName现在是COM8 如果NT_成功状态{ WDFStringeTunicodeStringsTRPORTNAME,&ustrPortName; m_COMPortName[0]=UCHARustrPortName.Buffer[0]; m_COMPortName[1]=UCHARustrPortName.Buffer[1]; m_COMPortName[2]=UCHARustrPortName.Buffer[2]; m_COMPortName[3]=UCHARustrPortName.Buffer[3]; m_COMPortName[4]=UCHARustrPortName.Buffer[4]; m_COMPortName[5]=0;//强制空终止 } } WdfRegistryClosehKey; RTL代码字符串和链接名,L\\??\\COM123;//初始化,比如说COM123,断点在这里。。。 linkName.Buffer[7]=USHORTm_COMPortName[3];//COM端口号中的第一位数字//**此行崩溃** linkName.Buffer[8]=USHORTm_COMPortName[4];//COM端口号中的第二位数字//如果有,则为NULL linkName.Buffer[9]=USHORTm_COMPortName[5];//COM端口号中的第三位数字//如果有,则为NULL 拆卸:

902de533 6840072e90推送偏置mydriver!??:FNODOBFM::'string'902e0740**此处的断点与上面相同** 902de538 8d45f8 lea eax,[ebp-8] 902de53b 50推式eax 902de53c ff1528202e90呼叫dword ptr[mydriver!\u imp\u rtlinituniuncodestring 902e2028] 902de542 660fb60d23392e90 movzx cx,字节ptr[mydriver!m_COMPortName+0x3 902e3923]**崩溃线的开始** 902de54a 8b55fc mov edx,dword ptr[ebp-4]**似乎正常** 902de54d 66894a0e mov字ptr[edx+0Eh],cx ds:0023:902e074e=0031**崩溃** 902de551 660fb60524392e90 movzx ax,字节ptr[mydriver!m_COMPortName+0x4 902E39224] 902de559 8b4dfc mov ecx,dword ptr[ebp-4] 902de55c 66894110 mov字ptr[ecx+10h],ax 902de560 660FB6152592E90 movzx dx,字节ptr[mydriver!m_COMPortName+0x5 902e3925] 902de568 8b45fc mov eax,dword ptr[ebp-4] 902de56b 66895012 mov字ptr[eax+12h],dx linkName和m_COMPortName在手表中看起来都是正确的。怎么了

另一种解决方案是以某种方式将unicode字符串L\\??\\与动态读取的unicode字符串LCOMx连接起来。但我不知道怎么做。我知道MultiByteToWideChar,但我不太喜欢使用它,因为它需要windows.h,当我将该文件包含到我的小型KMDF驱动程序项目中时,编译器会给我大量错误

在WinDDK 7600.16385.1 KMDF中为Windows Vista制作的所有代码,来自RTLUNICODESTRINGIT:

将UNICODE_字符串结构的缓冲区成员设置为 源参数指定的地址


linkName缓冲区指向一个常量L\\??\\COM123,因此当您试图修改它时它崩溃。

在include中发现此RtlUnicodeStringCat&linkName,&UstPortName仍在崩溃。。。