WINAPI - 关闭互斥锁而不是所有者
WINAPI - Close mutex without being the owner
我正在尝试关闭另一个应用程序中的互斥量。
我正在使用 WinAPI ("windows.h")。
这是我关闭此互斥体的代码:
DWORD pid = 0;
hMyWnd = FindWindow(NULL, "TheFamousWindowName");
GetWindowThreadProcessId(hMyWnd, &pid);
HANDLE hProc = OpenProcess(PROCESS_DUP_HANDLE, 0, pid);
HANDLE hMutex = OpenMutex(MUTEX_ALL_ACCESS, false, "TheEvilMutex"); // hMutex isn't null
WaitForSingleObject(hMutex, 10000); // Wait 10 seconds, nothing happens
if (!DuplicateHandle(hProc, hMutex, NULL, 0, 0, false, DUPLICATE_CLOSE_SOURCE)) {
// Arrive always here because of error 288
// And the mutex is still there, not closed
}
ReleaseMutex(hMutex);
CloseHandle(hMutex);
问题是我打电话的时候
DuplicateHandle(hProc, hMutex, NULL, 0, 0, false, DUPLICATE_CLOSE_SOURCE)
我收到错误 288
GetLastError()
标记为 "Attempt to release mutex not owned by caller" 且互斥量未关闭
现在,我知道我不是所有者,但我看不到关闭此互斥锁的解决方案。
我见过一些像 Process Explorer 或 Process Hacker 这样的程序。我在 GitHub 上查看了最后的代码,但没有找到任何关于它如何在不成为所有者的情况下关闭互斥锁的信息。
我也看过这个帖子
how does procexp close a mutex held by another process? 但我无法让它工作。
感谢阅读我的文章。
希望有人能帮助我。
编辑 :
感谢@RbMm,替换
DuplicateHandle(hProc, hMutex, NULL, 0, 0, false, DUPLICATE_CLOSE_SOURCE)
和
DuplicateHandle((HANDLE)-1, hMutex, NULL, 0, 0, false, DUPLICATE_CLOSE_SOURCE)
已解决错误 288,但互斥量并未因此而关闭。
in call DuplicateHandle(hProc, hMutex, NULL, 0, 0, false, DUPLICATE_CLOSE_SOURCE)
hMutex
必须是在 hProc
上下文中有效的句柄。但是 hMutex
是当前进程中的句柄,而不是 hProc
中的句柄。所以在这行代码中,您尝试在 hProc
的上下文中关闭任意句柄,而不是您的 hMutex
。结果将是任意的。可能是你关闭了一些句柄。可能这个句柄根本不存在,或者句柄被保护不被关闭。
And the mutex is still there, not closed
当然没有关闭,也不能关闭。要关闭它,您需要调用
DuplicateHandle(NtCurrentProcess(), hMutex, NULL, 0, 0, false, DUPLICATE_CLOSE_SOURCE);
because of error 288
我绝对确定 DuplicateHandle
绝不会 return 这个错误。 ERROR_NOT_OWNER
你从 ReleaseMutex(hMutex);
用于关闭 另一个 进程中的互斥量 - 需要在目标进程中使用此互斥量的句柄值,而不是在自身进程中。此代码已完成:
void CloseRemote(ULONG dwProcessId, PCWSTR Name)
{
// create any file
HANDLE hFile = OpenMutex(MAXIMUM_ALLOWED, FALSE, Name);
if (hFile != INVALID_HANDLE_VALUE)
{
if (HANDLE hProcess = OpenProcess(PROCESS_DUP_HANDLE, FALSE, dwProcessId))
{
NTSTATUS status;
ULONG cb = 0x80000;
union {
PSYSTEM_HANDLE_INFORMATION_EX pshi;
PVOID pv;
};
do
{
status = STATUS_INSUFFICIENT_RESOURCES;
if (pv = LocalAlloc(0, cb))
{
if (0 <= (status = ZwQuerySystemInformation(SystemExtendedHandleInformation, pv, cb, &cb)))
{
if (ULONG_PTR NumberOfHandles = pshi->NumberOfHandles)
{
ULONG_PTR UniqueProcessId = GetCurrentProcessId();
PSYSTEM_HANDLE_TABLE_ENTRY_INFO_EX Handles = pshi->Handles;
do
{
// search for created file
if (Handles->UniqueProcessId == UniqueProcessId && Handles->HandleValue == (ULONG_PTR)hFile)
{
// we got it !
PVOID Object = Handles->Object;
NumberOfHandles = pshi->NumberOfHandles, Handles = pshi->Handles;
do
{
if (Object == Handles->Object && Handles->UniqueProcessId == dwProcessId)
{
DuplicateHandle(hProcess, (HANDLE)Handles->HandleValue, 0, 0, 0, 0, DUPLICATE_CLOSE_SOURCE);
}
} while (Handles++, --NumberOfHandles);
break;
}
} while (Handles++, --NumberOfHandles);
}
}
LocalFree(pv);
}
} while (status == STATUS_INFO_LENGTH_MISMATCH);
CloseHandle(hProcess);
}
CloseHandle(hFile);
}
}
我正在尝试关闭另一个应用程序中的互斥量。
我正在使用 WinAPI ("windows.h")。
这是我关闭此互斥体的代码:
DWORD pid = 0;
hMyWnd = FindWindow(NULL, "TheFamousWindowName");
GetWindowThreadProcessId(hMyWnd, &pid);
HANDLE hProc = OpenProcess(PROCESS_DUP_HANDLE, 0, pid);
HANDLE hMutex = OpenMutex(MUTEX_ALL_ACCESS, false, "TheEvilMutex"); // hMutex isn't null
WaitForSingleObject(hMutex, 10000); // Wait 10 seconds, nothing happens
if (!DuplicateHandle(hProc, hMutex, NULL, 0, 0, false, DUPLICATE_CLOSE_SOURCE)) {
// Arrive always here because of error 288
// And the mutex is still there, not closed
}
ReleaseMutex(hMutex);
CloseHandle(hMutex);
问题是我打电话的时候
DuplicateHandle(hProc, hMutex, NULL, 0, 0, false, DUPLICATE_CLOSE_SOURCE)
我收到错误 288
GetLastError()
标记为 "Attempt to release mutex not owned by caller" 且互斥量未关闭
现在,我知道我不是所有者,但我看不到关闭此互斥锁的解决方案。
我见过一些像 Process Explorer 或 Process Hacker 这样的程序。我在 GitHub 上查看了最后的代码,但没有找到任何关于它如何在不成为所有者的情况下关闭互斥锁的信息。
我也看过这个帖子 how does procexp close a mutex held by another process? 但我无法让它工作。
感谢阅读我的文章。 希望有人能帮助我。
编辑 :
感谢@RbMm,替换
DuplicateHandle(hProc, hMutex, NULL, 0, 0, false, DUPLICATE_CLOSE_SOURCE)
和
DuplicateHandle((HANDLE)-1, hMutex, NULL, 0, 0, false, DUPLICATE_CLOSE_SOURCE)
已解决错误 288,但互斥量并未因此而关闭。
in call DuplicateHandle(hProc, hMutex, NULL, 0, 0, false, DUPLICATE_CLOSE_SOURCE)
hMutex
必须是在 hProc
上下文中有效的句柄。但是 hMutex
是当前进程中的句柄,而不是 hProc
中的句柄。所以在这行代码中,您尝试在 hProc
的上下文中关闭任意句柄,而不是您的 hMutex
。结果将是任意的。可能是你关闭了一些句柄。可能这个句柄根本不存在,或者句柄被保护不被关闭。
And the mutex is still there, not closed
当然没有关闭,也不能关闭。要关闭它,您需要调用
DuplicateHandle(NtCurrentProcess(), hMutex, NULL, 0, 0, false, DUPLICATE_CLOSE_SOURCE);
because of error 288
我绝对确定 DuplicateHandle
绝不会 return 这个错误。 ERROR_NOT_OWNER
你从 ReleaseMutex(hMutex);
用于关闭 另一个 进程中的互斥量 - 需要在目标进程中使用此互斥量的句柄值,而不是在自身进程中。此代码已完成:
void CloseRemote(ULONG dwProcessId, PCWSTR Name)
{
// create any file
HANDLE hFile = OpenMutex(MAXIMUM_ALLOWED, FALSE, Name);
if (hFile != INVALID_HANDLE_VALUE)
{
if (HANDLE hProcess = OpenProcess(PROCESS_DUP_HANDLE, FALSE, dwProcessId))
{
NTSTATUS status;
ULONG cb = 0x80000;
union {
PSYSTEM_HANDLE_INFORMATION_EX pshi;
PVOID pv;
};
do
{
status = STATUS_INSUFFICIENT_RESOURCES;
if (pv = LocalAlloc(0, cb))
{
if (0 <= (status = ZwQuerySystemInformation(SystemExtendedHandleInformation, pv, cb, &cb)))
{
if (ULONG_PTR NumberOfHandles = pshi->NumberOfHandles)
{
ULONG_PTR UniqueProcessId = GetCurrentProcessId();
PSYSTEM_HANDLE_TABLE_ENTRY_INFO_EX Handles = pshi->Handles;
do
{
// search for created file
if (Handles->UniqueProcessId == UniqueProcessId && Handles->HandleValue == (ULONG_PTR)hFile)
{
// we got it !
PVOID Object = Handles->Object;
NumberOfHandles = pshi->NumberOfHandles, Handles = pshi->Handles;
do
{
if (Object == Handles->Object && Handles->UniqueProcessId == dwProcessId)
{
DuplicateHandle(hProcess, (HANDLE)Handles->HandleValue, 0, 0, 0, 0, DUPLICATE_CLOSE_SOURCE);
}
} while (Handles++, --NumberOfHandles);
break;
}
} while (Handles++, --NumberOfHandles);
}
}
LocalFree(pv);
}
} while (status == STATUS_INFO_LENGTH_MISMATCH);
CloseHandle(hProcess);
}
CloseHandle(hFile);
}
}