Win32进程
进程的信息
1 进程ID和句柄
GetCurrentProcessID 获取进程的ID
GetCurrentProcess 获取进程的句柄,
返回值为-1,是当前进程的伪句柄.
如果想获取当前进程的实际句柄
需要使用OpenProcess函数.
2 打开进程
HANDLE OpenProcess(
DWORD dwDesiredAccess, //访问模式
BOOL bInheritHandle, //继承标识
DWORD dwProcessId //进程ID
);
返回进程的句柄
void ProcInfo()
{
DWORD nID = GetCurrentProcessId();//当前进程ID
HANDLE hHproc =GetCurrentProcess();//返回值为-1,为当前进程句柄,伪句柄,但是可用.
HANDLE hHProc2 = OpenProcess(PROCESS_ALL_ACCESS, FALSE, nID);//获取当前进程的真正句柄
printf("%d, %p, %p\n",nID, hHproc,hHProc2);
}
3 获取进程的所使用的所有模块(EXE或DLL)
使用PSAPI函数.
BOOL EnumProcessModules(
HANDLE hProcess,//进程句柄
HMODULE * lphModule,//模块的数组
DWORD cb, //数组的长度
LPDWORD lpcbNeeded //获取到数据的字节数
);
四 进程的使用
1 创建进程
WinExec 16位,现在不使用
ShellExecute 执行打开文件等操作.
CreateProcess 执行一个EXE可执行文件.创建
一个进程以及它的主线程.
BOOL CreateProcess(
LPCTSTR lpApplicationName,
//应用程序路径名
LPTSTR lpCommandLine, //命令行
LPSECURITY_ATTRIBUTES lpProcessAttributes,
//进程安全属性
LPSECURITY_ATTRIBUTES lpThreadAttributes,
//线程安全属性
BOOL bInheritHandles, //句柄继承标识
DWORD dwCreationFlags, //创建标识
LPVOID lpEnvironment, //环境块
LPCTSTR lpCurrentDirectory,//当前目录
LPSTARTUPINFO lpStartupInfo,//启动参数
LPPROCESS_INFORMATION lpProcessInformation
//进程信息
);
当进程创建成功,可以从进程信息中获取创建
好的进程句柄\ID等.
如果执行程序是16的程序,那么只能使用
lpCommandLine设置执行程序路径.
//打开扫雷游戏
void Create()
{
STARTUPINFO si = { 0 };
PROCESS_INFORMATION pi = { 0 };//进程信息保存在此
si.cb = sizeof(si);
CreateProcess("C:\\WINDOWS\\system32\\winmine.exe",NULL, NULL, NULL, FALSE,0, NULL,NULL,&si,&pi);
}
printf("hProcess :%p \n",pi.hProcess);
printf("hThread :%p \n",pi.hThread);//主线程句柄
printf("dwProcessId :%d \n",pi.dwProcessId);
printf("dwThreadId :%d \n",pi.dwThreadId);
2 打开进程
OpenProcess
3 结束进程
VOID ExitProcess( UINT uExitCode );
BOOL TerminateProcess(
HANDLE hProcess, //进程句柄
U