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> 55 WINE_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 68 struct 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 */ 90 struct 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 109 struct 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 122 struct ClassInstallParams 123 { 124 PSP_PROPCHANGE_PARAMS PropChangeParams; 125 PSP_ADDPROPERTYPAGE_DATA AddPropertyPageData; 126 }; 127 128 struct 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 190 struct 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 227 struct 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 241 struct FileLog /* HSPFILELOG */ 242 { 243 DWORD ReadOnly; 244 DWORD SystemLog; 245 LPWSTR LogName; 246 }; 247 248 extern HINSTANCE hInstance; 249 extern OSVERSIONINFOEXW OsVersionInfo; 250 251 /* 252 * See: https://msdn.microsoft.com/en-us/library/bb432397(v=vs.85).aspx 253 * for more information. 254 */ 255 extern 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 265 inline 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 279 struct inf_file; 280 extern const WCHAR *DIRID_get_string( int dirid ); 281 extern const WCHAR *PARSER_get_inf_filename( HINF hinf ) DECLSPEC_HIDDEN; 282 extern WCHAR *PARSER_get_src_root( HINF hinf ) DECLSPEC_HIDDEN; 283 extern WCHAR *PARSER_get_dest_dir( INFCONTEXT *context ) DECLSPEC_HIDDEN; 284 285 /* support for Ascii queue callback functions */ 286 287 struct callback_WtoA_context 288 { 289 void *orig_context; 290 PSP_FILE_CALLBACK_A orig_handler; 291 }; 292 293 UINT 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 301 BOOL 302 CreateDeviceInfo( 303 IN struct DeviceInfoSet *list, 304 IN LPCWSTR InstancePath, 305 IN LPCGUID pClassGuid, 306 OUT struct DeviceInfo **pDeviceInfo); 307 308 LONG 309 SETUP_CreateDevicesList( 310 IN OUT struct DeviceInfoSet *list, 311 IN PCWSTR MachineName OPTIONAL, 312 IN CONST GUID *Class OPTIONAL, 313 IN PCWSTR Enumerator OPTIONAL); 314 315 HKEY SETUPDI_OpenDevKey(HKEY RootKey, struct DeviceInfo *devInfo, REGSAM samDesired); 316 HKEY SETUPDI_OpenDrvKey(HKEY RootKey, struct DeviceInfo *devInfo, REGSAM samDesired); 317 318 /* driver.c */ 319 320 struct InfFileDetails * 321 CreateInfFileDetails( 322 IN LPCWSTR FullInfFileName); 323 324 VOID 325 DereferenceInfFile(struct InfFileDetails* infFile); 326 327 BOOL 328 DestroyDriverInfoElement(struct DriverInfoElement* driverInfo); 329 330 /* install.c */ 331 332 BOOL 333 GetStringField( PINFCONTEXT context, DWORD index, PWSTR *value); 334 335 /* interface.c */ 336 337 BOOL 338 DestroyDeviceInterface( 339 struct DeviceInterface* deviceInterface); 340 341 LONG 342 SETUP_CreateInterfaceList( 343 struct DeviceInfoSet *list, 344 PCWSTR MachineName, 345 CONST GUID *InterfaceGuid, 346 PCWSTR DeviceInstanceW /* OPTIONAL */, 347 BOOL OnlyPresentInterfaces); 348 349 /* misc.c */ 350 351 DWORD 352 GetFunctionPointer( 353 IN PWSTR InstallerName, 354 OUT HMODULE* ModulePointer, 355 OUT PVOID* FunctionPointer); 356 357 DWORD 358 FreeFunctionPointer( 359 IN HMODULE ModulePointer, 360 IN PVOID FunctionPointer); 361 362 DWORD 363 WINAPI 364 pSetupStringFromGuid(LPGUID lpGUID, PWSTR pString, DWORD dwStringLen); 365 366 DWORD WINAPI CaptureAndConvertAnsiArg(LPCSTR pSrc, LPWSTR *pDst); 367 368 VOID WINAPI MyFree(LPVOID lpMem); 369 LPVOID WINAPI MyMalloc(DWORD dwSize); 370 LPVOID WINAPI MyRealloc(LPVOID lpSrc, DWORD dwSize); 371 LPWSTR WINAPI DuplicateString(LPCWSTR lpSrc); 372 BOOL WINAPI IsUserAdmin(VOID); 373 LPWSTR WINAPI MultiByteToUnicode(LPCSTR lpMultiByteStr, UINT uCodePage); 374 LPSTR WINAPI UnicodeToMultiByte(LPCWSTR lpUnicodeStr, UINT uCodePage); 375 376 /* parser.c */ 377 378 typedef BOOL (*FIND_CALLBACK)(LPCWSTR SectionName, PVOID Context); 379 BOOL EnumerateSectionsStartingWith(HINF hInf, LPCWSTR pStr, FIND_CALLBACK Callback, PVOID Context); 380 381 #endif /* __SETUPAPI_PRIVATE_H */ 382