重复Windows本地进程的句柄

时间:2013-09-22 16:10:36

标签: c++ windows visual-c++

使用案例

我有一个64位服务器进程,它通过IPC(COM + RPC)获得对32位客户端进程的PID的访问权限。服务器进程使用父窗口处理程序创建一个新窗口。我需要在客户端窗口中显示新窗口,而不是在桌面窗口顶部显示独立弹出窗口。

已采用的流程

为了在父窗口上显示新窗口,我首先尝试

  1. 获取顶部窗口的句柄
  2. 使用DuplicateHandle复制窗口句柄
  3. 使用新的重复窗口句柄
  4. 创建新窗口

    代码

    为了复制窗口句柄,我采用了以下代码。请注意,这不是实际代码,但为了简洁起见,改变了不相关的部分。另请注意,SetPriviledge函数是从Enabling and Disabling Privileges in C++

    采用的
    bool Duplicate(HWND hWnd)
        {
        HANDLE pToken = NULL;
        HANDLE hProcess = NULL;
        HANDLE hDuplicateHandle = NULL;
        DWORD pid = 0;
        bool bReturn = true;
        GetWindowThreadProcessId(hWnd, &pid);
        if(!(hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pid)))
            {
            std::cout<<"Cannot Open Process:"<<GetLastError()<<std::endl;
            bReturn = false;
            }
        if(bReturn && !OpenProcessToken( 
            hProcess, 
            TOKEN_ALL_ACCESS, 
            &pToken ))
            {
            std::cout<<"Cannot Open Token:"<<GetLastError()<<std::endl;
            bReturn = false;
            }
        //The SetPriviledge function was adopted from
        //http://msdn.microsoft.com/en-us/library/windows/desktop/aa446619(v=vs.85).aspx
        if (bReturn && !SetPrivilege(
            pToken, 
            SE_DEBUG_NAME, 
            true ))
            {
            std::cout<<"Error Setting Priveledge:error"<<GetLastError()<<std::endl;
            bReturn = false;
            }
        if(bReturn && !DuplicateHandle(
            hProcess,
            hWnd,
            GetCurrentProcess(),
            &hDuplicateHandle,
            NULL,
            NULL,
            DUPLICATE_SAME_ACCESS))
            {
            std::cout<<"Error Duplicating Handle: "<<GetLastError()<<std::endl;
            std::cout<<"Source Handle is "<<hWnd<<" And the Duplicate Handle is "<<hDuplicateHandle<<std::endl;
            bReturn = false;
            }
        if (hProcess)
            {
            CloseHandle(hProcess);
            }
        return bReturn;
        }
    

    以上代码的O / P

    Error Duplicating Handle: 6
    Source Handle is 00150C1C And the Duplicate Handle is 00000000
    Press any key to continue . . .
    

    即。代码失败,错误代码为6:ERROR_INVALID_HANDLE

    目标

    使上面的代码工作,以便我可以复制本地进程的远程Windows句柄。或者,确定以上是否是正确的过程。

0 个答案:

没有答案