// 目标进程的句柄 hTarget

时间:2021-10-10 09:17:44

  在进程之间共享内查东西句柄的一种要领:DuplicateHandle
  简单地说,该函数取得某个进程句柄表中的一个表项,然后把它拷贝到另一个进程的句柄表中。    

  BOOL WINAPI DuplicateHandle(   __in HANDLE hSourceProcessHandle,   __in HANDLE hSourceHandle,   __in HANDLE hTargetProcessHandle,   __out LPHANDLE lpTargetHandle,   __in DWORD dwDesiredAccess,   __in BOOL bInheritHandle,    __in DWORD dwOptions   );

  hSourceProcessHandle:源进程内核句柄(即卖力通报内查东西句柄的进程句柄)
  hSourceHandle:要通报的内查东西句柄
  hTargetProcessHandle:方针进程内核句柄
  lpTargetHandle:接收内查东西句柄的地点(先随便声明一个HANDLE)
  dwDesiredAccess:TargetHandle句柄使用何种访谒掩码(这个掩码是在句柄表中的一项)
  bInheritHandle:是否拥有担任
  dwOptions:当设DUPLICATE_SAME_ACCESS时,,暗示于源的内查东西所有标识表记标帜一样,此时wDesiredAccess可标识表记标帜为0 当设DUPLICATE_CLOSE_SOURCE时,传输完后,*源中的内查东西句柄
  此函数能否告成挪用还要看你是否有足够的权限去操纵方针进程
  凡是方针进程的内核句柄是操作OpenProcess()得到的

  注意:不要试图在源进程中操作CloseHandle()*TargetHandle,因为这个TargetHandle句柄值并不属于源进程的句柄表中的,若错误*了,会孕育产生不成预料的功效!
 

   不知道为何要用复制句柄函数,我操作进程间通信把句柄传给方针进程不就行了吗?
    这样的想法就大错特错了,我们外貌上是在复制句柄值,实际上是把该句柄在源进程句柄表中的所有项复制到方针进程的句柄表中,而且使该内查东西的计数器+1了,如果只是简单的只传句柄值,方针进程的句柄表中是不会有所增加的。

  下面例子演示在ApiDuplicateHandleSource.exe中创建一个线程,将该线程句柄复制到ApiDuplicateHandle.exe中去,在进程ApiDuplicateHandle.exe中结束该线程。

// ApiDuplicateHandleSource.cpp
#include <iostream> #include <Windows.h> #include <process.h> #include <tchar.h> #include <TlHelp32.h> using namespace std; unsigned __stdcall thread (void * lpPragma); HANDLE GetProcessHandle(LPCTSTR szName); int main (void) { HANDLE hThread = NULL; hThread = (HANDLE)_beginthreadex(NULL, 0, thread, NULL, 0, NULL); cout << "My thread handle is " << hThread << endl; HANDLE hTarget = NULL; BOOL bSucc = FALSE; //你是不是想说这里的hThread与挪用DuplicateHandle相关? bSucc = DuplicateHandle (GetCurrentProcess(), //当前进程的源进程句柄 hThread, //当前进程中存在的线程资源句柄(内查东西) GetProcessHandle(_T("ApiDuplicateHandle.exe")), //方针进程的句柄 &hTarget, //要得到的目的句柄(Out) 0, //访谒的方法 FALSE, //得到的句柄能不能被得到的其的进程的子进程担任 DUPLICATE_SAME_ACCESS ); //访谒选项 if (bSucc) { cout << "句柄复制告成, 其句柄值为:" << hTarget << endl; } cin.get(); return 0; } unsigned __stdcall thread (void * lpPragma) { while (1) { Sleep (1000); cout << "Please terminal me!" << endl; } return 0; } HANDLE GetProcessHandle(LPCTSTR szName) { HANDLE hSanpshot = NULL; hSanpshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); if ( INVALID_HANDLE_VALUE == hSanpshot ) { return NULL; } PROCESSENTRY32 pe; BOOL bOk = FALSE; pe.dwSize = sizeof(pe); bOk = Process32First (hSanpshot, &pe); if (!bOk) return NULL; do { if ( !_tcscmp (pe.szExeFile, szName) ) { return OpenProcess (PROCESS_ALL_ACCESS, FALSE, pe.th32ProcessID); } bOk = Process32Next (hSanpshot, &pe); } while (bOk); return NULL; }