Author: hpoussin Date: Sun Dec 30 23:06:13 2007 New Revision: 31503
URL: http://svn.reactos.org/svn/reactos?rev=31503&view=rev Log: Add a function table to access filesystems
Modified: trunk/reactos/boot/freeldr/freeldr/fs/ext2.c trunk/reactos/boot/freeldr/freeldr/fs/fat.c trunk/reactos/boot/freeldr/freeldr/fs/fs.c trunk/reactos/boot/freeldr/freeldr/fs/iso.c trunk/reactos/boot/freeldr/freeldr/fs/ntfs.c trunk/reactos/boot/freeldr/freeldr/include/fs.h trunk/reactos/boot/freeldr/freeldr/include/fs/ext2.h trunk/reactos/boot/freeldr/freeldr/include/fs/fat.h trunk/reactos/boot/freeldr/freeldr/include/fs/iso.h trunk/reactos/boot/freeldr/freeldr/include/fs/ntfs.h
Modified: trunk/reactos/boot/freeldr/freeldr/fs/ext2.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/boot/freeldr/freeldr/fs/ext... ============================================================================== --- trunk/reactos/boot/freeldr/freeldr/fs/ext2.c (original) +++ trunk/reactos/boot/freeldr/freeldr/fs/ext2.c Sun Dec 30 23:06:13 2007 @@ -35,7 +35,7 @@ ULONG Ext2InodesPerBlock = 0; // Number of inodes in one block ULONG Ext2GroupDescPerBlock = 0; // Number of group descriptors in one block
-BOOLEAN Ext2OpenVolume(UCHAR DriveNumber, ULONGLONG VolumeStartSector) +BOOLEAN Ext2OpenVolume(UCHAR DriveNumber, ULONGLONG VolumeStartSector, ULONGLONG PartitionSectorCount) {
DbgPrint((DPRINT_FILESYSTEM, "Ext2OpenVolume() DriveNumber = 0x%x VolumeStartSector = %d\n", DriveNumber, VolumeStartSector)); @@ -102,7 +102,7 @@ DbgPrint((DPRINT_FILESYSTEM, "File is a symbolic link\n"));
// Now read in the symbolic link path - if (!Ext2ReadFile(&TempExt2FileInfo, TempExt2FileInfo.FileSize, NULL, SymLinkPath)) + if (!Ext2ReadFileBig(&TempExt2FileInfo, TempExt2FileInfo.FileSize, NULL, SymLinkPath)) { if (TempExt2FileInfo.FileBlockList != NULL) { @@ -331,11 +331,11 @@ }
/* - * Ext2ReadFile() + * Ext2ReadFileBig() * Reads BytesToRead from open file and * returns the number of bytes read in BytesRead */ -BOOLEAN Ext2ReadFile(FILE *FileHandle, ULONGLONG BytesToRead, ULONGLONG* BytesRead, PVOID Buffer) +BOOLEAN Ext2ReadFileBig(FILE *FileHandle, ULONGLONG BytesToRead, ULONGLONG* BytesRead, PVOID Buffer) { PEXT2_FILE_INFO Ext2FileInfo = (PEXT2_FILE_INFO)FileHandle; ULONG BlockNumber; @@ -344,7 +344,7 @@ ULONG LengthInBlock; ULONG NumberOfBlocks;
- DbgPrint((DPRINT_FILESYSTEM, "Ext2ReadFile() BytesToRead = %d Buffer = 0x%x\n", (ULONG)BytesToRead, Buffer)); + DbgPrint((DPRINT_FILESYSTEM, "Ext2ReadFileBig() BytesToRead = %d Buffer = 0x%x\n", (ULONG)BytesToRead, Buffer));
if (BytesRead != NULL) { @@ -519,7 +519,17 @@ return TRUE; }
-ULONGLONG Ext2GetFileSize(FILE *FileHandle) +BOOLEAN Ext2ReadFile(FILE *FileHandle, ULONG BytesToRead, ULONG* BytesRead, PVOID Buffer) +{ + BOOLEAN Success; + ULONGLONG BytesReadBig; + + Success = Ext2ReadFileBig(FileHandle, BytesToRead, &BytesReadBig, Buffer); + *BytesRead = (ULONG)BytesReadBig; + return Success; +} + +ULONG Ext2GetFileSize(FILE *FileHandle) { PEXT2_FILE_INFO Ext2FileHandle = (PEXT2_FILE_INFO)FileHandle;
@@ -528,7 +538,7 @@ return Ext2FileHandle->FileSize; }
-VOID Ext2SetFilePointer(FILE *FileHandle, ULONGLONG NewFilePointer) +VOID Ext2SetFilePointer(FILE *FileHandle, ULONG NewFilePointer) { PEXT2_FILE_INFO Ext2FileHandle = (PEXT2_FILE_INFO)FileHandle;
@@ -537,7 +547,7 @@ Ext2FileHandle->FilePointer = NewFilePointer; }
-ULONGLONG Ext2GetFilePointer(FILE *FileHandle) +ULONG Ext2GetFilePointer(FILE *FileHandle) { PEXT2_FILE_INFO Ext2FileHandle = (PEXT2_FILE_INFO)FileHandle;
@@ -787,7 +797,7 @@ return FALSE; }
- // Fill in file info struct so we can call Ext2ReadFile() + // Fill in file info struct so we can call Ext2ReadFileBig() RtlZeroMemory(&DirectoryFileInfo, sizeof(EXT2_FILE_INFO)); DirectoryFileInfo.DriveNumber = Ext2DriveNumber; DirectoryFileInfo.FileBlockList = Ext2ReadBlockPointerList(InodePointer); @@ -815,7 +825,7 @@ }
// Now read the root directory data - if (!Ext2ReadFile(&DirectoryFileInfo, DirectoryFileInfo.FileSize, NULL, *DirectoryBuffer)) + if (!Ext2ReadFileBig(&DirectoryFileInfo, DirectoryFileInfo.FileSize, NULL, *DirectoryBuffer)) { MmFreeMemory(*DirectoryBuffer); *DirectoryBuffer = NULL; @@ -1167,3 +1177,13 @@ MmFreeMemory(BlockBuffer); return TRUE; } + +const FS_VTBL Ext2Vtbl = { + Ext2OpenVolume, + Ext2OpenFile, + NULL, + Ext2ReadFile, + Ext2GetFileSize, + Ext2SetFilePointer, + Ext2GetFilePointer, +};
Modified: trunk/reactos/boot/freeldr/freeldr/fs/fat.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/boot/freeldr/freeldr/fs/fat... ============================================================================== --- trunk/reactos/boot/freeldr/freeldr/fs/fat.c (original) +++ trunk/reactos/boot/freeldr/freeldr/fs/fat.c Sun Dec 30 23:06:13 2007 @@ -115,7 +115,7 @@ SW(Obj, LastAccessDate); }
-BOOLEAN FatOpenVolume(ULONG DriveNumber, ULONG VolumeStartSector, ULONG PartitionSectorCount) +BOOLEAN FatOpenVolume(UCHAR DriveNumber, ULONGLONG VolumeStartSector, ULONGLONG PartitionSectorCount) { char ErrMsg[80]; ULONG FatSize; @@ -1407,3 +1407,13 @@ { return CacheReadDiskSectors(DriveNumber, SectorNumber + FatVolumeStartSector, SectorCount, Buffer); } + +const FS_VTBL FatVtbl = { + FatOpenVolume, + FatOpenFile, + NULL, + FatReadFile, + FatGetFileSize, + FatSetFilePointer, + FatGetFilePointer, +};
Modified: trunk/reactos/boot/freeldr/freeldr/fs/fs.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/boot/freeldr/freeldr/fs/fs.... ============================================================================== --- trunk/reactos/boot/freeldr/freeldr/fs/fs.c (original) +++ trunk/reactos/boot/freeldr/freeldr/fs/fs.c Sun Dec 30 23:06:13 2007 @@ -26,7 +26,7 @@ // DATA /////////////////////////////////////////////////////////////////////////////////////////////
-ULONG FsType = 0; // Type of filesystem on boot device, set by FsOpenVolume() +const FS_VTBL* pFSVtbl = NULL; // Type of filesystem on boot device, set by FsOpenVolume() PVOID FsStaticBufferDisk = 0, FsStaticBufferData = 0;
///////////////////////////////////////////////////////////////////////////////////////////// @@ -52,8 +52,6 @@ { CHAR ErrorText[80];
- FsType = Type; - if( !FsStaticBufferDisk ) FsStaticBufferDisk = MmAllocateMemory( 0x20000 ); if( !FsStaticBufferDisk ) @@ -63,18 +61,31 @@ } FsStaticBufferData = ((PCHAR)FsStaticBufferDisk) + 0x10000;
- switch (FsType) + switch (Type) { case FS_FAT: - return FatOpenVolume(DriveNumber, StartSector, SectorCount); + pFSVtbl = &FatVtbl; + break; + case FS_NTFS: + pFSVtbl = &NtfsVtbl; + break; case FS_EXT2: - return Ext2OpenVolume(DriveNumber, StartSector); - case FS_NTFS: - return NtfsOpenVolume(DriveNumber, StartSector); + pFSVtbl = &Ext2Vtbl; + break; case FS_ISO9660: - return IsoOpenVolume(DriveNumber); + pFSVtbl = &Iso9660Vtbl; + break; default: - FsType = 0; + pFSVtbl = NULL; + break; + } + + if (pFSVtbl && pFSVtbl->OpenVolume) + { + return (*pFSVtbl->OpenVolume)(DriveNumber, StartSector, SectorCount); + } + else + { sprintf(ErrorText, "Unsupported file system. Type: 0x%x", Type); FileSystemError(ErrorText); } @@ -143,23 +154,13 @@ // // Check file system type and pass off to appropriate handler // - switch (FsType) - { - case FS_FAT: - FileHandle = FatOpenFile(FileName); - break; - case FS_ISO9660: - FileHandle = IsoOpenFile(FileName); - break; - case FS_EXT2: - FileHandle = Ext2OpenFile(FileName); - break; - case FS_NTFS: - FileHandle = NtfsOpenFile(FileName); - break; - default: + if (pFSVtbl && pFSVtbl->OpenFile) + { + FileHandle = pFSVtbl->OpenFile(FileName); + } + else + { FileSystemError("Error: Unknown filesystem."); - break; }
// @@ -179,18 +180,14 @@
VOID FsCloseFile(PFILE FileHandle) { - switch (FsType) - { - case FS_FAT: - case FS_ISO9660: - case FS_EXT2: - break; - case FS_NTFS: - NtfsCloseFile(FileHandle); - break; - default: + if (pFSVtbl) + { + if (pFSVtbl->CloseFile) + (*pFSVtbl->CloseFile)(FileHandle); + } + else + { FileSystemError("Error: Unknown filesystem."); - break; } }
@@ -200,9 +197,6 @@ */ BOOLEAN FsReadFile(PFILE FileHandle, ULONG BytesToRead, ULONG* BytesRead, PVOID Buffer) { - ULONGLONG BytesReadBig; - BOOLEAN Success; - // // Set the number of bytes read equal to zero // @@ -211,124 +205,53 @@ *BytesRead = 0; }
- switch (FsType) - { - case FS_FAT: - - return FatReadFile(FileHandle, BytesToRead, BytesRead, Buffer); - - case FS_ISO9660: - - return IsoReadFile(FileHandle, BytesToRead, BytesRead, Buffer); - - case FS_EXT2: - - //return Ext2ReadFile(FileHandle, BytesToRead, BytesRead, Buffer); - Success = Ext2ReadFile(FileHandle, BytesToRead, &BytesReadBig, Buffer); - *BytesRead = (ULONG)BytesReadBig; - return Success; - - case FS_NTFS: - - return NtfsReadFile(FileHandle, BytesToRead, BytesRead, Buffer); - - default: - + if (pFSVtbl && pFSVtbl->ReadFile) + { + return (*pFSVtbl->ReadFile)(FileHandle, BytesToRead, BytesRead, Buffer); + } + else + { FileSystemError("Unknown file system."); return FALSE; } - - return FALSE; }
ULONG FsGetFileSize(PFILE FileHandle) { - switch (FsType) - { - case FS_FAT: - - return FatGetFileSize(FileHandle); - - case FS_ISO9660: - - return IsoGetFileSize(FileHandle); - - case FS_EXT2: - - return Ext2GetFileSize(FileHandle); - - case FS_NTFS: - - return NtfsGetFileSize(FileHandle); - - default: + if (pFSVtbl && pFSVtbl->GetFileSize) + { + return (*pFSVtbl->GetFileSize)(FileHandle); + } + else + { FileSystemError("Unknown file system."); - break; - } - - return 0; + return 0; + } }
VOID FsSetFilePointer(PFILE FileHandle, ULONG NewFilePointer) { - switch (FsType) - { - case FS_FAT: - - FatSetFilePointer(FileHandle, NewFilePointer); - break; - - case FS_ISO9660: - - IsoSetFilePointer(FileHandle, NewFilePointer); - break; - - case FS_EXT2: - - Ext2SetFilePointer(FileHandle, NewFilePointer); - break; - - case FS_NTFS: - - NtfsSetFilePointer(FileHandle, NewFilePointer); - break; - - default: + if (pFSVtbl && pFSVtbl->SetFilePointer) + { + (*pFSVtbl->SetFilePointer)(FileHandle, NewFilePointer); + } + else + { FileSystemError("Unknown file system."); - break; } }
ULONG FsGetFilePointer(PFILE FileHandle) { - switch (FsType) - { - case FS_FAT: - - return FatGetFilePointer(FileHandle); - break; - - case FS_ISO9660: - - return IsoGetFilePointer(FileHandle); - break; - - case FS_EXT2: - - return Ext2GetFilePointer(FileHandle); - break; - - case FS_NTFS: - - return NtfsGetFilePointer(FileHandle); - break; - - default: + if (pFSVtbl && pFSVtbl->SetFilePointer) + { + return (*pFSVtbl->GetFilePointer)(FileHandle); + } + else + { FileSystemError("Unknown file system."); - break; - } - - return 0; + return 0; + } }
BOOLEAN FsIsEndOfFile(PFILE FileHandle)
Modified: trunk/reactos/boot/freeldr/freeldr/fs/iso.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/boot/freeldr/freeldr/fs/iso... ============================================================================== --- trunk/reactos/boot/freeldr/freeldr/fs/iso.c (original) +++ trunk/reactos/boot/freeldr/freeldr/fs/iso.c Sun Dec 30 23:06:13 2007 @@ -28,7 +28,7 @@ ULONG IsoDriveNumber = 0;
-BOOLEAN IsoOpenVolume(ULONG DriveNumber) +BOOLEAN IsoOpenVolume(UCHAR DriveNumber, ULONGLONG VolumeStartSector, ULONGLONG PartitionSectorCount) { PPVD Pvd = (PPVD)DISKREADBUFFER;
@@ -467,3 +467,13 @@
return IsoFileHandle->FilePointer; } + +const FS_VTBL Iso9660Vtbl = { + IsoOpenVolume, + IsoOpenFile, + NULL, + IsoReadFile, + IsoGetFileSize, + IsoSetFilePointer, + IsoGetFilePointer, +};
Modified: trunk/reactos/boot/freeldr/freeldr/fs/ntfs.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/boot/freeldr/freeldr/fs/ntf... ============================================================================== --- trunk/reactos/boot/freeldr/freeldr/fs/ntfs.c (original) +++ trunk/reactos/boot/freeldr/freeldr/fs/ntfs.c Sun Dec 30 23:06:13 2007 @@ -685,7 +685,7 @@ return TRUE; }
-BOOLEAN NtfsOpenVolume(ULONG DriveNumber, ULONG VolumeStartSector) +BOOLEAN NtfsOpenVolume(UCHAR DriveNumber, ULONGLONG VolumeStartSector, ULONGLONG PartitionSectorCount) { NtfsBootSector = (PNTFS_BOOTSECTOR)DISKREADBUFFER;
@@ -821,3 +821,13 @@ PNTFS_FILE_HANDLE FileHandle = (PNTFS_FILE_HANDLE)File; return FileHandle->Offset; } + +const FS_VTBL NtfsVtbl = { + NtfsOpenVolume, + NtfsOpenFile, + NtfsCloseFile, + NtfsReadFile, + NtfsGetFileSize, + NtfsSetFilePointer, + NtfsGetFilePointer, +};
Modified: trunk/reactos/boot/freeldr/freeldr/include/fs.h URL: http://svn.reactos.org/svn/reactos/trunk/reactos/boot/freeldr/freeldr/includ... ============================================================================== --- trunk/reactos/boot/freeldr/freeldr/include/fs.h (original) +++ trunk/reactos/boot/freeldr/freeldr/include/fs.h Sun Dec 30 23:06:13 2007 @@ -28,6 +28,7 @@ #define FS_EXT2 3 #define FS_REISER 4 #define FS_ISO9660 5 +#define FS_PXE 6
#define FILE VOID #define PFILE FILE * @@ -45,4 +46,15 @@ ULONG FsGetNumPathParts(PCSTR Path); VOID FsGetFirstNameFromPath(PCHAR Buffer, PCSTR Path);
+typedef struct +{ + BOOLEAN (*OpenVolume)(UCHAR DriveNumber, ULONGLONG StartSector, ULONGLONG SectorCount); + PFILE (*OpenFile)(PCSTR FileName); + VOID (*CloseFile)(PFILE FileHandle); + BOOLEAN (*ReadFile)(PFILE FileHandle, ULONG BytesToRead, ULONG* BytesRead, PVOID Buffer); + ULONG (*GetFileSize)(PFILE FileHandle); + VOID (*SetFilePointer)(PFILE FileHandle, ULONG NewFilePointer); + ULONG (*GetFilePointer)(PFILE FileHandle); +} FS_VTBL; + #endif // #defined __FS_H
Modified: trunk/reactos/boot/freeldr/freeldr/include/fs/ext2.h URL: http://svn.reactos.org/svn/reactos/trunk/reactos/boot/freeldr/freeldr/includ... ============================================================================== --- trunk/reactos/boot/freeldr/freeldr/include/fs/ext2.h (original) +++ trunk/reactos/boot/freeldr/freeldr/include/fs/ext2.h Sun Dec 30 23:06:13 2007 @@ -666,16 +666,17 @@
-BOOLEAN Ext2OpenVolume(UCHAR DriveNumber, ULONGLONG VolumeStartSector); +BOOLEAN Ext2OpenVolume(UCHAR DriveNumber, ULONGLONG VolumeStartSector, ULONGLONG PartitionSectorCount); FILE* Ext2OpenFile(PCSTR FileName); BOOLEAN Ext2LookupFile(PCSTR FileName, PEXT2_FILE_INFO Ext2FileInfoPointer); BOOLEAN Ext2SearchDirectoryBufferForFile(PVOID DirectoryBuffer, ULONG DirectorySize, PCHAR FileName, PEXT2_DIR_ENTRY DirectoryEntry); -BOOLEAN Ext2ReadFile(FILE *FileHandle, ULONGLONG BytesToRead, ULONGLONG* BytesRead, PVOID Buffer); -ULONGLONG Ext2GetFileSize(FILE *FileHandle); -VOID Ext2SetFilePointer(FILE *FileHandle, ULONGLONG NewFilePointer); -ULONGLONG Ext2GetFilePointer(FILE *FileHandle); +BOOLEAN Ext2ReadFile(FILE *FileHandle, ULONG BytesToRead, ULONG* BytesRead, PVOID Buffer); +ULONG Ext2GetFileSize(FILE *FileHandle); +VOID Ext2SetFilePointer(FILE *FileHandle, ULONG NewFilePointer); +ULONG Ext2GetFilePointer(FILE *FileHandle); BOOLEAN Ext2ReadVolumeSectors(UCHAR DriveNumber, ULONGLONG SectorNumber, ULONGLONG SectorCount, PVOID Buffer);
+BOOLEAN Ext2ReadFileBig(FILE *FileHandle, ULONGLONG BytesToRead, ULONGLONG* BytesRead, PVOID Buffer); BOOLEAN Ext2ReadSuperBlock(VOID); BOOLEAN Ext2ReadGroupDescriptors(VOID); BOOLEAN Ext2ReadDirectory(ULONG Inode, PVOID* DirectoryBuffer, PEXT2_INODE InodePointer); @@ -694,4 +695,6 @@ BOOLEAN Ext2CopyDoubleIndirectBlockPointers(ULONG* BlockList, ULONG* CurrentBlockInList, ULONG BlockCount, ULONG DoubleIndirectBlock); BOOLEAN Ext2CopyTripleIndirectBlockPointers(ULONG* BlockList, ULONG* CurrentBlockInList, ULONG BlockCount, ULONG TripleIndirectBlock);
+extern const FS_VTBL Ext2Vtbl; + #endif // #defined __EXT2_H
Modified: trunk/reactos/boot/freeldr/freeldr/include/fs/fat.h URL: http://svn.reactos.org/svn/reactos/trunk/reactos/boot/freeldr/freeldr/includ... ============================================================================== --- trunk/reactos/boot/freeldr/freeldr/include/fs/fat.h (original) +++ trunk/reactos/boot/freeldr/freeldr/include/fs/fat.h Sun Dec 30 23:06:13 2007 @@ -152,7 +152,7 @@
-BOOLEAN FatOpenVolume(ULONG DriveNumber, ULONG VolumeStartSector, ULONG PartitionSectorCount); +BOOLEAN FatOpenVolume(UCHAR DriveNumber, ULONGLONG VolumeStartSector, ULONGLONG PartitionSectorCount); ULONG FatDetermineFatType(PFAT_BOOTSECTOR FatBootSector, ULONG PartitionSectorCount); PVOID FatBufferDirectory(ULONG DirectoryStartCluster, ULONG* EntryCountPointer, BOOLEAN RootDirectory); BOOLEAN FatSearchDirectoryBufferForFile(PVOID DirectoryBuffer, ULONG EntryCount, PCHAR FileName, PFAT_FILE_INFO FatFileInfoPointer); @@ -189,4 +189,6 @@
#define ISFATX(FT) ((FT) == FATX16 || (FT) == FATX32)
+extern const FS_VTBL FatVtbl; + #endif // #defined __FAT_H
Modified: trunk/reactos/boot/freeldr/freeldr/include/fs/iso.h URL: http://svn.reactos.org/svn/reactos/trunk/reactos/boot/freeldr/freeldr/includ... ============================================================================== --- trunk/reactos/boot/freeldr/freeldr/include/fs/iso.h (original) +++ trunk/reactos/boot/freeldr/freeldr/include/fs/iso.h Sun Dec 30 23:06:13 2007 @@ -105,11 +105,13 @@ } ISO_FILE_INFO, * PISO_FILE_INFO;
-BOOLEAN IsoOpenVolume(ULONG DriveNumber); +BOOLEAN IsoOpenVolume(UCHAR DriveNumber, ULONGLONG VolumeStartSector, ULONGLONG PartitionSectorCount); FILE* IsoOpenFile(PCSTR FileName); BOOLEAN IsoReadFile(FILE *FileHandle, ULONG BytesToRead, ULONG* BytesRead, PVOID Buffer); ULONG IsoGetFileSize(FILE *FileHandle); VOID IsoSetFilePointer(FILE *FileHandle, ULONG NewFilePointer); ULONG IsoGetFilePointer(FILE *FileHandle);
+extern const FS_VTBL Iso9660Vtbl; + #endif // #defined __FAT_H
Modified: trunk/reactos/boot/freeldr/freeldr/include/fs/ntfs.h URL: http://svn.reactos.org/svn/reactos/trunk/reactos/boot/freeldr/freeldr/includ... ============================================================================== --- trunk/reactos/boot/freeldr/freeldr/include/fs/ntfs.h (original) +++ trunk/reactos/boot/freeldr/freeldr/include/fs/ntfs.h Sun Dec 30 23:06:13 2007 @@ -218,7 +218,7 @@ ULONGLONG Offset; } PACKED NTFS_FILE_HANDLE, *PNTFS_FILE_HANDLE;
-BOOLEAN NtfsOpenVolume(ULONG DriveNumber, ULONG VolumeStartSector); +BOOLEAN NtfsOpenVolume(UCHAR DriveNumber, ULONGLONG VolumeStartSector, ULONGLONG PartitionSectorCount); FILE* NtfsOpenFile(PCSTR FileName); VOID NtfsCloseFile(FILE *FileHandle); BOOLEAN NtfsReadFile(FILE *FileHandle, ULONG BytesToRead, ULONG* BytesRead, PVOID Buffer); @@ -226,4 +226,6 @@ VOID NtfsSetFilePointer(FILE *FileHandle, ULONG NewFilePointer); ULONG NtfsGetFilePointer(FILE *FileHandle);
+extern const FS_VTBL NtfsVtbl; + #endif // #defined __NTFS_H