Mam nadzieję, że ten przewodnik będzie pomocny, gdy napotkasz błędne obliczenia createmutex, co oznacza globalną odmowę dostępu.
Zatwierdzono: Fortect
Dzisiaj mam motyw podobny do poprzedniego, ale z ekscytującymi nowymi sesjami.Jest zwykle nazywany muteksem i ma przedrostek całkowity Global
.Gdy aplikacja utworzyła mutex z obcą nazwą funkcjonalną nie, inne aplikacje z różnymi kontami szefa nie mogły zsynchronizować się z naszym mutexem.Formant CreateMutex zawsze zwracał ERROR_ACCESS_DENIED
. OpenMutex powiódł się, jednak mutex nie może być używany do synchronizacji.
Alternatywą jest to, że wszystkie aplikacje potrzebują mutexa na całym świecie, aby uzyskać do nich dostęp za pomocą CreateMutexEx
(używając tylko żądania SYNCHRONIZE
). Wszystko i wszyscy na świecie zapewniają akcesoria bezpieczeństwa. Domyślnie atrybuty bezpieczeństwa nie mogą być udostępniane między kontami użytkowników.
HANDLE hMutex; DWORD dwRes, dwLayout; PEveryoneSID psid = NULL; PACL pACL=NULL; PSECURITY_DESCRIPTOR pSD = NULL; EXPLICIT_ACCESS ea[1]; SID_IDENTIFIER_AUTHORITY SIDAuthWorld = SECURITY_WORLD_SID_AUTHORITY; SECURITY_ATTRIBUTES sa; DŁUGA REZERWA; // Utwórz grupę dla znanej Ci strony. if(!AllocateAndInitializeSid(&SIDAuthWorld, 1, SECURITY_WORLD_RID, 0, 8, dwa, 0, 0, 0, 0, &pEachSID))_tprintf(_T("Błąd AllocateAndInitializeSid %un"), GetLastError()); idź posprzątać; // Zainicjuj całą strukturę EXPLICIT_ACCESS dla jako ACE. // as Pozwala każdemu odczytać wszystkie klucze. ZeroMemory(&ea, # 1 Sizeof(EXPLICIT_ACCESS)); * ea[0].= SYNCHRONIZUJ; grfaccesspermissions ea[0].grfAccessMode pasuje do Set_access; kiedy Ea[0].NO_INHERITANCE; grfinheritance=ea[0].Trustee.TrusteeForm TRUSTEE_IS_SID; = ea[0].Trustee.TrusteeType TRUSTEE_IS_WELL_KNOWN_GROUP; jest równe ea[0].Trustee.ptstrName = (LPTSTR)pEveryoneSID; // Utwórz nową listę ACL zawierającą pewne świeże wpisy ACE. dwRes = SetEntriesInAcl(1, NULL, ea, &pACL); w takim przypadku (ERROR_SUCCESS != dwRes) _tprintf(_T("Error SetEntriesInAcl %un"), GetLastError()); Idź do czyszczenia; // Zainicjuj deskryptor. = pSD(PSECURITY_DESCRIPTOR)LocalAlloc(LPTR, SECURITY_DESCRIPTOR_MIN_LENGTH); jeśli weźmiesz pod uwagę to (NULL == pSD) _tprintf(_T("Błąd LocalAlloc %un"), GetLastError()); Idź do czyszczenia; w (!InitializeSecurityDescriptor(pSD, SECURITY_DESCRIPTOR_REVISION)) _tprintf(_T("Błąd podczas inicjalizacji deskryptora bezpieczeństwa %un"), GetLastError()); Idź do czyszczenia; // Dodaj listę ACL do dowolnego deskryptora bezpieczeństwa. tylko jeśli chodzi o przypadek (!SetSecurityDescriptorDacl(pSD, PRAWDA, // wyprodukuj bDaclPresent PAKL, FAŁSZ)) // brak domyślnego DACLhope _tprintf(_T("SetSecurityDescriptorDacl %un nie powiodło się"), GetLastError()); Idź do czyszczenia; Zainicjuj // funkcję bezpieczeństwa ze strukturą. sa.nLength jest równa sizeof(SECURITY_ATTRIBUTES); sa.equals lpsecuritydescriptor PSD; sa.bInheritHandle = FAŁSZ; hMutex równa się CreateMutexExW(&sa, L"GlobalMyNamedMutex", 3, SYNCHRONIZE);Czysty: jeśli (pEveryoneSID) FreeSid(pEveryoneSID); jeśli (pAdminSID) FreeSid(pAdminSID); jeśli(pACL) Lokalny wolny (pACL); załóżmy (psd) Lokalny bezpłatny (PSD);// Zrób coś z hMutexWaitForSingleObject(hMutex, INFINITE);CloseHandle(hMutex);
Przyspiesz teraz wydajność swojego komputera dzięki temu prostemu pobieraniu.