Something went wrong. Try again.
Reactos
Something went wrong. Try again.
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613/* * ReactOS Device Manager Applet * Copyright (C) 2004 - 2005 ReactOS Team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA *//* * PROJECT: ReactOS devmgr.dll * FILE: lib/devmgr/devprblm.c * PURPOSE: ReactOS Device Manager * PROGRAMMER: Thomas Weidenmueller <w3seek@reactos.com> * UPDATE HISTORY: * 04-04-2004 Created */
#include "precomp.h"#include "properties.h"#include "resource.h"
BOOLShowDeviceProblemWizard(IN HWND hWndParent OPTIONAL, IN HDEVINFO hDevInfo, IN PSP_DEVINFO_DATA DevInfoData, IN HMACHINE hMachine OPTIONAL){ WCHAR szDeviceInstanceId[256]; CONFIGRET cr; ULONG Status, ProblemNumber; DWORD dwReboot; BOOL Ret = FALSE;
/* Get the device instance id */ if (!SetupDiGetDeviceInstanceId(hDevInfo, DevInfoData, szDeviceInstanceId, 256, NULL)) return FALSE;
cr = CM_Get_DevNode_Status_Ex(&Status, &ProblemNumber, DevInfoData->DevInst, 0, hMachine); if (cr == CR_SUCCESS && (Status & DN_HAS_PROBLEM)) { switch (ProblemNumber) { case CM_PROB_DEVLOADER_FAILED: { /* FIXME - only if it's not a root bus devloader */ /* FIXME - display the update driver wizard */ break; }
case CM_PROB_OUT_OF_MEMORY: case CM_PROB_ENTRY_IS_WRONG_TYPE: case CM_PROB_LACKED_ARBITRATOR: case CM_PROB_FAILED_START: case CM_PROB_LIAR: case CM_PROB_UNKNOWN_RESOURCE: { /* FIXME - display the update driver wizard */ InstallDevInst(hWndParent, szDeviceInstanceId, TRUE, &dwReboot); break; }
case CM_PROB_BOOT_CONFIG_CONFLICT: case CM_PROB_NORMAL_CONFLICT: case CM_PROB_REENUMERATION: { /* FIXME - display the conflict wizard */ break; }
case CM_PROB_FAILED_FILTER: case CM_PROB_REINSTALL: case CM_PROB_FAILED_INSTALL: { /* FIXME - display the driver (re)installation wizard */ InstallDevInst(hWndParent, szDeviceInstanceId, TRUE, &dwReboot); break; }
case CM_PROB_DEVLOADER_NOT_FOUND: { /* FIXME - 4 cases: 1) if it's a missing system devloader: - fail 2) if it's not a system devloader but still missing: - display the driver reinstallation wizard 3) if it's not a system devloader but the file can be found: - display the update driver wizard 4) if it's a missing or empty software key - display the update driver wizard */ break; }
case CM_PROB_INVALID_DATA: case CM_PROB_PARTIAL_LOG_CONF: case CM_PROB_NO_VALID_LOG_CONF: case CM_PROB_HARDWARE_DISABLED: case CM_PROB_CANT_SHARE_IRQ: case CM_PROB_TRANSLATION_FAILED: case CM_PROB_SYSTEM_SHUTDOWN: case CM_PROB_PHANTOM: /* FIXME - do nothing */ break;
case CM_PROB_NOT_VERIFIED: case CM_PROB_DEVICE_NOT_THERE: /* FIXME - display search hardware wizard */ break;
case CM_PROB_NEED_RESTART: case CM_PROB_WILL_BE_REMOVED: case CM_PROB_MOVED: case CM_PROB_TOO_EARLY: case CM_PROB_DISABLED_SERVICE: /* FIXME - reboot computer */ break;
case CM_PROB_REGISTRY: /* FIXME - check registry */ break;
case CM_PROB_DISABLED: { /* FIXME - if device was disabled by user display the "Enable Device" wizard, otherwise Troubleshoot because the device was disabled by the system */ break; }
case CM_PROB_DEVLOADER_NOT_READY: { /* FIXME - if it's a graphics adapter: - if it's a a secondary adapter and the main adapter couldn't be found - do nothing or default action - else - display the Properties - else - Update driver */ break; }
case CM_PROB_FAILED_ADD: { /* FIXME - display the properties of the sub-device */ break; }
case CM_PROB_NO_SOFTCONFIG: case CM_PROB_IRQ_TRANSLATION_FAILED: case CM_PROB_FAILED_DRIVER_ENTRY: case CM_PROB_DRIVER_FAILED_PRIOR_UNLOAD: case CM_PROB_DRIVER_FAILED_LOAD: case CM_PROB_DRIVER_SERVICE_KEY_INVALID: case CM_PROB_LEGACY_SERVICE_NO_DEVICES: case CM_PROB_DUPLICATE_DEVICE: case CM_PROB_FAILED_POST_START: case CM_PROB_HALTED: case CM_PROB_HELD_FOR_EJECT: case CM_PROB_DRIVER_BLOCKED: case CM_PROB_REGISTRY_TOO_LARGE: default: { /* FIXME - troubleshoot the device */ break; } } }
return Ret;}
/*************************************************************************** * NAME EXPORTED * DeviceProblemWizardA * * DESCRIPTION * Calls the device problem wizard * * ARGUMENTS * hWndParent: Handle to the parent window * lpMachineName: Machine Name, NULL is the local machine * lpDeviceID: Specifies the device, also see NOTEs * * RETURN VALUE * TRUE: if no errors occured * FALSE: if errors occured * * @implemented */BOOLWINAPIDeviceProblemWizardA(IN HWND hWndParent OPTIONAL, IN LPCSTR lpMachineName OPTIONAL, IN LPCSTR lpDeviceID){ LPWSTR lpMachineNameW = NULL; LPWSTR lpDeviceIDW = NULL; BOOL Ret = FALSE;
if (lpMachineName != NULL) { if (!(lpMachineNameW = ConvertMultiByteToUnicode(lpMachineName, CP_ACP))) { goto Cleanup; } } if (lpDeviceID != NULL) { if (!(lpDeviceIDW = ConvertMultiByteToUnicode(lpDeviceID, CP_ACP))) { goto Cleanup; } }
Ret = DeviceProblemWizardW(hWndParent, lpMachineNameW, lpDeviceIDW);
Cleanup: if (lpMachineNameW != NULL) { HeapFree(GetProcessHeap(), 0, lpMachineNameW); } if (lpDeviceIDW != NULL) { HeapFree(GetProcessHeap(), 0, lpDeviceIDW); }
return Ret;}
/*************************************************************************** * NAME EXPORTED * DeviceProblemWizardW * * DESCRIPTION * Calls the device problem wizard * * ARGUMENTS * hWndParent: Handle to the parent window * lpMachineName: Machine Name, NULL is the local machine * lpDeviceID: Specifies the device, also see NOTEs * * RETURN VALUE * TRUE: if no errors occured * FALSE: if errors occured * * @unimplemented */BOOLWINAPIDeviceProblemWizardW(IN HWND hWndParent OPTIONAL, IN LPCWSTR lpMachineName OPTIONAL, IN LPCWSTR lpDeviceID){ HDEVINFO hDevInfo; SP_DEVINFO_DATA DevInfoData; HINSTANCE hComCtl32; CONFIGRET cr; HMACHINE hMachine; BOOL Ret = FALSE;
if (lpDeviceID == NULL) { SetLastError(ERROR_INVALID_PARAMETER); return FALSE; }
/* dynamically load comctl32 */ hComCtl32 = LoadAndInitComctl32(); if (hComCtl32 != NULL) { hDevInfo = SetupDiCreateDeviceInfoListEx(NULL, hWndParent, lpMachineName, NULL); if (hDevInfo != INVALID_HANDLE_VALUE) { cr = CM_Connect_Machine(lpMachineName, &hMachine); if (cr == CR_SUCCESS) { DevInfoData.cbSize = sizeof(SP_DEVINFO_DATA); if (SetupDiOpenDeviceInfo(hDevInfo, lpDeviceID, hWndParent, 0, &DevInfoData)) { Ret = ShowDeviceProblemWizard(hWndParent, hDevInfo, &DevInfoData, hMachine); }
CM_Disconnect_Machine(hMachine); }
SetupDiDestroyDeviceInfoList(hDevInfo); }
FreeLibrary(hComCtl32); }
return Ret;}
static const UINT ProblemStringId[NUM_CM_PROB] ={ IDS_DEV_NO_PROBLEM, IDS_DEV_DEVLOADER_FAILED, IDS_DEV_NOT_CONFIGURED, IDS_DEV_OUT_OF_MEMORY, IDS_DEV_ENTRY_IS_WRONG_TYPE, IDS_DEV_LACKED_ARBITRATOR, IDS_DEV_BOOT_CONFIG_CONFLICT, IDS_DEV_FAILED_FILTER, IDS_DEV_DEVLOADER_NOT_FOUND, IDS_DEV_INVALID_DATA, IDS_DEV_FAILED_START, IDS_DEV_LIAR, IDS_DEV_NORMAL_CONFLICT, IDS_DEV_NOT_VERIFIED, IDS_DEV_NEED_RESTART, IDS_DEV_REENUMERATION, IDS_DEV_PARTIAL_LOG_CONF, IDS_DEV_UNKNOWN_RESOURCE, IDS_DEV_REINSTALL, IDS_DEV_REGISTRY, IDS_UNKNOWN, /* CM_PROB_VXDLDR, not used on NT */ IDS_DEV_WILL_BE_REMOVED, IDS_DEV_DISABLED, IDS_DEV_DEVLOADER_NOT_READY, IDS_DEV_DEVICE_NOT_THERE, IDS_DEV_MOVED, IDS_DEV_TOO_EARLY, IDS_DEV_NO_VALID_LOG_CONF, IDS_DEV_FAILED_INSTALL, IDS_DEV_HARDWARE_DISABLED, IDS_DEV_CANT_SHARE_IRQ, IDS_DEV_FAILED_ADD, IDS_DEV_DISABLED_SERVICE, IDS_DEV_TRANSLATION_FAILED, IDS_DEV_NO_SOFTCONFIG, IDS_DEV_BIOS_TABLE, IDS_DEV_IRQ_TRANSLATION_FAILED, IDS_DEV_FAILED_DRIVER_ENTRY, IDS_DEV_DRIVER_FAILED_PRIOR_UNLOAD, IDS_DEV_DRIVER_FAILED_LOAD, IDS_DEV_DRIVER_SERVICE_KEY_INVALID, IDS_DEV_LEGACY_SERVICE_NO_DEVICES, IDS_DEV_DUPLICATE_DEVICE, IDS_DEV_FAILED_POST_START, IDS_DEV_HALTED, IDS_DEV_PHANTOM, IDS_DEV_SYSTEM_SHUTDOWN, IDS_DEV_HELD_FOR_EJECT, IDS_DEV_DRIVER_BLOCKED, IDS_DEV_REGISTRY_TOO_LARGE, IDS_DEV_SETPROPERTIES_FAILED};
/*************************************************************************** * NAME EXPORTED * DeviceProblemTextA * * DESCRIPTION * Gets the problem text from a problem number displayed in the properties dialog * * ARGUMENTS * hMachine: Machine handle or NULL for the local machine * DevInst: Device instance handle * uProblemId: Specifies the problem ID * lpString: Pointer to a buffer where the string is to be copied to. If the buffer * is too small, the return value is the required string length in characters, * excluding the NULL-termination. * uMaxString: Size of the buffer in characters * * RETURN VALUE * The return value is the length of the string in characters. * It returns 0 if an error occured. * * @implemented */UINTWINAPIDeviceProblemTextA(IN HMACHINE hMachine OPTIONAL, IN DEVINST dnDevInst, IN ULONG uProblemId, OUT LPSTR lpString, IN UINT uMaxString){ LPWSTR lpBuffer = NULL; UINT Ret = 0;
if (uMaxString != 0) { lpBuffer = (LPWSTR)HeapAlloc(GetProcessHeap(), 0, (uMaxString + 1) * sizeof(WCHAR)); if (lpBuffer == NULL) { SetLastError(ERROR_NOT_ENOUGH_MEMORY); return 0; } }
Ret = DeviceProblemTextW(hMachine, dnDevInst, uProblemId, lpBuffer, uMaxString);
if (lpBuffer != NULL) { if (Ret) { WideCharToMultiByte(CP_ACP, 0, lpBuffer, (int)Ret, lpString, (int)uMaxString, NULL, NULL); }
HeapFree(GetProcessHeap(), 0, lpBuffer); }
return Ret;}
/*************************************************************************** * NAME EXPORTED * DeviceProblemTextW * * DESCRIPTION * Gets the problem text from a problem number displayed in the properties dialog * * ARGUMENTS * hMachine: Machine handle or NULL for the local machine * DevInst: Device instance handle * uProblemId: Specifies the problem ID * lpString: Pointer to a buffer where the string is to be copied to. If the buffer * is too small, the return value is the required string length in characters, * excluding the NULL-termination. * uMaxString: Size of the buffer in characters * * RETURN VALUE * The return value is the length of the string in characters. * It returns 0 if an error occured. * * @implemented */UINTWINAPIDeviceProblemTextW(IN HMACHINE hMachine OPTIONAL, IN DEVINST dnDevInst, IN ULONG uProblemId, OUT LPWSTR lpString, IN UINT uMaxString){ UINT MessageId = IDS_UNKNOWN; UINT Ret = 0;
if (uProblemId < sizeof(ProblemStringId) / sizeof(ProblemStringId[0])) MessageId = ProblemStringId[uProblemId];
if (uProblemId == 0) { if (uMaxString != 0) { Ret = LoadString(hDllInstance, MessageId, lpString, (int)uMaxString); } else { Ret = (UINT)LengthOfStrResource(hDllInstance, MessageId); } } else { LPWSTR szProblem; WCHAR szInfo[] = L"FIXME"; DWORD dwRet; BOOL AdvFormat = FALSE; UINT StringIDs[] = { MessageId, IDS_DEVCODE, };
switch (uProblemId) { case CM_PROB_DEVLOADER_FAILED: { /* FIXME - if not a root bus devloader then use IDS_DEV_DEVLOADER_FAILED2 */ /* FIXME - get the type string (ie. ISAPNP, PCI or BIOS for root bus devloaders, or FLOP, ESDI, SCSI, etc for others */ AdvFormat = TRUE; break; }
case CM_PROB_DEVLOADER_NOT_FOUND: { /* FIXME - 4 cases: 1) if it's a missing system devloader: - get the system devloader name 2) if it's not a system devloader but still missing: - get the devloader name (file name?) 3) if it's not a system devloader but the file can be found: - use IDS_DEV_DEVLOADER_NOT_FOUND2 4) if it's a missing or empty software key - use IDS_DEV_DEVLOADER_NOT_FOUND3 - AdvFormat = FALSE! */ AdvFormat = TRUE; break; }
case CM_PROB_INVALID_DATA: /* FIXME - if the device isn't enumerated by the BIOS/ACPI use IDS_DEV_INVALID_DATA2 */ AdvFormat = FALSE; break;
case CM_PROB_NORMAL_CONFLICT: /* FIXME - get resource type (IRQ, DMA, Memory or I/O) */ AdvFormat = TRUE; break;
case CM_PROB_UNKNOWN_RESOURCE: /* FIXME - get the .inf file name */ AdvFormat = TRUE; break;
case CM_PROB_DISABLED: /* FIXME - if the device was disabled by the system use IDS_DEV_DISABLED2 */ break; }
if (AdvFormat) { StringIDs[1] = IDS_DEVCODE2; dwRet = LoadAndFormatStringsCat(hDllInstance, StringIDs, sizeof(StringIDs) / sizeof(StringIDs[0]), &szProblem, szInfo, uProblemId); } else { dwRet = LoadAndFormatStringsCat(hDllInstance, StringIDs, sizeof(StringIDs) / sizeof(StringIDs[0]), &szProblem, uProblemId); }
if (dwRet != 0) { if (uMaxString != 0 && uMaxString >= dwRet) { wcscpy(lpString, szProblem); }
LocalFree((HLOCAL)szProblem);
Ret = dwRet; } }
return Ret;}