NTSTATUS NtfsFsdLockControl ( IN PVOLUME_DEVICE_OBJECT VolumeDeviceObject, IN PIRP Irp ) /*++ Routine Description: This routine implements the FSD part of Lock Control. Arguments: VolumeDeviceObject - Supplies the volume device object where the file exists Irp - Supplies the Irp being processed Return Value: NTSTATUS - The FSD status for the IRP --*/ { TOP_LEVEL_CONTEXT TopLevelContext; PTOP_LEVEL_CONTEXT ThreadTopLevelContext; NTSTATUS Status = STATUS_SUCCESS; PIRP_CONTEXT IrpContext = NULL; ASSERT_IRP( Irp ); UNREFERENCED_PARAMETER( VolumeDeviceObject ); PAGED_CODE(); DebugTrace( +1, Dbg, ("NtfsFsdLockControl\n") ); // // Call the common Lock Control routine // FsRtlEnterFileSystem(); ThreadTopLevelContext = NtfsSetTopLevelIrp( &TopLevelContext, FALSE, FALSE ); do { try { // // We are either initiating this request or retrying it. // if (IrpContext == NULL) { IrpContext = NtfsCreateIrpContext( Irp, CanFsdWait( Irp ) ); NtfsUpdateIrpContextWithTopLevel( IrpContext, ThreadTopLevelContext ); } else if (Status == STATUS_LOG_FILE_FULL) { NtfsCheckpointForLogFileFull( IrpContext ); } Status = NtfsCommonLockControl( IrpContext, Irp ); break; } except(NtfsExceptionFilter( IrpContext, GetExceptionInformation() )) { // // We had some trouble trying to perform the requested // operation, so we'll abort the I/O request with // the error status that we get back from the // execption code // Status = NtfsProcessException( IrpContext, Irp, GetExceptionCode() ); } } while (Status == STATUS_CANT_WAIT || Status == STATUS_LOG_FILE_FULL); if (ThreadTopLevelContext == &TopLevelContext) { NtfsRestoreTopLevelIrp( ThreadTopLevelContext ); } FsRtlExitFileSystem(); // // And return to our caller // DebugTrace( -1, Dbg, ("NtfsFsdLockControl -> %08lx\n", Status) ); return Status; }
VOID NtfsLoadAddOns ( IN PDRIVER_OBJECT DriverObject, IN PVOID Context, IN ULONG Count ) /*++ Routine Description: This routine attempts to load any NTFS add-ons and notify them about any previously mounted volumes. Arguments: DriverObject - Driver object for NTFS Context - Unused, required by I/O system. Count - Unused, required by I/O system. Return Value: None. --*/ { NTSTATUS Status; UNICODE_STRING UnicodeString; ULONG i; WCHAR Buffer[80]; TOP_LEVEL_CONTEXT TopLevelContext; PTOP_LEVEL_CONTEXT ThreadTopLevelContext; IRP_CONTEXT LocalIrpContext; IRP LocalIrp; PIRP_CONTEXT IrpContext; PLIST_ENTRY Links; PVCB Vcb; PVCB VcbForTearDown = NULL; BOOLEAN AcquiredGlobal = FALSE; PAGED_CODE(); UNREFERENCED_PARAMETER(Context); UNREFERENCED_PARAMETER(Count); UNREFERENCED_PARAMETER(DriverObject); // // For each add-on try to load it. // for (i = 0; NtfsAddonNames[i] != NULL; i++) { wcscpy(Buffer, NTFS_SERVICE_KEY); wcscat(Buffer, NtfsAddonNames[i]); RtlInitUnicodeString( &UnicodeString, Buffer); Status = ZwLoadDriver( &UnicodeString ); #if DBG DbgPrint("NtfsLoadAddOns: Loaded module %ws. Status = 0x%lx\n", Buffer, Status); #endif } RtlZeroMemory( &LocalIrpContext, sizeof(LocalIrpContext) ); RtlZeroMemory( &LocalIrp, sizeof(LocalIrp) ); IrpContext = &LocalIrpContext; IrpContext->NodeTypeCode = NTFS_NTC_IRP_CONTEXT; IrpContext->NodeByteSize = sizeof(IRP_CONTEXT); IrpContext->OriginatingIrp = &LocalIrp; SetFlag(IrpContext->Flags, IRP_CONTEXT_FLAG_WAIT); InitializeListHead( &IrpContext->ExclusiveFcbList ); // // Make sure we don't get any pop-ups // ThreadTopLevelContext = NtfsSetTopLevelIrp( &TopLevelContext, TRUE, FALSE ); ASSERT( ThreadTopLevelContext == &TopLevelContext ); (VOID) ExAcquireResourceShared( &NtfsData.Resource, TRUE ); AcquiredGlobal = TRUE; __try { NtfsUpdateIrpContextWithTopLevel( IrpContext, ThreadTopLevelContext ); __try { for (Links = NtfsData.VcbQueue.Flink; Links != &NtfsData.VcbQueue; Links = Links->Flink) { Vcb = CONTAINING_RECORD(Links, VCB, VcbLinks); IrpContext->Vcb = Vcb; if (FlagOn( Vcb->VcbState, VCB_STATE_VOLUME_MOUNTED )) { Status = CiMountVolume( Vcb, IrpContext); // Bugbug: What should we do if this fails? // BugBug: add call out for views. NtfsCommitCurrentTransaction( IrpContext ); } } } __except(NtfsExceptionFilter( IrpContext, GetExceptionInformation() )) { NOTHING; } } __finally { if (AcquiredGlobal) { ExReleaseResource( &NtfsData.Resource ); } NtfsRestoreTopLevelIrp( ThreadTopLevelContext ); } // // And return to our caller // return; }