You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
311 lines
7.5 KiB
311 lines
7.5 KiB
#include "cstmprop.h"
|
|
|
|
#include "hwdev.h"
|
|
#include "dtctreg.h"
|
|
|
|
#include "svcsync.h"
|
|
#include "cmmn.h"
|
|
|
|
#include "str.h"
|
|
#include "misc.h"
|
|
|
|
#include "tfids.h"
|
|
#include "dbg.h"
|
|
|
|
#define ARRAYSIZE(a) (sizeof((a))/sizeof((a)[0]))
|
|
|
|
STDMETHODIMP CHWDeviceCustomPropertiesImpl::InitFromDeviceID(
|
|
LPCWSTR pszDeviceID, DWORD dwFlags)
|
|
{
|
|
HRESULT hr;
|
|
|
|
if (pszDeviceID && *pszDeviceID)
|
|
{
|
|
if ((0 == dwFlags) || (HWDEVCUSTOMPROP_USEVOLUMEPROCESSING == dwFlags))
|
|
{
|
|
if (!_fInited)
|
|
{
|
|
CHWEventDetectorHelper::CheckDiagnosticAppPresence();
|
|
|
|
_dwFlags = dwFlags;
|
|
|
|
if (HWDEVCUSTOMPROP_USEVOLUMEPROCESSING == dwFlags)
|
|
{
|
|
DIAGNOSTIC((TEXT("[0257]Using HWDEVCUSTOMPROP_USEVOLUMEPROCESSING")));
|
|
|
|
WCHAR szDeviceIDReal[MAX_DEVICEID];
|
|
|
|
hr = _GetDeviceID(pszDeviceID, szDeviceIDReal,
|
|
ARRAYSIZE(szDeviceIDReal));
|
|
|
|
if (SUCCEEDED(hr) && (S_FALSE != hr))
|
|
{
|
|
DIAGNOSTIC((TEXT("[0258]DeviceID converted from %s to %s"), pszDeviceID, szDeviceIDReal));
|
|
|
|
hr = _GetHWDeviceInstFromVolumeIntfID(szDeviceIDReal,
|
|
&_phwdevinst, &_pelemToRelease);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
DIAGNOSTIC((TEXT("[0258]NOT using HWDEVCUSTOMPROP_USEVOLUMEPROCESSING")));
|
|
|
|
hr = _GetHWDeviceInstFromDeviceIntfID(pszDeviceID,
|
|
&_phwdevinst, &_pelemToRelease);
|
|
}
|
|
|
|
if (SUCCEEDED(hr))
|
|
{
|
|
if (S_FALSE != hr)
|
|
{
|
|
DIAGNOSTIC((TEXT("[0259]Custom Property: Initialization SUCCEEDED")));
|
|
|
|
_fInited = TRUE;
|
|
}
|
|
else
|
|
{
|
|
DIAGNOSTIC((TEXT("[0260]Custom Property: Initialization FAILED")));
|
|
hr = E_FAIL;
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
hr = E_UNEXPECTED;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
hr = E_INVALIDARG;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
hr = E_INVALIDARG;
|
|
}
|
|
|
|
return hr;
|
|
}
|
|
|
|
STDMETHODIMP CHWDeviceCustomPropertiesImpl::InitFromDevNode(
|
|
LPCWSTR pszDevNode, DWORD dwFlags)
|
|
{
|
|
HRESULT hr;
|
|
|
|
if (pszDevNode && *pszDevNode)
|
|
{
|
|
if ((0 == dwFlags))
|
|
{
|
|
if (!_fInited)
|
|
{
|
|
CHWEventDetectorHelper::CheckDiagnosticAppPresence();
|
|
|
|
_dwFlags = dwFlags;
|
|
|
|
hr = _GetHWDeviceInstFromDeviceNode(pszDevNode, &_phwdevinst,
|
|
&_pelemToRelease);
|
|
|
|
if (SUCCEEDED(hr))
|
|
{
|
|
if (S_FALSE != hr)
|
|
{
|
|
DIAGNOSTIC((TEXT("[0270]Custom Property: Initialization SUCCEEDED")));
|
|
|
|
_fInited = TRUE;
|
|
}
|
|
else
|
|
{
|
|
DIAGNOSTIC((TEXT("[0271]Custom Property: Initialization FAILED")));
|
|
hr = E_FAIL;
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
hr = E_UNEXPECTED;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
hr = E_INVALIDARG;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
hr = E_INVALIDARG;
|
|
}
|
|
|
|
return hr;
|
|
}
|
|
|
|
STDMETHODIMP CHWDeviceCustomPropertiesImpl::GetDWORDProperty(
|
|
LPCWSTR pszPropName, DWORD* pdwProp)
|
|
{
|
|
HRESULT hr;
|
|
|
|
if (_fInited)
|
|
{
|
|
*pdwProp = (DWORD)-1;
|
|
|
|
if (pszPropName && *pszPropName && pdwProp)
|
|
{
|
|
DWORD dwType;
|
|
DWORD dwProp;
|
|
|
|
hr = _GetDevicePropertyGeneric(_phwdevinst, pszPropName,
|
|
FALSE, &dwType, (PBYTE)&dwProp, sizeof(dwProp));
|
|
|
|
if (SUCCEEDED(hr) && (S_FALSE != hr))
|
|
{
|
|
if (REG_DWORD == dwType)
|
|
{
|
|
DIAGNOSTIC((TEXT("[0261]Found Property: '%s'"), pszPropName));
|
|
*pdwProp = dwProp;
|
|
}
|
|
else
|
|
{
|
|
DIAGNOSTIC((TEXT("[0262]Found Property: '%s', but NOT REG_DWORD type"), pszPropName));
|
|
hr = E_FAIL;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
hr = E_FAIL;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
hr = E_INVALIDARG;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
hr = E_UNEXPECTED;
|
|
}
|
|
|
|
return hr;
|
|
}
|
|
|
|
STDMETHODIMP CHWDeviceCustomPropertiesImpl::GetStringProperty(
|
|
LPCWSTR pszPropName, LPWSTR* ppszProp)
|
|
{
|
|
HRESULT hr;
|
|
|
|
if (_fInited)
|
|
{
|
|
if (pszPropName && *pszPropName && ppszProp)
|
|
{
|
|
DWORD dwType;
|
|
|
|
hr = _GetDevicePropertyStringNoBuf(_phwdevinst, pszPropName,
|
|
FALSE, &dwType, ppszProp);
|
|
|
|
if (SUCCEEDED(hr) && (S_FALSE != hr))
|
|
{
|
|
if (dwType != REG_SZ)
|
|
{
|
|
DIAGNOSTIC((TEXT("[0264]Found Property: '%s', but NOT REG_SZ type"), pszPropName));
|
|
CoTaskMemFree(*ppszProp);
|
|
|
|
*ppszProp = NULL;
|
|
hr = E_FAIL;
|
|
}
|
|
else
|
|
{
|
|
DIAGNOSTIC((TEXT("[0263]Found Property: '%s'"), pszPropName));
|
|
}
|
|
}
|
|
else
|
|
{
|
|
*ppszProp = NULL;
|
|
hr = E_FAIL;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
hr = E_INVALIDARG;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
hr = E_UNEXPECTED;
|
|
}
|
|
|
|
return hr;
|
|
}
|
|
|
|
STDMETHODIMP CHWDeviceCustomPropertiesImpl::GetMultiStringProperty(
|
|
LPCWSTR pszPropName, BOOL fMergeMultiSz, WORD_BLOB** ppblob)
|
|
{
|
|
HRESULT hr;
|
|
|
|
if (_fInited)
|
|
{
|
|
if (pszPropName && *pszPropName && ppblob)
|
|
{
|
|
hr = _GetDevicePropertyGenericAsMultiSz(_phwdevinst, pszPropName,
|
|
fMergeMultiSz, ppblob);
|
|
|
|
if (FAILED(hr) || (S_FALSE == hr))
|
|
{
|
|
*ppblob = NULL;
|
|
hr = E_FAIL;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
hr = E_INVALIDARG;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
hr = E_UNEXPECTED;
|
|
}
|
|
|
|
return hr;
|
|
}
|
|
|
|
STDMETHODIMP CHWDeviceCustomPropertiesImpl::GetBlobProperty(
|
|
LPCWSTR pszPropName, BYTE_BLOB** ppblob)
|
|
{
|
|
HRESULT hr;
|
|
|
|
if (_fInited)
|
|
{
|
|
if (pszPropName && *pszPropName && ppblob)
|
|
{
|
|
hr = _GetDevicePropertyGenericAsBlob(_phwdevinst, pszPropName,
|
|
ppblob);
|
|
|
|
if (FAILED(hr) || (S_FALSE == hr))
|
|
{
|
|
*ppblob = NULL;
|
|
hr = E_FAIL;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
hr = E_INVALIDARG;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
hr = E_UNEXPECTED;
|
|
}
|
|
|
|
return hr;
|
|
}
|
|
|
|
CHWDeviceCustomPropertiesImpl::CHWDeviceCustomPropertiesImpl() :
|
|
_fInited(FALSE), _pelemToRelease(NULL), _phwdevinst(NULL), _dwFlags(0)
|
|
{
|
|
_CompleteShellHWDetectionInitialization();
|
|
}
|
|
|
|
CHWDeviceCustomPropertiesImpl::~CHWDeviceCustomPropertiesImpl()
|
|
{
|
|
if (_pelemToRelease)
|
|
{
|
|
_pelemToRelease->RCRelease();
|
|
}
|
|
}
|