⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 vfat.h

📁 ReactOS是一些高手根据Windows XP的内核编写出的类XP。内核实现机理和API函数调用几乎相同。甚至可以兼容XP的程序。喜欢研究系统内核的人可以看一看。
💻 H
📖 第 1 页 / 共 2 页
字号:
#define ENTRIES_PER_SECTOR (BLOCKSIZE / sizeof(FATDirEntry))

typedef struct __DOSTIME
{
   USHORT Second:5;
   USHORT Minute:6;
   USHORT Hour:5;
}
DOSTIME, *PDOSTIME;

typedef struct __DOSDATE
{
   USHORT Day:5;
   USHORT Month:4;
   USHORT Year:5;
}
DOSDATE, *PDOSDATE;

#define IRPCONTEXT_CANWAIT	    0x0001
#define IRPCONTEXT_PENDINGRETURNED  0x0002

typedef struct
{
   PIRP Irp;
   PDEVICE_OBJECT DeviceObject;
   PDEVICE_EXTENSION DeviceExt;
   ULONG Flags;
   WORK_QUEUE_ITEM WorkQueueItem;
   PIO_STACK_LOCATION Stack;
   UCHAR MajorFunction;
   UCHAR MinorFunction;
   PFILE_OBJECT FileObject;
   ULONG RefCount;
   KEVENT Event;
} VFAT_IRP_CONTEXT, *PVFAT_IRP_CONTEXT;

typedef struct _VFAT_DIRENTRY_CONTEXT
{
  ULONG StartIndex;
  ULONG DirIndex;
  DIR_ENTRY DirEntry;
  UNICODE_STRING LongNameU;
  UNICODE_STRING ShortNameU;
} VFAT_DIRENTRY_CONTEXT, *PVFAT_DIRENTRY_CONTEXT;


/*  ------------------------------------------------------  shutdown.c  */

NTSTATUS STDCALL VfatShutdown (PDEVICE_OBJECT DeviceObject,
                               PIRP Irp);

/*  --------------------------------------------------------  volume.c  */

NTSTATUS VfatQueryVolumeInformation (PVFAT_IRP_CONTEXT IrpContext);

NTSTATUS VfatSetVolumeInformation (PVFAT_IRP_CONTEXT IrpContext);

/*  ------------------------------------------------------  blockdev.c  */

NTSTATUS VfatReadDisk(IN PDEVICE_OBJECT pDeviceObject,
                      IN PLARGE_INTEGER ReadOffset,
                      IN ULONG ReadLength,
                      IN PUCHAR Buffer,
                      IN BOOLEAN Override);

NTSTATUS VfatReadDiskPartial (IN PVFAT_IRP_CONTEXT IrpContext,
			      IN PLARGE_INTEGER ReadOffset,
			      IN ULONG ReadLength,
			      IN ULONG BufferOffset,
			      IN BOOLEAN Wait);

NTSTATUS VfatWriteDiskPartial(IN PVFAT_IRP_CONTEXT IrpContext,
			      IN PLARGE_INTEGER WriteOffset,
			      IN ULONG WriteLength,
			      IN ULONG BufferOffset,
			      IN BOOLEAN Wait);

NTSTATUS VfatBlockDeviceIoControl (IN PDEVICE_OBJECT DeviceObject,
				   IN ULONG CtlCode,
				   IN PVOID InputBuffer,
				   IN ULONG InputBufferSize,
				   IN OUT PVOID OutputBuffer,
				   IN OUT PULONG pOutputBufferSize,
				   IN BOOLEAN Override);

/*  -----------------------------------------------------------  dir.c  */

NTSTATUS VfatDirectoryControl (PVFAT_IRP_CONTEXT);

BOOLEAN FsdDosDateTimeToSystemTime (PDEVICE_EXTENSION DeviceExt,
                                    USHORT DosDate,
                                    USHORT DosTime,
                                    PLARGE_INTEGER SystemTime);

BOOLEAN FsdSystemTimeToDosDateTime (PDEVICE_EXTENSION DeviceExt,
                                    PLARGE_INTEGER SystemTime,
                                    USHORT *pDosDate,
                                    USHORT *pDosTime);

/*  --------------------------------------------------------  create.c  */

NTSTATUS VfatCreate (PVFAT_IRP_CONTEXT IrpContext);

NTSTATUS VfatOpenFile (PDEVICE_EXTENSION DeviceExt,
                       PFILE_OBJECT FileObject,
		       PVFATFCB* parentFcb);

NTSTATUS FindFile (PDEVICE_EXTENSION DeviceExt,
                   PVFATFCB Parent,
                   PUNICODE_STRING FileToFindU,
		   PVFAT_DIRENTRY_CONTEXT DirContext,
		   BOOLEAN First);

VOID vfat8Dot3ToString (PFAT_DIR_ENTRY pEntry,
                        PUNICODE_STRING NameU);

NTSTATUS ReadVolumeLabel(PDEVICE_EXTENSION DeviceExt,
                         PVPB Vpb);

/*  ---------------------------------------------------------  close.c  */

NTSTATUS VfatClose (PVFAT_IRP_CONTEXT IrpContext);

NTSTATUS VfatCloseFile(PDEVICE_EXTENSION DeviceExt,
                       PFILE_OBJECT FileObject);

/*  -------------------------------------------------------  cleanup.c  */

NTSTATUS VfatCleanup (PVFAT_IRP_CONTEXT IrpContext);

/*  ---------------------------------------------------------  fastio.c  */

VOID
VfatInitFastIoRoutines(PFAST_IO_DISPATCH FastIoDispatch);

BOOLEAN NTAPI
VfatAcquireForLazyWrite(IN PVOID Context,
                        IN BOOLEAN Wait);

VOID NTAPI
VfatReleaseFromLazyWrite(IN PVOID Context);

BOOLEAN NTAPI
VfatAcquireForReadAhead(IN PVOID Context,
                        IN BOOLEAN Wait);

VOID NTAPI
VfatReleaseFromReadAhead(IN PVOID Context);

/*  ---------------------------------------------------------  fsctl.c  */

NTSTATUS VfatFileSystemControl (PVFAT_IRP_CONTEXT IrpContext);

/*  ---------------------------------------------------------  finfo.c  */

NTSTATUS VfatQueryInformation (PVFAT_IRP_CONTEXT IrpContext);

NTSTATUS VfatSetInformation (PVFAT_IRP_CONTEXT IrpContext);

NTSTATUS
VfatSetAllocationSizeInformation(PFILE_OBJECT FileObject,
				 PVFATFCB Fcb,
				 PDEVICE_EXTENSION DeviceExt,
				 PLARGE_INTEGER AllocationSize);

/*  ---------------------------------------------------------  iface.c  */

NTSTATUS STDCALL DriverEntry (PDRIVER_OBJECT DriverObject,
                              PUNICODE_STRING RegistryPath);

/*  ---------------------------------------------------------  dirwr.c  */

NTSTATUS VfatAddEntry (PDEVICE_EXTENSION DeviceExt,
		       PUNICODE_STRING PathNameU,
		       PVFATFCB* Fcb,
		       PVFATFCB ParentFcb,
		       ULONG RequestedOptions,
		       UCHAR ReqAttr);

NTSTATUS VfatUpdateEntry (PVFATFCB pFcb);

NTSTATUS VfatDelEntry(PDEVICE_EXTENSION, PVFATFCB);

BOOLEAN
vfatFindDirSpace(PDEVICE_EXTENSION DeviceExt,
                 PVFATFCB pDirFcb,
                 ULONG nbSlots,
                 PULONG start);

/*  --------------------------------------------------------  string.c  */

VOID
vfatSplitPathName(PUNICODE_STRING PathNameU,
		  PUNICODE_STRING DirNameU,
		  PUNICODE_STRING FileNameU);

BOOLEAN vfatIsLongIllegal(WCHAR c);

BOOLEAN wstrcmpjoki (PWSTR s1,
                     PWSTR s2);

/*  -----------------------------------------------------------  fat.c  */

NTSTATUS FAT12GetNextCluster(PDEVICE_EXTENSION DeviceExt,
                             ULONG CurrentCluster,
                             PULONG NextCluster);

NTSTATUS FAT12FindAndMarkAvailableCluster(PDEVICE_EXTENSION DeviceExt,
                                          PULONG Cluster);

NTSTATUS FAT12WriteCluster(PDEVICE_EXTENSION DeviceExt,
                           ULONG ClusterToWrite,
                           ULONG NewValue,
                           PULONG OldValue);

NTSTATUS FAT16GetNextCluster(PDEVICE_EXTENSION DeviceExt,
                             ULONG CurrentCluster,
                             PULONG NextCluster);

NTSTATUS FAT16FindAndMarkAvailableCluster(PDEVICE_EXTENSION DeviceExt,
                                          PULONG Cluster);

NTSTATUS FAT16WriteCluster(PDEVICE_EXTENSION DeviceExt,
                           ULONG ClusterToWrite,
                           ULONG NewValue,
                           PULONG OldValue);

NTSTATUS FAT32GetNextCluster(PDEVICE_EXTENSION DeviceExt,
                             ULONG CurrentCluster,
                             PULONG NextCluster);

NTSTATUS FAT32FindAndMarkAvailableCluster(PDEVICE_EXTENSION DeviceExt,
                                          PULONG Cluster);

NTSTATUS FAT32WriteCluster(PDEVICE_EXTENSION DeviceExt,
                           ULONG ClusterToWrite,
                           ULONG NewValue,
                           PULONG OldValue);

NTSTATUS OffsetToCluster (PDEVICE_EXTENSION DeviceExt,
                          ULONG FirstCluster,
                          ULONG FileOffset,
                          PULONG Cluster,
                          BOOLEAN Extend);

ULONGLONG ClusterToSector (PDEVICE_EXTENSION DeviceExt,
			   ULONG Cluster);

NTSTATUS GetNextCluster (PDEVICE_EXTENSION DeviceExt,
                         ULONG CurrentCluster,
                         PULONG NextCluster);

NTSTATUS GetNextClusterExtend (PDEVICE_EXTENSION DeviceExt,
	                       ULONG CurrentCluster,
	                       PULONG NextCluster);

NTSTATUS CountAvailableClusters (PDEVICE_EXTENSION DeviceExt,
                                 PLARGE_INTEGER Clusters);

NTSTATUS
WriteCluster(PDEVICE_EXTENSION DeviceExt,
	     ULONG ClusterToWrite,
	     ULONG NewValue);

/*  ------------------------------------------------------  direntry.c  */

ULONG  vfatDirEntryGetFirstCluster (PDEVICE_EXTENSION  pDeviceExt,
                                    PDIR_ENTRY  pDirEntry);

BOOLEAN VfatIsDirectoryEmpty(PVFATFCB Fcb);

NTSTATUS FATGetNextDirEntry(PVOID * pContext,
			     PVOID * pPage,
			     IN PVFATFCB pDirFcb,
			     IN PVFAT_DIRENTRY_CONTEXT DirContext,
			     BOOLEAN First);

NTSTATUS FATXGetNextDirEntry(PVOID * pContext,
			     PVOID * pPage,
			     IN PVFATFCB pDirFcb,
			     IN PVFAT_DIRENTRY_CONTEXT DirContext,
			     BOOLEAN First);

/*  -----------------------------------------------------------  fcb.c  */

PVFATFCB vfatNewFCB (PDEVICE_EXTENSION  pVCB,
                        PUNICODE_STRING pFileNameU);

VOID vfatDestroyFCB (PVFATFCB  pFCB);

VOID vfatDestroyCCB(PVFATCCB pCcb);

VOID vfatGrabFCB (PDEVICE_EXTENSION  pVCB,
                  PVFATFCB  pFCB);

VOID vfatReleaseFCB (PDEVICE_EXTENSION  pVCB,
                     PVFATFCB  pFCB);

VOID vfatAddFCBToTable (PDEVICE_EXTENSION  pVCB,
                        PVFATFCB  pFCB);

PVFATFCB vfatGrabFCBFromTable (PDEVICE_EXTENSION  pDeviceExt,
                               PUNICODE_STRING  pFileNameU);

PVFATFCB vfatMakeRootFCB (PDEVICE_EXTENSION  pVCB);

PVFATFCB vfatOpenRootFCB (PDEVICE_EXTENSION  pVCB);

BOOLEAN vfatFCBIsDirectory (PVFATFCB FCB);

BOOLEAN vfatFCBIsRoot(PVFATFCB FCB);

NTSTATUS vfatAttachFCBToFileObject (PDEVICE_EXTENSION  vcb,
                                    PVFATFCB  fcb,
                                    PFILE_OBJECT  fileObject);

NTSTATUS vfatDirFindFile (PDEVICE_EXTENSION  pVCB,
                          PVFATFCB  parentFCB,
                          PUNICODE_STRING FileToFindU,
                          PVFATFCB * fileFCB);

NTSTATUS vfatGetFCBForFile (PDEVICE_EXTENSION  pVCB,
                            PVFATFCB  *pParentFCB,
                            PVFATFCB  *pFCB,
                            PUNICODE_STRING pFileNameU);

NTSTATUS vfatMakeFCBFromDirEntry (PVCB  vcb,
                                  PVFATFCB  directoryFCB,
				  PVFAT_DIRENTRY_CONTEXT DirContext,
                                  PVFATFCB * fileFCB);

/*  ------------------------------------------------------------  rw.c  */

NTSTATUS VfatRead (PVFAT_IRP_CONTEXT IrpContext);

NTSTATUS VfatWrite (PVFAT_IRP_CONTEXT IrpContext);

NTSTATUS NextCluster(PDEVICE_EXTENSION DeviceExt,
                     ULONG FirstCluster,
                     PULONG CurrentCluster,
                     BOOLEAN Extend);

/*  -----------------------------------------------------------  misc.c  */

NTSTATUS VfatQueueRequest(PVFAT_IRP_CONTEXT IrpContext);

PVFAT_IRP_CONTEXT VfatAllocateIrpContext(PDEVICE_OBJECT DeviceObject,
                                         PIRP Irp);

VOID VfatFreeIrpContext(PVFAT_IRP_CONTEXT IrpContext);

NTSTATUS STDCALL VfatBuildRequest (PDEVICE_OBJECT DeviceObject,
                                   PIRP Irp);

PVOID VfatGetUserBuffer(IN PIRP);

NTSTATUS VfatLockUserBuffer(IN PIRP, IN ULONG,
                            IN LOCK_OPERATION);

NTSTATUS
VfatSetExtendedAttributes(PFILE_OBJECT FileObject,
			  PVOID Ea,
			  ULONG EaLength);
/*  ------------------------------------------------------------- flush.c  */

NTSTATUS VfatFlush(PVFAT_IRP_CONTEXT IrpContext);

NTSTATUS VfatFlushVolume(PDEVICE_EXTENSION DeviceExt, PVFATFCB VolumeFcb);


/* EOF */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -