GENERIC_MAPPING ExpMutantMapping =
{
- STANDARD_RIGHTS_READ | SYNCHRONIZE | MUTANT_QUERY_STATE,
- STANDARD_RIGHTS_WRITE | SYNCHRONIZE,
- STANDARD_RIGHTS_EXECUTE | SYNCHRONIZE | MUTANT_QUERY_STATE,
+ STANDARD_RIGHTS_READ | MUTANT_QUERY_STATE,
+ STANDARD_RIGHTS_WRITE,
+ STANDARD_RIGHTS_EXECUTE | SYNCHRONIZE,
MUTANT_ALL_ACCESS
};
FALSE);
}
-VOID
+BOOLEAN
INIT_FUNCTION
NTAPI
ExpInitializeMutantImplementation(VOID)
{
OBJECT_TYPE_INITIALIZER ObjectTypeInitializer;
UNICODE_STRING Name;
+ NTSTATUS Status;
DPRINT("Creating Mutant Object Type\n");
/* Create the Event Pair Object Type */
ObjectTypeInitializer.PoolType = NonPagedPool;
ObjectTypeInitializer.DeleteProcedure = ExpDeleteMutant;
ObjectTypeInitializer.ValidAccessMask = MUTANT_ALL_ACCESS;
- ObCreateObjectType(&Name, &ObjectTypeInitializer, NULL, &ExMutantObjectType);
+ ObjectTypeInitializer.InvalidAttributes = OBJ_OPENLINK;
+ Status = ObCreateObjectType(&Name, &ObjectTypeInitializer, NULL, &ExMutantObjectType);
+ if (!NT_SUCCESS(Status)) return FALSE;
+ return TRUE;
}
/*
/* Check for success */
if(NT_SUCCESS(Status))
{
- /* Initalize the Kernel Mutant */
+ /* Initialize the Kernel Mutant */
DPRINT("Initializing the Mutant\n");
KeInitializeMutant(Mutant, InitialOwner);
/* Open the Object */
Status = ObReferenceObjectByHandle(MutantHandle,
- MUTANT_QUERY_STATE,
+ 0, /* No access rights required */
ExMutantObjectType,
PreviousMode,
(PVOID*)&Mutant,