1713 lines
31 KiB
C
1713 lines
31 KiB
C
/*++
|
||
|
||
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 "setupblk.h"
|
||
#include "hdlsblk.h"
|
||
#include "remboot.h"
|
||
#include "oscpkt.h"
|
||
#include "bootstatus.h"
|
||
|
||
#include <TCHAR.H>
|
||
|
||
#ifndef _PTUCHAR
|
||
typedef _TUCHAR *_PTUCHAR;
|
||
#endif
|
||
|
||
//
|
||
// DoApmAttemptReconnect does nothing on non x86 machines.
|
||
// On x86 machines, it attempts an APM reconnect, and lives in initx86.c
|
||
//
|
||
#if defined(_X86_)
|
||
VOID DoApmAttemptReconnect();
|
||
#else
|
||
#define DoApmAttemptReconnect()
|
||
#endif
|
||
|
||
//
|
||
// The Alpha OS Loader and Setup Loader run in the environment of the host
|
||
// firmware. This environment is restricted to a 32-bit address space and
|
||
// cannot result in pointer significance greater than 32-bits. The 64-bit
|
||
// OS Loader, however, is compiled using 64-bit pointers for non-firmware
|
||
// interfaces and constructs data structures used to pass information to the
|
||
// NT kernel using 64-bit pointers. This leads to a large number of false
|
||
// pointer truncation warnings. Therefore, pointer truncation warnings are
|
||
// turned off in the OS and Setup Loaders for 64-bit Alpha systems.
|
||
//
|
||
|
||
#if defined(_AXP64_)
|
||
|
||
#pragma warning(4:4244) // turn off pointer trunction
|
||
|
||
#endif
|
||
|
||
//
|
||
// Define boot file id.
|
||
//
|
||
|
||
#define BOOT_FILEID 2 // boot partition file id
|
||
|
||
//
|
||
// Define image type.
|
||
//
|
||
|
||
#if defined(_X86_)
|
||
|
||
#define TARGET_IMAGE IMAGE_FILE_MACHINE_I386
|
||
|
||
#endif
|
||
|
||
#if defined(_ALPHA_)
|
||
|
||
#if defined(_AXP64_)
|
||
|
||
#define TARGET_IMAGE IMAGE_FILE_MACHINE_AXP64
|
||
|
||
#else
|
||
|
||
#define TARGET_IMAGE IMAGE_FILE_MACHINE_ALPHA
|
||
|
||
#endif
|
||
|
||
#endif
|
||
|
||
#if defined(_IA64_)
|
||
|
||
#define TARGET_IMAGE IMAGE_FILE_MACHINE_IA64
|
||
|
||
#endif
|
||
|
||
//
|
||
// Make headless defines
|
||
//
|
||
|
||
#if defined(_X86_)
|
||
|
||
#define BlIsTerminalConnected() BlTerminalConnected
|
||
|
||
|
||
#endif
|
||
|
||
#if defined(_ALPHA_)
|
||
|
||
#if defined(_AXP64_)
|
||
|
||
#define BlIsTerminalConnected() FALSE
|
||
|
||
#else
|
||
|
||
#define BlIsTerminalConnected() FALSE
|
||
|
||
#endif
|
||
|
||
#endif
|
||
|
||
#if defined(_IA64_)
|
||
|
||
#define BlIsTerminalConnected() BlTerminalConnected
|
||
|
||
#endif
|
||
|
||
BOOLEAN
|
||
BlTerminalHandleLoaderFailure(
|
||
VOID
|
||
);
|
||
|
||
|
||
|
||
|
||
//
|
||
// Define size of sector.
|
||
//
|
||
|
||
#define SECTOR_SIZE 512 // size of disk sector
|
||
#define SECTOR_SHIFT 9 // sector shift value
|
||
|
||
#define STALE_GPT_PARTITION_ENTRY 0xEE // The stale MBR partition entry for GPT disks
|
||
|
||
//
|
||
// Define heap allocation block granularity.
|
||
//
|
||
|
||
#define BL_GRANULARITY 8
|
||
|
||
//
|
||
// Define number of entries in file table.
|
||
//
|
||
|
||
#define BL_FILE_TABLE_SIZE 48
|
||
|
||
//
|
||
// Define size of memory allocation table.
|
||
//
|
||
|
||
#define BL_MEMORY_TABLE_SIZE 16
|
||
|
||
//
|
||
// Define number of loader heap and stack pages.
|
||
//
|
||
|
||
#define BL_HEAP_PAGES 16
|
||
#define BL_STACK_PAGES 8
|
||
|
||
//
|
||
// Define buffer alignment macro.
|
||
//
|
||
|
||
#define ALIGN_BUFFER(Buffer) (PVOID) \
|
||
((((ULONG_PTR)(Buffer) + BlDcacheFillSize - 1)) & (~((ULONG_PTR)BlDcacheFillSize - 1)))
|
||
|
||
#define ALIGN_BUFFER_WITH_SIZE(Buffer, Size) (PVOID) \
|
||
((((ULONG_PTR)(Buffer) + (Size) - 1)) & (~((ULONG_PTR)(Size) - 1)))
|
||
|
||
|
||
|
||
//
|
||
// Useful defines for COM ports.
|
||
//
|
||
#define COM1_PORT (0x3f8)
|
||
#define COM2_PORT (0x2f8)
|
||
#define COM3_PORT (0x3e8)
|
||
#define COM4_PORT (0x2e8)
|
||
|
||
#define BD_150 150
|
||
#define BD_300 300
|
||
#define BD_600 600
|
||
#define BD_1200 1200
|
||
#define BD_2400 2400
|
||
#define BD_4800 4800
|
||
#define BD_9600 9600
|
||
#define BD_14400 14400
|
||
#define BD_19200 19200
|
||
#define BD_57600 57600
|
||
#define BD_115200 115200
|
||
|
||
|
||
|
||
|
||
typedef
|
||
ARC_STATUS
|
||
(*PRENAME_ROUTINE)(
|
||
IN ULONG FileId,
|
||
IN CHAR * FIRMWARE_PTR NewName
|
||
);
|
||
|
||
typedef struct _BOOTFS_INFO {
|
||
WCHAR * FIRMWARE_PTR DriverName;
|
||
} BOOTFS_INFO, * FIRMWARE_PTR PBOOTFS_INFO;
|
||
|
||
|
||
//
|
||
// 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;
|
||
PBOOTFS_INFO BootFsInfo;
|
||
} BL_DEVICE_ENTRY_TABLE, *PBL_DEVICE_ENTRY_TABLE;
|
||
|
||
//
|
||
// Many functions in the boot loader take a set of paths. Every path is divided
|
||
// into two parts, a "Source" and a "PathOffset".
|
||
//
|
||
// A source is described by the PATH_SOURCE structure. This structure contains
|
||
// three parts, the device handle to use for I/O, the ARC name of the device,
|
||
// and the offset off the root for that ARC device.
|
||
//
|
||
// The PATH_SET structures encapsulates up to three different sources. The
|
||
// field AliasName optionally points to a PE namespace description of the
|
||
// sources (eg \SystemRoot).
|
||
//
|
||
// Finally, the biggest PATH_SET structure (FULL_PATH_SET) is limited to
|
||
// MAX_PATH_COUNT sources so that those using this structure can manipulate
|
||
// local stack copies.
|
||
//
|
||
// Putting it all together, during a last known good boot the PATH_SET
|
||
// describing \Winnt\System32 would be:
|
||
// PathCount = 3
|
||
// AliasName = \SystemRoot\
|
||
// PathOffset = System32\
|
||
// Source[0].DirectoryPath = \Winnt\LastGood.tmp
|
||
// Source[1].DirectoryPath = \Winnt\LastGood
|
||
// Source[2].DirectoryPath = \Winnt\
|
||
//
|
||
#define MAX_PATH_SOURCES 3
|
||
|
||
typedef struct {
|
||
|
||
ULONG DeviceId;
|
||
LPCSTR DeviceName;
|
||
PSTR DirectoryPath; // Should have trailing '\'
|
||
|
||
} PATH_SOURCE, *PPATH_SOURCE;
|
||
|
||
typedef struct {
|
||
|
||
ULONG PathCount;
|
||
LPCSTR AliasName;
|
||
CHAR PathOffset[256]; // Should have trailing '\' if non-empty
|
||
PATH_SOURCE Source[0];
|
||
|
||
} SPARSE_PATH_SET, *PSPARSE_PATH_SET;
|
||
|
||
typedef struct {
|
||
|
||
ULONG PathCount;
|
||
LPCSTR AliasName;
|
||
CHAR PathOffset[256]; // Should have trailing '\' if non-empty
|
||
PATH_SOURCE Source[MAX_PATH_SOURCES];
|
||
|
||
} FULL_PATH_SET, *PFULL_PATH_SET;
|
||
|
||
//
|
||
// A PPATH_SET points to a path set with an undetermined count of paths. We
|
||
// make this an alias of PFULL_PATH_SET so as to cut down on casting.
|
||
//
|
||
typedef PFULL_PATH_SET PPATH_SET;
|
||
|
||
|
||
//
|
||
// Define main entrypoint.
|
||
//
|
||
|
||
ARC_STATUS
|
||
BlOsLoader (
|
||
IN ULONG Argc,
|
||
IN CHAR * FIRMWARE_PTR * FIRMWARE_PTR Argv,
|
||
IN CHAR * FIRMWARE_PTR * FIRMWARE_PTR Envp
|
||
);
|
||
|
||
ARC_STATUS
|
||
BlInitStdio (
|
||
IN ULONG Argc,
|
||
IN CHAR * FIRMWARE_PTR * FIRMWARE_PTR Argv
|
||
);
|
||
|
||
|
||
extern UCHAR OsLoaderVersion[];
|
||
extern WCHAR OsLoaderVersionW[];
|
||
extern UCHAR OsLoaderName[];
|
||
extern CHAR KernelFileName[8+1+3+1];
|
||
extern CHAR HalFileName[8+1+3+1];
|
||
|
||
//
|
||
// Define boot debugger function prototype.
|
||
//
|
||
|
||
VOID
|
||
BdInitDebugger (
|
||
IN PCHAR LoaderName,
|
||
IN PVOID LoaderBase,
|
||
IN PCHAR Options
|
||
);
|
||
|
||
extern LOGICAL BdDebuggerEnabled;
|
||
|
||
VOID
|
||
BdInitializeTraps (
|
||
VOID
|
||
);
|
||
|
||
ULONG
|
||
BdComPortNumber (
|
||
VOID
|
||
);
|
||
|
||
ARC_STATUS
|
||
BdPullRemoteFile(
|
||
IN PCHAR FileName,
|
||
IN ULONG FileAttributes,
|
||
IN ULONG CreateDisposition,
|
||
IN ULONG CreateOptions,
|
||
IN ULONG FileId
|
||
);
|
||
|
||
|
||
|
||
//
|
||
// Define com port I/O prototypes.
|
||
//
|
||
LOGICAL
|
||
BlPortInitialize(
|
||
IN ULONG BaudRate,
|
||
IN ULONG PortNumber,
|
||
IN PUCHAR PortAddress OPTIONAL,
|
||
IN BOOLEAN ReInitialize,
|
||
OUT PULONG BlFileId
|
||
);
|
||
|
||
VOID
|
||
BlInitializeHeadlessPort(
|
||
VOID
|
||
);
|
||
|
||
ULONG
|
||
BlPortGetByte (
|
||
IN ULONG BlFileId,
|
||
OUT PUCHAR Input
|
||
);
|
||
|
||
VOID
|
||
BlPortPutByte (
|
||
IN ULONG BlFileId,
|
||
IN UCHAR Output
|
||
);
|
||
|
||
ULONG
|
||
BlPortPollByte (
|
||
IN ULONG BlFileId,
|
||
OUT PUCHAR Input
|
||
);
|
||
|
||
ULONG
|
||
BlPortPollOnly (
|
||
IN ULONG BlFileId
|
||
);
|
||
|
||
VOID
|
||
BlSetHeadlessRestartBlock(
|
||
IN PTFTP_RESTART_BLOCK RestartBlock
|
||
);
|
||
|
||
VOID
|
||
BlGetHeadlessRestartBlock(
|
||
IN PTFTP_RESTART_BLOCK RestartBlock,
|
||
IN BOOLEAN RestartBlockValid
|
||
);
|
||
|
||
LOGICAL
|
||
BlRetrieveBIOSRedirectionInformation();
|
||
|
||
extern HEADLESS_LOADER_BLOCK LoaderRedirectionInformation;
|
||
|
||
|
||
//
|
||
// Define file I/O prototypes.
|
||
//
|
||
|
||
ARC_STATUS
|
||
BlIoInitialize (
|
||
VOID
|
||
);
|
||
|
||
ARC_STATUS
|
||
BlClose (
|
||
IN ULONG FileId
|
||
);
|
||
|
||
PBOOTFS_INFO
|
||
BlGetFsInfo(
|
||
IN ULONG DeviceId
|
||
);
|
||
|
||
ARC_STATUS
|
||
BlMount (
|
||
IN PCHAR MountPath,
|
||
IN MOUNT_OPERATION Operation
|
||
);
|
||
|
||
ARC_STATUS
|
||
BlOpen (
|
||
IN ULONG DeviceId,
|
||
IN PCHAR OpenPath,
|
||
IN OPEN_MODE OpenMode,
|
||
OUT PULONG FileId
|
||
);
|
||
|
||
ARC_STATUS
|
||
BlRead (
|
||
IN ULONG FileId,
|
||
OUT PVOID Buffer,
|
||
IN ULONG Length,
|
||
OUT PULONG Count
|
||
);
|
||
|
||
ARC_STATUS
|
||
BlReadAtOffset(
|
||
IN ULONG FileId,
|
||
IN ULONG Offset,
|
||
IN ULONG Length,
|
||
OUT PVOID Data
|
||
);
|
||
|
||
ARC_STATUS
|
||
BlRename (
|
||
IN ULONG FileId,
|
||
IN PCHAR NewName
|
||
);
|
||
|
||
ARC_STATUS
|
||
BlGetReadStatus (
|
||
IN ULONG FileId
|
||
);
|
||
|
||
ARC_STATUS
|
||
BlSeek (
|
||
IN ULONG FileId,
|
||
IN PLARGE_INTEGER Offset,
|
||
IN SEEK_MODE SeekMode
|
||
);
|
||
|
||
ARC_STATUS
|
||
BlWrite (
|
||
IN ULONG FileId,
|
||
IN PVOID Buffer,
|
||
IN ULONG Length,
|
||
OUT PULONG Count
|
||
);
|
||
|
||
ARC_STATUS
|
||
BlGetFileInformation (
|
||
IN ULONG FileId,
|
||
IN PFILE_INFORMATION FileInformation
|
||
);
|
||
|
||
ARC_STATUS
|
||
BlSetFileInformation (
|
||
IN ULONG FileId,
|
||
IN ULONG AttributeFlags,
|
||
IN ULONG AttributeMask
|
||
);
|
||
|
||
#ifdef DBLSPACE_LEGAL
|
||
VOID
|
||
BlSetAutoDoubleSpace (
|
||
IN BOOLEAN Enable
|
||
);
|
||
#endif
|
||
|
||
//
|
||
// Define image manipulation routine prototyupes.
|
||
//
|
||
#define BlLoadImage(_id_,_memtype_,_file_,_imagetype_,_base_) \
|
||
BlLoadImageEx(_id_,_memtype_,_file_,_imagetype_,0,0,_base_)
|
||
|
||
ARC_STATUS
|
||
BlLoadImageEx(
|
||
IN ULONG DeviceId,
|
||
IN TYPE_OF_MEMORY MemoryType,
|
||
IN PCHAR LoadFile,
|
||
IN USHORT ImageType,
|
||
IN OPTIONAL ULONG PreferredAlignment,
|
||
IN OPTIONAL ULONG PreferredBasePage,
|
||
OUT PVOID *ImageBase
|
||
);
|
||
|
||
ARC_STATUS
|
||
BlLoadDeviceDriver(
|
||
IN PPATH_SET PathSet,
|
||
IN PCHAR DriverName,
|
||
IN PTCHAR DriverDescription OPTIONAL,
|
||
IN ULONG DriverFlags,
|
||
OUT PKLDR_DATA_TABLE_ENTRY *DriverDataTableEntry
|
||
);
|
||
|
||
ARC_STATUS
|
||
BlLoadNLSData(
|
||
IN ULONG DeviceId,
|
||
IN PCHAR DeviceName,
|
||
IN PCHAR DirectoryPath,
|
||
IN PUNICODE_STRING AnsiCodepage,
|
||
IN PUNICODE_STRING OemCodepage,
|
||
IN PUNICODE_STRING LanguageTable,
|
||
OUT PCHAR BadFileName
|
||
);
|
||
|
||
ARC_STATUS
|
||
BlLoadOemHalFont(
|
||
IN ULONG DeviceId,
|
||
IN PCHAR DeviceName,
|
||
IN PCHAR DirectoryPath,
|
||
IN PUNICODE_STRING OemHalFont,
|
||
OUT PCHAR BadFileName
|
||
);
|
||
|
||
|
||
|
||
PVOID
|
||
BlImageNtHeader (
|
||
IN PVOID Base
|
||
);
|
||
|
||
ARC_STATUS
|
||
BlSetupForNt(
|
||
IN PLOADER_PARAMETER_BLOCK BlLoaderBlock
|
||
);
|
||
|
||
ARC_STATUS
|
||
BlScanImportDescriptorTable (
|
||
IN PPATH_SET PathSet,
|
||
IN PKLDR_DATA_TABLE_ENTRY ScanEntry,
|
||
IN TYPE_OF_MEMORY MemoryType
|
||
);
|
||
|
||
ARC_STATUS
|
||
BlScanOsloaderBoundImportTable (
|
||
IN PKLDR_DATA_TABLE_ENTRY ScanEntry
|
||
);
|
||
|
||
#if defined(_ALPHA_)
|
||
|
||
ARC_STATUS
|
||
BlAllocateAnyMemory (
|
||
IN TYPE_OF_MEMORY MemoryType,
|
||
IN ULONG BasePage,
|
||
IN ULONG PageCount,
|
||
OUT PULONG ActualBase
|
||
);
|
||
|
||
ARC_STATUS
|
||
BlGeneratePalName(
|
||
IN PCHAR PalFIleName
|
||
);
|
||
|
||
ARC_STATUS
|
||
BlLoadPal(
|
||
IN ULONG DeviceId,
|
||
IN TYPE_OF_MEMORY MemoryType,
|
||
IN PCHAR LoadPath,
|
||
IN USHORT ImageType,
|
||
OUT PVOID *ImageBase,
|
||
IN PCHAR LoadDevice
|
||
);
|
||
|
||
VOID
|
||
BlSetGranularityHints (
|
||
IN PHARDWARE_PTE PageTableArray,
|
||
IN ULONG PageTableCount
|
||
);
|
||
|
||
#endif
|
||
|
||
#if defined(_PPC_)
|
||
|
||
ARC_STATUS
|
||
BlPpcInitialize (
|
||
VOID
|
||
);
|
||
|
||
#endif // defined(_PPC)
|
||
|
||
//
|
||
// Define configuration allocation prototypes.
|
||
//
|
||
|
||
|
||
ARC_STATUS
|
||
BlConfigurationInitialize (
|
||
IN PCONFIGURATION_COMPONENT Parent,
|
||
IN PCONFIGURATION_COMPONENT_DATA ParentEntry
|
||
);
|
||
|
||
//
|
||
// define routines for searching the ARC firmware tree
|
||
//
|
||
typedef
|
||
BOOLEAN
|
||
(*PNODE_CALLBACK)(
|
||
IN PCONFIGURATION_COMPONENT_DATA FoundComponent
|
||
);
|
||
|
||
BOOLEAN
|
||
BlSearchConfigTree(
|
||
IN PCONFIGURATION_COMPONENT_DATA Node,
|
||
IN CONFIGURATION_CLASS Class,
|
||
IN CONFIGURATION_TYPE Type,
|
||
IN ULONG Key,
|
||
IN PNODE_CALLBACK CallbackRoutine
|
||
);
|
||
|
||
VOID
|
||
BlGetPathnameFromComponent(
|
||
IN PCONFIGURATION_COMPONENT_DATA Component,
|
||
OUT PCHAR ArcName
|
||
);
|
||
|
||
BOOLEAN
|
||
BlGetPathMnemonicKey(
|
||
IN PCHAR OpenPath,
|
||
IN PCHAR Mnemonic,
|
||
IN PULONG Key
|
||
);
|
||
|
||
ARC_STATUS
|
||
BlGetArcDiskInformation(
|
||
IN BOOLEAN XInt13Support
|
||
);
|
||
|
||
BOOLEAN
|
||
BlReadSignature(
|
||
IN PCHAR DiskName,
|
||
IN BOOLEAN IsCdRom
|
||
);
|
||
|
||
BOOLEAN
|
||
BlGetDiskSignature(
|
||
IN PCHAR Name,
|
||
IN BOOLEAN IsCdRom,
|
||
PARC_DISK_SIGNATURE Signature
|
||
);
|
||
|
||
#if defined(REMOTE_BOOT)
|
||
ARC_STATUS
|
||
BlCheckMachineReplacement (
|
||
IN PCHAR SystemDevice,
|
||
IN ULONG SystemDeviceId,
|
||
IN ULONGLONG NetRebootParameter,
|
||
IN PUCHAR OsLoader
|
||
);
|
||
|
||
#endif
|
||
|
||
//
|
||
// Define memory allocation prototypes.
|
||
//
|
||
|
||
extern ULONG BlUsableBase;
|
||
extern ULONG BlUsableLimit;
|
||
|
||
typedef enum _ALLOCATION_POLICY {
|
||
BlAllocateLowestFit,
|
||
BlAllocateBestFit,
|
||
BlAllocateHighestFit
|
||
} ALLOCATION_POLICY, *PALLOCATION_POLICY;
|
||
|
||
extern ALLOCATION_POLICY BlMemoryAllocationPolicy;
|
||
extern ALLOCATION_POLICY BlHeapAllocationPolicy;
|
||
|
||
VOID
|
||
BlSetAllocationPolicy (
|
||
IN ALLOCATION_POLICY MemoryAllocationPolicy,
|
||
IN ALLOCATION_POLICY HeapAllocationPolicy
|
||
);
|
||
|
||
ARC_STATUS
|
||
BlMemoryInitialize (
|
||
VOID
|
||
);
|
||
|
||
ARC_STATUS
|
||
BlAllocateDataTableEntry (
|
||
IN PCHAR BaseDllName,
|
||
IN PCHAR FullDllName,
|
||
IN PVOID ImageHeader,
|
||
OUT PKLDR_DATA_TABLE_ENTRY *Entry
|
||
);
|
||
|
||
#define BlAllocateDescriptor(_MemoryType, _BasePage, _PageCount, _ActualBase) \
|
||
BlAllocateAlignedDescriptor((_MemoryType), \
|
||
(_BasePage), \
|
||
(_PageCount), \
|
||
1, \
|
||
(_ActualBase))
|
||
|
||
#if defined (_X86_)
|
||
#define BlpCheckMapping(_page,_npages) MempCheckMapping (_page,_npages)
|
||
#else
|
||
#define BlpCheckMapping(_page,_npages) ESUCCESS
|
||
#endif
|
||
|
||
ARC_STATUS
|
||
BlAllocateAlignedDescriptor (
|
||
IN TYPE_OF_MEMORY MemoryType,
|
||
IN ULONG BasePage,
|
||
IN ULONG PageCount,
|
||
IN ULONG Alignment,
|
||
OUT PULONG ActualBase
|
||
);
|
||
|
||
ARC_STATUS
|
||
BlFreeDescriptor (
|
||
IN ULONG BasePage
|
||
);
|
||
|
||
PVOID
|
||
BlAllocateHeapAligned (
|
||
IN ULONG Size
|
||
);
|
||
|
||
PVOID
|
||
BlAllocateHeap (
|
||
IN ULONG Size
|
||
);
|
||
|
||
VOID
|
||
BlStartConfigPrompt(
|
||
VOID
|
||
);
|
||
|
||
BOOLEAN
|
||
BlEndConfigPrompt(
|
||
VOID
|
||
);
|
||
|
||
BOOLEAN
|
||
BlCheckForLoadedDll (
|
||
IN PCHAR DllName,
|
||
OUT PKLDR_DATA_TABLE_ENTRY *FoundEntry
|
||
);
|
||
|
||
PMEMORY_ALLOCATION_DESCRIPTOR
|
||
BlFindMemoryDescriptor(
|
||
IN ULONG BasePage
|
||
);
|
||
|
||
ARC_STATUS
|
||
BlInitResources(
|
||
IN PCHAR StartCommand
|
||
);
|
||
|
||
PTCHAR
|
||
BlFindMessage(
|
||
IN ULONG Id
|
||
);
|
||
|
||
//
|
||
// Define debug function to write on the display console.
|
||
//
|
||
|
||
VOID
|
||
BlPrint(
|
||
PTCHAR cp,
|
||
...
|
||
);
|
||
|
||
#if DBG
|
||
#define DBGTRACE BlPrint
|
||
#else
|
||
#define DBGTRACE
|
||
#endif
|
||
|
||
|
||
ARC_STATUS
|
||
BlGenerateDescriptor (
|
||
IN PMEMORY_ALLOCATION_DESCRIPTOR MemoryDescriptor,
|
||
IN MEMORY_TYPE MemoryType,
|
||
IN ULONG BasePage,
|
||
IN ULONG PageCount
|
||
);
|
||
|
||
VOID
|
||
BlInsertDescriptor (
|
||
IN PMEMORY_ALLOCATION_DESCRIPTOR NewDescriptor
|
||
);
|
||
|
||
#if defined (_X86_)
|
||
|
||
|
||
ARC_STATUS
|
||
MempCheckMapping (
|
||
ULONG StartPage,
|
||
ULONG NumberPages
|
||
);
|
||
|
||
ARC_STATUS
|
||
MempRemoveMapping (
|
||
ULONG StartPage,
|
||
ULONG NumberPages
|
||
);
|
||
|
||
#endif
|
||
|
||
#define BlRemoveDescriptor(_md_) RemoveEntryList(&(_md_)->ListEntry)
|
||
|
||
|
||
|
||
ARC_STATUS
|
||
BlGenerateDeviceNames (
|
||
IN PCHAR ArcDeviceName,
|
||
OUT PCHAR ArcCanonicalName,
|
||
OUT OPTIONAL PCHAR NtDevicePrefix
|
||
);
|
||
|
||
PCHAR
|
||
BlGetArgumentValue (
|
||
IN ULONG Argc,
|
||
IN CHAR * FIRMWARE_PTR * FIRMWARE_PTR Argv,
|
||
IN PCHAR ArgumentName
|
||
);
|
||
|
||
PCHAR
|
||
BlSetArgumentValue (
|
||
IN ULONG Argc,
|
||
IN CHAR * FIRMWARE_PTR * FIRMWARE_PTR Argv,
|
||
IN PCHAR ArgumentName,
|
||
IN PCHAR NewValue
|
||
);
|
||
|
||
//
|
||
// Defines for doing console I/O
|
||
//
|
||
#define ASCII_CR 0x0d
|
||
#define ASCII_LF 0x0a
|
||
#define ESC 0x1B
|
||
#define SGR_INVERSE 7
|
||
#define SGR_INTENSE 1
|
||
#define SGR_NORMAL 0
|
||
|
||
extern ULONG ScreenWidth;
|
||
extern ULONG ScreenHeight;
|
||
|
||
//
|
||
// Define I/O prototypes.
|
||
//
|
||
|
||
VOID
|
||
BlClearScreen(
|
||
VOID
|
||
);
|
||
|
||
VOID
|
||
BlClearToEndOfScreen(
|
||
VOID
|
||
);
|
||
|
||
VOID
|
||
BlClearToEndOfLine(
|
||
VOID
|
||
);
|
||
|
||
VOID
|
||
BlPositionCursor(
|
||
IN ULONG Column,
|
||
IN ULONG Row
|
||
);
|
||
|
||
VOID
|
||
BlSetInverseMode(
|
||
IN BOOLEAN InverseOn
|
||
);
|
||
|
||
VOID
|
||
BlOutputLoadMessage (
|
||
IN PCHAR DeviceName,
|
||
IN PCHAR FileName,
|
||
IN PTCHAR FileDescription OPTIONAL
|
||
);
|
||
|
||
ULONG
|
||
BlCountLines(
|
||
IN PTCHAR Lines
|
||
);
|
||
|
||
//
|
||
// advanced boot menu prototypes
|
||
//
|
||
|
||
LONG
|
||
BlDoAdvancedBoot(
|
||
IN ULONG MenuTitleId,
|
||
IN LONG DefaultBootOption,
|
||
IN BOOLEAN AutoAdvancedBoot,
|
||
IN UCHAR Timeout
|
||
);
|
||
|
||
PTSTR
|
||
BlGetAdvancedBootDisplayString(
|
||
LONG BootOption
|
||
);
|
||
|
||
PSTR
|
||
BlGetAdvancedBootLoadOptions(
|
||
LONG BootOption
|
||
);
|
||
|
||
VOID
|
||
BlDoAdvancedBootLoadProcessing(
|
||
LONG BootOption
|
||
);
|
||
|
||
ULONG
|
||
BlGetAdvancedBootOption(
|
||
VOID
|
||
);
|
||
|
||
|
||
//
|
||
// Define file structure recognition prototypes.
|
||
//
|
||
|
||
PBL_DEVICE_ENTRY_TABLE
|
||
IsCdfsFileStructure (
|
||
IN ULONG DeviceId,
|
||
IN PVOID StructureContext
|
||
);
|
||
|
||
#ifdef DBLSPACE_LEGAL
|
||
PBL_DEVICE_ENTRY_TABLE
|
||
IsDblsFileStructure (
|
||
IN ULONG DeviceId,
|
||
IN PVOID StructureContext
|
||
);
|
||
#endif
|
||
|
||
PBL_DEVICE_ENTRY_TABLE
|
||
IsFatFileStructure (
|
||
IN ULONG DeviceId,
|
||
IN PVOID StructureContext
|
||
);
|
||
|
||
PBL_DEVICE_ENTRY_TABLE
|
||
IsHpfsFileStructure (
|
||
IN ULONG DeviceId,
|
||
IN PVOID StructureContext
|
||
);
|
||
|
||
PBL_DEVICE_ENTRY_TABLE
|
||
IsNtfsFileStructure (
|
||
IN ULONG DeviceId,
|
||
IN PVOID StructureContext
|
||
);
|
||
|
||
#if defined(ELTORITO)
|
||
PBL_DEVICE_ENTRY_TABLE
|
||
IsEtfsFileStructure (
|
||
IN ULONG DeviceId,
|
||
IN PVOID StructureContext
|
||
);
|
||
#endif
|
||
|
||
PBL_DEVICE_ENTRY_TABLE
|
||
IsNetFileStructure (
|
||
IN ULONG DeviceId,
|
||
IN PVOID StructureContext
|
||
);
|
||
|
||
//
|
||
// Define registry prototypes
|
||
//
|
||
|
||
ARC_STATUS
|
||
BlLoadSystemHive(
|
||
IN ULONG DeviceId,
|
||
IN PCHAR DeviceName,
|
||
IN PCHAR DirectoryPath,
|
||
IN PCHAR HiveName
|
||
);
|
||
|
||
ARC_STATUS
|
||
BlLoadSystemHiveLog(
|
||
IN ULONG DeviceId,
|
||
IN PCHAR DeviceName,
|
||
IN PCHAR DirectoryPath,
|
||
IN PCHAR HiveName,
|
||
OUT PULONG_PTR LogData
|
||
);
|
||
|
||
ARC_STATUS
|
||
BlLoadAndScanSystemHive(
|
||
IN ULONG DeviceId,
|
||
IN PCHAR DeviceName,
|
||
IN PCHAR DirectoryPath,
|
||
IN PWSTR BootFileSystem,
|
||
IN OUT BOOLEAN *LastKnownGoodBoot,
|
||
OUT BOOLEAN *ServerHive,
|
||
OUT PCHAR BadFileName
|
||
);
|
||
|
||
ARC_STATUS
|
||
BlLoadAndInitSystemHive(
|
||
IN ULONG DeviceId,
|
||
IN PCHAR DeviceName,
|
||
IN PCHAR DirectoryPath,
|
||
IN PCHAR HiveName,
|
||
IN BOOLEAN IsAlternate,
|
||
OUT PBOOLEAN RestartSetup,
|
||
OUT PBOOLEAN LogPresent
|
||
);
|
||
|
||
ARC_STATUS
|
||
BlLoadBootDrivers(
|
||
IN PPATH_SET DefaultPathSet,
|
||
IN PLIST_ENTRY BootDriverListHead,
|
||
OUT PCHAR BadFileName
|
||
);
|
||
|
||
PTCHAR
|
||
BlScanRegistry(
|
||
IN PWSTR BootFileSystemPath,
|
||
IN OUT BOOLEAN *LastKnownGoodBoot,
|
||
OUT PLIST_ENTRY BootDriverListHead,
|
||
OUT PUNICODE_STRING AnsiCodepage,
|
||
OUT PUNICODE_STRING OemCodepage,
|
||
OUT PUNICODE_STRING LanguageTable,
|
||
OUT PUNICODE_STRING OemHalFont,
|
||
#ifdef _WANT_MACHINE_IDENTIFICATION
|
||
OUT PUNICODE_STRING Biosinfo,
|
||
#endif
|
||
OUT PSETUP_LOADER_BLOCK SetupLoaderBlock,
|
||
OUT BOOLEAN *ServerHive
|
||
);
|
||
|
||
ARC_STATUS
|
||
BlAddToBootDriverList(
|
||
IN PLIST_ENTRY BootDriverListHead,
|
||
IN PWSTR DriverName,
|
||
IN PWSTR Name,
|
||
IN PWSTR Group,
|
||
IN ULONG Tag,
|
||
IN ULONG ErrorControl,
|
||
IN BOOLEAN InsertAtHead
|
||
);
|
||
|
||
//
|
||
// Define hibernation prototypes
|
||
//
|
||
|
||
ULONG
|
||
BlHiberRestore (
|
||
IN ULONG DriveId,
|
||
OUT OPTIONAL PCHAR *BadLinkName
|
||
);
|
||
|
||
VOID
|
||
HbAllocatePtes (
|
||
IN ULONG NumberPages,
|
||
OUT PVOID *PteAddress,
|
||
OUT PVOID *MappedAddress
|
||
);
|
||
|
||
VOID
|
||
HbInitRemap (
|
||
PPFN_NUMBER FreeList
|
||
);
|
||
|
||
PVOID
|
||
HbMapPte (
|
||
IN ULONG PteToMap,
|
||
IN PFN_NUMBER Page
|
||
);
|
||
|
||
PVOID
|
||
HbNextSharedPage (
|
||
IN ULONG PteToMap,
|
||
IN PFN_NUMBER RealPage
|
||
);
|
||
|
||
VOID
|
||
HbSetPte (
|
||
IN PVOID Va,
|
||
IN PHARDWARE_PTE Pte,
|
||
IN ULONG Index,
|
||
IN ULONG PageNumber
|
||
);
|
||
|
||
ULONG
|
||
HbPageDisposition (
|
||
IN PFN_NUMBER Page
|
||
);
|
||
|
||
#define HbPageNotInUse 0
|
||
#define HbPageInUseByLoader 1
|
||
#define HbPageInvalid 2
|
||
|
||
|
||
VOID
|
||
HiberSetupForWakeDispatch (
|
||
VOID
|
||
);
|
||
|
||
typedef
|
||
VOID
|
||
(*PHIBER_WAKE_DISPATCH)(
|
||
VOID
|
||
);
|
||
|
||
|
||
//
|
||
// PTEs reserved for hiberfile (one set used while in
|
||
// the loader, and another set provided in the kernels
|
||
// memory image)
|
||
//
|
||
|
||
#define PTE_SOURCE 0 // Attention! These defines and
|
||
#define PTE_DEST 1 // equates in ntos\boot\lib\i386\wakea.asm
|
||
#define PTE_MAP_PAGE 2 // must be the same !!!
|
||
#define PTE_REMAP_PAGE 3
|
||
#define PTE_HIBER_CONTEXT 4
|
||
#define PTE_TRANSFER_PDE 5
|
||
#define PTE_WAKE_PTE 6
|
||
#define PTE_DISPATCHER_START 7
|
||
#define PTE_DISPATCHER_END 8
|
||
#define PTE_XPRESS_DEST_FIRST 9
|
||
#define PTE_XPRESS_DEST_LAST (PTE_XPRESS_DEST_FIRST + XPRESS_MAX_PAGES)
|
||
|
||
|
||
// Attention: should be the same as POP_MAX_MDL_SIZE in ntos\po\pop.h !!!
|
||
#define HIBER_PTES (16 + XPRESS_MAX_PAGES)
|
||
|
||
extern PUCHAR HiberBuffer;
|
||
extern PVOID HiberPtes;
|
||
extern PUCHAR HiberVa;
|
||
extern PVOID HiberIdentityVa;
|
||
extern ULONG HiberPageFrames[HIBER_PTES];
|
||
|
||
|
||
//
|
||
// Define routines for secrets.
|
||
//
|
||
|
||
#define SECPKG_CRED_OWF_PASSWORD 0x00000010
|
||
|
||
#if defined(REMOTE_BOOT)
|
||
ARC_STATUS
|
||
BlOpenRawDisk(
|
||
PULONG FileId
|
||
);
|
||
|
||
ARC_STATUS
|
||
BlCloseRawDisk(
|
||
ULONG FileId
|
||
);
|
||
|
||
ARC_STATUS
|
||
BlCheckForFreeSectors (
|
||
ULONG FileId
|
||
);
|
||
|
||
ARC_STATUS
|
||
BlReadSecret(
|
||
ULONG FileId,
|
||
PRI_SECRET Secret
|
||
);
|
||
|
||
ARC_STATUS
|
||
BlWriteSecret(
|
||
ULONG FileId,
|
||
PRI_SECRET Secret
|
||
);
|
||
#endif // defined(REMOTE_BOOT)
|
||
|
||
VOID
|
||
BlInitializeSecret(
|
||
IN PUCHAR Domain,
|
||
IN PUCHAR User,
|
||
IN PUCHAR LmOwfPassword1,
|
||
IN PUCHAR NtOwfPassword1,
|
||
#if defined(REMOTE_BOOT)
|
||
IN PUCHAR LmOwfPassword2 OPTIONAL,
|
||
IN PUCHAR NtOwfPassword2 OPTIONAL,
|
||
#endif // defined(REMOTE_BOOT)
|
||
IN PUCHAR Sid,
|
||
IN OUT PRI_SECRET Secret
|
||
);
|
||
|
||
#if defined(REMOTE_BOOT_SECURITY)
|
||
VOID
|
||
BlParseSecret(
|
||
IN OUT PUCHAR Domain,
|
||
IN OUT PUCHAR User,
|
||
IN OUT PUCHAR LmOwfPassword1,
|
||
IN OUT PUCHAR NtOwfPassword1,
|
||
IN OUT PUCHAR LmOwfPassword2,
|
||
IN OUT PUCHAR NtOwfPassword2,
|
||
IN OUT PUCHAR Sid,
|
||
IN PRI_SECRET Secret
|
||
);
|
||
#endif // defined(REMOTE_BOOT_SECURITY)
|
||
|
||
VOID
|
||
BlOwfPassword(
|
||
IN PUCHAR Password,
|
||
IN PUNICODE_STRING UnicodePassword,
|
||
IN OUT PUCHAR LmOwfPassword,
|
||
IN OUT PUCHAR NtOwfPassword
|
||
);
|
||
|
||
|
||
//
|
||
// Define external references.
|
||
//
|
||
|
||
extern ULONG BlConsoleOutDeviceId;
|
||
extern ULONG BlConsoleInDeviceId;
|
||
extern ULONG BlDcacheFillSize;
|
||
extern ULONG_PTR BlHeapFree;
|
||
extern ULONG_PTR BlHeapLimit;
|
||
extern PLOADER_PARAMETER_BLOCK BlLoaderBlock;
|
||
extern ULONG DbcsLangId;
|
||
extern BOOLEAN BlRebootSystem;
|
||
extern ULONG BlVirtualBias;
|
||
extern BOOLEAN BlBootingFromNet;
|
||
extern BOOLEAN BlUsePae;
|
||
extern BOOLEAN BlOldKernel;
|
||
extern BOOLEAN BlKernelChecked;
|
||
extern BOOLEAN BlRestoring;
|
||
|
||
#if defined(_ALPHA_) || defined(_IA64_)
|
||
|
||
extern ULONG HiberNoMappings;
|
||
extern ULONG HiberFirstRemap;
|
||
extern ULONG HiberLastRemap;
|
||
extern BOOLEAN HiberOutOfRemap;
|
||
extern BOOLEAN HiberIoError;
|
||
|
||
#endif
|
||
//
|
||
// Special linker-defined symbols. osloader_EXPORTS is the RVA of the
|
||
// export table in the osloader.exe image.
|
||
// header is the base address of the osloader image.
|
||
//
|
||
// This allows the OsLoader to export entry points for SCSI miniport drivers.
|
||
//
|
||
|
||
#if defined(_X86_)
|
||
|
||
extern ULONG OsLoaderBase;
|
||
extern ULONG OsLoaderExports;
|
||
|
||
#endif
|
||
|
||
#if defined(_IA64_)
|
||
|
||
extern LONG_PTR OsLoaderBase;
|
||
extern LONG_PTR OsLoaderExports;
|
||
|
||
#endif
|
||
|
||
//
|
||
// Routine to get graphics characters.
|
||
//
|
||
|
||
typedef enum {
|
||
GraphicsCharDoubleRightDoubleDown = 0,
|
||
GraphicsCharDoubleLeftDoubleDown,
|
||
GraphicsCharDoubleRightDoubleUp,
|
||
GraphicsCharDoubleLeftDoubleUp,
|
||
GraphicsCharDoubleVertical,
|
||
GraphicsCharDoubleHorizontal,
|
||
#ifdef EFI
|
||
GraphicsCharFullBlock,
|
||
GraphicsCharLightShade,
|
||
#endif
|
||
GraphicsCharMax
|
||
} GraphicsChar;
|
||
|
||
_TUCHAR
|
||
GetGraphicsChar(
|
||
IN GraphicsChar WhichOne
|
||
);
|
||
|
||
_TUCHAR
|
||
TextGetGraphicsCharacter(
|
||
IN GraphicsChar WhichOne
|
||
);
|
||
|
||
//
|
||
// Control sequence introducer.
|
||
//
|
||
// On x86 machines the loaders support dbcs and so using
|
||
// 0x9b for output is no good (that value is a dbcs lead byte
|
||
// in several codepages). Escape-leftbracket is a synonym for CSI
|
||
// in the emulated ARC console on x86 (and on many ARC machines too
|
||
// but since we can't be sure all the machines out there support
|
||
// this we use the old-style csi on non-x86).
|
||
//
|
||
// We ignore this issue for characters read from the ARC console
|
||
// since we don't ask for any text to be typed in, just arrow keys,
|
||
// escape, F#, enter, etc.
|
||
//
|
||
|
||
#define ASCI_CSI_IN 0x9b
|
||
#if defined(_X86_) || defined(_IA64_)
|
||
#define ASCI_CSI_OUT TEXT("\033[") // escape-leftbracket
|
||
#else
|
||
#define ASCI_CSI_OUT TEXT("\233") // 0x9b
|
||
#endif
|
||
|
||
//
|
||
// Define OS/2 executable resource information structure.
|
||
//
|
||
|
||
#define FONT_DIRECTORY 0x8007
|
||
#define FONT_RESOURCE 0x8008
|
||
|
||
typedef struct _RESOURCE_TYPE_INFORMATION {
|
||
USHORT Ident;
|
||
USHORT Number;
|
||
LONG Proc;
|
||
} RESOURCE_TYPE_INFORMATION, *PRESOURCE_TYPE_INFORMATION;
|
||
|
||
//
|
||
// Define OS/2 executable resource name information structure.
|
||
//
|
||
|
||
typedef struct _RESOURCE_NAME_INFORMATION {
|
||
USHORT Offset;
|
||
USHORT Length;
|
||
USHORT Flags;
|
||
USHORT Ident;
|
||
USHORT Handle;
|
||
USHORT Usage;
|
||
} RESOURCE_NAME_INFORMATION, *PRESOURCE_NAME_INFORMATION;
|
||
|
||
//
|
||
// Support for reading compressed files directly (single-file MS-ZIP cabinets)
|
||
//
|
||
VOID
|
||
DecompEnableDecompression(
|
||
IN BOOLEAN Enable
|
||
);
|
||
|
||
ULONG
|
||
DecompPrepareToReadCompressedFile(
|
||
IN LPCSTR Filename,
|
||
IN ULONG FileId
|
||
);
|
||
|
||
BOOLEAN
|
||
DecompGenerateCompressedName(
|
||
IN LPCSTR Filename,
|
||
OUT LPSTR CompressedName
|
||
);
|
||
|
||
//
|
||
// Define debug logging macros and functions.
|
||
//
|
||
|
||
#if !DBG && !BLLOGENABLED
|
||
|
||
#define BlLogInitialize(_x_)
|
||
#define BlLogTerminate()
|
||
#define BlLog(_x_)
|
||
#define BlLogArcDescriptors(_x_)
|
||
#define BlLogMemoryDescriptors(_x_)
|
||
#define BlLogWaitForKeystroke()
|
||
|
||
#else
|
||
|
||
VOID
|
||
BlLogInitialize (
|
||
IN ULONG LogfileDeviceId
|
||
);
|
||
|
||
VOID
|
||
BlLogTerminate (
|
||
VOID
|
||
);
|
||
|
||
#define BlLog(_x_) BlLogPrint _x_
|
||
|
||
#define LOG_DISPLAY 0x0001
|
||
#define LOG_LOGFILE 0x0002
|
||
#define LOG_DEBUGGER 0x0004
|
||
#define LOG_WAIT 0x8000
|
||
#define LOG_ALL (LOG_DISPLAY | LOG_LOGFILE | LOG_DEBUGGER)
|
||
#define LOG_ALL_W (LOG_ALL | LOG_WAIT)
|
||
|
||
VOID
|
||
BlLogPrint (
|
||
ULONG Targets,
|
||
PCHAR Format,
|
||
...
|
||
);
|
||
|
||
VOID
|
||
BlLogArcDescriptors (
|
||
ULONG Targets
|
||
);
|
||
|
||
VOID
|
||
BlLogMemoryDescriptors (
|
||
ULONG Targets
|
||
);
|
||
|
||
VOID
|
||
BlLogWaitForKeystroke (
|
||
VOID
|
||
);
|
||
|
||
#endif // DBG
|
||
|
||
VOID
|
||
BlWaitForReboot (
|
||
VOID
|
||
);
|
||
|
||
//
|
||
// Machine identification related functions.
|
||
//
|
||
|
||
#ifdef _WANT_MACHINE_IDENTIFICATION
|
||
|
||
#define BlLoadBiosinfoInf(id,n,d,f,i,is,bn) BlLoadFileImage(id,n,d,f,LoaderRegistryData,i,is,bn)
|
||
|
||
#endif
|
||
|
||
#define BlLoadDrvDB(id,n,d,f,i,is,bn) BlLoadFileImage(id,n,d,f,LoaderRegistryData,i,is,bn)
|
||
|
||
ARC_STATUS
|
||
BlLoadFileImage(
|
||
IN ULONG DeviceId,
|
||
IN PCHAR DeviceName,
|
||
IN PCHAR Directory,
|
||
IN PUNICODE_STRING FileName,
|
||
IN TYPE_OF_MEMORY MemoryType,
|
||
OUT PVOID *Image,
|
||
OUT PULONG ImageSize,
|
||
OUT PCHAR BadFileName
|
||
);
|
||
|
||
#if defined(_X86_)
|
||
BOOLEAN
|
||
BlFindDiskSignature(
|
||
IN PCHAR DiskName,
|
||
IN PARC_DISK_SIGNATURE Signature
|
||
);
|
||
|
||
VOID
|
||
AETerminateIo(
|
||
VOID
|
||
);
|
||
|
||
BOOLEAN
|
||
BlDetectLegacyFreeBios(
|
||
VOID
|
||
);
|
||
|
||
#endif
|
||
|
||
//
|
||
//
|
||
// N.B. We can speed up the boot time, by not
|
||
// querying the device for all the possible file systems
|
||
// for every open call. This saves approximately 30 secs
|
||
// on CD-ROM / DVD-ROM boot time. To disable this feature
|
||
// just undef CACHE_DEVINFO below
|
||
//
|
||
//
|
||
#define CACHE_DEVINFO 1
|
||
|
||
#ifdef CACHE_DEVINFO
|
||
|
||
//
|
||
// NB: make sure that the arc close now invalidates the
|
||
// device to filesystem cache entry
|
||
//
|
||
#ifdef ArcClose
|
||
|
||
ARC_STATUS
|
||
ArcCacheClose(
|
||
IN ULONG DeviceId
|
||
);
|
||
|
||
//
|
||
// Redefine the arc close
|
||
//
|
||
#undef ArcClose
|
||
#define ArcClose(_x) ArcCacheClose(_x)
|
||
|
||
|
||
//
|
||
// File system cache clearing hook
|
||
//
|
||
typedef
|
||
VOID
|
||
(*PARC_DEVICE_CLOSE_NOTIFICATION) (
|
||
IN ULONG DeviceId
|
||
);
|
||
|
||
//
|
||
// Maximum entities which can register for device close
|
||
// notification
|
||
//
|
||
#define MAX_DEVICE_CLOSE_NOTIFICATION_SIZE 5
|
||
|
||
extern PARC_DEVICE_CLOSE_NOTIFICATION
|
||
DeviceCloseNotify[MAX_DEVICE_CLOSE_NOTIFICATION_SIZE];
|
||
|
||
ARC_STATUS
|
||
ArcRegisterForDeviceClose(
|
||
PARC_DEVICE_CLOSE_NOTIFICATION FlushRoutine
|
||
);
|
||
|
||
ARC_STATUS
|
||
ArcDeRegisterForDeviceClose(
|
||
PARC_DEVICE_CLOSE_NOTIFICATION FlushRoutine
|
||
);
|
||
|
||
#endif //ArcClose
|
||
|
||
#endif // CACHE_DEVINFO
|
||
|
||
|
||
//
|
||
// progress bar functions
|
||
// (in blload.c)
|
||
//
|
||
VOID
|
||
BlUpdateBootStatus(
|
||
VOID
|
||
);
|
||
|
||
VOID
|
||
BlRedrawProgressBar(
|
||
VOID
|
||
);
|
||
|
||
VOID
|
||
BlUpdateProgressBar(
|
||
ULONG fPercentage
|
||
);
|
||
|
||
VOID
|
||
BlOutputStartupMsg(
|
||
ULONG uMsgID
|
||
);
|
||
|
||
VOID
|
||
BlOutputStartupMsgStr(
|
||
PCTSTR MsgStr
|
||
);
|
||
|
||
VOID
|
||
BlOutputTrailerMsg(
|
||
ULONG uMsgID
|
||
);
|
||
|
||
VOID
|
||
BlOutputTrailerMsgStr(
|
||
PCTSTR MsgStr
|
||
);
|
||
|
||
VOID
|
||
BlSetProgBarCharacteristics(
|
||
IN ULONG FrontCharMsgID,
|
||
IN ULONG BackCharMsgID
|
||
);
|
||
|
||
//
|
||
// The following routines are used by the loader to translate signature-based
|
||
// arcnames to scsi-based names.
|
||
//
|
||
|
||
PCONFIGURATION_COMPONENT
|
||
ScsiGetFirstConfiguredTargetComponent(
|
||
IN ULONG ScsiNumber
|
||
);
|
||
|
||
PCONFIGURATION_COMPONENT
|
||
ScsiGetNextConfiguredTargetComponent(
|
||
IN PCONFIGURATION_COMPONENT TargetComponent
|
||
);
|
||
|
||
PCONFIGURATION_COMPONENT
|
||
ScsiGetFirstConfiguredLunComponent(
|
||
IN PCONFIGURATION_COMPONENT TargetComponent
|
||
);
|
||
|
||
PCONFIGURATION_COMPONENT
|
||
ScsiGetNextConfiguredLunComponent(
|
||
IN PCONFIGURATION_COMPONENT LunComponent
|
||
);
|
||
|
||
BOOLEAN
|
||
ScsiGetDevicePath(
|
||
IN ULONG ScsiNumber,
|
||
IN PCONFIGURATION_COMPONENT TargetComponent,
|
||
IN PCONFIGURATION_COMPONENT LunComponent,
|
||
OUT PCHAR DevicePath
|
||
);
|
||
|
||
//
|
||
// Boot Status Data support functions.
|
||
//
|
||
|
||
ULONG
|
||
BlGetLastBootStatus(
|
||
IN PVOID DataHandle,
|
||
OUT BSD_LAST_BOOT_STATUS *LastBootStatus
|
||
);
|
||
|
||
VOID
|
||
BlAutoAdvancedBoot(
|
||
IN OUT PCHAR *LoadOptions,
|
||
IN BSD_LAST_BOOT_STATUS LastBootStatus,
|
||
IN ULONG AdvancedMode
|
||
);
|
||
|
||
VOID
|
||
BlWriteBootStatusFlags(
|
||
IN ULONG SystemPartitionId,
|
||
IN PUCHAR SystemDirectory,
|
||
IN BOOLEAN LastBootGood,
|
||
IN BOOLEAN LastBootShutdown
|
||
);
|
||
|
||
ARC_STATUS
|
||
BlLockBootStatusData(
|
||
IN ULONG SystemPartitionId,
|
||
IN PCHAR SystemPartition,
|
||
IN PCHAR SystemDirectory,
|
||
OUT PVOID *DataHandle
|
||
);
|
||
|
||
ARC_STATUS
|
||
BlGetSetBootStatusData(
|
||
IN PVOID DataHandle,
|
||
IN BOOLEAN Get,
|
||
IN RTL_BSD_ITEM_TYPE DataItem,
|
||
IN PVOID DataBuffer,
|
||
IN ULONG DataBufferLength,
|
||
OUT PULONG BytesReturned OPTIONAL
|
||
);
|
||
|
||
VOID
|
||
BlUnlockBootStatusData(
|
||
IN PVOID DataHandle
|
||
);
|
||
|
||
#if defined(_IA64_) || defined(_X86_)
|
||
|
||
#define EFI_PARTITION_SUPPORT 1
|
||
|
||
#endif
|
||
|
||
#if defined(_IA64_)
|
||
extern BOOLEAN BlUsePrivateDescriptor;
|
||
#endif
|
||
|
||
//
|
||
// Boot Flags. These are passed from the startup module (startup.com,
|
||
// startrom.com or any of the other flavors) to NTLDR. NTDLR will use
|
||
// this flag to control different boot options, such as, whether
|
||
// to reboot on an NTDLR failure.
|
||
//
|
||
|
||
// upon any startup / ntldr failures the machine will reboot
|
||
// instead of waiting for a key press
|
||
#define BOOTFLAG_REBOOT_ON_FAILURE 0x000000001
|
||
|
||
#endif // _BLDR_
|