2011-12-31 67 views
1

我想关闭位于另一个进程中的互斥体的句柄,以便我可以运行该应用程序的多个实例。关闭另一个进程中互斥锁的句柄

我已经知道这可以做到,see Process Explorer。例如:Windows 扫雷(Windows 7)使用互斥体只允许一个游戏,所以我想我会用它作为一个例子,因为它预装了Windows,因此更容易让你们引导我。

我需要关闭的互斥锁是\Sessions\1\BaseNamedObjects\Oberon_Minesweeper_Singleton,我发现它使用Process Explorer。

关闭此互斥锁后,我能够启动扫雷两场比赛,但我想在我的程序中使用C++执行此操作。

经过一番搜索后,我发现我可能需要API DuplicateHandle。到目前为止,我还没有能够关闭这个互斥量的句柄。

这是到目前为止我的代码:

#include <Windows.h> 
#include <iostream> 

using namespace std; 

void printerror(LPSTR location){ 
    printf("Error: %s_%d", location, GetLastError()); 
    cin.get(); 
} 

int main(){ 
    DWORD pid = 0; 
    HWND hMineWnd = FindWindow("Minesweeper", "Minesveiper"); 
    GetWindowThreadProcessId(hMineWnd, &pid); 
    HANDLE hProc =OpenProcess(PROCESS_DUP_HANDLE, 0, pid); 
    if(hProc == NULL){ 
     printerror("1"); 
     return 1; 
    } 
    HANDLE hMutex = OpenMutex(MUTEX_ALL_ACCESS, TRUE, "Oberon_Minesweeper_Singleton"); 
    if(hMutex == NULL){ 
     printerror("2"); 
     return 2; 
    } 
    if(DuplicateHandle(hProc, hMutex, NULL, 0, 0, FALSE, DUPLICATE_CLOSE_SOURCE) == 0){ 
     printerror("3"); 
     return 3; 
    } 
    if(CloseHandle(hMutex) == 0){ 
     printerror("4"); 
     return 4; 
    } 
    return 0; 
} 

此代码返回0,但互斥量仍然存在,我不能够推出扫雷更多的游戏。我认为DuplicateHandle的一些参数是错误的。

+2

这种互斥量在Microsoft遭受无情攻击后进入的XP SP1漏洞列表中居高不下。拒绝服务,DOS有不同的含义。你正在享受反制措施。这又是什么意思? – 2011-12-31 23:53:02

+0

@HansPassant目标是通过互斥锁并能够运行多个相同的应用程序。 – WePro2 2012-01-01 00:02:31

+0

您绝对*错过了“单身申请”的要点。只需在谷歌查询中输入。 – 2012-01-01 00:28:53

回答

1

的第二个参数DuplicateHandle预计“一个开放的对象句柄,其源过程的上下文中有效”,但是我相信你在路过的手柄就只能是在当前进程中有效(OpenMutex创建现有互斥对象的新句柄)。您可能需要确定远程进程中互斥锁的句柄,并在调用DuplicateHandle时使用该值。

+0

Thx为您的快速回复,有没有关于如何从远程进程获取句柄的建议? – WePro2 2011-12-31 23:52:17

+0

通常,本地和远程进程将通过进程间通信(套接字,管道,共享内存等)共享句柄ID。由于您不控制远程进程,因此我不确定如何检索此信息。 – DRH 2012-01-01 00:06:26

+0

我想也许注入一个.dll来传递来自远程进程的句柄,但是从注入的.dll中移除互斥体不是更容易吗? – WePro2 2012-01-01 00:14:51