wcscmp - 使用此功能时的访问冲突

时间:2018-06-13 10:14:20

标签: c winapi

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

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

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

2 个答案:

答案 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()期望以空字符结尾的字符串,但ImageNameUNICODE_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))
相关问题