win32 跨进程句柄共享 |
您所在的位置:网站首页 › 多进程共享socket › win32 跨进程句柄共享 |
前言
Win32 中所有敏感的资源全部都是内核管理,如果应用程序想调度敏感资源,则需要句柄进行间接操作。对于相同资源,每个进程的句柄值也不同的.
方式有如下两种: 父子进程句柄拷贝 句柄拷贝DuplicateHandle 文档 BOOL DuplicateHandle( HANDLE hSourceProcessHandle,//想要从那个进程复制句柄 HANDLE hSourceHandle,//hSourceProcessHandle进程内的一个句柄值 HANDLE hTargetProcessHandle,//复制到哪个进程中 LPHANDLE lpTargetHandle,// DWORD dwDesiredAccess, BOOL bInheritHandle, DWORD dwOptions ); void CProcessOneDlg::OnBnClickedButton1() { HWND hwnd = ::FindWindow(NULL, "计算器"); //获取进程的PID DWORD dwpid = 0; GetWindowThreadProcessId(hwnd, &dwpid); //获得进程的句柄 HANDLE hproc = ::OpenProcess(PROCESS_ALL_ACCESS, TRUE, dwpid); calcHandle.Format("得到的计算器的句柄 %X\r\n", hproc); OutputDebugString(calcHandle); UpdateData(FALSE); HWND hwnd2 = ::FindWindow(NULL, "ProcessB"); //获取进程的PID DWORD dwpid2 = 0; GetWindowThreadProcessId(hwnd2, &dwpid2); //获得进程的句柄 HANDLE hproc2 = ::OpenProcess(PROCESS_ALL_ACCESS, TRUE, dwpid2); DWORD lpTargetHandle; HANDLE handle=NULL; BOOL successful= DuplicateHandle( GetCurrentProcess(), hproc, hproc2, &handle, 0, FALSE, DUPLICATE_SAME_ACCESS ); calcHandle.Format("拷贝到目标进程后,目标进程的句柄数值:%X\r\n", handle); UpdateData(FALSE); if (successful) { OutputDebugString(calcHandle); } }
我们知道进程可以孵化子进程,而子进程是可以继承父进程句柄信息.而CreateProcess存在参数bInheritHandles可以子进程继续父进程的信息 win32 运行指定其他的进程 void CProcessOneDlg::OnBnClickedButton1() { HWND hwnd = ::FindWindow(NULL, "计算器"); //获取进程的PID DWORD dwpid = 0; GetWindowThreadProcessId(hwnd, &dwpid); //获得进程的句柄 HANDLE hproc = ::OpenProcess(PROCESS_ALL_ACCESS, TRUE, dwpid); calcHandle.Format("得到的计算器的句柄 %X\r\n", hproc); OutputDebugString(calcHandle); UpdateData(FALSE); STARTUPINFO si = { 0,0 }; PROCESS_INFORMATION pi = { 0 }; BOOL rRet = ::CreateProcess(NULL, LPSTR("C:/Users/fmy/source/repos/ProcessTwo/Debug/ProcessTwo.exe"),//打开文件浏览器 NULL, NULL, TRUE,//拷贝父进程句柄到子进程 0, NULL, NULL, &si, &pi ); }父进程: 子进程: |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |