Leaked source code of windows server 2003
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.
 
 
 
 
 
 

1880 lines
36 KiB

/*++
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
#pragma warning(disable:4200) // unsized array
//
// 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 ICEBP __asm { __emit 0xf1 }
//
// Things related to Amd64 support follow
//
#define TARGET_IMAGE ((BlAmd64UseLongMode == FALSE) ? \
IMAGE_FILE_MACHINE_I386 : IMAGE_FILE_MACHINE_AMD64)
ARC_STATUS
BlAmd64CheckForLongMode(
IN ULONG LoadDeviceId,
IN OUT PCHAR KernelPath,
IN PCHAR KernelFileName
);
//
// BlUseAmd64Longmode is set when we have made the decision to use long
// mode.
//
extern BOOLEAN BlAmd64UseLongMode;
#else
#define BlAmd64UseLongMode FALSE
#endif // _X86_
#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.
//
#if DBG
#define BL_HEAP_PAGES 32
#else
#define BL_HEAP_PAGES 16
#endif
#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)))
//
// Define kernel names right here.
// We'll use these when we're trying to figure out
// which kernel to load (see BlDetectHalAndKernel).
//
#define LEGACY_KERNEL_NAME "ntoskrnl.exe"
#define UP_KERNEL_NAME "ntkrnlup.exe"
#define MP_KERNEL_NAME "ntkrnlmp.exe"
#define UP_PAE_KERNEL_NAME "ntkrnlpa.exe"
#define MP_PAE_KERNEL_NAME "ntkrpamp.exe"
//
// Define various memory page boundaries
//
#define _1MB ((1*1024*1024) >> PAGE_SHIFT)
#define _4MB (4 * _1MB)
#define _8MB (8 * _1MB)
#define _12MB (12 * _1MB)
#define _16MB (16 * _1MB)
#define _24MB (24 * _1MB)
#define _32MB (32 * _1MB)
#define _48MB (48 * _1MB)
#define _64MB (64 * _1MB)
#define _80MB (80 * _1MB)
#define _96MB (96 * _1MB)
#define _128MB (128 * _1MB)
#define _256MB (256 * _1MB)
#define _512MB (512 * _1MB)
#define _1024MB (1024 * _1MB)
#define _2048MB (2048 * _1MB)
#define _4096MB (4096 * _1MB)
//
// 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
// macros to help check overflow issues
//
#define TRUNCATE_SIZE_AT_VALUE(_sz, _vl) (( _sz > _vl ) ? _vl : _sz)
#define RESET_SIZE_AT_VALUE(_sz, _vl) (( _sz > _vl ) ? 0 : _sz)
#define TRUNCATE_SIZE_AT_UCHAR_MAX(_sz) ((UCHAR) TRUNCATE_SIZE_AT_VALUE(_sz, (UCHAR)-1))
#define RESET_SIZE_AT_UCHAR_MAX(_sz) ((UCHAR) RESET_SIZE_AT_VALUE(_sz, (UCHAR)-1))
#define TRUNCATE_SIZE_AT_USHORT_MAX(_sz) ((USHORT) TRUNCATE_SIZE_AT_VALUE(_sz, (USHORT)-1))
#define RESET_SIZE_AT_USHORT_MAX(_sz) ((USHORT) RESET_SIZE_AT_VALUE(_sz, (USHORT)-1))
#define TRUNCATE_SIZE_AT_ULONG_MAX(_sz) ((ULONG) TRUNCATE_SIZE_AT_VALUE(_sz, (ULONG)-1))
#define RESET_SIZE_AT_ULONG_MAX(_sz) ((ULONG) RESET_SIZE_AT_VALUE(_sz, (ULONG)-1))
#define BL_INVALID_FILE_ID (ULONG)-1
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 transfer entry of loaded image.
//
typedef
VOID
(*PTRANSFER_ROUTINE) (
PLOADER_PARAMETER_BLOCK LoaderBlock
);
//
// 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
);
VOID
BlTransferToKernel(
PTRANSFER_ROUTINE SystemEntry,
PLOADER_PARAMETER_BLOCK BlLoaderBlock
);
#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;
#if defined(_X86_)
extern ULONG BlUsableLimitX86;
extern ULONG BlUsableLimitAmd64;
#define BlUsableLimit (*(BlAmd64UseLongMode ? &BlUsableLimitAmd64 : &BlUsableLimitX86))
#else
extern ULONG BlUsableLimit;
#endif
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
);
ARC_STATUS
BlAllocateFirmwareTableEntry (
IN PCHAR BaseDllName,
IN PCHAR FullDllName,
IN PVOID ImageHeader,
IN ULONG Size,
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)
#define BlpFixOSMapping(_page,_npages) MempFixMapping ( _page, _npages )
#else
#define BlpCheckMapping(_page,_npages) ESUCCESS
#define BlpFixOSMapping(_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
);
VOID
BlTruncateDescriptors (
IN ULONG HighestPage
);
PVOID
BlAllocateHeapAligned (
IN ULONG Size
);
PVOID
BlAllocateHeap (
IN ULONG Size
);
BOOLEAN
BlAmd64Setup (
IN PCHAR SetupDevice
);
ULONG
BlAmd64FieldOffset_PO_MEMORY_IMAGE(
ULONG offset32
);
ULONG
BlAmd64FieldOffset_PO_MEMORY_RANGE_ARRAY_LINK(
ULONG offset32
);
ULONG
BlAmd64FieldOffset_PO_MEMORY_RANGE_ARRAY_RANGE(
ULONG offset32
);
ULONG
BlAmd64ElementOffset_PO_MEMORY_RANGE_ARRAY_LINK(
ULONG index
);
ULONG
BlAmd64ElementOffset_PO_MEMORY_RANGE_ARRAY_RANGE(
ULONG index
);
VOID
BlCheckForAmd64Image(
PPO_MEMORY_IMAGE MemImage
);
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
MempFixMapping(
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 ULONG64 HiberIdentityVaAmd64;
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 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_