Операционные системы. Программирование в операционной среде Windows

69 // порождаем новый процесс CreateProcessA(TEXT("С:\\WINNT\\SYSTEM32\\NOTEPAD EXE"), szPath,... ); Система запускает Notepad, а в его командной строке мы увидим "WORDPAD README.TXT". Эта возможность, которую обеспечивает параметр pszApplicationName, введена в CreateProcess для поддержки подсистемы POSIX в Windows 2000. 2. Параметры psaProcess, psaThread и bInheritHandles Чтобы создать новый процесс, система должна сначала создать ОЯ «процесс» и «поток» для первичного потока процесса. Поскольку это ОЯ, родительский процесс получает возможность связать с ними атрибуты защиты. Параметры psaProcess и psaThread позволяют определить нужные атрибуты защиты для объектов «процесс» и «поток» соответственно. В эти параметры можно занести NULL, и система закрепит за данными объектами дескрипторы защиты по умолчанию. В качестве альтернативы можно объявить и инициализировать две структуры SECURITY ATTRIBUTES, тем самым создаются и присваиваются свои атрибуты защиты объектам «процесс» и «поток». Структуры SECURITY ATTRIBUTES для параметров psaProcess и psaThread используются и для того, чтобы какой-либо из этих двух объектов получил статус наследуемого любым дочерним процессом. Нижеследующий фрагмент программы демонстрирует, как наследуются описатели ОЯ. Будем считать, что процесс А порождает процесс В и заносит в параметр psaProcess адрес структуры SECURITY ATTRIBUTES, в которой элемент blnheritHandle установлен как TRUE. Одновременно параметр psaThread указывает на другую структуру SECURITY ATTRIBUTES, в которой значение элемента blnheritHandle — FALSE. #include "windows.h" // Подготовка STARTUPINFO стркутуры для порождения процессов STARTUPINFOA si = { sizeof(si) }; SECURITY_ATTRIBUTES saProcess, saThread; PROCESS_INFORMATION piProcessB, piProcessC; TCHAR szPath[MAX_PATH]; // Подготовка к порождению процесса В из процесса А // Дескриптор идентифицирует новый процесс, // объект должен быть наследуемым. saProcess.nLength = sizeof(saProcess); saProcess.IpSecurityDescriptor = NULL; saProcess.blnheritHandle = TRUE; // Дескриптор идентифицирует новый поток, // объект должен быть не наследуемым. saThread.nLength = sizeof (saThread) ; saThread.IpSecurityDescriptor = NULL; saThread.blnheritHandle = FALSE;

RkJQdWJsaXNoZXIy MTY0OTYy