55 BOOL FoundHardwareId, FoundAtLeastOneDevice =
FALSE;
61 TRACE(
"UpdateDriverForPlugAndPlayDevicesW(%p %s %s 0x%x %p)\n",
91 FoundHardwareId =
FALSE;
112 TRACE(
"SetupDiGetDeviceRegistryPropertyW() failed with error 0x%x\n",
GetLastError());
128 for (CurrentHardwareId =
Buffer; *CurrentHardwareId !=
UNICODE_NULL; CurrentHardwareId +=
wcslen(CurrentHardwareId) + 1)
130 if (
_wcsicmp(CurrentHardwareId, HardwareId) == 0)
132 FoundHardwareId =
TRUE;
143 if (!FoundHardwareId)
191 InstallParams.
cbSize =
sizeof(InstallParams);
197 RebootRequired =
TRUE;
200 FoundAtLeastOneDevice =
TRUE;
203 if (FoundAtLeastOneDevice)
206 *bRebootRequired = RebootRequired;
284 TRACE(
"SetupDiGetDeviceInstallParams() failed with error 0x%x\n",
GetLastError());
296 DevInstallParams.
Flags &= ~DI_ENUMSINGLEINF;
301 DevInstallParams.
Flags &= ~DI_ENUMSINGLEINF;
306 DevInstData->hDevInfo,
307 &DevInstData->devInfoData,
311 TRACE(
"SetupDiSetDeviceInstallParams() failed with error 0x%x\n",
GetLastError());
316 DevInstData->hDevInfo,
317 &DevInstData->devInfoData,
327 DevInstData->hDevInfo,
328 &DevInstData->devInfoData,
331 &DevInstData->drvInfoData);
379 if (DirPath[
wcslen(DirPath) - 1] !=
'\\')
382 wcscpy(PathWithPattern, DirPath);
397 wcscpy(FullPath, DirPath);
409 if ((
_wcsicmp(pszExtension,
L".inf") == 0) && (
wcscmp(LastDirPath, DirPath) != 0))
411 wcscpy(LastDirPath, DirPath);
449 if (DevInstData->CustomSearchPath)
478 IN BOOL IncludeRemovableDevices,
479 IN BOOL IncludeCustomPath,
486 DWORD CustomTextLength = 0;
492 if (IncludeRemovableDevices)
507 if (IncludeCustomPath)
509 CustomTextLength = 1 + ((
idx !=
CB_ERR) ?
522 TRACE(
"HeapAlloc() failed\n");
528 if (IncludeRemovableDevices)
542 if (IncludeCustomPath)
559 TRACE(
"Installing driver %s: %s\n",
561 debugstr_w(DevInstData->drvInfoData.Description));
565 DevInstData->hDevInfo,
566 &DevInstData->devInfoData);
569 TRACE(
"SetupDiCallClassInstaller(DIF_SELECTBESTCOMPATDRV) failed with error 0x%x\n",
GetLastError());
575 DevInstData->hDevInfo,
576 &DevInstData->devInfoData);
579 TRACE(
"SetupDiCallClassInstaller(DIF_ALLOW_INSTALL) failed with error 0x%x\n",
GetLastError());
585 DevInstData->hDevInfo,
586 &DevInstData->devInfoData);
589 TRACE(
"SetupDiCallClassInstaller(DIF_NEWDEVICEWIZARD_PREANALYZE) failed with error 0x%x\n",
GetLastError());
595 DevInstData->hDevInfo,
596 &DevInstData->devInfoData);
599 TRACE(
"SetupDiCallClassInstaller(DIF_NEWDEVICEWIZARD_POSTANALYZE) failed with error 0x%x\n",
GetLastError());
605 DevInstData->hDevInfo,
606 &DevInstData->devInfoData);
609 TRACE(
"SetupDiCallClassInstaller(DIF_INSTALLDEVICEFILES) failed with error 0x%x\n",
GetLastError());
615 DevInstData->hDevInfo,
616 &DevInstData->devInfoData);
619 TRACE(
"SetupDiCallClassInstaller(DIF_REGISTER_COINSTALLERS) failed with error 0x%x\n",
GetLastError());
625 DevInstData->hDevInfo,
626 &DevInstData->devInfoData);
629 TRACE(
"SetupDiCallClassInstaller(DIF_INSTALLINTERFACES) failed with error 0x%x\n",
GetLastError());
635 DevInstData->hDevInfo,
636 &DevInstData->devInfoData);
639 TRACE(
"SetupDiCallClassInstaller(DIF_INSTALLDEVICE) failed with error 0x%x\n",
GetLastError());
645 DevInstData->hDevInfo,
646 &DevInstData->devInfoData);
649 TRACE(
"SetupDiCallClassInstaller(DIF_NEWDEVICEWIZARD_FINISHINSTALL) failed with error 0x%x\n",
GetLastError());
655 DevInstData->hDevInfo,
656 &DevInstData->devInfoData);
659 TRACE(
"SetupDiCallClassInstaller(DIF_DESTROYPRIVATEDATA) failed with error 0x%x\n",
GetLastError());
692 TRACE(
"HeapAlloc() failed\n");
705 TRACE(
"SetupDiCreateDeviceInfoListExW() failed with error 0x%x\n",
GetLastError());
718 TRACE(
"SetupDiOpenDeviceInfoW() failed with error 0x%x (InstanceId %s)\n",
738 TRACE(
"HeapAlloc() failed\n");
754 TRACE(
"SetupDiGetDeviceRegistryProperty() failed with error 0x%x (InstanceId %s)\n",
764 (
BYTE *)&config_flags,
765 sizeof(config_flags),
771 TRACE(
"Device is disabled\n");
789 TRACE(
"InstallCurrentDriver() returned %d\n",
retval);
802 TRACE(
"Displaying 'Reboot' wizard page\n");
812 TRACE(
"No wizard\n");
817 TRACE(
"Need to show install wizard\n");
826 TRACE(
"SetupDiDestroyDriverInfoList() failed with error 0x%lx\n",
GetLastError());
831 TRACE(
"SetupDiDestroyDeviceInfoList() failed with error 0x%lx\n",
GetLastError());
854 TRACE(
"InstllDevInstEx(%p, %s, %d, %p, %lx)\n",
860 TRACE(
"HeapAlloc() failed\n");
868 DevInstData->
bUpdate = bUpdate;
874 TRACE(
"SetupDiCreateDeviceInfoListExW() failed with error 0x%x\n",
GetLastError());
887 TRACE(
"SetupDiOpenDeviceInfoW() failed with error 0x%x (InstanceId %s)\n",
907 TRACE(
"HeapAlloc() failed\n");
924 TRACE(
"SetupDiGetDeviceRegistryProperty() failed with error 0x%x (InstanceId %s)\n",
930 TRACE(
"Need to show install wizard\n");
939 TRACE(
"SetupDiDestroyDriverInfoList() failed with error 0x%lx\n",
GetLastError());
944 TRACE(
"SetupDiDestroyDeviceInfoList() failed with error 0x%lx\n",
GetLastError());
1046 TRACE(
"CreateEventW('%ls') failed with error %lu\n", InstallEventName,
GetLastError());
1057 if(InstallEventName)
PRTL_UNICODE_STRING_BUFFER Path
UINT32 void void ** ReturnValue
BOOL WINAPI InitCommonControlsEx(const INITCOMMONCONTROLSEX *lpInitCtrls)
#define ERROR_NOT_ENOUGH_MEMORY
#define ERROR_INSUFFICIENT_BUFFER
#define DLL_PROCESS_ATTACH
#define ReadFile(a, b, c, d, e)
#define INVALID_HANDLE_VALUE
#define ERROR_NO_MORE_ITEMS
#define HeapFree(x, y, z)
#define FILE_ATTRIBUTE_NORMAL
#define MultiByteToWideChar
#define ERROR_ACCESS_DENIED
static void cleanup(void)
UINT WINAPI GetDriveTypeW(IN LPCWSTR lpRootPathName)
HANDLE WINAPI FindFirstFileW(IN LPCWSTR lpFileName, OUT LPWIN32_FIND_DATAW lpFindFileData)
BOOL WINAPI FindClose(HANDLE hFindFile)
BOOL WINAPI FindNextFileW(IN HANDLE hFindFile, OUT LPWIN32_FIND_DATAW lpFindFileData)
BOOL WINAPI DisableThreadLibraryCalls(IN HMODULE hLibModule)
VOID WINAPI ExitProcess(IN UINT uExitCode)
DWORD WINAPI DECLSPEC_HOTPATCH GetLogicalDrives(void)
_ACRTIMP int __cdecl _wcsicmp(const wchar_t *, const wchar_t *)
_ACRTIMP size_t __cdecl wcslen(const wchar_t *)
_ACRTIMP int __cdecl wcscmp(const wchar_t *, const wchar_t *)
HDEVINFO WINAPI SetupDiCreateDeviceInfoListExW(const GUID *ClassGuid, HWND hwndParent, PCWSTR MachineName, PVOID Reserved)
BOOL WINAPI SetupDiSetDeviceInstallParamsW(IN HDEVINFO DeviceInfoSet, IN PSP_DEVINFO_DATA DeviceInfoData OPTIONAL, IN PSP_DEVINSTALL_PARAMS_W DeviceInstallParams)
BOOL WINAPI SetupDiEnumDeviceInfo(HDEVINFO devinfo, DWORD index, PSP_DEVINFO_DATA info)
BOOL WINAPI SetupDiGetDeviceInstallParamsW(IN HDEVINFO DeviceInfoSet, IN PSP_DEVINFO_DATA DeviceInfoData OPTIONAL, OUT PSP_DEVINSTALL_PARAMS_W DeviceInstallParams)
BOOL WINAPI SetupDiCallClassInstaller(DI_FUNCTION InstallFunction, HDEVINFO DeviceInfoSet, PSP_DEVINFO_DATA DeviceInfoData)
BOOL WINAPI SetupDiGetDeviceRegistryPropertyW(HDEVINFO DeviceInfoSet, PSP_DEVINFO_DATA DeviceInfoData, DWORD Property, PDWORD PropertyRegDataType, PBYTE PropertyBuffer, DWORD PropertyBufferSize, PDWORD RequiredSize)
HDEVINFO WINAPI SetupDiGetClassDevsW(CONST GUID *class, LPCWSTR enumstr, HWND parent, DWORD flags)
BOOL WINAPI SetupDiOpenDeviceInfoW(IN HDEVINFO DeviceInfoSet, IN PCWSTR DeviceInstanceId, IN HWND hwndParent OPTIONAL, IN DWORD OpenFlags, OUT PSP_DEVINFO_DATA DeviceInfoData OPTIONAL)
BOOL WINAPI SetupDiGetDeviceInstanceIdW(HDEVINFO DeviceInfoSet, PSP_DEVINFO_DATA DeviceInfoData, PWSTR DeviceInstanceId, DWORD DeviceInstanceIdSize, PDWORD RequiredSize)
BOOL WINAPI SetupDiDestroyDeviceInfoList(HDEVINFO devinfo)
BOOL WINAPI SetupDiBuildDriverInfoList(IN HDEVINFO DeviceInfoSet, IN OUT PSP_DEVINFO_DATA DeviceInfoData OPTIONAL, IN DWORD DriverType)
BOOL WINAPI SetupDiEnumDriverInfoW(IN HDEVINFO DeviceInfoSet, IN PSP_DEVINFO_DATA DeviceInfoData OPTIONAL, IN DWORD DriverType, IN DWORD MemberIndex, OUT PSP_DRVINFO_DATA_W DriverInfoData)
BOOL WINAPI SetupDiDestroyDriverInfoList(IN HDEVINFO DeviceInfoSet, IN PSP_DEVINFO_DATA DeviceInfoData OPTIONAL, IN DWORD DriverType)
static const WCHAR DeviceInstance[]
_Must_inspect_result_ _In_ PFILE_OBJECT _In_ SECURITY_INFORMATION _In_ ULONG _Out_opt_ PULONG LengthNeeded
_Must_inspect_result_ _In_opt_ PVOID _In_opt_ PVOID InstanceId
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
#define ERROR_FILE_NOT_FOUND
#define _swprintf(buf, format,...)
static VOID InitControls(HWND hwnd)
_In_ BOOLEAN _In_ USHORT Directory
static BOOL IsUserAdmin(VOID)
BOOL WINAPI DevInstallW(IN HWND hWndParent, IN HINSTANCE hInstance, IN LPCWSTR InstanceId, IN INT Show)
BOOL ScanFoldersForDriver(IN PDEVINSTDATA DevInstData)
BOOL PrepareFoldersToScan(IN PDEVINSTDATA DevInstData, IN BOOL IncludeRemovableDevices, IN BOOL IncludeCustomPath, IN HWND hwndCombo OPTIONAL)
BOOL WINAPI ClientSideInstallW(IN HWND hWndOwner, IN HINSTANCE hInstance, IN LPWSTR lpNamedPipeName, IN INT Show)
BOOL WINAPI InstallDevInstEx(IN HWND hWndParent, IN LPCWSTR InstanceId, IN BOOL bUpdate, OUT LPDWORD lpReboot, IN DWORD Unknown)
BOOL WINAPI UpdateDriverForPlugAndPlayDevicesA(IN HWND hwndParent, IN LPCSTR HardwareId, IN LPCSTR FullInfPath, IN DWORD InstallFlags, OUT PBOOL bRebootRequired OPTIONAL)
static BOOL IsDots(IN LPCWSTR str)
static BOOL SearchDriver(IN PDEVINSTDATA DevInstData, IN LPCWSTR Directory OPTIONAL, IN LPCWSTR InfFile OPTIONAL)
static BOOL SearchDriverRecursive(IN PDEVINSTDATA DevInstData, IN LPCWSTR Path)
BOOL WINAPI DllMain(IN HINSTANCE hInstance, IN DWORD dwReason, IN LPVOID lpReserved)
BOOL InstallCurrentDriver(IN PDEVINSTDATA DevInstData)
static LPCWSTR GetFileExt(IN LPWSTR FileName)
BOOL WINAPI InstallDevInst(IN HWND hWndParent, IN LPCWSTR InstanceId, IN BOOL bUpdate, OUT LPDWORD lpReboot)
BOOL WINAPI UpdateDriverForPlugAndPlayDevicesW(IN HWND hwndParent, IN LPCWSTR HardwareId, IN LPCWSTR FullInfPath, IN DWORD InstallFlags, OUT PBOOL bRebootRequired OPTIONAL)
BOOL CheckBestDriver(_In_ PDEVINSTDATA DevInstData, _In_ PCWSTR pszDir)
#define INSTALLFLAG_NONINTERACTIVE
#define INSTALLFLAG_FORCE
#define INSTALLFLAG_READONLY
BOOL DisplayWizard(IN PDEVINSTDATA DevInstData, IN HWND hwndParent, IN UINT startPage)
#define FILE_ATTRIBUTE_DIRECTORY
struct tagINITCOMMONCONTROLSEX INITCOMMONCONTROLSEX
#define ICC_PROGRESS_CLASS
#define SW_SHOWNOACTIVATE
LRESULT WINAPI SendMessageW(_In_ HWND, _In_ UINT, _In_ WPARAM, _In_ LPARAM)
#define CONFIGFLAG_FAILEDINSTALL
#define DIF_INSTALLDEVICEFILES
#define SetupDiGetDeviceInstallParams
SP_DEVINSTALL_PARAMS_A SP_DEVINSTALL_PARAMS
#define ERROR_NO_SUCH_DEVINST
#define SPDRP_COMPATIBLEIDS
#define SetupDiGetDeviceRegistryProperty
SP_DRVINFO_DATA_V2 SP_DRVINFO_DATA
#define DIF_REGISTER_COINSTALLERS
#define DIF_INSTALLINTERFACES
struct _SP_DEVINSTALL_PARAMS_W SP_DEVINSTALL_PARAMS_W
#define DIF_NEWDEVICEWIZARD_PREANALYZE
#define DIF_INSTALLDEVICE
#define DIF_ALLOW_INSTALL
#define DIF_DESTROYPRIVATEDATA
struct _SP_DEVINFO_DATA SP_DEVINFO_DATA
#define DI_FLAGSEX_ALLOWEXCLUDEDDRVS
#define DIF_SELECTBESTCOMPATDRV
#define SPDRP_CONFIGFLAGS
#define DIF_NEWDEVICEWIZARD_POSTANALYZE
#define SPDIT_COMPATDRIVER
#define DIF_NEWDEVICEWIZARD_FINISHINSTALL
PULONG MinorVersion OPTIONAL
SP_DEVINFO_DATA devInfoData
WCHAR DriverPath[MAX_PATH]
_Field_z_ WCHAR cFileName[MAX_PATH]
HANDLE WINAPI DECLSPEC_HOTPATCH CreateEventW(IN LPSECURITY_ATTRIBUTES lpEventAttributes OPTIONAL, IN BOOL bManualReset, IN BOOL bInitialState, IN LPCWSTR lpName OPTIONAL)
BOOL WINAPI DECLSPEC_HOTPATCH SetEvent(IN HANDLE hEvent)
_Must_inspect_result_ _In_ WDFIOTARGET _In_opt_ WDFREQUEST _In_opt_ PWDF_MEMORY_DESCRIPTOR _In_opt_ PLONGLONG _In_opt_ PWDF_REQUEST_SEND_OPTIONS _Out_opt_ PULONG_PTR BytesRead
_Must_inspect_result_ _In_ WDFKEY _In_ PCUNICODE_STRING _Out_opt_ PUSHORT _Inout_opt_ PUNICODE_STRING Value
int WINAPI GetWindowTextW(HWND hWnd, LPWSTR lpString, int nMaxCount)
DWORD WINAPI GetLastError(void)
#define ComboBox_GetTextLength(hwndCtl)
#define ERROR_GEN_FAILURE
#define ERROR_INVALID_FLAGS
#define ERROR_PRIVILEGE_NOT_HELD
_In_ DWORD _In_ int _In_ int _In_opt_ LPNLSVERSIONINFO _In_opt_ LPVOID lpReserved
_At_(*)(_In_ PWSK_CLIENT Client, _In_opt_ PUNICODE_STRING NodeName, _In_opt_ PUNICODE_STRING ServiceName, _In_opt_ ULONG NameSpace, _In_opt_ GUID *Provider, _In_opt_ PADDRINFOEXW Hints, _Outptr_ PADDRINFOEXW *Result, _In_opt_ PEPROCESS OwningProcess, _In_opt_ PETHREAD OwningThread, _Inout_ PIRP Irp Result)(Mem)) NTSTATUS(WSKAPI *PFN_WSK_GET_ADDRESS_INFO