mirror of https://github.com/lianthony/NT4.0
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.
790 lines
13 KiB
790 lines
13 KiB
//
|
|
// On x86 machines, and only on x86 machines,
|
|
// we create a set of boot floppies from which the user
|
|
// will start text setup.
|
|
//
|
|
// On ARC machines, we create a startup entry in the firmware
|
|
// boot list. Also on ARC machines, we always use Unicode,
|
|
// because compatibility with lesser versions of x86 windows
|
|
// is not an issue.
|
|
//
|
|
|
|
#define UNICODE
|
|
#include <nt.h>
|
|
#include <ntrtl.h>
|
|
#include <nturtl.h>
|
|
#include <ntdddisk.h>
|
|
|
|
#include <windows.h>
|
|
#include <setupbat.h>
|
|
|
|
#include "res.h"
|
|
#include "dialogs.h"
|
|
|
|
#include "dninf.h"
|
|
|
|
//
|
|
// Module instance.
|
|
//
|
|
extern HANDLE hInst;
|
|
|
|
//
|
|
// Execution paramaters.
|
|
//
|
|
extern PTSTR InfName;
|
|
|
|
extern DWORD TlsIndex;
|
|
|
|
#define MAX_SOURCES 10
|
|
extern BOOL MultiSource;
|
|
extern PTSTR Sources[MAX_SOURCES];
|
|
extern UINT SourceCount;
|
|
extern HANDLE StopCopyingEvent;
|
|
|
|
#define MAX_OPTIONALDIRS 20
|
|
#define MAX_OEMBOOTFILES 1024
|
|
extern UINT OptionalDirCount;
|
|
extern PTSTR OptionalDirs[MAX_OPTIONALDIRS];
|
|
extern UINT OptionalDirsFileCount;
|
|
extern UINT OptionalDirFlags[MAX_OPTIONALDIRS];
|
|
extern ULONG OemBootFilesCount; // The number of OEM boot files
|
|
extern PTSTR OemBootFiles[MAX_OEMBOOTFILES]; // Pointer to OEM boot filenames
|
|
extern BOOLEAN OemPreInstall;
|
|
|
|
//
|
|
// This flag says that the optional directory is not
|
|
// to be copied over to the target installation. It is
|
|
// copied into the temp location only. The /rx switch
|
|
// does this.
|
|
//
|
|
#define OPTDIR_TEMPONLY 0x00000001
|
|
#define OPTDIR_OEMSYS 0x00000002
|
|
#define OPTDIR_OEMOPT 0x00000004
|
|
|
|
BOOL
|
|
RememberOptionalDir(
|
|
IN PWSTR Dir,
|
|
IN UINT Flags
|
|
);
|
|
|
|
//
|
|
// Internal stuff
|
|
//
|
|
extern PWSTR BuildServerList[];
|
|
extern UINT BuildServerCount;
|
|
|
|
extern BOOL ServerProduct;
|
|
|
|
extern BOOL CreateLocalSource;
|
|
|
|
extern PVOID InfHandle;
|
|
|
|
extern PTSTR INF_FILES;
|
|
|
|
#ifdef _X86_
|
|
extern PTSTR INF_FLOPPYFILES0;
|
|
extern PTSTR INF_FLOPPYFILES1;
|
|
extern PTSTR INF_FLOPPYFILES2;
|
|
extern PTSTR INF_FLOPPYFILESX;
|
|
extern PTSTR INF_ROOTBOOTFILES;
|
|
#endif
|
|
|
|
//
|
|
// Unattended operation, meaning that we get things going on our own
|
|
// using given parameters, without waiting for the user to click
|
|
// any buttons, etc.
|
|
//
|
|
extern BOOL UnattendedOperation;
|
|
|
|
//
|
|
// String ID of the application title and OSLOADOPTIONS value.
|
|
//
|
|
extern DWORD AppTitleStringId;
|
|
extern DWORD AppIniStringId;
|
|
|
|
//
|
|
// Drive letter of system partition we will use.
|
|
//
|
|
extern TCHAR SystemPartitionDrive;
|
|
|
|
//
|
|
// Global values that come from the inf file.
|
|
//
|
|
extern DWORD RequiredSpace;
|
|
extern DWORD RequiredSpaceAux;
|
|
|
|
//
|
|
// Array of free space on all drives.
|
|
//
|
|
extern ULONGLONG DriveFreeSpace[];
|
|
|
|
#ifdef _X86_
|
|
|
|
#define FLOPPY_CAPACITY_525 1213952L
|
|
#define FLOPPY_CAPACITY_35 1457664L
|
|
#ifdef ALLOW_525
|
|
#define FLOPPY_CAPACITY FLOPPY_CAPACITY_525
|
|
#else
|
|
#define FLOPPY_CAPACITY FLOPPY_CAPACITY_35
|
|
#endif
|
|
|
|
//
|
|
// Define enum specifying the type of boot floppies to create
|
|
// for floppy-only operation (/O[x]).
|
|
//
|
|
typedef enum {
|
|
StandardInstall,
|
|
OnlyWinntFloppies,
|
|
OnlyRetailFloppies
|
|
} FLOPPY_OPTION;
|
|
|
|
//
|
|
// Values that control how we deal with/make boot floppies.
|
|
//
|
|
extern BOOL VerifyFloppySpace;
|
|
extern BOOL CreateFloppies;
|
|
extern BOOL FloppylessOperation;
|
|
extern FLOPPY_OPTION FloppyOption;
|
|
extern BOOL AColonIsAcceptable;
|
|
|
|
extern TCHAR FloppylessBootDirectory[];
|
|
extern CHAR FloppylessBootImageFile[];
|
|
extern TCHAR BootIniName[];
|
|
extern TCHAR BootIniBackUpName[];
|
|
extern BOOL BootIniModified;
|
|
#else
|
|
|
|
//
|
|
// Array of drive letters for all system partitions.
|
|
//
|
|
extern PWCHAR SystemPartitionDriveLetters;
|
|
|
|
//
|
|
// Location of setupldr (so we can delete if the user cancels)
|
|
//
|
|
extern WCHAR SetupLdrTarg[];
|
|
|
|
// nv-ram stuff
|
|
typedef enum {
|
|
BootVarSystemPartition,
|
|
BootVarOsLoader,
|
|
BootVarOsLoadPartition,
|
|
BootVarOsLoadFilename,
|
|
BootVarLoadIdentifier,
|
|
BootVarOsLoadOptions,
|
|
BootVarMax
|
|
} BOOT_VARS;
|
|
|
|
extern PWSTR BootVarNames[];
|
|
extern PWSTR OriginalBootVarValues[];
|
|
|
|
extern PWSTR szAUTOLOAD, szCOUNTDOWN;
|
|
extern PWSTR OriginalAutoload, OriginalCountdown;
|
|
|
|
#endif
|
|
|
|
extern BOOL SkipNotPresentFiles;
|
|
extern BOOL SpecialNotPresentFilesMode;
|
|
extern PCWSTR MissingFileListName;
|
|
extern BOOL bCancelled;
|
|
|
|
#ifndef _X86_
|
|
extern BOOL bRestoreNVRAM;
|
|
#endif
|
|
|
|
//
|
|
// Icon handle of main icon.
|
|
//
|
|
extern HICON MainIcon;
|
|
|
|
//
|
|
// Platform-specific subdirectories.
|
|
//
|
|
extern PTSTR PlatformSpecificDir;
|
|
|
|
//
|
|
// Help filename.
|
|
//
|
|
extern PTSTR szHELPFILE;
|
|
|
|
//
|
|
// Drive, Pathname part, and full path of the local source directory.
|
|
//
|
|
extern TCHAR LocalSourceDrive;
|
|
extern PTSTR LocalSourceDirectory;
|
|
extern PTSTR LocalSourceSubDirectory;
|
|
extern PTSTR LocalSourcePath;
|
|
extern PTSTR LocalSourceSubPath;
|
|
|
|
//
|
|
// Custom window messages.
|
|
//
|
|
#define WMX_MAIN_DIALOG_UP (WM_USER+237)
|
|
#define WMX_INF_LOADED (WM_USER+238)
|
|
#define WMX_NTH_FILE_COPIED (WM_USER+245)
|
|
#define WMX_ALL_FILES_COPIED (WM_USER+246)
|
|
#define WMX_INITCTLS (WM_USER+247)
|
|
#define WMX_I_AM_DONE (WM_USER+250)
|
|
#define WMX_MULTICOPY (WM_USER+260)
|
|
#define WMX_AUXILLIARY_ACTION_DONE (WM_USER+300)
|
|
#define WMX_BILLBOARD_STATUS (WM_USER+400)
|
|
#define WMX_BILLBOARD_DONE (WM_USER+401)
|
|
#define WMX_UI_MESSAGE_BOX (WM_USER+410)
|
|
#define WMX_UI_DIALOG (WM_USER+411)
|
|
#define WMX_WAIT_FOR_THREADS (WM_USER+412)
|
|
#define WMX_BAR_SETPOS (WM_USER+500)
|
|
|
|
//
|
|
// Macro to determine the number of characters
|
|
// in a buffer given its size.
|
|
//
|
|
#define SIZECHARS(buffer) (sizeof(buffer)/sizeof(TCHAR))
|
|
|
|
//
|
|
// Macro to align a buffer.
|
|
//
|
|
#define ALIGN(p,val) \
|
|
\
|
|
(PVOID)((((ULONG)(p) + (val) - 1)) & (~((val) - 1)))
|
|
|
|
typedef struct _SIMPLE_BILLBOARD {
|
|
DWORD CaptionStringId;
|
|
PTHREAD_START_ROUTINE AssociatedAction;
|
|
} SIMPLE_BILLBOARD, *PSIMPLE_BILLBOARD;
|
|
|
|
PSTR
|
|
UnicodeToMB(
|
|
IN PWSTR UnicodeString,
|
|
IN DWORD CodepageFlags
|
|
);
|
|
|
|
PWSTR
|
|
MBToUnicode(
|
|
IN PSTR MultibyteString,
|
|
IN DWORD CodepageFlags
|
|
);
|
|
|
|
BOOL
|
|
DnIndicateWinnt(
|
|
IN HWND hdlg,
|
|
IN PTSTR Path,
|
|
IN PTSTR OriginalAutoload,
|
|
IN PTSTR OriginalCountdown
|
|
);
|
|
|
|
VOID
|
|
MyWinHelp(
|
|
IN HWND hdlg,
|
|
IN DWORD ContextId
|
|
);
|
|
|
|
LPWSTR *
|
|
CommandLineToArgvW(
|
|
IN LPCWSTR lpCmdLine,
|
|
OUT int *pNumArgs
|
|
);
|
|
|
|
//
|
|
// Memory allocation (dnmem.c).
|
|
//
|
|
PVOID
|
|
Malloc(
|
|
IN DWORD Size
|
|
);
|
|
|
|
VOID
|
|
Free(
|
|
IN OUT PVOID *Block
|
|
);
|
|
|
|
PVOID
|
|
Realloc(
|
|
IN PVOID Block,
|
|
IN DWORD Size
|
|
);
|
|
|
|
#define MALLOC(size) Malloc(size)
|
|
#define REALLOC(block,size) Realloc((block),(size))
|
|
#define FREE(block) Free(&(block))
|
|
|
|
VOID
|
|
OutOfMemory(
|
|
VOID
|
|
);
|
|
|
|
//
|
|
// Utility routines (dnutil.c)
|
|
//
|
|
int
|
|
ActionWithBillboard(
|
|
IN PTHREAD_START_ROUTINE Action,
|
|
IN DWORD BillboardCaptionStringId,
|
|
IN HWND hwndOwner
|
|
);
|
|
|
|
VOID
|
|
RetreiveAndFormatMessageIntoBuffer(
|
|
IN DWORD Id,
|
|
OUT PVOID Buffer,
|
|
IN DWORD BufferSize,
|
|
...
|
|
);
|
|
|
|
PTSTR
|
|
RetreiveAndFormatMessage(
|
|
IN DWORD Id,
|
|
...
|
|
);
|
|
|
|
PTSTR
|
|
RetreiveSystemErrorMessage(
|
|
IN DWORD ErrorCode,
|
|
...
|
|
);
|
|
|
|
PTSTR
|
|
MyLoadString(
|
|
IN DWORD Id
|
|
);
|
|
|
|
VOID
|
|
DnConcatenatePaths(
|
|
IN OUT PTSTR Path1,
|
|
IN PTSTR Path2,
|
|
IN DWORD BufferSizeChars
|
|
);
|
|
|
|
VOID
|
|
CenterDialog(
|
|
HWND hwnd
|
|
);
|
|
|
|
BOOL
|
|
DnWriteSmallIniFile(
|
|
IN PTSTR Filename,
|
|
IN PCHAR *Lines,
|
|
OUT HANDLE *FileHandle OPTIONAL
|
|
);
|
|
|
|
int
|
|
MessageBoxFromMessage(
|
|
IN HWND DisableWindow,
|
|
IN DWORD MessageId,
|
|
IN DWORD CaptionStringId,
|
|
IN UINT Style,
|
|
...
|
|
);
|
|
|
|
PTSTR
|
|
DupString(
|
|
IN PTSTR String
|
|
);
|
|
|
|
// Status Gauge custom control procs
|
|
ATOM
|
|
InitStatGaugeCtl(
|
|
IN HINSTANCE hInst
|
|
);
|
|
|
|
LONG
|
|
APIENTRY
|
|
StatGaugeProc(
|
|
HWND hWnd,
|
|
UINT wMessage,
|
|
WPARAM wParam,
|
|
LONG lParam
|
|
);
|
|
|
|
|
|
//
|
|
// Dialog procedures.
|
|
//
|
|
BOOL
|
|
DlgProcOptions(
|
|
IN HWND hdlg,
|
|
IN UINT msg,
|
|
IN WPARAM wParam,
|
|
IN LPARAM lParam
|
|
);
|
|
|
|
BOOL
|
|
DlgProcCopyingFiles(
|
|
IN HWND hdlg,
|
|
IN UINT msg,
|
|
IN WPARAM wParam,
|
|
IN LPARAM lParam
|
|
);
|
|
|
|
BOOL
|
|
DlgProcAskReboot(
|
|
IN HWND hdlg,
|
|
IN UINT msg,
|
|
IN WPARAM wParam,
|
|
IN LPARAM lParam
|
|
);
|
|
|
|
UINT
|
|
DlgProcSysPartSpaceWarn(
|
|
IN HWND hdlg,
|
|
IN UINT msg,
|
|
IN WPARAM wParam,
|
|
IN LPARAM lParam
|
|
);
|
|
|
|
VOID
|
|
AuxillaryStatus(
|
|
IN HWND hdlg,
|
|
IN PTSTR Status OPTIONAL
|
|
);
|
|
|
|
//
|
|
// Thread entry points.
|
|
//
|
|
DWORD
|
|
ThreadInspectComputer(
|
|
PVOID ThreadParameter
|
|
);
|
|
|
|
DWORD
|
|
ThreadLoadInf(
|
|
PVOID ThreadParameter
|
|
);
|
|
|
|
DWORD
|
|
ThreadCopyLocalSourceFiles(
|
|
IN PVOID ThreadParameter
|
|
);
|
|
|
|
DWORD
|
|
ThreadAuxilliaryAction(
|
|
IN PVOID ThreadParameter
|
|
);
|
|
|
|
DWORD
|
|
ThreadRestoreComputer(
|
|
PVOID ThreadParameter
|
|
);
|
|
|
|
|
|
//
|
|
// Inspection routines (inspect.c).
|
|
//
|
|
TCHAR
|
|
GetFirstDriveWithSpace(
|
|
IN DWORD RequiredSpace
|
|
);
|
|
|
|
VOID
|
|
GetDriveSectorInfo(
|
|
IN TCHAR Drive,
|
|
OUT PDWORD SectorSize,
|
|
OUT PDWORD ClusterSize
|
|
);
|
|
|
|
VOID
|
|
GetFilesystemName(
|
|
IN TCHAR Drive,
|
|
OUT PTSTR FilesystemName,
|
|
IN UINT BufferSizeChars
|
|
);
|
|
|
|
UINT
|
|
MyGetDriveType(
|
|
IN TCHAR Drive
|
|
);
|
|
|
|
BOOL
|
|
GetPartitionInfo(
|
|
IN TCHAR Drive,
|
|
OUT PPARTITION_INFORMATION PartitionInfo
|
|
);
|
|
|
|
BOOL
|
|
IsDriveNotNTFT(
|
|
IN TCHAR Drive
|
|
);
|
|
|
|
//
|
|
// String routines (string.c)
|
|
//
|
|
DWORD
|
|
StringToDwordX(
|
|
IN PTSTR String,
|
|
OUT PTSTR *End OPTIONAL
|
|
);
|
|
|
|
#define StringToDword(s) StringToDwordX((s),NULL)
|
|
|
|
PTSTR
|
|
StringRevChar(
|
|
IN PTSTR String,
|
|
IN TCHAR Char
|
|
);
|
|
|
|
PWSTR
|
|
StringUpperN(
|
|
IN OUT PWSTR p,
|
|
IN unsigned n
|
|
);
|
|
|
|
PSTR
|
|
StringUpperNA(
|
|
IN OUT PSTR p,
|
|
IN unsigned n
|
|
);
|
|
|
|
PCWSTR
|
|
StringString(
|
|
IN PCWSTR String,
|
|
IN PCWSTR SubString
|
|
);
|
|
|
|
int
|
|
_StrNICmp(
|
|
PCSTR String1,
|
|
PCSTR String2,
|
|
UINT N
|
|
);
|
|
|
|
//
|
|
// Can't use lstrcpyn from kernel32.dll because this api is
|
|
// not in nt3.1. The following are taken directly from
|
|
// winbase.h.
|
|
//
|
|
LPSTR
|
|
_lstrcpynA(
|
|
LPSTR lpString1,
|
|
LPCSTR lpString2,
|
|
int iMaxLength
|
|
);
|
|
|
|
LPWSTR
|
|
_lstrcpynW(
|
|
LPWSTR lpString1,
|
|
LPCWSTR lpString2,
|
|
int iMaxLength
|
|
);
|
|
|
|
#ifdef UNICODE
|
|
#define _lstrcpyn _lstrcpynW
|
|
#else
|
|
#define _lstrcpyn _lstrcpynA
|
|
#endif
|
|
|
|
//
|
|
// File utility routines (dnfile.c)
|
|
//
|
|
DWORD
|
|
DnMapFile(
|
|
IN PTSTR FileName,
|
|
OUT PDWORD FileSize,
|
|
OUT PHANDLE FileHandle,
|
|
OUT PHANDLE MappingHandle,
|
|
OUT PVOID *BaseAddress
|
|
);
|
|
|
|
DWORD
|
|
DnUnmapFile(
|
|
IN HANDLE MappingHandle,
|
|
IN PVOID BaseAddress
|
|
);
|
|
|
|
VOID
|
|
ForceFileNoCompress(
|
|
IN PTSTR FileName
|
|
);
|
|
|
|
//
|
|
// File list and copy routines.
|
|
//
|
|
VOID
|
|
DnCreateDirectoryList(
|
|
IN PTSTR SectionName
|
|
);
|
|
|
|
BOOL
|
|
VerifySectionOfFilesToCopy(
|
|
IN PTSTR SectionName,
|
|
OUT PDWORD ErrorLine,
|
|
OUT PDWORD ErrorValue
|
|
);
|
|
|
|
BOOL
|
|
DnCreateLocalSourceDirectories(
|
|
IN HWND hdlg
|
|
);
|
|
|
|
BOOL
|
|
DnpCreateOneDirectory(
|
|
IN PTSTR Directory,
|
|
IN HWND hdlg
|
|
);
|
|
|
|
|
|
#define COPYERR_EXIT 0
|
|
#define COPYERR_SKIP 1
|
|
#define COPYERR_RETRY 2
|
|
|
|
int
|
|
DnFileCopyError(
|
|
IN HWND hdlg,
|
|
IN PTSTR SourceSpec,
|
|
IN PTSTR TargetSpec,
|
|
IN DWORD ErrorCode
|
|
);
|
|
|
|
VOID
|
|
TellUserAboutAnySkippedFiles(
|
|
IN HWND hdlg
|
|
);
|
|
|
|
DWORD
|
|
CopySectionOfFilesToCopy(
|
|
IN HWND hdlg,
|
|
IN PTSTR SectionName,
|
|
IN PTSTR DestinationRoot,
|
|
IN DWORD ClusterSize, OPTIONAL
|
|
IN BOOL TickGauge
|
|
);
|
|
|
|
BOOL
|
|
DnCopyFilesInSection(
|
|
IN HWND hdlg,
|
|
IN PTSTR Section,
|
|
IN PTSTR SourceDir,
|
|
IN PTSTR TargetDir,
|
|
IN BOOL ForceNoComp
|
|
);
|
|
|
|
DWORD
|
|
DnCopyOneFile(
|
|
IN HWND hdlg,
|
|
IN PTSTR SourceName,
|
|
IN PTSTR DestName,
|
|
OUT PDWORD ErrorCode OPTIONAL
|
|
);
|
|
|
|
BOOL
|
|
InitializeMultiSourcedCopy(
|
|
IN HWND hdlg
|
|
);
|
|
|
|
VOID
|
|
EnqueueFileForCopy(
|
|
IN PTSTR DestinationRoot,
|
|
IN PTSTR RelativeDirectory,
|
|
IN PTSTR SourceFilename,
|
|
IN PTSTR TargetFilename
|
|
);
|
|
|
|
VOID
|
|
StartMultiSourcedCopy(
|
|
VOID
|
|
);
|
|
|
|
//
|
|
// Routines to delnode an existing local source.
|
|
//
|
|
VOID
|
|
DelnodeTemporaryFiles(
|
|
IN HWND hdlg,
|
|
IN TCHAR Drive,
|
|
IN PTSTR Directory
|
|
);
|
|
|
|
VOID
|
|
MyDelnode(
|
|
IN PTSTR Directory
|
|
);
|
|
|
|
//
|
|
// Security routines.
|
|
//
|
|
BOOL
|
|
IsUserAdmin(
|
|
VOID
|
|
);
|
|
|
|
BOOL
|
|
DoesUserHavePrivilege(
|
|
PTSTR PrivilegeName
|
|
);
|
|
|
|
BOOL
|
|
EnablePrivilege(
|
|
IN PTSTR PrivilegeName,
|
|
IN BOOL Enable
|
|
);
|
|
|
|
#ifdef _X86_
|
|
|
|
//
|
|
// Routines specific to the non-ARC version.
|
|
//
|
|
BOOL
|
|
DnMungeBootIni(
|
|
IN HWND hdlg
|
|
);
|
|
|
|
BOOL
|
|
DnLayAuxBootSector(
|
|
IN HWND hdlg
|
|
);
|
|
|
|
TCHAR
|
|
x86DetermineSystemPartition(
|
|
IN HWND hdlg
|
|
);
|
|
|
|
VOID
|
|
CheckAColon(
|
|
VOID
|
|
);
|
|
#else
|
|
|
|
//
|
|
// Routines specific to the ARC version.
|
|
//
|
|
|
|
BOOL
|
|
InitializeArcStuff(
|
|
IN HWND hdlg
|
|
);
|
|
|
|
PWSTR
|
|
DriveLetterToArcPath(
|
|
IN WCHAR DriveLetter
|
|
);
|
|
|
|
BOOL
|
|
DoSetNvRamVar(
|
|
IN PWSTR VarName,
|
|
IN PWSTR VarValue
|
|
);
|
|
|
|
UINT
|
|
DlgProcSysPartNtftWarn(
|
|
IN HWND hdlg,
|
|
IN UINT msg,
|
|
IN WPARAM wParam,
|
|
IN LPARAM lParam
|
|
);
|
|
|
|
#endif
|
|
|
|
int
|
|
UiMessageBox(
|
|
IN HWND hdlg,
|
|
IN DWORD MessageId,
|
|
IN DWORD CaptionStringId,
|
|
IN UINT Style,
|
|
...
|
|
);
|
|
|
|
int
|
|
UiDialog(
|
|
IN HWND hdlg,
|
|
IN UINT Template,
|
|
IN DLGPROC DialogProcedure,
|
|
IN PVOID Parameters
|
|
);
|