summaryrefslogtreecommitdiff
path: root/network/wlan/ihvsampleui/IHVSampleExtUI.cpp
diff options
context:
space:
mode:
authorDave Wilson <[email protected]>2015-03-17 19:50:07 -0700
committerDave Wilson <[email protected]>2015-03-17 19:50:07 -0700
commit97cf5197cf5b882b2c689d8dc2b555f2edf8f418 (patch)
tree46f3701832d70b420eb0fc0eb93261f9da45db3f /network/wlan/ihvsampleui/IHVSampleExtUI.cpp
parentef1905bf1e8825bb31120dfb27e0daf3154d859a (diff)
Initial publish
Diffstat (limited to 'network/wlan/ihvsampleui/IHVSampleExtUI.cpp')
-rw-r--r--network/wlan/ihvsampleui/IHVSampleExtUI.cpp971
1 files changed, 971 insertions, 0 deletions
diff --git a/network/wlan/ihvsampleui/IHVSampleExtUI.cpp b/network/wlan/ihvsampleui/IHVSampleExtUI.cpp
new file mode 100644
index 00000000..a5e60d7a
--- /dev/null
+++ b/network/wlan/ihvsampleui/IHVSampleExtUI.cpp
@@ -0,0 +1,971 @@
+//
+// Copyright (C) Microsoft Corporation 2005
+// IHV UI Extension sample
+//
+
+#include "precomp.h"
+#include "ihvsample_i.c"
+
+extern HINSTANCE g_hInst;
+
+LPWSTR g_IHVAuthFriendlyName[] = {
+ L"IHVAuth V1",
+ L"IHVAuth V2",
+ L"IHVAuth V3"
+};
+
+LPWSTR g_IHVCipherFriendlyName[] = {
+ L"None",
+ L"IHVCipher 1",
+ L"IHVCipher 2",
+ L"IHVCipher 3"
+};
+
+IHV_AUTH_CIPHER_CAPABILITY g_IHVOneXExtCapability =
+{
+ 3,
+ {
+ {
+ IHVAuthV1,
+ 1,
+ {IHVCipher1}
+ },
+ {
+ IHVAuthV2,
+ 3,
+ {None, IHVCipher1, IHVCipher2}
+ },
+ {
+ IHVAuthV3,
+ 2,
+ {IHVCipher2, IHVCipher3}
+ }
+ }
+};
+
+
+static const WCHAR c_szIhvUIRequest[] = L"_UI_Request";
+static const WCHAR c_szIhvUIResponse[] = L"_UI_Response";
+
+template<typename T>
+T* GetThis(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
+{
+ static const WCHAR c_szThisPointer[]= L"_Win32_this_";
+ UNREFERENCED_PARAMETER(wParam);
+
+ T* pThis = NULL;
+ if (uMsg == WM_INITDIALOG)
+ {
+ if (sizeof(PROPSHEETPAGE) == ((LPPROPSHEETPAGE)lParam)->dwSize)
+ {
+ // This corresponds to MSDN
+ pThis = (T *)((LPPROPSHEETPAGE)lParam)->lParam;
+ }
+ else
+ {
+ // TODO: Need to determine when this abnormality happens...
+ pThis = (T *)lParam;
+ }
+
+ SetProp(hwnd, c_szThisPointer, (HANDLE)pThis);
+
+ }
+ else if (uMsg == WM_DESTROY)
+ {
+ RemoveProp(hwnd, c_szThisPointer);
+ }
+ else
+ {
+ pThis = (T *)GetProp(hwnd, c_szThisPointer);
+ }
+
+ return pThis;
+}
+
+
+CDot11SampleExtUI::CDot11SampleExtUI(): m_crefCount(0)
+{
+ InterlockedIncrement(&g_objRefCount);
+
+ m_pUnkSite = NULL;
+ m_hFirstPagePsp = NULL;
+ m_hLastPagePsp = NULL;
+ m_pUIRequest = NULL;
+}
+
+CDot11SampleExtUI::~CDot11SampleExtUI()
+{
+ InterlockedDecrement(&g_objRefCount);
+
+ if( m_pUIRequest)
+ {
+ delete m_pUIRequest;
+ }
+
+ if( m_pUnkSite)
+ {
+ m_pUnkSite ->Release();
+ m_pUnkSite = NULL;
+ }
+}
+
+// Used to get the IHV friendly name
+STDMETHODIMP
+CDot11SampleExtUI::GetDot11ExtUIFriendlyName(
+ BSTR* bstrFriendlyName)
+{
+ HRESULT hr = E_INVALIDARG;
+
+ if (NULL != bstrFriendlyName)
+ {
+ *bstrFriendlyName = SysAllocString(IHV_SAMPLE_IHV_NAME);
+ hr = S_OK;
+ }
+
+ return hr;
+}
+
+
+// Returns the requested property type
+STDMETHODIMP
+CDot11SampleExtUI::GetDot11ExtUIProperties(
+ DOT11_EXT_UI_PROPERTY_TYPE ExtType,
+ ULONG *pcExtensions,
+ IDot11ExtUIProperty **ppDot11ExtUIProperty
+ )
+{
+ HRESULT hr = S_OK;
+ if (!pcExtensions || !ppDot11ExtUIProperty)
+ {
+ hr = E_INVALIDARG;
+ goto error;
+ }
+
+ // Initialize the out parameters
+ *pcExtensions = 0;
+ *ppDot11ExtUIProperty = NULL;
+
+ switch(ExtType)
+ {
+ case DOT11_EXT_UI_CONNECTION:
+ hr = CreateConnectionProperties(pcExtensions, ppDot11ExtUIProperty);
+ break;
+
+ case DOT11_EXT_UI_SECURITY:
+ hr = CreateSecurityProperties(pcExtensions, ppDot11ExtUIProperty);
+ break;
+
+ case DOT11_EXT_UI_KEYEXTENSION:
+ hr = CreateKeyProperties(pcExtensions, ppDot11ExtUIProperty);
+ break;
+
+ default:
+ hr = E_NOTIMPL;
+ break;
+ }
+
+error:
+ return hr;
+}
+
+#define IHV_BALLOON_TEXT L"Please enter key information"
+
+STDMETHODIMP
+CDot11SampleExtUI::GetDot11ExtUIBalloonText(
+ BSTR pIHVUIRequest, // the UI request structure from IHV
+ BSTR* pwszBalloonText // the balloon text to be displayed
+ )
+{
+ HRESULT hr = E_INVALIDARG;
+ PDOT11EXT_IHV_UI_REQUEST pIhvUiRequest = (PDOT11EXT_IHV_UI_REQUEST) pIHVUIRequest;
+
+ if (NULL != pwszBalloonText)
+ {
+ // Ihv could choose to parse the UI request data here ...
+ UNREFERENCED_PARAMETER( pIhvUiRequest );
+
+ *pwszBalloonText = SysAllocString( IHV_BALLOON_TEXT );
+ hr = S_OK;
+ }
+
+ return hr;
+}
+
+
+
+HRESULT
+CDot11SampleExtUI::CreateConnectionProperties(
+ ULONG *pcExtensions,
+ IDot11ExtUIProperty **ppDot11ExtUIProperty
+ )
+{
+ HRESULT hr = ERROR_SUCCESS;
+ BSTR strName = NULL;
+ ULONG uCount = 0;
+
+ IDot11SampleExtUIConProperty **pprgProps = NULL;
+
+ uCount = PROP_COUNT_CONNECTION;
+ pprgProps = (IDot11SampleExtUIConProperty**)
+ CoTaskMemAlloc(sizeof(IDot11SampleExtUIConProperty*) * uCount);
+
+ if (!pprgProps)
+ {
+ hr = E_UNEXPECTED;
+ goto error;
+ }
+
+ // Since we just have one property of each, we'll
+ // create one interface first and initialize it separately
+ IDot11SampleExtUIConProperty *pTempIProp = NULL;
+ hr = CoCreateInstance(
+ GUID_SAMPLE_IHVUI_CLSID,
+ NULL,
+ CLSCTX_INPROC,
+ IID_IDot11SampleExtUIConProperty,
+ (PVOID*)&pTempIProp
+ );
+
+ if (FAILED(hr))
+ {
+ goto error;
+ }
+
+ // this will probably never be displayed
+ strName = SysAllocString(L"IHV Connection Settings");
+ hr = pTempIProp->Initialize(strName);
+ pprgProps[0] = pTempIProp;
+
+ if (SUCCEEDED(hr))
+ {
+ *pcExtensions = uCount;
+ *ppDot11ExtUIProperty = (IDot11ExtUIProperty*)pprgProps;
+
+ // Set the current pointer to NULL so it doesn't get freed at the bottom
+ pprgProps = NULL;
+ }
+
+error:
+ if (FAILED(hr) && pprgProps)
+ {
+ CoTaskMemFree(pprgProps);
+ pprgProps = NULL;
+ }
+ SysFreeString(strName);
+ return hr;
+}
+
+HRESULT
+CDot11SampleExtUI::CreateSecurityProperties(
+ ULONG *pcExtensions,
+ IDot11ExtUIProperty **ppDot11ExtUIProperty
+ )
+{
+ HRESULT hr = ERROR_SUCCESS;
+ BSTR strName = NULL;
+ ULONG uCount = 0;
+ DWORD i = 0;
+ WCHAR wbuf[128];
+
+ IDot11SampleExtUISecProperty **pprgProps = NULL;
+
+ uCount = PROP_COUNT_SECURITY;
+ pprgProps = (IDot11SampleExtUISecProperty**)
+ CoTaskMemAlloc(sizeof(IDot11SampleExtUISecProperty*) * uCount);
+
+ if (!pprgProps)
+ {
+ hr = E_UNEXPECTED;
+ goto error;
+ }
+
+ // Since we just have one property of each, we'll
+ // create one interface first and initialize it separately
+ IDot11SampleExtUISecProperty *pTempIProp = NULL;
+
+ for (i = 0; i < uCount; ++i)
+ {
+ ZeroMemory(
+ wbuf,
+ 128
+ );
+ pTempIProp = NULL;
+ SysFreeString(strName);
+ strName = NULL;
+
+ hr = CoCreateInstance(
+ GUID_SAMPLE_IHVUI_CLSID,
+ NULL,
+ CLSCTX_INPROC,
+ IID_IDot11SampleExtUISecProperty,
+ (PVOID*)&pTempIProp
+ );
+
+ if (FAILED(hr))
+ {
+ continue;
+ }
+
+ StringCchPrintf(
+ wbuf,
+ 128,
+ wstrSecurityTypes[i]
+ );
+
+ strName = SysAllocString(wbuf);
+ hr = pTempIProp->Initialize(strName, i);
+ pprgProps[i] = pTempIProp;
+ }
+
+ if (SUCCEEDED(hr))
+ {
+ *pcExtensions = uCount;
+ *ppDot11ExtUIProperty = (IDot11ExtUIProperty*)pprgProps;
+
+ // Set the current pointer to NULL so it doesn't get freed at the bottom
+ pprgProps = NULL;
+ }
+
+error:
+ if (FAILED(hr) && pprgProps)
+ {
+ CoTaskMemFree(pprgProps);
+ pprgProps = NULL;
+ }
+ SysFreeString(strName);
+ return hr;
+}
+
+HRESULT
+CDot11SampleExtUI::CreateKeyProperties(
+ ULONG *pcExtensions,
+ IDot11ExtUIProperty **ppDot11ExtUIProperty
+ )
+{
+ HRESULT hr = ERROR_SUCCESS;
+ BSTR strName = NULL;
+ ULONG uCount = 0;
+ DWORD i = 0;
+ WCHAR wbuf[128];
+ IDot11SampleExtUIKeyProperty **pprgProps = NULL;
+
+ uCount = g_IHVOneXExtCapability.dwAuthCount;
+
+ pprgProps = (IDot11SampleExtUIKeyProperty**)
+ CoTaskMemAlloc(sizeof(IDot11SampleExtUIKeyProperty*) * uCount);
+
+ if (!pprgProps)
+ {
+ hr = E_UNEXPECTED;
+ goto error;
+ }
+
+ // Since we just have one property of each, we'll
+ // create one interface first and initialize it separately
+ IDot11SampleExtUIKeyProperty *pTempIProp = NULL;
+
+ for (i = 0; i < uCount; ++i)
+ {
+ ZeroMemory(
+ wbuf,
+ 128
+ );
+ pTempIProp = NULL;
+ SysFreeString(strName);
+ strName = NULL;
+
+ hr = CoCreateInstance(
+ GUID_SAMPLE_IHVUI_CLSID,
+ NULL,
+ CLSCTX_INPROC,
+ IID_IDot11SampleExtUIKeyProperty,
+ (PVOID*)&pTempIProp
+ );
+
+ if (FAILED(hr))
+ {
+ continue;
+ }
+
+ StringCchPrintf(
+ wbuf,
+ 128,
+ g_IHVAuthFriendlyName[g_IHVOneXExtCapability.IhvAuthCiphers[i].IHVAuth]
+ );
+
+ strName = SysAllocString(wbuf);
+ hr = pTempIProp->Initialize((BYTE *) &(g_IHVOneXExtCapability.IhvAuthCiphers[i]));
+ pprgProps[i] = pTempIProp;
+ }
+
+ if (SUCCEEDED(hr))
+ {
+ *pcExtensions = uCount;
+ *ppDot11ExtUIProperty = (IDot11ExtUIProperty*)pprgProps;
+
+ // Set the current pointer to NULL so it doesn't get freed at the bottom
+ pprgProps = NULL;
+ }
+
+error:
+ if (FAILED(hr) && pprgProps)
+ {
+ CoTaskMemFree(pprgProps);
+ pprgProps = NULL;
+ }
+ SysFreeString(strName);
+ return hr;
+}
+
+
+HRESULT
+CDot11SampleExtUI::FinalConstruct()
+{
+ m_pUnkSite = NULL;
+ m_hFirstPagePsp = NULL;
+ m_hLastPagePsp = NULL;
+ m_pUIRequest = NULL;
+
+ return S_OK;
+}
+
+VOID
+CDot11SampleExtUI::FinalRelease()
+{
+ if( m_pUnkSite)
+ {
+ m_pUnkSite ->Release();
+ m_pUnkSite = NULL;
+ }
+
+ if( m_pUIRequest)
+ {
+ delete m_pUIRequest;
+ m_pUIRequest = NULL;
+ }
+
+}
+
+// IObjectWithSite
+STDMETHODIMP
+CDot11SampleExtUI::SetSite (
+ IUnknown* pUnkSite
+ )
+{
+ if( m_pUnkSite)
+ m_pUnkSite ->Release();
+
+ m_pUnkSite = pUnkSite;
+
+ if( m_pUnkSite)
+ m_pUnkSite ->AddRef();
+
+ return S_OK;
+}
+
+STDMETHODIMP
+CDot11SampleExtUI::GetSite (
+ REFIID riid,
+ void** ppvSite
+ )
+{
+ *ppvSite = NULL;
+
+ if( m_pUnkSite == NULL)
+ return E_FAIL;
+
+ return m_pUnkSite ->QueryInterface(riid, ppvSite);
+}
+
+//IWizardExtension
+STDMETHODIMP CDot11SampleExtUI::AddPages (
+ HPROPSHEETPAGE* aPages,
+ UINT cPages,
+ UINT *pnPagesAdded
+ )
+{
+ IPropertyBag *pIPropertyBag = NULL;
+
+ UNREFERENCED_PARAMETER(cPages);
+
+ HRESULT hr = m_pUnkSite->QueryInterface(IID_IPropertyBag,
+ (VOID **)&pIPropertyBag);
+ if (SUCCEEDED(hr))
+ {
+ VARIANT v;
+ VariantInit(&v);
+
+ WCHAR ihvKeyName[IHV_KEY_LENGTH];
+ GetClsidPropertyName (
+ & GUID_SAMPLE_IHVUI_CLSID,
+ (LPWSTR) c_szIhvUIRequest,
+ ihvKeyName,
+ IHV_KEY_LENGTH
+ );
+ hr = pIPropertyBag->Read(
+ ihvKeyName,
+ &v,
+ NULL);
+
+ if (SUCCEEDED(hr) && (VT_BSTR == V_VT(&v)))
+ {
+ if( m_pUIRequest == NULL)
+ {
+ m_pUIRequest = new(std::nothrow) IHV_UI_REQUEST;
+ if (m_pUIRequest == NULL)
+ {
+ VariantClear(&v);
+ pIPropertyBag->Release();
+ return E_OUTOFMEMORY;
+ }
+ }
+ memcpy(m_pUIRequest, v.bstrVal, sizeof(IHV_UI_REQUEST));
+ }
+
+ VariantClear(&v);
+
+ pIPropertyBag->Release();
+ }
+
+ ////////////////
+
+ *pnPagesAdded = 0;
+
+ PROPSHEETPAGE psp = {0};
+
+ psp.dwSize = sizeof( psp);
+ psp.hInstance = g_hInst;
+ psp.dwFlags = PSP_DEFAULT | PSP_USETITLE | PSP_USEHEADERTITLE;
+ psp.lParam = (LPARAM) this;
+
+ psp.pszTemplate = MAKEINTRESOURCE(IDD_DIALOG_SHOWHELP);
+ psp.pfnDlgProc = (DLGPROC) CDot11SampleExtUI::HelpDlgProc;
+ psp.pszHeaderTitle = MAKEINTRESOURCE( IDS_TITLE_SHOWHELP);
+ m_hFirstPagePsp = CreatePropertySheetPage(& psp);
+
+ psp.pszTemplate = MAKEINTRESOURCE(IDD_DIALOG_GETKEY);
+ psp.pfnDlgProc = (DLGPROC) CDot11SampleExtUI::GetKeyDlgProc;
+ psp.pszHeaderTitle = MAKEINTRESOURCE( IDS_TITLE_GETKEY);
+ HPROPSHEETPAGE hPsp= CreatePropertySheetPage(& psp);
+
+ psp.pszTemplate = MAKEINTRESOURCE(IDD_DIALOG_LASTPAGE);
+ psp.pfnDlgProc = (DLGPROC) CDot11SampleExtUI::LastPageDlgProc;
+ psp.pszHeaderTitle = MAKEINTRESOURCE( IDS_TITLE_LASTPAGE);
+ m_hLastPagePsp = CreatePropertySheetPage(& psp);
+
+ if( m_hFirstPagePsp
+ && hPsp
+ && m_hLastPagePsp)
+ {
+ aPages[0] = m_hFirstPagePsp;
+ aPages[1] = hPsp;
+ aPages[2] = m_hLastPagePsp;
+
+ *pnPagesAdded = 3;
+
+ return S_OK;
+ }
+ else
+ {
+ if(m_hFirstPagePsp)
+ {
+ DestroyPropertySheetPage(m_hFirstPagePsp);
+ }
+
+ if(hPsp)
+ {
+ DestroyPropertySheetPage(hPsp);
+ }
+
+ if(m_hLastPagePsp)
+ {
+ DestroyPropertySheetPage(m_hLastPagePsp);
+ }
+
+ m_hFirstPagePsp = hPsp = m_hLastPagePsp = NULL;
+
+ return E_FAIL;
+ }
+}
+
+STDMETHODIMP CDot11SampleExtUI::GetFirstPage (
+ HPROPSHEETPAGE *phpage
+ )
+{
+ *phpage = m_hFirstPagePsp;
+ return S_OK;
+}
+
+STDMETHODIMP
+CDot11SampleExtUI::GetLastPage (HPROPSHEETPAGE *phpage)
+{
+ * phpage = m_hLastPagePsp;
+ return S_OK;
+}
+
+
+BOOL CALLBACK
+CDot11SampleExtUI::HelpDlgProc (
+ HWND hwndDlg,
+ UINT uMsg,
+ WPARAM wParam,
+ LPARAM lParam
+ )
+{
+ CDot11SampleExtUI* pthis = NULL;
+
+ switch (uMsg)
+ {
+
+ case WM_INITDIALOG:
+ {
+ pthis = GetThis<CDot11SampleExtUI>(hwndDlg, uMsg, wParam, lParam);
+ if(pthis && pthis->m_pUIRequest)
+ {
+ //
+ // Convert the ANSI string into a WCHAR string and display it
+ //
+ int iBufferSize = MultiByteToWideChar(CP_ACP, 0, pthis->m_pUIRequest->title, -1, NULL, 0);
+ if (iBufferSize > 0)
+ {
+ WCHAR *pwszBuffer = new WCHAR[iBufferSize];
+
+ if (NULL != pwszBuffer)
+ {
+ pwszBuffer[0] = 0;
+
+ (VOID)MultiByteToWideChar(CP_ACP, 0, pthis->m_pUIRequest->title, -1, pwszBuffer, iBufferSize);
+
+ SetDlgItemText(hwndDlg, IDC_EDIT_HELPER, pwszBuffer);
+
+ delete[] pwszBuffer;
+ }
+ }
+ }
+ }
+ return TRUE;
+
+ case WM_DESTROY:
+ {
+ // Don't release our properties here, wait
+ // rather for Abort or Commit event notifications.
+ // Then we will have the same values when resurrected.
+ }
+ return TRUE;
+
+ case WM_NOTIFY:
+ {
+ LPNMHDR pnmh = (LPNMHDR) lParam;
+ switch (pnmh->code)
+ {
+
+ case PSN_SETACTIVE :
+ PropSheet_SetWizButtons(GetParent(hwndDlg), PSWIZB_NEXT);
+ return TRUE;
+
+ case PSN_QUERYCANCEL:
+ {
+ IWizardSite *pIWizardSite = NULL;
+ HRESULT hr = S_OK;
+
+ pthis = GetThis<CDot11SampleExtUI>(hwndDlg, uMsg, wParam, lParam);
+ if(pthis != NULL)
+ {
+ hr = pthis->m_pUnkSite->QueryInterface(IID_IWizardSite, (VOID **)&pIWizardSite);
+ if (SUCCEEDED(hr))
+ {
+ HPROPSHEETPAGE hpage = NULL;
+
+ hr = pIWizardSite->GetCancelledPage(&hpage);
+ if (SUCCEEDED(hr))
+ {
+ PropSheet_SetCurSel(GetParent(hwndDlg), hpage, 0);
+ }
+ pIWizardSite->Release();
+ }
+ }
+ }
+ return TRUE;
+ }
+ }
+ return FALSE;
+ }
+ return FALSE;
+
+}
+
+BOOL CALLBACK
+CDot11SampleExtUI::GetKeyDlgProc (
+ HWND hwndDlg,
+ UINT uMsg,
+ WPARAM wParam,
+ LPARAM lParam
+ )
+
+{
+ CDot11SampleExtUI* pthis = NULL;
+
+ switch (uMsg)
+ {
+ case WM_INITDIALOG:
+ {
+ (VOID)GetThis<CDot11SampleExtUI>(hwndDlg, uMsg, wParam, lParam);
+ }
+ return TRUE;
+
+ case WM_DESTROY:
+ {
+ // Don't release our properties here, wait
+ // rather for Abort or Commit event notifications.
+ // Then we will have the same values when resurrected.
+ }
+ return TRUE;
+
+ case WM_NOTIFY:
+ {
+ LPNMHDR pnmh = (LPNMHDR) lParam;
+ switch (pnmh->code)
+ {
+ case PSN_SETACTIVE :
+
+ PropSheet_SetWizButtons(GetParent(hwndDlg), PSWIZB_BACK | PSWIZB_NEXT);
+ return TRUE;
+
+ case PSN_WIZNEXT :
+ {
+ WCHAR szBuffer[50 + 1] = {0};
+ HRESULT hr = S_OK;
+ IPropertyBag *pIPropertyBag = NULL;
+
+ GetDlgItemText(hwndDlg, IDC_EDIT_KEY, szBuffer, 50);
+ pthis = GetThis<CDot11SampleExtUI>(hwndDlg, uMsg, wParam, lParam);
+
+ if(pthis)
+ {
+ hr = pthis->m_pUnkSite->QueryInterface(IID_IPropertyBag, (VOID **)&pIPropertyBag);
+ if (SUCCEEDED(hr))
+ {
+ VARIANT v;
+ VariantInit(&v);
+
+ WCHAR ihvKeyName[IHV_KEY_LENGTH] = {0};
+ pthis->GetClsidPropertyName(
+ &GUID_SAMPLE_IHVUI_CLSID,
+ (LPWSTR) c_szIhvUIResponse,
+ ihvKeyName,
+ IHV_KEY_LENGTH
+ );
+
+ // Make sure we remove the previous property if any
+ hr = pIPropertyBag->Read(ihvKeyName, &v, NULL);
+
+ VariantClear(&v);
+ V_VT(&v) = VT_BSTR;
+ v.bstrVal = SysAllocStringByteLen((LPCSTR)szBuffer, IHV_KEY_LENGTH);
+
+ // Write the updated property if any
+ hr = pIPropertyBag->Write(ihvKeyName, &v);
+ pIPropertyBag->Release();
+
+ //
+ // hr is not used below
+ //
+ hr;
+ }
+ }
+ }
+ return TRUE;
+
+ case PSN_QUERYCANCEL:
+ {
+ IWizardSite *pIWizardSite = NULL;
+ HRESULT hr = S_OK;
+
+ pthis = GetThis<CDot11SampleExtUI>(hwndDlg, uMsg, wParam, lParam);
+
+ if(pthis)
+ {
+ hr = pthis->m_pUnkSite->QueryInterface(IID_IWizardSite,(VOID **)&pIWizardSite);
+ if (SUCCEEDED(hr))
+ {
+ HPROPSHEETPAGE hpage = NULL;
+ hr = pIWizardSite->GetCancelledPage(&hpage);
+ if (SUCCEEDED(hr))
+ {
+ PropSheet_SetCurSel(GetParent(hwndDlg), hpage, 0);
+ }
+ pIWizardSite->Release();
+ }
+ }
+ }
+ return TRUE;
+ }
+ }
+ return FALSE;
+ }
+ return FALSE;
+
+}
+
+BOOL CALLBACK
+CDot11SampleExtUI::LastPageDlgProc(
+ HWND hwndDlg,
+ UINT uMsg,
+ WPARAM wParam,
+ LPARAM lParam
+ )
+{
+ CDot11SampleExtUI* pthis = NULL;
+
+ switch (uMsg)
+ {
+ case WM_INITDIALOG:
+ {
+ (VOID)GetThis<CDot11SampleExtUI>(hwndDlg, uMsg, wParam, lParam);
+ }
+ return TRUE;
+
+ case WM_DESTROY:
+ {
+ (VOID)GetThis<CDot11SampleExtUI>(hwndDlg, uMsg, wParam, lParam);
+ }
+ return TRUE;
+
+ case WM_NOTIFY:
+ {
+ LPNMHDR pnmh = (LPNMHDR) lParam;
+ switch (pnmh->code)
+ {
+ case PSN_SETACTIVE :
+ PropSheet_SetWizButtons(GetParent(hwndDlg), PSWIZB_BACK | PSWIZB_NEXT);
+ return TRUE;
+
+ case PSN_WIZNEXT :
+ {
+ IWizardSite *pIWizardSite = NULL;
+ HRESULT hr = S_OK;
+
+ pthis = GetThis<CDot11SampleExtUI>(hwndDlg, uMsg, wParam, lParam);
+ if(pthis)
+ {
+ hr = pthis->m_pUnkSite->QueryInterface(IID_IWizardSite,(VOID **)&pIWizardSite);
+ if (SUCCEEDED(hr))
+ {
+ HPROPSHEETPAGE hpage = NULL;
+
+ hr = pIWizardSite->GetNextPage(&hpage);
+ if (SUCCEEDED(hr))
+ {
+ PropSheet_SetCurSel(GetParent(hwndDlg), hpage, 0);
+ }
+ pIWizardSite->Release();
+ }
+ }
+ SetWindowLongPtr(hwndDlg, DWLP_MSGRESULT, (LPARAM)-1);
+ }
+ return TRUE;
+
+ case PSN_QUERYCANCEL:
+ {
+ IWizardSite *pIWizardSite = NULL;
+ HRESULT hr = S_OK;
+
+ pthis = GetThis<CDot11SampleExtUI>(hwndDlg, uMsg, wParam, lParam);
+ if(pthis)
+ {
+ hr = pthis->m_pUnkSite->QueryInterface(IID_IWizardSite,(VOID **)&pIWizardSite);
+ if (SUCCEEDED(hr))
+ {
+ HPROPSHEETPAGE hpage = NULL;
+ hr = pIWizardSite->GetCancelledPage(&hpage);
+ if (SUCCEEDED(hr))
+ {
+ PropSheet_SetCurSel(GetParent(hwndDlg), hpage, 0);
+ }
+ pIWizardSite->Release();
+ }
+ }
+ }
+ return TRUE;
+
+ }
+ }
+ return FALSE;
+ }
+ return FALSE;
+
+}
+
+HRESULT CDot11SampleExtUI::GetClsidPropertyName (
+ _In_ const CLSID* pCLSID,
+ _In_opt_ PCWSTR pwszPropertyName,
+ _Out_writes_(maxResultLen) PWSTR pwszResultStr,
+ _In_ UINT maxResultLen)
+{
+ #define MIN_BUFFER_SIZE 50
+
+ wchar_t *pwszCLSID = NULL;
+ wchar_t *pwszKeyName = NULL;
+ HRESULT hRetCode = S_OK;
+ size_t iCharCount = 0;
+
+ // Sanity
+ //=======
+
+ if( pCLSID == NULL ||
+ pwszResultStr == NULL ||
+ maxResultLen < MIN_BUFFER_SIZE
+ )
+ {
+ return E_INVALIDARG;
+ }
+
+ // Convert CLSID to string
+ //========================
+
+ hRetCode = StringFromCLSID(*pCLSID, &pwszCLSID);
+ if(FAILED(hRetCode))
+ {
+ goto Done;
+ }
+
+ // Allocate buffer for entire CLSID\PropertyName string
+ //=====================================================
+
+ iCharCount = wcslen(pwszCLSID) + 1;
+ if(pwszPropertyName)
+ {
+ iCharCount += wcslen(pwszPropertyName);
+ }
+
+ pwszKeyName = new(std::nothrow) wchar_t[iCharCount];
+ if(pwszKeyName == NULL)
+ {
+ hRetCode = E_OUTOFMEMORY;
+ goto Done;
+ }
+
+ swprintf_s(pwszKeyName, iCharCount, L"%s%s", pwszCLSID, pwszPropertyName ? pwszPropertyName : L"");
+
+ // Copy as much as we can to the target buffer
+ //============================================
+
+ wcsncpy_s(pwszResultStr, maxResultLen, pwszKeyName, _TRUNCATE);
+
+Done:
+
+ if(pwszKeyName != NULL)
+ {
+ delete [] pwszKeyName;
+ }
+
+ if(pwszCLSID != NULL)
+ {
+ CoTaskMemFree(pwszCLSID);
+ }
+
+ return hRetCode;
+}
+
+
+