|
|
/*++
Copyright (c) 1991 Microsoft Corporation
Module Name:
fatboot.h
Abstract:
This module defines globally used procedure and data structures used by fat boot.
Author:
Gary Kimura (garyki) 29-Aug-1989
Revision History:
--*/
#ifndef _FATBOOT_
#define _FATBOOT_
#include "fat.h"
//
// The following structure is used to define the local mcb structure used within
// the fat boot loader to maintain a small cache of the retrieval information
// for a single file/directory
//
#define FAT_MAXIMUM_MCB (41)
typedef struct _FAT_MCB {
//
// The following fields indicate the number of entries in use by
// the boot mcb. and the boot mcb itself. The boot mcb is
// just a collection of [vbo, lbo] pairs. The last InUse entry
// Lbo's value is ignored, because it is only used to give the
// length of the previous run.
//
ULONG InUse;
VBO Vbo[ FAT_MAXIMUM_MCB ]; LBO Lbo[ FAT_MAXIMUM_MCB ];
} FAT_MCB, *PFAT_MCB;
//
// The following structure is used to define the geometry of the fat volume
// There is one for every mounted volume. It describes the size/configuration
// of the volume, contains a small cached mcb for the last file being accessed
// on the volume, and contains a small cache of the fat. Given a FileId we
// can access the structure context through the structure context field in the
// global BlFileTable (e.g., BlFileTable[FileId].StructureContext).
//
//
// The following constant is used to determine how much of the fat we keep
// cached in memory at any one time. It must be a multiple of 6 bytes in order to
// hold complete 12 and 16 bit fat entries in the cache at any one time.
//
#define FAT_CACHE_SIZE (512*3)
typedef struct _FAT_STRUCTURE_CONTEXT {
//
// The following field contains an unpacked copy of the bios parameter block
// for the mounted volume
//
BIOS_PARAMETER_BLOCK Bpb;
//
// The following two fields contain current file id of the file/directory
// whose mcb we are keeping around, and the second field is the mcb itself
//
ULONG FileId; FAT_MCB Mcb;
//
// The following fields describe/contain the current cached fat. The vbo
// is the smallest vbo of the fat currently in the cache, and cached fat
// is a pointer to the cached data. The extra buffer/indirectiion is needed
// to keep everything aligned properly. The dirty flag is used to indicate
// if the current cached fat has been modified and needs to be flushed to disk.
// Vbo is used because this allows us to do a lot of our computations having
// already biased lbo offset to the first fat table.
//
BOOLEAN CachedFatDirty; VBO CachedFatVbo; PUCHAR CachedFat; UCHAR CachedFatBuffer[ FAT_CACHE_SIZE + 256 ];
} FAT_STRUCTURE_CONTEXT, *PFAT_STRUCTURE_CONTEXT;
//
// The following structure is used to define the location and size of each
// opened file. There is one of these of every opened file. It is part of
// the union of a BL_FILE_TABLE structuure. Given a FileId we can access the
// file context via the BlFileTable (e.g., BlFileTable[FileId].u.FatFileContext)
//
typedef struct _FAT_FILE_CONTEXT {
//
// The following two fields describe where on the disk the dirent for the
// file is located and also contains a copy of the dirent
//
LBO DirentLbo; DIRENT Dirent;
} FAT_FILE_CONTEXT, *PFAT_FILE_CONTEXT;
//
// Define file I/O prototypes.
//
ARC_STATUS FatClose ( IN ULONG FileId );
ARC_STATUS FatOpen ( IN CHAR * FIRMWARE_PTR OpenPath, IN OPEN_MODE OpenMode, OUT ULONG * FIRMWARE_PTR FileId );
ARC_STATUS FatRead ( IN ULONG FileId, OUT VOID * FIRMWARE_PTR Buffer, IN ULONG Length, OUT ULONG * FIRMWARE_PTR Count );
ARC_STATUS FatSeek ( IN ULONG FileId, IN LARGE_INTEGER * FIRMWARE_PTR Offset, IN SEEK_MODE SeekMode );
ARC_STATUS FatWrite ( IN ULONG FileId, IN VOID * FIRMWARE_PTR Buffer, IN ULONG Length, OUT ULONG * FIRMWARE_PTR Count );
ARC_STATUS FatGetFileInformation ( IN ULONG FileId, OUT FILE_INFORMATION * FIRMWARE_PTR Buffer );
ARC_STATUS FatSetFileInformation ( IN ULONG FileId, IN ULONG AttributeFlags, IN ULONG AttributeMask );
ARC_STATUS FatRename( IN ULONG FileId, IN CHAR * FIRMWARE_PTR NewFileName );
ARC_STATUS FatGetDirectoryEntry ( IN ULONG FileId, IN DIRECTORY_ENTRY * FIRMWARE_PTR DirEntry, IN ULONG NumberDir, OUT ULONG * FIRMWARE_PTR CountDir );
ARC_STATUS FatInitialize( VOID );
#endif // _FATBOOT_
|