Функция CompareObjectHandles (handleapi.h)

Сравнивает два дескриптора объектов, чтобы определить, ссылаются ли они на один и тот же базовый объект ядра.

Синтаксис

BOOL CompareObjectHandles(
  [in] HANDLE hFirstObjectHandle,
  [in] HANDLE hSecondObjectHandle
);

Параметры

[in] hFirstObjectHandle

Первый сравниваемый дескриптор объекта.

[in] hSecondObjectHandle

Второй сравниваемый дескриптор объекта.

Возвращаемое значение

Логическое значение, указывающее, ссылаются ли два дескриптора на один и тот же базовый объект ядра. Значение TRUE, если значение совпадает, в противном случае — ЗНАЧЕНИЕ FALSE.

Комментарии

Функция CompareObjectHandles полезна, чтобы определить, ссылаются ли два дескриптора ядра на один и тот же объект ядра, не требуя предоставления определенных прав доступа для обоих дескрипторов для выполнения сравнения. Например, если процесс хочет определить, является ли дескриптор процесса дескриптором текущего процесса, можно использовать вызов CompareObjectHandles (GetCurrentProcess (), hProcess), чтобы определить, ссылается ли hProcess на текущий процесс. Примечательно, что для этого не требуется использование прав доступа для конкретного объекта, в то время как в этом примере вызов GetProcessId для проверка идентификаторов процессов двух дескрипторов процессов требует, чтобы дескрипторы предоставляли PROCESS_QUERY_LIMITED_INFORMATION доступ. Однако дескриптору процесса не предоставляется это право доступа в зависимости от того, как дескриптор предназначен для использования.

Примеры

В следующем примере кода создаются три дескриптора, два из которых ссылаются на один и тот же объект, а затем сравниваются, чтобы показать, что идентичные базовые объекты ядра возвращают значение TRUE, а не идентичные объекты — false.

#include <windows.h>
#include <stdio.h>
#include <wchar.h>

HANDLE Event1;
HANDLE Event2;
HANDLE Event3;

	// Create a handle to a named event.
Event1 = CreateEventW (NULL, TRUE, FALSE, L"{75A520B7-2C11-4809-B43A-0D31FB1FDD19}");
if (Event1 == NULL) {	ExitProcess (0);	}

	// Create a handle to the same event.
Event2 = CreateEventW (NULL, TRUE, FALSE, L"{75A520B7-2C11-4809-B43A-0D31FB1FDD19}");
if (Event2 == NULL) {	ExitProcess (0);	}

	// Create a handle to an anonymous, unnamed event.
Event3 = CreateEventW (NULL, TRUE, FALSE, NULL);
if (Event3 == NULL) {	ExitProcess (0);	}

	// Compare two handles to the same kernel object.
if (CompareObjectHandles (Event1, Event2) != FALSE) 
	{	// This message should be printed by the program.
		wprintf (L"Event1 and Event2 refer to the same underlying event object.\n");
	}

	// Compare two handles to different kernel objects.
if (CompareObjectHandles (Event1, Event3) == FALSE) 
	{	// This message should be printed by the program.
		wprintf (L"Event1 and Event3 refer to different underlying event objects.  (Error %lu)\n", GetLastError ());		
	}

	// Compare two handles to different kernel objects, each of a different type of kernel object.
	// The comparison is legal to make, though the function will always return FALSE and indicate 
	// a last error status of ERROR_NOT_SAME_OBJECT.
if (CompareObjectHandles (Event1, GetCurrentProcess ()) == FALSE) 
	{	// This message should be printed by the program.
		wprintf (L"Event1 and the current process refer to different underlying kernel objects.  (Error %lu)\n", GetLastError ());
	}

Требования

Требование Значение
Минимальная версия клиента Windows 10 [классические приложения | Приложения UWP]
Минимальная версия сервера Windows Server 2016 [классические приложения | Приложения UWP]
Целевая платформа Windows
Header handleapi.h (включая Windows.h)
Библиотека Kernelbase.lib
DLL Kernelbase.dll

См. также раздел

Функции дескрипторов и объектов