Add a function table to access filesystems

svn path=/trunk/; revision=31503
This commit is contained in:
Hervé Poussineau 2007-12-30 20:06:13 +00:00
parent 6e9a640854
commit 8d7a4e27b7
10 changed files with 148 additions and 154 deletions

View file

@ -35,7 +35,7 @@ ULONG Ext2GroupCount = 0; // Number of groups in this file system
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 @@ FILE* Ext2OpenFile(PCSTR FileName)
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 @@ BOOLEAN Ext2SearchDirectoryBufferForFile(PVOID DirectoryBuffer, ULONG DirectoryS
}
/*
* 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 @@ BOOLEAN Ext2ReadFile(FILE *FileHandle, ULONGLONG BytesToRead, ULONGLONG* BytesRe
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 @@ BOOLEAN Ext2ReadFile(FILE *FileHandle, ULONGLONG BytesToRead, ULONGLONG* BytesRe
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 @@ ULONGLONG Ext2GetFileSize(FILE *FileHandle)
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 @@ VOID Ext2SetFilePointer(FILE *FileHandle, ULONGLONG NewFilePointer)
Ext2FileHandle->FilePointer = NewFilePointer;
}
ULONGLONG Ext2GetFilePointer(FILE *FileHandle)
ULONG Ext2GetFilePointer(FILE *FileHandle)
{
PEXT2_FILE_INFO Ext2FileHandle = (PEXT2_FILE_INFO)FileHandle;
@ -787,7 +797,7 @@ BOOLEAN Ext2ReadDirectory(ULONG Inode, PVOID* DirectoryBuffer, PEXT2_INODE Inode
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 @@ BOOLEAN Ext2ReadDirectory(ULONG Inode, PVOID* DirectoryBuffer, PEXT2_INODE Inode
}
// 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 @@ BOOLEAN Ext2CopyTripleIndirectBlockPointers(ULONG* BlockList, ULONG* CurrentBloc
MmFreeMemory(BlockBuffer);
return TRUE;
}
const FS_VTBL Ext2Vtbl = {
Ext2OpenVolume,
Ext2OpenFile,
NULL,
Ext2ReadFile,
Ext2GetFileSize,
Ext2SetFilePointer,
Ext2GetFilePointer,
};

View file

@ -115,7 +115,7 @@ VOID FatSwapFatXDirEntry(PFATX_DIRENTRY Obj)
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 @@ BOOLEAN FatReadVolumeSectors(ULONG DriveNumber, ULONG SectorNumber, ULONG Sector
{
return CacheReadDiskSectors(DriveNumber, SectorNumber + FatVolumeStartSector, SectorCount, Buffer);
}
const FS_VTBL FatVtbl = {
FatOpenVolume,
FatOpenFile,
NULL,
FatReadFile,
FatGetFileSize,
FatSetFilePointer,
FatGetFilePointer,
};

View file

@ -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 @@ static BOOLEAN FsOpenVolume(ULONG DriveNumber, ULONGLONG StartSector, ULONGLONG
{
CHAR ErrorText[80];
FsType = Type;
if( !FsStaticBufferDisk )
FsStaticBufferDisk = MmAllocateMemory( 0x20000 );
if( !FsStaticBufferDisk )
@ -63,18 +61,31 @@ static BOOLEAN FsOpenVolume(ULONG DriveNumber, ULONGLONG StartSector, ULONGLONG
}
FsStaticBufferData = ((PCHAR)FsStaticBufferDisk) + 0x10000;
switch (FsType)
switch (Type)
{
case FS_FAT:
return FatOpenVolume(DriveNumber, StartSector, SectorCount);
case FS_EXT2:
return Ext2OpenVolume(DriveNumber, StartSector);
pFSVtbl = &FatVtbl;
break;
case FS_NTFS:
return NtfsOpenVolume(DriveNumber, StartSector);
pFSVtbl = &NtfsVtbl;
break;
case FS_EXT2:
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 @@ PFILE FsOpenFile(PCSTR FileName)
//
// Check file system type and pass off to appropriate handler
//
switch (FsType)
if (pFSVtbl && pFSVtbl->OpenFile)
{
FileHandle = pFSVtbl->OpenFile(FileName);
}
else
{
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:
FileSystemError("Error: Unknown filesystem.");
break;
}
//
@ -179,18 +180,14 @@ PFILE FsOpenFile(PCSTR FileName)
VOID FsCloseFile(PFILE FileHandle)
{
switch (FsType)
if (pFSVtbl)
{
if (pFSVtbl->CloseFile)
(*pFSVtbl->CloseFile)(FileHandle);
}
else
{
case FS_FAT:
case FS_ISO9660:
case FS_EXT2:
break;
case FS_NTFS:
NtfsCloseFile(FileHandle);
break;
default:
FileSystemError("Error: Unknown filesystem.");
break;
}
}
@ -200,9 +197,6 @@ VOID FsCloseFile(PFILE FileHandle)
*/
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 @@ BOOLEAN FsReadFile(PFILE FileHandle, ULONG BytesToRead, ULONG* BytesRead, PVOID
*BytesRead = 0;
}
switch (FsType)
if (pFSVtbl && pFSVtbl->ReadFile)
{
return (*pFSVtbl->ReadFile)(FileHandle, BytesToRead, BytesRead, Buffer);
}
else
{
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:
FileSystemError("Unknown file system.");
return FALSE;
}
return FALSE;
}
ULONG FsGetFileSize(PFILE FileHandle)
{
switch (FsType)
if (pFSVtbl && pFSVtbl->GetFileSize)
{
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:
FileSystemError("Unknown file system.");
break;
return (*pFSVtbl->GetFileSize)(FileHandle);
}
else
{
FileSystemError("Unknown file system.");
return 0;
}
return 0;
}
VOID FsSetFilePointer(PFILE FileHandle, ULONG NewFilePointer)
{
switch (FsType)
if (pFSVtbl && pFSVtbl->SetFilePointer)
{
(*pFSVtbl->SetFilePointer)(FileHandle, NewFilePointer);
}
else
{
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:
FileSystemError("Unknown file system.");
break;
}
}
ULONG FsGetFilePointer(PFILE FileHandle)
{
switch (FsType)
if (pFSVtbl && pFSVtbl->SetFilePointer)
{
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:
FileSystemError("Unknown file system.");
break;
return (*pFSVtbl->GetFilePointer)(FileHandle);
}
else
{
FileSystemError("Unknown file system.");
return 0;
}
return 0;
}
BOOLEAN FsIsEndOfFile(PFILE FileHandle)

View file

@ -28,7 +28,7 @@ static ULONG IsoRootLength; // Length of the root directory
ULONG IsoDriveNumber = 0;
BOOLEAN IsoOpenVolume(ULONG DriveNumber)
BOOLEAN IsoOpenVolume(UCHAR DriveNumber, ULONGLONG VolumeStartSector, ULONGLONG PartitionSectorCount)
{
PPVD Pvd = (PPVD)DISKREADBUFFER;
@ -467,3 +467,13 @@ ULONG IsoGetFilePointer(FILE *FileHandle)
return IsoFileHandle->FilePointer;
}
const FS_VTBL Iso9660Vtbl = {
IsoOpenVolume,
IsoOpenFile,
NULL,
IsoReadFile,
IsoGetFileSize,
IsoSetFilePointer,
IsoGetFilePointer,
};

View file

@ -685,7 +685,7 @@ static BOOLEAN NtfsLookupFile(PCSTR FileName, PNTFS_MFT_RECORD MftRecord, PNTFS_
return TRUE;
}
BOOLEAN NtfsOpenVolume(ULONG DriveNumber, ULONG VolumeStartSector)
BOOLEAN NtfsOpenVolume(UCHAR DriveNumber, ULONGLONG VolumeStartSector, ULONGLONG PartitionSectorCount)
{
NtfsBootSector = (PNTFS_BOOTSECTOR)DISKREADBUFFER;
@ -821,3 +821,13 @@ ULONG NtfsGetFilePointer(FILE *File)
PNTFS_FILE_HANDLE FileHandle = (PNTFS_FILE_HANDLE)File;
return FileHandle->Offset;
}
const FS_VTBL NtfsVtbl = {
NtfsOpenVolume,
NtfsOpenFile,
NtfsCloseFile,
NtfsReadFile,
NtfsGetFileSize,
NtfsSetFilePointer,
NtfsGetFilePointer,
};

View file

@ -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 @@ BOOLEAN FsIsEndOfFile(PFILE FileHandle);
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

View file

@ -666,16 +666,17 @@ typedef struct
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 Ext2CopyIndirectBlockPointers(ULONG* BlockList, ULONG* CurrentBlockInLis
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

View file

@ -152,7 +152,7 @@ typedef struct
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 @@ BOOLEAN FatReadVolumeSectors(ULONG DriveNumber, ULONG SectorNumber, ULONG Sector
#define ISFATX(FT) ((FT) == FATX16 || (FT) == FATX32)
extern const FS_VTBL FatVtbl;
#endif // #defined __FAT_H

View file

@ -105,11 +105,13 @@ typedef struct
} 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

View file

@ -218,7 +218,7 @@ typedef struct
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 @@ ULONG NtfsGetFileSize(FILE *FileHandle);
VOID NtfsSetFilePointer(FILE *FileHandle, ULONG NewFilePointer);
ULONG NtfsGetFilePointer(FILE *FileHandle);
extern const FS_VTBL NtfsVtbl;
#endif // #defined __NTFS_H