Win32_Windows进程
一 Windows进程
1 Windows进程
进程一个容器,包含了应用程序实例的各种资源。Windows多任务的操作系统,
因此可以同时执行多个进程
2 Windows进程的一些特点
2.1 进程中包含了执行代码等资源。
2.2 进程都具有私有的地址空间。
2.3 每个进程都有一个ID,标识进程。
2.4 每个进程都有自己的安全属性
2.5 每个进程中至少要包含一个可执行的线程。
二 进程的环境
1 环境信息的获取
获取:
LPVOID GetEnVironmentStrings(VOID)
返回值是获取到的所有环境信息
释放:
BOOL FreeEnVironmentStrings(LPTSTR lpszEnVironmentBlock);
2 环境变量的获取和设置
获取
DWORD GetEnvironmentVariable( LPCTSTR lpName,//变量名称 LPTSTR lpBuffer,//数据BUFF DWORD nSize);//BUFF的长度
返回值是获取到的字符串的长度
设置:
BOOL SetEnvironmentVariable( LPCTSTR lpName,//变量名称 LPCTSTR lpValue);//变量的值
1 #include "stdafx.h" 2 #include "windows.h" 3 4 void EnvVariable(LPSTR pszVar) 5 { 6 //设置指定变量的值 7 SetEnvironmentVariable(pszVar,"C:\\"); 8 9 //获取指定的变量值 10 CHAR szValue[1024] = {0}; 11 GetEnvironmentVariable(pszVar,szValue,1024); 12 printf("%s:%s\n",pszVar,szValue); 13 14 15 } 16 void EnvString() 17 { 18 //获取所有环境信息 19 LPSTR pszEnv = (LPSTR)GetEnvironmentStrings(); 20 LPSTR pszTmp = pszEnv; 21 while(0 != pszTmp[0]) 22 { 23 printf("%s\n",pszTmp); 24 pszTmp = strlen(pszTmp) + 1 + pszTmp; 25 } 26 //释放环境信息字符串 27 FreeEnvironmentStrings(pszEnv); 28 29 } 30 int main(int argc, char* argv[]) 31 { 32 EnvString(); 33 EnvVariable("MYPATH"); 34 return 0; 35 }
三 进程的信息
1 进程ID和句柄
GetCurrentProcessID 获取进程ID
GetCurrentProcess 获取进程的句柄
返回值为 -1 ,是当前进程的伪句柄。如果想获取当前进程的实际句柄需要 使用 OpenProcess函数。
2 打开进程
HANDLE OpenProcess( DWORD dwDesiredAccess,//访问模式 BOLL bInheritHandle,//继承标识 DWORD dwProcessID);//进程ID
返回进程句柄
3 获取进程的所有使用的所有模块(EXE或DLL)
使用 PSAPI 函数
BOOL EnumProcessModules( HANDLE hProcess,//进程句柄 HMODULE *lphModule,//模块的数组 DWORD cb,//数组的长度 LPDWORD lpcbNeeded);//获取到数据的字节数
1 #include "stdafx.h" 2 #include "windows.h" 3 #include "../psapi/psapi.h" 4 5 #pragma comment(lib,"../psapi/psapi.lib") 6 7 void ProcModule() 8 { 9 //当前进程句柄 10 HANDLE hProc = GetCurrentProcess(); 11 //获取模块句柄 12 HMODULE hModules[256] = {0}; 13 DWORD nNeed = 0; 14 EnumProcessModules(hProc,hModules,256,&nNeed); 15 //计算获取到句柄数量 16 DWORD nCount = nNeed / sizeof(HMODULE); 17 //打印句柄 18 for(DWORD nIndex = 0; nIndex < nCount; nIndex ++) 19 { 20 //获取模块的文件名及路径 21 CHAR szPath[MAX_PATH] = {0}; 22 GetModuleFileNameEx(hProc,hModules[nIndex],szPath, 23 MAX_PATH); 24 //打印 25 printf("%d:%p,%s\n",nIndex + 1,hModules[nIndex],szPath); 26 } 27 } 28 void ProcInfo() 29 { 30 //获取进程ID 31 DWORD nID = GetCurrentProcessId(); 32 //获取进程句柄(-1 ,伪句柄) 33 HANDLE hProc = GetCurrentProcess(); 34 35 printf("Process ID:%d\n",nID); 36 printf("Process Handle:%p\n",hProc); 37 //根据进程ID获取进程实际句柄 38 hProc = OpenProcess(PROCESS_ALL_ACCESS,FALSE,nID); 39 printf("Process Handle:%p\n",hProc); 40 } 41 42 int main(int argc, char* argv[]) 43 { 44 ProcInfo(); 45 ProcModule(); 46 return 0; 47 }
四 进程的使用
1 创建进程
WinExec 16位,现在不使用
ShellExecute 执行打开文件等操作
CreateProcess 执行一个EXE可执行文件,创建一个进程以及它的主线程
BOOL CreateProcess( LPCTSTR lpApplicationName,//应用程序路径名 LPSTR lpCommandLine,//命令行 LPSECURITY_ATTRIBUTES lpProcessAttributes,//线程安全属性 BOOL bInheritHandles,//句柄继承标识 DWORD dwCreationFlags,//创建标识 LPVOID lpEnvironment,//环境块 LPCTSTR lpCurrentDirectory,//当前目录 LPSTARTUPINFO lpStartupInfo,//启动参数 LPPROCESS_INFORMATION lpProcessInformatio);//进程信息
当里程创建成功,可以从进程信息中获取创建好的进程句柄\ID等。
如果执行程序是16位的程序,那么只能使用 lpCommandLine设置执行程序路径
2 打开进程
OpenProcess
3 结束进程
ExitProcess
BOOL TerminateProcess( HANDLE hProcess,//进程句柄 UINT uExitCode);//结束代码
4 等候进程结束
DWORD WaitForSingleObject( HANDLE hHandle,//等候的句柄 DWORD dwMilliseconds);//等候的时间,毫秒
阻塞函数,当运行时会在等候的时间内等待句柄的信号,
1 #include "stdafx.h" 2 #include "conio.h" 3 #include "windows.h" 4 5 void Create() 6 { 7 STARTUPINFO si = {0}; 8 PROCESS_INFORMATION pi = {0}; 9 si.cb = sizeof(si); 10 si.dwFlags = STARTF_USESIZE; 11 si.dwXSize = 100; 12 si.dwYSize = 200; 13 //创建进程 14 //CreateProcess("C:\\WINDOWS\\system32\\winmine.exe", 15 // NULL,NULL,NULL,FALSE,0,NULL,NULL,&si,&pi); 16 17 CreateProcess("ChildProc.exe","\"Hello Child\"", 18 NULL,NULL,FALSE,CREATE_NEW_CONSOLE,NULL,NULL,&si,&pi); 19 20 //输出信息 21 printf("Process Handle:%p\n",pi.hProcess); 22 printf("Process ID:%d\n",pi.dwProcessId); 23 printf("Thread Handle: %p\n",pi.hThread); 24 printf("Thread ID %d\n",pi.dwThreadId); 25 } 26 void Terminate(DWORD dwProcID) 27 { 28 //打开进程获取句柄 29 HANDLE hProc = OpenProcess(PROCESS_ALL_ACCESS,FALSE,dwProcID); 30 //结束进程 31 TerminateProcess(hProc,0); 32 } 33 void Wait() 34 { 35 //创建进程 36 STARTUPINFO si = {0}; 37 PROCESS_INFORMATION pi = {0}; 38 si.cb = sizeof(si); 39 CreateProcess("C:\\Windows\\System32\\Winmine.exe", 40 NULL,NULL,NULL,FALSE,0,NULL,NULL,&si,&pi); 41 printf("Winmine is runnig\n"); 42 //等候进程结束 43 WaitForSingleObject(pi.hProcess,INFINITE); 44 printf("Winmine is stop\n"); 45 } 46 int main(int argc, char* argv[]) 47 { 48 //Create(); 49 //Terminate(4100); 50 Wait(); 51 getch(); 52 return 0; 53 }
五 Windows 作业(Job)
1 Windows 作业
实际是一个进程组,可以对作业设置权限,一旦进程加入到作业之内,进程的权限将
被作业限制。
2 作业的使用
需要 NT5.0以上支持,所以在 Windows.h 前定义:#define _WIN32_WINNT 0x0500
2.1 创建一个作业
HANDLE CreateJobObject( LPSECURITY_ATTRIBUTES lpJobAttributes,//安全属性 LPCTSTR lpName);//名称
返回创建的Job句柄
2.2 设置作业权限
BOOL SetInformationJobObject( HANDLE hJob,//Job句柄 JOBOBJECTINFOCLASS JobObjectInformation,//Job权限的类型 LPVOID lpJobObjectInformation,//类型所对应的数据结构的地址 DWORD cbJobObjectInformationLength);//类型所对应的数据结构的长度
2.3 将进程加入作业
BOOL AssignProcessToJobObject( HANDLE hJob,//作业句柄 HANDLE hProcess);//进程句柄
2.4 关闭作业
CloseHandle
2.5 结束作业
使用 TerminateJobObject 结束作业,但并不是所有情况下作业内的进程都能
被结束。
1 #include "stdafx.h" 2 3 #define _WIN32_WINNT 0x0500 4 5 #include "windows.h" 6 #include "conio.h" 7 8 HANDLE Create(LPSTR pszPath) 9 { 10 STARTUPINFO si = {0}; 11 PROCESS_INFORMATION pi = {0}; 12 si.cb = sizeof(si); 13 14 CreateProcess(pszPath,NULL,NULL,NULL,FALSE,0, 15 NULL,NULL,&si,&pi); 16 17 return pi.hProcess; 18 } 19 void Job() 20 { 21 //创建Job对象 22 HANDLE hJob = CreateJobObject(NULL,"MyJob"); 23 //设置权限 24 JOBOBJECT_BASIC_UI_RESTRICTIONS ui = {0}; 25 ui.UIRestrictionsClass = JOB_OBJECT_UILIMIT_READCLIPBOARD | 26 JOB_OBJECT_UILIMIT_WRITECLIPBOARD; 27 SetInformationJobObject(hJob,JobObjectBasicUIRestrictions,&ui, 28 sizeof(ui)); 29 //创建进程 30 HANDLE hProc = Create("c:\\windows\\system32\\mspaint.exe"); 31 //将进程加入作业 32 AssignProcessToJobObject(hJob,hProc); 33 //创建进程 34 hProc = Create("c:\\windows\\system32\\mspaint.exe"); 35 //将进程加入作业 36 AssignProcessToJobObject(hJob,hProc); 37 38 getch(); 39 //结束作业 40 TerminateJobObject(hJob,0); 41 //关闭Job 42 CloseHandle(hJob); 43 44 } 45 int main(int argc, char* argv[]) 46 { 47 48 Job(); 49 return 0; 50 }