进程提供了程序运行所需要的资源,虚拟内存地址空间......

exe文件加载到进程的虚拟地址空间内存中指定的位置.每个进程都有一个标识符(PID)和一个句柄,系统和其他进程可以通过PID和进程的句柄对进程进行管理操作

动态库的原理

如:API函数CreateFile可执行代码在Kernel32.dll中,"内存分页管理"将多个虚拟内存分页映射到同一个物理分页上.动态链接过程,exe文件中的导入表,初始化时将动态库加载到内存的虚拟地址空间中.

"动态链接"和"静态链接".线程,纤程与作业

1.线程(Thread)

2.纤程(Fiber)

3.作业(Job,也称为工作项)

作业是一种对象,可以将一组进程作为一个单元进行管理.

包括:命名对象(namable),安全对象(securable)和共享对象(sharable)创建进程,获取进程相关信息,获取启动函数

1.父进程和子进程

2.启动参数

GetCommandLine,GetStartupInfo函数获得启动参数,启动信息.

3.进程句柄和进程标识

如果想知道自己的句柄,可以使用

GetCurrentProcess和GetCurrentProcessId函数获取自己的句柄和PID.

可以使用GetPriorityClass,GetProcessTimes,GetProcessVersion,GetProcessWorkingSetSize函数获取进程的相关消息

获得其他进程PID,可以通过OpenProcess函数获得进程句柄,也可通过GetProcessId通过句柄获得PID.退出和终止程序

ExitProcess或TerminateProcess.关键API

CreateProcess

另外还有CreateProcessAsUser,CreateProcessWithLogonW,CreateProcessWithTokenW.


WinExec函数功能也是执行程序.BOOL WINAPI CreateProcess(
__in          LPCTSTR lpApplicationName, //指向启动exe文件
__in_out      LPTSTR lpCommandLine, //启动进程命令行
__in          LPSECURITY_ATTRIBUTES lpProcessAttributes, //SECURITY_ATTRIBUTES结构变量,为进程设置安全属性 
__in          LPSECURITY_ATTRIBUTES lpThreadAttributes, //进程句柄是否可以被子进程继承
__in          BOOL bInheritHandles, //与子进程句柄基础关系
__in          DWORD dwCreationFlags, //进程创建标志和优先级控制
__in          LPVOID lpEnvironment, //指向新进程环境变量块,null指使用父进程环境变量块
__in          LPCTSTR lpCurrentDirectory, //指定创建后新进程的当前目录,null为父进行的当前目录
__in          LPSTARTUPINFO lpStartupInfo, //设定启动信息,A pointer to a STARTUPINFO or STARTUPINFOEX 两结构.
__out         LPPROCESS_INFORMATION lpProcessInformation //A pointer to a PROCESS_INFORMATION structure that receives identification information about the new process
);                                                          //返回进程信息创建进程实例:
/* 头文件 */
#include <windows.h>
#include <stdio.h>DWORD CreateChildProcess(LPSTR szChildProcessCmd);
/*************************************
* int main(void)
* 功能 演示进程创建
*
* 参数 未使用
**************************************/
int main()
{ 
CreateChildProcess("Child.exe abc 123");
}
/*************************************
* DWORD CreateChildProcess(LPSTR szChildProcessCmd)
* 功能 演示创建子进程
*
* 参数 LPSTR szChildProcessCmd 启动子进程的命令行
* 返回值 成功返回,失败返回
**************************************/
DWORD CreateChildProcess(LPSTR szChildProcessCmd)
{ 
STARTUPINFO si;
PROCESS_INFORMATION pi;
// 将启动信息结构清零
ZeroMemory( &si, sizeof(si) );
// 设置结构大小,cb属性应为结构的大小
si.cb = sizeof(si);
// 将进程信息结构清零
ZeroMemory( &pi, sizeof(pi) );// 创建子进程,并判断是否成功
if( !CreateProcess( NULL,   // 使用命令行
   szChildProcessCmd,    // 命令行
   NULL,             // 不继承进程句柄
   NULL,             // 不继承线程句柄
   FALSE,            // 不继承句柄
   0,                // 没有创建标志
   NULL,             // 使用父进程环境变量
   NULL,             // 使用父进程目录作为当前目录
   &si,              // STARTUPINFO 结构
   &pi )             // PROCESS_INFORMATION 保存相关信息
   ) 
{
   // 创建失败
   printf( "CreateProcess failed (%d)./n", GetLastError() );
   return 1;
}
// 在创建成功后父进程也可直接退出,这里等待子进程执行结束// 等待子进程结束
// 使用到了通过PROCESS_INFORMATION 返回的相关信息,hProcess为子进程句柄
// 父进程也可以不等待子进程运行完成而直接退出
WaitForSingleObject( pi.hProcess, INFINITE );
// 关闭进程句柄和线程句柄
CloseHandle( pi.hProcess );
CloseHandle( pi.hThread );
return 0;
}子进程:
/* 头文件 */
#include <windows.h>
#include <stdio.h>
/* 宏定义 */
#define MyAlloc(size) HeapAlloc(GetProcessHeap(),0,size)
#define MyFree(lpMem) HeapFree(GetProcessHeap(),0,lpMem)
/* 结构体定义 */
typedef struct _PROCESS_INFO
{
DWORD dwPid;
HANDLE hProcess;
DWORD dwPrioClass;
DWORD dwHandleCount;
DWORD dwAffinityMask;
SIZE_T dwWorkingSetSizeMax;
SIZE_T dwWorkingSetSizeMin;
LPWSTR szwCommandLine;
STARTUPINFO sti;
}PROCESS_INFO, *LPPROCESS_INFO;
/* 全局变量 */
HANDLE hMySelf;
/* 函数声明 */
DWORD GetProcessInfo(LPPROCESS_INFO lppi);/*************************************
* int WinMain(
HINSTANCE hInstance,
    HINSTANCE hPrevInstance,
    LPSTR lpCmdLine,
    int nCmdShow
* 功能 演示获取进程信息,在进程中获取命令行参数等
*
**************************************/
int WinMain(
HINSTANCE hInstance,
    HINSTANCE hPrevInstance,
    LPSTR lpCmdLine,
    int nCmdShow
)
{
PROCESS_INFO pi;
INT argc;
WCHAR **argv;
DWORD i;
DWORD dwBufferSize = lstrlen(lpCmdLine)+MAX_PATH+1024;
LPSTR szShowBuffer = (LPSTR)MyAlloc(dwBufferSize);hMySelf = hInstance;
// 显示直接从WinMain函数参数得到的信息
wsprintf(szShowBuffer,
   "启动参数/n实例句柄:%.8X,命令行参数:%s,显示选项:%.8X",
   hInstance,lpCmdLine,nCmdShow);
MessageBox(NULL,szShowBuffer,"WinMain函数参数",MB_OK);
// 使用自定义的函数获取相关信息
GetProcessInfo(&pi);
// 将命令行参数分离
argv = CommandLineToArgvW(pi.szwCommandLine,&argc);
// 字符处理,并显示
*szShowBuffer = '/x00'; 
for(i=0; i<argc; i++)
{
   DWORD dwBufferSize = lstrlenW(*argv)+1;
   LPSTR szMBArgv = MyAlloc(dwBufferSize);
   WideCharToMultiByte(CP_ACP,0,*argv,-1,szMBArgv,dwBufferSize,NULL,NULL);
   argv++;
   lstrcat(szShowBuffer,"/n");
   lstrcat(szShowBuffer,szMBArgv);
   MyFree(szMBArgv);
}
MessageBox(NULL,szShowBuffer,"参数",MB_OK);
MyFree(szShowBuffer);
// 打印其他信息 TODO
return 0;
}
/*************************************
* DWORD GetProcessInfo(LPPROCESS_INFO lppi)
* 功能 获取进程相关信息,保存在PROCESS_INFO结构中
*
* 参数 LPPROCESS_INFO lppi 用于保存相关信息
**************************************/
DWORD GetProcessInfo(LPPROCESS_INFO lppi)
{
// PID
lppi->dwPid = GetCurrentProcessId();
// 句柄
lppi->hProcess = GetCurrentProcess();
// 优先级
lppi->dwPrioClass = GetPriorityClass(hMySelf);
// 句柄记数
//windows xp sp1 sdk 新增的API GetProcessHandleCount
//lppi->dwHandleCount 
// = GetProcessHandleCount(lppi->hProcess,&lppi->dwHandleCount);

// AffinityMask
GetProcessAffinityMask(hMySelf,
   &lppi->dwAffinityMask,
   NULL); 
// WorkingSetSize
GetProcessWorkingSetSize(hMySelf,
   &lppi->dwWorkingSetSizeMin,
   &lppi->dwWorkingSetSizeMax); 
lppi->szwCommandLine = GetCommandLineW();
// 启动信息
GetStartupInfo(&lppi->sti);
return 0;
} 
 
 
 
我们平时常用的:
启动:   
  STARTUPINFO   Si;   
  PROCESS_INFORMATION   Pi;   
    
  memset(&Si,   0,   sizeof(STARTUPINFO));   
  Si.cb   =   sizeof(STARTUPINFO);   
  Si.dwFlags   =   STARTF_USESHOWWINDOW;   
  Si.wShowWindow   =   SW_SHOWNORMAL;   
    
  CreateProcess("c://windows//notepad.exe",NULL,NULL,NULL,FALSE,0,NULL,NULL,&Si,&Pi))   
    
  关闭:   
  重载OnClose   
    
  void   CXXXXDlg::OnClose()     
  {   
  TerminateProcess(Pi.hProcess,   0);   
  CDialog::OnClose();   
  }