Архитектура Аудит Военная наука Иностранные языки Медицина Металлургия Метрология Образование Политология Производство Психология Стандартизация Технологии |
Дескрипторы и идентификаторы процессов
Разницу между дескрипторами и идентификаторами процессов можно установить, анализируя 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; Нарушение авторского права страницы