64,637
社区成员
发帖
与我相关
我的任务
分享
BOOL CreateProcess(
PCTSTR pszApplicationName, //1.指定新进程要使用的可执行文件的名称
PTSTR pszCommandLine, //2.指定要传给新进程的命令行字符串
PSECURITY_ATTRIBUTES psaProcess, //3.为进程对象指定安全属性 ..可以NULL
PSECURITY_ATTRIBUTES psaThread, //4.为线程内核对象指定安全属性 ..可以NULL
BOOL bInheritHandles, //5.TRUE->可继承.....FALSE->不可继承
DWORD fdwCreate, //6.标识影响新进程创建方式的标志(flag)
PVOID pvEnvironment,
PCTSTR pszCurDir,
PSTARTUPINFO psiStartInfo,
PPROCESS_INFORMATION ppiProcInfo);
BOOL CreateProcess(
PCTSTR pszApplicationName, //1.指定新进程要使用的可执行文件的名称
PTSTR pszCommandLine, //2.指定要传给新进程的命令行字符串
PSECURITY_ATTRIBUTES psaProcess, //3.为进程对象指定安全属性 ..可以NULL
PSECURITY_ATTRIBUTES psaThread, //4.为线程内核对象指定安全属性 ..可以NULL
BOOL bInheritHandles, //5.TRUE->可继承.....FALSE->不可继承
DWORD fdwCreate, //6.标识影响新进程创建方式的标志(flag)
PVOID pvEnvironment, //7.pvEnvironment参数指向一个内存块,
//其中包含了新进程要使用的环境字符串。
PCTSTR pszCurDir,
PSTARTUPINFO psiStartInfo,
PPROCESS_INFORMATION ppiProcInfo);
PVOID GetEnvironmentStrings();
BOOL FreeEnvironmentStrings(PTSTR pszEnvironmentBlock);
BOOL CreateProcess(
PCTSTR pszApplicationName, //1.指定新进程要使用的可执行文件的名称
PTSTR pszCommandLine, //2.指定要传给新进程的命令行字符串
PSECURITY_ATTRIBUTES psaProcess, //3.为进程对象指定安全属性 ..可以NULL
PSECURITY_ATTRIBUTES psaThread, //4.为线程内核对象指定安全属性 ..可以NULL
BOOL bInheritHandles, //5.TRUE->可继承.....FALSE->不可继承
DWORD fdwCreate, //6.标识影响新进程创建方式的标志(flag)
PVOID pvEnvironment, //7.pvEnvironment参数指向一个内存块,
//其中包含了新进程要使用的环境字符串。
//为NULL,导致子进程继承其父进程使用的一组环境字符串。
PCTSTR pszCurDir, //8.允许父进程设置子进程的当前驱动器和目录
//为NULL,则新进程的工作目录与生成新进程的应用程序一样
PSTARTUPINFO psiStartInfo,
PPROCESS_INFORMATION ppiProcInfo);
BOOL CreateProcess(
PCTSTR pszApplicationName, //1.指定新进程要使用的可执行文件的名称
PTSTR pszCommandLine, //2.指定要传给新进程的命令行字符串
PSECURITY_ATTRIBUTES psaProcess, //3.为进程对象指定安全属性 ..可以NULL
PSECURITY_ATTRIBUTES psaThread, //4.为线程内核对象指定安全属性 ..可以NULL
BOOL bInheritHandles, //5.TRUE->可继承.....FALSE->不可继承
DWORD fdwCreate, //6.标识影响新进程创建方式的标志(flag)
PVOID pvEnvironment, //7.pvEnvironment参数指向一个内存块,
//其中包含了新进程要使用的环境字符串。
//为NULL,导致子进程继承其父进程使用的一组环境字符串。
PCTSTR pszCurDir, //8.允许父进程设置子进程的当前驱动器和目录
//为NULL,则新进程的工作目录与生成新进程的应用程序一样
PSTARTUPINFO psiStartInfo, //9.指向一个STARTUPINFO结构或STARTUPINFOEX结构
PPROCESS_INFORMATION ppiProcInfo);
typedef struct _STARTUPINFO
{
DWORD cb; //1.包含STARTUPINFO结构中的字节数。充当版本控制
PSTR lpReserved; //2.保留。必须初始化为NULL。
PSTR lpDesktop; //3.标识要在上面启动应用程序的桌面的名称
PSTR lpTitle; //4.指定控制台窗口的窗口标题。
//如果lpTitle被设置为NULL,就将执行体文件的名称作为窗口标题。
DWORD dwX; //5.
DWORD dwY; //6.
DWORD dwXSize; //7.
DWORD dwYSize; //8.
DWORD dwXCountChars; //9.
DWORD dwYCountChars; //10.
DWORD dwFillAttribute; //11.指定子进程的控制台窗口所用的文本和背景色。
DWORD dwFlags; //12.
WORD wShowWindow; //13.指定应用程序的主窗口如何显示。
WORD cbReserved2; //14.保留。必须被初始化为0
PBYTE lpReserved2; //15.保留。必须被初始化为NULL。
HANDLE hStdInput; //16.
HANDLE hStdOutput;
HANDLE hStdError;
} STARTUPINFO, *LPSTARTUPINFO;
STARTUPINFO si = { sizeof(si) };
CreateProcess(...,&si,...);
BOOL CreateProcess(
PCTSTR pszApplicationName, //1.指定新进程要使用的可执行文件的名称
PTSTR pszCommandLine, //2.指定要传给新进程的命令行字符串
PSECURITY_ATTRIBUTES psaProcess, //3.为进程对象指定安全属性 ..可以NULL
PSECURITY_ATTRIBUTES psaThread, //4.为线程内核对象指定安全属性 ..可以NULL
BOOL bInheritHandles, //5.TRUE->可继承.....FALSE->不可继承
DWORD fdwCreate, //6.标识影响新进程创建方式的标志(flag)
PVOID pvEnvironment, //7.pvEnvironment参数指向一个内存块,
//其中包含了新进程要使用的环境字符串。
//为NULL,导致子进程继承其父进程使用的一组环境字符串。
PCTSTR pszCurDir, //8.允许父进程设置子进程的当前驱动器和目录
//为NULL,则新进程的工作目录与生成新进程的应用程序一样
PSTARTUPINFO psiStartInfo, //9.指向一个STARTUPINFO结构或STARTUPINFOEX结构
PPROCESS_INFORMATION ppiProcInfo);//10.指向你必须分配的一个PROCESS_INFORMATION结构
typedef struct _PROCESS_INFORMATION
{
HANDLE hProcess;
HANDLE hThread;
DWORD dwProcessId;
DWORD dwThreadId;
} PROCESS_INFORMATION;
BOOL CreateProcess(
PCTSTR pszApplicationName,
PTSTR pszCommandLine,
PSECURITY_ATTRIBUTES psaProcess,
PSECURITY_ATTRIBUTES psaThread,
BOOL bInheritHandles,
DWORD fdwCreate,
PVOID pvEnvironment,
PCTSTR pszCurDir,
PSTARTUPINFO psiStartInfo,
PPROCESS_INFORMATION ppiProcInfo);
BOOL CreateProcess(
PCTSTR pszApplicationName, //1.指定新进程要使用的可执行文件的名称
PTSTR pszCommandLine, //2.指定要传给新进程的命令行字符串
PSECURITY_ATTRIBUTES psaProcess,
PSECURITY_ATTRIBUTES psaThread,
BOOL bInheritHandles,
DWORD fdwCreate,
PVOID pvEnvironment,
PCTSTR pszCurDir,
PSTARTUPINFO psiStartInfo,
PPROCESS_INFORMATION ppiProcInfo);
STARTUPINFO si = { sizeof(si) };
PROCESS_INFORMATION pi;
CreateProcess(NULL,
TEXT("NOTEPAD"),
NULL,NULL,
FALSE,0,NULL,NULL,
&si,π);
STARTUPINFO si = { sizeof(si) };
PROCESS_INFORMATION pi;
TCHAR szCommandLine[] = TEXT("NOTEPAD"); //把常量字符串复制到一个临时缓冲区
CreateProcess(NULL,szCommandLine,NULL,NULL,
FALSE,0,NULL,NULL,&si,π);
BOOL CreateProcess(
PCTSTR pszApplicationName, //1.指定新进程要使用的可执行文件的名称
PTSTR pszCommandLine, //2.指定要传给新进程的命令行字符串
PSECURITY_ATTRIBUTES psaProcess,
PSECURITY_ATTRIBUTES psaThread,
BOOL bInheritHandles,
DWORD fdwCreate,
PVOID pvEnvironment,
PCTSTR pszCurDir,
PSTARTUPINFO psiStartInfo,
PPROCESS_INFORMATION ppiProcInfo);
BOOL CreateProcess(
PCTSTR pszApplicationName, //1.指定新进程要使用的可执行文件的名称
PTSTR pszCommandLine, //2.指定要传给新进程的命令行字符串
PSECURITY_ATTRIBUTES psaProcess, //3.为进程对象指定安全属性 ..可以NULL
PSECURITY_ATTRIBUTES psaThread, //4.为线程内核对象指定安全属性 ..可以NULL
BOOL bInheritHandles, //5.TRUE->可继承.....FALSE->不可继承
DWORD fdwCreate,
PVOID pvEnvironment,
PCTSTR pszCurDir,
PSTARTUPINFO psiStartInfo,
PPROCESS_INFORMATION ppiProcInfo);
/************************************************************
Module name: Inherit.c
Notices:Copyright(c)2000 Jeffrey Richter
// 内核对象句柄继承性的一个示例
************************************************************/
#include <Windows.h>
int WINAPI WinMain (HINSTANCE hinstExe,HINSTANCE,
PSTR pszCmdLine,int nCmdShow)
{
//Prepare a STARTUPINFO structure
//for spawning processes.
STARTUPINFO si = { sizeof(si) };
SECURITY_ATTRIBUTES saProcess,saThread;
PROCESS_INFORMATION piProcessB,piProcessC;
TCHAR szPath[MAX_PATH];
//Prepare to spawn Process B from Process A.
//The handle identifying the new process
//object should be inheritable.
saProcess.nLength = sizeof(saProcess);
saProcess.lpSecurityDescriptor = NULL;
saProcess.bInheritHandle = TRUE;
//假设现在由Process A来创建Process B,它调用CreateProcess,
//并为,psaProcess参数传入一个SECURITY_ATTRIBUTES结构的地址(在这个结构中,
//bInheritHandle成员被设为TRUE)。
//这样,Process B的进程对象句柄是可继承的。
//The handle identifying the new thread
//object should NOT be inheritable.
saThread.nLength = sizeof(saThread);
saThread.lpSecurityDescriptor = NULL;
saThread.bInheritHandle = FALSE;
//在同一个调用中,psaThread 参数指向另一个SECURITY_ATTRIBUTES结构,
//该结构的bInheritHandle成员被设为FALSE。
//这样,Process B的主线程对象句柄是不可继承的。
//Spawn Process B.
lstrcpy(szPath,TEXT("ProcessB"));
CreateProcess(NULL,szPath,
&saProcess,&saThread,
FALSE,0,NULL,NULL,&si,
&piProcessB);
//系统创建Process B时,会同时分配一个进程内核对象和一个线程内核对象,
//并在ppiProcInfo(最后一个参数)指向的一个结构中,将句柄返回给Process A。
//现在,利用返回的这些句柄,Process A就可以操纵新建的进程对象和线程对象。
//The pi structure contains two handles
//relative to Process A:
//hProcess,which identifies Process B's process
//object and is inheritable; and hThread,
//which identifies Process B's primary thread
//object and is NOT inheritable.
//Prepare to spawn Process C from Process A.
//Since NULL is passed for the psaProcess and
//psaThread parameters,the handles to Process C's
//process and primary thread objects default
//to "noninheritable."
//If Process A were to spawn another process,
//this new process would NOT inherit handles
//to Process C's process and thread objects.
//Because TRUE is passed for the bInheritHandles
//parameter,Process C will inherit the handle that
//identifies Process B's process object but will
//not inherit a handle to Process B's primary
//thread object.
lstrcpy(szPath,TEXT("ProcessC"));
CreateProcess(NULL,szPath,NULL,NULL,
TRUE,0,NULL,NULL,&si,&piProcessC);
//现在,假设Process A再次调用CreateProcess来创建Process C。
//Process A可以决定是否允许Process C操纵Process A能访问的一些内核对象。
//bInheritHandles参数便是针对这个用途而提供的。
//如果bInheritHandles设为TRUE,Process C将继承Process A中的所有可继承的句柄。
//////////////////////////////////////////
//在本例中,Process B的进程对象句柄是可继承的。
//Process B的主线程对象的句柄则是不可继承的,
//不管传给CreateProcess 的bInheritHandles 参数值是多少。
//另外, 如果 Process A 调用CreateProcess,并为bInheritHandles参数传入FALSE,
//则Process C不会继承Process A当前所用的任何一个句柄。
return(0);
}