我们平时双击运行的各个软件就是启动了一个进程,所以进程是和我们打交道最多的一个内核对象。既然我们说了Windows编程的本质就是申请内核对象,拿到句柄,操作句柄,销毁句柄,那我们就来操练一下:

第一、申请内核对象:

     凡是申请内核对象,Windows API都是以Create开头的的函数,比如:

1、建立一个新进程的函数:

BOOL WINAPI CreateProcess(

  __in_opt     LPCTSTR lpApplicationName,

  __inout_opt  LPTSTR lpCommandLine,

  __in_opt     LPSECURITY_ATTRIBUTES lpProcessAttributes,

  __in_opt     LPSECURITY_ATTRIBUTES lpThreadAttributes,

  __in         BOOL bInheritHandles,

  __in         DWORD dwCreationFlags,

  __in_opt     LPVOID lpEnvironment,

  __in_opt     LPCTSTR lpCurrentDirectory,

  __in         LPSTARTUPINFO lpStartupInfo,

  __out        LPPROCESS_INFORMATION lpProcessInformation

);

   用这个函数就可以通知操作系统要申请一个进程内核对象了,请操作系统给与执行。操作系统接到申请后就开始准备虚拟空间,把该进程装载进去,然后执行,再把该进程的句柄返回给你,句柄存在PROCESS_INFORMATION这个数据结构里:

typedef struct _PROCESS_INFORMATION {
  HANDLE hProcess;
  HANDLE hThread;
  DWORD dwProcessId;
  DWORD dwThreadId;

} PROCESS_INFORMATION,
 *LPPROCESS_INFORMATION;

2、申请系统进程快照对象:

   如果要列出正在运行的一系列进程,可以申请进程快照内核对象:

HANDLE WINAPI CreateToolhelp32Snapshot(

  __in  DWORD dwFlags,

  __in  DWORD th32ProcessID

);

这个函数直接就把句柄返回给你了。

第二、操作句柄:

拿到快照句柄后,下面就可以操作了,有两个操作函数:

BOOL WINAPI Process32First(

  __in     HANDLE hSnapshot,

  __inout  LPPROCESSENTRY32 lppe

);

BOOL WINAPI Process32Next(

  __in   HANDLE hSnapshot,

  __out  LPPROCESSENTRY32 lppe

);

它们把获取的进程信息存在PROCESSENTRY32数据结构中:

typedef struct tagPROCESSENTRY32 {
  DWORD dwSize;
  DWORD cntUsage;
  DWORD th32ProcessID;
  ULONG_PTR th32DefaultHeapID;
  DWORD th32ModuleID;
  DWORD cntThreads;
  DWORD th32ParentProcessID;
  LONG pcPriClassBase;
  DWORD dwFlags;
  TCHAR szExeFile[MAX_PATH];

} PROCESSENTRY32,
 *PPROCESSENTRY32;

当获得进程的ID号后,可以用:

HANDLE WINAPI OpenProcess(

  __in  DWORD dwDesiredAccess,

  __in  BOOL bInheritHandle,

  __in  DWORD dwProcessId

);

获取单个进程的句柄。

第三、销毁句柄:

1、终止其他进程函数:

BOOL WINAPI TerminateProcess(

  __in  HANDLE hProcess,

  __in  UINT uExitCode

);

只要拿到进程句柄,就可以用该函数终止它。

2、用OpenProcess得到的句柄别忘了CloseHandle();