一、进程内存空间的地址划分
每个程序都有自己独立的4G虚拟内存,只有当你真正申请的时候,才会把内存分给你
二、进程的创建
1、每个进程都是由别的进程创建的,explorer.exe,explorer调用了一个函数CreatProcess()
2、进程的创建
- 映射EXE文件
- 创建内核对象EPROCESS
- 映射系统DLL(ntdll.dll)
- 创建线程内核对象ETHREAD
- 系统启动线程
- 映射DLL
- 线程开始执行
三、进程
1、命令行参数
#include "stdafx.h"
//**********************************************************************
int main(int argc, char* argv[])
{
printf("%s - %s - %s",argv[0],argv[1],argv[2]);
getchar();
return 0;
}
2、创建一个子进程打开IE浏览器
#include "stdafx.h"
#include "windows.h"
//打开子进程函数
BOOL CreateProcess(PTCHAR route,PTCHAR szCommandLine)
{
//定义两个结构体
STARTUPINFO si;
PROCESS_INFORMATION pi ;
//初始化结构体
ZeroMemory(&pi,sizeof(pi));
ZeroMemory(&si,sizeof(si));
//si结构体的cb 必须要赋值
si.cb = sizeof(si);
//创建子程序 返回成功与失败
if(!CreateProcess(
route, //打开程序的路径
szCommandLine, //命令行参数
NULL, //进程相关的属性(是否可以被继承)
NULL, //线程程相关的属性(是否可以被继承)
FALSE, //创建子进程,允不允许子进程继承父进程的句柄表
0, //填NULL子进程共享父进程的控制台
NULL,
NULL, //创建的子进程获取的当前目录是父进程的当前目录,如果子进程想得到自己真实的当前目录此处不能选NULL
&si, //创建子进程的详细信息
&pi) //存储的是进程ID,线程ID,进程句柄,线程句柄
)
{//打印错误信息
printf("Error:%d\n",GetLastError());
return FALSE;
}
//打印线程进程id,线程id,进程句柄,线程句柄
printf("%d %d %d %d\n",pi.dwProcessId,pi.dwThreadId,pi.hProcess,pi.hThread);
//释放句柄
CloseHandle(pi.hProcess);
CloseHandle(pi.hThread);
return TRUE;
}
int main(int argc, char* argv[])
{
TCHAR route[] = TEXT("C://Program Files//Internet Explorer//IEXPLORE.exe");
//命令行参数,记得加个空格以防不认识参数
TCHAR szCmdLine[] = TEXT(" http://www.baidu.com/");
CreateProcess(route,szCmdLine); //程序路径,命令行参数
getchar();
return 0;
}