wcscmp - нарушение прав доступа при использовании этой функции - PullRequest
0 голосов
/ 13 июня 2018

По сути, я пытался сравнить *PSYSTEM_PROCESS_INFO spi (его поле ImageName) со строкой, используя wcsmp следующим образом:

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

Это, похоже, вызывает ошибку нарушения доступа.Кроме того, насколько я знаю, ImageName имеет тип UNICODE_STRING, а структура UNICODE_STRING использует PWSTR для поля Buffer.Так правильно ли сравнивать 2 PWSTR, используя wcscmp?Если нет, то какие есть альтернативы для сравнения spi->ImageName.Buffer со строкой в ​​C?

Ответы [ 2 ]

0 голосов
/ 13 июня 2018

wcscmp() ожидает строки с нулевым символом в конце, но ImageName - это UNICODE_STRING, который не гарантированно завершается нулем.Он имеет член 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))
0 голосов
/ 13 июня 2018

для сравнения UNICODE_STRING нужно использовать RtlEqualUnicodeString функцию, если нам нужно использовать только ==,! = Или RtlCompareUnicodeString если нужно>, <, =.в общем случае <code>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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...