도우미 메서드를 구현하기 위한 코드 예제
중요
WSD 챌린저 기능은 더 이상 사용되지 않으며 모든 WSD 챌린저 관련 설명서는 이전 버전 설명서에 보관됩니다.
다음 코드 예제에서는 WSD Challenge 인터페이스를 초기화하고 디바이스 챌린지를 등록하는 데 사용되는 도우미 메서드의 구현을 보여 줍니다.
/**************************************************************************\
* CWSDDevice::InitializeChallengeInterface
*
* Initializes the WSD challenge API interface
*
* Arguments:
*
* None
*
* Return Value:
*
* S_OK if operation is successful, an error HRESULT otherwise
*
\**************************************************************************/
HRESULT
CWSDDevice::InitializeChallengeInterface()
{
HRESULT hr = S_OK;
DWORD dwErr = NO_ERROR;
WCHAR wszDllPath[MAX_PATH + 1] = {0} ;
//
// Reset the previous initialization, if any
//
if (m_pfnRegisterDeviceToChallenge)
{
UnInitializeChallengeInterface();
}
//
// Set up the path name for the WSD Challenge DLL
//
if (!GetSystemDirectory(wszDllPath, sizeof(wszDllPath) / sizeof(wszDllPath[0])))
{
dwErr = ::GetLastError();
hr = HRESULT_FROM_WIN32(dwErr);
if (SUCCEEDED(hr))
{
hr = E_FAIL;
}
WIAS_ERROR((g_hInst, "GetSystemDirectory failed (0x%08X), hr = 0x%08X", dwErr, hr));
}
if (SUCCEEDED(hr))
{
hr = StringCbCat(wszDllPath, sizeof(wszDllPath), WSDCHNGR_DLL_NAME);
if (FAILED(hr))
{
WIAS_ERROR((g_hInst, "StringCbCat(%ws, %ws) failed, hr = 0x%08X", wszDllPath, WSDCHNGR_DLL_NAME, hr));
}
}
//
// Load the WSD Challenge DLL
//
if (SUCCEEDED(hr))
{
m_hChallengeDll = LoadLibrary(wszDllPath);
if (!m_hChallengeDll)
{
dwErr = ::GetLastError();
hr = HRESULT_FROM_WIN32(dwErr);
if (SUCCEEDED(hr))
{
hr = E_FAIL;
}
WIAS_ERROR((g_hInst, "LoadLibrary(%ws) failed (0x%08X), hr = 0x%08X", wszDllPath, dwErr, hr));
}
}
//
// Find the WSDCHNGRInitialize API
//
if (SUCCEEDED(hr))
{
m_pfnInitializeChallenge = (PFN_WSDCHNR_INITIALIZE)GetProcAddress(m_hChallengeDll, WSDCHNR_INITIALIZE);
if (!m_pfnInitializeChallenge)
{
dwErr = ::GetLastError();
hr = HRESULT_FROM_WIN32(dwErr);
if (SUCCEEDED(hr))
{
hr = E_FAIL;
}
WIAS_ERROR((g_hInst, "GetProcAddress(%s) failed (0x%08X), hr = 0x%08X", WSDCHNR_INITIALIZE, dwErr, hr));
}
}
//
// Find the WSDCHNGRShutdown API
//
if (SUCCEEDED(hr))
{
m_pfnShutdownChallenge = (PFN_WSDCHNR_SHUTDOWN)GetProcAddress(m_hChallengeDll, WSDCHNR_SHUTDOWN);
if (!m_pfnShutdownChallenge)
{
dwErr = ::GetLastError();
hr = HRESULT_FROM_WIN32(dwErr);
if (SUCCEEDED(hr))
{
hr = E_FAIL;
}
WIAS_ERROR((g_hInst, "GetProcAddress(%s) failed (0x%08X), hr = 0x%08X", WSDCHNR_SHUTDOWN, dwErr, hr));
}
}
//
// Find the WSDCHNGRRegisterDeviceToChallenge API
//
if (SUCCEEDED(hr))
{
m_pfnRegisterDeviceToChallenge = (PFN_WSDCHNR_REGISTER_DEVICE_TO_CHALLENGE)
GetProcAddress(m_hChallengeDll, WSDCHNR_REGISTER_DEVICE_TO_CHALLENGE);
if (!m_pfnRegisterDeviceToChallenge)
{
dwErr = ::GetLastError();
hr = HRESULT_FROM_WIN32(dwErr);
if (SUCCEEDED(hr))
{
hr = E_FAIL;
}
WIAS_ERROR((g_hInst, "GetProcAddress(%s) failed (0x%08X), hr = 0x%08X", WSDCHNR_REGISTER_DEVICE_TO_CHALLENGE, dwErr, hr));
}
}
//
// Call WSDCHNGRInitialize
//
if (SUCCEEDED(hr))
{
hr = (*m_pfnInitializeChallenge)();
if (FAILED(hr))
{
WIAS_ERROR((g_hInst, "WSDCHNGRInitialize failed, hr = 0x%08X", hr));
}
}
if (FAILED(hr))
{
UnInitializeChallengeInterface();
}
return hr;
}
/**************************************************************************\
* CWSDDevice::UnInitializeChallengeInterface
*
* Uninitializes the WSD challenge API interface
*
* Arguments:
*
* None
*
* Return Value:
*
* S_OK if operation is successful, an error HRESULT otherwise
*
\**************************************************************************/
void
CWSDDevice::UnInitializeChallengeInterface()
{
HRESULT hr = S_OK;
if ((m_hChallengeDll) && (m_pfnShutdownChallenge))
{
hr = (*m_pfnShutdownChallenge)();
if (FAILED(hr))
{
WIAS_ERROR((g_hInst, "WSDCHNGRShutdown failed, hr = 0x%08X", hr));
}
}
if (m_hChallengeDll)
{
FreeLibrary(m_hChallengeDll);
m_hChallengeDll = NULL;
}
m_pfnRegisterDeviceToChallenge = NULL;
m_pfnInitializeChallenge = NULL;
m_pfnShutdownChallenge = NULL;
return;
}
/**************************************************************************\
* CWSDDevice::RegisterDeviceToChallenge
*
* Registers the device to be challenged by WSDCHNGR.DLL
*
* Arguments:
*
* None
*
* Return Value:
*
* S_OK if operation is successful or the challenge interface is disabled,
* S_FALSE if the device is already registered, an error HRESULT otherwise
*
\**************************************************************************/
HRESULT
CWSDDevice::RegisterDeviceToChallenge()
{
HRESULT hr = S_OK;
if (!m_pFunctionInstance)
{
hr = E_POINTER;
WIAS_ERROR((g_hInst, "Invalid IFunctionInstance pointer, hr = 0x%08X", hr));
}
if (SUCCEEDED(hr))
{
if (m_pfnRegisterDeviceToChallenge)
{
WIAS_TRACE((g_hInst, "Registering device to challenge.."));
hr = (*m_pfnRegisterDeviceToChallenge)(m_pFunctionInstance);
if (FAILED(hr))
{
WIAS_ERROR((g_hInst, "WSDCHNGRRegisterDeviceToChallenge failed, hr = 0x%08X", hr));
}
}
else
{
WIAS_TRACE((g_hInst, "Challenge interface disabled or not initialized, hr = 0x%08X", hr));
}
}
if (S_OK == hr)
{
//
// WSDCHNGRRegisterDeviceToChallenge returns S_FALSE when the device is already registered
//
WIAS_TRACE((g_hInst, "Device registered to challenge"));
DoTraceMessage(WSDSCDRV_TRC, L"Device registered to challenge");
}
return hr;
}