Архитектура Аудит Военная наука Иностранные языки Медицина Металлургия Метрология
Образование Политология Производство Психология Стандартизация Технологии


Дескрипторы и идентификаторы процессов



Разницу между дескрипторами и идентификаторами процессов можно установить, анализируя API-функцию CreateProcess . Объявление в VC++ записывается таким образом:

BOOL CreateProcess(

LPCTSTR lpApplicationName,        

LPTSTR lpCommandLine,

LPSECURITY_ATTRIBUTES lpProcessAttributes,         

LPSECURITY_ATTRIBUTES lpThreadAttributes,          

BOOL bInheritHandles,       

DWORD dwCreationFlags, 

LPVOID lpEnvironment,     

LPCTSTR lpCurrentDirectory,        

LPSTARTUPINFO lpStartupInfo,  

LPPROCESS_INFORMATION lpProcessInformation     

);

Параметры API-функцию CreateProcess :

lpApplicationName, lpCommandLine - определяют имя исполняемого файла, которым будет пользоваться новый процесс, и командную строку, передаваемую этому процессу.

lpProcessAttributes, lpThreadAttributes – эти параметры позволяют определить нужные атрибуты защиты для объектов «процесс» и «поток» соответственно. В эти параметры можно занести NULL, и система закрепит за данными объектами дескрипторы защиты по умолчанию. В качестве альтернативы можно объявить и инициализировать две структуры SECURITY_ATTRIBUTES; тем самым Вы создадите и присвоите объектам «процесс» и «поток» свои атрибуты защиты. Вид структуры SECURITY_ATTRIBUTES приведен ниже:

typedef struct _SECURITY_ATTRIBUTES { // sa 

DWORD nLength;

LPVOID lpSecurityDescriptor;

BOOL bInheritHandle;

} SECURITY_ATTRIBUTES;

bInheritHandles - указывает, наследовал ли новый процесс дескрипторы от процесса запроса. Если ИСТИНА, каждый наследственный открытый дескриптор в процессе запроса унаследован новым процессом.

dwCreationFlags -  определяет флаги, влияющие на то, как именно создается новый процесс. Имеется десять флагов, которые могут комбинироваться булевым оператором ОК.

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

lpCurrentDirectory – позволяет установить текущие диски каталог. Если его значение – NULL, рабочий каталог нового процесса будет тем же, что и у приложения, его породившего.

lpStartupInfo – этот параметр указывает на структуру STARTUPINFO:

 

typedef struct _STARTUPINFO { // si 

DWORD cb;

LPTSTR lpReserved;

LPTSTR lpDesktop;

LPTSTR lpTitle;

DWORD dwX;

DWORD dwY;

DWORD dwXSize;

DWORD dwYSize;

DWORD dwXCountChars;

DWORD dwYCountChars;

DWORD dwFillAttribute;

DWORD dwFlags;

WORD wShowWindow;

WORD cbReserved2;

LPBYTE lpReserved2;

HANDLE hStdInput;

HANDLE hStdOutput;

HANDLE hStdError;

} STARTUPINFO, *LPSTARTUPINFO;

 

Элементы структуры STARTUPINFO используются Windows-функциями при создании процесса. При этом большинство приложений порождает процессы с атрибутами по умолчанию. Но в этом случае Вы должны инициализировать все элементы структуры STARTUPINFO хотя бы нулевыми значениями, а в элемент cb – заносить размер этой структуры.

lpProcessInformation – указывает на структуру PROCESS_INFORMATION:

 

typedef struct _PROCESS_INFORMATION (

     HANDLE hProcess;

     HANDLE hTHread;

     DWORD dwProcessID;

    DWORD dwThreadID;

  ) PROCESS_INFORMATION;

 

Ее члены в соответствии с документацией имеют следующие значения:

· HProcess возвращает дескриптор вновь созданного процесса;

· Hthread возвращает дескриптор первичного потока вновь созданного процесса. Дескриптор используется для спецификации данного потока во всех функциях, которые выполняют операции с объектом Thread;

· DwProcessId возвращает глобальный идентификатор процесса. Время жизни идентификатора - с момента создания процесса до момента его завершения;

· DwThreId возвращает глобальный идентификатор потока. Время жизни идентификатора - с момент создания потока до момента его завершения.

Таким образом, между дескриптором и идентификатором процесса (или потока) существуют следующие основные различия:

· дескриптор действует в пределах «своего» процесса, в рамках которого он был создан, в то время как идентификатор работает на системном уровне;

· у каждого процесса есть только один идентификатор, но может быть несколько дескрипторов;

· некоторым API-функциям требуется идентификатор, в то время как другим - дескриптор процесса.

Следует подчеркнуть, что, хотя дескриптор является зависимым от процесса, один процесс может иметь дескриптор другого процесса. Иными словами, если процесс А имеет дескриптор процесса В, то этот дескриптор идентифицирует процесс В, но действует только в процессе А. Он может использоваться в процессе А для вызова некоторых API-функций, которые имеют отношение к процессу В (однако память процесса В остается недоступной для процесса А).

Дескрипторы модулей

Каждый модуль (DLL, OCX, DRV и т.д.), загруженный в пространство процесса, имеет свой дескриптор (module handle), называемый также логическим номером экземпляра (instance handle). В 16-разрядной Windows данными терминами обозначались разные объекты, в 32-разрядной системе это один и тот же объект.

Дескриптором исполняемого модуля является начальный или базовый адрес данного исполняемого модуля в адресном пространстве процесса. Это объясняет, почему такой дескриптор имеет смысл только в рамках процесса, включающего данный модуль.

Базовый адрес загрузочного (ЕХЕ) модуля, создаваемого VC++, по умолчанию имеет значение &Н400000. Однако программист в VC++ может изменить этот адрес по умолчанию, и есть серьезные основания поступать именно так для того, чтобы избежать конфликта с другими модулями (перераспределение памяти, связанное с конфликтом базовых адресов, требует слишком большого объема физической памяти и временных затрат). Кроме того, модули, создаваемые другими программными средами, могут иметь другие базовые адреса, устанавливаемые по умолчанию.

Дескрипторы модулей часто используются для вызова API-функций, которые выделяют ресурсы данному процессу. Например, функция LoadBitmap загружает ресурс растровой картинки из загрузочного файла данного процесса.  Ее декларация записывается так:

HBITMAP LoadBitmap(

HINSTANCE hInstance,    // Дескриптор экземпляра приложения.

 LPCTSTR IpBitmapeName  // Адрес имени ресурса растровой картинки.

 );

Обратите внимание на то, что дескриптор модуля загрузочного файла процесса часто ошибочно называют дескриптором модуля процесса, а об имени загрузочного файла говорят как об имени модуля процесса.

Идентификация процесса

Следующие четыре объекта часто встречаются в программировании API, связанном с процессами:

· идентификатор процесса;

· дескриптор процесса;

· полное имя загрузочного файла;

· дескриптор модуля загрузочного файла процесса.


Поделиться:



Последнее изменение этой страницы: 2019-03-20; Просмотров: 535; Нарушение авторского права страницы


lektsia.com 2007 - 2024 год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! (0.014 с.)
Главная | Случайная страница | Обратная связь