基本上,我试图将*PSYSTEM_PROCESS_INFO spi
(其ImageName字段)与使用wcsmp
的字符串进行比较,如下所示:
if (wcscmp(L"Test.exe", spi->ImageName.Buffer))
这似乎给了我一个访问冲突错误。另据我所知,ImageName的类型为UNICODE_STRING
,UNICODE_STRING
结构使用PWSTR
作为Buffer字段。那么使用PWSTR
比较2 wcscmp
是正确的吗?如果没有将spi->ImageName.Buffer
与C中的字符串进行比较的替代方法是什么?
答案 0 :(得分:3)
用于比较UNICODE_STRING
需要使用RtlEqualUnicodeString
函数,如果我们只需要使用==,!=或RtlCompareUnicodeString
,如果需要>,<,=。一般情况下UNICODE_STRING
可以不是0终止,内部包含0或者Buffer == 0
- 这正是你的情况(SYSTEM_PROCESS_INFORMATION
数组的第一个元素包含UNICODE_STRING
,全部为0)
所以比较名称的代码可能如下所示:
static const UNICODE_STRING Test = RTL_CONSTANT_STRING(L"Test.exe");
RtlEqualUnicodeString(&Test, &pspi->ImageName, TRUE);
答案 1 :(得分:2)
wcscmp()
期望以空字符结尾的字符串,但ImageName
是UNICODE_STRING
,不保证以空值终止。它有一个Length
成员来表示它包含多少字节(除以sizeof(WCHAR)
以获得字符数。)
您可以改为使用c_wchar_p
:
if (wcsncmp(L"Test.exe", spi->ImageName.Buffer, spi->ImageName.Length / sizeof(WCHAR)))
否则,请改用wcsncmp()
:
UNICODE_STRING fileName = RTL_CONSTANT_STRING(L"Test.exe");
if (!RtlEqualUnicodeString(&fileName, &(spi->ImageName), FALSE))