mirror of https://github.com/lianthony/NT4.0
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
293 lines
6.3 KiB
293 lines
6.3 KiB
/*++
|
|
|
|
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"
|
|
#include "cvf.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 PCHAR OpenPath,
|
|
IN OPEN_MODE OpenMode,
|
|
OUT PULONG FileId
|
|
);
|
|
|
|
ARC_STATUS
|
|
FatRead (
|
|
IN ULONG FileId,
|
|
OUT PVOID Buffer,
|
|
IN ULONG Length,
|
|
OUT PULONG Count
|
|
);
|
|
|
|
ARC_STATUS
|
|
FatSeek (
|
|
IN ULONG FileId,
|
|
IN PLARGE_INTEGER Offset,
|
|
IN SEEK_MODE SeekMode
|
|
);
|
|
|
|
ARC_STATUS
|
|
FatWrite (
|
|
IN ULONG FileId,
|
|
IN PVOID Buffer,
|
|
IN ULONG Length,
|
|
OUT PULONG Count
|
|
);
|
|
|
|
ARC_STATUS
|
|
FatGetFileInformation (
|
|
IN ULONG FileId,
|
|
OUT PFILE_INFORMATION Buffer
|
|
);
|
|
|
|
ARC_STATUS
|
|
FatSetFileInformation (
|
|
IN ULONG FileId,
|
|
IN ULONG AttributeFlags,
|
|
IN ULONG AttributeMask
|
|
);
|
|
|
|
ARC_STATUS
|
|
FatRename(
|
|
IN ULONG FileId,
|
|
IN PCHAR NewFileName
|
|
);
|
|
|
|
ARC_STATUS
|
|
FatGetDirectoryEntry (
|
|
IN ULONG FileId,
|
|
IN DIRECTORY_ENTRY *DirEntry,
|
|
IN ULONG NumberDir,
|
|
OUT PULONG CountDir
|
|
);
|
|
|
|
ARC_STATUS
|
|
FatInitialize(
|
|
VOID
|
|
);
|
|
|
|
#ifdef DBLSPACE_LEGAL
|
|
|
|
//
|
|
// The remainder of this file contains the double space additions
|
|
//
|
|
|
|
typedef struct _DBLS_STRUCTURE_CONTEXT {
|
|
|
|
//
|
|
// The following field contains the regular fat structure context
|
|
// It is important that it be the first field in the struture
|
|
// because double space boot piggybacks on a lot of the existing
|
|
// fat boot code, and the context structure is expected to be at
|
|
// the same offset.
|
|
//
|
|
|
|
FAT_STRUCTURE_CONTEXT FatStructureContext;
|
|
|
|
//
|
|
// For a double space partition we keep track of the cvf, and
|
|
// vfp (Virtual Fat Partition) layout.
|
|
//
|
|
|
|
CVF_HEADER CvfHeader;
|
|
CVF_LAYOUT CvfLayout;
|
|
|
|
struct {
|
|
|
|
COMPONENT_LOCATION Fat;
|
|
COMPONENT_LOCATION RootDirectory;
|
|
COMPONENT_LOCATION FileArea;
|
|
|
|
ULONG BytesPerCluster;
|
|
|
|
} VfpLayout;
|
|
|
|
//
|
|
// The following fields are used to point to the decompression
|
|
// algorithm's work space.
|
|
//
|
|
|
|
PVOID DecompressWorkSpace;
|
|
PUCHAR CompressedBuffer;
|
|
PUCHAR UncompressedBuffer;
|
|
|
|
//
|
|
// The following fields are used to keep a cache of fat extensions
|
|
//
|
|
|
|
LBO CachedFatExtensionsLbo;
|
|
PCVF_FAT_EXTENSIONS CachedFatExtensions;
|
|
|
|
} DBLS_STRUCTURE_CONTEXT, *PDBLS_STRUCTURE_CONTEXT;
|
|
|
|
//
|
|
// Define file I/O prototypes.
|
|
//
|
|
|
|
ARC_STATUS
|
|
DblsClose (
|
|
IN ULONG FileId
|
|
);
|
|
|
|
ARC_STATUS
|
|
DblsOpen (
|
|
IN PCHAR OpenPath,
|
|
IN OPEN_MODE OpenMode,
|
|
OUT PULONG FileId
|
|
);
|
|
|
|
ARC_STATUS
|
|
DblsRead (
|
|
IN ULONG FileId,
|
|
OUT PVOID Buffer,
|
|
IN ULONG Length,
|
|
OUT PULONG Count
|
|
);
|
|
|
|
ARC_STATUS
|
|
DblsSeek (
|
|
IN ULONG FileId,
|
|
IN PLARGE_INTEGER Offset,
|
|
IN SEEK_MODE SeekMode
|
|
);
|
|
|
|
ARC_STATUS
|
|
DblsGetFileInformation (
|
|
IN ULONG FileId,
|
|
OUT PFILE_INFORMATION Buffer
|
|
);
|
|
|
|
ARC_STATUS
|
|
DblsInitialize(
|
|
VOID
|
|
);
|
|
|
|
#endif // def DBLSPACE_LEGAL
|
|
|
|
#endif // _FATBOOT_
|