Source code of Windows XP (NT5)
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.
 
 
 
 
 
 

592 lines
20 KiB

//+---------------------------------------------------------------------------
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation, 1997.
//
// File: N C S E T U P . H
//
// Contents: HRESULT wrappers for the Setup Api.
//
// Notes:
//
// Author: shaunco 16 Apr 1997
//
//----------------------------------------------------------------------------
#pragma once
#ifndef _NCSETUP_H_
#define _NCSETUP_H_
#include <setupapi.h>
#include "ncstring.h"
enum SD_DEID_FLAG_TYPE
{
SDDFT_FLAGS,
SDDFT_FLAGSEX,
};
enum SD_FLAGS_BINARY_OP
{
SDFBO_AND,
SDFBO_OR,
SDFBO_XOR,
};
//+---------------------------------------------------------------------------
// Lower level wrappers
//
HRESULT
HrSetupCommitFileQueue (HWND hwndOwner, HSPFILEQ hfq,
PSP_FILE_CALLBACK pfc, PVOID pvCtx);
HRESULT
HrSetupInitDefaultQueueCallbackEx (HWND hwndOwner,
HWND hwndAlternate,
UINT uMsg,
DWORD dwReserved1,
PVOID dwReserved2,
PVOID* ppvCtx);
HRESULT
HrSetupOpenFileQueue (HSPFILEQ* phfq);
HRESULT
HrSetupOpenInfFile (PCWSTR pszFileName,
PCWSTR pszInfClass,
DWORD dwInfStyle,
UINT* punErrorLine,
HINF* phinf);
HRESULT
HrSetupFindFirstLine (HINF hinf,
PCWSTR pszSection,
PCWSTR pszKey,
INFCONTEXT* pctx);
HRESULT
HrSetupFindNextLine (const INFCONTEXT& ctxIn,
INFCONTEXT* pctxOut);
HRESULT
HrSetupFindNextMatchLine (const INFCONTEXT& ctxIn,
PCWSTR pszKey,
INFCONTEXT* pctxOut);
HRESULT
HrSetupGetLineByIndex (HINF hinf,
PCWSTR pszSection,
DWORD dwIndex,
INFCONTEXT* pctx);
HRESULT
HrSetupGetLineCount (HINF hinf,
PCWSTR pszSection,
ULONG* pulCount);
HRESULT
HrSetupGetBinaryField (const INFCONTEXT& ctx,
DWORD dwFieldIndex,
BYTE* pbBuf, DWORD cbBuf,
DWORD* pbRequired);
HRESULT
HrSetupGetIntField (const INFCONTEXT& ctx,
DWORD dwFieldIndex,
INT* pnValue);
HRESULT
HrSetupGetMultiSzField (const INFCONTEXT& ctx,
DWORD dwFieldIndex,
PWSTR pszBuf, DWORD cchBuf,
DWORD* pcchRequired);
HRESULT
HrSetupGetMultiSzFieldWithAlloc (const INFCONTEXT& ctx,
DWORD dwFieldIndex,
PWSTR* ppszBuf);
HRESULT
HrSetupGetStringField (const INFCONTEXT& ctx,
DWORD dwFieldIndex,
tstring* pstr);
HRESULT
HrSetupGetStringField (const INFCONTEXT& ctx,
DWORD dwFieldIndex,
PWSTR pszBuf, DWORD cchBuf,
DWORD* pcchRequired);
HRESULT
HrSetupScanFileQueueWithNoCallback (HSPFILEQ hfq, DWORD dwFlags,
HWND hwnd, PDWORD pdwResult);
VOID
SetupCloseInfFileSafe(HINF hinf);
//+---------------------------------------------------------------------------
// Intermediate functionality
//
HRESULT
HrSetupGetMultiSzFieldMapToDword (const INFCONTEXT& ctx,
DWORD dwFieldIndex,
const MAP_SZ_DWORD* aMapSzDword,
UINT cMapSzDword,
DWORD* pdwValue);
HRESULT
HrSetupGetStringFieldMapToDword (const INFCONTEXT& ctx,
DWORD dwFieldIndex,
const MAP_SZ_DWORD* aMapSzDword,
UINT cMapSzDword,
DWORD* pdwValue);
HRESULT
HrSetupGetStringFieldAsBool (const INFCONTEXT& ctx,
DWORD dwFieldIndex,
BOOL* pfValue);
//+---------------------------------------------------------------------------
// Find first and get
//
HRESULT
HrSetupGetFirstDword (HINF hinf,
PCWSTR pszSection,
PCWSTR pszKey,
DWORD* pdwValue);
HRESULT
HrSetupGetFirstString (HINF hinf,
PCWSTR pszSection,
PCWSTR pszKey,
tstring* pstr);
HRESULT
HrSetupGetFirstMultiSzFieldWithAlloc (HINF hinf, PCWSTR szSection,
PCWSTR szKey, PWSTR *pszOut);
HRESULT
HrSetupGetFirstMultiSzMapToDword (HINF hinf,
PCWSTR pszSection,
PCWSTR pszKey,
const MAP_SZ_DWORD* aMapSzDword,
UINT cMapSzDword,
DWORD* pdwValue);
HRESULT
HrSetupGetFirstStringMapToDword (HINF hinf,
PCWSTR pszSection,
PCWSTR pszKey,
const MAP_SZ_DWORD* aMapSzDword,
UINT cMapSzDword,
DWORD* pdwValue);
HRESULT
HrSetupGetFirstStringAsBool (HINF hinf,
PCWSTR pszSection,
PCWSTR pszKey,
BOOL* pfValue);
HRESULT
HrSetupGetInfInformation (LPCVOID pvInfSpec,
DWORD dwSearchControl,
PSP_INF_INFORMATION* ppinfInfo);
HRESULT
HrSetupIsValidNt5Inf (HINF hinf);
HRESULT
HrSetupQueryInfVersionInformation (PSP_INF_INFORMATION pinfInfo,
UINT uiIndex, PCWSTR szKey,
PWSTR* ppszInfo);
//+--------------------------------------------------------------------------
// SetupDi* wrappers and helpers
//
HRESULT
HrSetupCopyOemInf(IN const tstring& strSourceName,
IN const tstring& strSourceMediaLocation, OPTIONAL
IN DWORD dwSourceMediaType, IN DWORD dwCopyStyle,
OUT tstring* pstrDestFilename, OPTIONAL
OUT tstring* pstrDestFilenameComponent OPTIONAL);
HRESULT
HrSetupCopyOemInfBuffer(
IN PCWSTR pszSourceName,
IN PCWSTR pszSourceMediaLocation, OPTIONAL
IN DWORD SourceMediaType,
IN DWORD CopyStyle,
OUT PWSTR pszDestFilename,
IN DWORD cchDestFilename,
OUT PWSTR* ppszDestFilenameComponent OPTIONAL);
HRESULT
HrSetupDiBuildDriverInfoList(IN HDEVINFO hdi, IN OUT PSP_DEVINFO_DATA pdeid,
IN DWORD dwDriverType);
HRESULT
HrSetupDiCallClassInstaller(DI_FUNCTION dif, HDEVINFO hdi,
PSP_DEVINFO_DATA pdeid);
HRESULT
HrSetupDiCreateDeviceInfo(IN HDEVINFO hdi, IN PCWSTR szDeviceName,
IN const GUID& guidClass, PCWSTR szDesc,
IN HWND hwndParent, IN DWORD dwFlags,
OUT PSP_DEVINFO_DATA pdeid);
HRESULT
HrSetupDiEnumDeviceInfo(IN HDEVINFO hdi, IN DWORD dwIndex,
PSP_DEVINFO_DATA pdeid);
HRESULT
HrSetupDiEnumDriverInfo(IN HDEVINFO hdi, PSP_DEVINFO_DATA pdeid,
IN DWORD dwDriverType, IN DWORD dwIndex,
OUT PSP_DRVINFO_DATA pdrid);
HRESULT
HrSetupDiSelectBestCompatDrv(IN HDEVINFO hdi,
IN OUT PSP_DEVINFO_DATA pdeid);
HRESULT
HrSetupDiGetClassDevs (
IN const GUID* pguidClass, OPTIONAL
IN PCWSTR pszEnumerator, OPTIONAL
IN HWND hwndParent, OPTIONAL
IN DWORD dwFlags,
OUT HDEVINFO* phdi);
HRESULT
HrSetupDiGetDeviceInfoListClass(IN HDEVINFO hdi, OUT GUID* pGuid);
HRESULT
HrSetupDiGetDeviceInstanceId(IN HDEVINFO hdi,
IN PSP_DEVINFO_DATA pdeid,
OUT PWSTR pszId,
IN DWORD cchId,
OUT DWORD* cchRequired);
HRESULT
HrSetupDiInstallDevice(IN HDEVINFO hdi, IN OUT PSP_DEVINFO_DATA pdeid);
HRESULT
HrSetupDiOpenDevRegKey(IN HDEVINFO hdi,
IN PSP_DEVINFO_DATA pdeid, IN DWORD dwScope,
IN DWORD dwHwProfile, IN DWORD dwKeyType,
IN REGSAM samDesired, OUT HKEY* phkey);
HRESULT
HrSetupDiSetClassInstallParams(IN HDEVINFO hdi, IN PSP_DEVINFO_DATA pdeid,
IN PSP_CLASSINSTALL_HEADER pcih,
IN DWORD cbSize);
HRESULT
HrSetupDiGetFixedSizeClassInstallParams(HDEVINFO hdi, PSP_DEVINFO_DATA pdeid,
PSP_CLASSINSTALL_HEADER pcih,
int cbSize);
HRESULT
HrSetupDiGetSelectedDriver(IN HDEVINFO hdi, IN PSP_DEVINFO_DATA pdeid,
OUT PSP_DRVINFO_DATA pdrid);
HRESULT
HrSetupDiGetDriverInfoDetail(IN HDEVINFO hdi, IN PSP_DEVINFO_DATA pdeid,
IN PSP_DRVINFO_DATA pdrid,
OUT PSP_DRVINFO_DETAIL_DATA* ppdridd);
HRESULT
HrSetupDiSetSelectedDriver(IN HDEVINFO hdi, IN PSP_DEVINFO_DATA pdeid,
IN OUT PSP_DRVINFO_DATA pdrid);
HRESULT
HrSetupDiCreateDevRegKey(IN HDEVINFO hdi,
IN PSP_DEVINFO_DATA pdeid, IN DWORD dwScope,
IN DWORD dwHwProfile, IN DWORD dwKeyType,
IN HINF hinf,
PCWSTR szInfSectionName,
OUT HKEY* phkey);
HRESULT
HrSetupDiGetActualSectionToInstall(IN HINF hinf,
IN PCWSTR szSectionName,
OUT tstring* pstrActualSectionName,
OUT tstring* pstrExtension OPTIONAL);
HRESULT
HrSetupDiGetActualSectionToInstallWithAlloc(IN HINF hinf,
IN PWSTR pszSection,
OUT PWSTR* ppszActualSection,
OUT PWSTR* ppszExtension OPTIONAL);
HRESULT
HrSetupDiGetActualSectionToInstallWithBuffer(
IN HINF hinf,
IN PCWSTR pszSection,
OUT PWSTR pszActualSection,
IN DWORD cchActualSection,
OUT DWORD* pcchRequired,
OUT PWSTR* ppszExtension OPTIONAL);
HRESULT
HrSetupDiGetDeviceInstallParams(IN const HDEVINFO hdi,
IN const PSP_DEVINFO_DATA pdeid, OPTIONAL
OUT PSP_DEVINSTALL_PARAMS pdeip);
HRESULT
HrSetupDiGetDriverInstallParams(IN const HDEVINFO hdi,
IN const PSP_DEVINFO_DATA pdeid, OPTIONAL
IN const PSP_DRVINFO_DATA pdrid,
OUT PSP_DRVINSTALL_PARAMS pdrip);
void
SetupDiSetConfigFlags(HDEVINFO hdi, PSP_DEVINFO_DATA pdeid, DWORD dwFlags,
SD_FLAGS_BINARY_OP eOp);
HRESULT
HrSetupDiSetDeviceInstallParams(IN const HDEVINFO hdi,
IN const PSP_DEVINFO_DATA pdeid, OPTIONAL
IN const PSP_DEVINSTALL_PARAMS pdeip);
HRESULT
HrSetupDiSetDriverInstallParams(IN const HDEVINFO hdi,
IN const PSP_DEVINFO_DATA pdeid, OPTIONAL
IN const PSP_DRVINFO_DATA pdrid,
IN const PSP_DRVINSTALL_PARAMS pdrip);
HRESULT
HrSetupDiSetDeipFlags(HDEVINFO hdi, PSP_DEVINFO_DATA pdeid,
DWORD dwFlags, SD_DEID_FLAG_TYPE eFlagType,
SD_FLAGS_BINARY_OP eOp);
HRESULT
HrSetupDiRemoveDevice(IN HDEVINFO hdi,
IN PSP_DEVINFO_DATA pdeid);
HRESULT
HrSetupDiOpenDeviceInfo(IN const HDEVINFO hdi,
IN PCWSTR szPnpInstanceId,
IN HWND hwndParent, IN DWORD dwOpenFlags,
OUT PSP_DEVINFO_DATA pdeid OPTIONAL);
HRESULT
HrSetupDiCreateDeviceInfoList(const GUID* pguidClass, HWND hwndParent,
HDEVINFO* phdi);
HRESULT
HrSetupDiGetDeviceName(IN HDEVINFO hdi, PSP_DEVINFO_DATA pdeid,
OUT PWSTR* ppszName);
HRESULT
HrSetupDiSetDeviceName (
IN HDEVINFO hdi,
IN PSP_DEVINFO_DATA pdeid,
IN PCWSTR szDeviceName);
HRESULT
HrSetupDiGetDeviceRegistryPropertyWithAlloc(
IN HDEVINFO hdi,
IN PSP_DEVINFO_DATA pdeid,
IN DWORD dwProperty,
OUT DWORD* pdwRegType, OPTIONAL
OUT BYTE** ppbBuffer);
HRESULT
HrSetupDiGetDeviceRegistryProperty(
IN HDEVINFO hdi,
IN PSP_DEVINFO_DATA pdeid,
IN DWORD dwProperty,
OUT DWORD* pdwRegType, OPTIONAL
OUT BYTE* pbBuffer,
IN DWORD cbBufferSize,
OUT DWORD* pcbRequiredSize OPTIONAL
);
HRESULT
HrSetupDiSetDeviceRegistryProperty(IN HDEVINFO hdi,
IN OUT PSP_DEVINFO_DATA pdeid,
IN DWORD dwProperty,
IN const BYTE* pbBuffer,
IN DWORD cbSize);
HRESULT
HrSetupDiSendPropertyChangeNotification(HDEVINFO hdi, PSP_DEVINFO_DATA pdeid,
DWORD dwStateChange, DWORD dwScope,
DWORD dwProfileId);
BOOL
FSetupDiCheckIfRestartNeeded(HDEVINFO hdi, PSP_DEVINFO_DATA pdeid);
HRESULT
HrSetupDiGetClassImageList(PSP_CLASSIMAGELIST_DATA pcild);
HRESULT
HrSetupDiDestroyClassImageList(PSP_CLASSIMAGELIST_DATA pcild);
VOID
SetupDiDestroyDeviceInfoListSafe(HDEVINFO hdi);
HRESULT
HrSetupDiGetClassImageIndex(PSP_CLASSIMAGELIST_DATA pcild,
const GUID* pguidClass, INT* pnIndex);
HRESULT
HrSetupDiGetParentWindow(IN const HDEVINFO hdi,
IN const PSP_DEVINFO_DATA pdeid,
OUT HWND* phwndParent);
HRESULT
HrSetupInstallFilesFromInfSection(HINF hinf, HINF hinfLayout, HSPFILEQ hfq,
PCWSTR szSection, PCWSTR szSourcePath,
UINT ulFlags);
HRESULT
HrSetupInstallFromInfSection(HWND hwnd, HINF hinf, PCWSTR szSection,
UINT ulFlags, HKEY hkey, PCWSTR szSource,
UINT ulCopyFlags, PSP_FILE_CALLBACK pfc,
PVOID pvCtx, HDEVINFO hdi,
PSP_DEVINFO_DATA pdeid);
HRESULT
HrSetupInstallServicesFromInfSection(HINF hinf, PCWSTR szSection,
DWORD dwFlags);
HRESULT
HrFindDeviceOnInterface (
const GUID* pguidDeviceId,
const GUID* pguidInterfaceId,
PCWSTR pszwReferenceString,
DWORD dwFlagsAndAttributes,
HANDLE* phFile);
HRESULT
HrInstallSoftwareDeviceOnInterface (
const GUID* pguidDeviceId,
const GUID* pguidInterfaceId,
PCWSTR pszwReferenceString,
BOOL fForceInstall,
PCWSTR pszwInfFilename,
HWND hwndParent);
#if defined(REMOTE_BOOT)
HRESULT
HrIsRemoteBootAdapter(HDEVINFO hdi, PSP_DEVINFO_DATA pdeid);
#endif
//+---------------------------------------------------------------------------
//
// Class: CSetupInfFile
//
// Purpose: Handles operations on an INF file.
//
// Justification:
// This is a class instead of seperate functions to allow us to move
// towards the error handling model associated with throwing exceptions.
// That is, when one of these objects is declared on the stack, and
// an exception is thrown, it will clean itself up. (This object
// does NOT explicitly throw any exceptions.)
//
class CSetupInfFile
{
public:
CSetupInfFile ();
~CSetupInfFile () { EnsureClosed(); }
void Close ();
HRESULT HrOpen (PCWSTR pszFileName, PCWSTR pszInfClass,
DWORD dwInfStyle, UINT* punErrorLine);
HINF Hinf ();
HRESULT HrGetDword (PCWSTR pszSection, PCWSTR pszKey,
DWORD* pdwValue);
HRESULT HrGetString (PCWSTR pszSection, PCWSTR pszKey,
tstring* pstr);
HRESULT HrGetStringAsBool (PCWSTR pszSection, PCWSTR pszKey,
BOOL* pfValue);
HRESULT HrGetStringMapToDword (PCWSTR pszSection, PCWSTR pszKey,
const MAP_SZ_DWORD* aMapSzDword,
UINT cMapSzDword,
DWORD* pdwValue);
HRESULT HrGetMultiSzMapToDword (PCWSTR pszSection, PCWSTR pszKey,
const MAP_SZ_DWORD* aMapSzDword,
UINT cMapSzDword,
DWORD* pdwValue);
protected:
void EnsureClosed ();
HINF m_hinf;
};
inline CSetupInfFile::CSetupInfFile ()
{
m_hinf = NULL;
}
inline
HRESULT CSetupInfFile::HrOpen (PCWSTR pszFileName, PCWSTR pszInfClass,
DWORD dwInfStyle, UINT* punErrorLine)
{
AssertSzH (!m_hinf, "You must first close the previous one you opened.");
return HrSetupOpenInfFile (pszFileName, pszInfClass, dwInfStyle,
punErrorLine, &m_hinf);
}
inline HINF CSetupInfFile::Hinf ()
{
AssertSzH (m_hinf, "You must call HrOpen first.");
return m_hinf;
}
inline
HRESULT CSetupInfFile::HrGetDword (PCWSTR pszSection, PCWSTR pszKey,
DWORD* pdwValue)
{
return HrSetupGetFirstDword (Hinf(), pszSection, pszKey, pdwValue);
}
inline
HRESULT CSetupInfFile::HrGetString (PCWSTR pszSection, PCWSTR pszKey,
tstring* pstr)
{
return HrSetupGetFirstString (Hinf(), pszSection, pszKey, pstr);
}
inline
HRESULT CSetupInfFile::HrGetStringAsBool (PCWSTR pszSection, PCWSTR pszKey,
BOOL* pfValue)
{
return HrSetupGetFirstStringAsBool (Hinf(), pszSection, pszKey, pfValue);
}
inline
HRESULT CSetupInfFile::HrGetStringMapToDword (PCWSTR pszSection, PCWSTR pszKey,
const MAP_SZ_DWORD* aMapSzDword,
UINT cMapSzDword,
DWORD* pdwValue)
{
return HrSetupGetFirstStringMapToDword (Hinf(), pszSection, pszKey,
aMapSzDword, cMapSzDword, pdwValue);
}
inline
HRESULT CSetupInfFile::HrGetMultiSzMapToDword (PCWSTR pszSection, PCWSTR pszKey,
const MAP_SZ_DWORD* aMapSzDword,
UINT cMapSzDword,
DWORD* pdwValue)
{
return HrSetupGetFirstMultiSzMapToDword (Hinf(), pszSection, pszKey,
aMapSzDword, cMapSzDword, pdwValue);
}
inline BOOL
IsValidHandle(HANDLE h)
{
return (h && INVALID_HANDLE_VALUE != h);
}
// Moved from oemupgrd.h
//
HRESULT HrInstallFromInfSectionInFile(IN HWND hwndParent,
IN PCWSTR szInfName,
IN PCWSTR szSection,
IN HKEY hkeyRelative,
IN BOOL fQuietInstall);
#endif // _NCSETUP_H_