/*++

Copyright (c) 1991  Microsoft Corporation

Module Name:

    bldr.h

Abstract:

    This module is the header file for the NT boot loader.

Author:

    David N. Cutler (davec) 10-May-1991

Revision History:

--*/

#ifndef _BLDR_
#define _BLDR_

#include "ntos.h"
#include "arccodes.h"
#include "fatboot.h"
#include "cdfsboot.h"


//
// Define boot file id.
//

#define BOOT_FILEID 2                   // boot partition file id

//
// Define image types.
//

#define MIPS_IMAGE 0x162


#define TARGET_IMAGE MIPS_IMAGE

//
// Define size of sector.
//

#define SECTOR_SIZE 512                 // size of disk sector
#define SECTOR_SHIFT 9                  // sector shift value

//
// Define number of entries in file table.
//

#define BL_FILE_TABLE_SIZE 8

//
// Define size of memory allocation table.
//

#define BL_MEMORY_TABLE_SIZE 16

//
// Define buffer alignment macro.
//

#define ALIGN_BUFFER(Buffer) (PVOID) \
        ((((ULONG)(Buffer) + KeGetDcacheFillSize() - 1)) & (~(KeGetDcacheFillSize() - 1)))


typedef
ARC_STATUS
(*PRENAME_ROUTINE)(
    IN ULONG FileId,
    IN PCHAR NewName
    );

//
// Device entry table structure.
//

typedef struct _BL_DEVICE_ENTRY_TABLE {
    PARC_CLOSE_ROUTINE Close;
    PARC_MOUNT_ROUTINE Mount;
    PARC_OPEN_ROUTINE Open;
    PARC_READ_ROUTINE Read;
    PARC_READ_STATUS_ROUTINE GetReadStatus;
    PARC_SEEK_ROUTINE Seek;
    PARC_WRITE_ROUTINE Write;
    PARC_GET_FILE_INFO_ROUTINE GetFileInformation;
    PARC_SET_FILE_INFO_ROUTINE SetFileInformation;
    PRENAME_ROUTINE Rename;
    PARC_GET_DIRECTORY_ENTRY_ROUTINE GetDirectoryEntry;
} BL_DEVICE_ENTRY_TABLE, *PBL_DEVICE_ENTRY_TABLE;

//
// Define partition context structure.
//

typedef struct _PARTITION_CONTEXT {
    LARGE_INTEGER PartitionLength;
    ULONG StartingSector;
    ULONG EndingSector;
    UCHAR DiskId;
    UCHAR DeviceUnit;
    UCHAR TargetId;
    UCHAR PathId;
    ULONG SectorShift;
    ULONG Size;
    struct _DEVICE_OBJECT *PortDeviceObject;
} PARTITION_CONTEXT, *PPARTITION_CONTEXT;

//
// Define serial port context structure
//
typedef struct _SERIAL_CONTEXT {
    ULONG PortBase;
    ULONG PortNumber;
} SERIAL_CONTEXT, *PSERIAL_CONTEXT;

//
// Define drive context structure (for x86 BIOS)
//
typedef struct _DRIVE_CONTEXT {
    ULONG Drive;
    ULONG Cylinders;
    ULONG Heads;
    ULONG Sectors;
} DRIVE_CONTEXT, *PDRIVE_CONTEXT;

//
// Define Floppy context structure
//
typedef struct _FLOPPY_CONTEXT {
    ULONG DriveType;
    ULONG SectorsPerTrack;
    UCHAR DiskId;
} FLOPPY_CONTEXT, *PFLOPPY_CONTEXT;

//
// Define keyboard context structure
//
typedef struct _KEYBOARD_CONTEXT {
    BOOLEAN ScanCodes;
} KEYBOARD_CONTEXT, *PKEYBOARD_CONTEXT;

//
// Define Console context
//
typedef struct _CONSOLE_CONTEXT
    {
        ULONG ConsoleNumber;
    } CONSOLE_CONTEXT, *PCONSOLE_CONTEXT;

//
// Define OMF header structure
//
typedef struct _OMF_HDR
    {
        UCHAR ID[4];
        USHORT FwSize;
        UCHAR ReservedZ1[2];
        UCHAR ProductId[7];
        UCHAR ReservedZ2;
        ULONG FolderCount;
        UCHAR EisaVersion;
        UCHAR EisaRevision;
        UCHAR FwVersion;
        UCHAR FwRevision;
        UCHAR ChecksumByte;
        UCHAR ReservedA[3];
        ULONG FolderDirectoryLink;
    } OMF_HDR, *POMF_HDR;

//
// Define OMF directory entry structure
//

#define OMF_FILE_NAME_LEN   12                  // 12 chars
typedef struct _OMF_DIR_ENT
    {
        UCHAR FolderName[ OMF_FILE_NAME_LEN ];
        UCHAR Reserved[2];
        UCHAR FolderType;
        UCHAR FolderChecksumByte;
        ULONG FolderSize;
        ULONG FolderLink;
    } OMF_DIR_ENT, *POMF_DIR_ENT;

//
// Define OMF header file system context
//
typedef struct _OMF_HEADER_CONTEXT
    {
        ULONG FileId;
        PULONG RomIndex;
        PULONG RomRead;
        OMF_HDR OmfHeader;
    } OMF_HEADER_CONTEXT, *POMF_HEADER_CONTEXT;

//
// Define "OMF file" file system context
//
typedef struct _OMF_FILE_CONTEXT
    {
        OMF_DIR_ENT OmfDirEnt;
    } OMF_FILE_CONTEXT, *POMF_FILE_CONTEXT;


//
// Define file table structure.
//

typedef struct _BL_FILE_FLAGS {
    ULONG Open : 1;
    ULONG Read : 1;
    ULONG Write : 1;
} BL_FILE_FLAGS, *PBL_FILE_FLAGS;

#define MAXIMUM_FILE_NAME_LENGTH 32

typedef struct _BL_FILE_TABLE {
    BL_FILE_FLAGS Flags;
    ULONG DeviceId;
    LARGE_INTEGER Position;
    PVOID StructureContext;
    PBL_DEVICE_ENTRY_TABLE DeviceEntryTable;
    UCHAR FileNameLength;
    CHAR FileName[MAXIMUM_FILE_NAME_LENGTH];
    union {
        FAT_FILE_CONTEXT FatFileContext;
        PARTITION_CONTEXT PartitionContext;
        SERIAL_CONTEXT SerialContext;
        DRIVE_CONTEXT DriveContext;
        FLOPPY_CONTEXT FloppyContext;
        KEYBOARD_CONTEXT KeyboardContext;
        CONSOLE_CONTEXT ConsoleContext;
        OMF_FILE_CONTEXT OmfFileContext;
        OMF_HEADER_CONTEXT OmfHeaderContext;
	CDFS_FILE_CONTEXT CdfsFileContext;
    } u;
} BL_FILE_TABLE, *PBL_FILE_TABLE;

// Define file structure recognition prototypes.
//

PBL_DEVICE_ENTRY_TABLE
IsFatFileStructure (
    IN ULONG DeviceId,
    IN PVOID StructureContext
    );

//
// Define external references.
//

extern BL_FILE_TABLE BlFileTable[BL_FILE_TABLE_SIZE];

#endif // _BLDR_
