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
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
|