windows-nt/Source/XPSP1/NT/base/ntsetup/textmode/winnt/winnt.h
2020-09-26 16:20:57 +08:00

726 lines
17 KiB
C
Raw Permalink Blame History

/*++
Copyright (c) 1992 Microsoft Corporation
Module Name:
dos2nt.h
Abstract:
Local include file for DOS based NT Setup program.
Author:
Ted Miller (tedm) 30-March-1992
Revision History:
--*/
#include <setupbat.h>
#include "nttypes.h"
#include <stdio.h>
#include "dninf.h"
#include "sptxtcns.h"
#include <stdarg.h>
#include "SetupSxs.h"
//
// Define structure used to hold a text screen.
//
typedef struct _SCREEN {
UCHAR X;
UCHAR Y;
PCHAR Strings[];
} SCREEN, *PSCREEN;
//
// Define structure that contains information about disk space requirements
//
typedef struct _SPACE_REQUIREMENT {
PCHAR Key;
unsigned ClusterSize;
ULONG Clusters;
} SPACE_REQUIREMENT, *PSPACE_REQUIREMENT;
//
// define virtualized keycodes
//
#define ASCI_BS 8
#define ASCI_CR 13
#define ASCI_ESC 27
#define DN_KEY_UP 0x00010000
#define DN_KEY_DOWN 0x00020000
#define DN_KEY_HOME 0x00030000
#define DN_KEY_END 0x00040000
#define DN_KEY_PAGEUP 0x00050000
#define DN_KEY_PAGEDOWN 0x00060000
#define DN_KEY_F1 0x01000000
#define DN_KEY_F2 0x02000000
#define DN_KEY_F3 0x03000000
#define DN_KEY_F4 0x04000000
//
// define characters for radio buttons
//
#define RADIO_ON ((CHAR)'X')
#define RADIO_OFF ((CHAR)' ')
//
// Display functions
//
VOID
DnInitializeDisplay(
VOID
);
VOID
DnClearClientArea(
VOID
);
VOID
DnSetGaugeAttribute(
IN BOOLEAN Set
);
VOID
DnPositionCursor(
IN UCHAR X,
IN UCHAR Y
);
VOID
DnWriteChar(
IN CHAR chr
);
VOID
DnWriteString(
IN PCHAR String
);
VOID
DnWriteStatusText(
IN PCHAR FormatString OPTIONAL,
...
);
VOID
DnSetCopyStatusText(
IN PCHAR Caption,
IN PCHAR Filename
);
VOID
DnStartEditField(
IN BOOLEAN CreateField,
IN UCHAR X,
IN UCHAR Y,
IN UCHAR W
);
VOID
DnExitDialog(
VOID
);
VOID
DnDelnode(
IN PCHAR Directory
);
//
// Gas guage functions
//
int
DnGetGaugeChar(
VOID
);
VOID
DnInitGauge(
IN unsigned NumberOfFiles,
IN PSCREEN AdditionalScreen OPTIONAL
);
VOID
DnTickGauge(
VOID
);
VOID
DnDrawGauge(
IN PSCREEN AdditionalScreen OPTIONAL
);
//
// asm routines in dna.asm
//
VOID
DnaReboot(
VOID
);
BOOLEAN
_far
_cdecl
DnAbsoluteSectorIo(
IN unsigned Drive, //0=A, etc
IN ULONG StartSector,
IN USHORT SectorCount,
IN OUT PVOID Buffer,
IN BOOLEAN Write
);
//
// Misc / util functions
//
BOOLEAN
DnWriteSmallIniFile(
IN PCHAR Filename,
IN PCHAR *Lines,
OUT FILE **FileHandle OPTIONAL
);
ULONG
DnGetKey(
VOID
);
ULONG
DnGetValidKey(
IN PULONG ValidKeyList
);
VOID
DnDisplayScreen(
IN PSCREEN Screen,
...
);
VOID
vDnDisplayScreen(
IN PSCREEN Screen,
IN va_list arglist
);
VOID
DnFatalError(
IN PSCREEN Screen,
...
);
BOOLEAN
DnCopyError(
IN PCHAR Filename,
IN PSCREEN ErrorScreen,
IN int FilenameLine
);
PCHAR
DnDupString(
IN PCHAR String
);
VOID
DnGetString(
IN OUT PCHAR String,
IN UCHAR X,
IN UCHAR Y,
IN UCHAR W
);
BOOLEAN
DnIsDriveValid(
IN unsigned Drive
);
BOOLEAN
DnIsDriveRemote(
IN unsigned Drive,
OUT PCHAR UncPath OPTIONAL
);
BOOLEAN
DnIsDriveRemovable(
IN unsigned Drive
);
BOOLEAN
DnCanonicalizePath(
IN PCHAR PathIn,
OUT PCHAR PathOut
);
VOID
DnRemoveTrailingSlashes(
PCHAR Path
);
VOID
DnRemoveLastPathElement(
PCHAR Path
);
VOID
DnpConcatPaths(
IN PCHAR SourceBuffer,
IN PCHAR AppendString
);
BOOLEAN
DnIsDriveCompressedVolume(
IN unsigned Drive,
OUT unsigned *HostDrive
);
#if 1
PVOID
Malloc(
IN unsigned Size,
IN BOOLEAN MustSucceed
#if DBG
,IN char *file,
IN int line
#endif
);
VOID
Free(
IN PVOID Block
#if DBG
,IN char *file,
IN int line
#endif
);
PVOID
Realloc(
IN PVOID Block,
IN unsigned Size,
IN BOOLEAN MustSucceed
#if DBG
,IN char *file,
IN int line
#endif
);
#if DBG
#define MALLOC(s,f) Malloc(s,f,__FILE__,__LINE__)
#define REALLOC(b,s,f) Realloc(b,s,f,__FILE__,__LINE__)
#define FREE(b) Free(b,__FILE__,__LINE__)
#else
#define MALLOC(s,f) Malloc(s,f)
#define REALLOC(b,s,f) Realloc(b,s,f)
#define FREE(b) Free(b)
#endif
#else
#include <malloc.h>
#define MALLOC(s,f) malloc(s)
#define REALLOC(b,s,f) realloc(b,s)
#define FREE(b) free(b)
#endif
VOID
DnExit(
IN int ExitStatus
);
//
// File copy routines
//
//
// Flags for various routines
//
#define CPY_VALIDATION_PASS 0x0001
#define CPY_USE_DEST_ROOT 0x0002
#define CPY_VERIFY 0x0004
#define CPY_PRESERVE_ATTRIBS 0x0008
#define CPY_PRESERVE_NAME 0x0010
#define CPY_PRUNE_DRIVERCAB 0x0020
VOID
DnCopyFiles(
VOID
);
ULONG
DnpIterateOptionalDirs(
IN unsigned Flags,
IN unsigned ClusterSize OPTIONAL,
IN PSPACE_REQUIREMENT SpaceReqArray OPTIONAL,
IN unsigned ArraySize OPTIONAL
);
VOID
DnCopyFloppyFiles(
IN PCHAR SectionName,
IN PCHAR TargetRoot
);
VOID
DnCopyFilesInSection(
IN unsigned Flags,
IN PCHAR SectionName,
IN PCHAR SourcePath,
IN PCHAR TargetPath
);
#if NEC_98
VOID
DnCopyFilesInSectionForFDless(
IN PCHAR SectionName,
IN PCHAR SourcePath,
IN PCHAR TargetPath
);
#endif // NEC_98
VOID
DnCopyOemBootFiles(
PCHAR TargetPath
);
VOID
DnDetermineSpaceRequirements(
PSPACE_REQUIREMENT SpaceReqArray,
unsigned ArraySize
);
VOID
DnAdjustSpaceRequirements(
PSPACE_REQUIREMENT SpaceReqArray,
unsigned ArraySize
);
//
// Local source functions.
//
VOID
DnRemoveLocalSourceTrees(
VOID
);
VOID
DnRemovePagingFiles(
VOID
);
//
// Function to create the setup boot floppy
//
VOID
DnCreateBootFloppies(
VOID
);
//
// Function to start NT text mode setup
//
VOID
DnToNtSetup(
VOID
);
//
// Global variables
//
extern PCHAR LocalSourceDirName; // name of local src root (\$WIN_NT$.~LS)
extern PCHAR x86DirName; // name of x86-specific subdir (\I386")
extern PCHAR DngSourceRootPath; // root of source ('x:\foo\bar', '\\foo\bar')
extern PCHAR UserSpecifiedOEMShare; // possible alternate location for $OEM$ files.
extern CHAR DngTargetDriveLetter; // drive letter of target
extern CHAR DngSwapDriveLetter; // drive letter for INF parser swap file
extern PCHAR DngTargetPath; // path part of target from leading \.
extern PVOID DngInfHandle; // To be passed to INF routines
extern PVOID DngDrvindexInfHandle; // To be passed to INF routines
extern BOOLEAN DngFloppyVerify; // whether to verify files copied to floppy
extern BOOLEAN DngWinntFloppies; // whether floppies are for winnt or cd/floppy
extern BOOLEAN DngCheckFloppySpace; // whether to check free space on the floppy
extern unsigned DngOriginalCurrentDrive; // current drive when we were invoked
extern BOOLEAN DngFloppyless; // whether to do floppyless operation
extern BOOLEAN DngServer; // true if setting up server; false for workstation
extern BOOLEAN DngUnattended; // skip final reboot screen
extern BOOLEAN DngWindows; // Are we running under Windows?
extern BOOLEAN DngCopyOnlyD1TaggedFiles; // TRUE if the files tagged with d1 only need to be copied
extern PCHAR DngScriptFile;
extern BOOLEAN DngOemPreInstall;
extern PCHAR OemSystemDirectory;
extern PCHAR OemOptionalDirectory;
extern PCHAR UniquenessDatabaseFile;
extern PCHAR UniquenessId;
extern BOOLEAN DngMagnifier; // Accessibility utilities
extern BOOLEAN DngKeyboard;
extern BOOLEAN DngTalker;
extern BOOLEAN DngVoice;
//
// Name of sections and keys in inf file.
//
extern CHAR __far DnfDirectories[];
extern CHAR __far DnfFiles[];
extern CHAR __far DnfFloppyFiles0[];
extern CHAR __far DnfFloppyFiles1[];
extern CHAR __far DnfFloppyFiles2[];
extern CHAR __far DnfFloppyFiles3[];
extern CHAR __far DnfFloppyFilesX[];
extern CHAR __far DnfSpaceRequirements[];
extern CHAR __far DnfMiscellaneous[];
extern CHAR __far DnfRootBootFiles[];
extern CHAR __far DnfAssemblyDirectories[];
#if NEC_98
extern CHAR DnfBackupFiles_PC98[]; // For FD Less Setup
#endif // NEC_98
extern CHAR DnkBootDrive[];
extern CHAR DnkNtDrive[];
extern CHAR __far DnkMinimumMemory[];
//
// Text strings
//
extern CHAR __far DntMsWindows[]; // "Microsoft Windows"
extern CHAR __far DntMsDos[]; // "MS-DOS"
extern CHAR __far DntPcDos[]; // "PC-DOS"
extern CHAR __far DntOs2[]; // "OS/2"
extern CHAR __far DntPreviousOs[]; // "Previous Operating System on C:"
extern CHAR __far DntBootIniLine[]; // "Windows NT 3.5 Installation/Upgrade"
extern CHAR __far DntEmptyString[]; // ""
extern CHAR __far DntStandardHeader[];
extern CHAR __far DntPersonalHeader[];
extern CHAR __far DntServerHeader[];
extern CHAR __far DntWorkstationHeader[];
extern CHAR DntParsingArgs[]; // "Parsing arguments..."
extern CHAR __far DntEnterEqualsExit[];
extern CHAR __far DntEnterEqualsRetry[];
extern CHAR __far DntEscEqualsSkipFile[];
extern CHAR __far DntEnterEqualsContinue[];
extern CHAR __far DntPressEnterToExit[];
extern CHAR __far DntF3EqualsExit[]; // "F3=Exit"
extern CHAR __far DntReadingInf[]; // "Reading INF file..."
extern CHAR __far DntCopying[]; // "<22> Copying: "
extern CHAR __far DntVerifying[]; // "<22> Verifying: "
extern CHAR DntCheckingDiskSpace[]; // "Checking disk space..."
extern CHAR __far DntConfiguringFloppy[]; // "Configuring floppy disk..."
extern CHAR __far DntWritingData[]; // "Writing Setup parameters...";
extern CHAR __far DntPreparingData[]; // "Determining Setup parameters...";
extern CHAR __far DntFlushingData[]; // "Ensuring disk consistency..."
extern CHAR __far DntInspectingComputer[]; // "Inspecting computer..."
extern CHAR __far DntOpeningInfFile[]; // "Opening INF file..."
extern CHAR __far DntRemovingFile[]; // "Removing file %s"
extern CHAR DntXEqualsRemoveFiles[]; // "X=Remove files"
extern CHAR __far DntXEqualsSkipFile[]; // "X=Skip File"
extern ULONG DniAccelRemove1,DniAccelRemove2;
extern ULONG DniAccelSkip1,DniAccelSkip2;
extern PCHAR __far DntUsage[];
extern PCHAR __far DntUsageNoSlashD[];
//
// Screens
//
extern SCREEN DnsOutOfMemory;
extern SCREEN DnsAccessibilityOptions; // choose accessibility utilities
extern SCREEN DnsNoShareGiven; // user did not give a sharepoint
extern SCREEN DnsBadSource; // user specified a bad source
extern SCREEN DnsBadInf; // inf file is bad or couldn't read it
extern SCREEN DnsBadLocalSrcDrive; // local source drive on cmd line is bad
extern SCREEN DnsNoLocalSrcDrives; // no drives suitable for local source
extern SCREEN DnsNoSpaceOnSyspart; // not enough space for floppyless operation
extern SCREEN DnsCantCreateDir; // couldn't create directory.
extern SCREEN DnsBadInfSection; // inf section is bad
extern SCREEN DnsCopyError; // error copying a file
extern SCREEN DnsVerifyError; // copy of file didn't match original
extern SCREEN DnsWaitCopying; // wait while setup copies files...
extern SCREEN DnsWaitCopyFlop; // wait while setup copies files...
extern SCREEN DnsWaitCleanup; // wait while setup cleans up...
extern SCREEN DnsNeedFloppyDisk0_0; // prompt user to insert a blank floppy
extern SCREEN DnsNeedSFloppyDsk0_0; // prompt user to insert a blank floppy
extern SCREEN DnsNeedFloppyDisk1_0; // prompt user to insert a blank floppy
extern SCREEN DnsNeedFloppyDisk2_0; // prompt user to insert a blank floppy
extern SCREEN DnsNeedFloppyDisk3_0; // prompt user to insert a blank floppy
extern SCREEN DnsNeedFloppyDisk3_1; // prompt user to insert a blank floppy
extern SCREEN DnsNeedSFloppyDsk1_0; // prompt user to insert a blank floppy
extern SCREEN DnsNeedSFloppyDsk2_0; // prompt user to insert a blank floppy
extern SCREEN DnsNeedSFloppyDsk3_0; // prompt user to insert a blank floppy
extern SCREEN DnsNeedSFloppyDsk3_1; // prompt user to insert a blank floppy
extern SCREEN DnsFloppyNotFormatted;// floppy appears to not be formatted
extern SCREEN DnsFloppyCantGetSpace;// can't determine free space on the floppy
extern SCREEN DnsFloppyNotBlank; // not enough free space on the floppy
extern SCREEN DnsFloppyWriteBS; // couldn't write floppy's boot sector
extern SCREEN DnsFloppyVerifyBS; // readback of sector 0 failed or no match
extern SCREEN DnsFloppyBadFormat; // sanity check of bpb failed
extern SCREEN DnsCantWriteFloppy; // couldn't append to txtsetup.inf
extern SCREEN DnsExitDialog; // exit confirmation
extern SCREEN DnsAboutToRebootS; // about to reboot machine (server)
extern SCREEN DnsAboutToRebootW; // about to reboot machine (workstation)
extern SCREEN DnsAboutToRebootX; // about to reboot machine (floppyless)
extern SCREEN DnsAboutToExitS; // about to exit winnt (server)
extern SCREEN DnsAboutToExitW; // about to exit winnt (workstation)
extern SCREEN DnsAboutToExitX; // about to exit winnt (floppyless)
extern SCREEN DnsConfirmRemoveNt; // confirm remove nt files
extern SCREEN DnsCantOpenLogFile; // Can't open setup.log
extern SCREEN DnsLogFileCorrupt; // Log file missing [Repair.WinntFiles]
extern SCREEN DnsRemovingNtFiles; // removing windows nt files.
extern SCREEN DnsSureSkipFile; // confirm skip file on copy error.
extern SCREEN DnsGauge; // gas gauge
extern SCREEN DnsBadDosVersion; // DOS version < 3.0
extern SCREEN DnsRequiresFloppy; // no 1.2 meg or greater floppy at a:
extern SCREEN DnsRequires486; // not 80486 or greater
extern SCREEN DnsNotEnoughMemory; // insufficient memory
extern SCREEN DnsCantRunOnNt; // can't run on windows nt
extern SCREEN DnsNtBootSect; // error installing NT Boot sector, etc.
extern SCREEN DnsOpenReadScript; // can't open/read script file.
extern SCREEN DnsParseScriptFile; // can't parse unattended script file
extern SCREEN DnsBootMsgsTooLarge;
extern SCREEN DnsNoSwapDrive; // can't find a drive for INF swap file
extern SCREEN DnsNoSmartdrv; // SMARTDRV is not installed
#if NEC_98
extern SCREEN FormatError; // 256 Sector Error for FDLess Setup.
#endif //NEC_98
//
// Boot code messages. These go in the fat and fat32 boot sectors.
//
extern CHAR __far BootMsgNtldrIsMissing[];
extern CHAR __far BootMsgDiskError[];
extern CHAR __far BootMsgPressKey[];
#if NEC_98
#else
BOOLEAN
PatchMessagesIntoBootCode(
VOID
);
#endif
//
// Line number within the DnsReadBootcodeFile message where we will
// print the filename.
//
#define BOOTCODE_FILENAME_LINE 2
//
// coords for edit field for entering source path when none was
// specified on cmd line. Keep in sync with DnsNoShareGiven.
//
#define NO_SHARE_X 8
#define NO_SHARE_Y 8
#define NO_SHARE_W 64
#define BAD_SHARE_Y 10 // sync with DnsBadSource
//
// Keep this in sync with DnsBadInfSection
//
#define BAD_SECTION_LINE 0
//
// Keep these in sync with DnsGauge
//
#define GAUGE_WIDTH 50
#define GAUGE_THERM_X 15
#define GAUGE_THERM_Y 19
#define GAUGE_PERCENT_X 39
#define GAUGE_PERCENT_Y 17
//
// Keep in sync with DntTimeUntilShutdown, DnsAboutToReboot
//
#define SHUTDOWNTIME_X 23
#define SHUTDOWNTIME_Y 15
//
// Keep these in sync with DnsNotEnoughMemory
//
#define NOMEM_LINE1 3
#define NOMEM_LINE2 4
//
// Keep in syns with DnsCopyError, DnsVerifyError
//
#define COPYERR_LINE 2
#define VERIFYERR_LINE 4
//
// The max number of optional directories that can be
// specified
//
#define MAX_OPTIONALDIRS 1024
#define MAX_OEMBOOTFILES 1024
#define OPTDIR_TEMPONLY 0x00000001
#define OPTDIR_OEMSYS 0x00000002
#define OPTDIR_OEMOPT 0x00000004
#define OPTDIR_PLATFORM_INDEP 0x00000008
extern unsigned OptionalDirCount; // The number of Optional Directories
extern CHAR *OptionalDirs[MAX_OPTIONALDIRS]; // Pointer to Dir strings
extern unsigned OptionalDirFlags[MAX_OPTIONALDIRS]; // Flags for each Dir
extern unsigned OptionalDirFileCount; // How many files in optional dirs?
extern unsigned OemBootFilesCount; // The number of OEM boot files
extern CHAR *OemBootFiles[MAX_OEMBOOTFILES]; // Pointer to OEM boot filenames
extern PCHAR CmdToExecuteAtEndOfGui;
// slight overestimate, actually 66, but does that include terminal nul?
// 128 is a popular number in the source
#define DOS_MAX_PATH 70
//
// Logging stuff
//
#define LOGGING
#ifdef LOGGING
VOID
__LOG(
IN PCHAR FormatString,
...
);
#define _LOG(x) __LOG x
#else
#define _LOG(x)
#endif // def LOGGING
extern SPACE_REQUIREMENT __far SpaceRequirements[];
int snprintf( char* target, size_t bufsize, const char *format, ... );
int vsnprintf( char* target, size_t bufsize, const char *format, va_list val );