22 "IRP_MJ_CREATE_NAMED_PIPE",
26 "IRP_MJ_QUERY_INFORMATION",
27 "IRP_MJ_SET_INFORMATION",
30 "IRP_MJ_FLUSH_BUFFERS",
31 "IRP_MJ_QUERY_VOLUME_INFORMATION",
32 "IRP_MJ_SET_VOLUME_INFORMATION",
33 "IRP_MJ_DIRECTORY_CONTROL",
34 "IRP_MJ_FILE_SYSTEM_CONTROL",
35 "IRP_MJ_DEVICE_CONTROL",
36 "IRP_MJ_INTERNAL_DEVICE_CONTROL",
38 "IRP_MJ_LOCK_CONTROL",
40 "IRP_MJ_CREATE_MAILSLOT",
41 "IRP_MJ_QUERY_SECURITY",
42 "IRP_MJ_SET_SECURITY",
44 "IRP_MJ_SYSTEM_CONTROL",
45 "IRP_MJ_DEVICE_CHANGE",
49 "IRP_MJ_MAXIMUM_FUNCTION" 68 DPRINT(
"VfatLockControl(IrpContext %p)\n", IrpContext);
100 return IoCallDriver(IrpContext->DeviceExt->StorageDevice, IrpContext->Irp);
111 DPRINT(
"VfatDispatchRequest (IrpContext %p), is called for %s\n", IrpContext,
118 switch (IrpContext->MajorFunction)
181 DPRINT1(
"Unexpected major function %x\n", IrpContext->MajorFunction);
185 if (IrpContext !=
NULL)
196 IrpContext->Irp->IoStatus.Status =
Status;
243 if (IrpContext ==
NULL)
355 DPRINT(
"VfatDoRequest(IrpContext %p), MajorFunction %x, %d\n",
361 if (DeviceExt !=
NULL)
364 if (DeviceExt->OverflowQueueCount != 0)
369 DeviceExt->OverflowQueueCount--;
370 DPRINT(
"Processing overflow item for IRP %p context %p (%lu)\n",
371 IrpContext->
Irp, IrpContext, DeviceExt->OverflowQueueCount);
376 DeviceExt->PostedRequestCount--;
380 }
while (IrpContext !=
NULL);
382 if (DeviceExt !=
NULL)
418 if (DeviceExt->PostedRequestCount > 2)
420 DeviceExt->OverflowQueueCount++;
421 DPRINT(
"Queue overflow. Adding IRP %p context %p to overflow queue (%lu)\n",
422 IrpContext->
Irp, IrpContext, DeviceExt->OverflowQueueCount);
429 DeviceExt->PostedRequestCount++;
456 return Irp->UserBuffer;
475 if (!
Irp->MdlAddress)
505 DPRINT1(
"VfatCheckForDismount(%p, %u)\n", DeviceExt,
Force);
529 Vpb = DeviceExt->IoVPB;
530 DPRINT(
"Vpb->ReferenceCount = %d\n",
Vpb->ReferenceCount);
531 if (
Vpb->ReferenceCount != UnCleanCount || DeviceExt->OpenHandleCount != 0)
538 DeviceExt->SpareVPB->Size =
sizeof(
VPB);
539 DeviceExt->SpareVPB->RealDevice = DeviceExt->IoVPB->RealDevice;
540 DeviceExt->SpareVPB->DeviceObject =
NULL;
542 DeviceExt->IoVPB->RealDevice->Vpb = DeviceExt->SpareVPB;
543 DeviceExt->SpareVPB =
NULL;
559 if (
Vpb->RealDevice->
Vpb ==
Vpb && DeviceExt->SpareVPB !=
NULL)
563 DeviceExt->SpareVPB->Size =
sizeof(
VPB);
564 DeviceExt->SpareVPB->RealDevice = DeviceExt->IoVPB->RealDevice;
565 DeviceExt->SpareVPB->DeviceObject =
NULL;
567 DeviceExt->IoVPB->RealDevice->Vpb = DeviceExt->SpareVPB;
568 DeviceExt->SpareVPB =
NULL;
597 if (DeviceExt->RootFcb)
599 Fcb = DeviceExt->RootFcb;
604 DeviceExt->RootFcb =
NULL;
607 if (DeviceExt->VolumeFcb)
609 Fcb = DeviceExt->VolumeFcb;
610 #ifndef VOLUME_IS_NOT_CACHED_WORK_AROUND_IT 616 DeviceExt->VolumeFcb =
NULL;
619 if (DeviceExt->FATFileObject)
621 Fcb = DeviceExt->FATFileObject->FsContext;
625 DeviceExt->FATFileObject->FsContext =
NULL;
627 DeviceExt->FATFileObject =
NULL;
631 ASSERT(DeviceExt->OverflowQueueCount == 0);
633 ASSERT(DeviceExt->PostedRequestCount == 0);
644 if (DeviceExt->SpareVPB)
649 else if (DeviceExt->IoVPB->ReferenceCount == 0)
NTSTATUS VfatCreate(PVFAT_IRP_CONTEXT IrpContext)
_Must_inspect_result_ typedef _In_ PVOID Unused
const char * MajorFunctionNames[]
VOID NTAPI ExQueueWorkItem(IN PWORK_QUEUE_ITEM WorkItem, IN WORK_QUEUE_TYPE QueueType)
#define STATUS_INSUFFICIENT_RESOURCES
_In_ ULONG _In_ ULONG _In_ ULONG Length
#define FsRtlEnterFileSystem
#define IRP_MJ_FLUSH_BUFFERS
#define FsRtlExitFileSystem
#define IRPCONTEXT_COMPLETE
PDEVICE_EXTENSION DeviceExt
static NTSTATUS VfatDeviceControl(IN PVFAT_IRP_CONTEXT IrpContext)
#define STATUS_INVALID_PARAMETER
#define BooleanFlagOn(F, SF)
static PVFAT_IRP_CONTEXT VfatAllocateIrpContext(PDEVICE_OBJECT, PIRP)
NTSTATUS VfatCleanup(PVFAT_IRP_CONTEXT IrpContext)
#define IRP_MJ_MAXIMUM_FUNCTION
VOID NTAPI KeAcquireSpinLock(PKSPIN_LOCK SpinLock, PKIRQL OldIrql)
NTSTATUS VfatQueryVolumeInformation(PVFAT_IRP_CONTEXT IrpContext)
#define IRP_MJ_SET_VOLUME_INFORMATION
static VOID VfatFreeIrpContext(PVFAT_IRP_CONTEXT)
NTSTATUS NTAPI VfatBuildRequest(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
NTSTATUS NTAPI ExDeleteResourceLite(IN PERESOURCE Resource)
FORCEINLINE BOOLEAN vfatFCBIsDirectory(PVFATFCB FCB)
#define STATUS_INVALID_DEVICE_REQUEST
VOID NTAPI IoAcquireVpbSpinLock(OUT PKIRQL Irql)
static WORKER_THREAD_ROUTINE VfatDoRequest
BOOLEAN NTAPI IoIsOperationSynchronous(IN PIRP Irp)
#define InsertTailList(ListHead, Entry)
NPAGED_LOOKASIDE_LIST IrpContextLookasideList
#define MmGetSystemAddressForMdlSafe(_Mdl, _Priority)
_Must_inspect_result_ FORCEINLINE BOOLEAN IsListEmpty(_In_ const LIST_ENTRY *ListHead)
VOID CompleteIrp(IN PIRP Irp, IN NTSTATUS Status, IN ULONG_PTR Information)
FORCEINLINE BOOLEAN RemoveEntryList(_In_ PLIST_ENTRY Entry)
BOOLEAN NTAPI ExAcquireResourceExclusiveLite(IN PERESOURCE Resource, IN BOOLEAN Wait)
_In_ PDEVICE_OBJECT DeviceObject
static NTSTATUS VfatQueueRequest(PVFAT_IRP_CONTEXT)
NTSTATUS VfatSetInformation(PVFAT_IRP_CONTEXT IrpContext)
NTSTATUS(* NTAPI)(IN PFILE_FULL_EA_INFORMATION EaBuffer, IN ULONG EaLength, OUT PULONG ErrorOffset)
NTSTATUS VfatQueryInformation(PVFAT_IRP_CONTEXT IrpContext)
#define IRPCONTEXT_CANWAIT
static NTSTATUS VfatDispatchRequest(IN PVFAT_IRP_CONTEXT IrpContext)
#define IoCompleteRequest
FORCEINLINE PLIST_ENTRY RemoveHeadList(_Inout_ PLIST_ENTRY ListHead)
PVOID VfatGetUserBuffer(IN PIRP Irp, IN BOOLEAN Paging)
#define IRP_MJ_QUERY_VOLUME_INFORMATION
#define IRP_MJ_DIRECTORY_CONTROL
#define VPB_REMOVE_PENDING
PFLT_MESSAGE_WAITER_QUEUE CONTAINING_RECORD(Csq, DEVICE_EXTENSION, IrpQueue)) -> WaiterQ.mLock) _IRQL_raises_(DISPATCH_LEVEL) VOID NTAPI FltpAcquireMessageWaiterLock(_In_ PIO_CSQ Csq, _Out_ PKIRQL Irql)
_In_ WDFREQUEST _In_ WDFFILEOBJECT FileObject
PDEVICE_OBJECT DeviceObject
#define ExInitializeWorkItem(Item, Routine, Context)
#define EXCEPTION_EXECUTE_HANDLER
#define IRP_MJ_FILE_SYSTEM_CONTROL
#define ObDereferenceObject
NTSTATUS VfatClose(PVFAT_IRP_CONTEXT IrpContext)
PDEVICE_OBJECT DeviceObject
VOID vfatDestroyFCB(PVFATFCB pFCB)
VOID FASTCALL ExReleaseResourceLite(IN PERESOURCE Resource)
VOID NTAPI IoFreeMdl(PMDL Mdl)
#define STATUS_DRIVER_INTERNAL_ERROR
static NTSTATUS VfatLockControl(IN PVFAT_IRP_CONTEXT IrpContext)
#define InterlockedDecrement
_Requires_lock_held_ Interrupt _Releases_lock_ Interrupt _In_ _IRQL_restores_ KIRQL OldIrql
NTSTATUS VfatFlush(PVFAT_IRP_CONTEXT IrpContext)
NTSTATUS VfatSetVolumeInformation(PVFAT_IRP_CONTEXT IrpContext)
BOOLEAN VfatCheckForDismount(IN PDEVICE_EXTENSION DeviceExt, IN BOOLEAN Force)
NTSTATUS VfatFileSystemControl(PVFAT_IRP_CONTEXT IrpContext)
ClearFlag(Dirent->Flags, DIRENT_FLAG_NOT_PERSISTENT)
struct _VFATFCB * PVFATFCB
NTSTATUS NTAPI FsRtlProcessFileLock(IN PFILE_LOCK FileLock, IN PIRP Irp, IN PVOID Context OPTIONAL)
PMDL NTAPI IoAllocateMdl(IN PVOID VirtualAddress, IN ULONG Length, IN BOOLEAN SecondaryBuffer, IN BOOLEAN ChargeQuota, IN PIRP Irp)
PVFAT_GLOBAL_DATA VfatGlobalData
NTSTATUS VfatDirectoryControl(PVFAT_IRP_CONTEXT IrpContext)
__drv_aliasesMem FORCEINLINE PIO_STACK_LOCATION IoGetCurrentIrpStackLocation(_In_ PIRP Irp)
VOID NTAPI IoDeleteDevice(IN PDEVICE_OBJECT DeviceObject)
#define KeInitializeEvent(pEvt, foo, foo2)
#define InterlockedIncrement
NTSTATUS VfatPnp(PVFAT_IRP_CONTEXT IrpContext)
VOID NTAPI MmProbeAndLockPages(IN PMDL Mdl, IN KPROCESSOR_MODE AccessMode, IN LOCK_OPERATION Operation)
enum _LOCK_OPERATION LOCK_OPERATION
NTSTATUS VfatRead(PVFAT_IRP_CONTEXT IrpContext)
BOOLEAN NTAPI CcUninitializeCacheMap(IN PFILE_OBJECT FileObject, IN OPTIONAL PLARGE_INTEGER TruncateSize, IN OPTIONAL PCACHE_UNINITIALIZE_EVENT UninitializeEvent)
PDEVICE_OBJECT DeviceObject
NTSTATUS NTAPI IoCallDriver(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
#define KeReleaseSpinLock(sl, irql)
#define IoSkipCurrentIrpStackLocation(Irp)
#define IRP_MJ_LOCK_CONTROL
IN PVCB IN VBO IN ULONG OUT PBCB OUT PVOID IN BOOLEAN IN BOOLEAN Zero
struct tagContext Context
#define ObReferenceObject
VOID NTAPI VfatHandleDeferredWrite(IN PVOID IrpContext, IN PVOID Unused)
#define IRP_MJ_SET_INFORMATION
#define RtlZeroMemory(Destination, Length)
_In_ FLT_SET_CONTEXT_OPERATION Operation
#define IRP_MJ_QUERY_INFORMATION
VOID NTAPI FsRtlNotifyUninitializeSync(IN PNOTIFY_SYNC *NotifySync)
#define _SEH2_EXCEPT(...)
#define _SEH2_GetExceptionCode()
#define _SEH2_YIELD(__stmt)
NTSTATUS VfatLockUserBuffer(IN PIRP Irp, IN ULONG Length, IN LOCK_OPERATION Operation)
#define ExFreePoolWithTag(_P, _T)
BOOL Delete(LPCTSTR ServiceName)
NTSTATUS VfatWrite(PVFAT_IRP_CONTEXT *pIrpContext)
VOID NTAPI IoReleaseVpbSpinLock(IN KIRQL Irql)
IN OUT PVCB IN PDEVICE_OBJECT IN PVPB Vpb
WORK_QUEUE_ITEM WorkQueueItem
#define IRP_MJ_DEVICE_CONTROL
_Inout_ PVCB _In_ BOOLEAN Force