2010-11-08 2 views
3

Идентификатор процесса - это номер, который однозначно идентифицирует процесс. Обработчик процесса также является числом, которое однозначно идентифицирует объект ядра процесса.В чем разница между идентификатором процесса и дескриптором процесса

Почему мы нуждаемся в них, так как любой из них может идентифицировать процесс.

Я думаю, что ответ может заключаться в соотношении отображения между процессом и объектом ядра процесса. Верно ли, что более одного объекта ядра процесса можно сопоставить с одним процессом? И каждый объект ядра процесса имеет свой собственный дескриптор процесса. Чтобы каждый из объектов ядра процесса мог представлять собой другой режим доступа или подобные вещи.

Этот вопрос пришел ко мне, когда я использую функцию MiniDumpWriteDump(), которая объявлена ​​как это:

BOOL WINAPI MiniDumpWriteDump(
    __in HANDLE hProcess, 
    __in DWORD ProcessId, 
    __in HANDLE hFile, 
    __in MINIDUMP_TYPE DumpType, 
    __in PMINIDUMP_EXCEPTION_INFORMATION ExceptionParam, 
    __in PMINIDUMP_USER_STREAM_INFORMATION UserStreamParam, 
    __in PMINIDUMP_CALLBACK_INFORMATION CallbackParam 
); 

Так это параметры включают в себя как идентификатор процесса и дескриптор процесса. Я просто не знаю, почему нужно иметь их обоих.

Большое спасибо за ваши идеи.

ответ

4

Процесс Ручка

  1. Произвольное
  2. Internal к процессу, который приобрел его. Частные и не могут быть разделены между потоками/процессами
  3. Он осуществляет права доступа безопасности слишком

Хотя идентификатор процесса является

  1. Уникальный
  2. Универсальная, общественность, поэтому она может быть разделена между потоки/процессы
+2

Обратите внимание, что вы можете наследовать и дублировать дескрипторы в других процессах, поэтому 2 не является правильным. – DennyRolling

+0

Nod. Если для параметра SECURITY_ATTRIBUTES.bInheritHandle установлено значение true в API CreateProcess, дочерний процесс может получить дескриптор его родительского процесса с правами полного доступа. AFAIK, родительский процесс не может передавать дескрипторы любых других процессов, которые он может иметь. Пожалуйста, поправьте меня, если мое понимание ошибочно. – Faheem

+2

Win32 'HANDLE'-s ** ** может использоваться совместно между потоками. Единственными исключениями являются псевдо-ручки, например, возвращаемые 'GetCurrentThread'. Плюс я бы добавил, что «РУЧКА» нужно закрыть, так как они действительно ссылаются на системный ресурс. – valdo

3

разница заключается в том, что 'id' является общесистемным номером, который однозначно идентифицирует процесс. С другой стороны, «ручка» - это непрозрачное значение, которое соединяет процесс и доступ к этому процессу к вашей программе. вы можете иметь несколько разных дескрипторов для одного и того же процесса.

Я не знаю, почему MiniDumpWriteDump принимает оба.

Смежные вопросы