passthru.cpp
上传用户:sabrinaco
上传日期:2016-01-19
资源大小:3177k
文件大小:26k
开发平台:

Visual C++

  1. //+---------------------------------------------------------------------------
  2. //
  3. //  Microsoft Windows
  4. //  Copyright (C) Microsoft Corporation, 1997.
  5. //
  6. //  File:       P A S S T H R U . C P P
  7. //
  8. //  Contents:   Notify object code for the Passthru driver.
  9. //
  10. //  Notes:
  11. //
  12. //----------------------------------------------------------------------------
  13. #include "pch.h"
  14. #pragma hdrstop
  15. #include "passthru.h"
  16. // =================================================================
  17. // Forward declarations
  18. LRESULT CALLBACK PassthruDialogProc(HWND hWnd, UINT uMsg,
  19.                                         WPARAM wParam, LPARAM lParam);
  20. UINT CALLBACK PassthruPropSheetPageProc(HWND hWnd, UINT uMsg,
  21.                                             LPPROPSHEETPAGE ppsp);
  22. HRESULT HrOpenAdapterParamsKey(GUID* pguidAdapter,
  23.                                HKEY* phkeyAdapter);
  24. HRESULT HrCopyMiniportInf (VOID);
  25. inline ULONG ReleaseObj(IUnknown* punk)
  26. {
  27.     return (punk) ? punk->Release () : 0;
  28. }
  29. // =================================================================
  30. //+---------------------------------------------------------------------------
  31. //
  32. // Function:  CPassthruParams::CPassthruParams
  33. //
  34. // Purpose:   constructor for class CPassthruParams
  35. //
  36. // Arguments: None
  37. //
  38. // Returns:
  39. //
  40. // Notes:
  41. //
  42. CPassthruParams::CPassthruParams(VOID)
  43. {
  44.     m_szParam1[0]      = '';
  45.     m_szParam2[0]    = '';
  46. }
  47. // ----------------------------------------------------------------------
  48. //
  49. // Function:  CPassthru::CPassthru
  50. //
  51. // Purpose:   constructor for class CPassthru
  52. //
  53. // Arguments: None
  54. //
  55. // Returns:   None
  56. //
  57. // Notes:
  58. //
  59. CPassthru::CPassthru(VOID) :
  60.         m_pncc(NULL),
  61.         m_pnc(NULL),
  62.         m_eApplyAction(eActUnknown),
  63.         m_pUnkContext(NULL)
  64. {
  65.     TraceMsg(L"--> CPassthru::CPassthrun");
  66.     m_cAdaptersAdded   = 0;
  67.     m_cAdaptersRemoved = 0;
  68.     m_fConfigRead      = FALSE;
  69. }
  70. // ----------------------------------------------------------------------
  71. //
  72. // Function:  CPassthru::~CPassthru
  73. //
  74. // Purpose:   destructor for class CPassthru
  75. //
  76. // Arguments: None
  77. //
  78. // Returns:   None
  79. //
  80. // Notes:
  81. //
  82. CPassthru::~CPassthru(VOID)
  83. {
  84.     TraceMsg(L"--> CPassthru::~CPassthrun");
  85.     // release interfaces if acquired
  86.     ReleaseObj(m_pncc);
  87.     ReleaseObj(m_pnc);
  88.     ReleaseObj(m_pUnkContext);
  89. }
  90. // =================================================================
  91. // INetCfgNotify
  92. //
  93. // The following functions provide the INetCfgNotify interface
  94. // =================================================================
  95. // ----------------------------------------------------------------------
  96. //
  97. // Function:  CPassthru::Initialize
  98. //
  99. // Purpose:   Initialize the notify object
  100. //
  101. // Arguments:
  102. //    pnccItem    [in]  pointer to INetCfgComponent object
  103. //    pnc         [in]  pointer to INetCfg object
  104. //    fInstalling [in]  TRUE if we are being installed
  105. //
  106. // Returns:
  107. //
  108. // Notes:
  109. //
  110. STDMETHODIMP CPassthru::Initialize(INetCfgComponent* pnccItem,
  111.         INetCfg* pnc, BOOL fInstalling)
  112. {
  113.     TraceMsg(L"--> CPassthru::Initializen");
  114.     // save INetCfg & INetCfgComponent and add refcount
  115.     m_pncc = pnccItem;
  116.     m_pnc = pnc;
  117.     if (m_pncc)
  118.     {
  119.         m_pncc->AddRef();
  120.     }
  121.     if (m_pnc)
  122.     {
  123.         m_pnc->AddRef();
  124.     }
  125.     if ( fInstalling )
  126.     {
  127.         OSVERSIONINFO osvi;
  128.         ZeroMemory( &osvi,
  129.                     sizeof(OSVERSIONINFO) );
  130.         
  131.         osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
  132.         if ( GetVersionEx(&osvi) ) 
  133.         {
  134.             if ( (osvi.dwPlatformId == VER_PLATFORM_WIN32_NT) && 
  135.                  (osvi.dwMajorVersion == 5) &&
  136.                  (osvi.dwMinorVersion == 0) )
  137.             {
  138.                 // On Windows 2000, copy the miniport inf file to %windir%inf.
  139.                 TraceMsg(L"    CPassthru::Initialize: Copying miniport inf to system inf directory...n");
  140.                 HrCopyMiniportInf();
  141.             }
  142.             else
  143.             {
  144.                 TraceMsg(L"    CPassthru::Initialize: Skipping copying miniport inf to system inf directory...n");
  145.             }
  146.         }
  147.     }
  148.     return S_OK;
  149. }
  150. // ----------------------------------------------------------------------
  151. //
  152. // Function:  CPassthru::ReadAnswerFile
  153. //
  154. // Purpose:   Read settings from answerfile and configure Passthru
  155. //
  156. // Arguments:
  157. //    pszAnswerFile    [in]  name of AnswerFile
  158. //    pszAnswerSection [in]  name of parameters section
  159. //
  160. // Returns:
  161. //
  162. // Notes:     Dont do anything irreversible (like modifying registry) yet
  163. //            since the config. actually complete only when Apply is called!
  164. //
  165. STDMETHODIMP CPassthru::ReadAnswerFile(PCWSTR pszAnswerFile,
  166.         PCWSTR pszAnswerSection)
  167. {
  168.     TraceMsg(L"--> CPassthru::ReadAnswerFilen");
  169.     PCWSTR pszParamReadFromAnswerFile = L"ParamFromAnswerFile";
  170.     // We will pretend here that szParamReadFromAnswerFile was actually
  171.     // read from the AnswerFile using the following steps
  172.     //
  173.     //   - Open file pszAnswerFile using SetupAPI
  174.     //   - locate section pszAnswerSection
  175.     //   - locate the required key and get its value
  176.     //   - store its value in pszParamReadFromAnswerFile
  177.     //   - close HINF for pszAnswerFile
  178.     // Now that we have read pszParamReadFromAnswerFile from the
  179.     // AnswerFile, store it in our memory structure.
  180.     // Remember we should not be writing it to the registry till
  181.     // our Apply is called!!
  182.     //
  183.     wcscpy(m_sfParams.m_szParam1, pszParamReadFromAnswerFile);
  184.     return S_OK;
  185. }
  186. // ----------------------------------------------------------------------
  187. //
  188. // Function:  CPassthru::Install
  189. //
  190. // Purpose:   Do operations necessary for install.
  191. //
  192. // Arguments:
  193. //    dwSetupFlags [in]  Setup flags
  194. //
  195. // Returns:   S_OK on success, otherwise an error code
  196. //
  197. // Notes:     Dont do anything irreversible (like modifying registry) yet
  198. //            since the config. actually complete only when Apply is called!
  199. //
  200. STDMETHODIMP CPassthru::Install(DWORD dw)
  201. {
  202.     TraceMsg(L"--> CPassthru::Installn");
  203.     // Start up the install process
  204.     HRESULT hr = S_OK;
  205.     m_eApplyAction = eActInstall;
  206.     return hr;
  207. }
  208. // ----------------------------------------------------------------------
  209. //
  210. // Function:  CPassthru::Removing
  211. //
  212. // Purpose:   Do necessary cleanup when being removed
  213. //
  214. // Arguments: None
  215. //
  216. // Returns:   S_OK on success, otherwise an error code
  217. //
  218. // Notes:     Dont do anything irreversible (like modifying registry) yet
  219. //            since the removal is actually complete only when Apply is called!
  220. //
  221. STDMETHODIMP CPassthru::Removing(VOID)
  222. {
  223.     TraceMsg(L"--> CPassthru::Removingn");
  224.     HRESULT     hr = S_OK;
  225.     m_eApplyAction = eActRemove;
  226.     return hr;
  227. }
  228. // ----------------------------------------------------------------------
  229. //
  230. // Function:  CPassthru::Cancel
  231. //
  232. // Purpose:   Cancel any changes made to internal data
  233. //
  234. // Arguments: None
  235. //
  236. // Returns:   S_OK on success, otherwise an error code
  237. //
  238. // Notes:
  239. //
  240. STDMETHODIMP CPassthru::CancelChanges(VOID)
  241. {
  242.     TraceMsg(L"--> CPassthru::CancelChangesn");
  243.     m_sfParams.m_szParam1[0] = '';
  244.     return S_OK;
  245. }
  246. // ----------------------------------------------------------------------
  247. //
  248. // Function:  CPassthru::ApplyRegistryChanges
  249. //
  250. // Purpose:   Apply changes.
  251. //
  252. // Arguments: None
  253. //
  254. // Returns:   S_OK on success, otherwise an error code
  255. //
  256. // Notes:     We can make changes to registry etc. here.
  257. //
  258. STDMETHODIMP CPassthru::ApplyRegistryChanges(VOID)
  259. {
  260.     TraceMsg(L"--> CPassthru::ApplyRegistryChangesn");
  261.     HRESULT hr=S_OK;
  262.     HKEY hkeyParams=NULL;
  263.     HKEY hkeyAdapter;
  264.     //
  265.     // set default Param2 for newly added adapters
  266.     //
  267.     for (UINT cAdapter=0; cAdapter < m_cAdaptersAdded; cAdapter++)
  268.     {
  269.         hr = HrOpenAdapterParamsKey(&m_guidAdaptersAdded[cAdapter],
  270.                                     &hkeyAdapter);
  271.         if (S_OK == hr)
  272.         {
  273.             RegSetValueEx(
  274.                     hkeyAdapter,
  275.                     c_szParam2,
  276.                     NULL, REG_SZ,
  277.                     (LPBYTE) c_szParam2Default,
  278.                     wcslen(c_szParam2Default)
  279.                     *sizeof(WCHAR));
  280.             RegCloseKey(hkeyAdapter);
  281.         }
  282.     }
  283.     //
  284.     // delete parameters of adapters that are unbound/removed
  285.     //
  286.     for (cAdapter=0; cAdapter < m_cAdaptersRemoved; cAdapter++)
  287.     {
  288.         //$ REVIEW  kumarp 23-November-98
  289.         //
  290.         // code to remove passthruParametersAdapters{guid} key
  291.     }
  292.     // do things that are specific to a config action
  293.     switch (m_eApplyAction)
  294.     {
  295.     case eActPropertyUI:
  296.         // A possible improvement might be to write the reg. only
  297.         // if Param1 is modified.
  298.         hr = m_pncc->OpenParamKey(&hkeyParams);
  299.         if (S_OK == hr)
  300.         {
  301.             RegSetValueEx(hkeyParams, c_szParam1, NULL, REG_SZ,
  302.                           (LPBYTE) m_sfParams.m_szParam1,
  303.                           wcslen(m_sfParams.m_szParam1)*sizeof(WCHAR));
  304.             RegCloseKey(hkeyParams);
  305.         }
  306.         HKEY hkeyAdapter;
  307.         hr = HrOpenAdapterParamsKey(&m_guidAdapter, &hkeyAdapter);
  308.         if (S_OK == hr)
  309.         {
  310.             RegSetValueEx(hkeyAdapter, c_szParam2, NULL, REG_SZ,
  311.                           (LPBYTE) m_sfParams.m_szParam2,
  312.                           wcslen(m_sfParams.m_szParam2)*sizeof(WCHAR));
  313.             RegCloseKey(hkeyAdapter);
  314.         }
  315.         break;
  316.     case eActInstall:
  317.     case eActRemove:
  318.         break;
  319.     }
  320.     return hr;
  321. }
  322. STDMETHODIMP
  323. CPassthru::ApplyPnpChanges(
  324.     IN INetCfgPnpReconfigCallback* pICallback)
  325. {
  326.     WCHAR szDeviceName[64];
  327.     StringFromGUID2(
  328.         m_guidAdapter,
  329.         szDeviceName,
  330.         (sizeof(szDeviceName) / sizeof(szDeviceName[0])));
  331.     pICallback->SendPnpReconfig (
  332.         NCRL_NDIS,
  333.         c_szPassthruNdisName,
  334.         szDeviceName,
  335.         m_sfParams.m_szParam2,
  336.         (wcslen(m_sfParams.m_szParam2) + 1) * sizeof(WCHAR));
  337.     return S_OK;
  338. }
  339. // =================================================================
  340. // INetCfgSystemNotify
  341. // =================================================================
  342. // ----------------------------------------------------------------------
  343. //
  344. // Function:  CPassthru::GetSupportedNotifications
  345. //
  346. // Purpose:   Tell the system which notifications we are interested in
  347. //
  348. // Arguments:
  349. //    pdwNotificationFlag [out]  pointer to NotificationFlag
  350. //
  351. // Returns:   S_OK on success, otherwise an error code
  352. //
  353. // Notes:
  354. //
  355. STDMETHODIMP CPassthru::GetSupportedNotifications(
  356.         OUT DWORD* pdwNotificationFlag)
  357. {
  358.     TraceMsg(L"--> CPassthru::GetSupportedNotificationsn");
  359.     *pdwNotificationFlag = NCN_NET | NCN_NETTRANS | NCN_ADD | NCN_REMOVE;
  360.     return S_OK;
  361. }
  362. // ----------------------------------------------------------------------
  363. //
  364. // Function:  CPassthru::SysQueryBindingPath
  365. //
  366. // Purpose:   Allow or veto formation of a binding path
  367. //
  368. // Arguments:
  369. //    dwChangeFlag [in]  type of binding change
  370. //    pncbp        [in]  pointer to INetCfgBindingPath object
  371. //
  372. // Returns:   S_OK on success, otherwise an error code
  373. //
  374. // Notes:
  375. //
  376. STDMETHODIMP CPassthru::SysQueryBindingPath(DWORD dwChangeFlag,
  377.         INetCfgBindingPath* pncbp)
  378. {
  379.     TraceMsg(L"--> CPassthru::SysQueryBindingPathn");
  380.     return S_OK;
  381. }
  382. // ----------------------------------------------------------------------
  383. //
  384. // Function:  CPassthru::SysNotifyBindingPath
  385. //
  386. // Purpose:   System tells us by calling this function which
  387. //            binding path has just been formed.
  388. //
  389. // Arguments:
  390. //    dwChangeFlag [in]  type of binding change
  391. //    pncbpItem    [in]  pointer to INetCfgBindingPath object
  392. //
  393. // Returns:   S_OK on success, otherwise an error code
  394. //
  395. // Notes:
  396. //
  397. STDMETHODIMP CPassthru::SysNotifyBindingPath(DWORD dwChangeFlag,
  398.         INetCfgBindingPath* pncbpItem)
  399. {
  400.     TraceMsg(L"--> CPassthru::SysNotifyBindingPathn");
  401.     return S_OK;
  402. }
  403. // ----------------------------------------------------------------------
  404. //
  405. // Function:  CPassthru::SysNotifyComponent
  406. //
  407. // Purpose:   System tells us by calling this function which
  408. //            component has undergone a change (installed/removed)
  409. //
  410. // Arguments:
  411. //    dwChangeFlag [in]  type of system change
  412. //    pncc         [in]  pointer to INetCfgComponent object
  413. //
  414. // Returns:   S_OK on success, otherwise an error code
  415. //
  416. // Notes:
  417. //
  418. STDMETHODIMP CPassthru::SysNotifyComponent(DWORD dwChangeFlag,
  419.         INetCfgComponent* pncc)
  420. {
  421.     TraceMsg(L"--> CPassthru::SysNotifyComponentn");
  422.     return S_OK;
  423. }
  424. // =================================================================
  425. // INetCfgProperties
  426. // =================================================================
  427. STDMETHODIMP CPassthru::SetContext(
  428.         IUnknown * pUnk)
  429. {
  430.     TraceMsg(L"--> CPassthru::SetContextn");
  431.     HRESULT hr = S_OK;
  432.     // release previous context, if any
  433.     ReleaseObj(m_pUnkContext);
  434.     m_pUnkContext = NULL;
  435.     if (pUnk) // set the new context
  436.     {
  437.         m_pUnkContext = pUnk;
  438.         m_pUnkContext->AddRef();
  439.         ZeroMemory(&m_guidAdapter, sizeof(m_guidAdapter));
  440.         // here we assume that we are going to be called only for
  441.         // a LAN connection since the sample IM works only with
  442.         // LAN devices
  443.         INetLanConnectionUiInfo * pLanConnUiInfo;
  444.         hr = m_pUnkContext->QueryInterface(
  445.                 IID_INetLanConnectionUiInfo,
  446.                 reinterpret_cast<PVOID *>(&pLanConnUiInfo));
  447.         if (S_OK == hr)
  448.         {
  449.             hr = pLanConnUiInfo->GetDeviceGuid(&m_guidAdapter);
  450.             ReleaseObj(pLanConnUiInfo);
  451.         }
  452.     }
  453.     return hr;
  454. }
  455. // ----------------------------------------------------------------------
  456. //
  457. // Function:  CPassthru::MergePropPages
  458. //
  459. // Purpose:   Supply our property page to system
  460. //
  461. // Arguments:
  462. //    pdwDefPages   [out]  pointer to num default pages
  463. //    pahpspPrivate [out]  pointer to array of pages
  464. //    pcPages       [out]  pointer to num pages
  465. //    hwndParent    [in]   handle of parent window
  466. //    szStartPage   [in]   pointer to
  467. //
  468. // Returns:   S_OK on success, otherwise an error code
  469. //
  470. // Notes:
  471. //
  472. STDMETHODIMP CPassthru::MergePropPages(
  473.     IN OUT DWORD* pdwDefPages,
  474.     OUT LPBYTE* pahpspPrivate,
  475.     OUT UINT* pcPages,
  476.     IN HWND hwndParent,
  477.     OUT PCWSTR* szStartPage)
  478. {
  479.     TraceMsg(L"--> CPassthru::MergePropPagesn");
  480.     HRESULT             hr      = S_OK;
  481.     HPROPSHEETPAGE*     ahpsp   = NULL;
  482.     m_eApplyAction = eActPropertyUI;
  483.     // We don't want any default pages to be shown
  484.     *pdwDefPages = 0;
  485.     *pcPages = 0;
  486.     *pahpspPrivate = NULL;
  487.     ahpsp = (HPROPSHEETPAGE*)CoTaskMemAlloc(sizeof(HPROPSHEETPAGE));
  488.     if (ahpsp)
  489.     {
  490.         PROPSHEETPAGE   psp = {0};
  491.         psp.dwSize            = sizeof(PROPSHEETPAGE);
  492.         psp.dwFlags           = PSP_DEFAULT;
  493.         psp.hInstance         = _Module.GetModuleInstance();
  494.         psp.pszTemplate       = MAKEINTRESOURCE(IDD_PASSTHRU_GENERAL);
  495.         psp.pfnDlgProc        = (DLGPROC) PassthruDialogProc;
  496.         psp.pfnCallback       = (LPFNPSPCALLBACK) PassthruPropSheetPageProc;
  497.         // for Win64, use LONG_PTR instead of LPARAM
  498.         psp.lParam            = (LPARAM) this;
  499.         psp.pszHeaderTitle    = NULL;
  500.         psp.pszHeaderSubTitle = NULL;
  501.         ahpsp[0] = ::CreatePropertySheetPage(&psp);
  502.         *pcPages = 1;
  503.         *pahpspPrivate = (LPBYTE) ahpsp;
  504.     }
  505.     return hr;
  506. }
  507. // ----------------------------------------------------------------------
  508. //
  509. // Function:  CPassthru::ValidateProperties
  510. //
  511. // Purpose:   Validate changes to property page
  512. //
  513. // Arguments:
  514. //    hwndSheet [in]  window handle of property sheet
  515. //
  516. // Returns:   S_OK on success, otherwise an error code
  517. //
  518. // Notes:
  519. //
  520. STDMETHODIMP CPassthru::ValidateProperties(HWND hwndSheet)
  521. {
  522.     TraceMsg(L"--> CPassthru::ValidatePropertiesn");
  523.     // Accept any change to Param1
  524.     return S_OK;
  525. }
  526. // ----------------------------------------------------------------------
  527. //
  528. // Function:  CPassthru::CancelProperties
  529. //
  530. // Purpose:   Cancel changes to property page
  531. //
  532. // Arguments: None
  533. //
  534. // Returns:   S_OK on success, otherwise an error code
  535. //
  536. // Notes:
  537. //
  538. STDMETHODIMP CPassthru::CancelProperties(VOID)
  539. {
  540.     TraceMsg(L"--> CPassthru::CancelPropertiesn");
  541.     return S_OK;
  542. }
  543. // ----------------------------------------------------------------------
  544. //
  545. // Function:  CPassthru::ApplyProperties
  546. //
  547. // Purpose:   Apply value of controls on property page
  548. //            to internal memory structure
  549. //
  550. // Arguments: None
  551. //
  552. // Returns:   S_OK on success, otherwise an error code
  553. //
  554. // Notes:     We do this work in OnOk so no need to do it here again.
  555. //
  556. STDMETHODIMP CPassthru::ApplyProperties(VOID)
  557. {
  558.     TraceMsg(L"--> CPassthru::ApplyPropertiesn");
  559.     return S_OK;
  560. }
  561. // =================================================================
  562. // INetCfgBindNotify
  563. // =================================================================
  564. // ----------------------------------------------------------------------
  565. //
  566. // Function:  CPassthru::QueryBindingPath
  567. //
  568. // Purpose:   Allow or veto a binding path involving us
  569. //
  570. // Arguments:
  571. //    dwChangeFlag [in]  type of binding change
  572. //    pncbi        [in]  pointer to INetCfgBindingPath object
  573. //
  574. // Returns:   S_OK on success, otherwise an error code
  575. //
  576. // Notes:
  577. //
  578. STDMETHODIMP CPassthru::QueryBindingPath(DWORD dwChangeFlag,
  579.         INetCfgBindingPath* pncbp)
  580. {
  581.     TraceMsg(L"--> CPassthru::QueryBindingPathn");
  582.     // we do not want to veto any binding path
  583.     return S_OK;
  584. }
  585. // ----------------------------------------------------------------------
  586. //
  587. // Function:  CPassthru::NotifyBindingPath
  588. //
  589. // Purpose:   System tells us by calling this function which
  590. //            binding path involving us has just been formed.
  591. //
  592. // Arguments:
  593. //    dwChangeFlag [in]  type of binding change
  594. //    pncbp        [in]  pointer to INetCfgBindingPath object
  595. //
  596. // Returns:   S_OK on success, otherwise an error code
  597. //
  598. // Notes:
  599. //
  600. STDMETHODIMP CPassthru::NotifyBindingPath(DWORD dwChangeFlag,
  601.         INetCfgBindingPath* pncbp)
  602. {
  603.     TraceMsg(L"--> CPassthru::NotifyBindingPathn");
  604.     return S_OK;
  605. }
  606. // ------------ END OF NOTIFY OBJECT FUNCTIONS --------------------
  607. // -----------------------------------------------------------------
  608. // Property Sheet related functions
  609. //
  610. // ----------------------------------------------------------------------
  611. //
  612. // Function:  CPassthru::OnInitDialog
  613. //
  614. // Purpose:   Initialize controls
  615. //
  616. // Arguments:
  617. //    hWnd [in]  window handle
  618. //
  619. // Returns:
  620. //
  621. // Notes:
  622. //
  623. LRESULT CPassthru::OnInitDialog(IN HWND hWnd)
  624. {
  625.     HKEY hkeyParams;
  626.     HRESULT hr;
  627.     DWORD dwSize;
  628.     DWORD dwError;
  629.     // read in Param1 & Param2 if not already read
  630.     if (!m_fConfigRead)
  631.     {
  632.         m_fConfigRead = TRUE;
  633.         hr = m_pncc->OpenParamKey(&hkeyParams);
  634.         if (S_OK == hr)
  635.         {
  636.             // if this fails, we will show an empty edit box for Param1
  637.             dwSize = MAX_PATH;
  638.             RegQueryValueExW(hkeyParams, c_szParam1, NULL, NULL,
  639.                             (LPBYTE) m_sfParams.m_szParam1, &dwSize);
  640.             RegCloseKey(hkeyParams);
  641.         }
  642.         HKEY hkeyAdapter;
  643.         hr = HrOpenAdapterParamsKey(&m_guidAdapter, &hkeyAdapter);
  644.         if (S_OK == hr)
  645.         {
  646.             dwSize = MAX_PATH;
  647.             dwError = RegQueryValueExW(hkeyAdapter, c_szParam2, NULL, NULL,
  648.                                       (LPBYTE) m_sfParams.m_szParam2, &dwSize);
  649.             RegCloseKey(hkeyAdapter);
  650.         }
  651.     }
  652.     // Param1 edit box
  653.     ::SendMessage(GetDlgItem(hWnd, IDC_PARAM1), EM_SETLIMITTEXT, MAX_PATH-1, 0);
  654.     ::SetWindowText(GetDlgItem(hWnd, IDC_PARAM1), m_sfParams.m_szParam1);
  655.     // Param2 edit box
  656.     ::SendMessage(GetDlgItem(hWnd, IDC_PARAM2), EM_SETLIMITTEXT, MAX_PATH-1, 0);
  657.     ::SetWindowText(GetDlgItem(hWnd, IDC_PARAM2), m_sfParams.m_szParam2);
  658.     return PSNRET_NOERROR;
  659. }
  660. // ----------------------------------------------------------------------
  661. //
  662. // Function:  CPassthru::OnOk
  663. //
  664. // Purpose:   Do actions when OK is pressed
  665. //
  666. // Arguments:
  667. //    hWnd [in]  window handle
  668. //
  669. // Returns:
  670. //
  671. // Notes:
  672. //
  673. LRESULT CPassthru::OnOk(IN HWND hWnd)
  674. {
  675.     TraceMsg(L"--> CPassthru::OnOkn");
  676.     ::GetWindowText(GetDlgItem(hWnd, IDC_PARAM1),
  677.                     m_sfParams.m_szParam1, MAX_PATH);
  678.     ::GetWindowText(GetDlgItem(hWnd, IDC_PARAM2),
  679.                     m_sfParams.m_szParam2, MAX_PATH);
  680.     return PSNRET_NOERROR;
  681. }
  682. // ----------------------------------------------------------------------
  683. //
  684. // Function:  CPassthru::OnCancel
  685. //
  686. // Purpose:   Do actions when CANCEL is pressed
  687. //
  688. // Arguments:
  689. //    hWnd [in]  window handle
  690. //
  691. // Returns:
  692. //
  693. // Notes:
  694. //
  695. LRESULT CPassthru::OnCancel(IN HWND hWnd)
  696. {
  697.     TraceMsg(L"--> CPassthru::OnCanceln");
  698.     return FALSE;
  699. }
  700. // ----------------------------------------------------------------------
  701. //
  702. // Function:  PassthruDialogProc
  703. //
  704. // Purpose:   Dialog proc
  705. //
  706. // Arguments:
  707. //    hWnd   [in]  see win32 documentation
  708. //    uMsg   [in]  see win32 documentation
  709. //    wParam [in]  see win32 documentation
  710. //    lParam [in]  see win32 documentation
  711. //
  712. // Returns:
  713. //
  714. // Notes:
  715. //
  716. LRESULT
  717. CALLBACK
  718. PassthruDialogProc (
  719.     HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
  720. {
  721.     PROPSHEETPAGE*  ppsp;
  722.     LRESULT         lRes = 0;
  723.     static PROPSHEETPAGE* psp = NULL;
  724.     CPassthru* psf;
  725.     if (uMsg == WM_INITDIALOG)
  726.     {
  727.         ppsp = (PROPSHEETPAGE *)lParam;
  728.         psf = (CPassthru *)ppsp->lParam;
  729.         SetWindowLongPtr(hWnd, DWLP_USER, (LONG_PTR)psf);
  730.         lRes = psf->OnInitDialog(hWnd);
  731.         return lRes;
  732.     }
  733.     else
  734.     {
  735.         psf = (CPassthru *)::GetWindowLongPtr(hWnd, DWLP_USER);
  736.         // Until we get WM_INITDIALOG, just return FALSE
  737.         if (!psf)
  738.         {
  739.             return FALSE;
  740.         }
  741.     }
  742.     if (WM_COMMAND == uMsg)
  743.     {
  744.         if (EN_CHANGE == HIWORD(wParam))
  745.         {
  746.             // Set the property sheet changed flag if any of our controls
  747.             // get changed.  This is important so that we get called to
  748.             // apply our property changes.
  749.             //
  750.             PropSheet_Changed(GetParent(hWnd), hWnd);
  751.         }
  752.     }
  753.     else if (WM_NOTIFY == uMsg)
  754.     {
  755.         LPNMHDR pnmh = (LPNMHDR)lParam;
  756.         switch (pnmh->code)
  757.         {
  758.         case PSN_SETACTIVE:
  759.             lRes = 0;        // accept activation
  760.             break;
  761.         case PSN_KILLACTIVE:
  762.             // ok to loose being active
  763.             SetWindowLongPtr(hWnd, DWLP_MSGRESULT, FALSE);
  764.             lRes = TRUE;
  765.             break;
  766.         case PSN_APPLY:
  767.             lRes = psf->OnOk(hWnd);
  768.             break;
  769.         case PSN_RESET:
  770.             lRes = psf->OnCancel(hWnd);
  771.             break;
  772.         default:
  773.             lRes = FALSE;
  774.             break;
  775.         }
  776.     }
  777.     return lRes;
  778. }
  779. // ----------------------------------------------------------------------
  780. //
  781. // Function:  PassthruPropSheetPageProc
  782. //
  783. // Purpose:   Prop sheet proc
  784. //
  785. // Arguments:
  786. //    hWnd [in]  see win32 documentation
  787. //    uMsg [in]  see win32 documentation
  788. //    ppsp [in]  see win32 documentation
  789. //
  790. // Returns:
  791. //
  792. // Notes:
  793. //
  794. UINT CALLBACK PassthruPropSheetPageProc(HWND hWnd, UINT uMsg,
  795.                                             LPPROPSHEETPAGE ppsp)
  796. {
  797.     UINT uRet = TRUE;
  798.     return uRet;
  799. }
  800. // -----------------------------------------------------------------
  801. //
  802. //  Utility Functions
  803. //
  804. HRESULT HrGetBindingInterfaceComponents (
  805.     INetCfgBindingInterface*    pncbi,
  806.     INetCfgComponent**          ppnccUpper,
  807.     INetCfgComponent**          ppnccLower)
  808. {
  809.     HRESULT hr=S_OK;
  810.     // Initialize output parameters
  811.     *ppnccUpper = NULL;
  812.     *ppnccLower = NULL;
  813.     INetCfgComponent* pnccUpper;
  814.     INetCfgComponent* pnccLower;
  815.     hr = pncbi->GetUpperComponent(&pnccUpper);
  816.     if (SUCCEEDED(hr))
  817.     {
  818.         hr = pncbi->GetLowerComponent(&pnccLower);
  819.         if (SUCCEEDED(hr))
  820.         {
  821.             *ppnccUpper = pnccUpper;
  822.             *ppnccLower = pnccLower;
  823.         }
  824.         else
  825.         {
  826.             ReleaseObj(pnccUpper);
  827.         }
  828.     }
  829.     return hr;
  830. }
  831. HRESULT HrOpenAdapterParamsKey(GUID* pguidAdapter,
  832.                                HKEY* phkeyAdapter)
  833. {
  834.     HRESULT hr=S_OK;
  835.     HKEY hkeyServiceParams;
  836.     WCHAR szGuid[48];
  837.     WCHAR szAdapterSubkey[128];
  838.     DWORD dwError;
  839.     if (ERROR_SUCCESS ==
  840.         RegOpenKeyEx(HKEY_LOCAL_MACHINE, c_szPassthruParams,
  841.                      0, KEY_ALL_ACCESS, &hkeyServiceParams))
  842.     {
  843.         StringFromGUID2(*pguidAdapter, szGuid, 47);
  844.         _stprintf(szAdapterSubkey, L"Adapters\%s", szGuid);
  845.         if (ERROR_SUCCESS !=
  846.             (dwError = RegOpenKeyEx(hkeyServiceParams,
  847.                                     szAdapterSubkey, 0,
  848.                                     KEY_ALL_ACCESS, phkeyAdapter)))
  849.         {
  850.             hr = HRESULT_FROM_WIN32(dwError);
  851.         }
  852.         RegCloseKey(hkeyServiceParams);
  853.     }
  854.     return hr;
  855. }
  856. #if DBG
  857. void TraceMsg(PCWSTR szFormat, ...)
  858. {
  859.     static WCHAR szTempBuf[4096];
  860.     va_list arglist;
  861.     va_start(arglist, szFormat);
  862.     _vstprintf(szTempBuf, szFormat, arglist);
  863.     OutputDebugString(szTempBuf);
  864.     va_end(arglist);
  865. }
  866. #endif