/*++ Copyright (c) 1995 Microsoft Corporation Module Name: spapip.h Abstract: Header file for routines exported from setupapi.dll that are NOT part of the setup API, and are thus intended for private/internal use. Author: Ted Miller (tedm) 31-Mar-1995 Revision History: --*/ #ifdef UNICODE typedef LPCWSTR PCTSTR; #else typedef LPCSTR PCTSTR; #endif // // Work around weirdness with Win32 typedef... // #ifdef NT_INCLUDED // // __int64 is only supported by 2.0 and later midl. // __midl is set by the 2.0 midl and not by 1.0 midl. // #if (!defined(MIDL_PASS) || defined(__midl)) && (!defined(_M_IX86) || (defined(_INTEGRAL_MAX_BITS) && _INTEGRAL_MAX_BITS >= 64)) typedef unsigned __int64 DWORDLONG; #else typedef double DWORDLONG; #endif typedef DWORDLONG *PDWORDLONG; #endif /* NT_INCLUDED */ // // Memory allocation functions // BOOL MemoryInitialize( IN BOOL Attach ); PVOID MyMalloc( IN DWORD Size ); PVOID MyRealloc( IN PVOID Block, IN DWORD NewSize ); VOID MyFree( IN CONST VOID *Block ); VOID OutOfMemory( IN HWND Owner OPTIONAL ); // // String table functions // PVOID StringTableInitialize( VOID ); PVOID StringTableInitializeEx( IN UINT ExtraDataSize, OPTIONAL IN UINT Reserved ); VOID StringTableDestroy( IN PVOID StringTable ); // // Flags to be used by StringTableAddString and StringTableLookUpString // #define STRTAB_CASE_INSENSITIVE 0x00000000 #define STRTAB_CASE_SENSITIVE 0x00000001 #define STRTAB_BUFFER_WRITEABLE 0x00000002 #define STRTAB_NEW_EXTRADATA 0x00000004 LONG StringTableAddString( IN PVOID StringTable, IN OUT PTSTR String, IN DWORD Flags ); LONG StringTableAddStringEx( IN PVOID StringTable, IN PTSTR String, IN DWORD Flags, IN PVOID ExtraData, OPTIONAL IN UINT ExtraDataSize OPTIONAL ); LONG StringTableLookUpString( IN PVOID StringTable, IN OUT PTSTR String, IN DWORD Flags ); LONG StringTableLookUpStringEx( IN PVOID StringTable, IN OUT PTSTR String, IN DWORD Flags, OUT PVOID ExtraData, OPTIONAL IN UINT ExtraDataBufferSize OPTIONAL ); BOOL StringTableGetExtraData( IN PVOID StringTable, IN LONG StringId, OUT PVOID ExtraData, IN UINT ExtraDataBufferSize ); BOOL StringTableSetExtraData( IN PVOID StringTable, IN LONG StringId, IN PVOID ExtraData, IN UINT ExtraDataSize ); // // Type for StringTableEnum // typedef BOOL (*PSTRTAB_ENUM_ROUTINE)( IN PVOID StringTable, IN LONG StringId, IN PCTSTR String, IN PVOID ExtraData, IN UINT ExtraDataSize, IN LPARAM lParam ); BOOL StringTableEnum( IN PVOID StringTable, OUT PVOID ExtraDataBuffer, OPTIONAL IN UINT ExtraDataBufferSize, OPTIONAL IN PSTRTAB_ENUM_ROUTINE Callback, IN LPARAM lParam OPTIONAL ); PTSTR StringTableStringFromId( IN PVOID StringTable, IN LONG StringId ); BOOL StringTableStringFromIdEx( IN PVOID StringTable, IN LONG StringId, IN OUT PTSTR pBuffer, IN OUT PULONG pBufSize ); VOID StringTableTrim( IN PVOID StringTable ); PVOID StringTableDuplicate( IN PVOID StringTable ); // // Global flags / overrides // VOID pSetupSetGlobalFlags( IN DWORD flags ); DWORD pSetupGetGlobalFlags( VOID ); #define PSPGF_NO_RUNONCE 0x00000001 // set to inhibit runonce calls #define PSPGF_NO_BACKUP 0x00000002 // set to inhibit automatic backup #define PSPGF_NONINTERACTIVE 0x00000004 // set to inhibit all UI #define PSPGF_SERVER_SIDE_RUNONCE 0x00000008 // batch RunOnce entries for server-side processing #define PSPGF_NO_VERIFY_INF 0x00000010 // set to inhibit verification (digital signature) of INFs // // Server-side (non-interactive mode) RunOnce processing support // typedef struct _RUNONCE_NODE { struct _RUNONCE_NODE *Next; PCWSTR DllFullPath; PCSTR DllEntryPointName; PCWSTR DllParams; } RUNONCE_NODE, *PRUNONCE_NODE; PRUNONCE_NODE pSetupAccessRunOnceNodeList( VOID ); VOID pSetupDestroyRunOnceNodeList( VOID ); // // per queue overrides // BOOL pSetupSetQueueFlags( IN HSPFILEQ QueueHandle, IN DWORD flags ); DWORD pSetupGetQueueFlags( IN HSPFILEQ QueueHandle ); // // Queue flags. // #define FQF_TRY_SIS_COPY 0x00000001 // try SIS copy first #define FQF_BACKUP_AWARE 0x00010000 // allow callbacks #define FQF_DID_CATALOGS_OK 0x00020000 // catalog/inf verification has run #define FQF_DID_CATALOGS_FAILED 0x00040000 // catalog/inf verification has run #define FQF_DIGSIG_ERRORS_NOUI 0x00080000 // prompt user on failed signature // verification #define FQF_DEVICE_INSTALL 0x00100000 // file queue is for device install #define FQF_USE_ALT_PLATFORM 0x00200000 // use AltPlatformInfo for digital // signature verification #define FQF_QUEUE_ALREADY_COMMITTED 0x00400000 // file queue has already been committed #define FQF_QUEUE_FORCE_BLOCK_POLICY 0x01000000 // force policy to block so we never // install unsigned files #define FQF_KEEP_INF_AND_CAT_ORIGINAL_NAMES 0x02000000 // install INF/CAT from 3rd-party location // using original names (for exception INFs) // // File functions in fileutil.c // DWORD OpenAndMapFileForRead( IN PCTSTR FileName, OUT PDWORD FileSize, OUT PHANDLE FileHandle, OUT PHANDLE MappingHandle, OUT PVOID *BaseAddress ); BOOL UnmapAndCloseFile( IN HANDLE FileHandle, IN HANDLE MappingHandle, IN PVOID BaseAddress ); 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 ); BOOL DestroyTextFileReadBuffer( IN PTEXTFILE_READ_BUFFER ReadBuffer ); BOOL GetVersionInfoFromImage( IN PCTSTR FileName, OUT PDWORDLONG Version, OUT LANGID *Language ); BOOL FileExists( IN PCTSTR FileName, OUT PWIN32_FIND_DATA FindData OPTIONAL ); 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 ); // // Non-file-related security routines in security.c. // BOOL IsUserAdmin( VOID ); BOOL DoesUserHavePrivilege( PCTSTR PrivilegeName ); BOOL EnablePrivilege( IN PCTSTR PrivilegeName, IN BOOL Enable ); // // Private INF routines // PCTSTR pSetupGetField( IN PINFCONTEXT Context, IN DWORD FieldIndex ); // // Registry interface routines // DWORD QueryRegistryValue( IN HKEY KeyHandle, IN PCTSTR ValueName, OUT PTSTR *Value, OUT PDWORD DataType, OUT PDWORD DataSizeBytes ); DWORD QueryMultiSzValueToArray( IN HKEY Root, IN PCTSTR Subkey, IN PCTSTR ValueName, OUT PTSTR **Array, OUT PUINT StringCount, IN BOOL FailIfDoesntExist ); DWORD SetArrayToMultiSzValue( IN HKEY Root, IN PCTSTR Subkey, IN PCTSTR ValueName, IN PTSTR *Array, IN UINT StringCount ); VOID FreeStringArray( IN PTSTR *Array, IN UINT StringCount ); DWORD AppendStringToMultiSz( IN HKEY Key, IN PCTSTR SubKeyName, OPTIONAL IN DWORD DevInst, OPTIONAL IN PCTSTR ValueName, OPTIONAL IN PCTSTR String, IN BOOL AllowDuplicates ); DWORD RegistryDelnode( IN HKEY RootKey, IN PCTSTR SubKeyName ); // // Service controller helper functions // DWORD RetrieveServiceConfig( IN SC_HANDLE ServiceHandle, OUT LPQUERY_SERVICE_CONFIG *ServiceConfig ); DWORD AddTagToGroupOrderListEntry( IN PCTSTR LoadOrderGroup, IN DWORD TagId, IN BOOL MoveToFront ); DWORD AcquireSCMLock( IN SC_HANDLE SCMHandle, OUT SC_LOCK *pSCMLock ); // // Miscellaneous utility functions // PTSTR DuplicateString( IN PCTSTR String ); PSTR UnicodeToMultiByte( IN PCWSTR UnicodeString, IN UINT Codepage ); PWSTR MultiByteToUnicode( IN PCSTR String, IN UINT Codepage ); DWORD CaptureStringArg( IN PCTSTR String, OUT PCTSTR *CapturedString ); DWORD CaptureAndConvertAnsiArg( IN PCSTR AnsiString, OUT PCWSTR *UnicodeString ); DWORD DelimStringToMultiSz( IN PTSTR String, IN DWORD StringLen, IN TCHAR Delim ); VOID CenterWindowRelativeToParent( HWND hwnd ); BOOL pAToI( IN PCTSTR Field, OUT PINT IntegerValue ); #define UnicodeToAnsi(UnicodeString) UnicodeToMultiByte((UnicodeString),CP_ACP) #define UnicodeToOem(UnicodeString) UnicodeToMultiByte((UnicodeString),CP_OEMCP) #define AnsiToUnicode(AnsiString) MultiByteToUnicode((AnsiString),CP_ACP) #define OemToUnicode(OemString) MultiByteToUnicode((OemString),CP_OEMCP) BOOL ConcatenatePaths( IN OUT PTSTR Target, IN PCTSTR Path, IN UINT TargetBufferSize, OUT PUINT RequiredSize ); DWORD pSetupMakeSurePathExists( IN PCTSTR FullFilespec ); PCTSTR MyGetFileTitle( IN PCTSTR FilePath ); BOOL InfIsFromOemLocation( IN PCTSTR InfFileName, IN BOOL InfDirectoryOnly ); DWORD pSetupGetOsLoaderDriveAndPath( IN BOOL RootOnly, OUT PTSTR CallerBuffer, IN DWORD CallerBufferSize, OUT PDWORD RequiredSize OPTIONAL ); BOOL pSetupSetSystemSourcePath( IN PCTSTR NewSourcePath, IN PCTSTR NewSvcPackSourcePath ); BOOL ShouldDeviceBeExcluded( IN PCTSTR DeviceId, IN HINF hInf, OUT PBOOL ArchitectureSpecificExclude OPTIONAL ); BOOL pSetupDiSetDeviceInfoContext( IN HDEVINFO DeviceInfoSet, IN PSP_DEVINFO_DATA DeviceInfoData, IN DWORD Context ); BOOL pSetupDiGetDeviceInfoContext( IN HDEVINFO DeviceInfoSet, IN PSP_DEVINFO_DATA DeviceInfoData, OUT PDWORD Context ); #define SETUP_HAS_OPEN_DIALOG_EVENT TEXT("MS_SETUPAPI_DIALOG") // // 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 ); INT AddMiniIconToList( IN HBITMAP hbmImage, IN HBITMAP hbmMask ); PCTSTR pSetupDirectoryIdToPath( IN PCTSTR DirectoryId, OPTIONAL IN OUT PUINT DirectoryIdInt, OPTIONAL IN PCTSTR SubDirectory, OPTIONAL IN PCTSTR InfSourcePath, OPTIONAL IN OUT PCTSTR *OsLoaderPath OPTIONAL ); typedef struct _STRING_TO_DATA { PCTSTR String; UINT Data; } STRING_TO_DATA, *PSTRING_TO_DATA; BOOL LookUpStringInTable( IN PSTRING_TO_DATA Table, IN PCTSTR String, OUT PUINT Data ); #define SIZECHARS(x) (sizeof((x))/sizeof(TCHAR)) #define CSTRLEN(x) ((sizeof((x))/sizeof(TCHAR)) - 1) #define ARRAYSIZE(x) (sizeof((x))/sizeof((x)[0])) // // Routine to perform right-click install action on INFs (previously // implemented in syssetup.dll--moved to setupapi.dll because it's // needed on both NT and Win95). SysSetup.DLL still provides this // entry point for backward compatibility, but calls into setupapi // to do the work. // VOID WINAPI InstallHinfSectionA( IN HWND Window, IN HINSTANCE ModuleHandle, IN PCSTR CommandLine, IN INT ShowCommand ); VOID WINAPI InstallHinfSectionW( IN HWND Window, IN HINSTANCE ModuleHandle, IN PCWSTR CommandLine, IN INT ShowCommand ); #ifdef UNICODE #define InstallHinfSection InstallHinfSectionW #else #define InstallHinfSection InstallHinfSectionA #endif // // Routine used by optional components code in syssetup to setup runonce/grpconv. // DWORD InstallStop( IN BOOL DoRunOnce ); DWORD InstallStopEx( IN BOOL DoRunOnce, IN DWORD Flags, IN PVOID Reserved ); #define INSTALLSTOP_NO_UI 0x00000001 // InstallStop should do no UI #define INSTALLSTOP_NO_GRPCONV 0x00000002 // Don't do GrpConv // // Section access for INF file // BOOL SetupGetInfSections ( IN HINF InfHandle, OUT PTSTR Buffer, OPTIONAL IN UINT Size, OPTIONAL OUT UINT *SizeNeeded OPTIONAL ); // // GUID handling routines (avoid linking to ole32.dll!) // DWORD pSetupGuidFromString( IN PCTSTR GuidString, OUT LPGUID Guid ); DWORD pSetupStringFromGuid( IN CONST GUID *Guid, OUT PTSTR GuidString, IN DWORD GuidStringSize ); BOOL pSetupIsGuidNull( IN CONST GUID *Guid ); // // Digital signature verification routines // typedef enum { SetupapiVerifyNoProblem, SetupapiVerifyCatalogProblem, // catalog file couldn't be verified SetupapiVerifyInfProblem, // inf file couldn't be installed/verified SetupapiVerifyFileNotSigned, // file is not signed, no verification attempted SetupapiVerifyFileProblem, // file may be signed, but couldn't be verified SetupapiVerifyClassInstProblem, // class installer is unsigned SetupapiVerifyCoInstProblem // co-installer is unsigned } SetupapiVerifyProblem; DWORD pSetupVerifyQueuedCatalogs( IN HSPFILEQ FileQueue ); DWORD VerifyCatalogFile( IN LPCTSTR CatalogFullPath ); DWORD VerifyFile( IN LPVOID LogContext, 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 AltPlatformInfo, OPTIONAL OUT LPTSTR CatalogFileUsed, OPTIONAL OUT PDWORD NumCatalogsConsidered OPTIONAL ); DWORD InstallCatalog( IN LPCTSTR CatalogFullPath, IN LPCTSTR NewBaseName, OPTIONAL OUT LPTSTR NewCatalogFullPath ); 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 TargetName OPTIONAL ); DWORD GetCurrentDriverSigningPolicy( IN BOOL IsDeviceInstallation ); // // 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 #define MYASSERT(x) if(!(x)) { AssertFail(__FILE__,__LINE__,#x); } VOID AssertFail( IN PSTR FileName, IN UINT LineNumber, IN PSTR Condition ); #else #define MYASSERT(x) #endif