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.
 
 
 
 
 
 

2499 lines
50 KiB

#include <nt.h>
#include <ntrtl.h>
#include <nturtl.h>
#include <windows.h>
#include <commctrl.h>
#include <commdlg.h>
#include <winioctl.h>
#include <setupbat.h>
#include <setupapi.h>
#include <winnls.h>
#include <shlwapi.h>
#include <winspool.h>
#include <wininet.h>
#include <tchar.h>
#include <malloc.h>
#include <stdlib.h>
#include <stdio.h>
#include <winnt32p.h>
#include <pidgen.h>
#include <locale.h>
#include <ntverp.h>
#include <patchapi.h>
#include <cfgmgr32.h>
#include <regstr.h>
#include <imagehlp.h>
#define STRSAFE_NO_DEPRECATE
#include <strsafe.h>
#include "resource.h"
#include "util.h"
#include "hwdb.h"
#include "wsdu.h"
#include "dynupdt.h"
#include "diamond.h"
//
// moved to precomp.h
//
//#include "msg.h"
#include "helpids.h"
#include "comp.h"
#include "compliance.h"
#include "mgdlllib.h"
#ifdef PRERELEASE
#define TRY
#define EXCEPT(e) goto __skip;
#define _exception_code() 0
#define END_EXCEPT __skip:;
#else
#define TRY __try
#define EXCEPT(e) __except (e)
#define END_EXCEPT
#endif
#define ARRAYSIZE(a) (sizeof(a) / sizeof(a[0]))
#define LENGTHOF(a) (ARRAYSIZE(a) - 1)
#define HideWindow(_hwnd) SetWindowLong((_hwnd),GWL_STYLE,GetWindowLong((_hwnd),GWL_STYLE)&~WS_VISIBLE)
#define UnHideWindow(_hwnd) SetWindowLong((_hwnd),GWL_STYLE,GetWindowLong((_hwnd),GWL_STYLE)|WS_VISIBLE)
#define UNATTENDED(btn) if((UnattendedOperation) && (!CancelPending)) PostMessage(hdlg,WMX_UNATTENDED,btn,0)
#define CHECKUPGRADEONLY() if(CheckUpgradeOnly) return( FALSE )
#define CHECKUPGRADEONLY_Q() if(CheckUpgradeOnlyQ) return( FALSE )
#define SetDialogFocus(_hwnd, _hwndchild) SendMessage(_hwnd, WM_NEXTDLGCTL, (WPARAM)_hwndchild, MAKELPARAM(TRUE, 0))
#define MAKEULONGLONG(low,high) ((ULONGLONG)(((DWORD)(low)) | ((ULONGLONG)((DWORD)(high))) << 32))
#define HIULONG(_val_) ((ULONG)(_val_>>32))
#define LOULONG(_val_) ((ULONG)_val_)
#define TYPICAL() (dwSetupFlags & UPG_FLAG_TYPICAL)
extern HINSTANCE hInst;
extern UINT AppTitleStringId;
extern DWORD TlsIndex;
extern HINSTANCE hinstBB;
extern HWND WizardHandle;
extern BOOL g_DeleteRunOnceFlag;
HWND GetBBhwnd();
HWND GetBBMainHwnd();
#define S_WINNT32_WARNING TEXT("Winnt32RunOnceWarning")
// #define RUN_SYSPARSE 1
//
// Flag indicating whether we are initiating an MSI-Install.
//
extern BOOL RunFromMSI;
//
// Flag indicating whether we are initiating an Typical install
//
extern DWORD dwSetupFlags;
//
// Flag indicating whether we are initiating an upgrade.
//
extern BOOL Upgrade;
//
// Flag to say if we need to write the AcpiHAL value to the winnt.sif file
//
extern BOOL WriteAcpiHalValue;
//
// What should we write as the value for the AcpiHalValue
//
extern BOOL AcpiHalValue;
//
// Flag indicating whether we're installing/upgrading to NT Server
//
extern BOOL Server;
//
// Flag to indicate if we are running BVT's
//
extern BOOL RunningBVTs;
//
// When running BVT's, what baudrate should we set the debugger to?
//
extern LONG lDebugBaudRate;
//
// When running BVT's, what comport should we set the debugger to?
//
extern LONG lDebugComPort;
//
// When running BVT's, should we copy the symbols locally?
//
extern BOOL CopySymbols;
//
// Flag to indicate if we are running ASR tests
//
extern DWORD AsrQuickTest;
//
// Product type and flavor for upgrade modules
//
extern PRODUCTTYPE UpgradeProductType;
extern UINT ProductFlavor;
//
// fat to ntfs conversion flag
//
extern BOOL ForceNTFSConversion;
extern BOOL NTFSConversionChanged;
//
// 16 bit environment boot (Win9x upgrade only)
//
typedef enum {
BOOT16_AUTOMATIC,
BOOT16_YES,
BOOT16_NO
} BOOT16_OPTIONS;
extern UINT g_Boot16;
//
// Global flag indicating whether the entire overall program operation
// was successful. Also a flag indicating whether to shut down automatically
// when the wizard is done in the non-unattended case.
//
extern BOOL GlobalResult;
extern BOOL AutomaticallyShutDown;
//
// Global OS version info.
//
extern OSVERSIONINFO OsVersion;
extern DWORD OsVersionNumber;
#define BUILDNUM() (OsVersion.dwBuildNumber)
#ifdef UNICODE
#define ISNT() (TRUE)
#define ISOSR2() (FALSE)
#else
#define ISNT() (FALSE)
#define ISOSR2() (LOWORD(OsVersion.dwBuildNumber) > 1080)
#endif
extern WINNT32_PLUGIN_INIT_INFORMATION_BLOCK info;
//
// Flags indicating how we were run and whether to create
// a local source.
//
extern BOOL RunFromCD;
extern BOOL MakeLocalSource;
extern BOOL UserSpecifiedMakeLocalSource;
extern BOOL NoLs;
extern TCHAR UserSpecifiedLocalSourceDrive;
extern LONG SourceInstallType; // uses InstallType enum
extern DWORD MLSDiskID;
//
// Used for win9xupg reporting (reportonly mode)
//
extern UINT UpgRequiredMb;
extern UINT UpgAvailableMb;
//
// advanced install options
//
extern BOOL ChoosePartition;
extern BOOL UseSignatures;
extern TCHAR InstallDir[MAX_PATH];
extern TCHAR HeadlessSelection[MAX_PATH];
extern ULONG HeadlessBaudRate;
#ifdef PRERELEASE
extern BOOL AppendDebugDataToBoot;
#endif
//
// SMS support
//
extern PSTR LastMessage;
#if defined(REMOTE_BOOT)
//
// Flag indicating whether we're running on a remote boot client.
//
extern BOOL RemoteBoot;
//
// Path to the machine directory for a remote boot client.
//
extern TCHAR MachineDirectory[MAX_PATH];
#endif // defined(REMOTE_BOOT)
//
// Flags indicating which Accessibility utilities to use
//
extern BOOL AccessibleMagnifier;
extern BOOL AccessibleKeyboard;
extern BOOL AccessibleVoice;
extern BOOL AccessibleReader;
//
// Build number we're upgrading from
//
extern DWORD BuildNumber;
#define NT351 1057
#define NT40 1381
#define NT50B1 1671
#define NT50B3 2031
#define NT50 2195
#define NT51B2 2462
#define NT51 2600
//
// Are any of the Accesssibility utilities enabled?
//
extern BOOL AccessibleSetup;
//
// Flags and values relating to unattended operation.
//
extern BOOL UnattendedOperation;
extern BOOL UnattendSwitchSpecified;
extern PTSTR UnattendedScriptFile;
extern UINT UnattendedShutdownTimeout;
extern UINT UnattendedCountdown;
extern BOOL BatchMode;
//
// Name of unattended script file to be used for Accessible Setup
//
extern TCHAR AccessibleScriptFile[MAX_PATH];
//
// Name of inf file and handles to dosnet.inf and txtsetup.sif.
//
extern TCHAR InfName[MAX_PATH];
extern PVOID MainInf;
extern TCHAR FullInfName[MAX_PATH];
extern PVOID TxtsetupSif;
extern PVOID NtcompatInf;
BOOL
GetMainInfValue (
IN PCTSTR Section,
IN PCTSTR Key,
IN DWORD FieldNumber,
OUT PTSTR Buffer,
IN DWORD BufChars
);
//
// Language options stuff
//
extern BOOL IntlInfProcessed;
extern DWORD PrimaryLocale;
// Global used in WriteParamsFile and AddExternalParams
extern TCHAR ActualParamFile[MAX_PATH];
BOOL InitLangControl(HWND hdlg, BOOL bFarEast);
BOOL IsFarEastLanguage(DWORD LangIdx);
BOOL SelectFarEastLangGroup(BOOL bSelect);
void BB_SetProgressText(LPTSTR szText);
void BB_SetTimeEstimateText(LPTSTR szText);
void BB_SetInfoText(LPTSTR szText);
extern
BOOL
ReadIntlInf(
IN HWND hdlg
);
extern
VOID
SaveLanguageDirs(
);
extern
BOOL
SaveLanguageParams(
IN LPCTSTR FileName
);
extern
VOID
FreeLanguageData(
);
VOID
CleanUpOldLocalSources(
IN HWND hdlg
);
BOOL
InspectFilesystems(
IN HWND hdlg
);
BOOL
LoadInfWorker(
IN HWND hdlg,
IN LPCTSTR FilenamePart,
OUT PVOID *InfHandle,
IN BOOL Winnt32File
);
BOOL
FindLocalSourceAndCheckSpace(
IN HWND hdlg,
IN BOOL QuickTest,
IN LONGLONG AdditionalPadding
);
BOOL
EnoughMemory(
IN HWND hdlg,
IN BOOL QuickTest
);
//
// Optional directory stuff.
//
#define MAX_OPTIONALDIRS 20
extern UINT OptionalDirectoryCount;
extern TCHAR OptionalDirectories[MAX_OPTIONALDIRS][MAX_PATH];
extern UINT OptionalDirectoryFlags[MAX_OPTIONALDIRS];
#define OPTDIR_TEMPONLY 0x00000001
#define OPTDIR_OEMSYS 0x00000002
#define OPTDIR_OVERLAY 0x00000004
#define OPTDIR_ADDSRCARCH 0x00000008
#define OPTDIR_ABSOLUTE 0x00000010
#define OPTDIR_DEBUGGER 0x00000020 // speficies that this optional dir is to be copied to %windir%\Debuggers
// OPTDIR_PLATFORM_INDEP becomes DIR_IS_PLATFORM_INDEPEND and FILE_IN_PLATFORM_INDEPEND_DIR
#define OPTDIR_PLATFORM_INDEP 0x00000040
#define OPTDIR_IN_LOCAL_BOOT 0x00000080
#define OPTDIR_SUPPORT_DYNAMIC_UPDATE 0x00000100
#define OPTDIR_USE_TAIL_FOLDER_NAME 0x00000200
#define OPTDIR_PLATFORM_SPECIFIC_FIRST 0x00000400
#define OPTDIR_DOESNT_SUPPORT_PRIVATES 0x00000800
#define OPTDIR_SIDE_BY_SIDE 0x00001000
//
// Source paths and count of paths.
//
extern TCHAR SourcePaths[MAX_SOURCE_COUNT][MAX_PATH];
extern TCHAR NativeSourcePaths[MAX_SOURCE_COUNT][MAX_PATH];
extern UINT SourceCount;
extern TCHAR *UserSpecifiedOEMShare;
//
// Local source information.
//
#define DEFAULT_INSTALL_DIR TEXT("\\WINDOWS")
#define INTERNAL_WINNT32_DIR TEXT("winnt32")
#define LOCAL_SOURCE_DIR_A "$WIN_NT$.~LS"
#define LOCAL_SOURCE_DIR_W L"$WIN_NT$.~LS"
#define TEXTMODE_INF_A "TXTSETUP.SIF"
#define TEXTMODE_INF_W L"TXTSETUP.SIF"
#define NTCOMPAT_INF_A "COMPDATA\\NTCOMPAT.INF"
#define NTCOMPAT_INF_W L"COMPDATA\\NTCOMPAT.INF"
#define DRVINDEX_INF_A "DRVINDEX.INF"
#define DRVINDEX_INF_W L"DRVINDEX.INF"
#define SETUPP_INI_A "SETUPP.INI"
#define SETUPP_INI_W L"SETUPP.INI"
#define PID_SECTION_A "Pid"
#define PID_SECTION_W L"Pid"
#define PID_KEY_A "Pid"
#define PID_KEY_W L"Pid"
#define OEM_INSTALL_RPC_A "OEM"
#define OEM_INSTALL_RPC_W L"OEM"
#define SELECT_INSTALL_RPC_A "270"
#define SELECT_INSTALL_RPC_W L"270"
#define MSDN_INSTALL_RPC_A "335"
#define MSDN_INSTALL_RPC_W L"335"
#define MSDN_PID30_A "MD97J-QC7R7-TQJGD-3V2WM-W7PVM"
#define MSDN_PID30_W L"MD97J-QC7R7-TQJGD-3V2WM-W7PVM"
#define INF_FILE_HEADER "[Version]\r\nSignature = \"$Windows NT$\"\r\n\r\n"
#ifdef UNICODE
#define LOCAL_SOURCE_DIR LOCAL_SOURCE_DIR_W
#define TEXTMODE_INF TEXTMODE_INF_W
#define NTCOMPAT_INF NTCOMPAT_INF_W
#define DRVINDEX_INF DRVINDEX_INF_W
#define SETUPP_INI SETUPP_INI_W
#define PID_SECTION PID_SECTION_W
#define PID_KEY PID_KEY_W
#define OEM_INSTALL_RPC OEM_INSTALL_RPC_W
#define SELECT_INSTALL_RPC SELECT_INSTALL_RPC_W
#define MSDN_INSTALL_RPC MSDN_INSTALL_RPC_W
#define MSDN_PID30 MSDN_PID30_W
#else
#define LOCAL_SOURCE_DIR LOCAL_SOURCE_DIR_A
#define TEXTMODE_INF TEXTMODE_INF_A
#define NTCOMPAT_INF NTCOMPAT_INF_A
#define DRVINDEX_INF DRVINDEX_INF_A
#define SETUPP_INI SETUPP_INI_A
#define PID_SECTION PID_SECTION_A
#define PID_KEY PID_KEY_A
#define OEM_INSTALL_RPC OEM_INSTALL_RPC_A
#define SELECT_INSTALL_RPC SELECT_INSTALL_RPC_A
#define MSDN_INSTALL_RPC MSDN_INSTALL_RPC_A
#define MSDN_PID30 MSDN_PID30_A
#endif
#if defined(_AMD64_) || defined(_X86_)
#define LOCAL_BOOT_DIR_A "$WIN_NT$.~BT"
#define LOCAL_BOOT_DIR_W L"$WIN_NT$.~BT"
#define AUX_BS_NAME_A "$LDR$"
#define AUX_BS_NAME_W L"$LDR$"
#define FLOPPY_COUNT 4
//
// Local BACKUP information, on NEC98.
//
#define LOCAL_BACKUP_DIR_A "$WIN_NT$.~BU"
#define LOCAL_BACKUP_DIR_W L"$WIN_NT$.~BU"
#ifdef UNICODE
#define LOCAL_BOOT_DIR LOCAL_BOOT_DIR_W
#define AUX_BS_NAME AUX_BS_NAME_W
#define LOCAL_BACKUP_DIR LOCAL_BACKUP_DIR_W
#else
#define LOCAL_BOOT_DIR LOCAL_BOOT_DIR_A
#define AUX_BS_NAME AUX_BS_NAME_A
#define LOCAL_BACKUP_DIR LOCAL_BACKUP_DIR_A
#endif
extern TCHAR LocalBackupDirectory[MAX_PATH];
extern TCHAR FirstFloppyDriveLetter;
#endif
extern DWORD LocalSourceDriveOffset;
extern TCHAR LocalSourceDrive;
extern TCHAR LocalSourceDirectory[MAX_PATH];
extern TCHAR LocalSourceWithPlatform[MAX_PATH];
extern TCHAR LocalBootDirectory[MAX_PATH];
extern BOOL BlockOnNotEnoughSpace;
extern LONGLONG LocalSourceSpaceRequired;
extern LONGLONG WinDirSpaceFor9x;
extern BOOL UpginfsUpdated;
extern BOOL Win95upgInfUpdated;
//
// wizard stuff
//
// wizard page size
#define WIZ_PAGE_SIZE_X 317
#define WIZ_PAGE_SIZE_Y 179
#define BBSTEP_NONE 0
#define BBSTEP_COLLECTING_INFORMATION 1
#define BBSTEP_DYNAMIC_UPDATE 2
#define BBSTEP_PREPARING 3
typedef struct _PAGE_COMMON_DATA {
DLGPROC DialogProcedure;
UINT BillboardStep;
//
// State to initialize buttons to.
//
DWORD Buttons;
UINT Flags;
} PAGE_COMMON_DATA, *PPAGE_COMMON_DATA;
typedef struct _PAGE_CREATE_DATA {
//
// If these are specified, then a range of pages may come
// from somewhere else. Otherwise, it's one page whose
// resource id is given below.
//
LPPROPSHEETPAGE *ExternalPages;
PUINT ExternalPageCount;
UINT Template;
PAGE_COMMON_DATA CommonData;
} PAGE_CREATE_DATA, *PPAGE_CREATE_DATA;
typedef struct _PAGE_RUNTIME_DATA {
PAGE_COMMON_DATA CommonData;
//
// Per-page (private) data
//
DWORD PerPageData;
} PAGE_RUNTIME_DATA, *PPAGE_RUNTIME_DATA;
typedef struct _BITMAP_DATA {
CONST BITMAPINFOHEADER *BitmapInfoHeader;
PVOID BitmapBits;
HPALETTE Palette;
UINT PaletteColorCount;
BOOL Adjusted;
} BITMAP_DATA, *PBITMAP_DATA;
#define WIZPAGE_FULL_PAGE_WATERMARK 0x00000001
#define WIZPAGE_SEPARATOR_CREATED 0x00000002
#define WIZPAGE_NEW_HEADER 0x00000004
//
// compatibility data
//
typedef struct _COMPATIBILITY_DATA {
//
// general
//
LIST_ENTRY ListEntry;
//
// what type of entry
//
TCHAR Type;
//
// service-driver data
//
LPCTSTR ServiceName;
//
// registry data
//
LPCTSTR RegKey;
LPCTSTR RegValue;
LPCTSTR RegValueExpect;
//
// file data
//
LPCTSTR FileName;
LPCTSTR FileVer;
//
// common
//
LPCTSTR Description;
LPCTSTR HtmlName;
LPCTSTR TextName;
LPTSTR RegKeyName;
LPTSTR RegValName;
LPVOID RegValData;
DWORD RegValDataSize;
LPVOID SaveValue;
DWORD Flags;
LPCTSTR InfName;
LPCTSTR InfSection;
HMODULE hModDll;
PCOMPAIBILITYHAVEDISK CompHaveDisk;
} COMPATIBILITY_DATA, *PCOMPATIBILITY_DATA;
extern LIST_ENTRY CompatibilityData;
extern DWORD CompatibilityCount;
extern DWORD IncompatibilityStopsInstallation;
extern BOOL AnyNt5CompatDlls;
BOOL
AnyBlockingCompatibilityItems (
VOID
);
//
// Plug and Play device migration routines.
// (linked into winnt.dll from pnpsif.lib)
//
BOOL
MigrateDeviceInstanceData(
OUT LPTSTR *Buffer
);
BOOL
MigrateClassKeys(
OUT LPTSTR *Buffer
);
BOOL
MigrateHashValues(
OUT LPTSTR *Buffer
);
//
// Array of drive letters for all system partitions.
// Note that on amd64/x86 there will always be exactly one.
// The list is 0-terminated.
//
extern TCHAR SystemPartitionDriveLetters[27];
extern TCHAR SystemPartitionDriveLetter;
#ifdef UNICODE
extern UINT SystemPartitionCount;
extern PWSTR* SystemPartitionNtNames;
extern PWSTR SystemPartitionNtName;
extern PWSTR SystemPartitionVolumeGuid;
#else
extern PCSTR g_LocalSourcePath;
#endif
//
// UDF stuff
//
extern LPCTSTR UniquenessId;
extern LPCTSTR UniquenessDatabaseFile;
//
// Preinstall stuff
//
extern BOOL OemPreinstall;
#if defined(_AMD64_) || defined(_X86_)
typedef struct _OEM_BOOT_FILE {
struct _OEM_BOOT_FILE *Next;
LPCTSTR Filename;
} OEM_BOOT_FILE, *POEM_BOOT_FILE;
extern POEM_BOOT_FILE OemBootFiles;
#endif
extern TCHAR ForcedSystemPartition;
//
// Miscellaneous other command line parameters.
//
extern LPCTSTR CmdToExecuteAtEndOfGui;
extern BOOL AutoSkipMissingFiles;
extern BOOL HideWinDir;
extern TCHAR ProductId[64];
//
// Flag indicating that the user cancelled.
// Flag indicating that a succssessful abort should be performed.
// Handle for mutex used to guarantee that only one error dialog
// is on the screen at once.
//
extern BOOL Cancelled;
extern BOOL CancelPending;
extern BOOL Aborted;
extern HANDLE UiMutex;
//
// This indicates that well give the user some detailed data-throughput
// info.
//
extern BOOL DetailedCopyProgress;
extern ULONGLONG TotalDataCopied;
//
// Upgrade Options variables. Used to pass a multistring of
// upgrade command line options to the plugin DLLs.
//
extern LPTSTR UpgradeOptions;
extern DWORD UpgradeOptionsLength;
extern DWORD UpgradeOptionsSize;
BOOL
AppendUpgradeOption (
IN PCTSTR String
);
#if defined(_AMD64_) || defined(_X86_)
//
// Win9x upgrade report status
//
extern UINT g_UpgradeReportMode;
#endif
//
// Compliance variables
//
extern BOOL NoCompliance;
extern BOOL NoBuildCheck;
// UpgradeOnly is true is the media is CCP media and only valid
// to upgrade a system. eula.c will use this to ensure that an
// FPP pid is not used with CCP media and vice-versa
extern BOOL UpgradeOnly;
extern BOOL SkipLocaleCheck;
extern BOOL SkipVirusScannerCheck;
extern BOOL UseBIOSToBoot;
//
// TargetNativeLangID : this is native language ID of running system
//
extern LANGID TargetNativeLangID;
//
// SourceNativeLangID : this is native language ID of new NT you want to install
//
extern LANGID SourceNativeLangID;
//
// IsLanguageMatched : if source and target language are matched (or compatible)
//
// 1. if SourceNativeLangID == TargetNativeLangID
//
// 2. if SourceNativeLangID's alternative ID == TargetNativeLangID
//
extern BOOL IsLanguageMatched;
BOOL
InitLanguageDetection(
LPCTSTR SourcePath,
LPCTSTR InfFile
);
//
// Routines from Setupapi.dll
//
//
// ISSUE: be careful when using this routine on NT4, as it may fail;
// setupapi on NT4 doesn't understand LZX compression, currently used to compress files
//
extern
DWORD
(*SetupapiDecompressOrCopyFile)(
IN PCTSTR SourceFileName,
OUT PCTSTR TargetFileName,
OUT PUINT CompressionType OPTIONAL
);
extern
HINF
(*SetupapiOpenInfFile)(
IN LPCTSTR FileName,
IN LPCTSTR InfClass, OPTIONAL
IN DWORD InfStyle,
OUT PUINT ErrorLine OPTIONAL
);
extern
VOID
(*SetupapiCloseInfFile)(
IN HINF InfHandle
);
extern
BOOL
(*SetupapiFindFirstLine)(
IN HINF InfHandle,
IN PCTSTR Section,
IN PCTSTR Key, OPTIONAL
OUT PINFCONTEXT Context
);
extern
BOOL
(*SetupapiFindNextLine)(
PINFCONTEXT ContextIn,
PINFCONTEXT ContextOut
);
extern
BOOL
(*SetupapiFindNextMatchLine)(
PINFCONTEXT ContextIn,
PCTSTR Key,
PINFCONTEXT ContextOut
);
extern
LONG
(*SetupapiGetLineCount)(
IN HINF InfHandle,
IN LPCTSTR Section
);
extern
DWORD
(*SetupapiGetFieldCount)(
IN PINFCONTEXT Context
);
extern
BOOL
(*SetupapiGetStringField)(
IN PINFCONTEXT Context,
DWORD FieldIndex,
PTSTR ReturnBuffer,
DWORD ReturnBufferSize,
PDWORD RequiredSize
);
extern
BOOL
(*SetupapiGetLineByIndex)(
IN HINF InfHandle,
IN LPCTSTR Section,
IN DWORD Index,
OUT PINFCONTEXT Context
);
extern
HSPFILEQ
(*SetupapiOpenFileQueue) (
VOID
);
extern
BOOL
(*SetupapiCloseFileQueue) (
IN HSPFILEQ QueueHandle
);
extern
BOOL
(*SetupapiQueueCopy) (
IN HSPFILEQ QueueHandle,
IN PCTSTR SourceRootPath, OPTIONAL
IN PCTSTR SourcePath, OPTIONAL
IN PCTSTR SourceFilename,
IN PCTSTR SourceDescription, OPTIONAL
IN PCTSTR SourceTagfile, OPTIONAL
IN PCTSTR TargetDirectory,
IN PCTSTR TargetFilename, OPTIONAL
IN DWORD CopyStyle
);
extern
BOOL
(*SetupapiCommitFileQueue) (
IN HWND Owner, OPTIONAL
IN HSPFILEQ QueueHandle,
IN PSP_FILE_CALLBACK_W MsgHandler,
IN PVOID Context
);
extern
UINT
(*SetupapiDefaultQueueCallback) (
IN PVOID Context,
IN UINT Notification,
IN UINT_PTR Param1,
IN UINT_PTR Param2
);
extern
PVOID
(*SetupapiInitDefaultQueueCallback) (
HWND OwnerWindow
);
extern
VOID
(*SetupapiTermDefaultQueueCallback) (
PVOID Context
);
#ifdef UNICODE
extern
BOOL
(*SetupapiGetSourceFileLocation) (
HINF InfHandle, // handle of an INF file
PINFCONTEXT InfContext, // optional, context of an INF file
PCTSTR FileName, // optional, source file to locate
PUINT SourceId, // receives the source media ID
PTSTR ReturnBuffer, // optional, receives the location
DWORD ReturnBufferSize, // size of the supplied buffer
PDWORD RequiredSize // optional, buffer size needed
);
extern
BOOL
(*SetupapiGetInfInformation) (
LPCVOID InfSpec, // handle or filename of the INF file
DWORD SearchControl, // how to search for the INF file
PSP_INF_INFORMATION ReturnBuffer, // optional, receives the INF info
DWORD ReturnBufferSize, // size of the supplied buffer
PDWORD RequiredSize // optional, buffer size needed
);
extern
BOOL
(*SetupapiQueryInfFileInformation) (
PSP_INF_INFORMATION InfInformation, // structure that contains the INF info
UINT InfIndex, // index of the file to investigate
PTSTR ReturnBuffer, // optional, receives the information
DWORD ReturnBufferSize, // size of the supplied buffer
PDWORD RequiredSize // optional, buffer size needed
);
extern
BOOL
(*SetupapiQueryInfOriginalFileInformation) (
PSP_INF_INFORMATION InfInformation, // structure that contains the INF information
UINT InfIndex, // index of the file to investigate
PSP_ALTPLATFORM_INFO AlternatePlatformInfo, // optional, receives the alternate platform information
PSP_ORIGINAL_FILE_INFO OriginalFileInfo // original file information
);
#endif
//
// Custom window messages. Define so they don't overlap with
// any being used by plug-in dll's.
//
#define WMX_EDITCONTROLSTATE (WMX_PLUGIN_FIRST-1)
#define WMX_INSPECTRESULT (WMX_PLUGIN_FIRST-2)
//#define WMX_SETPROGRESSTEXT (WMX_PLUGIN_FIRST-3)
#define WMX_ERRORMESSAGEUP (WMX_PLUGIN_FIRST-4)
#define WMX_I_AM_VISIBLE (WMX_PLUGIN_FIRST-5)
#define WMX_COPYPROGRESS (WMX_PLUGIN_FIRST-6)
#define WMX_I_AM_DONE (WMX_PLUGIN_FIRST-7)
#define WMX_FINISHBUTTON (WMX_PLUGIN_FIRST-8)
#define WMX_UNATTENDED (WMX_PLUGIN_FIRST-9)
#define WMX_NEXTBUTTON (WMX_PLUGIN_FIRST-10)
#define WMX_BACKBUTTON (WMX_PLUGIN_FIRST-11)
#define WMX_VALIDATE (WMX_PLUGIN_FIRST-12)
#define WMX_SETUPUPDATE_PREPARING (WMX_PLUGIN_FIRST-13)
#define WMX_SETUPUPDATE_DOWNLOADING (WMX_PLUGIN_FIRST-14)
#define WMX_SETUPUPDATE_PROCESSING (WMX_PLUGIN_FIRST-15)
#define WMX_SETUPUPDATE_DONE (WMX_PLUGIN_FIRST-16)
#define WMX_SETUPUPDATE_CANCEL (WMX_PLUGIN_FIRST-17)
#define WMX_SETUPUPDATE_INIT_RETRY (WMX_PLUGIN_FIRST-18)
#define WMX_SETUPUPDATE_THREAD_DONE (WMX_PLUGIN_FIRST-19)
#ifdef RUN_SYSPARSE
#define WMX_SYSPARSE_DONE (WMX_PLUGIN_FIRST-20)
#endif
#define WMX_DYNAMIC_UPDATE_COMPLETE (WMX_PLUGIN_FIRST-21)
//
// Helper macro for uppercasing
//
#define TOUPPER(x) (TCHAR)CharUpper((LPTSTR)x)
//
// Routine that does everything by starting the wizard.
//
VOID
Wizard(
VOID
);
//
// Routine that builds a cmdcons installation.
//
VOID
DoBuildCmdcons(
VOID
);
VOID
FixUpWizardTitle(
IN HWND Wizard
);
//
// Cleanup routine and globals used by the cleanup stuff.
//
DWORD
StartCleanup(
IN PVOID ThreadParameter
);
#if defined(_AMD64_) || defined(_X86_)
BOOL
RestoreBootSector(
VOID
);
BOOL
RestoreBootIni(
VOID
);
BOOL
SaveRestoreBootFiles_NEC98(
IN UCHAR Flag
);
#define NEC98SAVEBOOTFILES 0
#define NEC98RESTOREBOOTFILES 1
BOOL
IsDriveAssignNEC98(
VOID
);
//
// Check ATA Drive
//
BOOLEAN
CheckATACardonNT4(
HANDLE hDisk
);
//
// Check formatted drive type
//
BOOLEAN
IsValidDrive(
TCHAR Drive
);
#endif // defined(_AMD64_) || defined(_X86_)
BOOL
RestoreNvRam(
VOID
);
//
// Thread that inspects sources, loads infs, builds the copy list,
// checks disk space, etc. And some worker routines.
//
DWORD
InspectAndLoadThread(
IN PVOID ThreadParam
);
BOOL
InspectSources(
IN HWND ParentWnd
);
BOOL
BuildCopyListWorker(
IN HWND hdlg
);
BOOL
FindLocalSourceAndCheckSpaceWorker(
IN HWND hdlg,
IN BOOL QuickTest,
IN LONGLONG AdditionalPadding
);
UINT
GetTotalFileCount(
VOID
);
DWORD
StartCopyingThread(
IN PVOID ThreadParameter
);
VOID
CancelledMakeSureCopyThreadsAreDead(
VOID
);
DWORD
DoPostCopyingStuff(
IN PVOID ThreadParam
);
//
// File copy error routine and outcomes.
//
UINT
FileCopyError(
IN HWND ParentWindow,
IN LPCTSTR SourceFilename,
IN LPCTSTR TargetFilename,
IN UINT Win32Error,
IN BOOL MasterList
);
#define COPYERR_SKIP 1
#define COPYERR_EXIT 2
#define COPYERR_RETRY 3
//
// Routine to add an optional directory to the list of dirs
// we copy.
//
BOOL
RememberOptionalDir(
IN LPCTSTR Directory,
IN UINT Flags
);
//
// Resource utility routines.
//
PCTSTR
GetStringResource (
IN UINT Id // ID or pointer to string name
);
VOID
FreeStringResource (
IN PCTSTR String
);
VOID
SaveMessageForSMS(
IN DWORD MessageId,
...
);
VOID
SaveTextForSMS(
IN PCTSTR Buffer
);
int
MessageBoxFromMessage(
IN HWND Window,
IN DWORD MessageId,
IN BOOL SystemMessage,
IN DWORD CaptionStringId,
IN UINT Style,
...
);
int
MessageBoxFromMessageV(
IN HWND Window,
IN DWORD MessageId,
IN BOOL SystemMessage,
IN DWORD CaptionStringId,
IN UINT Style,
IN va_list *Args
);
int
MessageBoxFromMessageWithSystem(
IN HWND Window,
IN DWORD MessageId,
IN DWORD CaptionStringId,
IN UINT Style,
IN HMODULE hMod
);
int
MessageBoxFromMessageAndSystemError(
IN HWND Window,
IN DWORD MessageId,
IN DWORD SystemMessageId,
IN DWORD CaptionStringId,
IN UINT Style,
...
);
HBITMAP
LoadResourceBitmap(
IN HINSTANCE hInst,
IN LPCTSTR Id,
OUT HPALETTE *Palette
);
BOOL
GetBitmapDataAndPalette(
IN HINSTANCE hInst,
IN LPCTSTR Id,
OUT HPALETTE *Palette,
OUT PUINT ColorCount,
OUT CONST BITMAPINFOHEADER **BitmapData
);
UINT
GetYPositionOfDialogItem(
IN LPCTSTR Dialog,
IN UINT ControlId
);
//
// Security routines.
//
BOOL
IsUserAdmin(
VOID
);
BOOL
DoesUserHavePrivilege(
PCTSTR PrivilegeName
);
BOOL
EnablePrivilege(
IN PTSTR PrivilegeName,
IN BOOL Enable
);
//
// Inf routines.
//
DWORD
LoadInfFile(
IN LPCTSTR Filename,
IN BOOL OemCodepage,
OUT PVOID *InfHandle
);
VOID
UnloadInfFile(
IN PVOID InfHandle
);
LONG
InfGetSectionLineCount(
IN PVOID INFHandle,
IN PTSTR SectionName
);
LPCTSTR
InfGetFieldByIndex(
IN PVOID INFHandle,
IN LPCTSTR SectionName,
IN unsigned LineIndex,
IN unsigned ValueIndex
);
LPCTSTR
InfGetFieldByKey(
IN PVOID INFHandle,
IN LPCTSTR SectionName,
IN LPCTSTR Key,
IN unsigned ValueIndex
);
BOOL
InfDoesLineExistInSection(
IN PVOID INFHandle,
IN LPCTSTR SectionName,
IN LPCTSTR Key
);
BOOL
InfDoesEntryExistInSection (
IN PVOID INFHandle,
IN LPCTSTR SectionName,
IN LPCTSTR Entry
);
LPCTSTR
InfGetLineKeyName(
IN PVOID INFHandle,
IN LPCTSTR SectionName,
IN unsigned LineIndex
);
typedef struct {
// Caller members (read-only)
PCTSTR FieldZeroData;
unsigned LineIndex;
// Internal members
PVOID InfHandle;
PCTSTR SectionName;
} INF_ENUM, *PINF_ENUM;
BOOL
EnumFirstInfLine (
OUT PINF_ENUM InfEnum,
IN PVOID InfHandle,
IN PCTSTR InfSection
);
BOOL
EnumNextInfLine (
IN OUT PINF_ENUM InfEnum
);
VOID
AbortInfLineEnum (
IN PINF_ENUM InfEnum // ZEROED
);
//
// Routines to manipulate parameters files like unattend.txt,
// the param file we pass to text mode setup, etc.
//
BOOL
WriteParametersFile(
IN HWND ParentWindow
);
BOOL
AddExternalParams(
IN HWND ParentWindow
);
//
// Miscellaenous utility routines.
//
LPTSTR *
CommandLineToArgv(
OUT int *NumArgs
);
VOID
MyWinHelp(
IN HWND Window,
IN UINT Command,
IN ULONG_PTR Data
);
BOOL
ConcatenatePaths(
IN OUT PTSTR Path1,
IN LPCTSTR Path2,
IN DWORD BufferSizeChars
);
LPTSTR
DupString(
IN LPCTSTR String
);
UINT
MyGetDriveType(
IN TCHAR Drive
);
#ifdef UNICODE
UINT
MyGetDriveType2 (
IN PCWSTR NtDeviceName
);
BOOL
MyGetDiskFreeSpace (
IN PCWSTR NtVolumeName,
IN PDWORD SectorsPerCluster,
IN PDWORD BytesPerSector,
IN PDWORD NumberOfFreeClusters,
IN PDWORD TotalNumberOfClusters
);
#endif
BOOL
GetPartitionInfo(
IN TCHAR Drive,
OUT PPARTITION_INFORMATION PartitionInfo
);
BOOL
IsDriveNTFT(
IN TCHAR Drive,
IN PCTSTR NtVolumeName
);
BOOL
IsDriveVeritas(
IN TCHAR Drive,
IN PCTSTR NtVolumeName
);
#ifdef UNICODE
BOOL
IsSoftPartition(
IN TCHAR Drive,
IN PCTSTR NtVolumeName
);
#else
#define IsSoftPartition(d,n) (FALSE)
#endif
BOOL
IsDriveNTFS(
IN TCHAR Drive
);
BOOL
IsMachineSupported(
OUT PCOMPATIBILITY_ENTRY CompEntry
);
BOOL
GetAndSaveNTFTInfo(
IN HWND ParentWindow
);
VOID
ForceStickyDriveLetters(
);
DWORD
MapFileForRead(
IN LPCTSTR FileName,
OUT PDWORD FileSize,
OUT PHANDLE FileHandle,
OUT PHANDLE MappingHandle,
OUT PVOID *BaseAddress
);
DWORD
UnmapFile(
IN HANDLE MappingHandle,
IN PVOID BaseAddress
);
VOID
GenerateCompressedName(
IN LPCTSTR Filename,
OUT LPTSTR CompressedName
);
DWORD
CreateMultiLevelDirectory(
IN LPCTSTR Directory
);
VOID
MyDelnode(
IN LPCTSTR Directory
);
BOOL
ForceFileNoCompress(
IN LPCTSTR Filename
);
BOOL
IsCurrentOsServer(
void
);
BOOL
IsCurrentAdvancedServer(
void
);
BOOL
IsNTFSConversionRecommended(
void
);
BOOL
ForceBootFilesUncompressed(
IN HWND ParentWindow,
IN BOOL TellUserAboutError
);
BOOLEAN
AdjustPrivilege(
PCTSTR Privilege
);
BOOL
GetUserPrintableFileSizeString(
IN DWORDLONG Size,
OUT LPTSTR Buffer,
IN DWORD BufferSize
);
BOOL
FileExists(
IN PCTSTR FileName,
OUT PWIN32_FIND_DATA FindData OPTIONAL
);
BOOL
DoesDirectoryExist (
IN PCTSTR DirSpec
);
BOOL
InDriverCacheInf(
IN PVOID InfHandle,
IN PCTSTR FileName,
OUT PTSTR DriverCabName, OPTIONAL
IN DWORD BufferChars OPTIONAL
);
BOOL
BuildSystemPartitionPathToFile (
IN PCTSTR FileName,
OUT PTSTR Path,
IN INT BufferSizeChars
);
BOOL
FindPathToInstallationFileEx (
IN PCTSTR FileName,
OUT PTSTR PathToFile,
IN INT PathToFileBufferSize,
OUT PBOOL Compressed OPTIONAL
);
#define FindPathToInstallationFile(n,p,s) FindPathToInstallationFileEx(n,p,s,NULL)
BOOL
FindPathToWinnt32File (
IN PCTSTR FileRelativePath,
OUT PTSTR PathToFile,
IN INT PathToFileBufferSize
);
BOOL
GetFileVersionEx (
IN PCTSTR FilePath,
OUT PTSTR FileVersion,
IN INT CchFileVersion
);
#define GetFileVersion(f,v) GetFileVersionEx(f,v,ARRAYSIZE(v))
//
// #define to use MyPrivateProfileString to get around virus checkers monitoring operations to C
// drive that cause us to fail WritePrivateProfileString
// The problem is that usually these s/w examine the files we touch and in somecases open it
// with exclusive access. We just need to wait for them to be done.
//
BOOL
MyWritePrivateProfileString(
LPCTSTR lpAppName, // pointer to section name
LPCTSTR lpKeyName, // pointer to key name
LPCTSTR lpString, // pointer to string to add
LPCTSTR lpFileName // pointer to initialization filename
);
#ifdef UNICODE
#define WritePrivateProfileStringW(w,x,y,z) MyWritePrivateProfileString(w,x,y,z)
#else
#define WritePrivateProfileStringA(w,x,y,z) MyWritePrivateProfileString(w,x,y,z)
#endif
//
// Routines having to do with advanced program options
//
VOID
InitVariousOptions(
VOID
);
VOID
DoOptions(
IN HWND Parent
);
VOID
DoLanguage(
IN HWND Parent
);
VOID
DoAccessibility(
IN HWND Parent
);
BOOL
BrowseForDosnetInf(
IN HWND hdlg,
IN LPCTSTR InitialPath,
OUT TCHAR NewPath[MAX_PATH]
);
BOOL
IsValid8Dot3(
IN LPCTSTR Path
);
//
// Routines having to do with eula and pid
//
#define MAX_PID30_EDIT 5
extern LPTSTR g_EncryptedPID;
extern BOOL g_bDeferPIDValidation;
extern BOOL EulaComplete;
typedef enum InstallType
{
SelectInstall,
OEMInstall,
RetailInstall
};
VOID
GetSourceInstallType(
OUT OPTIONAL PDWORD InstallVariation
);
BOOL
SetPid30(
HWND hdlg,
LONG ExpectedPidType,
LPTSTR pProductId
);
#ifdef UNICODE
PCHAR
FindRealHalName(
TCHAR *pHalFileName
);
#endif
//
// Debugging and logging
//
typedef enum {
Winnt32LogSevereError,
Winnt32LogError,
Winnt32LogWarning,
Winnt32LogInformation,
Winnt32LogDetailedInformation,
Winnt32LogMax
#define WINNT32_HARDWARE_LOG 0x40000000
} Winnt32DebugLevel;
extern Winnt32DebugLevel DebugLevel;
BOOL
StartDebugLog(
IN LPCTSTR DebugFileLog,
IN Winnt32DebugLevel Level
);
VOID
CloseDebugLog(
VOID
);
BOOL
DebugLog(
IN Winnt32DebugLevel Level,
IN LPCTSTR Text, OPTIONAL
IN UINT MessageId,
...
);
BOOL
DebugLog2(
IN Winnt32DebugLevel Level,
IN LPCTSTR Text, OPTIONAL
IN UINT MessageId,
IN va_list ArgList
);
BOOL
DynUpdtDebugLog(
IN Winnt32DebugLevel Level,
IN LPCTSTR Text,
IN UINT MessageId,
...
);
BOOL
ConcatenateFile(
IN HANDLE hOpenFile,
IN LPTSTR FileName
);
VOID
GatherOtherLogFiles(
VOID
);
//
// Memory allocation.
//
#define MALLOC(s) malloc(s)
#define FREE(b) free((PVOID)b)
#define REALLOC(b,s) realloc((b),(s))
//
// Floppy-related stuff.
//
extern BOOL MakeBootMedia;
extern BOOL Floppyless;
//
// boot loader timeout value, in string form
//
extern TCHAR Timeout[32];
#if defined(_AMD64_) || defined(_X86_)
UINT
FloppyGetTotalFileCount(
VOID
);
DWORD
FloppyWorkerThread(
IN PVOID ThreadParameter
);
//
// Routine to lay NT boot code, munge boot.ini, create aux boot sector, etc.
//
BOOL
DoX86BootStuff(
IN HWND ParentWindow
);
BOOL
PatchTextIntoBootCode(
VOID
);
VOID
MigrateBootIniData();
//
// Drive information abstraction
//
typedef struct _WINNT32_DRIVE_INFORMATION {
DWORD CylinderCount;
DWORD HeadCount;
DWORD SectorsPerTrack;
ULONGLONG SectorCount;
WORD BytesPerSector;
} WINNT32_DRIVE_INFORMATION, *PWINNT32_DRIVE_INFORMATION;
//
// Routine to get drive form-factor/type.
//
MEDIA_TYPE
GetMediaType(
IN TCHAR Drive,
IN PWINNT32_DRIVE_INFORMATION DriveInfo OPTIONAL
);
//
// Disk sector I/O routines
//
BOOL
ReadDiskSectors(
IN TCHAR Drive,
IN UINT StartSector,
IN UINT SectorCount,
IN UINT SectorSize,
OUT LPBYTE Buffer
);
BOOL
WriteDiskSectors(
IN TCHAR Drive,
IN UINT StartSector,
IN UINT SectorCount,
IN UINT SectorSize,
IN LPBYTE Buffer
);
BOOL
MarkPartitionActive(
IN TCHAR DriveLetter
);
//
// Enum for filesystems we recognize
//
typedef enum {
Winnt32FsUnknown,
Winnt32FsFat,
Winnt32FsFat32,
Winnt32FsNtfs
} WINNT32_SYSPART_FILESYSTEM;
//
// Hardcoded constant for sector size, and sizes
// of bootcode areas for various filesystems.
//
#define WINNT32_SECTOR_SIZE 512
#define WINNT32_FAT_BOOT_SECTOR_COUNT 1
#define WINNT32_NTFS_BOOT_SECTOR_COUNT 16
#define WINNT32_MAX_BOOT_SIZE (16*WINNT32_SECTOR_SIZE)
BOOL
PatchBootCode(
IN WINNT32_SYSPART_FILESYSTEM FileSystem,
IN TCHAR Drive,
IN OUT PUCHAR BootCode,
IN DWORD BootCodeSize
);
#endif // defined(_AMD64_) || defined(_X86_)
//
// ARC/NV-RAM stuff
//
#if defined _IA64_
#define SETUPLDR_FILENAME L"SETUPLDR.EFI"
#elif defined _X86_
#define SETUPLDR_FILENAME L"arcsetup.exe"
#else
#define SETUPLDR_FILENAME L"SETUPLDR"
#endif
BOOL
SetUpNvRam(
IN HWND ParentWindow
);
DWORD
DriveLetterToArcPath(
IN WCHAR DriveLetter,
OUT LPWSTR *ArcPath
);
//
// Implement a terminalserver-safe GetWindowsDirectory()
//
UINT
MyGetWindowsDirectory(
LPTSTR MyBuffer,
UINT Size
);
//
// Upgrade stuff
//
typedef struct _UPGRADE_SUPPORT {
TCHAR DllPath[MAX_PATH];
HINSTANCE DllModuleHandle;
UINT AfterWelcomePageCount;
LPPROPSHEETPAGE Pages1;
UINT AfterOptionsPageCount;
LPPROPSHEETPAGE Pages2;
UINT BeforeCopyPageCount;
LPPROPSHEETPAGE Pages3;
PWINNT32_PLUGIN_INIT_ROUTINE InitializeRoutine;
PWINNT32_PLUGIN_GETPAGES_ROUTINE GetPagesRoutine;
PWINNT32_PLUGIN_WRITEPARAMS_ROUTINE WriteParamsRoutine;
PWINNT32_PLUGIN_CLEANUP_ROUTINE CleanupRoutine;
PWINNT32_PLUGIN_OPTIONAL_DIRS_ROUTINE OptionalDirsRoutine;
} UPGRADE_SUPPORT, *PUPGRADE_SUPPORT;
extern UPGRADE_SUPPORT UpgradeSupport;
//
// Only check to see if we can upgrade or not.
//
extern BOOL CheckUpgradeOnly;
extern BOOL CheckUpgradeOnlyQ;
extern BOOL UpgradeAdvisorMode;
BOOL
InitializeArcStuff(
IN HWND Parent
);
BOOL
ArcInitializeArcStuff(
IN HWND Parent
);
//
// Test to see if we're on an ARC based machine
#ifdef UNICODE
#if defined(_X86_)
BOOL
IsArc(
VOID
);
#elif defined(_AMD64_)
#define IsArc() FALSE
#elif defined(_IA64_)
#define IsArc() TRUE
#else
#error "No Target Architecture"
#endif
#if defined(EFI_NVRAM_ENABLED)
BOOL
IsEfi(
VOID
);
#else
#define IsEfi() FALSE
#endif
VOID
MigrateBootVarData(
VOID
);
#else
#define IsArc() FALSE
#define MigrateBootVarData()
#endif
//
// Build the command console.
//
extern BOOL BuildCmdcons;
#ifdef RUN_SYSPARSE
//
// NoSysparse. Set to true if we don't want to run sysparse.exe
// This hack should be removed before RTM.
//
extern BOOL NoSysparse;
extern PROCESS_INFORMATION piSysparse;
#endif
//
// Internal/undoc'ed stuff
//
extern UINT NumberOfLicensedProcessors;
extern BOOL IgnoreExceptionPackages;
//
// Where to get missing files.
//
extern TCHAR AlternateSourcePath[MAX_PATH];
VOID
InternalProcessCmdLineArg(
IN LPCTSTR Arg
);
//
// Get Harddisk BPS
//
ULONG
GetHDBps(
HANDLE hDisk
);
#define INIT_OBJA(Obja,UnicodeString,UnicodeText) \
\
RtlInitUnicodeString((UnicodeString),(UnicodeText)); \
\
InitializeObjectAttributes( \
(Obja), \
(UnicodeString), \
OBJ_CASE_INSENSITIVE, \
NULL, \
NULL \
)
#define ALIGN(p,val) \
\
(PVOID)((((ULONG_PTR)(p) + (val) - 1)) & (~((ULONG_PTR)(val) - 1)))
#if defined(_AMD64_) || defined(_X86_)
//
// PC-98 stuff
//
VOID
SetAutomaticBootselector(
VOID
);
VOID
SetAutomaticBootselectorNT(
VOID
);
VOID
SetAutomaticBootselector95(
VOID
);
//
// read/write disk sectors
//
NTSTATUS
SpReadWriteDiskSectors(
IN HANDLE Handle,
IN ULONG SectorNumber,
IN ULONG SectorCount,
IN ULONG BytesPerSector,
IN OUT PVOID AlignedBuffer,
IN BOOL Write
);
#define NEC_WRITESEC TRUE
#define NEC_READSEC FALSE
//
// Get WindowsNT System Position
//
UCHAR
GetSystemPosition(
PHANDLE phDisk,
PDISK_GEOMETRY SystemMediaInfo
);
BOOL
IsNEC98(
VOID
);
LONG
CalcHiddenSector(
IN TCHAR SystemPartitionDriveLetter,
IN SHORT Bps
);
#endif
//
// Registry migration stuff
//
//
// Context structure used for generating inf files (infgen.c)
//
#define INFLINEBUFLEN 512
typedef struct _INFFILEGEN {
TCHAR FileName[MAX_PATH];
HANDLE FileHandle;
BOOL SawBogusOp;
TCHAR LineBuf[INFLINEBUFLEN];
unsigned LineBufUsed;
} INFFILEGEN, *PINFFILEGEN;
DWORD
InfStart(
IN LPCTSTR InfName,
IN LPCTSTR Directory,
OUT PINFFILEGEN *Context
);
DWORD
InfEnd(
IN OUT PINFFILEGEN *Context
);
DWORD
InfCreateSection(
IN LPCTSTR SectionName,
IN OUT PINFFILEGEN *Context
);
DWORD
InfRecordAddReg(
IN OUT PINFFILEGEN Context,
IN HKEY Key,
IN LPCTSTR Subkey,
IN LPCTSTR Value, OPTIONAL
IN DWORD DataType,
IN PVOID Data,
IN DWORD DataLength,
IN BOOL SetNoClobberFlag
);
ULONG
DumpRegKeyToInf(
IN PINFFILEGEN InfContext,
IN HKEY PredefinedKey,
IN LPCTSTR FullKeyPath,
IN BOOL DumpIfEmpty,
IN BOOL DumpSubKeys,
IN BOOL SetNoClobberFlag,
IN BOOL DumpNonVolatileKey
);
DWORD
WriteText(
IN HANDLE FileHandle,
IN UINT MessageId,
...
);
//
// Unsupported driver migration stuff
//
//
// Structure used to build a list of files associated to and usupported
// driver that was detected on the NT system to be upgraded.
//
typedef struct _UNSUPORTED_PNP_HARDWARE_ID {
//
// Pointer to the next element in the list
//
struct _UNSUPORTED_PNP_HARDWARE_ID *Next;
//
// String that represents the hardware id of a PNP device.
//
LPTSTR Id;
//
// Service for the device
//
LPTSTR Service;
//
// GUID for this device, if any
//
LPTSTR ClassGuid;
} UNSUPORTED_PNP_HARDWARE_ID, *PUNSUPORTED_PNP_HARDWARE_ID;
typedef struct _UNSUPORTED_DRIVER_FILE_INFO {
//
// Pointer to the next element in the list
//
struct _UNSUPORTED_DRIVER_FILE_INFO *Next;
//
// Pointer to the file name
//
LPTSTR FileName;
//
// Pointer to the path relative to %SystemRoot% where the file
// should be installed.
//
LPTSTR TargetDirectory;
} UNSUPORTED_DRIVER_FILE_INFO, *PUNSUPORTED_DRIVER_FILE_INFO;
typedef struct _UNSUPORTED_DRIVER_INSTALL_INFO {
//
// Pointer to the next element in the list
//
struct _UNSUPORTED_DRIVER_INSTALL_INFO *Next;
//
// Pointer to the path relative to %SystemRoot%
// where the actual inf file is currently installed
//
LPTSTR InfRelPath;
//
// Pointer to the actual INF file name
//
LPTSTR InfFileName;
//
// Pointer to the original INF file name (optional)
//
LPTSTR InfOriginalFileName;
//
// Pointer to the path relative to %SystemRoot%
// where the actual catalog file is currently installed (optional)
//
LPTSTR CatalogRelPath;
//
// Pointer to the actual catalog name (optional)
//
LPTSTR CatalogFileName;
//
// Pointer to the original catalog name (optional)
//
LPTSTR CatalogOriginalFileName;
} UNSUPORTED_DRIVER_INSTALL_INFO, *PUNSUPORTED_DRIVER_INSTALL_INFO;
typedef struct _UNSUPORTED_DRIVER_REGKEY_INFO {
//
// Pointer to the next element in the list
//
struct _UNSUPORTED_DRIVER_REGKEY_INFO *Next;
//
// A predefined key
//
HKEY PredefinedKey;
//
// Path to the key to be migrated, relative to a predefined key.
//
LPTSTR KeyPath;
//
// Undicates whether or not volatile keys should be migrated
//
BOOL MigrateVolatileKeys;
} UNSUPORTED_DRIVER_REGKEY_INFO, *PUNSUPORTED_DRIVER_REGKEY_INFO;
typedef struct _UNSUPORTED_DRIVER_INFO {
//
// Pointer to the next element in the list
//
struct _UNSUPORTED_DRIVER_INFO *Next;
//
// A string that identifies the driver to be migrated (such as aic78xx)
//
LPTSTR DriverId;
//
// Points to the list of files associated to the unsupported driver
//
PUNSUPORTED_DRIVER_REGKEY_INFO KeyList;
//
// Points to the list of keys associated to the unsupported driver
//
PUNSUPORTED_DRIVER_FILE_INFO FileList;
//
// Points to the list of install info associated to the unsupported driver
//
PUNSUPORTED_DRIVER_INSTALL_INFO InstallList;
//
// Points to the list of hardware ids associated to the unsupported driver
//
PUNSUPORTED_PNP_HARDWARE_ID HardwareIdsList;
} UNSUPORTED_DRIVER_INFO, *PUNSUPORTED_DRIVER_INFO;
//
// Unsupported driver list
// This list contains the information about the unsupported drivers that needs
// to be migrated on a clean install or upgrade.
//
// extern PUNSUPORTED_DRIVER_INFO UnsupportedDriverList;
BOOL
BuildUnsupportedDriverList(
IN PVOID TxtsetupSifHandle,
OUT PUNSUPORTED_DRIVER_INFO* DriverList
);
BOOL
SaveUnsupportedDriverInfo(
IN HWND ParentWindow,
IN LPTSTR FileName,
IN PUNSUPORTED_DRIVER_INFO DriverList
);
BOOL
AddUnsupportedFilesToCopyList(
IN HWND ParentWindow,
IN PUNSUPORTED_DRIVER_INFO DriverList
);
BOOL
MigrateUnsupportedNTDrivers(
IN HWND ParentWindow,
IN PVOID TxtsetupSifHandle
);
// Error codes and Function to check schema version for NT5 DC Upgrades
#define DSCHECK_ERR_SUCCESS 0
#define DSCHECK_ERR_FILE_NOT_FOUND 1
#define DSCHECK_ERR_FILE_COPY 2
#define DSCHECK_ERR_VERSION_MISMATCH 3
#define DSCHECK_ERR_CREATE_DIRECTORY 4
BOOL
ISDC(
VOID
);
BOOL
IsNT5DC();
int
CheckSchemaVersionForNT5DCs(
IN HWND ParentWnd
);
//
// Diagnostic/debug functions in debug.c
//
//
// Allow assertion checking to be turned on independently
// of DBG, like by specifying C_DEFINES=-DASSERTS_ON=1 in sources file.
//
#ifndef ASSERTS_ON
#if DBG
#define ASSERTS_ON 1
#else
#define ASSERTS_ON 0
#endif
#endif
#if ASSERTS_ON
#ifndef MYASSERT
#define MYASSERT(x) if(!(x)) { AssertFail(__FILE__,__LINE__,#x); }
VOID
AssertFail(
IN PSTR FileName,
IN UINT LineNumber,
IN PSTR Condition
);
#endif
#else
#define MYASSERT(x)
#endif
#if defined(_AMD64_) || defined(_X86_)
VOID
ProtectAllModules (
VOID
);
#endif
BOOL
WriteHeadlessParameters(
IN LPCTSTR FileName
);
//
// Setup Log prototypes in setupapi.dll
//
typedef BOOL(WINAPI * SETUPOPENLOG)(BOOL Erase);
typedef BOOL(WINAPI * SETUPLOGERROR)(PCTSTR MessageString, LogSeverity Severity);
typedef VOID(WINAPI * SETUPCLOSELOG)(VOID);
//
// Default throughput (5 KB/msec)
//
#define DEFAULT_IO_THROUGHPUT (5 * 1024)
extern DWORD dwThroughPutSrcToDest;
extern DWORD dwThroughPutHDToHD;
void CalcThroughput();
// Should allow 1K for strings for localization
#define MAX_STRING 1024
BOOL
SaveAdvancedOptions (
IN PCTSTR AnswerFile
);
BOOL
SaveLanguageOptions (
IN PCTSTR AnswerFile
);
BOOL
SaveAccessibilityOptions (
IN PCTSTR AnswerFile
);
BOOL
LoadAdvancedOptions (
IN PCTSTR AnswerFile
);
BOOL
LoadLanguageOptions (
IN PCTSTR AnswerFile
);
BOOL
LoadAccessibilityOptions (
IN PCTSTR AnswerFile
);
BOOL
AddCopydirIfExists(
IN LPTSTR pszPathToCopy,
IN UINT Flags
);
BOOL
IsNetConnectivityAvailable (
VOID
);
BOOL
ValidatePidEx(LPTSTR PID, BOOL *pbStepup, BOOL *bSelect);
#ifdef PRERELEASE
#define TEST_EXCEPTION 1
#endif
#define SETUP_FAULTH_APPNAME "drw\\faulth.dll"
//#define SETUP_URL "officewatson"
#define SETUP_URL "watson.microsoft.com"
#define S_WINNT32LOGFILE TEXT("WINNT32.LOG")
#define S_DEFAULT_NT_COMPAT_FILENAME TEXT("UPGRADE.TXT")
#ifdef TEST_EXCEPTION
void DoException( DWORD dwSetupArea);
#endif