#include "hwdev.h" #include "setupapi.h" #include "dtctreg.h" #include "reg.h" #include "namellst.h" #include "sfstr.h" #include "str.h" #include "cmmn.h" #include "misc.h" #include "dbg.h" #define ARRAYSIZE(a) (sizeof((a))/sizeof((a)[0])) /////////////////////////////////////////////////////////////////////////////// // HRESULT CHWDeviceInst::Init(DEVINST devinst) { _devinst = devinst; return S_OK; } HRESULT CHWDeviceInst::InitInterfaceGUID(const GUID* pguidInterface) { _guidInterface = *pguidInterface; return S_OK; } HRESULT CHWDeviceInst::GetDeviceInstance(DEVINST* pdevinst) { HRESULT hr; if (_devinst) { *pdevinst = _devinst; hr = S_OK; } else { *pdevinst = 0; hr = S_FALSE; } return hr; } HRESULT CHWDeviceInst::GetPnpID(LPWSTR pszPnpID, DWORD cchPnpID) { HRESULT hr = _InitPnpInfo(); if (SUCCEEDED(hr) && (S_FALSE != hr)) { hr = SafeStrCpyN(pszPnpID, _szPnpID, cchPnpID); } else { hr = S_FALSE; } return hr; } HRESULT CHWDeviceInst::GetPnpInstID(LPWSTR pszPnpInstID, DWORD cchPnpInstID) { HRESULT hr = _InitPnpInfo(); if (SUCCEEDED(hr) && (S_FALSE != hr)) { hr = SafeStrCpyN(pszPnpInstID, _szPnpInstID, cchPnpInstID); } else { hr = S_FALSE; } return hr; } HRESULT CHWDeviceInst::GetInterfaceGUID(GUID* pguidInterface) { ASSERT(guidInvalid != _guidInterface); *pguidInterface = _guidInterface; return S_OK; } HRESULT CHWDeviceInst::IsRemovableDevice(BOOL* pfRemovable) { return _DeviceInstIsRemovable(_devinst, pfRemovable); } HRESULT CHWDeviceInst::ShouldAutoplayOnSpecialInterface( const GUID* pguidInterface, BOOL* pfShouldAutoplay) { WCHAR szGUID[MAX_GUIDSTRING]; HRESULT hr = _StringFromGUID(pguidInterface, szGUID, ARRAYSIZE(szGUID)); *pfShouldAutoplay = FALSE; if (SUCCEEDED(hr)) { WCHAR szGUIDFromReg[MAX_GUIDSTRING]; DWORD dwType; hr = _GetDevicePropertyGeneric(this, TEXT("AutoplayOnSpecialInterface"), FALSE, &dwType, (PBYTE)szGUIDFromReg, sizeof(szGUIDFromReg)); if (SUCCEEDED(hr) && (S_FALSE != hr)) { if (REG_SZ == dwType) { if (!lstrcmpi(szGUIDFromReg, szGUID)) { *pfShouldAutoplay = TRUE; } } } if (*pfShouldAutoplay) { DIAGNOSTIC((TEXT("[0314]Autoplay on Special Interface %s -> Autoplay!"), szGUID)); } else { DIAGNOSTIC((TEXT("[0315]*NO* Autoplay on Special Interface %s -> No Autoplay!"), szGUID)); } } return hr; } /////////////////////////////////////////////////////////////////////////////// // CHWDeviceInst::CHWDeviceInst() : _devinst(0), _guidInterface(guidInvalid), _fFriendlyNameInited(FALSE) {} CHWDeviceInst::~CHWDeviceInst() {} /////////////////////////////////////////////////////////////////////////////// // HRESULT CHWDeviceInst::_InitPnpInfo() { HRESULT hres; // This require the _devinst to be set if (0 != _devinst) { hres = _InitPnpIDAndPnpInstID(); if (FAILED(hres)) { // Probably not a removable device hres = S_FALSE; } hres = _InitFriendlyName(); } else { hres = S_FALSE; } return hres; } HRESULT CHWDeviceInst::_InitFriendlyName() { HRESULT hres; if (!_fFriendlyNameInited) { hres = S_FALSE; DWORD cb = sizeof(_szFriendlyName); CONFIGRET cr = CM_Get_DevNode_Registry_Property_Ex(_devinst, CM_DRP_FRIENDLYNAME, NULL, _szFriendlyName, &cb, 0, NULL); if (CR_SUCCESS == cr) { hres = S_OK; } else { cb = sizeof(_szFriendlyName); cr = CM_Get_DevNode_Registry_Property_Ex(_devinst, CM_DRP_DEVICEDESC, NULL, _szFriendlyName, &cb, 0, NULL); if (CR_SUCCESS == cr) { hres = S_OK; } else { _szFriendlyName[0] = 0; } } _fFriendlyNameInited = TRUE; } else { if (!_szFriendlyName[0]) { hres = S_FALSE; } else { hres = S_OK; } } return hres; } HRESULT _FindInstID(LPWSTR pszPnpID, DWORD* pcch) { DWORD cToFind = 2; LPWSTR psz = pszPnpID; *pcch = 0; while (*psz && cToFind) { if ((TEXT('\\') == *psz)) { --cToFind; } if (cToFind) { ++psz; } } if (*psz) { *pcch = (DWORD)(psz - pszPnpID); } return S_OK; } HRESULT _GetPnpIDHelper(DEVINST devinst, LPWSTR pszPnpID, DWORD cchPnpID) { HRESULT hres = S_FALSE; HMACHINE hMachine = NULL; CONFIGRET cr = CM_Get_Device_ID_Ex(devinst, pszPnpID, cchPnpID, 0, hMachine); if (CR_SUCCESS == cr) { hres = S_OK; } return hres; } HRESULT CHWDeviceInst::_InitPnpIDAndPnpInstID() { HRESULT hres = _GetPnpIDHelper(_devinst, _szPnpID, ARRAYSIZE(_szPnpID)); if (SUCCEEDED(hres) && (S_FALSE != hres)) { DWORD cchInstIDOffset; hres = _FindInstID(_szPnpID, &cchInstIDOffset); if (SUCCEEDED(hres)) { *(_szPnpID + cchInstIDOffset) = 0; hres = SafeStrCpyN(_szPnpInstID, _szPnpID + cchInstIDOffset + 1, ARRAYSIZE(_szPnpInstID)); } } return hres; }