【问题标题】:how does procexp close a mutex held by another process?procexp 如何关闭另一个进程持有的互斥锁?
【发布时间】:2013-04-30 04:30:16
【问题描述】:

我正在尝试使用 Win32 函数关闭由 Windows 上的进程持有的互斥锁。这可以使用 procexp 完成,但我需要在不使用 procexp GUI 的情况下以编程方式完成。

方法一: 我尝试使用 EasyHook 将 dll 注入进程,然后从注入的线程中尝试以下操作: - 开放互斥
- ReleaseMutex 它给了我 ERROR_NOT_OWNER 错误,可能是因为发布是在与调用 AcquireMutex 的线程不同的线程上调用的。

方法二: 注入 dll 后,我尝试使用 mHook 挂钩 CreateMutex。挂钩的 CreateMutex 只是回调了原来的 CreateMutex。但这只会使应用程序崩溃。

我可以使用 procexp 来关闭互斥体,但我需要以编程方式进行。 procexp 是如何做到的?如何在没有任何内核模式代码的情况下以编程方式完成?

【问题讨论】:

  • ReleaseMutex 不是它的关闭方法。您需要在其上调用 CloseHandle。您想解除对互斥锁的阻塞还是关闭它的句柄? Process Explorer 只能关闭它。
  • 它是一个进程持有的全局互斥锁。关闭它是否允许其他进程能够获取它?
  • 从文档中不确定,但我希望 WaitForSingleObject 确实成功,但错误代码为 WAIT_ABANDONED。如果这不起作用,我会尝试使用内核模式驱动程序;-)
  • 为什么要弄乱另一个进程打开的对象?这听起来像是消除症状,而不是解决问题。
  • 我正在尝试启动同一个游戏的两个实例,但不允许使用互斥锁启动。我们获得了游戏厂商的授权,但在游戏中更难获得代码级别的变化。

标签: winapi


【解决方案1】:

使用NtQuerySystemInformation() 检索打开的句柄数组,循环遍历数组直到在目标进程中找到所需的互斥句柄,然后通过指定DUPLICATE_CLOSE_SOURCE 标志使用DuplicateHandle() 将其关闭。

下面的文章有更详细的解释:

HOWTO: Enumerate handles

【讨论】:

    【解决方案2】:

    只是添加一个完整的答案。识别互斥体后,我必须将以下代码添加到handles.cpp:

         HANDLE realHandle;  
         ret = DuplicateHandle(processHandle, (HANDLE)handle.Handle, GetCurrentProcess(), &realHandle, 0, TRUE, DUPLICATE_CLOSE_SOURCE);  
    
             if(!ret)  
                   printf("DuplicateHandle Problem!");  
    
             if (!CloseHandle(realHandle))  
        {  
          printf("Problem closing the copied handle");  
        }  
        printf("", realHandle);  
      }  
    

    【讨论】:

    • 显然,如果DuplicateHandle() 失败,不要调用CloseHandle(),因为没有什么可以关闭。并且您的最后一个 printf() 没有输出任何内容,因为没有提供格式说明符。
    猜你喜欢
    • 2012-01-31
    • 1970-01-01
    • 1970-01-01
    • 2011-10-12
    • 1970-01-01
    • 2023-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多