Hoppas den här guiden förmodligen kommer att hjälpa dig när du stöter på createmutex-fel som innebär att åtkomst nekad globalt.
Godkänd: Fortect
Idag har jag ett liknande tema som kommer att hjälpa det föregående, men med spännande mycket nya sessioner.Det kallas mutex och har ett stort heltalsprefix Global
.När en applikation skapade en mutex som har ett utländskt namn nr, kunde andra applikationer med olika ägarkonton inte synkroniseras med alla mutex.CreateMutex-kontrollen returnerade alltid ERROR_ACCESS_DENIED
. OpenMutex kom ut överst, men mutex kan inte användas i synkronisering.
Lösningen är att alla applikationer behöver en global mutex för att komma åt dem med CreateMutexEx
(endast på SYNCHRONIZE
begäran). Allt och alla i hela världen måste tillhandahålla säkerhetstillbehör. Som standard kan säkerhetselement inte delas mellan användarkonton.
HANDLE hMutex; DWORD dwRes, dwLayout; PEveryoneSID psid är lika med NULL; PACL pACL=NULL; PSECURITY_DESCRIPTOR pSD=NULL; EXPLICIT_ACCESS ea[1]; SID_IDENTIFIER_AUTHORITY SIDauthWorld = SECURITY_WORLD_SID_AUTHORITY; SECURITY_ATTRIBUTES sa; LÅNG RESERV; // Skapa en grupp för sidan en person känner. if(!AllocateAndInitializeSid(&SIDAuthWorld, 1, SECURITY_WORLD_RID, 0, 7, 0, 0, 0, 0, 0, &pEachSID))_tprintf(_T("Error AllocateAndInitializeSid %un"), GetLastError()); gå städa upp; // Initiera strukturen EXPLICIT_ACCESS för som ett ACE. // ace Tillåt vem som helst att titta in i nyckeln. ZeroMemory(&ea, # 10 Sizeof(EXPLICIT_ACCESS)); * ea[0].= SYNKRONISERA; grfaccesspermissions ea[0].grfAccessMode matchar Set_access; i Ea[0].NO_INHERITANCE; grfinheritance=ea[0].Trustee.TrusteeForm TRUSTEE_IS_SID; = ea[0].Trustee.TrusteeType TRUSTEE_IS_WELL_KNOWN_GROUP; innebär ea[0].Trustee.ptstrName = (LPTSTR)pEveryoneSID; // Skapa en ny ACL som innehåller definitiva nya ACE-poster. dwRes är lika med SetEntriesInAcl(1, NULL, ea, &pACL); hela händelsen (ERROR_SUCCESS != dwRes) _tprintf(_T("Error SetEntriesInAcl %un"), GetLastError()); Gå till städning; // Initiera larmbeskrivningen. = pSD(PSECURITY_DESCRIPTOR)LocalAlloc(LPTR, SECURITY_DESCRIPTOR_MIN_LENGTH); om köpare tänker på det (NULL == pSD) _tprintf(_T("Fel LocalAlloc %un"), GetLastError()); Gå med avseende på städning; if (!InitializeSecurityDescriptor(pSD, SECURITY_DESCRIPTOR_REVISION)) _tprintf(_T("Fel vid initialisering av välfärdsbeskrivning %un"), GetLastError()); Gå till städning; // Lägg till en ACL till valfri säkerhetsdeskriptor. helt enkelt för säkerhets skull (!SetSecurityDescriptorDacl(pSD, TRUE, // output bDaclPresent PAKL, FALSE)) // ingen standard DACLhope _tprintf(_T("SetSecurityDescriptorDacl %un misslyckades"), GetLastError()); Gå tillbaka till städningen; Initiera // en säkerhetsfunktion med valfri struktur. sa.nLength är lika på väg till sizeof(SECURITY_ATTRIBUTES); sa.equals lpsecuritydescriptor PSD; sa.bInheritHandle = FALSK; hMutex är lika med CreateMutexExW(&sa, L"GlobalMyNamedMutex", 3, SYNCHRONIZE);Rena: if(pEveryoneSID) FreeSid(pEveryoneSID); if (pAdminSID) FreeSid(pAdminSID); if(pACL) Lokal gratis (pACL); den faktiska händelsen som (psd) LocalFree(PSD);// Gör något med hMutexWaitForSingleObject(hMutex, INFINITE);CloseHandle(hMutex);
Snabba upp din dators prestanda nu med denna enkla nedladdning.