我们平时双击运行的各个软件就是启动了一个进程,所以进程是和我们打交道最多的一个内核对象。既然我们说了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();
浙公网安备 33010602011771号