21 "IRP_MJ_CREATE_NAMED_PIPE",
25 "IRP_MJ_QUERY_INFORMATION",
26 "IRP_MJ_SET_INFORMATION",
29 "IRP_MJ_FLUSH_BUFFERS",
30 "IRP_MJ_QUERY_VOLUME_INFORMATION",
31 "IRP_MJ_SET_VOLUME_INFORMATION",
32 "IRP_MJ_DIRECTORY_CONTROL",
33 "IRP_MJ_FILE_SYSTEM_CONTROL",
34 "IRP_MJ_DEVICE_CONTROL",
35 "IRP_MJ_INTERNAL_DEVICE_CONTROL",
37 "IRP_MJ_LOCK_CONTROL",
39 "IRP_MJ_CREATE_MAILSLOT",
40 "IRP_MJ_QUERY_SECURITY",
41 "IRP_MJ_SET_SECURITY",
43 "IRP_MJ_SYSTEM_CONTROL",
44 "IRP_MJ_DEVICE_CHANGE",
48 "IRP_MJ_MAXIMUM_FUNCTION"
67 DPRINT(
"VfatLockControl(IrpContext %p)\n", IrpContext);
83 IrpContext->Flags &= ~IRPCONTEXT_COMPLETE;
97 IrpContext->Flags &= ~IRPCONTEXT_COMPLETE;
99 return IoCallDriver(IrpContext->DeviceExt->StorageDevice, IrpContext->Irp);
110 DPRINT(
"VfatDispatchRequest (IrpContext %p), is called for %s\n", IrpContext,
117 switch (IrpContext->MajorFunction)
180 DPRINT1(
"Unexpected major function %x\n", IrpContext->MajorFunction);
184 if (IrpContext !=
NULL)
195 IrpContext->Irp->IoStatus.Status =
Status;
203 IrpContext->Flags &= ~IRPCONTEXT_QUEUE;
242 if (IrpContext ==
NULL)
354 DPRINT(
"VfatDoRequest(IrpContext %p), MajorFunction %x, %d\n",
360 if (DeviceExt !=
NULL)
363 if (DeviceExt->OverflowQueueCount != 0)
368 DeviceExt->OverflowQueueCount--;
369 DPRINT(
"Processing overflow item for IRP %p context %p (%lu)\n",
370 IrpContext->
Irp, IrpContext, DeviceExt->OverflowQueueCount);
375 DeviceExt->PostedRequestCount--;
379 }
while (IrpContext !=
NULL);
381 if (DeviceExt !=
NULL)
417 if (DeviceExt->PostedRequestCount > 2)
419 DeviceExt->OverflowQueueCount++;
420 DPRINT(
"Queue overflow. Adding IRP %p context %p to overflow queue (%lu)\n",
421 IrpContext->
Irp, IrpContext, DeviceExt->OverflowQueueCount);
428 DeviceExt->PostedRequestCount++;
455 return Irp->UserBuffer;
474 if (!
Irp->MdlAddress)
504 DPRINT1(
"VfatCheckForDismount(%p, %u)\n", DeviceExt,
Force);
528 Vpb = DeviceExt->IoVPB;
529 DPRINT(
"Vpb->ReferenceCount = %d\n",
Vpb->ReferenceCount);
530 if (
Vpb->ReferenceCount != UnCleanCount || DeviceExt->OpenHandleCount != 0)
537 DeviceExt->SpareVPB->Size =
sizeof(
VPB);
538 DeviceExt->SpareVPB->RealDevice = DeviceExt->IoVPB->RealDevice;
539 DeviceExt->SpareVPB->DeviceObject =
NULL;
541 DeviceExt->IoVPB->RealDevice->Vpb = DeviceExt->SpareVPB;
542 DeviceExt->SpareVPB =
NULL;
558 if (
Vpb->RealDevice->
Vpb ==
Vpb && DeviceExt->SpareVPB !=
NULL)
562 DeviceExt->SpareVPB->Size =
sizeof(
VPB);
563 DeviceExt->SpareVPB->RealDevice = DeviceExt->IoVPB->RealDevice;
564 DeviceExt->SpareVPB->DeviceObject =
NULL;
566 DeviceExt->IoVPB->RealDevice->Vpb = DeviceExt->SpareVPB;
567 DeviceExt->SpareVPB =
NULL;
596 if (DeviceExt->RootFcb)
598 Fcb = DeviceExt->RootFcb;
603 DeviceExt->RootFcb =
NULL;
606 if (DeviceExt->VolumeFcb)
608 Fcb = DeviceExt->VolumeFcb;
609#ifndef VOLUME_IS_NOT_CACHED_WORK_AROUND_IT
615 DeviceExt->VolumeFcb =
NULL;
618 if (DeviceExt->FATFileObject)
620 Fcb = DeviceExt->FATFileObject->FsContext;
624 DeviceExt->FATFileObject->FsContext =
NULL;
626 DeviceExt->FATFileObject =
NULL;
630 ASSERT(DeviceExt->OverflowQueueCount == 0);
632 ASSERT(DeviceExt->PostedRequestCount == 0);
643 if (DeviceExt->SpareVPB)
648 else if (DeviceExt->IoVPB->ReferenceCount == 0)
#define InterlockedIncrement
#define InterlockedDecrement
BOOL Delete(LPCTSTR ServiceName)
_Inout_ PVCB _In_ BOOLEAN Force
#define IRPCONTEXT_COMPLETE
#define IRPCONTEXT_CANWAIT
NTSTATUS VfatCleanup(PVFAT_IRP_CONTEXT IrpContext)
NTSTATUS VfatClose(PVFAT_IRP_CONTEXT IrpContext)
NTSTATUS VfatCreate(PVFAT_IRP_CONTEXT IrpContext)
NTSTATUS VfatDirectoryControl(PVFAT_IRP_CONTEXT IrpContext)
static VOID VfatFreeIrpContext(PVFAT_IRP_CONTEXT)
const char * MajorFunctionNames[]
static NTSTATUS VfatDeviceControl(IN PVFAT_IRP_CONTEXT IrpContext)
BOOLEAN VfatCheckForDismount(IN PDEVICE_EXTENSION DeviceExt, IN BOOLEAN Force)
static WORKER_THREAD_ROUTINE VfatDoRequest
NTSTATUS VfatLockUserBuffer(IN PIRP Irp, IN ULONG Length, IN LOCK_OPERATION Operation)
static NTSTATUS VfatDispatchRequest(IN PVFAT_IRP_CONTEXT IrpContext)
VOID NTAPI VfatHandleDeferredWrite(IN PVOID IrpContext, IN PVOID Unused)
PVOID VfatGetUserBuffer(IN PIRP Irp, IN BOOLEAN Paging)
static NTSTATUS VfatLockControl(IN PVFAT_IRP_CONTEXT IrpContext)
static NTSTATUS VfatQueueRequest(PVFAT_IRP_CONTEXT)
static PVFAT_IRP_CONTEXT VfatAllocateIrpContext(PDEVICE_OBJECT, PIRP)
NTSTATUS VfatPnp(PVFAT_IRP_CONTEXT IrpContext)
NTSTATUS VfatRead(PVFAT_IRP_CONTEXT IrpContext)
NTSTATUS VfatWrite(PVFAT_IRP_CONTEXT *pIrpContext)
VOID CompleteIrp(IN PIRP Irp, IN NTSTATUS Status, IN ULONG_PTR Information)
#define RemoveEntryList(Entry)
#define InsertTailList(ListHead, Entry)
#define IsListEmpty(ListHead)
#define KeInitializeEvent(pEvt, foo, foo2)
#define KeReleaseSpinLock(sl, irql)
#define KeAcquireSpinLock(sl, irql)
#define ExAcquireResourceExclusiveLite(res, wait)
#define ExDeleteResourceLite(res)
#define RemoveHeadList(ListHead)
#define ClearFlag(_F, _SF)
#define BooleanFlagOn(F, SF)
IN OUT PVCB IN PDEVICE_OBJECT IN PVPB Vpb
IN PVCB IN VBO IN ULONG OUT PBCB OUT PVOID IN BOOLEAN IN BOOLEAN Zero
NTSTATUS NTAPI FsRtlProcessFileLock(IN PFILE_LOCK FileLock, IN PIRP Irp, IN PVOID Context OPTIONAL)
PVFAT_GLOBAL_DATA VfatGlobalData
#define FsRtlEnterFileSystem
#define FsRtlExitFileSystem
BOOLEAN NTAPI CcUninitializeCacheMap(IN PFILE_OBJECT FileObject, IN OPTIONAL PLARGE_INTEGER TruncateSize, IN OPTIONAL PCACHE_UNINITIALIZE_EVENT UninitializeEvent)
#define EXCEPTION_EXECUTE_HANDLER
VOID NTAPI MmProbeAndLockPages(IN PMDL Mdl, IN KPROCESSOR_MODE AccessMode, IN LOCK_OPERATION Operation)
#define ExFreePoolWithTag(_P, _T)
_In_ ULONG _In_ ULONG _In_ ULONG Length
#define VPB_REMOVE_PENDING
#define IoSkipCurrentIrpStackLocation(Irp)
VOID FASTCALL ExReleaseResourceLite(IN PERESOURCE Resource)
VOID NTAPI FsRtlNotifyUninitializeSync(IN PNOTIFY_SYNC *NotifySync)
VOID NTAPI IoDeleteDevice(IN PDEVICE_OBJECT DeviceObject)
#define IoCompleteRequest
BOOLEAN NTAPI IoIsOperationSynchronous(IN PIRP Irp)
VOID NTAPI IoReleaseVpbSpinLock(IN KIRQL Irql)
VOID NTAPI IoAcquireVpbSpinLock(OUT PKIRQL Irql)
#define _SEH2_GetExceptionCode()
#define _SEH2_EXCEPT(...)
#define _SEH2_YIELD(__stmt)
#define IRP_MJ_DIRECTORY_CONTROL
#define IRP_MJ_DEVICE_CONTROL
#define IRP_MJ_QUERY_VOLUME_INFORMATION
#define IRP_MJ_LOCK_CONTROL
#define IRP_MJ_SET_INFORMATION
#define IRP_MJ_QUERY_INFORMATION
NPAGED_LOOKASIDE_LIST IrpContextLookasideList
PDEVICE_OBJECT DeviceObject
PDEVICE_OBJECT DeviceObject
WORK_QUEUE_ITEM WorkQueueItem
PDEVICE_EXTENSION DeviceExt
PDEVICE_OBJECT DeviceObject
#define RtlZeroMemory(Destination, Length)
#define CONTAINING_RECORD(address, type, field)
#define STATUS_INVALID_DEVICE_REQUEST
#define STATUS_DRIVER_INTERNAL_ERROR
#define STATUS_INVALID_PARAMETER
#define STATUS_INSUFFICIENT_RESOURCES
struct _VFATFCB * PVFATFCB
NTSTATUS VfatSetVolumeInformation(PVFAT_IRP_CONTEXT IrpContext)
NTSTATUS VfatQueryVolumeInformation(PVFAT_IRP_CONTEXT IrpContext)
FORCEINLINE BOOLEAN vfatFCBIsDirectory(PVFATFCB FCB)
DRIVER_DISPATCH VfatBuildRequest
VOID vfatDestroyFCB(PVFATFCB pFCB)
NTSTATUS VfatSetInformation(PVFAT_IRP_CONTEXT IrpContext)
NTSTATUS VfatQueryInformation(PVFAT_IRP_CONTEXT IrpContext)
NTSTATUS VfatFlush(PVFAT_IRP_CONTEXT IrpContext)
NTSTATUS VfatFileSystemControl(PVFAT_IRP_CONTEXT IrpContext)
_In_ PDEVICE_OBJECT DeviceObject
_In_ WDFREQUEST _In_ WDFFILEOBJECT FileObject
VOID NTAPI ExQueueWorkItem(IN PWORK_QUEUE_ITEM WorkItem, IN WORK_QUEUE_TYPE QueueType)
#define ExInitializeWorkItem(Item, Routine, Context)
__drv_aliasesMem FORCEINLINE PIO_STACK_LOCATION IoGetCurrentIrpStackLocation(_In_ PIRP Irp)
#define IRP_MJ_FILE_SYSTEM_CONTROL
#define IRP_MJ_SET_VOLUME_INFORMATION
#define IRP_MJ_FLUSH_BUFFERS
#define IRP_MJ_MAXIMUM_FUNCTION
_Requires_lock_held_ Interrupt _Releases_lock_ Interrupt _In_ _IRQL_restores_ KIRQL OldIrql
enum _LOCK_OPERATION LOCK_OPERATION
#define MmGetSystemAddressForMdlSafe(_Mdl, _Priority)
#define ObDereferenceObject
#define ObReferenceObject