匿名管道是一個未命名的、單向管道,一般用來在一個父進程和一個子進程之間傳輸數據;匿名管道只能實現本地機器上兩個進程間的通訊,而不能實現跨網絡的通訊;安全
一、建立匿名管道網絡
BOOL CreatePipe(函數
PHANDLE hReadPipe, 命令行
PHANDLE hWritePipe, 線程
LPSECURITY_ATTRIBUTES lpPipeAttributes, 指針
DWORD nSize orm
);對象
hReadPipe:做爲返回值,返回管道的讀取句柄;繼承
hWritePipe:做爲返回值,返回管道的寫入句柄;進程
lpPipeAttributes:一個指向SECURITY_ATTRIBUTES結構體的指針,檢測返回的句柄可否被子進程繼承;要在父進程和子進程間創建匿名管道,該參數就不能夠設爲NULL,子進程需繼承父進程的管道句柄,須構造該結構體變量:
typedef struct _SECURITY_ATTRIBUTES {
DWORD nLength; //指定該結構體的大小
LPVOID lpSecurityDescriptor; //NULL
BOOL bInheritHandle; //TRUE
} SECURITY_ATTRIBUTES, *PSECURITY_ATTRIBUTES;
nSize:指定管道的緩衝區的大小;若是設爲0,系統將使用默認的緩衝區大小;
二、一個進程的建立
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
);
lpApplicationName:指向一個字符串,用來指定可執行程序的名稱,該名稱能夠是該程序的完整路徑和文件名,也能夠是部分名稱;能夠設爲NULL,則文件名必須是lpCommandLine指向的字符串中的第一個空格界定的標記;
lpCommandLine:指向一個字符串,用來傳遞命令行的參數;一般在調用該函數時,將可執行文件名和命令行參數都傳遞給lpCommandLine參數;
lpProcessAttributes:指向SECURITY_ATTRIBUTES結構體的指針,用來設置新進程的進程對象的安全性,及指定未來建立的子進程是否能夠繼承該進程對象的句柄;能夠設爲NULL;
lpThreadAttributes:指向SECURITY_ATTRIBUTES結構體的指針,用來設置新進程的主線程對象的安全性,及指定未來建立的子進程是否能夠繼承該主線程對象的句柄;能夠設爲NULL;
bInheritHandles:該參數用來指定建立的子進程是否可以繼承父進程的對象句柄;
dwCreationFlags:指定控件優先級類和進程建立的附加標記;若是隻是爲了啓動子進程,並不須要設置它建立的標記,可設爲0;
lpEnvironment:一個指向環境塊的指針;設爲NULL,新進程將使用調用進程的環境;
lpCurrentDirectory:指定子進程當前的路徑,必須是完整的路徑名;若是設爲NULL,則新進程將與調用進程擁有相同的驅動器和目錄;
lpStartupInfo:一個指向STARTUPINFO結構體的指針,用來指定新進程的主窗口將如何顯示;
lpProcessInformation:做爲返回值使用,是一個指向PROCESS_INFORMATION結構體的指針,用來接收關於新進程的標識信息;
typedef struct _PROCESS_INFORMATION {
HANDLE hProcess; //新建立的進程的句柄
HANDLE hThread; //新建立的進程的主線程的句柄
DWORD dwProcessId; //標識一個進程
DWORD dwThreadId; //標識一個線程
} PROCESS_INFORMATION;