Common Intermediate Language и системное программирование в Microsoft.Net. Макаров А.В - 129 стр.

UptoLike

CreateProcessWithLogonW позволяют при необходимости загрузить про-
филь пользователя и, кроме того, функция CreateProcessWithLogonW сама
получает маркер пользователя по известному учетному имени, домену и
паролю:
#include <windows.h>
#define DEFAULT_SECURITY (LPSECURITY_ATTRIBUTES)NULL
int main( void )
{
STARTUPINFO si;
PROCESS_INFORMATION pi;
memset( &si, 0, sizeof(si) );
memset( &pi, 0, sizeof(pi) );
si.cb = sizeof(si);
CreateProcess(
NULL, “cmd.exe”, DEFAULT_SECURITY, DEFAULT_SECURITY,
FALSE, NORMAL_PRIORITY_CLASS, NULL, NULL, &si, &pi
);
CloseHandle( pi.hThread );
WaitForSingleObject( pi.hProcess, INFINITE );
CloseHandle( pi.hProcess );
return 0;
}
При создании процесса ему можно передать описатели каналов
(CreatePipe), предназначенные для перенаправления stdin, stdout и stderr.
Описатели каналов должны быть наследуемыми.
Для завершения процесса рекомендуется применять функцию
ExitProcess, которая завершит процесс, сделавший этот вызов. В крайних
случаях можно использовать функцию TerminateProcess, которая может
завершить процесс, заданный его описателем. Этой функцией пользовать-
ся не рекомендуется, так как при таком завершении разделяемые библио-
теки будут удалены из адресного пространства уничтожаемого процесса
без предварительных уведомлений – это может привести в некоторых слу-
чаях к утечке ресурсов.
7.2.2.2. Адресное пространство процесса и проецирование файлов
В Windows потоки работают в одном адресном пространстве процес-
са, поэтому обмен данными между ними в большинстве случаев сводится
к доступу к общей разделяемой памяти. Иная ситуация в случае взаимо-
действия потоков, принадлежащим разным процессам: так как адресное
пространство процессов изолировано друг от друга, то приходится прини-
Разработка параллельных приложений для ОС Windows
245
Использование объектов ядра для взаимной синхронизации. Рас-
смотрено при обсуждении взаимной синхронизации потоков.
При использовании именованных объектов или передаче описа-
телей объектов ядра другим процессам рассмотренные средства
могут использоваться для межпроцессной синхронизации.
Проецирование файлов в адресное пространство процесса (File
Mapping). Один из базовых механизмов, рассматривается ниже.
Использование файловых объектов. Каналы (Pipes), почтовые
ящики (Mailslots) и сокеты (Sockets). Еще один базовый меха-
низм; чаще применяется для организации межузлового взаимо-
действия, за исключением анонимных каналов (unnamed pipes,
anonymous pipes), которые используются для межпроцессного
взаимодействия в рамках одного узла. В данном курсе эти меха-
низмы не затрагиваются.
Механизмы, ориентированные на обмен оконными сообщени-
ями (буфер обмена, DDE, сообщение WM_COPYDATA и др.). В сво-
ей основе используют механизм проецирования файлов для пе-
редачи данных между адресными пространствами процессов.
В данном курсе эти механизмы не затрагиваются.
Вызов удаленных процедур (Remote Procedure Call, RPC). Являет-
ся надстройкой, использующей проецирование для реальной
передачи данных. Позволяет описать процедуры, реализован-
ные в других процессах, и обращаться к ним как к обычным
процедурам, локальным для данного процесса. RPC инкапсули-
рует вопросы нахождения реальной процедуры, выполняющей
необходимую работу, передачу данных в эту процедуру и получе-
ние от нее ответа. RPC позволяет организовать не только меж-
процессное взаимодействие, но также межузловое с передачей
данных по сети. В данном курсе не рассматривается.
COM. Является еще более высокоуровневой абстракцией, в дан-
ном курсе также не рассматривается.
7.2.2.1. Создание процессов
Для создания процессов используются функции CreateProcess,
CreateProcessAsUser, CreateProcessWithLogonW и CreateProcessWithTokenW.
Функция CreateProcess создает новый процесс, который будет исполнять-
ся от имени текущего пользователя потока, вызвавшего эту функцию.
Функция CreateProcessAsUser позволяет запустить процесс от имени дру-
гого пользователя, который идентифицируется его маркером безопасно-
сти (security token); однако вызвавший эту функцию поток должен принять
меры к правильному использованию реестра, так как профиль нового
пользователя не будет загружен. Функции CreateProcessWithTokenW и
244
CIL и системное программирование в Microsoft .NET
244                        CIL и системное программирование в Microsoft .NET   Разработка параллельных приложений для ОС Windows                    245


       • Использование объектов ядра для взаимной синхронизации. Рас-          CreateProcessWithLogonW позволяют при необходимости загрузить про-
         смотрено при обсуждении взаимной синхронизации потоков.               филь пользователя и, кроме того, функция CreateProcessWithLogonW сама
         При использовании именованных объектов или передаче описа-            получает маркер пользователя по известному учетному имени, домену и
         телей объектов ядра другим процессам рассмотренные средства           паролю:
         могут использоваться для межпроцессной синхронизации.
       • Проецирование файлов в адресное пространство процесса (File                #include 
         Mapping). Один из базовых механизмов, рассматривается ниже.                #define DEFAULT_SECURITY   (LPSECURITY_ATTRIBUTES)NULL
       • Использование файловых объектов. Каналы (Pipes), почтовые
         ящики (Mailslots) и сокеты (Sockets). Еще один базовый меха-               int main( void )
         низм; чаще применяется для организации межузлового взаимо-                 {
         действия, за исключением анонимных каналов (unnamed pipes,                    STARTUPINFO           si;
         anonymous pipes), которые используются для межпроцессного                     PROCESS_INFORMATION pi;
         взаимодействия в рамках одного узла. В данном курсе эти меха-                 memset( &si, 0, sizeof(si) );
         низмы не затрагиваются.                                                       memset( &pi, 0, sizeof(pi) );
       • Механизмы, ориентированные на обмен оконными сообщени-                        si.cb = sizeof(si);
         ями (буфер обмена, DDE, сообщение WM_COPYDATA и др.). В сво-                  CreateProcess(
         ей основе используют механизм проецирования файлов для пе-                       NULL, “cmd.exe”, DEFAULT_SECURITY, DEFAULT_SECURITY,
         редачи данных между адресными пространствами процессов.                         FALSE, NORMAL_PRIORITY_CLASS, NULL, NULL, &si, &pi
         В данном курсе эти механизмы не затрагиваются.                                );
       • Вызов удаленных процедур (Remote Procedure Call, RPC). Являет-                CloseHandle( pi.hThread );
         ся надстройкой, использующей проецирование для реальной                       WaitForSingleObject( pi.hProcess, INFINITE );
         передачи данных. Позволяет описать процедуры, реализован-                     CloseHandle( pi.hProcess );
         ные в других процессах, и обращаться к ним как к обычным                      return 0;
         процедурам, локальным для данного процесса. RPC инкапсули-                 }
         рует вопросы нахождения реальной процедуры, выполняющей                    При создании процесса ему можно передать описатели каналов
         необходимую работу, передачу данных в эту процедуру и получе-         (CreatePipe), предназначенные для перенаправления stdin, stdout и stderr.
         ние от нее ответа. RPC позволяет организовать не только меж-          Описатели каналов должны быть наследуемыми.
         процессное взаимодействие, но также межузловое с передачей                 Для завершения процесса рекомендуется применять функцию
         данных по сети. В данном курсе не рассматривается.                    ExitProcess, которая завершит процесс, сделавший этот вызов. В крайних
       • COM. Является еще более высокоуровневой абстракцией, в дан-           случаях можно использовать функцию TerminateProcess, которая может
         ном курсе также не рассматривается.                                   завершить процесс, заданный его описателем. Этой функцией пользовать-
                                                                               ся не рекомендуется, так как при таком завершении разделяемые библио-
7.2.2.1. Создание процессов                                                    теки будут удалены из адресного пространства уничтожаемого процесса
     Для создания процессов используются функции CreateProcess,                без предварительных уведомлений – это может привести в некоторых слу-
CreateProcessAsUser, CreateProcessWithLogonW и CreateProcessWithTokenW.        чаях к утечке ресурсов.
Функция CreateProcess создает новый процесс, который будет исполнять-
ся от имени текущего пользователя потока, вызвавшего эту функцию.              7.2.2.2. Адресное пространство процесса и проецирование файлов
Функция CreateProcessAsUser позволяет запустить процесс от имени дру-               В Windows потоки работают в одном адресном пространстве процес-
гого пользователя, который идентифицируется его маркером безопасно-            са, поэтому обмен данными между ними в большинстве случаев сводится
сти (security token); однако вызвавший эту функцию поток должен принять        к доступу к общей разделяемой памяти. Иная ситуация в случае взаимо-
меры к правильному использованию реестра, так как профиль нового               действия потоков, принадлежащим разным процессам: так как адресное
пользователя не будет загружен. Функции CreateProcessWithTokenW и              пространство процессов изолировано друг от друга, то приходится прини-