wcscmp – 使用此function时的访问冲突
基本上,我试图使用wcsmp
将*PSYSTEM_PROCESS_INFO spi
(其ImageName字段)与字符串进行wcsmp
,如下所示:
if (wcscmp(L"Test.exe", spi->ImageName.Buffer))
这似乎给我一个访问冲突错误。 同样根据我的知识,ImageName的类型为UNICODE_STRING
, UNICODE_STRING
结构使用PWSTR
作为Buffer字段。 那么使用wcscmp
比较2个PWSTR
是正确的吗? 如果没有将spi->ImageName.Buffer
与C中的字符串进行比较的替代方法是什么?
wcscmp()
期望以null结尾的字符串,但ImageName
是UNICODE_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);