wcscmp – 使用此function时的访问冲突

基本上,我试图使用wcsmp*PSYSTEM_PROCESS_INFO spi (其ImageName字段)与字符串进行wcsmp ,如下所示:

 if (wcscmp(L"Test.exe", spi->ImageName.Buffer)) 

这似乎给我一个访问冲突错误。 同样根据我的知识,ImageName的类型为UNICODE_STRINGUNICODE_STRING结构使用PWSTR作为Buffer字段。 那么使用wcscmp比较2个PWSTR是正确的吗? 如果没有将spi->ImageName.Buffer与C中的字符串进行比较的替代方法是什么?

wcscmp()期望以null结尾的字符串,但ImageNameUNICODE_STRING ,不保证以null结尾。 它有一个Length成员来指示它包含多少字节(除以sizeof(WCHAR)以获得字符数)。

您可以使用wcsncmp()代替:

 if (wcsncmp(L"Test.exe", spi->ImageName.Buffer, spi->ImageName.Length / sizeof(WCHAR))) 

否则,请改用RtlEqualUnicodeString()

 UNICODE_STRING fileName = RTL_CONSTANT_STRING(L"Test.exe"); if (!RtlEqualUnicodeString(&fileName, &(spi->ImageName), FALSE)) 

比较UNICODE_STRING需要使用RtlEqualUnicodeString函数,如果我们只需要使用==,!=或RtlCompareUnicodeString如果需要>,<,=。 一般情况下, UNICODE_STRING可以不是0终止,内部包含0或者具有Buffer == 0 – 这正是您的情况( SYSTEM_PROCESS_INFORMATION数组的第一个元素包含全部为0的UNICODE_STRING )。

所以比较名称的代码可能如下所示:

 static const UNICODE_STRING Test = RTL_CONSTANT_STRING(L"Test.exe"); RtlEqualUnicodeString(&Test, &pspi->ImageName, TRUE);