/*++ * @name ObAssignSecurity * @implemented NT4 * * The ObAssignSecurity routine <FILLMEIN> * * @param AccessState * <FILLMEIN> * * @param SecurityDescriptor * <FILLMEIN> * * @param Object * <FILLMEIN> * * @param Type * <FILLMEIN> * * @return STATUS_SUCCESS or appropriate error value. * * @remarks None. * *--*/ NTSTATUS NTAPI ObAssignSecurity(IN PACCESS_STATE AccessState, IN PSECURITY_DESCRIPTOR SecurityDescriptor, IN PVOID Object, IN POBJECT_TYPE Type) { PSECURITY_DESCRIPTOR NewDescriptor; NTSTATUS Status; KIRQL CalloutIrql; PAGED_CODE(); /* Build the new security descriptor */ Status = SeAssignSecurity(SecurityDescriptor, AccessState->SecurityDescriptor, &NewDescriptor, (Type == ObDirectoryType), &AccessState->SubjectSecurityContext, &Type->TypeInfo.GenericMapping, PagedPool); if (!NT_SUCCESS(Status)) return Status; /* Call the security method */ ObpCalloutStart(&CalloutIrql); Status = Type->TypeInfo.SecurityProcedure(Object, AssignSecurityDescriptor, NULL, NewDescriptor, NULL, NULL, PagedPool, &Type->TypeInfo.GenericMapping); ObpCalloutEnd(CalloutIrql, "Security", Type, Object); /* Check for failure and deassign security if so */ if (!NT_SUCCESS(Status)) SeDeassignSecurity(&NewDescriptor); /* Return to caller */ return Status; }
VOID MsDeleteFcb ( IN PFCB Fcb ) /*++ Routine Description: This routine deallocates and removes an FCB from our in-memory data structures. It also will remove all associated underlings. Arguments: Fcb - Supplies the FCB to be removed Return Value: None --*/ { PAGED_CODE(); DebugTrace(+1, Dbg, "MsDeleteFcb, Fcb = %08lx\n", (ULONG)Fcb); // // Release the FCB reference to the VCB. // MsDereferenceVcb( Fcb->Vcb ); ExFreePool( Fcb->FullFileName.Buffer ); // // Free up the data queue. // MsUninitializeDataQueue( &Fcb->DataQueue, Fcb->CreatorProcess ); // // If there is a security descriptor on the mailslot then deassign it // if (Fcb->SecurityDescriptor != NULL) { SeDeassignSecurity( &Fcb->SecurityDescriptor ); } // // Free up the resource variable. // ExDeleteResource( &(Fcb->Resource) ); // // Finally deallocate the FCB record. // ExFreePool( Fcb ); // // Return to the caller // DebugTrace(-1, Dbg, "MsDeleteFcb -> VOID\n", 0); return; }