Reactos
at master 386 lines 12 kB view raw
1/* 2 * Copyright 2001 Andreas Mohr 3 * Copyright 2005-2006 Herv� Poussineau 4 * 5 * This library is free software; you can redistribute it and/or 6 * modify it under the terms of the GNU Lesser General Public 7 * License as published by the Free Software Foundation; either 8 * version 2.1 of the License, or (at your option) any later version. 9 * 10 * This library is distributed in the hope that it will be useful, 11 * but WITHOUT ANY WARRANTY; without even the implied warranty of 12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 13 * Lesser General Public License for more details. 14 * 15 * You should have received a copy of the GNU Lesser General Public 16 * License along with this library; if not, write to the Free Software 17 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA 18 */ 19 20#ifndef __SETUPAPI_PRIVATE_H 21#define __SETUPAPI_PRIVATE_H 22 23#include <wchar.h> 24 25#define WIN32_NO_STATUS 26#define _INC_WINDOWS 27#define COM_NO_WINDOWS_H 28 29#define COBJMACROS 30 31#include <windef.h> 32#include <winbase.h> 33#include <winuser.h> 34#include <wingdi.h> 35#include <winreg.h> 36#include <winspool.h> 37#include <wincon.h> 38 39#include <commdlg.h> 40 41#include <objbase.h> 42#include <cfgmgr32.h> 43#include <regstr.h> 44#include <sddl.h> 45#include <setupapi.h> 46#include <softpub.h> 47#include <mscat.h> 48#include <lzexpand.h> 49#include <shlobj.h> 50#include <wine/unicode.h> 51#define NTOS_MODE_USER 52#include <ndk/rtlfuncs.h> 53 54#include <wine/debug.h> 55WINE_DEFAULT_DEBUG_CHANNEL(setupapi); 56 57#ifdef __REACTOS__ 58#undef __WINESRC__ 59#endif 60 61#include "resource.h" 62 63#define SETUP_DEVICE_INFO_SET_MAGIC 0xd00ff057 64#define SETUP_CLASS_IMAGE_LIST_MAGIC 0xd00ff058 65 66#define CMP_MAGIC 0x01234567 67 68struct DeviceInterface /* Element of DeviceInfo.InterfaceListHead */ 69{ 70 LIST_ENTRY ListEntry; 71 72 /* Link to is parent device */ 73 struct DeviceInfo *DeviceInfo; 74 GUID InterfaceClassGuid; 75 76 77 /* SPINT_ACTIVE : the interface is active/enabled 78 * SPINT_DEFAULT: the interface is the default interface for the device class 79 * SPINT_REMOVED: the interface is removed 80 */ 81 DWORD Flags; 82 83 /* Contains the symbolic link of this interface, for example 84 * \\?\ACPI#PNP0501#4&2658d0a0&0#{GUID} */ 85 WCHAR SymbolicLink[ANYSIZE_ARRAY]; 86}; 87 88/* We don't want to open the .inf file to read only one information in it, so keep a handle to it once it 89 * has been already loaded once. Keep also a reference counter */ 90struct InfFileDetails 91{ 92 /* Handle to the .inf file */ 93 HINF hInf; 94 /* Reference count to this object. Once it raises 0, the .inf file is 95 * automatically closed and this memory structure is deleted */ 96 LONG References; 97 98 /* Contains the directory name of the .inf file. 99 * Points into szData at then end of the structure */ 100 PCWSTR DirectoryName; 101 /* Contains the .inf file name (without directory name). 102 * Points into szData at then end of the structure */ 103 PCWSTR FileName; 104 105 /* Variable size array (contains data for DirectoryName and FileName) */ 106 WCHAR szData[ANYSIZE_ARRAY]; 107}; 108 109struct DriverInfoElement /* Element of DeviceInfoSet.DriverListHead and DeviceInfo.DriverListHead */ 110{ 111 LIST_ENTRY ListEntry; 112 113 SP_DRVINSTALL_PARAMS Params; 114 ULARGE_INTEGER DriverDate; 115 SP_DRVINFO_DATA_V2_W Info; 116 SP_DRVINFO_DETAIL_DATA_W Details; 117 GUID ClassGuid; 118 LPWSTR MatchingId; 119 struct InfFileDetails *InfFileDetails; 120}; 121 122struct ClassInstallParams 123{ 124 PSP_PROPCHANGE_PARAMS PropChangeParams; 125 PSP_ADDPROPERTYPAGE_DATA AddPropertyPageData; 126}; 127 128struct DeviceInfo /* Element of DeviceInfoSet.ListHead */ 129{ 130 LIST_ENTRY ListEntry; 131 /* Used when dealing with CM_* functions */ 132 DEVINST dnDevInst; 133 134 /* Link to parent DeviceInfoSet */ 135 struct DeviceInfoSet *set; 136 137 /* Reserved Field of SP_DEVINSTALL_PARAMS_W structure 138 * points to a struct DriverInfoElement */ 139 SP_DEVINSTALL_PARAMS_W InstallParams; 140 141 /* Information about devnode: 142 * - instanceId: 143 * "Root\*PNP0501" for example. 144 * It doesn't contain the unique ID for the device 145 * (points into the Data field at the end of the structure) 146 * WARNING: no NULL char exist between instanceId and UniqueId 147 * in Data field! 148 * - UniqueId 149 * "5&1be2108e&0" or "0000" 150 * If DICD_GENERATE_ID is specified in creation flags, 151 * this unique ID is autogenerated using 4 digits, base 10 152 * (points into the Data field at the end of the structure) 153 * - DeviceDescription 154 * String which identifies the device. Can be NULL. If not NULL, 155 * points into the Data field at the end of the structure 156 * - ClassGuid 157 * Identifies the class of this device. It is GUID_NULL if the 158 * device has not been installed 159 * - CreationFlags 160 * Is a combination of: 161 * - DICD_GENERATE_ID 162 * the unique ID needs to be generated 163 * - DICD_INHERIT_CLASSDRVS 164 * inherit driver of the device info set (== same pointer) 165 */ 166 PCWSTR instanceId; 167 PCWSTR UniqueId; 168 PCWSTR DeviceDescription; 169 GUID ClassGuid; 170 DWORD CreationFlags; 171 172 /* If CreationFlags contains DICD_INHERIT_CLASSDRVS, this list is invalid */ 173 /* If the driver is not searched/detected, this list is empty */ 174 LIST_ENTRY DriverListHead; /* List of struct DriverInfoElement */ 175 176 /* List of interfaces implemented by this device */ 177 LIST_ENTRY InterfaceListHead; /* List of struct DeviceInterface */ 178 179 /* Used by SetupDiGetClassInstallParamsW/SetupDiSetClassInstallParamsW */ 180 struct ClassInstallParams ClassInstallParams; 181 182 /* Device property page provider data */ 183 HMODULE hmodDevicePropPageProvider; 184 PVOID pDevicePropPageProvider; 185 186 /* Variable size array (contains data for instanceId, UniqueId, DeviceDescription) */ 187 WCHAR Data[ANYSIZE_ARRAY]; 188}; 189 190struct DeviceInfoSet /* HDEVINFO */ 191{ 192 DWORD magic; /* SETUP_DEVICE_INFO_SET_MAGIC */ 193 /* If != GUID_NULL, only devices of this class can be in the device info set */ 194 GUID ClassGuid; 195 /* Local or distant HKEY_LOCAL_MACHINE registry key */ 196 HKEY HKLM; 197 /* Used when dealing with CM_* functions */ 198 HMACHINE hMachine; 199 200 /* Reserved Field points to a struct DriverInfoElement */ 201 SP_DEVINSTALL_PARAMS_W InstallParams; 202 203 /* List of struct DriverInfoElement (if no driver has been 204 * searched/detected, this list is empty) */ 205 LIST_ENTRY DriverListHead; 206 207 /* List of struct DeviceInfo */ 208 LIST_ENTRY ListHead; 209 struct DeviceInfo *SelectedDevice; 210 211 /* Used by SetupDiGetClassInstallParamsW/SetupDiSetClassInstallParamsW */ 212 struct ClassInstallParams ClassInstallParams; 213 214 /* Class property page provider data */ 215 HMODULE hmodClassPropPageProvider; 216 PVOID pClassPropPageProvider; 217 218 /* Contains the name of the remote computer ('\\COMPUTERNAME' for example), 219 * or NULL if related to local machine. Points into szData field at the 220 * end of the structure */ 221 PCWSTR MachineName; 222 223 /* Variable size array (contains data for MachineName) */ 224 WCHAR szData[ANYSIZE_ARRAY]; 225}; 226 227struct ClassImageList 228{ 229 DWORD magic; /* SETUP_CLASS_IMAGE_LIST_MAGIC */ 230 231 /* Number of GUIDs contained in Guids and IconIndexes arrays */ 232 DWORD NumberOfGuids; 233 /* Array of GUIDs associated to icons of the image list. Its size 234 * is NumberOfGuids and is pointing after the end this structure */ 235 GUID* Guids; 236 /* Array of corresponding icons index in the image list. Its size 237 * is NumberOfGuids and is pointing after the end this structure */ 238 INT* IconIndexes; 239}; 240 241struct FileLog /* HSPFILELOG */ 242{ 243 DWORD ReadOnly; 244 DWORD SystemLog; 245 LPWSTR LogName; 246}; 247 248extern HINSTANCE hInstance; 249extern OSVERSIONINFOEXW OsVersionInfo; 250 251/* 252 * See: https://learn.microsoft.com/en-us/windows/win32/devnotes/psetupsetglobalflags 253 * for more information. 254 */ 255extern DWORD GlobalSetupFlags; 256#define PSPGF_NO_BACKUP 0x0002 257#define PSPGF_NONINTERACTIVE 0x0004 258 259#define RC_STRING_MAX_SIZE 256 260 261#define REG_INSTALLEDFILES "System\\CurrentControlSet\\Control\\InstalledFiles" 262#define REGPART_RENAME "\\Rename" 263#define REG_VERSIONCONFLICT "Software\\Microsoft\\VersionConflictManager" 264 265inline static WCHAR *strdupAtoW( const char *str ) 266{ 267 WCHAR *ret = NULL; 268 if (str) 269 { 270 DWORD len = MultiByteToWideChar( CP_ACP, 0, str, -1, NULL, 0 ); 271 if ((ret = HeapAlloc( GetProcessHeap(), 0, len * sizeof(WCHAR) ))) 272 MultiByteToWideChar( CP_ACP, 0, str, -1, ret, len ); 273 } 274 return ret; 275} 276 277/* string substitutions */ 278 279struct inf_file; 280extern const WCHAR *DIRID_get_string( int dirid ); 281extern const WCHAR *PARSER_get_inf_filename( HINF hinf ) DECLSPEC_HIDDEN; 282extern WCHAR *PARSER_get_src_root( HINF hinf ) DECLSPEC_HIDDEN; 283extern WCHAR *PARSER_get_dest_dir( INFCONTEXT *context ) DECLSPEC_HIDDEN; 284 285/* support for Ascii queue callback functions */ 286 287struct callback_WtoA_context 288{ 289 void *orig_context; 290 PSP_FILE_CALLBACK_A orig_handler; 291}; 292 293UINT CALLBACK QUEUE_callback_WtoA( void *context, UINT notification, UINT_PTR, UINT_PTR ); 294 295/* from msvcrt/sys/stat.h */ 296#define _S_IWRITE 0x0080 297#define _S_IREAD 0x0100 298 299/* devinst.c */ 300 301DWORD 302GetErrorCodeFromCrCode(const IN CONFIGRET cr); 303 304BOOL 305CreateDeviceInfo( 306 IN struct DeviceInfoSet *list, 307 IN LPCWSTR InstancePath, 308 IN LPCGUID pClassGuid, 309 OUT struct DeviceInfo **pDeviceInfo); 310 311LONG 312SETUP_CreateDevicesList( 313 IN OUT struct DeviceInfoSet *list, 314 IN PCWSTR MachineName OPTIONAL, 315 IN CONST GUID *Class OPTIONAL, 316 IN PCWSTR Enumerator OPTIONAL); 317 318HKEY SETUPDI_CreateDevKey(HKEY RootKey, struct DeviceInfo *devInfo, REGSAM samDesired); 319HKEY SETUPDI_CreateDrvKey(HKEY RootKey, struct DeviceInfo *devInfo, UUID *ClassGuid, REGSAM samDesired); 320HKEY SETUPDI_OpenDevKey(HKEY RootKey, struct DeviceInfo *devInfo, REGSAM samDesired); 321HKEY SETUPDI_OpenDrvKey(HKEY RootKey, struct DeviceInfo *devInfo, REGSAM samDesired); 322 323/* driver.c */ 324 325struct InfFileDetails * 326CreateInfFileDetails( 327 IN LPCWSTR FullInfFileName); 328 329VOID 330DereferenceInfFile(struct InfFileDetails* infFile); 331 332BOOL 333DestroyDriverInfoElement(struct DriverInfoElement* driverInfo); 334 335/* install.c */ 336 337BOOL 338GetStringField( PINFCONTEXT context, DWORD index, PWSTR *value); 339 340/* interface.c */ 341 342BOOL 343DestroyDeviceInterface( 344 struct DeviceInterface* deviceInterface); 345 346LONG 347SETUP_CreateInterfaceList( 348 struct DeviceInfoSet *list, 349 PCWSTR MachineName, 350 CONST GUID *InterfaceGuid, 351 PCWSTR DeviceInstanceW /* OPTIONAL */, 352 BOOL OnlyPresentInterfaces); 353 354/* misc.c */ 355 356DWORD 357GetFunctionPointer( 358 IN PWSTR InstallerName, 359 OUT HMODULE* ModulePointer, 360 OUT PVOID* FunctionPointer); 361 362DWORD 363FreeFunctionPointer( 364 IN HMODULE ModulePointer, 365 IN PVOID FunctionPointer); 366 367DWORD 368WINAPI 369pSetupStringFromGuid(LPGUID lpGUID, PWSTR pString, DWORD dwStringLen); 370 371DWORD WINAPI CaptureAndConvertAnsiArg(LPCSTR pSrc, LPWSTR *pDst); 372 373VOID WINAPI MyFree(LPVOID lpMem); 374LPVOID WINAPI MyMalloc(DWORD dwSize); 375LPVOID WINAPI MyRealloc(LPVOID lpSrc, DWORD dwSize); 376LPWSTR WINAPI DuplicateString(LPCWSTR lpSrc); 377BOOL WINAPI IsUserAdmin(VOID); 378LPWSTR WINAPI MultiByteToUnicode(LPCSTR lpMultiByteStr, UINT uCodePage); 379LPSTR WINAPI UnicodeToMultiByte(LPCWSTR lpUnicodeStr, UINT uCodePage); 380 381/* parser.c */ 382 383typedef BOOL (*FIND_CALLBACK)(LPCWSTR SectionName, PVOID Context); 384BOOL EnumerateSectionsStartingWith(HINF hInf, LPCWSTR pStr, FIND_CALLBACK Callback, PVOID Context); 385 386#endif /* __SETUPAPI_PRIVATE_H */