一 Windows进程 1. Windows进程 进程一个容器,包含了应用程序实例的各种资源。Windows多任务操作系统,因此可以同时执行多个进程。 2. Windows进程的一些特点 2.1 进程中包含了执行代码等资源。 2.2 进程都具有私有的地址空间。 2.3 每个进程都有一个ID,表示进程。 2.4 每个进程都有自己的安全属性。 2.5 至少要包含一个可以执行的线程。 二 进程的环境 1. 环境信息的获取 获取: GetEnvironmentStrings(VOID) 返回值是获取到的所有环境信息 释放: FreeEnvironmentStrings
void EnvString()
{
//获取所有环境信息
LPTSTR pszEnv = GetEnvironmentStrings() ;
LPTSTR pszTemp = pszEnv;
while (0 != *pszTemp)
{
wprintf(_T("%s\n"), pszTemp) ;
pszTemp += wcslen(pszTemp) + 1 ;
}
//释放环境信息字符串
FreeEnvironmentStrings(pszEnv) ;
}
2. 环境变量的获取和设置 获取: GetEnvironmentVariable 设置: SetEnvironmentVariable 三 进程信息 1. 进程ID和句柄 GetProcessID 获取进程的ID GetCurrentProcess 获取进程的句柄 返回值为-1,是当前进程的伪句柄。 如果想获取当前进程的实际句柄需要使用OpenProcess() 2. 打开进程 OpenProcess 获取进程的真实句柄 3. 获取进程的所有模块(EXE, DLL) 获取进程的详细信息使用PSAPI EnumProcessModulses
void ProcModule()
{
//获取进程句柄
DWORD dwModuleNeeded ;
HANDLE hHandle = GetCurrentProcess() ;
//获取所需大小
EnumProcessModules(hHandle, NULL, 0, &dwModuleNeeded) ;
DWORD dwCount = dwModuleNeeded/sizeof(HMODULE) ;
HMODULE *pModule = new HMODULE[dwCount] ;
//获取进程模块
EnumProcessModules(hHandle, pModule, dwModuleNeeded, 0) ;
//枚举模块名称
for (DWORD dwIndex = 0 ; dwIndex < dwCount; ++dwIndex)
{
TCHAR pszBuff[MAX_PATH] = {0} ;
GetModuleFileNameEx(hHandle, pModule[dwIndex], pszBuff, MAX_PATH) ;
wprintf(_T("%d : %s \t: %p\n"), dwIndex+1, pszBuff, pModule[dwIndex]) ;
}
delete pModule ;
};
四 进程的使用 1. 创建进程 WinExec(已淘汰) ShellExecute(一般用来打开带命令行的文件) CreateProcess (执行一个EXE可执行文件) 当进程创建成功,可以从进程信息中获取创建好的进程句柄ID等。 2. 打开进程 OpenProcess() 3. 结束进程 ExitProcess() TerminateProcess() ; 4. 等候进程结束 WaitForSingleObject() ; 阻塞函数,当运行时,会在等候的时间内,待等句柄信号。 五 Windows作业 1. Windows作业 实际是一个进程组。可以对作业设置权限,一旦进程加入到作业之内,进程的权限将被作业限制。 2. 作业的使用 2.1 创建一个作业 CreateJobObject 2.2 设置作业权限 SetInfomationJobObject 2.3 将进程加入作业 AssignProcessToJobObject 2.4 关闭作业 CloseHandle 2.5 结束作业 使用TerminateJobObject结束作业 但是并不是所有情况下,作业内的进程都能被结束。
void Job()
{
//创建JOB对象
HANDLE hJob = CreateJobObject(NULL, _T("")) ;
//设置权限
JOBOBJECT_BASIC_UI_RESTRICTIONS ui = {0} ;
ui.UIRestrictionsClass = JOB_OBJECT_UILIMIT_READCLIPBOARD | JOB_OBJECT_UILIMIT_WRITECLIPBOARD ;
SetInformationJobObject(hJob, JobObjectBasicUIRestrictions, &ui, sizeof(ui)) ;
//创建进程
HANDLE hProcess = Create(_T("C:\\WINDOWS\\system32\\notepad.exe")) ;
//将进程加入作业
AssignProcessToJobObject(hJob, hProcess) ;
getch() ;
//结束作业
TerminateJobObject(hJob, 0) ;
CloseHandle(hProcess) ;
CloseHandle(hJob) ;
}