使用案例
我有一个64位服务器进程,它通过IPC(COM + RPC)获得对32位客户端进程的PID的访问权限。服务器进程使用父窗口处理程序创建一个新窗口。我需要在客户端窗口中显示新窗口,而不是在桌面窗口顶部显示独立弹出窗口。
已采用的流程
为了在父窗口上显示新窗口,我首先尝试
代码
为了复制窗口句柄,我采用了以下代码。请注意,这不是实际代码,但为了简洁起见,改变了不相关的部分。另请注意,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句柄。或者,确定以上是否是正确的过程。