mirror of https://github.com/tongzx/nt5src
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.
2371 lines
40 KiB
2371 lines
40 KiB
/*++
|
|
|
|
Copyright (c) 1995 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
setupp.h
|
|
|
|
Abstract:
|
|
|
|
Private top-level header file for Windows NT Setup module.
|
|
|
|
Author:
|
|
|
|
Ted Miller (tedm) 11-Jan-1995
|
|
|
|
Revision History:
|
|
|
|
--*/
|
|
|
|
|
|
//
|
|
// System header files
|
|
//
|
|
#include <nt.h>
|
|
#include <ntrtl.h>
|
|
#include <nturtl.h>
|
|
#include <ntsam.h>
|
|
#include <ntlsa.h>
|
|
#include <ntdddisk.h>
|
|
#include <ntapmsdk.h>
|
|
#define OEMRESOURCE // setting this gets OBM_ constants in windows.h
|
|
#include <windows.h>
|
|
#include <winspool.h>
|
|
#include <winsvcp.h>
|
|
#include <ntdskreg.h>
|
|
#include <ntddft.h>
|
|
#include <ddeml.h>
|
|
#include <commdlg.h>
|
|
#include <commctrl.h>
|
|
#include <setupapi.h>
|
|
#include <spapip.h>
|
|
#include <cfgmgr32.h>
|
|
#include <objbase.h>
|
|
#include <syssetup.h>
|
|
#include <ntsetup.h>
|
|
#include <userenv.h>
|
|
#include <userenvp.h>
|
|
#include <regstr.h>
|
|
#include <setupbat.h>
|
|
#include <shlobj.h>
|
|
#include <shlwapi.h>
|
|
#include <cryptui.h>
|
|
#include <wincrypt.h>
|
|
#include <dnsapi.h>
|
|
#include <winnls.h>
|
|
#include <encrypt.h>
|
|
// For setting default power scheme
|
|
#include <initguid.h>
|
|
#include <poclass.h>
|
|
#include <powrprofp.h>
|
|
// For NetGetJoinInformation & NetApiBufferFree
|
|
#include <lmjoin.h>
|
|
#include <lmapibuf.h>
|
|
// For EnableSR()
|
|
#include <srrpcapi.h>
|
|
|
|
#ifdef _WIN64
|
|
#include <wow64reg.h>
|
|
#endif
|
|
|
|
//
|
|
// CRT header files
|
|
//
|
|
#include <process.h>
|
|
#include <wchar.h>
|
|
#include <stddef.h>
|
|
#include <stdlib.h>
|
|
#include <stdio.h>
|
|
#include <time.h>
|
|
#include <limits.h>
|
|
#ifdef UNICODE
|
|
#define _UNICODE
|
|
#endif
|
|
#include <tchar.h>
|
|
|
|
//
|
|
// Private header files
|
|
//
|
|
#include "res.h"
|
|
#include "msg.h"
|
|
#include "helpids.h"
|
|
#include "unattend.h"
|
|
#include "sif.h"
|
|
#include "watch.h"
|
|
#include "userdiff.h"
|
|
#include "setuplog.h"
|
|
#include "pidgen.h"
|
|
#include "mgdlllib.h"
|
|
#include "dynupdt.h"
|
|
|
|
#include <sfcapip.h>
|
|
#include <sfcfiles.h>
|
|
#include <excppkg.h>
|
|
#include <mscat.h>
|
|
#include <softpub.h>
|
|
|
|
|
|
#if defined(_AMD64_)
|
|
#include "amd64\spx86.h"
|
|
#elif defined(_X86_)
|
|
#include "i386\spx86.h"
|
|
#endif
|
|
|
|
|
|
//
|
|
// Custom window messages.
|
|
//
|
|
#define WM_IAMVISIBLE (WM_APP + 0)
|
|
#define WM_SIMULATENEXT (WM_APP + 1)
|
|
#define WM_MY_PROGRESS (WM_APP + 2)
|
|
#define WM_NEWBITMAP (WM_APP + 3)
|
|
#define WM_MY_STATUS (WM_APP + 4)
|
|
|
|
#define WMX_TERMINATE (WM_APP + 5)
|
|
#define WMX_VALIDATE (WM_APP + 6)
|
|
|
|
// Message used to end the main setup window.
|
|
#define WM_EXIT_SETUPWINDOW (WM_APP + 7)
|
|
|
|
// Billboard private messages
|
|
#define WMX_SETPROGRESSTEXT (WM_APP + 8)
|
|
#define WMX_BB_SETINFOTEXT (WM_APP + 9)
|
|
#define WMX_BBPROGRESSGAUGE (WM_APP + 10)
|
|
#define WMX_BBTEXT (WM_APP + 11)
|
|
#define WMX_PROGRESSTICKS (WM_APP + 12)
|
|
//
|
|
// enum for use with WM_NEWBITMAP
|
|
//
|
|
typedef enum {
|
|
SetupBmBackground,
|
|
SetupBmLogo,
|
|
SetupBmBanner // text, not a bitmap
|
|
} SetupBm;
|
|
|
|
//
|
|
// Context for file queues in SysSetup
|
|
//
|
|
typedef struct _SYSSETUP_QUEUE_CONTEXT {
|
|
PVOID DefaultContext;
|
|
BOOL Skipped;
|
|
} SYSSETUP_QUEUE_CONTEXT, *PSYSSETUP_QUEUE_CONTEXT;
|
|
|
|
//
|
|
// Context for migrating exception packages
|
|
//
|
|
typedef struct _EXCEPTION_MIGRATION_CONTEXT {
|
|
PDWORD Count;
|
|
HWND hWndProgress;
|
|
BOOL AnyComponentFailed;
|
|
} EXCEPTION_MIGRATION_CONTEXT, *PEXCEPTION_MIGRATION_CONTEXT;
|
|
|
|
//
|
|
// context for file registration in syssetup
|
|
//
|
|
typedef struct _REGISTRATION_CONTEXT {
|
|
HWND hWndParent;
|
|
HWND hWndProgress;
|
|
} REGISTRATION_CONTEXT, *PREGISTRATION_CONTEXT;
|
|
|
|
|
|
|
|
//
|
|
// Constant for SETUPLDR. Use #ifdef since it has different names for
|
|
// different architectures.
|
|
//
|
|
#ifdef _IA64_
|
|
#define SETUPLDR L"SETUPLDR.EFI"
|
|
#endif
|
|
|
|
#ifdef _AMD64_
|
|
#define SETUPLDR L"SETUPLDR"
|
|
#endif
|
|
|
|
//
|
|
// Module handle for this module.
|
|
//
|
|
extern HANDLE MyModuleHandle;
|
|
|
|
//
|
|
// full path to this module
|
|
//
|
|
extern WCHAR MyModuleFileName[MAX_PATH];
|
|
|
|
//
|
|
// unattend answer table
|
|
//
|
|
extern UNATTENDANSWER UnattendAnswerTable[];
|
|
|
|
#if DBG
|
|
|
|
VOID
|
|
AssertFail(
|
|
IN PSTR FileName,
|
|
IN UINT LineNumber,
|
|
IN PSTR Condition
|
|
);
|
|
|
|
#define MYASSERT(x) if(!(x)) { AssertFail(__FILE__,__LINE__,#x); }
|
|
|
|
#else
|
|
|
|
#define MYASSERT(x)
|
|
|
|
#endif
|
|
//
|
|
// Handle to heap so we can periodically validate it.
|
|
//
|
|
#if DBG
|
|
extern HANDLE g_hSysSetupHeap;
|
|
#define ASSERT_HEAP_IS_VALID() if (g_hSysSetupHeap) MYASSERT(RtlValidateHeap(g_hSysSetupHeap,0,NULL))
|
|
#else
|
|
#define ASSERT_HEAP_IS_VALID()
|
|
#endif
|
|
//
|
|
// Product type being installed.
|
|
//
|
|
extern UINT ProductType;
|
|
|
|
//
|
|
// Boolean value indicating whether this installation
|
|
// originated with winnt/winnt32.
|
|
// And, original source path, saved away for us by winnt/winnt32.
|
|
//
|
|
extern BOOL WinntBased;
|
|
extern PCWSTR OriginalSourcePath;
|
|
|
|
//
|
|
// Boolean value indicating whether this is a remote boot setup.
|
|
//
|
|
extern BOOL RemoteBootSetup;
|
|
|
|
//
|
|
// Mask indicating the "base" CopyStyle to use. Normally 0, this is set to
|
|
// SP_COPY_SOURCE_SIS_MASTER during a remote boot setup to indicate that
|
|
// the installation source and target reside on the same single-instance
|
|
// storage volume.
|
|
//
|
|
extern ULONG BaseCopyStyle;
|
|
|
|
//
|
|
// Boolean value indicating whether we're upgrading.
|
|
//
|
|
extern BOOL Upgrade;
|
|
extern BOOL Win31Upgrade;
|
|
extern BOOL Win95Upgrade;
|
|
extern BOOL UninstallEnabled;
|
|
|
|
//
|
|
// Boolean value indicating whether we're in Setup or in appwiz.
|
|
//
|
|
extern BOOL IsSetup;
|
|
|
|
//
|
|
// Boolean value indicating whether we're doing a subset of gui-mode setup.
|
|
//
|
|
extern BOOL MiniSetup;
|
|
|
|
//
|
|
// Boolean value indicating whether we're doing a subset of gui-mode setup.
|
|
//
|
|
extern BOOL OobeSetup;
|
|
|
|
//
|
|
// Boolean value indicating whether we're doing a subset of gui-mode setup
|
|
// AND we did PnP re-enumeration.
|
|
//
|
|
extern BOOL PnPReEnumeration;
|
|
|
|
//
|
|
// Window handle of topmost setup window.
|
|
//
|
|
extern HWND SetupWindowHandle;
|
|
extern HWND MainWindowHandle;
|
|
extern HWND WizardHandle;
|
|
extern HANDLE SetupWindowThreadHandle;
|
|
|
|
//
|
|
// Source path for installation.
|
|
//
|
|
extern WCHAR SourcePath[MAX_PATH];
|
|
|
|
//
|
|
// System setup inf.
|
|
//
|
|
extern HINF SyssetupInf;
|
|
|
|
//
|
|
// Flag indicating whether this is an unattended mode install/upgrade.
|
|
//
|
|
extern BOOL Unattended;
|
|
|
|
//
|
|
// We can get into unattended mode in several ways, so we also check whether
|
|
// the "/unattend" switch was explicitly specified.
|
|
//
|
|
extern BOOL UnattendSwitch;
|
|
|
|
//
|
|
// Flag indicating whether we should run OOBE after Setup completes. Note
|
|
// that if it is FALSE, OOBE may still be run, based on other criteria.
|
|
//
|
|
extern BOOL ForceRunOobe;
|
|
|
|
//
|
|
// Flag indicating whether we are in a special mode for OEM's to use on the
|
|
// factory floor.
|
|
//
|
|
extern BOOL ReferenceMachine;
|
|
|
|
//
|
|
// Flag indicating whether a volume was extended or not using
|
|
// ExtendOemPartition
|
|
//
|
|
extern BOOL PartitionExtended;
|
|
|
|
|
|
//
|
|
// Flag indicating if we're installing from a CD.
|
|
//
|
|
extern BOOL gInstallingFromCD;
|
|
|
|
//
|
|
// Cryptographically secure codesigning policies
|
|
//
|
|
extern DWORD PnpSeed;
|
|
|
|
//
|
|
// the original locale we started setup under.
|
|
//
|
|
extern LCID OriginalInstallLocale;
|
|
|
|
//
|
|
// Indicates whether we need to wait at the installation
|
|
// end in unattended mode. Default is no wait.
|
|
//
|
|
extern BOOL UnattendWaitForReboot;
|
|
|
|
|
|
//
|
|
// If we are running unattended, the following mode indicates how answers
|
|
// are used.
|
|
//
|
|
typedef enum _UNATTENDMODE {
|
|
UAM_INVALID,
|
|
UAM_GUIATTENDED,
|
|
UAM_PROVIDEDEFAULT,
|
|
UAM_DEFAULTHIDE,
|
|
UAM_READONLY,
|
|
UAM_FULLUNATTENDED,
|
|
} UNATTENDMODE;
|
|
|
|
extern UNATTENDMODE UnattendMode;
|
|
|
|
//
|
|
// Flags indicating whether any accessibility utilities are in use.
|
|
//
|
|
extern BOOL AccessibleSetup;
|
|
extern BOOL Magnifier;
|
|
extern BOOL ScreenReader;
|
|
extern BOOL OnScreenKeyboard;
|
|
|
|
//
|
|
// String id of the string to be used for titles -- "Windows NT Setup"
|
|
//
|
|
extern UINT SetupTitleStringId;
|
|
|
|
//
|
|
// Platform name, like i386, ppc, alpha, mips
|
|
//
|
|
extern PCWSTR PlatformName;
|
|
|
|
//
|
|
// Maximum lengths for the various fields that form Pid 2.0
|
|
//
|
|
#define MAX_PID20_RPC 5
|
|
#define MAX_PID20_SITE 3
|
|
#define MAX_PID20_SERIAL_CHK 7
|
|
#define MAX_PID20_RANDOM 5
|
|
|
|
|
|
//
|
|
// Maximum lengths for the pid 3.0 fields
|
|
//
|
|
#define MAX_PID30_EDIT 5
|
|
#define MAX_PID30_RPC 5
|
|
#define MAX_PID30_SITE 3
|
|
extern WCHAR Pid30Text[5][MAX_PID30_EDIT+1];
|
|
extern WCHAR Pid30Rpc[MAX_PID30_RPC+1];
|
|
extern WCHAR Pid30Site[MAX_PID30_SITE+1];
|
|
extern BYTE DigitalProductId[DIGITALPIDMAXLEN];
|
|
|
|
|
|
//
|
|
// Maximum product id length and the Product ID.
|
|
//
|
|
// 5 3 7 5 3 for the 3 dashes between the numbers.
|
|
// MAX_PRODUCT_ID = MPC+SITE+SERIAL+RANDOM+3
|
|
#define MAX_PRODUCT_ID MAX_PID20_RPC+MAX_PID20_SITE+MAX_PID20_SERIAL_CHK+MAX_PID20_RANDOM + 3
|
|
extern WCHAR ProductId[MAX_PRODUCT_ID+1];
|
|
extern WCHAR ProductId20FromProductId30[MAX_PRODUCT_ID+1];
|
|
|
|
//
|
|
// Maximum computer name length and the computer name.
|
|
//
|
|
extern WCHAR ComputerName[DNS_MAX_LABEL_LENGTH+1];
|
|
extern WCHAR Win32ComputerName[MAX_COMPUTERNAME_LENGTH + 1];
|
|
extern BOOL IsNameTruncated;
|
|
extern BOOL IsNameNonRfc;
|
|
|
|
//
|
|
// Copy disincentive name/organization strings.
|
|
//
|
|
#define MAX_NAMEORG_NAME 50
|
|
#define MAX_NAMEORG_ORG 50
|
|
extern WCHAR NameOrgName[MAX_NAMEORG_NAME+1];
|
|
extern WCHAR NameOrgOrg[MAX_NAMEORG_ORG+1];
|
|
|
|
//
|
|
// User name and password
|
|
//
|
|
#define MAX_USERNAME 20
|
|
#define MAX_PASSWORD 127
|
|
extern WCHAR UserName[MAX_USERNAME+1];
|
|
extern WCHAR UserPassword[MAX_PASSWORD+1];
|
|
extern BOOL CreateUserAccount;
|
|
|
|
//
|
|
// Administrator password.
|
|
|
|
extern WCHAR CurrentAdminPassword[MAX_PASSWORD+1];//
|
|
extern WCHAR AdminPassword[MAX_PASSWORD+1];
|
|
extern BOOL EncryptedAdminPasswordSet;
|
|
extern BOOL DontChangeAdminPassword;
|
|
|
|
#ifdef _X86_
|
|
extern BOOL FlawedPentium;
|
|
#endif
|
|
|
|
//
|
|
// This is a specification of optional directories
|
|
// and/or optional user command to execute,
|
|
// passed to us from text setup.
|
|
//
|
|
extern PWSTR OptionalDirSpec;
|
|
extern PWSTR UserExecuteCmd;
|
|
extern BOOL SkipMissingFiles;
|
|
extern PWSTR IncludeCatalog;
|
|
|
|
//
|
|
// Custom, typical, laptop, minimal.
|
|
//
|
|
extern UINT SetupMode;
|
|
|
|
//
|
|
// boolean indicating if the eula was already shown during the winnt32 setup phase
|
|
// this was passed to us from text setup. if the eula was shown, then the pid has
|
|
// also been retreived from the user and validated
|
|
extern BOOL EulaComplete;
|
|
|
|
//
|
|
// Flag indicating if the eula was already shown during the textmode setup phase
|
|
// This will be the same as !Unattended unless UnattendMode = GuiAttended.
|
|
//
|
|
extern BOOL TextmodeEula;
|
|
|
|
//
|
|
// Global structure that contains information that will be used
|
|
// by net setup and license setup. We pass a pointer to this structure when we
|
|
// call NetSetupRequestWizardPages and LicenseSetupRequestWizardPages, then
|
|
// fill it in before we call into the net setup wizard, or liccpa.
|
|
//
|
|
|
|
extern INTERNAL_SETUP_DATA InternalSetupData;
|
|
|
|
//
|
|
// Flags indicating whether the driver and non-driver signing policies came
|
|
// from the answerfile. (If so, then those values are in effect throughout
|
|
// GUI-mode setup and thereafter.)
|
|
//
|
|
extern BOOL AFDrvSignPolicySpecified;
|
|
extern BOOL AFNonDrvSignPolicySpecified;
|
|
|
|
//
|
|
//
|
|
// Did we log an error during SfcInitProt()?
|
|
//
|
|
extern BOOL SfcErrorOccurred;
|
|
|
|
//
|
|
// multi-sz list of files that is passed to SfcInitProt that the initial scan
|
|
// will not replace. This is used for non-signed drivers that are specified
|
|
// by F6 during textmode setup.
|
|
//
|
|
extern MULTISZ EnumPtrSfcIgnoreFiles;
|
|
|
|
//
|
|
// Parameters that are passed to the thread that drives the Finish dialog.
|
|
//
|
|
typedef struct _FINISH_THREAD_PARAMS {
|
|
|
|
HWND hdlg;
|
|
DWORD ThreadId;
|
|
#ifdef _OCM
|
|
PVOID OcManagerContext;
|
|
#endif
|
|
|
|
} FINISH_THREAD_PARAMS, *PFINISH_THREAD_PARAMS;
|
|
|
|
DWORD
|
|
FinishThread(
|
|
PFINISH_THREAD_PARAMS Context
|
|
);
|
|
|
|
|
|
//
|
|
// Miscellaneous stuff.
|
|
//
|
|
DWORD
|
|
ApplySecurityToRepairInfo(
|
|
);
|
|
|
|
BOOL
|
|
RestoreBootTimeout(
|
|
VOID
|
|
);
|
|
|
|
VOID
|
|
PrepareForNetSetup(
|
|
VOID
|
|
);
|
|
|
|
VOID
|
|
PrepareForNetUpgrade(
|
|
VOID
|
|
);
|
|
|
|
VOID
|
|
pSetInstallAttributes(
|
|
VOID
|
|
);
|
|
|
|
DWORD
|
|
TreeCopy(
|
|
IN PCWSTR SourceDir,
|
|
IN PCWSTR TargetDir
|
|
);
|
|
|
|
VOID
|
|
DelSubNodes(
|
|
IN PCWSTR Directory
|
|
);
|
|
|
|
VOID
|
|
Delnode(
|
|
IN PCWSTR Directory
|
|
);
|
|
|
|
BOOL
|
|
InitializePidVariables(
|
|
VOID
|
|
);
|
|
|
|
BOOL
|
|
SetPid30Variables(
|
|
PWSTR Buffer
|
|
);
|
|
|
|
BOOL
|
|
ValidateCDRetailSite(
|
|
IN PCWSTR PidString
|
|
);
|
|
|
|
BOOL
|
|
ValidateSerialChk(
|
|
IN PCWSTR PidString
|
|
);
|
|
|
|
BOOL
|
|
ValidateOemRpc(
|
|
IN PCWSTR PidString
|
|
);
|
|
|
|
BOOL
|
|
ValidateOemSerialChk(
|
|
IN PCWSTR PidString
|
|
);
|
|
|
|
BOOL
|
|
ValidateOemRandom(
|
|
IN PCWSTR PidString
|
|
);
|
|
|
|
BOOL
|
|
ValidateAndSetPid30(
|
|
VOID
|
|
);
|
|
|
|
BOOL
|
|
CreateLicenseInfoKey(
|
|
);
|
|
|
|
BOOL
|
|
InstallNetDDE(
|
|
VOID
|
|
);
|
|
|
|
BOOL
|
|
CopyOptionalDirectories(
|
|
VOID
|
|
);
|
|
|
|
VOID
|
|
SetUpProductTypeName(
|
|
OUT PWSTR ProductTypeString,
|
|
IN UINT BufferSizeChars
|
|
);
|
|
|
|
VOID
|
|
RemoveHotfixData(
|
|
VOID
|
|
);
|
|
|
|
void
|
|
SetupCrashRecovery(
|
|
VOID
|
|
);
|
|
|
|
BOOL
|
|
SpSetupLoadParameter(
|
|
IN PCWSTR Param,
|
|
OUT PWSTR Answer,
|
|
IN UINT AnswerBufLen
|
|
);
|
|
|
|
//
|
|
// IsArc() is always true on non-x86 machines except AMD64 for which it is
|
|
// always false. On x86, this determination has to be made at run time.
|
|
//
|
|
#if defined(_X86_)
|
|
BOOL
|
|
IsArc(
|
|
VOID
|
|
);
|
|
#elif defined(_AMD64_)
|
|
#define IsArc() FALSE
|
|
#else
|
|
#define IsArc() TRUE
|
|
#endif
|
|
|
|
//
|
|
// IsEfi() is always true on IA64 machines. Therefore this determination can
|
|
// be made at compile time. When x86 EFI machines are supported, the check
|
|
// will need to be made at run time on x86.
|
|
//
|
|
// Note that EFI_NVRAM_ENABLED is defined in ia64\sources.
|
|
//
|
|
#if defined(EFI_NVRAM_ENABLED)
|
|
#define IsEfi() TRUE
|
|
#else
|
|
#define IsEfi() FALSE
|
|
#endif
|
|
|
|
VOID
|
|
DeleteLocalSource(
|
|
VOID
|
|
);
|
|
|
|
BOOL
|
|
ValidateAndChecksumFile(
|
|
IN PCTSTR Filename,
|
|
OUT PBOOLEAN IsNtImage,
|
|
OUT PULONG Checksum,
|
|
OUT PBOOLEAN Valid
|
|
);
|
|
|
|
HMODULE
|
|
MyLoadLibraryWithSignatureCheck(
|
|
IN PWSTR ModuleName
|
|
);
|
|
|
|
DWORD
|
|
QueryHardDiskNumber(
|
|
IN UCHAR DriveLetter
|
|
);
|
|
|
|
BOOL
|
|
ExtendPartition(
|
|
IN WCHAR DriveLetter,
|
|
IN ULONG SizeMB OPTIONAL
|
|
);
|
|
|
|
DWORD
|
|
RemoveStaleVolumes(
|
|
VOID
|
|
);
|
|
|
|
|
|
BOOL
|
|
DoFilesMatch(
|
|
IN PCWSTR File1,
|
|
IN PCWSTR File2
|
|
);
|
|
|
|
UINT
|
|
MyGetDriveType(
|
|
IN WCHAR Drive
|
|
);
|
|
|
|
BOOL
|
|
GetPartitionInfo(
|
|
IN WCHAR Drive,
|
|
OUT PPARTITION_INFORMATION PartitionInfo
|
|
);
|
|
|
|
BOOL
|
|
IsErrorLogEmpty (
|
|
VOID
|
|
);
|
|
|
|
VOID
|
|
BuildVolumeFreeSpaceList(
|
|
OUT DWORD VolumeFreeSpaceMB[26]
|
|
);
|
|
|
|
BOOL
|
|
SetUpVirtualMemory(
|
|
VOID
|
|
);
|
|
|
|
BOOL
|
|
RestoreVirtualMemoryInfo(
|
|
VOID
|
|
);
|
|
|
|
BOOL
|
|
CopySystemFiles(
|
|
VOID
|
|
);
|
|
|
|
BOOL
|
|
UpgradeSystemFiles(
|
|
VOID
|
|
);
|
|
|
|
VOID
|
|
MarkFilesReadOnly(
|
|
VOID
|
|
);
|
|
|
|
VOID
|
|
PumpMessageQueue(
|
|
VOID
|
|
);
|
|
|
|
BOOL
|
|
ConfigureMsDosSubsystem(
|
|
VOID
|
|
);
|
|
|
|
BOOL
|
|
PerfMergeCounterNames(
|
|
VOID
|
|
);
|
|
|
|
DWORD
|
|
pSetupInitRegionalSettings(
|
|
IN HWND Window
|
|
);
|
|
|
|
VOID
|
|
pSetupMarkHiddenFonts(
|
|
VOID
|
|
);
|
|
|
|
VOID
|
|
InstallServerNLSFiles(
|
|
);
|
|
|
|
PVOID
|
|
InitSysSetupQueueCallbackEx(
|
|
IN HWND OwnerWindow,
|
|
IN HWND AlternateProgressWindow, OPTIONAL
|
|
IN UINT ProgressMessage,
|
|
IN DWORD Reserved1,
|
|
IN PVOID Reserved2
|
|
);
|
|
|
|
PVOID
|
|
InitSysSetupQueueCallback(
|
|
IN HWND OwnerWindow
|
|
);
|
|
|
|
VOID
|
|
TermSysSetupQueueCallback(
|
|
IN PVOID SysSetupContext
|
|
);
|
|
|
|
UINT
|
|
SysSetupQueueCallback(
|
|
IN PVOID Context,
|
|
IN UINT Notification,
|
|
IN UINT_PTR Param1,
|
|
IN UINT_PTR Param2
|
|
);
|
|
|
|
UINT
|
|
RegistrationQueueCallback(
|
|
IN PVOID Context,
|
|
IN UINT Notification,
|
|
IN UINT_PTR Param1,
|
|
IN UINT_PTR Param2
|
|
);
|
|
|
|
|
|
VOID
|
|
SaveRepairInfo(
|
|
IN HWND hWnd,
|
|
IN ULONG StartAtPercent,
|
|
IN ULONG StopAtPercent
|
|
);
|
|
|
|
BOOLEAN
|
|
IsLaptop(
|
|
VOID
|
|
);
|
|
|
|
VOID
|
|
InitializeUniqueness(
|
|
IN OUT HWND *Billboard
|
|
);
|
|
|
|
#ifdef _X86_
|
|
|
|
//
|
|
// Code in i386\migwin95.c
|
|
//
|
|
|
|
BOOL
|
|
PreWin9xMigration(
|
|
VOID
|
|
);
|
|
|
|
BOOL
|
|
MigrateWin95Settings(
|
|
IN HWND hwndWizardParent,
|
|
IN LPCWSTR UnattendFile
|
|
);
|
|
|
|
BOOL
|
|
Win95MigrationFileRemoval(
|
|
void
|
|
);
|
|
|
|
BOOL
|
|
RemoveFiles_X86(
|
|
IN HINF InfHandle
|
|
);
|
|
|
|
#endif // def _X86_
|
|
|
|
|
|
BOOL
|
|
RegisterActionItemListControl(
|
|
IN BOOL Init
|
|
);
|
|
|
|
LONG
|
|
WINAPI
|
|
MyUnhandledExceptionFilter(
|
|
IN struct _EXCEPTION_POINTERS *ExceptionInfo
|
|
);
|
|
|
|
#ifdef _OCM
|
|
PVOID
|
|
#else
|
|
VOID
|
|
#endif
|
|
CommonInitialization(
|
|
VOID
|
|
);
|
|
|
|
|
|
VOID
|
|
InitializeExternalModules(
|
|
BOOL DoSetupStuff,
|
|
PVOID* pOcManagerContext
|
|
);
|
|
|
|
BOOL
|
|
pSetupWaitForScmInitialization();
|
|
|
|
VOID
|
|
SetUpDataBlock(
|
|
VOID
|
|
);
|
|
|
|
|
|
//
|
|
// Wizard control.
|
|
//
|
|
VOID
|
|
Wizard(
|
|
#ifdef _OCM
|
|
IN PVOID OcManagerContext
|
|
#else
|
|
VOID
|
|
#endif
|
|
);
|
|
|
|
//
|
|
// IMPORTANT: keep this in sync with WIZPAGE SetupWizardPages[WizPageMaximum]
|
|
//
|
|
typedef enum {
|
|
WizPageWelcome,
|
|
WizPageEula,
|
|
WizPagePreparing,
|
|
WizPagePreparingAsr,
|
|
#ifdef PNP_DEBUG_UI
|
|
WizPageInstalledHardware,
|
|
#endif // PNP_DEBUG_UI
|
|
WizPageRegionalSettings,
|
|
WizPageNameOrg,
|
|
WizPageProductIdCd,
|
|
WizPageProductIdOem,
|
|
WizPageProductIdSelect,
|
|
WizPageComputerName,
|
|
#ifdef DOLOCALUSER
|
|
WizPageUserAccount,
|
|
#endif
|
|
#ifdef _X86_
|
|
WizPagePentiumErrata,
|
|
#endif // def _X86_
|
|
WizPageSteps1,
|
|
|
|
WizSetupPreNet,
|
|
WizSetupPostNet,
|
|
|
|
WizPageCopyFiles,
|
|
WizPageAsrLast,
|
|
WizPageLast,
|
|
WizPageMaximum
|
|
} WizPage;
|
|
|
|
extern HPROPSHEETPAGE WizardPageHandles[WizPageMaximum];
|
|
|
|
extern BOOL UiTest;
|
|
|
|
VOID
|
|
SetWizardButtons(
|
|
IN HWND hdlgPage,
|
|
IN WizPage PageNumber
|
|
);
|
|
|
|
VOID
|
|
WizardBringUpHelp(
|
|
IN HWND hdlg,
|
|
IN WizPage PageNumber
|
|
);
|
|
|
|
VOID
|
|
WizardKillHelp(
|
|
IN HWND hdlg
|
|
);
|
|
|
|
//
|
|
// Dialog procs.
|
|
//
|
|
INT_PTR
|
|
CALLBACK
|
|
WelcomeDlgProc(
|
|
IN HWND hdlg,
|
|
IN UINT msg,
|
|
IN WPARAM wParam,
|
|
IN LPARAM lParam
|
|
);
|
|
|
|
INT_PTR
|
|
CALLBACK
|
|
EulaDlgProc(
|
|
IN HWND hdlg,
|
|
IN UINT msg,
|
|
IN WPARAM wParam,
|
|
IN LPARAM lParam
|
|
);
|
|
|
|
INT_PTR
|
|
CALLBACK
|
|
StepsDlgProc(
|
|
IN HWND hdlg,
|
|
IN UINT msg,
|
|
IN WPARAM wParam,
|
|
IN LPARAM lParam
|
|
);
|
|
|
|
INT_PTR
|
|
CALLBACK
|
|
PreparingDlgProc(
|
|
IN HWND hdlg,
|
|
IN UINT msg,
|
|
IN WPARAM wParam,
|
|
IN LPARAM lParam
|
|
);
|
|
|
|
INT_PTR
|
|
CALLBACK
|
|
InstalledHardwareDlgProc(
|
|
IN HWND hdlg,
|
|
IN UINT msg,
|
|
IN WPARAM wParam,
|
|
IN LPARAM lParam
|
|
);
|
|
|
|
INT_PTR
|
|
SetupModeDlgProc(
|
|
IN HWND hdlg,
|
|
IN UINT msg,
|
|
IN WPARAM wParam,
|
|
IN LPARAM lParam
|
|
);
|
|
|
|
INT_PTR
|
|
CALLBACK
|
|
RegionalSettingsDlgProc(
|
|
IN HWND hdlg,
|
|
IN UINT msg,
|
|
IN WPARAM wParam,
|
|
IN LPARAM lParam
|
|
);
|
|
|
|
INT_PTR
|
|
CALLBACK
|
|
NameOrgDlgProc(
|
|
IN HWND hdlg,
|
|
IN UINT msg,
|
|
IN WPARAM wParam,
|
|
IN LPARAM lParam
|
|
);
|
|
|
|
INT_PTR
|
|
CALLBACK
|
|
LicensingDlgProc(
|
|
IN HWND hdlg,
|
|
IN UINT msg,
|
|
IN WPARAM wParam,
|
|
IN LPARAM lParam
|
|
);
|
|
|
|
INT_PTR
|
|
CALLBACK
|
|
ComputerNameDlgProc(
|
|
IN HWND hdlg,
|
|
IN UINT msg,
|
|
IN WPARAM wParam,
|
|
IN LPARAM lParam
|
|
);
|
|
|
|
INT_PTR
|
|
CALLBACK
|
|
PidCDDlgProc(
|
|
IN HWND hdlg,
|
|
IN UINT msg,
|
|
IN WPARAM wParam,
|
|
IN LPARAM lParam
|
|
);
|
|
|
|
INT_PTR
|
|
CALLBACK
|
|
Pid30OemDlgProc(
|
|
IN HWND hdlg,
|
|
IN UINT msg,
|
|
IN WPARAM wParam,
|
|
IN LPARAM lParam
|
|
);
|
|
|
|
INT_PTR
|
|
CALLBACK
|
|
Pid30CDDlgProc(
|
|
IN HWND hdlg,
|
|
IN UINT msg,
|
|
IN WPARAM wParam,
|
|
IN LPARAM lParam
|
|
);
|
|
|
|
INT_PTR
|
|
CALLBACK
|
|
Pid30SelectDlgProc(
|
|
IN HWND hdlg,
|
|
IN UINT msg,
|
|
IN WPARAM wParam,
|
|
IN LPARAM lParam
|
|
);
|
|
|
|
INT_PTR
|
|
CALLBACK
|
|
PidOemDlgProc(
|
|
IN HWND hdlg,
|
|
IN UINT msg,
|
|
IN WPARAM wParam,
|
|
IN LPARAM lParam
|
|
);
|
|
|
|
#ifdef DOLOCALUSER
|
|
INT_PTR
|
|
CALLBACK
|
|
UserAccountDlgProc(
|
|
IN HWND hdlg,
|
|
IN UINT msg,
|
|
IN WPARAM wParam,
|
|
IN LPARAM lParam
|
|
);
|
|
#endif
|
|
|
|
INT_PTR
|
|
CALLBACK
|
|
OptionalComponentsPageDlgProc(
|
|
IN HWND hwnd,
|
|
IN UINT msg,
|
|
IN WPARAM wParam,
|
|
IN LPARAM lParam
|
|
);
|
|
|
|
INT_PTR
|
|
CALLBACK
|
|
RepairDiskDlgProc(
|
|
IN HWND hdlg,
|
|
IN UINT msg,
|
|
IN WPARAM wParam,
|
|
IN LPARAM lParam
|
|
);
|
|
|
|
INT_PTR
|
|
CALLBACK
|
|
CopyFilesDlgProc(
|
|
IN HWND hdlg,
|
|
IN UINT msg,
|
|
IN WPARAM wParam,
|
|
IN LPARAM lParam
|
|
);
|
|
|
|
INT_PTR
|
|
CALLBACK
|
|
LastPageDlgProc(
|
|
IN HWND hdlg,
|
|
IN UINT msg,
|
|
IN WPARAM wParam,
|
|
IN LPARAM lParam
|
|
);
|
|
|
|
INT_PTR
|
|
DoneDlgProc(
|
|
IN HWND hdlg,
|
|
IN UINT msg,
|
|
IN WPARAM wParam,
|
|
IN LPARAM lParam
|
|
);
|
|
|
|
INT_PTR
|
|
CALLBACK
|
|
SetupPreNetDlgProc(
|
|
IN HWND hdlg,
|
|
IN UINT msg,
|
|
IN WPARAM wParam,
|
|
IN LPARAM lParam
|
|
);
|
|
INT_PTR
|
|
CALLBACK
|
|
SetupPostNetDlgProc(
|
|
IN HWND hdlg,
|
|
IN UINT msg,
|
|
IN WPARAM wParam,
|
|
IN LPARAM lParam
|
|
);
|
|
|
|
//
|
|
// Billboard stuff.
|
|
//
|
|
HWND
|
|
DisplayBillboard(
|
|
IN HWND Owner,
|
|
IN UINT MessageId,
|
|
...
|
|
);
|
|
|
|
VOID
|
|
KillBillboard(
|
|
IN HWND BillboardWindowHandle
|
|
);
|
|
|
|
//
|
|
// Message string routines
|
|
//
|
|
PWSTR
|
|
MyLoadString(
|
|
IN UINT StringId
|
|
);
|
|
|
|
PWSTR
|
|
FormatStringMessageV(
|
|
IN UINT FormatStringId,
|
|
IN va_list *ArgumentList
|
|
);
|
|
|
|
PWSTR
|
|
FormatStringMessage(
|
|
IN UINT FormatStringId,
|
|
...
|
|
);
|
|
|
|
PWSTR
|
|
RetrieveAndFormatMessageV(
|
|
IN PCWSTR MessageString,
|
|
IN UINT MessageId, OPTIONAL
|
|
IN va_list *ArgumentList
|
|
);
|
|
|
|
PWSTR
|
|
RetrieveAndFormatMessage(
|
|
IN PCWSTR MessageString,
|
|
IN UINT MessageId, OPTIONAL
|
|
...
|
|
);
|
|
|
|
int
|
|
MessageBoxFromMessageExV (
|
|
IN HWND Owner, OPTIONAL
|
|
IN LogSeverity Severity, OPTIONAL
|
|
IN PCWSTR MessageString,
|
|
IN UINT MessageId, OPTIONAL
|
|
IN PCWSTR Caption, OPTIONAL
|
|
IN UINT CaptionStringId, OPTIONAL
|
|
IN UINT Style,
|
|
IN va_list ArgumentList
|
|
);
|
|
|
|
int
|
|
MessageBoxFromMessageEx (
|
|
IN HWND Owner, OPTIONAL
|
|
IN LogSeverity Severity, OPTIONAL
|
|
IN PCWSTR MessageString,
|
|
IN UINT MessageId, OPTIONAL
|
|
IN PCWSTR Caption, OPTIONAL
|
|
IN UINT CaptionStringId, OPTIONAL
|
|
IN UINT Style,
|
|
...
|
|
);
|
|
|
|
int
|
|
MessageBoxFromMessage(
|
|
IN HWND Owner, OPTIONAL
|
|
IN UINT MessageId,
|
|
IN PCWSTR Caption, OPTIONAL
|
|
IN UINT CaptionStringId, OPTIONAL
|
|
IN UINT Style,
|
|
...
|
|
);
|
|
|
|
//
|
|
// Action-logging routines.
|
|
//
|
|
extern PCWSTR ActionLogFileName;
|
|
|
|
VOID
|
|
InitializeSetupLog(
|
|
IN PSETUPLOG_CONTEXT Context
|
|
);
|
|
|
|
VOID
|
|
TerminateSetupLog(
|
|
IN PSETUPLOG_CONTEXT Context
|
|
);
|
|
|
|
VOID
|
|
LogRepairInfo(
|
|
IN PCWSTR Source,
|
|
IN PCWSTR Target
|
|
);
|
|
|
|
VOID
|
|
FatalError(
|
|
IN UINT MessageId,
|
|
...
|
|
);
|
|
|
|
BOOL
|
|
InitializeSetupActionLog(
|
|
BOOL WipeLogFile
|
|
);
|
|
|
|
VOID
|
|
TerminateSetupActionLog(
|
|
VOID
|
|
);
|
|
|
|
BOOL
|
|
LogItem(
|
|
IN LogSeverity Severity,
|
|
IN PCWSTR Description
|
|
);
|
|
|
|
BOOL
|
|
LogItem0(
|
|
IN LogSeverity Severity,
|
|
IN UINT MessageId,
|
|
...
|
|
);
|
|
|
|
BOOL
|
|
LogItem1(
|
|
IN LogSeverity Severity,
|
|
IN UINT MajorMsgId,
|
|
IN UINT MinorMsgId,
|
|
...
|
|
);
|
|
|
|
BOOL
|
|
LogItem2(
|
|
IN LogSeverity Severity,
|
|
IN UINT MajorMsgId,
|
|
IN PCWSTR MajorMsgParam,
|
|
IN UINT MinorMsgId,
|
|
...
|
|
);
|
|
|
|
BOOL
|
|
LogItem3(
|
|
IN LogSeverity Severity,
|
|
IN UINT MajorMsgId,
|
|
IN PCWSTR MajorMsgParam1,
|
|
IN PCWSTR MajorMsgParam2,
|
|
IN UINT MinorMsgId,
|
|
...
|
|
);
|
|
|
|
PCWSTR
|
|
FormatSetupMessageV (
|
|
IN UINT MessageId,
|
|
IN va_list ArgumentList
|
|
);
|
|
|
|
BOOL
|
|
LogItemV (
|
|
IN LogSeverity Severity,
|
|
IN va_list ArgumentList
|
|
);
|
|
|
|
LogItemN (
|
|
IN LogSeverity Severity,
|
|
...
|
|
);
|
|
|
|
BOOL
|
|
ViewSetupActionLog(
|
|
IN HWND hOwnerWindow,
|
|
IN PCWSTR OptionalFileName OPTIONAL,
|
|
IN PCWSTR OptionalHeading OPTIONAL
|
|
);
|
|
|
|
|
|
//
|
|
// Constant strings used for logging in various places.
|
|
//
|
|
extern PCWSTR szFALSE;
|
|
extern PCWSTR szWaitForSingleObject;
|
|
extern PCWSTR szSetGroupOfValues;
|
|
extern PCWSTR szSetArrayToMultiSzValue;
|
|
extern PCWSTR szCreateProcess;
|
|
extern PCWSTR szRegOpenKeyEx;
|
|
extern PCWSTR szRegQueryValueEx;
|
|
extern PCWSTR szRegSetValueEx;
|
|
extern PCWSTR szDeleteFile;
|
|
extern PCWSTR szRemoveDirectory;
|
|
extern PCWSTR szOpenSCManager;
|
|
extern PCWSTR szCreateService;
|
|
extern PCWSTR szChangeServiceConfig;
|
|
extern PCWSTR szOpenService;
|
|
extern PCWSTR szStartService;
|
|
extern PCWSTR szSetupInstallFromInfSection;
|
|
|
|
|
|
|
|
//
|
|
// ARC routines.
|
|
//
|
|
PWSTR
|
|
ArcDevicePathToNtPath(
|
|
IN PCWSTR ArcPath
|
|
);
|
|
|
|
PWSTR
|
|
NtFullPathToDosPath(
|
|
IN PCWSTR NtPath
|
|
);
|
|
|
|
BOOL
|
|
ChangeBootTimeout(
|
|
IN UINT Timeout
|
|
);
|
|
|
|
BOOL
|
|
SetNvRamVariable(
|
|
IN PCWSTR VarName,
|
|
IN PCWSTR VarValue
|
|
);
|
|
|
|
PWSTR
|
|
NtPathToDosPath(
|
|
IN PCWSTR NtPath
|
|
);
|
|
|
|
//
|
|
// Progman/program group stuff
|
|
//
|
|
BOOL
|
|
CreateStartMenuItems(
|
|
IN HINF InfHandle
|
|
);
|
|
|
|
BOOL
|
|
UpgradeStartMenuItems(
|
|
IN HINF InfHandle
|
|
);
|
|
|
|
//
|
|
// Cryptography stuff
|
|
//
|
|
BOOL
|
|
InstallOrUpgradeCapi(
|
|
VOID
|
|
);
|
|
|
|
|
|
//
|
|
// Plug&Play initialization
|
|
//
|
|
HANDLE
|
|
SpawnPnPInitialization(
|
|
VOID
|
|
);
|
|
|
|
DWORD
|
|
PnPInitializationThread(
|
|
IN PVOID ThreadParam
|
|
);
|
|
|
|
|
|
|
|
//
|
|
// Printer/spooler routines
|
|
//
|
|
BOOL
|
|
MiscSpoolerInit(
|
|
VOID
|
|
);
|
|
|
|
BOOL
|
|
StartSpooler(
|
|
VOID
|
|
);
|
|
|
|
DWORD
|
|
UpgradePrinters(
|
|
VOID
|
|
);
|
|
|
|
|
|
//
|
|
// Name of spooler service.
|
|
//
|
|
extern PCWSTR szSpooler;
|
|
|
|
//
|
|
// Service control.
|
|
//
|
|
BOOL
|
|
MyCreateService(
|
|
IN PCWSTR ServiceName,
|
|
IN PCWSTR DisplayName, OPTIONAL
|
|
IN DWORD ServiceType,
|
|
IN DWORD StartType,
|
|
IN DWORD ErrorControl,
|
|
IN PCWSTR BinaryPathName,
|
|
IN PCWSTR LoadOrderGroup, OPTIONAL
|
|
IN PWCHAR DependencyList,
|
|
IN PCWSTR ServiceStartName, OPTIONAL
|
|
IN PCWSTR Password OPTIONAL
|
|
);
|
|
|
|
BOOL
|
|
MyChangeServiceConfig(
|
|
IN PCWSTR ServiceName,
|
|
IN DWORD ServiceType,
|
|
IN DWORD StartType,
|
|
IN DWORD ErrorControl,
|
|
IN PCWSTR BinaryPathName, OPTIONAL
|
|
IN PCWSTR LoadOrderGroup, OPTIONAL
|
|
IN PWCHAR DependencyList,
|
|
IN PCWSTR ServiceStartName, OPTIONAL
|
|
IN PCWSTR Password, OPTIONAL
|
|
IN PCWSTR DisplayName OPTIONAL
|
|
);
|
|
|
|
BOOL
|
|
MyChangeServiceStart(
|
|
IN PCWSTR ServiceName,
|
|
IN DWORD StartType
|
|
);
|
|
|
|
BOOL
|
|
UpdateServicesDependencies(
|
|
IN HINF InfHandle
|
|
);
|
|
|
|
//
|
|
// Registry manipulation
|
|
//
|
|
typedef struct _REGVALITEM {
|
|
PCWSTR Name;
|
|
PVOID Data;
|
|
DWORD Size;
|
|
DWORD Type;
|
|
} REGVALITEM, *PREGVALITEM;
|
|
|
|
//
|
|
// Names of frequently used keys/values
|
|
//
|
|
extern PCWSTR SessionManagerKeyName;
|
|
extern PCWSTR EnvironmentKeyName;
|
|
extern PCWSTR szBootExecute;
|
|
extern PCWSTR WinntSoftwareKeyName;
|
|
extern PCWSTR szRegisteredOwner;
|
|
extern PCWSTR szRegisteredOrganization;
|
|
|
|
UINT
|
|
SetGroupOfValues(
|
|
IN HKEY RootKey,
|
|
IN PCWSTR SubkeyName,
|
|
IN PREGVALITEM ValueList,
|
|
IN UINT ValueCount
|
|
);
|
|
|
|
BOOL
|
|
CreateWindowsNtSoftwareEntry(
|
|
IN BOOL FirstPass
|
|
);
|
|
|
|
BOOL
|
|
CreateInstallDateEntry(
|
|
);
|
|
|
|
BOOL
|
|
StoreNameOrgInRegistry(
|
|
PWSTR NameOrgName,
|
|
PWSTR NameOrgOrg
|
|
);
|
|
|
|
BOOL
|
|
SetUpEvaluationSKUStuff(
|
|
VOID
|
|
);
|
|
|
|
BOOL
|
|
SetEnabledProcessorCount(
|
|
VOID
|
|
);
|
|
|
|
BOOL
|
|
SetProductIdInRegistry(
|
|
VOID
|
|
);
|
|
|
|
DWORD
|
|
SetCurrentProductIdInRegistry(
|
|
VOID
|
|
);
|
|
|
|
VOID
|
|
DeleteCurrentProductIdInRegistry(
|
|
VOID
|
|
);
|
|
|
|
void LogPidValues();
|
|
|
|
BOOL
|
|
SetAutoAdminLogonInRegistry(
|
|
LPWSTR Username,
|
|
LPWSTR Password
|
|
);
|
|
|
|
BOOL
|
|
SetProfilesDirInRegistry(
|
|
LPWSTR ProfilesDir
|
|
);
|
|
|
|
BOOL
|
|
SetProductTypeInRegistry(
|
|
VOID
|
|
);
|
|
|
|
BOOL
|
|
SetEnvironmentVariableInRegistry(
|
|
IN PCWSTR Name,
|
|
IN PCWSTR Value,
|
|
IN BOOL SystemWide
|
|
);
|
|
|
|
BOOL
|
|
SaveHive(
|
|
IN HKEY RootKey,
|
|
IN PCWSTR Subkey,
|
|
IN PCWSTR Filename,
|
|
IN DWORD Format
|
|
);
|
|
|
|
BOOL
|
|
SaveAndReplaceSystemHives(
|
|
VOID
|
|
);
|
|
|
|
DWORD
|
|
FixupUserHives(
|
|
VOID
|
|
);
|
|
|
|
DWORD
|
|
QueryValueInHKLM (
|
|
IN PWCH KeyName OPTIONAL,
|
|
IN PWCH ValueName,
|
|
OUT PDWORD ValueType,
|
|
OUT PVOID *ValueData,
|
|
OUT PDWORD ValueDataLength
|
|
);
|
|
|
|
VOID
|
|
ConfigureSystemFileProtection(
|
|
VOID
|
|
);
|
|
|
|
VOID
|
|
RemoveRestartability (
|
|
HWND hProgress
|
|
);
|
|
|
|
BOOL
|
|
ResetSetupInProgress(
|
|
VOID
|
|
);
|
|
|
|
BOOL
|
|
RemoveRestartStuff(
|
|
VOID
|
|
);
|
|
|
|
BOOL
|
|
EnableEventlogPopup(
|
|
VOID
|
|
);
|
|
|
|
BOOL
|
|
MakeWowEntry(
|
|
VOID
|
|
);
|
|
|
|
BOOL
|
|
SetUpPath(
|
|
VOID
|
|
);
|
|
|
|
VOID
|
|
RestoreOldPathVariable(
|
|
VOID
|
|
);
|
|
|
|
BOOL
|
|
FixQuotaEntries(
|
|
VOID
|
|
);
|
|
|
|
BOOL
|
|
StampBuildNumber(
|
|
VOID
|
|
);
|
|
|
|
BOOL
|
|
SetProgramFilesDirInRegistry(
|
|
VOID
|
|
);
|
|
|
|
BOOL
|
|
RegisterOleControls(
|
|
IN HWND hwndParent,
|
|
IN PVOID InfHandle,
|
|
IN HWND hProgress,
|
|
IN ULONG StartAtPercent,
|
|
IN ULONG StopAtPercent,
|
|
IN PWSTR SectionName
|
|
);
|
|
|
|
|
|
VOID
|
|
InitializeCodeSigningPolicies(
|
|
IN BOOL ForGuiSetup
|
|
);
|
|
|
|
|
|
VOID
|
|
GetDllCacheFolder(
|
|
OUT LPWSTR CacheDir,
|
|
IN DWORD cbCacheDir
|
|
);
|
|
|
|
|
|
typedef enum _CODESIGNING_POLICY_TYPE {
|
|
PolicyTypeDriverSigning,
|
|
PolicyTypeNonDriverSigning
|
|
} CODESIGNING_POLICY_TYPE, *PCODESIGNING_POLICY_TYPE;
|
|
|
|
VOID
|
|
SetCodeSigningPolicy(
|
|
IN CODESIGNING_POLICY_TYPE PolicyType,
|
|
IN BYTE NewPolicy,
|
|
OUT PBYTE OldPolicy OPTIONAL
|
|
);
|
|
|
|
DWORD
|
|
GetSeed(
|
|
VOID
|
|
);
|
|
|
|
//
|
|
// Ini file routines.
|
|
//
|
|
BOOL
|
|
ReplaceIniKeyValue(
|
|
IN PCWSTR IniFile,
|
|
IN PCWSTR Section,
|
|
IN PCWSTR Key,
|
|
IN PCWSTR Value
|
|
);
|
|
|
|
BOOL
|
|
WinIniAlter1(
|
|
VOID
|
|
);
|
|
|
|
BOOL
|
|
SetDefaultWallpaper(
|
|
VOID
|
|
);
|
|
|
|
BOOL
|
|
SetShutdownVariables(
|
|
VOID
|
|
);
|
|
|
|
BOOL
|
|
SetLogonScreensaver(
|
|
VOID
|
|
);
|
|
|
|
BOOL
|
|
InstallOrUpgradeFonts(
|
|
VOID
|
|
);
|
|
|
|
//
|
|
// External app stuff.
|
|
//
|
|
BOOL
|
|
InvokeExternalApplication(
|
|
IN PCWSTR ApplicationName, OPTIONAL
|
|
IN PCWSTR CommandLine,
|
|
IN OUT PDWORD ExitCode OPTIONAL
|
|
);
|
|
|
|
|
|
BOOL
|
|
InvokeControlPanelApplet(
|
|
IN PCWSTR CplSpec,
|
|
IN PCWSTR AppletName, OPTIONAL
|
|
IN UINT AppletNameStringId,
|
|
IN PCWSTR CommandLine
|
|
);
|
|
|
|
//
|
|
// Security/account routines.
|
|
//
|
|
BOOL
|
|
SignalLsa(
|
|
VOID
|
|
);
|
|
|
|
BOOL
|
|
CreateSamEvent(
|
|
VOID
|
|
);
|
|
|
|
BOOL
|
|
WaitForSam(
|
|
VOID
|
|
);
|
|
|
|
BOOL
|
|
SetAccountsDomainSid(
|
|
IN DWORD Seed,
|
|
IN PCWSTR DomainName
|
|
);
|
|
|
|
BOOL
|
|
CreateLocalUserAccount(
|
|
IN PCWSTR UserName,
|
|
IN PCWSTR Password,
|
|
OUT PSID* UserSid OPTIONAL
|
|
);
|
|
|
|
NTSTATUS
|
|
CreateLocalAdminAccount(
|
|
IN PCWSTR UserName,
|
|
IN PCWSTR Password,
|
|
OUT PSID* UserSid OPTIONAL
|
|
);
|
|
|
|
BOOL
|
|
SetLocalUserPassword(
|
|
IN PCWSTR AccountName,
|
|
IN PCWSTR OldPassword,
|
|
IN PCWSTR NewPassword
|
|
);
|
|
|
|
BOOL
|
|
IsEncryptedAdminPasswordPresent( VOID );
|
|
|
|
BOOL
|
|
ProcessEncryptedAdminPassword( PCWSTR AdminAccountName );
|
|
|
|
BOOL
|
|
CreatePdcAccount(
|
|
IN PCWSTR MachineName
|
|
);
|
|
|
|
BOOL
|
|
AdjustPrivilege(
|
|
IN PCWSTR Privilege,
|
|
IN BOOL Enable
|
|
);
|
|
|
|
UINT
|
|
PlatformSpecificInit(
|
|
VOID
|
|
);
|
|
|
|
//
|
|
// Interface to new style parameter operations
|
|
//
|
|
BOOL
|
|
SpSetupProcessParameters(
|
|
IN OUT HWND *Billboard
|
|
);
|
|
|
|
extern WCHAR LegacySourcePath[MAX_PATH];
|
|
|
|
HWND
|
|
CreateSetupWindow(
|
|
VOID
|
|
);
|
|
|
|
//
|
|
// Preinstallation stuff
|
|
//
|
|
extern BOOL Preinstall;
|
|
extern BOOL AllowRollback;
|
|
extern BOOL OemSkipEula;
|
|
|
|
BOOL
|
|
InitializePreinstall(
|
|
VOID
|
|
);
|
|
|
|
BOOL
|
|
ExecutePreinstallCommands(
|
|
VOID
|
|
);
|
|
|
|
BOOL
|
|
DoInstallComponentInfs(
|
|
IN HWND hwndParent,
|
|
IN HWND hProgress, OPTIONAL
|
|
IN UINT ProgressMessage,
|
|
IN HINF InfHandle,
|
|
IN PCWSTR InfSection
|
|
);
|
|
|
|
BOOL
|
|
ProcessCompatibilityInfs(
|
|
IN HWND hwndParent,
|
|
IN HWND hProgress, OPTIONAL
|
|
IN UINT ProgressMessage
|
|
);
|
|
|
|
|
|
VOID
|
|
DoRunonce (
|
|
);
|
|
|
|
//
|
|
// Security Stuff
|
|
//
|
|
BOOL
|
|
SetupInstallSecurity(
|
|
IN HWND Window,
|
|
IN HWND ProgressWindow,
|
|
IN ULONG StartAtPercent,
|
|
IN ULONG StopAtPercent
|
|
);
|
|
|
|
|
|
VOID
|
|
CallSceGenerateTemplate( VOID );
|
|
|
|
VOID
|
|
CallSceConfigureServices( VOID );
|
|
|
|
extern HANDLE SceSetupRootSecurityThreadHandle;
|
|
extern BOOL bSceSetupRootSecurityComplete;
|
|
|
|
VOID
|
|
CallSceSetupRootSecurity( VOID );
|
|
|
|
PSID
|
|
GetAdminAccountSid(
|
|
);
|
|
|
|
VOID
|
|
GetAdminAccountName(
|
|
PWSTR AccountName
|
|
);
|
|
|
|
NTSTATUS
|
|
DisableLocalAdminAccount(
|
|
VOID
|
|
);
|
|
|
|
BOOL
|
|
SetupRunBaseWinOptions(
|
|
IN HWND Window,
|
|
IN HWND ProgressWindow
|
|
);
|
|
|
|
//
|
|
// PnP stuff.
|
|
//
|
|
BOOL
|
|
InstallPnpDevices(
|
|
IN HWND hwndParent,
|
|
IN HINF InfHandle,
|
|
IN HWND ProgressWindow,
|
|
IN ULONG StartAtPercent,
|
|
IN ULONG StopAtPercent
|
|
);
|
|
|
|
VOID
|
|
PnpStopServerSideInstall( VOID );
|
|
|
|
VOID
|
|
PnpUpdateHAL(
|
|
VOID
|
|
);
|
|
|
|
#ifdef _OCM
|
|
PVOID
|
|
FireUpOcManager(
|
|
VOID
|
|
);
|
|
|
|
VOID
|
|
KillOcManager(
|
|
PVOID OcManagerContext
|
|
);
|
|
#endif
|
|
|
|
//
|
|
// Boolean value indicating whether we found any new
|
|
// optional component infs.
|
|
//
|
|
extern BOOL AnyNewOCInfs;
|
|
|
|
//
|
|
// INF caching -- used during optional components processing.
|
|
// WARNING: NOT MULTI-THREAD SAFE!
|
|
//
|
|
HINF
|
|
InfCacheOpenInf(
|
|
IN PCWSTR FileName,
|
|
IN PCWSTR InfType OPTIONAL
|
|
);
|
|
|
|
HINF
|
|
InfCacheOpenLayoutInf(
|
|
IN HINF InfHandle
|
|
);
|
|
|
|
VOID
|
|
InfCacheEmpty(
|
|
IN BOOL CloseInfs
|
|
);
|
|
|
|
//
|
|
// Pnp stuff
|
|
//
|
|
|
|
BOOL
|
|
InstallPnpClassInstallers(
|
|
IN HWND hwndParent,
|
|
IN HINF InfHandle,
|
|
IN HSPFILEQ FileQ
|
|
);
|
|
|
|
//
|
|
// UI Stuff
|
|
//
|
|
VOID
|
|
SetFinishItemAttributes(
|
|
IN HWND hdlg,
|
|
IN int BitmapControl,
|
|
IN HANDLE hBitmap,
|
|
IN int TextControl,
|
|
IN LONG Weight
|
|
);
|
|
|
|
|
|
void
|
|
pSetupDebugPrint(
|
|
PWSTR FileName,
|
|
ULONG LineNumber,
|
|
PWSTR TagStr,
|
|
PWSTR FormatStr,
|
|
...
|
|
);
|
|
|
|
#define SetupDebugPrint(_fmt_) pSetupDebugPrint(TEXT(__FILE__),__LINE__,NULL,_fmt_)
|
|
#define SetupDebugPrint1(_fmt_,_arg1_) pSetupDebugPrint(TEXT(__FILE__),__LINE__,NULL,_fmt_,_arg1_)
|
|
#define SetupDebugPrint2(_fmt_,_arg1_,_arg2_) pSetupDebugPrint(TEXT(__FILE__),__LINE__,NULL,_fmt_,_arg1_,_arg2_)
|
|
#define SetupDebugPrint3(_fmt_,_arg1_,_arg2_,_arg3_) pSetupDebugPrint(TEXT(__FILE__),__LINE__,NULL,_fmt_,_arg1_,_arg2_,_arg3_)
|
|
#define SetupDebugPrint4(_fmt_,_arg1_,_arg2_,_arg3_,_arg4_) pSetupDebugPrint(TEXT(__FILE__),__LINE__,NULL,_fmt_,_arg1_,_arg2_,_arg3_,_arg4_)
|
|
#define SetupDebugPrint5(_fmt_,_arg1_,_arg2_,_arg3_,_arg4_,_arg5_) pSetupDebugPrint(TEXT(__FILE__),__LINE__,NULL,_fmt_,_arg1_,_arg2_,_arg3_,_arg4_,_arg5_)
|
|
|
|
|
|
VOID
|
|
SaveInstallInfoIntoEventLog(
|
|
VOID
|
|
);
|
|
|
|
|
|
#ifdef _SETUP_PERF_
|
|
#define BEGIN_SECTION(_section_) pSetupDebugPrint(TEXT(__FILE__),__LINE__,L"BEGIN_SECTION",_section_)
|
|
#define END_SECTION(_section_) pSetupDebugPrint(TEXT(__FILE__),__LINE__,L"END_SECTION",_section_)
|
|
#define BEGIN_FUNCTION(_func_) pSetupDebugPrint(TEXT(__FILE__),__LINE__,L"BEGIN_FUNCTION",_func_)
|
|
#define END_FUNCTION(_func_) pSetupDebugPrint(TEXT(__FILE__),__LINE__,L"END_FUNCTION",_func_)
|
|
#define BEGIN_BLOCK(_block_) pSetupDebugPrint(TEXT(__FILE__),__LINE__,L"BEGIN_BLOCK",_block_)
|
|
#define END_BLOCK(_block_) pSetupDebugPrint(TEXT(__FILE__),__LINE__,L"END_BLOCK",_block_)
|
|
#else // ! _PERF_
|
|
#define BEGIN_SECTION(_section_) ((void)0)
|
|
#define END_SECTION(_section_) ((void)0)
|
|
#endif // _PERF_
|
|
|
|
//
|
|
// Service Pack DLL Prototypes
|
|
//
|
|
|
|
#define SVCPACK_DLL_NAME TEXT("svcpack.dll")
|
|
#define SVCPACK_CALLBACK_NAME ("SvcPackCallbackRoutine")
|
|
|
|
#define CALL_SERVICE_PACK(_si_,_p1_,_p2_,_p3_) if (hModSvcPack && pSvcPackCallbackRoutine) pSvcPackCallbackRoutine(_si_,_p1_,_p2_,_p3_)
|
|
|
|
#define SVCPACK_PHASE_1 1
|
|
#define SVCPACK_PHASE_2 2
|
|
#define SVCPACK_PHASE_3 3
|
|
#define SVCPACK_PHASE_4 4
|
|
|
|
typedef DWORD
|
|
(WINAPI *PSVCPACKCALLBACKROUTINE)(
|
|
DWORD dwSetupPhase,
|
|
DWORD dwParam1,
|
|
DWORD dwParam2,
|
|
DWORD dwParam3
|
|
);
|
|
|
|
extern HMODULE hModSvcPack;
|
|
extern PSVCPACKCALLBACKROUTINE pSvcPackCallbackRoutine;
|
|
|
|
extern HINSTANCE hinstBB;
|
|
void PrepareBillBoard(HWND hwnd);
|
|
void TerminateBillBoard();
|
|
HWND GetBBhwnd();
|
|
void SetBBStep(int iStep);
|
|
VOID CenterWindowRelativeToWindow(HWND hwndtocenter, HWND hwndcenteron, BOOL bWizard);
|
|
BOOL BB_ShowProgressGaugeWnd(UINT nCmdShow);
|
|
LRESULT BB_ProgressGaugeMsg(UINT msg, WPARAM wparam, LPARAM lparam);
|
|
LRESULT ProgressGaugeMsgWrapper(UINT msg, WPARAM wparam, LPARAM lparam);
|
|
void BB_SetProgressText(LPCTSTR szText);
|
|
void BB_SetTimeEstimateText(LPTSTR szText);
|
|
void BB_SetInfoText(LPTSTR szText);
|
|
BOOL StartStopBB(BOOL bStart);
|
|
|
|
|
|
HWND
|
|
ShowHideWizardPage(
|
|
IN BOOL bShow
|
|
);
|
|
|
|
LRESULT
|
|
Billboard_Progress_Callback(
|
|
IN UINT Msg,
|
|
IN WPARAM wParam,
|
|
IN LPARAM lParam
|
|
);
|
|
VOID Billboard_Set_Progress_Text(LPCTSTR Text);
|
|
|
|
typedef struct _SETUPPHASE {
|
|
DWORD Time;
|
|
BOOL Win9xUpgradeOnly;
|
|
} SETUPPHASE;
|
|
|
|
|
|
void SetTimeEstimates();
|
|
DWORD CalcTimeRemaining(UINT Phase);
|
|
void SetRemainingTime(DWORD TimeInSeconds);
|
|
void UpdateTimeString(DWORD RemainungTimeMsecInThisPhase,
|
|
DWORD *PreviousRemainingTime);
|
|
|
|
extern UINT CurrentPhase;
|
|
extern ULONG RemainingTime;
|
|
extern SETUPPHASE SetupPhase[];
|
|
|
|
typedef enum {
|
|
Phase_Unknown = -1,
|
|
Phase_Initialize = 0,
|
|
Phase_InstallSecurity,
|
|
Phase_PrecompileInfs,
|
|
Phase_InstallEnumDevices1,
|
|
Phase_InstallLegacyDevices,
|
|
Phase_InstallEnumDevices2,
|
|
Phase_NetInstall,
|
|
Phase_OCInstall,
|
|
Phase_InstallComponentInfs,
|
|
Phase_Inf_Registration,
|
|
Phase_RunOnce_Registration,
|
|
Phase_SecurityTempates,
|
|
Phase_Win9xMigration,
|
|
Phase_SFC,
|
|
Phase_SaveRepair,
|
|
Phase_RemoveTempFiles,
|
|
Phase_Reboot // no entry for this, just to make sure we don't overrun.
|
|
} SetupPhases;
|
|
|
|
|
|
|
|
#include "SetupSxs.h"
|
|
#include "SxsApi.h"
|
|
|
|
typedef struct _SIDE_BY_SIDE
|
|
{
|
|
HINSTANCE Dll;
|
|
PSXS_BEGIN_ASSEMBLY_INSTALL BeginAssemblyInstall;
|
|
PSXS_END_ASSEMBLY_INSTALL EndAssemblyInstall;
|
|
PSXS_INSTALL_W InstallW;
|
|
PVOID Context;
|
|
} SIDE_BY_SIDE;
|
|
|
|
BOOL
|
|
SideBySidePopulateCopyQueue(
|
|
SIDE_BY_SIDE* Sxs,
|
|
HSPFILEQ FileQ, OPTIONAL
|
|
PCWSTR AssembliesRootSource OPTIONAL
|
|
);
|
|
|
|
BOOL
|
|
SideBySideFinish(
|
|
SIDE_BY_SIDE* Sxs,
|
|
BOOL fSuccess
|
|
);
|
|
|
|
BOOL
|
|
SideBySideCreateSyssetupContext(
|
|
VOID
|
|
);
|
|
|
|
|
|
VOID
|
|
SetUpProcessorNaming(
|
|
VOID
|
|
);
|
|
|
|
BOOL
|
|
SpSetProductTypeFromParameters(
|
|
VOID
|
|
);
|
|
|
|
//
|
|
// imported from setupapi
|
|
//
|
|
#define SIZECHARS(x) (sizeof((x))/sizeof(TCHAR))
|
|
#define CSTRLEN(x) ((sizeof((x))/sizeof(TCHAR)) - 1)
|
|
#define ARRAYSIZE(x) (sizeof((x))/sizeof((x)[0]))
|
|
#define MyFree pSetupFree
|
|
#define MyMalloc pSetupMalloc
|
|
#define MyRealloc pSetupRealloc
|
|
|
|
BOOL
|
|
FileExists(
|
|
IN PCTSTR FileName,
|
|
OUT PWIN32_FIND_DATA FindData OPTIONAL
|
|
);
|
|
|
|
BOOL
|
|
DriverNodeSupportsNT(
|
|
IN HDEVINFO DeviceInfoSet,
|
|
IN PSP_DEVINFO_DATA DeviceInfoData OPTIONAL
|
|
);
|
|
|
|
VOID
|
|
ReplaceSlashWithHash(
|
|
IN PWSTR Str
|
|
);
|
|
|
|
HANDLE
|
|
UtilpGetDeviceHandle(
|
|
HDEVINFO DevInfo,
|
|
PSP_DEVINFO_DATA DevInfoData,
|
|
LPGUID ClassGuid,
|
|
DWORD DesiredAccess
|
|
);
|
|
|
|
typedef enum {
|
|
CDRetail,
|
|
CDOem,
|
|
CDSelect
|
|
} CDTYPE;
|
|
|
|
extern CDTYPE CdType;
|
|
extern DWORD GetProductFlavor();
|
|
|
|
BOOL IsSafeMode(
|
|
VOID
|
|
);
|
|
|
|
DWORD
|
|
SpUninstallCatalog(
|
|
IN HCATADMIN CatAdminHandle OPTIONAL,
|
|
IN PCWSTR CatFileName,
|
|
IN PCWSTR CatFilePath OPTIONAL,
|
|
IN PCWSTR AttributeName OPTIONAL,
|
|
IN PCWSTR AttributeValue OPTIONAL,
|
|
IN OUT PLIST_ENTRY InstalledCatalogsList OPTIONAL
|
|
);
|
|
|
|
extern GUID DriverVerifyGuid;
|
|
|
|
#ifdef PRERELEASE
|
|
extern INT g_TestHook;
|
|
# define TESTHOOK(n) if(g_TestHook==(n))RaiseException(EXCEPTION_NONCONTINUABLE_EXCEPTION,EXCEPTION_NONCONTINUABLE,0,NULL)
|
|
#else
|
|
# define TESTHOOK(n)
|
|
#endif
|
|
|
|
BOOL
|
|
RenameOnRestartOfGUIMode(
|
|
IN PCWSTR pPathName,
|
|
IN PCWSTR pPathNameNew
|
|
);
|
|
|
|
BOOL
|
|
DeleteOnRestartOfGUIMode(
|
|
IN PCWSTR pPathName
|
|
);
|
|
|
|
VOID
|
|
RemoveAllPendingOperationsOnRestartOfGUIMode(
|
|
VOID
|
|
);
|
|
|
|
typedef struct _STRING_LIST_ENTRY
|
|
{
|
|
LIST_ENTRY Entry;
|
|
PTSTR String;
|
|
}
|
|
STRING_LIST_ENTRY, *PSTRING_LIST_ENTRY;
|
|
|
|
void
|
|
FORCEINLINE
|
|
FreeStringEntry(
|
|
PLIST_ENTRY pEntry,
|
|
BOOL DeleteEntry
|
|
)
|
|
{
|
|
PSTRING_LIST_ENTRY pStringEntry = CONTAINING_RECORD(pEntry, STRING_LIST_ENTRY, Entry);
|
|
|
|
if(pStringEntry->String != NULL) {
|
|
MyFree(pStringEntry->String);
|
|
pStringEntry->String = NULL;
|
|
}
|
|
|
|
if(DeleteEntry) {
|
|
MyFree(pStringEntry);
|
|
}
|
|
}
|
|
|
|
typedef BOOL (CALLBACK* PFN_BUILD_FILE_LIST_CALLBACK)(IN PCTSTR Directory OPTIONAL, IN PCTSTR FilePath);
|
|
|
|
void
|
|
FORCEINLINE
|
|
FreeStringList(
|
|
PLIST_ENTRY pListHead
|
|
)
|
|
{
|
|
PLIST_ENTRY pEntry;
|
|
ASSERT(pListHead != NULL);
|
|
pEntry = pListHead->Flink;
|
|
|
|
while(pEntry != pListHead) {
|
|
PLIST_ENTRY Flink = pEntry->Flink;
|
|
FreeStringEntry(pEntry, TRUE);
|
|
pEntry = Flink;
|
|
}
|
|
|
|
InitializeListHead(pListHead);
|
|
}
|
|
|
|
DWORD
|
|
BuildFileListFromDir(
|
|
IN PCTSTR PathBase,
|
|
IN PCTSTR Directory OPTIONAL,
|
|
IN DWORD MustHaveAttrs OPTIONAL,
|
|
IN DWORD MustNotHaveAttrs OPTIONAL,
|
|
IN PFN_BUILD_FILE_LIST_CALLBACK Callback OPTIONAL,
|
|
OUT PLIST_ENTRY ListHead
|
|
);
|
|
|
|
PSTRING_LIST_ENTRY
|
|
SearchStringInList(
|
|
IN PLIST_ENTRY ListHead,
|
|
IN PCTSTR String,
|
|
BOOL CaseSensitive
|
|
);
|
|
|
|
DWORD
|
|
LookupCatalogAttribute(
|
|
IN PCWSTR CatalogName,
|
|
IN PCWSTR Directory OPTIONAL,
|
|
IN PCWSTR AttributeName OPTIONAL,
|
|
IN PCWSTR AttributeValue OPTIONAL,
|
|
PBOOL Found
|
|
);
|
|
|
|
BOOL
|
|
BuildPath (
|
|
OUT PTSTR PathBuffer,
|
|
IN DWORD PathBufferSize,
|
|
IN PCTSTR Path1,
|
|
IN PCTSTR Path2
|
|
);
|