対象ハンドルを複製する
Windows OSでは、DuplicateHandle関数を使用してオブジェクトハンドルを複製できます。DuplicateHandle関数は、プロセス間または同じプロセス内で既存のオブジェクトハンドルを複製することを許可します。
関数のプロトタイプは以下の通りです。
BOOL DuplicateHandle(
HANDLE hSourceProcessHandle, // 源进程句柄
HANDLE hSourceHandle, // 源对象句柄
HANDLE hTargetProcessHandle, // 目标进程句柄
LPHANDLE lpTargetHandle, // 目标对象句柄
DWORD dwDesiredAccess, // 访问权限
BOOL bInheritHandle, // 是否可继承
DWORD dwOptions // 选项
);
パラメータの詳細
- hSourceProcessHandleは、ソースオブジェクトハンドルが存在するプロセスを示す、ソースプロセスのハンドルです。
- hSourceHandle:コピーするオブジェクトのハンドル、元のオブジェクトのハンドル
- hTargetProcessHandle:コピー対象のターゲットプロセスを示すターゲットプロセスハンドル。
- lpTargetHandle:受け取ったオブジェクトのハンドルを格納する変数へのポインターであるターゲット オブジェクトのハンドル。
- dwDesiredAccess: アクセス権、コピー後のオブジェクトハンドルのアクセス権を指定します。
- bInheritHandle: 継承可能かどうかを指定し、新しく作成されたハンドルを子プロセスが継承できるかどうかを示します。
- dwOptions:オプション。ハンドルを重複する方法を指定する。
関数が返す値:
- 関数が成功すれば、0 以外の値が返されます。
- 関数が失敗した場合はゼロを返します。エラーコードを取得するには、GetLastError 関数を使用できます。
使用例:
HANDLE hSourceHandle = OpenProcess(PROCESS_ALL_ACCESS, FALSE, sourceProcessId);
HANDLE hTargetHandle = NULL;
BOOL success = DuplicateHandle(
GetCurrentProcess(), // 当前进程句柄
hSourceHandle, // 源对象句柄
targetProcessHandle, // 目标进程句柄
&hTargetHandle, // 目标对象句柄
0, // 访问权限,0表示与源对象句柄相同
FALSE, // 不可继承
DUPLICATE_SAME_ACCESS // 复制句柄方式
);
if (success) {
// 复制成功,可以使用hTargetHandle操作目标对象
} else {
// 复制失败,可使用GetLastError获取错误代码
}
// 关闭源进程和目标进程的句柄
CloseHandle(hSourceHandle);
CloseHandle(hTargetHandle);
注意すべきことは、重複ハンドル関数は継承可能なオブジェクトハンドルのみ、例えばファイルハンドル、プロセスハンドルなどに使用できることです。一部の特殊ハンドル、例えばミューテックス、イベント、セマフォなどは、別のAPI関数による複製のみが可能です。