Код реализации: Delphi. Есть сторонний процесс который создает mutex. Мне требуется его удалить программно. Рассматривается вариант как с инжектом так и без. Сразу говорю, вот что пробовал: http://www.delphisources.ru/forum/showthread.php?t=28172 http://www.cyberforum.ru/delphi-beginners/thread1639687.html и все возможные исходники что находил в интернете (включая забугор) тоже пробовал. Ничего не заработало! На вас одна надежда, господа.
Это не сработает, мутекс удаляется из системы, только когда закрывается последний хендл к нему. Если не смущает C код, ниже рабочий пример (с закрытием из другого процесса): Code: #include <windows.h> #include <stdlib.h> #include <stdio.h> #include <psapi.h> #include <TlHelp32.h> #include <Subauth.h> #ifndef _WIN64 #pragma comment(lib, "C:\\WinDDK\\7600.16385.1\\lib\\win7\\i386\\ntdll.lib") int __stdcall NtQuerySystemInformation(unsigned long, void*, unsigned long, unsigned long*); int __stdcall NtQueryObject(HANDLE, unsigned long, void*, unsigned long, unsigned long*); #else #pragma comment(lib, "C:\\WinDDK\\7600.16385.1\\lib\\win7\\amd64\\ntdll.lib") #endif #define SystemExtendedHandleInformation 64 #define ObjectNameInformation 1 #define STATUS_INFO_LENGTH_MISMATCH 0xc0000004 #define MUTEX_TO_CLOSE L"MySuperPuperMutex705519" #define PROC_NAME "host.exe" typedef struct { PVOID Object; HANDLE UniqueProcessId; HANDLE HandleValue; ULONG GrantedAccess; USHORT CreatorBackTraceIndex; USHORT ObjectTypeIndex; ULONG HandleAttributes; ULONG Reserved; } SYSTEM_HANDLE_TABLE_ENTRY_INFO_EX; typedef struct { ULONG_PTR HandleCount; ULONG_PTR Reserved; SYSTEM_HANDLE_TABLE_ENTRY_INFO_EX Handles[1]; } SYSTEM_HANDLE_INFORMATION_EX; /////////////////////////////////////////////////////////// DWORD GetProcessIdByName(char* procName) { DWORD id = 0; HANDLE h; PROCESSENTRY32 pe; h = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); pe.dwSize = sizeof(pe); Process32First(h, &pe); do { if(!strcmp(pe.szExeFile, procName)) { id = pe.th32ProcessID; break; } } while(Process32Next(h, &pe)); CloseHandle(h); return id; } /////////////////////////////////////////////////////////// int main() { HANDLE h, hRemote, hLocal; DWORD id, i, len, tmp; char buf[0x800], fub[0x400]; SYSTEM_HANDLE_INFORMATION_EX* mem; UNICODE_STRING* pObjName = (UNICODE_STRING*)buf; PWSTR uPtr; id = GetProcessIdByName(PROC_NAME); if(!id) return -1; hRemote = OpenProcess(PROCESS_DUP_HANDLE, 0, id); if(!hRemote) return -1; len = 0x10000; mem = (SYSTEM_HANDLE_INFORMATION_EX*)malloc(len); for(;;) { i = NtQuerySystemInformation(SystemExtendedHandleInformation, mem, len, &tmp); if(!i) break; if(i != STATUS_INFO_LENGTH_MISMATCH) { free(mem); return -1; } mem = (SYSTEM_HANDLE_INFORMATION_EX*)realloc(mem, len *= 2); } for(i = 0; i < mem->HandleCount; ++i) { if(mem->Handles[i].UniqueProcessId == (HANDLE)id) { if(DuplicateHandle(hRemote, mem->Handles[i].HandleValue, GetCurrentProcess(), &hLocal, 0, 0, 0)) { NtQueryObject(hLocal, ObjectNameInformation, buf, sizeof(buf), &tmp); if(pObjName->Length) { WideCharToMultiByte(CP_ACP, 0, pObjName->Buffer, pObjName->MaximumLength, fub, sizeof(fub), NULL, NULL); puts(fub); uPtr = pObjName->Buffer + pObjName->Length / 2; while(uPtr > pObjName->Buffer && *uPtr != '\\') --uPtr; if(!lstrcmpW(uPtr + 1, MUTEX_TO_CLOSE)) { hLocal = 0; DuplicateHandle(hRemote, mem->Handles[i].HandleValue, GetCurrentProcess(), &hLocal, 0, 0, DUPLICATE_CLOSE_SOURCE); if(hLocal) CloseHandle(hLocal); } } } } } free(mem); }
EEjester, транслировать конкретно этот сишный код на delphi дело 5 минут, чтобы из этого: Code: #ifndef _WIN64 #pragma comment(lib, "C:\\WinDDK\\7600.16385.1\\lib\\win7\\i386\\ntdll.lib") int __stdcall NtQuerySystemInformation(unsigned long, void*, unsigned long, unsigned long*); int __stdcall NtQueryObject(HANDLE, unsigned long, void*, unsigned long, unsigned long*); #else #pragma comment(lib, "C:\\WinDDK\\7600.16385.1\\lib\\win7\\amd64\\ntdll.lib") #endif #define SystemExtendedHandleInformation 64 #define ObjectNameInformation 1 #define STATUS_INFO_LENGTH_MISMATCH 0xc0000004 typedef struct { ULONG_PTR HandleCount; ULONG_PTR Reserved; SYSTEM_HANDLE_TABLE_ENTRY_INFO_EX Handles[1]; } SYSTEM_HANDLE_INFORMATION_EX; получить это: Code: const NTDLL = 'ntdll.dll'; STATUS_SUCCESS = NT_STATUS($00000000); STATUS_INFO_LENGTH_MISMATCH = NT_STATUS($C0000004); ObjectNameInformation = 1; SystemExtendedHandleInformation = 64; type PSystemHandleInformationEx = ^TSystemHandleInformationEx; _SYSTEM_HANDLE_INFORMATION_EX = packed record NumberOfHandles: DWORD; Reserved: DWORD; Information: array [0..0] of TSystemHandleInformation; end; {$EXTERNALSYM _SYSTEM_HANDLE_INFORMATION_EX} TSystemHandleInformationEx = _SYSTEM_HANDLE_INFORMATION_EX; SYSTEM_HANDLE_INFORMATION_EX = _SYSTEM_HANDLE_INFORMATION_EX; {$EXTERNALSYM SYSTEM_HANDLE_INFORMATION_EX} function NtQuerySystemInformation(ASystemInformationClass: DWORD; ASystemInformation: Pointer; ASystemInformationLength: DWORD; AReturnLength:PCardinal): NT_STATUS; stdcall;external NTDLL; function NtQueryObject(ObjectHandle: THandle; ObjectInformationClass: DWORD; ObjectInformation: Pointer; ObjectInformationLength: ULONG; ReturnLength: PDWORD): NT_STATUS; stdcall; external NTDLL; но видимо вам так сильно надо XD