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.
1508 lines
37 KiB
1508 lines
37 KiB
/*++
|
|
|
|
Copyright (c) Microsoft Corporation. All rights reserved.
|
|
|
|
Module Name:
|
|
|
|
setupntp.h
|
|
|
|
Abstract:
|
|
|
|
Private top-level header file for Windows NT Setup
|
|
services Dll.
|
|
|
|
Author:
|
|
|
|
Ted Miller (tedm) 11-Jan-1995
|
|
|
|
Revision History:
|
|
|
|
Jamie Hunter (jamiehun) 27-Jan-2000 Added infcache.h
|
|
Jim Schmidt (jimschm) 16-Dec-1998 Log api init
|
|
Jim Schmidt (jimschm) 28-Apr-1997 Added stub.h
|
|
Jamie Hunter (jamiehun) 13-Jan-1997 Added backup.h
|
|
|
|
--*/
|
|
|
|
|
|
#if !defined(UNICODE) || !defined(_UNICODE) || defined(ANSI_SETUPAPI)
|
|
#error "Ansi SetupAPI no longer supported"
|
|
#endif
|
|
|
|
//
|
|
// System header files
|
|
//
|
|
|
|
#if DBG
|
|
#ifndef MEM_DBG
|
|
#define MEM_DBG 1
|
|
#endif
|
|
#else
|
|
#ifndef MEM_DBG
|
|
#define MEM_DBG 0
|
|
#endif
|
|
#endif
|
|
|
|
//
|
|
// NT Header Files
|
|
//
|
|
#include <nt.h>
|
|
#include <ntrtl.h>
|
|
#include <nturtl.h>
|
|
|
|
|
|
//
|
|
// Make sure we always use version 2 of SP_ALTPLATFORM_INFO structure...
|
|
//
|
|
#define USE_SP_ALTPLATFORM_INFO_V1 0
|
|
|
|
//
|
|
// CRT header files
|
|
//
|
|
#include <process.h>
|
|
#include <malloc.h>
|
|
#include <wchar.h>
|
|
#include <stddef.h>
|
|
#include <stdio.h>
|
|
#include <fcntl.h>
|
|
#include <tchar.h>
|
|
#include <mbstring.h>
|
|
//
|
|
// Windows header files
|
|
//
|
|
#include <windows.h>
|
|
#include <windowsx.h>
|
|
#include <commctrl.h>
|
|
#include <commdlg.h>
|
|
#include <prsht.h>
|
|
#include <spfusion.h>
|
|
|
|
#include <imagehlp.h>
|
|
#include <diamondd.h>
|
|
#include <lzexpand.h>
|
|
#include <dlgs.h>
|
|
#include <regstr.h>
|
|
#include <infstr.h>
|
|
#include <objbase.h>
|
|
#include <wincrypt.h>
|
|
#include <mscat.h>
|
|
#include <softpub.h>
|
|
#include <wintrust.h>
|
|
#include <cryptui.h>
|
|
#include <shlobj.h>
|
|
#include <shlwapi.h>
|
|
#include <shellapi.h>
|
|
#include <userenv.h>
|
|
#include <userenvp.h>
|
|
#include <secedit.h>
|
|
#include <scesetup.h>
|
|
#include <sfcapip.h>
|
|
#include <wow64reg.h>
|
|
#include <dbt.h>
|
|
#include <shimdb.h>
|
|
#include <setupapi.h>
|
|
|
|
#include <cfgmgr32.h>
|
|
#include <spapip.h>
|
|
#include <devguid.h>
|
|
#include <cdm.h>
|
|
|
|
//
|
|
// safe strings
|
|
//
|
|
#define STRSAFE_NO_DEPRECATE // we're using both safe and 'unsafe' routines right now
|
|
#include <strsafe.h>
|
|
|
|
//
|
|
// these definitions may be used by private header files
|
|
//
|
|
#ifndef ARRAYSIZE
|
|
#define ARRAYSIZE(x) (sizeof((x))/sizeof((x)[0]))
|
|
#endif
|
|
#define SIZECHARS(x) ARRAYSIZE(x)
|
|
#define CSTRLEN(x) (SIZECHARS(x)-1)
|
|
|
|
typedef struct _STRING_TO_DATA {
|
|
PCTSTR String;
|
|
UINT_PTR Data;
|
|
} STRING_TO_DATA, *PSTRING_TO_DATA;
|
|
|
|
//
|
|
// Define structure to house various verification context handles (cached on a
|
|
// per-file-queue basis for performance).
|
|
//
|
|
typedef struct _VERIFY_CONTEXT {
|
|
//
|
|
// crypto context handle acquired during digital signature verification
|
|
// (starts out as NULL, if non-NULL when freeing queue, must release via
|
|
// CryptCATAdminReleaseContext)
|
|
//
|
|
HCATADMIN hCatAdmin;
|
|
|
|
//
|
|
// handle to bad driver database acquired during check for blocked driver
|
|
// (starts out as NULL, if non-NULL when freeing queue, must release via
|
|
// SdbReleaseDatabase)
|
|
//
|
|
HSDB hSDBDrvMain;
|
|
|
|
//
|
|
// handle to trusted publisher certificate store. Used when checking to
|
|
// see if the publisher of an Authenticode-signed catalog should be
|
|
// implicitly trusted (i.e., without prompting the user). (starts out as
|
|
// NULL, if non-NULL when freing queue, must release via CertCloseStore)
|
|
//
|
|
HCERTSTORE hStoreTrustedPublisher;
|
|
|
|
} VERIFY_CONTEXT, *PVERIFY_CONTEXT;
|
|
|
|
|
|
//
|
|
// Private header files
|
|
//
|
|
#include "sputils/locking.h"
|
|
#include "sputils/strtab.h"
|
|
#include "memory.h"
|
|
#include "cntxtlog.h"
|
|
#include "inf.h"
|
|
#include "infcache.h"
|
|
#include "backup.h"
|
|
#include "fileq.h"
|
|
#include "debug.h"
|
|
#include "devinst.h"
|
|
#include "devres.h"
|
|
#include "rc_ids.h"
|
|
#include "msg.h"
|
|
#include "stub.h"
|
|
#include "helpids.h"
|
|
|
|
#ifdef CHILDREGISTRATION
|
|
#include "childreg.h"
|
|
#ifndef _WIN64
|
|
#include <wow64t.h>
|
|
#endif // _WIN64
|
|
#endif // CHILDREGISTRATION
|
|
|
|
//
|
|
// NTRAID#489682-2001/11/02-JamieHun These need to move into public headers
|
|
//
|
|
#define SP_COPY_ALREADYDECOMP 0x0400000 // similar to SP_COPY_NODECOMP
|
|
|
|
//
|
|
// Private DNF_ flags (start at 0x10000000)
|
|
//
|
|
#define PDNF_MASK 0xF0000000 // Mask for private PDNF_xxx flags
|
|
#define PDNF_CLEANUP_SOURCE_PATH 0x10000000 // Delete the source path when we destroy the driver node
|
|
// used when drivers are downloaded from the Internet
|
|
//
|
|
// Thread Local Storage Index
|
|
//
|
|
extern DWORD TlsIndex;
|
|
|
|
//
|
|
// Module handle for this DLL. Filled in at process attach.
|
|
//
|
|
extern HANDLE MyDllModuleHandle;
|
|
|
|
//
|
|
// Module handle for security DLL. Initialized to NULL in at process attach. Filled in when SCE APIs have to be called
|
|
//
|
|
extern HINSTANCE SecurityDllHandle;
|
|
|
|
//
|
|
// OS Version Information structure filled in at process attach.
|
|
//
|
|
extern OSVERSIONINFOEX OSVersionInfo;
|
|
|
|
//
|
|
// Static strings we retreive once, at process attach.
|
|
//
|
|
extern PCTSTR WindowsDirectory,InfDirectory,SystemDirectory,ConfigDirectory,DriversDirectory,System16Directory;
|
|
extern PCTSTR SystemSourcePath,ServicePackSourcePath,DriverCacheSourcePath,ServicePackCachePath;
|
|
extern PCTSTR OsLoaderRelativePath; // may be NULL
|
|
extern PCTSTR OsSystemPartitionRoot; // \\?\GLOBALROOT\Device\Volume
|
|
extern PCTSTR WindowsBackupDirectory; // Directory to write uninstall backups to
|
|
extern PCTSTR ProcessFileName; // Filename of app calling setupapi
|
|
extern PCTSTR LastGoodDirectory; // %windir%\LastGood
|
|
|
|
//
|
|
// are we inside gui setup? determined at process attach
|
|
//
|
|
extern BOOL GuiSetupInProgress;
|
|
|
|
//
|
|
// various other global flags
|
|
//
|
|
extern DWORD GlobalSetupFlags;
|
|
|
|
//
|
|
// global window message for cancelling autoplay.
|
|
//
|
|
extern UINT g_uQueryCancelAutoPlay;
|
|
|
|
//
|
|
// Static multi-sz list of directories to be searched for INFs.
|
|
//
|
|
extern PCTSTR InfSearchPaths;
|
|
|
|
//
|
|
// Determine at runtime if we're running under WOW64
|
|
//
|
|
#ifndef _WIN64
|
|
extern BOOL IsWow64;
|
|
#endif
|
|
|
|
#ifdef UNICODE
|
|
extern DWORD Seed;
|
|
#endif
|
|
|
|
//
|
|
// ImageHlp isn't multi-thread safe, so needs a mutex
|
|
//
|
|
extern CRITICAL_SECTION InitMutex; // for one-time initializations
|
|
extern CRITICAL_SECTION ImageHlpMutex; // for dealing with IMAGEHLP library
|
|
extern CRITICAL_SECTION PlatformPathOverrideCritSect;
|
|
extern CRITICAL_SECTION LogUseCountCs;
|
|
extern CRITICAL_SECTION MruCritSect;
|
|
extern CRITICAL_SECTION NetConnectionListCritSect;
|
|
|
|
|
|
//
|
|
// Debug memory functions and wrappers to track allocations
|
|
//
|
|
|
|
DWORD
|
|
QueryRegistryValue(
|
|
IN HKEY KeyHandle,
|
|
IN PCTSTR ValueName,
|
|
OUT PTSTR *Value,
|
|
OUT PDWORD DataType,
|
|
OUT PDWORD DataSizeBytes
|
|
);
|
|
|
|
DWORD
|
|
QueryDeviceRegistryProperty(
|
|
IN HDEVINFO DeviceInfoSet,
|
|
IN PSP_DEVINFO_DATA DeviceInfoData,
|
|
IN DWORD Property,
|
|
OUT PTSTR *Value,
|
|
OUT PDWORD DataType,
|
|
OUT PDWORD DataSizeBytes
|
|
);
|
|
|
|
DWORD
|
|
QueryRegistryDwordValue(
|
|
IN HKEY KeyHandle,
|
|
IN PCTSTR ValueName,
|
|
OUT PDWORD Value
|
|
);
|
|
|
|
BOOL
|
|
MemoryInitializeEx(
|
|
IN BOOL Attach
|
|
);
|
|
|
|
#if MEM_DBG
|
|
|
|
//
|
|
// Macros and wrappers are needed for externally exposed functions
|
|
//
|
|
PVOID MyDebugMalloc(
|
|
IN DWORD Size,
|
|
IN PCSTR Filename,
|
|
IN DWORD Line,
|
|
IN DWORD Tag
|
|
);
|
|
|
|
#define MyMalloc(sz) MyDebugMalloc(sz,__FILE__,__LINE__,0)
|
|
#define MyTaggedMalloc(sz,tag) MyDebugMalloc(sz,__FILE__,__LINE__,tag)
|
|
#define MyTaggedRealloc(ptr,sz,tag) pSetupReallocWithTag(ptr,sz,tag)
|
|
#define MyTaggedFree(ptr,tag) pSetupFreeWithTag(ptr,tag)
|
|
|
|
DWORD
|
|
TrackedQueryRegistryValue(
|
|
IN TRACK_ARG_DECLARE,
|
|
IN HKEY KeyHandle,
|
|
IN PCTSTR ValueName,
|
|
OUT PTSTR *Value,
|
|
OUT PDWORD DataType,
|
|
OUT PDWORD DataSizeBytes
|
|
);
|
|
|
|
#define QueryRegistryValue(a,b,c,d,e) TrackedQueryRegistryValue(TRACK_ARG_CALL,a,b,c,d,e)
|
|
|
|
DWORD
|
|
TrackedQueryDeviceRegistryProperty(
|
|
IN TRACK_ARG_DECLARE TRACK_ARG_COMMA
|
|
IN HDEVINFO DeviceInfoSet,
|
|
IN PSP_DEVINFO_DATA DeviceInfoData,
|
|
IN DWORD Property,
|
|
OUT PTSTR *Value,
|
|
OUT PDWORD DataType,
|
|
OUT PDWORD DataSizeBytes
|
|
);
|
|
|
|
#define QueryDeviceRegistryProperty(a,b,c,d,e,f) TrackedQueryDeviceRegistryProperty(TRACK_ARG_CALL,a,b,c,d,e,f)
|
|
|
|
PTSTR
|
|
TrackedDuplicateString(
|
|
IN TRACK_ARG_DECLARE,
|
|
IN PCTSTR String
|
|
);
|
|
|
|
#define DuplicateString(x) TrackedDuplicateString(TRACK_ARG_CALL,x)
|
|
|
|
#else
|
|
|
|
#define DuplicateString pSetupDuplicateString
|
|
#define MyMalloc(sz) pSetupMalloc(sz)
|
|
#define MyTaggedMalloc(sz,tag) pSetupMalloc(sz)
|
|
#define MyTaggedRealloc(ptr,sz,tag) pSetupRealloc(ptr,sz)
|
|
#define MyTaggedFree(ptr,tag) pSetupFree(ptr)
|
|
|
|
#endif
|
|
|
|
#define MyFree(ptr) pSetupFree(ptr)
|
|
#define MyRealloc(ptr,sz) pSetupRealloc(ptr,sz)
|
|
|
|
//
|
|
// memory tags grouped here for easy reference
|
|
// see also common.h in sputils
|
|
//
|
|
//
|
|
// Log Context tags
|
|
//
|
|
#define MEMTAG_LOGCONTEXT (0x636c434c) // LClc - context structure
|
|
#define MEMTAG_LCSECTION (0x7378434c) // LCxs - section string
|
|
#define MEMTAG_LCBUFFER (0x6278434c) // LCxb - other strings
|
|
#define MEMTAG_LCINFO (0x6269434c) // LCib - info (array of buffers)
|
|
#define MEMTAG_LCINDEXES (0x6969434c) // LCii - index
|
|
//
|
|
// Loaded_Inf tags
|
|
//
|
|
#define MEMTAG_INF (0x666e694c) // Linf - LOADED_INF
|
|
#define MEMTAG_VBDATA (0x6462764c) // Lvbd - version block data
|
|
|
|
|
|
//
|
|
// File functions in fileutil.c
|
|
//
|
|
|
|
typedef struct _TEXTFILE_READ_BUFFER {
|
|
PCTSTR TextBuffer;
|
|
DWORD TextBufferSize;
|
|
HANDLE FileHandle;
|
|
HANDLE MappingHandle;
|
|
PVOID ViewAddress;
|
|
} TEXTFILE_READ_BUFFER, *PTEXTFILE_READ_BUFFER;
|
|
|
|
DWORD
|
|
ReadAsciiOrUnicodeTextFile(
|
|
IN HANDLE FileHandle,
|
|
OUT PTEXTFILE_READ_BUFFER Result,
|
|
IN PSETUP_LOG_CONTEXT LogContext OPTIONAL
|
|
);
|
|
|
|
BOOL
|
|
DestroyTextFileReadBuffer(
|
|
IN PTEXTFILE_READ_BUFFER ReadBuffer
|
|
);
|
|
|
|
BOOL
|
|
AddFileTimeSeconds(
|
|
IN const FILETIME *Base,
|
|
OUT FILETIME *Target,
|
|
IN INT Seconds
|
|
);
|
|
|
|
DWORD
|
|
GetSetFileTimestamp(
|
|
IN PCTSTR FileName,
|
|
OUT FILETIME *CreateTime, OPTIONAL
|
|
OUT FILETIME *AccessTime, OPTIONAL
|
|
OUT FILETIME *WriteTime, OPTIONAL
|
|
IN BOOL Set
|
|
);
|
|
|
|
DWORD
|
|
RetreiveFileSecurity(
|
|
IN PCTSTR FileName,
|
|
OUT PSECURITY_DESCRIPTOR *SecurityDescriptor
|
|
);
|
|
|
|
DWORD
|
|
StampFileSecurity(
|
|
IN PCTSTR FileName,
|
|
IN PSECURITY_DESCRIPTOR SecurityInfo
|
|
);
|
|
|
|
DWORD
|
|
TakeOwnershipOfFile(
|
|
IN PCTSTR Filename
|
|
);
|
|
|
|
DWORD
|
|
SearchForInfFile(
|
|
IN PCTSTR InfName,
|
|
OUT LPWIN32_FIND_DATA FindData,
|
|
IN DWORD SearchControl,
|
|
OUT PTSTR FullInfPath,
|
|
IN UINT FullInfPathSize,
|
|
OUT PUINT RequiredSize OPTIONAL
|
|
);
|
|
|
|
DWORD
|
|
MultiSzFromSearchControl(
|
|
IN DWORD SearchControl,
|
|
OUT PTCHAR PathList,
|
|
IN DWORD PathListSize,
|
|
OUT PDWORD RequiredSize OPTIONAL
|
|
);
|
|
|
|
PSTR
|
|
GetAnsiMuiSafePathname(
|
|
IN PCTSTR FilePath
|
|
);
|
|
|
|
PSTR
|
|
GetAnsiMuiSafeFilename(
|
|
IN PCTSTR FilePath
|
|
);
|
|
|
|
BOOL
|
|
pSetupAppendPath(
|
|
IN PCTSTR Path1,
|
|
IN PCTSTR Path2,
|
|
OUT PTSTR* Combined
|
|
);
|
|
|
|
BOOL
|
|
pSetupApplyExtension(
|
|
IN PCTSTR Original,
|
|
IN PCTSTR Extension,
|
|
OUT PTSTR* NewName
|
|
);
|
|
|
|
//
|
|
// Resource/string retrieval routines in resource.c
|
|
//
|
|
|
|
VOID
|
|
SetDlgText(
|
|
IN HWND hwndDlg,
|
|
IN INT iControl,
|
|
IN UINT nStartString,
|
|
IN UINT nEndString
|
|
);
|
|
|
|
#define SDT_MAX_TEXT 1000 // Max SetDlgText() combined text size
|
|
|
|
PTSTR
|
|
MyLoadString(
|
|
IN UINT StringId
|
|
);
|
|
|
|
PTSTR
|
|
FormatStringMessage(
|
|
IN UINT FormatStringId,
|
|
...
|
|
);
|
|
|
|
PTSTR
|
|
FormatStringMessageV(
|
|
IN UINT FormatStringId,
|
|
IN va_list *ArgumentList
|
|
);
|
|
|
|
PTSTR
|
|
FormatStringMessageFromString(
|
|
IN PTSTR FormatString,
|
|
...
|
|
);
|
|
|
|
PTSTR
|
|
FormatStringMessageFromStringV(
|
|
IN PTSTR FormatString,
|
|
IN va_list *ArgumentList
|
|
);
|
|
|
|
PTSTR
|
|
RetreiveAndFormatMessage(
|
|
IN UINT MessageId,
|
|
...
|
|
);
|
|
|
|
PTSTR
|
|
RetreiveAndFormatMessageV(
|
|
IN UINT MessageId,
|
|
IN va_list *ArgumentList
|
|
);
|
|
|
|
INT
|
|
FormatMessageBox(
|
|
IN HANDLE hinst,
|
|
IN HWND hwndParent,
|
|
IN UINT TextMessageId,
|
|
IN PCTSTR Title,
|
|
IN UINT Style,
|
|
...
|
|
);
|
|
|
|
//
|
|
// This is in shell32.dll and in windows\inc16\shlsemip.h but
|
|
// that file cannot be #include'd here as it has macros that clash
|
|
// with our own, etc.
|
|
//
|
|
#ifdef ANSI_SETUPAPI
|
|
//
|
|
// Win9x - does not have RestartDialogEx
|
|
//
|
|
#define RestartDialogEx(hwnd,Prompt,Return,ReasonCode) RestartDialog(hwnd,Prompt,Return)
|
|
#endif
|
|
//
|
|
// Decompression/filename manupilation routines in decomp.c.
|
|
//
|
|
PTSTR
|
|
SetupGenerateCompressedName(
|
|
IN PCTSTR Filename
|
|
);
|
|
|
|
DWORD
|
|
SetupInternalGetFileCompressionInfo(
|
|
IN PCTSTR SourceFileName,
|
|
OUT PTSTR *ActualSourceFileName,
|
|
OUT PWIN32_FIND_DATA SourceFindData,
|
|
OUT PDWORD TargetFileSize,
|
|
OUT PUINT CompressionType
|
|
);
|
|
|
|
DWORD
|
|
SetupDetermineSourceFileName(
|
|
IN PCTSTR FileName,
|
|
OUT PBOOL UsedCompressedName,
|
|
OUT PTSTR *FileNameLocated,
|
|
OUT PWIN32_FIND_DATA FindData
|
|
);
|
|
|
|
BOOL
|
|
pSetupDoesFileMatch(
|
|
IN PCTSTR InputName,
|
|
IN PCTSTR CompareName,
|
|
OUT PBOOL UsedCompressedName,
|
|
OUT PTSTR *FileNameLocated
|
|
);
|
|
|
|
//
|
|
// Diamond functions. The Process and Thread Attach routines are called
|
|
// by the DLL entry point routine and should not be called by anyone else.
|
|
//
|
|
BOOL
|
|
DiamondProcessAttach(
|
|
IN BOOL Attach
|
|
);
|
|
|
|
BOOL
|
|
DiamondTlsInit(
|
|
IN BOOL Init
|
|
);
|
|
|
|
BOOL
|
|
DiamondIsCabinet(
|
|
IN PCTSTR FileName
|
|
);
|
|
|
|
DWORD
|
|
DiamondProcessCabinet(
|
|
IN PCTSTR CabinetFile,
|
|
IN DWORD Flags,
|
|
IN PVOID MsgHandler,
|
|
IN PVOID Context,
|
|
IN BOOL IsUnicodeMsgHandler
|
|
);
|
|
|
|
//
|
|
// Misc routines
|
|
//
|
|
BOOL
|
|
IsInteractiveWindowStation(
|
|
VOID
|
|
);
|
|
|
|
VOID
|
|
DiskPromptGetDriveType(
|
|
IN PCTSTR PathToSource,
|
|
OUT PUINT DriveType,
|
|
OUT PBOOL IsRemovable
|
|
);
|
|
|
|
BOOL
|
|
SetTruncatedDlgItemText(
|
|
HWND hdlg,
|
|
UINT CtlId,
|
|
PCTSTR TextIn
|
|
);
|
|
|
|
LPTSTR
|
|
CompactFileName(
|
|
LPCTSTR FileNameIn,
|
|
DWORD CharsToRemove
|
|
);
|
|
|
|
DWORD
|
|
ExtraChars(
|
|
HWND hwnd,
|
|
LPCTSTR TextBuffer
|
|
);
|
|
|
|
VOID
|
|
pSetupInitPlatformPathOverrideSupport(
|
|
IN BOOL Init
|
|
);
|
|
|
|
VOID
|
|
pSetupInitSourceListSupport(
|
|
IN BOOL Init
|
|
);
|
|
|
|
DWORD
|
|
pSetupDecompressOrCopyFile(
|
|
IN PCTSTR SourceFileName,
|
|
IN PCTSTR TargetFileName,
|
|
IN PUINT CompressionType, OPTIONAL
|
|
IN BOOL AllowMove,
|
|
OUT PBOOL Moved OPTIONAL
|
|
);
|
|
|
|
BOOL
|
|
_SetupInstallFileEx(
|
|
IN PSP_FILE_QUEUE Queue, OPTIONAL
|
|
IN PSP_FILE_QUEUE_NODE QueueNode, OPTIONAL
|
|
IN HINF InfHandle, OPTIONAL
|
|
IN PINFCONTEXT InfContext, OPTIONAL
|
|
IN PCTSTR SourceFile, OPTIONAL
|
|
IN PCTSTR SourcePathRoot, OPTIONAL
|
|
IN PCTSTR DestinationName, OPTIONAL
|
|
IN DWORD CopyStyle,
|
|
IN PVOID CopyMsgHandler, OPTIONAL
|
|
IN PVOID Context, OPTIONAL
|
|
OUT PBOOL FileWasInUse,
|
|
IN BOOL IsMsgHandlerNativeCharWidth,
|
|
OUT PBOOL SignatureVerifyFailed
|
|
);
|
|
|
|
VOID
|
|
pSetupFreeVerifyContextMembers(
|
|
IN PVERIFY_CONTEXT VerifyContext
|
|
);
|
|
|
|
|
|
//
|
|
// Define flags for _SetupCopyOEMInf
|
|
//
|
|
#define SCOI_NO_UI_ON_SIGFAIL 0x00000001
|
|
#define SCOI_NO_ERRLOG_ON_MISSING_CATALOG 0x00000002
|
|
#define SCOI_NO_ERRLOG_IF_INF_ALREADY_PRESENT 0x00000004
|
|
#define SCOI_KEEP_INF_AND_CAT_ORIGINAL_NAMES 0x00000008 // for exception INFs
|
|
#define SCOI_ABORT_IF_UNSIGNED 0x00000010
|
|
#define SCOI_TRY_UPDATE_PNF 0x00000020 // not fatal if PNF
|
|
// present and in use
|
|
|
|
BOOL
|
|
_SetupCopyOEMInf(
|
|
IN PCTSTR SourceInfFileName,
|
|
IN PCTSTR OEMSourceMediaLocation, OPTIONAL
|
|
IN DWORD OEMSourceMediaType,
|
|
IN DWORD CopyStyle,
|
|
OUT PTSTR DestinationInfFileName, OPTIONAL
|
|
IN DWORD DestinationInfFileNameSize,
|
|
OUT PDWORD RequiredSize, OPTIONAL
|
|
OUT PTSTR *DestinationInfFileNameComponent, OPTIONAL
|
|
IN PCTSTR SourceInfOriginalName,
|
|
IN PCTSTR SourceInfCatalogName, OPTIONAL
|
|
IN HWND Owner,
|
|
IN PCTSTR DeviceDesc, OPTIONAL
|
|
IN DWORD DriverSigningPolicy,
|
|
IN DWORD Flags,
|
|
IN PCTSTR AltCatalogFile, OPTIONAL
|
|
IN PSP_ALTPLATFORM_INFO_V2 AltPlatformInfo, OPTIONAL
|
|
OUT PDWORD DriverSigningError, OPTIONAL
|
|
OUT PTSTR CatalogFilenameOnSystem,
|
|
IN PSETUP_LOG_CONTEXT LogContext,
|
|
IN OUT PVERIFY_CONTEXT VerifyContext, OPTIONAL
|
|
OUT HANDLE *hWVTStateData OPTIONAL
|
|
);
|
|
|
|
DWORD
|
|
pSetupUninstallCatalog(
|
|
IN LPCTSTR CatalogFilename
|
|
);
|
|
|
|
VOID
|
|
pSetupUninstallOEMInf(
|
|
IN LPCTSTR InfFullPath,
|
|
IN PSETUP_LOG_CONTEXT LogContext, OPTIONAL
|
|
IN DWORD Flags,
|
|
OUT PDWORD InfDeleteErr OPTIONAL
|
|
);
|
|
|
|
PTSTR
|
|
AllocAndReturnDriverSearchList(
|
|
IN DWORD SearchControl
|
|
);
|
|
|
|
pSetupGetSecurityInfo(
|
|
IN HINF Inf,
|
|
IN PCTSTR SectionName,
|
|
OUT PCTSTR *SecDesc );
|
|
|
|
BOOL
|
|
pSetupGetDriverDate(
|
|
IN HINF InfHandle,
|
|
IN PCTSTR Section,
|
|
IN OUT PFILETIME pFileTime
|
|
);
|
|
|
|
BOOL
|
|
pSetupGetDriverVersion(
|
|
IN HINF InfHandle,
|
|
IN PCTSTR Section,
|
|
OUT DWORDLONG *Version
|
|
);
|
|
|
|
PTSTR
|
|
GetMultiSzFromInf(
|
|
IN HINF InfHandle,
|
|
IN PCTSTR SectionName,
|
|
IN PCTSTR Key,
|
|
OUT PBOOL pSetupOutOfMemory
|
|
);
|
|
|
|
VOID
|
|
pSetupInitNetConnectionList(
|
|
IN BOOL Init
|
|
);
|
|
|
|
BOOL
|
|
_SetupGetSourceFileSize(
|
|
IN HINF InfHandle,
|
|
IN PINFCONTEXT InfContext, OPTIONAL
|
|
IN PCTSTR FileName, OPTIONAL
|
|
IN PCTSTR Section, OPTIONAL
|
|
IN PSP_ALTPLATFORM_INFO_V2 AltPlatformInfo, OPTIONAL
|
|
OUT PDWORD FileSize,
|
|
IN UINT RoundingFactor OPTIONAL
|
|
);
|
|
|
|
BOOL
|
|
_SetupGetSourceFileLocation(
|
|
IN HINF InfHandle,
|
|
IN PINFCONTEXT InfContext, OPTIONAL
|
|
IN PCTSTR FileName, OPTIONAL
|
|
IN PSP_ALTPLATFORM_INFO_V2 AltPlatformInfo, OPTIONAL
|
|
OUT PUINT SourceId, OPTIONAL
|
|
OUT PTSTR ReturnBuffer, OPTIONAL
|
|
IN DWORD ReturnBufferSize,
|
|
OUT PDWORD RequiredSize, OPTIONAL
|
|
OUT PINFCONTEXT LineContext OPTIONAL
|
|
);
|
|
|
|
DWORD
|
|
pSetupLogSectionError(
|
|
IN HINF InfHandle, OPTIONAL
|
|
IN HDEVINFO DeviceInfoSet, OPTIONAL
|
|
IN PSP_DEVINFO_DATA DeviceInfoData, OPTIONAL
|
|
IN PSP_FILE_QUEUE Queue, OPTIONAL
|
|
IN PCTSTR SectionName,
|
|
IN DWORD MsgID,
|
|
IN DWORD Err,
|
|
IN PCTSTR KeyName OPTIONAL
|
|
);
|
|
|
|
DWORD
|
|
pSetupLogSectionWarning(
|
|
IN HINF InfHandle, OPTIONAL
|
|
IN HDEVINFO DeviceInfoSet, OPTIONAL
|
|
IN PSP_DEVINFO_DATA DeviceInfoData, OPTIONAL
|
|
IN PSP_FILE_QUEUE Queue, OPTIONAL
|
|
IN PCTSTR SectionName,
|
|
IN DWORD MsgID,
|
|
IN DWORD Err,
|
|
IN PCTSTR KeyName OPTIONAL
|
|
);
|
|
|
|
DWORD
|
|
pSetupCopyRelatedInfs(
|
|
IN HINF hDeviceInf,
|
|
IN PCTSTR InfFileName, OPTIONAL
|
|
IN PCTSTR InfSectionName,
|
|
IN DWORD OEMSourceMediaType,
|
|
IN PSETUP_LOG_CONTEXT LogContext OPTIONAL
|
|
);
|
|
|
|
BOOL
|
|
pCompareFilesExact(
|
|
IN PCTSTR File1,
|
|
IN PCTSTR File2
|
|
);
|
|
|
|
|
|
//
|
|
// Routine to call out to a PSP_FILE_CALLBACK, handles
|
|
// Unicode<-->ANSI issues
|
|
//
|
|
UINT
|
|
pSetupCallMsgHandler(
|
|
IN PSETUP_LOG_CONTEXT LogContext,
|
|
IN PVOID MsgHandler,
|
|
IN BOOL MsgHandlerIsNativeCharWidth,
|
|
IN PVOID Context,
|
|
IN UINT Notification,
|
|
IN UINT_PTR Param1,
|
|
IN UINT_PTR Param2
|
|
);
|
|
|
|
UINT
|
|
pSetupCallDefaultMsgHandler(
|
|
IN PVOID Context,
|
|
IN UINT Notification,
|
|
IN UINT_PTR Param1,
|
|
IN UINT_PTR Param2
|
|
);
|
|
|
|
//
|
|
// Internal routine to get MRU list.
|
|
//
|
|
DWORD
|
|
pSetupGetList(
|
|
IN DWORD Flags,
|
|
OUT PCTSTR **List,
|
|
OUT PUINT Count,
|
|
OUT PBOOL NoBrowse
|
|
);
|
|
|
|
#define SRCPATH_USEPNFINFORMATION 0x00000001
|
|
#define SRCPATH_USEINFLOCATION 0x00000002
|
|
|
|
#define SRC_FLAGS_SVCPACK_SOURCE (0x0001)
|
|
|
|
|
|
#define PSP_COPY_USE_DRIVERCACHE 0x80000000
|
|
#define PSP_COPY_CHK_DRIVERCACHE 0x40000000
|
|
//#define PSP_COPY_USE_SPCACHE 0x20000000 - moved to spapip.w
|
|
|
|
PTSTR
|
|
pSetupGetDefaultSourcePath(
|
|
IN HINF InfHandle,
|
|
IN DWORD Flags,
|
|
OUT PDWORD InfSourceMediaType
|
|
);
|
|
|
|
VOID
|
|
InfSourcePathFromFileName(
|
|
IN PCTSTR InfFileName,
|
|
OUT PTSTR *SourcePath, OPTIONAL
|
|
OUT PBOOL TryPnf
|
|
);
|
|
|
|
BOOL
|
|
pSetupGetSourceInfo(
|
|
IN HINF InfHandle, OPTIONAL
|
|
IN PINFCONTEXT LayoutLineContext, OPTIONAL
|
|
IN UINT SourceId,
|
|
IN PSP_ALTPLATFORM_INFO_V2 AltPlatformInfo, OPTIONAL
|
|
IN UINT InfoDesired,
|
|
OUT PTSTR ReturnBuffer, OPTIONAL
|
|
IN DWORD ReturnBufferSize,
|
|
OUT PDWORD RequiredSize OPTIONAL
|
|
);
|
|
|
|
//
|
|
// function to get the apropriate return value for ReturnStatus, for specific callback Notification
|
|
//
|
|
UINT
|
|
pGetCallbackErrorReturn(
|
|
IN UINT Notification,
|
|
IN DWORD ReturnStatus
|
|
);
|
|
//
|
|
// Routines for creating/destroying global mini-icon list.
|
|
//
|
|
BOOL
|
|
CreateMiniIcons(
|
|
VOID
|
|
);
|
|
|
|
VOID
|
|
DestroyMiniIcons(
|
|
VOID
|
|
);
|
|
|
|
|
|
//
|
|
// Global log init/terminate
|
|
//
|
|
|
|
VOID
|
|
InitLogApi (
|
|
VOID
|
|
);
|
|
|
|
VOID
|
|
TerminateLogApi (
|
|
VOID
|
|
);
|
|
|
|
|
|
|
|
//
|
|
// DIRID mapping routines.
|
|
//
|
|
PCTSTR
|
|
pSetupVolatileDirIdToPath(
|
|
IN PCTSTR DirectoryId, OPTIONAL
|
|
IN UINT DirectoryIdInt, OPTIONAL
|
|
IN PCTSTR SubDirectory, OPTIONAL
|
|
IN PLOADED_INF Inf
|
|
);
|
|
|
|
DWORD
|
|
ApplyNewVolatileDirIdsToInfs(
|
|
IN PLOADED_INF MasterInf,
|
|
IN PLOADED_INF Inf OPTIONAL
|
|
);
|
|
|
|
PCTSTR
|
|
pSetupDirectoryIdToPathEx(
|
|
IN PCTSTR DirectoryId, OPTIONAL
|
|
IN OUT PUINT DirectoryIdInt, OPTIONAL
|
|
IN PCTSTR SubDirectory, OPTIONAL
|
|
IN PCTSTR InfSourcePath, OPTIONAL
|
|
IN OUT PCTSTR *OsLoaderPath, OPTIONAL
|
|
OUT PBOOL VolatileSystemDirId OPTIONAL
|
|
);
|
|
|
|
PCTSTR
|
|
pGetPathFromDirId(
|
|
IN PCTSTR DirectoryId,
|
|
IN PCTSTR SubDirectory, OPTIONAL
|
|
IN PLOADED_INF pLoadedInf
|
|
);
|
|
|
|
//
|
|
// routines for inter-thread communication
|
|
//
|
|
|
|
#ifndef UNICODE
|
|
#define MyMsgWaitForMultipleObjectsEx(nc,ph,dwms,dwwm,dwfl) MsgWaitForMultipleObjects(nc,ph,FALSE,dwms,dwwm)
|
|
#else
|
|
#define MyMsgWaitForMultipleObjectsEx MsgWaitForMultipleObjectsEx
|
|
#endif
|
|
|
|
//
|
|
// Macro to make ansi vs unicode string handling
|
|
// a little easier
|
|
//
|
|
#ifdef UNICODE
|
|
#define NewAnsiString(x) pSetupUnicodeToAnsi(x)
|
|
#define NewPortableString(x) pSetupAnsiToUnicode(x)
|
|
#else
|
|
#define NewAnsiString(x) DuplicateString(x)
|
|
#define NewPortableString(x) DuplicateString(x)
|
|
#endif
|
|
|
|
//
|
|
// Internal file-handling routines in fileutil.c
|
|
//
|
|
DWORD
|
|
MapFileForRead(
|
|
IN HANDLE FileHandle,
|
|
OUT PDWORD FileSize,
|
|
OUT PHANDLE MappingHandle,
|
|
OUT PVOID *BaseAddress
|
|
);
|
|
|
|
BOOL
|
|
DoMove(
|
|
IN PCTSTR CurrentName,
|
|
IN PCTSTR NewName
|
|
);
|
|
|
|
BOOL
|
|
DelayedMove(
|
|
IN PCTSTR CurrentName,
|
|
IN PCTSTR NewName OPTIONAL
|
|
);
|
|
|
|
extern GUID DriverVerifyGuid;
|
|
|
|
//
|
|
// Flags for VerifySourceFile and _VerifyFile
|
|
//
|
|
#define VERIFY_FILE_IGNORE_SELFSIGNED 0x00000001
|
|
#define VERIFY_FILE_USE_OEM_CATALOGS 0x00000002
|
|
#define VERIFY_FILE_USE_AUTHENTICODE_CATALOG 0x00000004
|
|
#define VERIFY_FILE_DRIVERBLOCKED_ONLY 0x00000008
|
|
#define VERIFY_FILE_NO_DRIVERBLOCKED_CHECK 0x00000010
|
|
|
|
DWORD
|
|
_VerifyFile(
|
|
IN PSETUP_LOG_CONTEXT LogContext,
|
|
IN OUT PVERIFY_CONTEXT VerifyContext, OPTIONAL
|
|
IN LPCTSTR Catalog, OPTIONAL
|
|
IN PVOID CatalogBaseAddress, OPTIONAL
|
|
IN DWORD CatalogImageSize,
|
|
IN LPCTSTR Key,
|
|
IN LPCTSTR FileFullPath,
|
|
OUT SetupapiVerifyProblem *Problem, OPTIONAL
|
|
OUT LPTSTR ProblemFile, OPTIONAL
|
|
IN BOOL CatalogAlreadyVerified,
|
|
IN PSP_ALTPLATFORM_INFO_V2 AltPlatformInfo, OPTIONAL
|
|
IN DWORD Flags, OPTIONAL
|
|
OUT LPTSTR CatalogFileUsed, OPTIONAL
|
|
OUT PDWORD NumCatalogsConsidered, OPTIONAL
|
|
OUT LPTSTR DigitalSigner, OPTIONAL
|
|
OUT LPTSTR SignerVersion, OPTIONAL
|
|
OUT HANDLE *hWVTStateData OPTIONAL
|
|
);
|
|
|
|
DWORD
|
|
VerifySourceFile(
|
|
IN PSETUP_LOG_CONTEXT LogContext,
|
|
IN PSP_FILE_QUEUE Queue, OPTIONAL
|
|
IN PSP_FILE_QUEUE_NODE QueueNode, OPTIONAL
|
|
IN PCTSTR Key,
|
|
IN PCTSTR FileToVerifyFullPath,
|
|
IN PCTSTR OriginalSourceFileFullPath, OPTIONAL
|
|
IN PSP_ALTPLATFORM_INFO_V2 AltPlatformInfo, OPTIONAL
|
|
IN DWORD Flags,
|
|
OUT SetupapiVerifyProblem *Problem,
|
|
OUT LPTSTR ProblemFile,
|
|
OUT LPTSTR CatalogFileUsed, OPTIONAL
|
|
OUT LPTSTR DigitalSigner, OPTIONAL
|
|
OUT LPTSTR SignerVersion, OPTIONAL
|
|
OUT HANDLE *hWVTStateData OPTIONAL
|
|
);
|
|
|
|
//
|
|
// Flags for VerifyDeviceInfFile
|
|
//
|
|
#define VERIFY_INF_USE_AUTHENTICODE_CATALOG 0x00000004 // same as for _VerifyFile
|
|
|
|
DWORD
|
|
VerifyDeviceInfFile(
|
|
IN PSETUP_LOG_CONTEXT LogContext,
|
|
IN OUT PVERIFY_CONTEXT VerifyContext, OPTIONAL
|
|
IN LPCTSTR CurrentInfName,
|
|
IN PLOADED_INF pInf,
|
|
IN PSP_ALTPLATFORM_INFO_V2 AltPlatformInfo, OPTIONAL
|
|
OUT LPTSTR CatalogFileUsed, OPTIONAL
|
|
OUT LPTSTR DigitalSigner, OPTIONAL
|
|
OUT LPTSTR SignerVersion, OPTIONAL
|
|
IN DWORD Flags,
|
|
OUT HANDLE *hWVTStateData OPTIONAL
|
|
);
|
|
|
|
BOOL
|
|
_HandleFailedVerification(
|
|
IN HWND Owner,
|
|
IN SetupapiVerifyProblem Problem,
|
|
IN LPCTSTR ProblemFile,
|
|
IN LPCTSTR DeviceDesc, OPTIONAL
|
|
IN DWORD DriverSigningPolicy,
|
|
IN BOOL NoUI,
|
|
IN DWORD Error,
|
|
IN PVOID LogContext, OPTIONAL
|
|
OUT PDWORD Flags, OPTIONAL
|
|
IN LPCTSTR TargetFile, OPTIONAL
|
|
IN HANDLE hWUTStateData OPTIONAL
|
|
);
|
|
|
|
VOID
|
|
pSetupCloseWVTStateData(
|
|
IN HANDLE hWVTStateData
|
|
);
|
|
|
|
BOOL
|
|
IsInfForDeviceInstall(
|
|
IN PSETUP_LOG_CONTEXT LogContext, OPTIONAL
|
|
IN CONST GUID *DeviceSetupClassGuid, OPTIONAL
|
|
IN PLOADED_INF LoadedInf, OPTIONAL
|
|
OUT PTSTR *DeviceDesc, OPTIONAL
|
|
OUT PSP_ALTPLATFORM_INFO_V2 *ValidationPlatform, OPTIONAL
|
|
OUT PDWORD PolicyToUse, OPTIONAL
|
|
OUT PBOOL UseOriginalInfName, OPTIONAL
|
|
IN BOOL ForceNonDrvSignPolicy
|
|
);
|
|
|
|
DWORD
|
|
GetCodeSigningPolicyForInf(
|
|
IN PSETUP_LOG_CONTEXT LogContext, OPTIONAL
|
|
IN HINF InfHandle,
|
|
OUT PSP_ALTPLATFORM_INFO_V2 *ValidationPlatform, OPTIONAL
|
|
OUT PBOOL UseOriginalInfName OPTIONAL
|
|
);
|
|
|
|
typedef struct _DRVSIGN_CLASS_LIST_NODE {
|
|
GUID DeviceSetupClassGuid; // class subject to driver signing policy
|
|
INT MajorVerLB; // -1 if no validation platform override info
|
|
INT MinorVerLB; // -1 if no validation platform override info
|
|
} DRVSIGN_CLASS_LIST_NODE, *PDRVSIGN_CLASS_LIST_NODE;
|
|
|
|
typedef struct _DRVSIGN_POLICY_LIST {
|
|
//
|
|
// Array of device setup class GUIDs for which driver signing policy is
|
|
// applicable, along with validation platform override information (if
|
|
// appropriate).
|
|
//
|
|
PDRVSIGN_CLASS_LIST_NODE Members;
|
|
|
|
//
|
|
// Number of elements in above array (initialized to -1).
|
|
//
|
|
INT NumMembers;
|
|
|
|
//
|
|
// Synchronization
|
|
//
|
|
MYLOCK Lock;
|
|
|
|
} DRVSIGN_POLICY_LIST, *PDRVSIGN_POLICY_LIST;
|
|
|
|
#define LockDrvSignPolicyList(d) BeginSynchronizedAccess(&((d)->Lock))
|
|
#define UnlockDrvSignPolicyList(d) EndSynchronizedAccess(&((d)->Lock))
|
|
|
|
//
|
|
// Global "Driver Search In-Progress" list.
|
|
//
|
|
extern DRVSIGN_POLICY_LIST GlobalDrvSignPolicyList;
|
|
|
|
BOOL
|
|
InitDrvSignPolicyList(
|
|
VOID
|
|
);
|
|
|
|
VOID
|
|
DestroyDrvSignPolicyList(
|
|
VOID
|
|
);
|
|
|
|
//
|
|
// Bit that may be OR'ed in with driver signing policy to indicate that
|
|
// Authenticode signatures may be accepted.
|
|
//
|
|
#define DRIVERSIGN_ALLOW_AUTHENTICODE 0x80000000
|
|
|
|
BOOL
|
|
IsFileProtected(
|
|
IN LPCTSTR FileFullPath,
|
|
IN PSETUP_LOG_CONTEXT LogContext, OPTIONAL
|
|
OUT PHANDLE phSfp OPTIONAL
|
|
);
|
|
|
|
#define FileExists pSetupFileExists
|
|
|
|
BOOL
|
|
GetVersionInfoFromImage(
|
|
IN PCTSTR FileName,
|
|
OUT PDWORDLONG Version,
|
|
OUT LANGID *Language
|
|
);
|
|
|
|
//
|
|
// Utils
|
|
//
|
|
|
|
PCTSTR
|
|
GetSystemSourcePath(
|
|
TRACK_ARG_DECLARE
|
|
);
|
|
|
|
PCTSTR
|
|
GetServicePackSourcePath(
|
|
TRACK_ARG_DECLARE
|
|
);
|
|
|
|
PCTSTR
|
|
GetServicePackCachePath(
|
|
TRACK_ARG_DECLARE
|
|
);
|
|
|
|
DWORD
|
|
RegistryDelnode(
|
|
IN HKEY RootKey,
|
|
IN PCTSTR SubKeyName,
|
|
IN DWORD ExtraFlags
|
|
);
|
|
|
|
DWORD
|
|
CaptureStringArg(
|
|
IN PCTSTR String,
|
|
OUT PCTSTR *CapturedString
|
|
);
|
|
|
|
DWORD
|
|
DelimStringToMultiSz(
|
|
IN PTSTR String,
|
|
IN DWORD StringLen,
|
|
IN TCHAR Delim
|
|
);
|
|
|
|
BOOL
|
|
pAToI(
|
|
IN PCTSTR Field,
|
|
OUT PINT IntegerValue
|
|
);
|
|
|
|
DWORD
|
|
pAcquireSCMLock(
|
|
IN SC_HANDLE SCMHandle,
|
|
OUT SC_LOCK *pSCMLock,
|
|
IN PSETUP_LOG_CONTEXT LogContext
|
|
);
|
|
|
|
//
|
|
// wrapper around pSetupStringTableStringFromIdEx to allocate buffer on fly
|
|
//
|
|
DWORD
|
|
QueryStringTableStringFromId(
|
|
IN PVOID StringTable,
|
|
IN LONG StringId,
|
|
IN ULONG Padding,
|
|
OUT PTSTR *pBuffer
|
|
);
|
|
|
|
VOID
|
|
pSetupExceptionHandler(
|
|
IN DWORD ExceptionCode,
|
|
IN DWORD AccessViolationError,
|
|
OUT PDWORD Win32ErrorCode OPTIONAL
|
|
);
|
|
|
|
LONG
|
|
pSetupExceptionFilter(
|
|
DWORD ExceptionCode
|
|
);
|
|
|
|
//
|
|
// Define flags for DoInstallActionWithParams
|
|
//
|
|
#define INSTALLACTION_CALL_CI 0x00000001
|
|
#define INSTALLACTION_NO_DEFAULT 0x00000002
|
|
|
|
DWORD
|
|
DoInstallActionWithParams(
|
|
IN DI_FUNCTION InstallFunction,
|
|
IN HDEVINFO DeviceInfoSet,
|
|
IN PSP_DEVINFO_DATA DeviceInfoData, OPTIONAL
|
|
IN PSP_CLASSINSTALL_HEADER ClassInstallParams, OPTIONAL
|
|
IN DWORD ClassInstallParamsSize,
|
|
IN DWORD Flags
|
|
);
|
|
|
|
BOOL
|
|
LookUpStringInTable(
|
|
IN PSTRING_TO_DATA Table,
|
|
IN PCTSTR String,
|
|
OUT PUINT_PTR Data
|
|
);
|
|
|
|
//
|
|
// Diagnostic/debug functions in debug.c
|
|
//
|
|
|
|
#define DebugPrintEx pSetupDebugPrintEx
|
|
|
|
#if DBG
|
|
|
|
#define MYTRACE(x) DebugPrintEx x /*(...)*/
|
|
|
|
#else
|
|
|
|
#define MYTRACE(x)
|
|
|
|
#endif
|
|
|
|
//
|
|
// 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
|
|
|
|
#ifdef _X86_
|
|
BOOL
|
|
IsNEC98(
|
|
VOID
|
|
);
|
|
|
|
#endif
|
|
|
|
//
|
|
// Stubs to allow ANSI build to run on Win9x
|
|
//
|
|
|
|
#ifdef DBGHEAP_CHECK
|
|
|
|
#ifdef ANSI_SETUPAPI
|
|
|
|
#define ASSERT_HEAP_IS_VALID()
|
|
|
|
#else
|
|
|
|
#define ASSERT_HEAP_IS_VALID() RtlValidateHeap(pSetupGetHeap(),0,NULL)
|
|
|
|
#endif // ANSI_SETUPAPI
|
|
|
|
#else
|
|
|
|
#define ASSERT_HEAP_IS_VALID()
|
|
|
|
#endif // DBGHEAP_CHECK
|
|
|
|
|
|
//
|
|
// TLS data/macro's
|
|
//
|
|
|
|
//
|
|
// Diamond TLS data.
|
|
//
|
|
typedef struct _DIAMOND_THREAD_DATA {
|
|
|
|
//
|
|
// Boolean value indicating whether the current thread
|
|
// is inside diamond. Diamond doesn't really providee
|
|
// a full context environment so we declare it non-reentrant.
|
|
//
|
|
BOOL InDiamond;
|
|
|
|
//
|
|
// Diamond context data
|
|
//
|
|
HFDI FdiContext;
|
|
ERF FdiError;
|
|
|
|
//
|
|
// Last encountered error
|
|
//
|
|
DWORD LastError;
|
|
|
|
//
|
|
// Name of cabinet as passed to DiamondProcessCabinet,
|
|
//
|
|
PCTSTR CabinetFile;
|
|
|
|
//
|
|
// Notification callback and context parameter
|
|
//
|
|
PVOID MsgHandler;
|
|
PVOID Context;
|
|
BOOL IsMsgHandlerNativeCharWidth;
|
|
|
|
//
|
|
// Full path of the current target file being extracted.
|
|
//
|
|
PTSTR CurrentTargetFile;
|
|
|
|
//
|
|
// Flag indicating whether diamond asked us to switch cabinets.
|
|
// If we do switch, then we stop copying when the current file
|
|
// is done. This prevents diamond from happily doing each file
|
|
// in the new cabinet, which would ruin the queue commit routine's
|
|
// ability to allow some files to exist outside the cabinet, etc.
|
|
//
|
|
BOOL SwitchedCabinets;
|
|
|
|
//
|
|
// If the source path changes as the result of a prompt for a
|
|
// new cabinet (when a file continues across multiple cabinets),
|
|
// we remember the path the user gave us here.
|
|
//
|
|
TCHAR UserPath[MAX_PATH];
|
|
|
|
} DIAMOND_THREAD_DATA, *PDIAMOND_THREAD_DATA;
|
|
|
|
typedef struct _SETUP_TLS {
|
|
struct _SETUP_TLS *Prev;
|
|
struct _SETUP_TLS *Next;
|
|
//
|
|
// all TLS data used by SetupAPI
|
|
//
|
|
DIAMOND_THREAD_DATA Diamond;
|
|
SETUP_LOG_TLS SetupLog;
|
|
DWORD PerThreadDoneComponent;
|
|
DWORD PerThreadFailedComponent;
|
|
|
|
} SETUP_TLS, *PSETUP_TLS;
|
|
|
|
PSETUP_TLS
|
|
SetupGetTlsData(
|
|
);
|
|
|
|
|
|
//
|
|
// Registration flags.
|
|
//
|
|
#define SP_GETSTATUS_FROMDLL 0x00000001 // in proc dll registration
|
|
#define SP_GETSTATUS_FROMPROCESS 0x00000002 // executable registration
|
|
#define SP_GETSTATUS_FROMSURRAGATE 0x00000004 // surragate process dll registration
|
|
|
|
|
|
#if MEM_DBG
|
|
|
|
//
|
|
// these have to be at the bottom to compile
|
|
//
|
|
|
|
#define GetSystemSourcePath() GetSystemSourcePath(TRACK_ARG_CALL)
|
|
#define GetServicePackSourcePath() GetServicePackSourcePath(TRACK_ARG_CALL)
|
|
#define GetServicePackCachePath() GetServicePackCachePath(TRACK_ARG_CALL)
|
|
#define InheritLogContext(a,b) InheritLogContext(TRACK_ARG_CALL,a,b)
|
|
|
|
#endif
|
|
|
|
BOOL
|
|
InitComponents(
|
|
DWORD Components
|
|
);
|
|
|
|
VOID
|
|
ComponentCleanup(
|
|
DWORD Components
|
|
);
|
|
|
|
//#define COMPONENT_OLE 0x00000001 // need to use OLE
|
|
//#define COMPONENT_FUSION 0x00000002 // need to use Fusion
|
|
|
|
//
|
|
// RetrieveAllDriversForDevice flags
|
|
//
|
|
#define RADFD_FLAG_FUNCTION_DRIVER 0x00000001
|
|
#define RADFD_FLAG_DEVICE_UPPER_FILTERS 0x00000002
|
|
#define RADFD_FLAG_DEVICE_LOWER_FILTERS 0x00000004
|
|
#define RADFD_FLAG_CLASS_UPPER_FILTERS 0x00000008
|
|
#define RADFD_FLAG_CLASS_LOWER_FILTERS 0x00000010
|
|
|
|
#define RADFD_FLAG_DEVICE_FILTERS RADFD_FLAG_DEVICE_UPPER_FILTERS | RADFD_FLAG_DEVICE_LOWER_FILTERS
|
|
#define RADFD_FLAG_CLASS_FILTERS RADFD_FLAG_CLASS_UPPER_FILTERS | RADFD_FLAG_CLASS_LOWER_FILTERS
|
|
#define RADFD_FLAG_ALL_FILTERS RADFD_FLAG_DEVICE_FILTERS | RADFD_FLAG_CLASS_FILTERS
|
|
|
|
BOOL
|
|
RetrieveAllDriversForDevice(
|
|
IN PDEVINFO_ELEM DevInfoElem,
|
|
OUT PTSTR *FilterDrivers,
|
|
IN DWORD Flags,
|
|
IN HMACHINE hMachine
|
|
);
|
|
|
|
VOID
|
|
pGetVersionText(
|
|
OUT PTSTR VersionText,
|
|
IN DWORDLONG Version
|
|
);
|
|
|