windows-nt/Source/XPSP1/NT/base/boot/setup/setupldr.h
2020-09-26 16:20:57 +08:00

781 lines
14 KiB
C
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*++
Copyright (c) 1992 Microsoft Corporation
Module Name:
setupldr.h
Abstract:
Common header file for the setupldr module
Author:
John Vert (jvert) 6-Oct-1993
Environment:
ARC environment
Revision History:
--*/
#include "bldr.h"
#include "haldtect.h"
#include "setupblk.h"
#include "msgs.h"
#include "stdio.h"
#include "stdarg.h"
//
// OEM source device types
//
#define SL_OEM_SOURCE_DEVICE_TYPE_LOCAL 0x00008000
#define SL_OEM_SOURCE_DEVICE_TYPE_REMOVABLE 0x00000001
#define SL_OEM_SOURCE_DEVICE_TYPE_FIXED 0x00000002
#define SL_OEM_SOURCE_DEVICE_TYPE_PREINSTALL 0x10000000
#define SL_OEM_SOURCE_DEVICE_TYPE_DYN_UPDATE 0x20000000
#define SL_OEM_SOURCE_DEVICE_TYPE_VIRTUAL 0x40000000
#define SL_OEM_SOURCE_DEVICE_TYPE_REMOTE 0x80000000
//
// OEM source device media states
//
#define SL_OEM_SOURCE_MEDIA_ABSENT 0x00000001
#define SL_OEM_SOURCE_MEDIA_NO_DRIVERS 0x00000002
#define SL_OEM_SOURCE_MEDIA_HAS_MSD 0x00000004
#define SL_OEM_SOURCE_MEDIA_HAS_HAL 0x00000008
#define SL_OEM_SOURCE_MEDIA_HAS_DEFAULT 0x20000000
#define SL_OEM_SOURCE_MEDIA_HAS_DRIVERS 0x40000000
#define SL_OEM_SOURCE_MEDIA_PRESENT 0x80000000
//
// OEM source device processing states
//
#define SL_OEM_SOURCE_DEVICE_NOT_PROCESSED 0x00000000
#define SL_OEM_SOURCE_DEVICE_PROCESSED 0x00000001
#define SL_OEM_SOURCE_DEVICE_SKIPPED 0x00000002
#define SL_OEM_SOURCE_DEVICE_SCANNED 0x00000004
#define SL_OEM_SOURCE_DEVICE_HAL_LOADED 0x00000008
#define SL_OEM_SOURCE_DEVICE_MSD_LOADED 0x00000010
#define SL_OEM_SOURCE_DEVICE_DRIVERS_LOADED 0x40000000
#define SL_OEM_SOURCE_DEVICE_PROCESSING 0x80000000
typedef struct _OEM_SOURCE_DEVICE {
CHAR ArcDeviceName[128];
ULONG DeviceType;
ULONG MediaType;
ULONG DeviceState;
ULONG DeviceId;
PVOID InfHandle;
PCSTR DriverDir;
struct _OEM_SOURCE_DEVICE *Next;
} OEM_SOURCE_DEVICE, *POEM_SOURCE_DEVICE;
#define SL_OEM_SOURCE_DEVICE_TYPE(DevicePtr, Type) \
((DevicePtr)->DeviceType & (Type))
#define SL_OEM_SET_SOURCE_DEVICE_TYPE(DevicePtr, Type) \
((DevicePtr)->DeviceType = (Type))
#define SL_OEM_SOURCE_MEDIA_TYPE(DevicePtr, Type) \
((DevicePtr)->MediaType & (Type))
#define SL_OEM_SET_SOURCE_MEDIA_TYPE(DevicePtr, Type) \
((DevicePtr)->MediaType = (Type))
#define SL_OEM_SOURCE_DEVICE_STATE(DevicePtr, Type) \
((DevicePtr)->DeviceState & (Type))
#define SL_OEM_SET_SOURCE_DEVICE_STATE(DevicePtr, Type) \
((DevicePtr)->DeviceState = (Type))
ARC_STATUS
SlInitOemSourceDevices(
IN OUT POEM_SOURCE_DEVICE *OemSourceDevices,
IN OUT POEM_SOURCE_DEVICE *DefaultSourceDevice
);
//
//
// Functions for managing the display
//
//
VOID
SlSetCurrentAttribute(
IN UCHAR Attribute
);
ARC_STATUS
SlWriteString(
IN _PTUCHAR s
);
ARC_STATUS
SlPositionCursor(
IN unsigned x,
IN unsigned y
);
VOID
SlGetCursorPosition(
OUT unsigned *x,
OUT unsigned *y
);
ARC_STATUS
SlClearClientArea(
VOID
);
ARC_STATUS
SlClearToEol(
VOID
);
VOID
SlInitDisplay(
VOID
);
VOID
SlWriteHeaderText(
IN ULONG MsgId
);
VOID
SlSetStatusAttribute(
IN UCHAR Attribute
);
BOOLEAN
SlGetStatusBarStatus(
VOID
);
VOID
SlEnableStatusBar(
IN BOOLEAN Enable
);
VOID
SlWriteStatusText(
IN PTCHAR Text
);
VOID
SlGetStatusText(
OUT PTCHAR Text
);
VOID
SlClearDisplay(
VOID
);
VOID
SlPrint(
IN PTCHAR FormatString,
...
);
VOID
SlConfirmExit(
VOID
);
BOOLEAN
SlPromptForDisk(
IN PTCHAR DiskName,
IN BOOLEAN IsCancellable
);
BOOLEAN
SlGetDisk(
IN PCHAR Filename
);
//
// Menuing support
//
typedef struct _SL_MENU {
ULONG ItemCount;
ULONG Width;
LIST_ENTRY ItemListHead;
} SL_MENU, *PSL_MENU;
typedef struct _SL_MENUITEM {
LIST_ENTRY ListEntry;
PTCHAR Text;
PVOID Data;
ULONG Attributes;
} SL_MENUITEM, *PSL_MENUITEM;
PSL_MENU
SlCreateMenu(
VOID
);
ULONG
SlAddMenuItem(
PSL_MENU Menu,
PTCHAR Text,
PVOID Data,
ULONG Attributes
);
PVOID
SlGetMenuItem(
IN PSL_MENU Menu,
IN ULONG Item
);
ULONG
SlDisplayMenu(
IN ULONG HeaderId,
IN PSL_MENU Menu,
IN OUT PULONG Selection
);
BOOLEAN
SlGetMenuItemIndex(
IN PSL_MENU Menu,
IN PTCHAR Text,
OUT PULONG Index
);
//
// Bullet character and macro to make a beep at the console
//
#ifndef EFI
#define BULLET "*"
#define BEEP { ULONG c; ArcWrite(ARC_CONSOLE_OUTPUT,"",1,&c); }
#if 0
#define BULLET ""
#define BEEP HWCURSOR(0x80000000,0xe07); // int 10 func e, char 7
#endif
#endif
//
// Character attributes used for various purposes.
//
UCHAR
SlGetDefaultAttr(
VOID
);
UCHAR
SlGetDefaultInvAttr(
VOID
);
#define ATT_FG_BLACK 0
#define ATT_FG_RED 1
#define ATT_FG_GREEN 2
#define ATT_FG_YELLOW 3
#define ATT_FG_BLUE 4
#define ATT_FG_MAGENTA 5
#define ATT_FG_CYAN 6
#define ATT_FG_WHITE 7
#define ATT_BG_BLACK (ATT_FG_BLACK << 4)
#define ATT_BG_BLUE (ATT_FG_BLUE << 4)
#define ATT_BG_GREEN (ATT_FG_GREEN << 4)
#define ATT_BG_CYAN (ATT_FG_CYAN << 4)
#define ATT_BG_RED (ATT_FG_RED << 4)
#define ATT_BG_MAGENTA (ATT_FG_MAGENTA << 4)
#define ATT_BG_YELLOW (ATT_FG_YELLOW << 4)
#define ATT_BG_WHITE (ATT_FG_WHITE << 4)
#define ATT_FG_INTENSE 8
#define ATT_BG_INTENSE (ATT_FG_INTENSE << 4)
#define DEFATT SlGetDefaultAttr()
#define INVATT SlGetDefaultInvAttr()
#define DEFIATT (ATT_FG_WHITE | ATT_BG_BLUE | ATT_FG_INTENSE)
// intense red on blue doesn't show up on all monitors.
//#define DEFERRATT (ATT_FG_RED | ATT_BG_BLUE | ATT_FG_INTENSE)
#define DEFERRATT DEFATT
#define DEFSTATTR (ATT_FG_BLACK | ATT_BG_WHITE)
#define DEFDLGATT (ATT_FG_RED | ATT_BG_WHITE)
//
// Function to flush keyboard buffer
//
VOID
SlFlushConsoleBuffer(
VOID
);
//
// Function to retrieve a keystroke
//
ULONG
SlGetChar(
VOID
);
//
// Virtualized contants for various keystrokes
//
#define ASCI_BS 8
#define ASCI_CR 13
#define ASCI_LF 10
#define ASCI_ESC 27
#define SL_KEY_UP 0x00010000
#define SL_KEY_DOWN 0x00020000
#define SL_KEY_HOME 0x00030000
#define SL_KEY_END 0x00040000
#define SL_KEY_PAGEUP 0x00050000
#define SL_KEY_PAGEDOWN 0x00060000
#define SL_KEY_F1 0x01000000
#define SL_KEY_F2 0x02000000
#define SL_KEY_F3 0x03000000
#define SL_KEY_F5 0x05000000
#define SL_KEY_F6 0x06000000
#define SL_KEY_F7 0x07000000
#define SL_KEY_F8 0x08000000
#define SL_KEY_F9 0x09000000
#define SL_KEY_F10 0x0A000000
#define SL_KEY_F11 0x0B000000
#define SL_KEY_F12 0x0C000000
//
// Standard error handling functions
//
extern TCHAR MessageBuffer[1024];
VOID
SlFriendlyError(
IN ULONG uStatus,
IN PCHAR pchBadFile,
IN ULONG uLine,
IN PCHAR pchCodeFile
);
ULONG
SlDisplayMessageBox(
IN ULONG MessageId,
...
);
VOID
SlGenericMessageBox(
IN ULONG MessageId, OPTIONAL
IN va_list *args, OPTIONAL
IN PTCHAR Message, OPTIONAL
IN OUT PULONG xLeft, OPTIONAL
IN OUT PULONG yTop, OPTIONAL
OUT PULONG yBottom, OPTIONAL
IN BOOLEAN bCenterMsg
);
VOID
SlMessageBox(
IN ULONG MessageId,
...
);
VOID
SlFatalError(
IN ULONG MessageId,
...
);
//
// Routines for parsing the setupldr.ini file
//
#define SIF_FILENAME_INDEX 0
extern PVOID InfFile;
extern PVOID WinntSifHandle;
ARC_STATUS
SlInitIniFile(
IN PCHAR DevicePath,
IN ULONG DeviceId,
IN PCHAR INFFile,
OUT PVOID *pINFHandle,
OUT PVOID *pINFBuffer OPTIONAL,
OUT PULONG INFBufferSize OPTIONAL,
OUT PULONG ErrorLine
);
PCHAR
SlGetIniValue(
IN PVOID InfHandle,
IN PCHAR SectionName,
IN PCHAR KeyName,
IN PCHAR Default
);
PCHAR
SlGetKeyName(
IN PVOID INFHandle,
IN PCHAR SectionName,
IN ULONG LineIndex
);
ULONG
SlGetSectionKeyOrdinal(
IN PVOID INFHandle,
IN PCHAR SectionName,
IN PCHAR Key
);
PCHAR
SlGetSectionKeyIndex (
IN PVOID INFHandle,
IN PCHAR SectionName,
IN PCHAR Key,
IN ULONG ValueIndex
);
PCHAR
SlCopyStringA(
IN PCSTR String
);
PTCHAR
SlCopyString(
IN PTCHAR String
);
PCHAR
SlGetSectionLineIndex (
IN PVOID INFHandle,
IN PCHAR SectionName,
IN ULONG LineIndex,
IN ULONG ValueIndex
);
ULONG
SlCountLinesInSection(
IN PVOID INFHandle,
IN PCHAR SectionName
);
BOOLEAN
SpSearchINFSection (
IN PVOID INFHandle,
IN PCHAR SectionName
);
PCHAR
SlSearchSection(
IN PCHAR SectionName,
IN PCHAR TargetName
);
//
// functions for querying the ARC configuration tree
//
typedef
BOOLEAN
(*PNODE_CALLBACK)(
IN PCONFIGURATION_COMPONENT_DATA FoundComponent
);
BOOLEAN
SlSearchConfigTree(
IN PCONFIGURATION_COMPONENT_DATA Node,
IN CONFIGURATION_CLASS Class,
IN CONFIGURATION_TYPE Type,
IN ULONG Key,
IN PNODE_CALLBACK CallbackRoutine
);
BOOLEAN
SlFindFloppy(
IN ULONG FloppyNumber,
OUT PCHAR ArcName
);
//
// Routines for detecting various hardware
//
VOID
SlDetectScsi(
IN PSETUP_LOADER_BLOCK SetupBlock
);
VOID
SlDetectVideo(
IN PSETUP_LOADER_BLOCK SetupBlock
);
//
// Routines for dealing with OEM disks.
//
extern BOOLEAN PromptOemHal;
extern BOOLEAN PromptOemScsi;
extern BOOLEAN PromptOemVideo;
//
// Variable indicating whether we are booting into
// WinPE (aka MiniNT) or not
//
extern BOOLEAN WinPEBoot;
typedef struct _OEMSCSIINFO {
struct _OEMSCSIINFO *Next;
//
// Address where the SCSI driver was loaded
//
PVOID ScsiBase;
//
// Name of the SCSI driver
//
PCHAR ScsiName;
} OEMSCSIINFO, *POEMSCSIINFO;
VOID
SlPromptOemVideo(
IN POEM_SOURCE_DEVICE VideoSourceDevice,
IN BOOLEAN AllowUserSelection,
OUT PVOID *VideoBase,
OUT PCHAR *VideoName
);
VOID
SlPromptOemHal(
IN POEM_SOURCE_DEVICE HalSourceDevice,
IN BOOLEAN AllowUserSelection,
OUT PVOID *HalBase,
OUT PCHAR *ImageName
);
VOID
SlPromptOemScsi(
IN POEM_SOURCE_DEVICE ScsiSourceDevice,
IN BOOLEAN AllowUserSelection,
OUT POEMSCSIINFO *pOemScsiInfo
);
BOOLEAN
SlLoadOemScsiDriversUnattended(
IN POEM_SOURCE_DEVICE OemSourceDevice,
IN PVOID InfHandle,
IN PCHAR ParamsSectionName,
IN PCHAR RootDirKeyName,
IN PCHAR BootDriversKeyName,
IN POEMSCSIINFO* ScsiInfo,
OUT PPNP_HARDWARE_ID* HardwareIdDatabase
);
#if defined(_X86_) || defined(_IA64_)
VOID
BlInitializeTerminal(
VOID
);
#endif
//
// Routine to find the ARC name of a floppy
//
BOOLEAN
SlpFindFloppy(
IN ULONG Number,
OUT PCHAR ArcName
);
//
// Are all the floppies only removable ATAPI super floppies
//
BOOLEAN
SlpIsOnlySuperFloppy(
void
);
//
// Enums for controlling setupldr process
//
typedef enum _SETUP_TYPE {
SetupInteractive,
SetupRepair,
SetupCustom,
SetupUpgrade,
SetupExpress
} SETUP_TYPE;
typedef enum _MEDIA_TYPE {
MediaInteractive,
MediaFloppy,
MediaCdRom,
MediaDisk
} MEDIA_TYPE;
//
// Enum for status of inserting a new SCSI device
//
typedef enum _SCSI_INSERT_STATUS {
ScsiInsertError,
ScsiInsertNewEntry,
ScsiInsertExisting
} SCSI_INSERT_STATUS;
//
// Routine to insert a DETECTED_DEVICE into its
// correct position in the ScsiDevices linked list.
//
SCSI_INSERT_STATUS
SlInsertScsiDevice(
IN ULONG Ordinal,
OUT PDETECTED_DEVICE *pScsiDevice
);
BOOLEAN
SlRemoveInboxDriver(
IN PCHAR DriverToRemove
);
PDETECTED_DEVICE
SlCheckForInboxDriver(
IN PCHAR DriverToCheck
);
BOOLEAN
SlConfirmInboxDriverReplacement(
IN PTCHAR DriverName,
IN PTCHAR AdditionalInfo
);
typedef enum _VERSION_COMP_RESULT {
VersionError,
VersionOemNew,
VersionInboxNew,
VersionSame
} VERSION_COMP_RESULT;
VERSION_COMP_RESULT
SlCompareDriverVersion(
IN ULONG InboxDeviceId,
IN PDETECTED_DEVICE InboxDriver,
IN ULONG OemDeviceId,
IN PDETECTED_DEVICE OemDriver
);
//
// Variables dealing with pre-installation.
//
typedef struct _PREINSTALL_DRIVER_INFO {
struct _PREINSTALL_DRIVER_INFO *Next;
//
// String that describes the driver to preinstall
//
PTCHAR DriverDescription;
//
// Name of the SCSI driver
//
BOOLEAN OemDriver;
} PREINSTALL_DRIVER_INFO, *PPREINSTALL_DRIVER_INFO;
extern BOOLEAN PreInstall;
extern PTCHAR ComputerType;
extern BOOLEAN OemHal;
// extern PCHAR OemBootPath;
extern PPREINSTALL_DRIVER_INFO PreinstallDriverList;
PCHAR
SlPreInstallGetComponentName(
IN PVOID Inf,
IN PCHAR SectionName,
IN PTCHAR TargetName
);
ARC_STATUS
SlLoadSection(
IN PVOID Inf,
IN PCSTR SectionName,
IN BOOLEAN IsScsiSection,
IN BOOLEAN AppendLoadSuffix,
IN OUT PULONG StartingIndexInsert
);
#define WINPE_AUTOBOOT_FILENAME "$WINPE$.$$$"
BOOLEAN
SlIsWinPEAutoBoot(
IN PSTR LoaderDeviceName
);
ARC_STATUS
SlGetWinPEStartupParams(
IN PSTR DeviceName,
IN PSTR StartupDirectory
);
ARC_STATUS
SlLoadWinPESection(
IN POEM_SOURCE_DEVICE OemSourceDevice,
IN PVOID OemInfHandle,
IN PCSTR OemSectionName,
IN PVOID InboxInfHandle,
IN PCSTR InboxSectionName,
IN BOOLEAN IsScsiSection,
IN POEMSCSIINFO* ScsiInfo, OPTIONAL
OUT PPNP_HARDWARE_ID* HardwareIdDatabase OPTIONAL
);
ARC_STATUS
SlLoadOemScsiDriversFromOemSources(
IN POEM_SOURCE_DEVICE OemSourceDevices,
IN OUT PPNP_HARDWARE_ID *HardwareIds,
OUT POEMSCSIINFO *OemScsiInfo
);
ARC_STATUS
SlInitVirtualOemSourceDevices(
IN PSETUP_LOADER_BLOCK SetupLoaderBlock,
IN POEM_SOURCE_DEVICE OemSourceDevices
);
#if defined(ARCI386)
BOOLEAN
SlDetectSifPromVersion(
IN PSETUP_LOADER_BLOCK SetupBlock
);
#endif
#define VGA_DRIVER_FILENAME "vga.sys"
#define VIDEO_DEVICE_NAME "VGA"
extern ULONG BootFontImageLength;