📄 notify.cpp
字号:
if ( hr == S_OK ) {
EnableBindings( pnccAdapter,
TRUE );
ReleaseObj( pnccAdapter );
}
}
}
#endif
TraceMsg( L"<--CMuxNotify::HrRemoveMiniport(HRESULT = %x).\n",
hr );
return hr;
}
// ----------------------------------------------------------------------
//
// Function: CMuxNotify::OnInitDialog
//
// Purpose: Initialize controls
//
// Arguments:
// IN hWnd: Window handle to the property page.
//
// Returns: TRUE.
//
// Notes:
//
LRESULT CMuxNotify::OnInitDialog (IN HWND hWndPage)
{
m_eApplyAction = eActUnknown;
::SendMessage(GetDlgItem(hWndPage, IDC_ADD), BM_SETCHECK, BST_CHECKED, 0);
::SendMessage(GetDlgItem(hWndPage, IDC_REMOVE), BM_SETCHECK, BST_UNCHECKED, 0);
return TRUE;
}
// ----------------------------------------------------------------------
//
// Function: CMuxNotify::OnOk
//
// Purpose: Do actions when OK is pressed
//
// Arguments:
// IN hWnd: Window handle to the property page.
//
// Returns: PSNRET_NOERROR
//
// Notes:
//
LRESULT CMuxNotify::OnOk (IN HWND hWndPage)
{
TraceMsg(L"-->CMuxNotify::OnOk\n");
if ( ::SendMessage(GetDlgItem(hWndPage, IDC_ADD),
BM_GETCHECK, 0, 0) == BST_CHECKED ) {
m_eApplyAction = eActPropertyUIAdd;
}
else {
m_eApplyAction = eActPropertyUIRemove;
}
//
// Set the property sheet changed flag if any of our controls
// get changed. This is important so that we get called to
// apply our property changes.
//
PropSheet_Changed( GetParent(hWndPage), hWndPage);
TraceMsg(L"<--CMuxNotify::OnOk(Action = %s).\n",
(m_eApplyAction == eActPropertyUIAdd) ? L"Add" : L"Remove" );
return PSNRET_NOERROR;
}
// ----------------------------------------------------------------------
//
// Function: CMuxNotify::OnCancel
//
// Purpose: Do actions when CANCEL is pressed
//
// Arguments:
// IN hWnd: Window handle to the property page.
//
// Returns: FALSE
//
// Notes:
//
LRESULT CMuxNotify::OnCancel (IN HWND hWndPage)
{
TraceMsg(L"-->CMuxNotify::OnCancel\n");
m_eApplyAction = eActUnknown;
TraceMsg(L"<--CMuxNotify::OnCancel\n");
return FALSE;
}
// ----------------------------------------------------------------------
//
// Function: CMuxNotifyDialogProc
//
// Purpose: Dialog proc
//
// Arguments:
// IN hWnd : See win32 documentation.
// IN uMsg : See win32 documentation.
// IN wParam: See win32 documentation.
// IN lParam: See win32 documentation.
//
// Returns: See win32 documentation.
//
// Notes:
//
INT_PTR CALLBACK NotifyDialogProc (HWND hWnd,
UINT uMsg,
WPARAM wParam,
LPARAM lParam)
{
CMuxNotify *psf;
LRESULT lRes=FALSE;
if ( uMsg != WM_INITDIALOG ) {
psf = (CMuxNotify *)::GetWindowLongPtr( hWnd,
DWLP_USER );
// Until we get WM_INITDIALOG, just return FALSE
if ( !psf ) {
return lRes;
}
}
switch( uMsg ) {
case WM_INITDIALOG:
{
PROPSHEETPAGE* ppsp;
ppsp = (PROPSHEETPAGE *)lParam;
psf = (CMuxNotify *)ppsp->lParam;
SetWindowLongPtr( hWnd,
DWLP_USER,
(LONG_PTR)psf);
lRes = psf->OnInitDialog( hWnd );
}
break;
case WM_COMMAND:
break;
case WM_NOTIFY:
{
LPNMHDR pnmh = (LPNMHDR)lParam;
switch (pnmh->code) {
case PSN_KILLACTIVE:
//
// ok to loose focus.
//
SetWindowLongPtr( hWnd, DWLP_MSGRESULT, FALSE);
lRes = TRUE;
break;
case PSN_APPLY:
psf = (CMuxNotify *)::GetWindowLongPtr( hWnd, DWLP_USER);
lRes = psf->OnOk( hWnd );
SetWindowLongPtr( hWnd, DWLP_MSGRESULT, lRes);
lRes = TRUE;
break;
case PSN_RESET:
psf = (CMuxNotify *)::GetWindowLongPtr( hWnd, DWLP_USER);
psf->OnCancel( hWnd );
}
}
}
return lRes;
}
// ----------------------------------------------------------------------
//
// Function: CMuxNotifyPropSheetPageProc
//
// Purpose: Prop sheet proc
//
// Arguments:
// IN hWnd: See win32 documentation
// IN uMsg: See win32 documentation
// IN ppsp: See win32 documentation
//
// Returns: See win32 documentation
//
// Notes:
//
UINT CALLBACK NotifyPropSheetPageProc(HWND hWnd,
UINT uMsg,
LPPROPSHEETPAGE ppsp)
{
return TRUE;
}
#ifdef DISABLE_PROTOCOLS_TO_PHYSICAL
// ----------------------------------------------------------------------
//
// Function: CMuxNotify::EnableBindings
//
// Purpose: Enable/Disable the bindings of other protocols to
// the physical adapter.
//
// Arguments:
// IN pnccAdapter: Pointer to the physical adapter.
// IN bEnable: TRUE/FALSE to enable/disable respectively.
//
// Returns: None.
//
// Notes:
//
VOID CMuxNotify::EnableBindings (INetCfgComponent *pnccAdapter,
BOOL bEnable)
{
IEnumNetCfgBindingPath *pencbp;
INetCfgBindingPath *pncbp;
HRESULT hr;
TraceMsg( L"-->CMuxNotify::EnableBindings.\n" );
//
// Get the binding path enumerator.
//
hr = HrGetBindingPathEnum( pnccAdapter,
EBP_ABOVE,
&pencbp );
if ( hr == S_OK ) {
hr = HrGetBindingPath( pencbp,
&pncbp );
//
// Traverse each binding path.
//
while( hr == S_OK ) {
//
// If our protocol does exist in the binding path then,
// disable it.
//
if ( !IfExistMux(pncbp) ) {
pncbp->Enable( bEnable );
}
ReleaseObj( pncbp );
hr = HrGetBindingPath( pencbp,
&pncbp );
}
ReleaseObj( pencbp );
}
else {
TraceMsg( L" Couldn't get the binding path enumerator, "
L"bindings will not be %s.\n",
bEnable ? L"enabled" : L"disabled" );
}
TraceMsg( L"<--CMuxNotify::EnableBindings.\n" );
return;
}
// ----------------------------------------------------------------------
//
// Function: CMuxNotify::IfExistMux
//
// Purpose: Determine if a given binding path contains our protocol.
//
// Arguments:
// IN pncbp: Pointer to the binding path.
//
// Returns: TRUE if our protocol exists, otherwise FALSE.
//
// Notes:
//
BOOL CMuxNotify::IfExistMux (INetCfgBindingPath *pncbp)
{
IEnumNetCfgBindingInterface *pencbi;
INetCfgBindingInterface *pncbi;
INetCfgComponent *pnccUpper;
LPWSTR lpszIdUpper;
HRESULT hr;
BOOL bExist = FALSE;
TraceMsg( L"-->CMuxNotify::IfExistMux.\n" );
//
// Get the binding interface enumerator.
//
hr = HrGetBindingInterfaceEnum( pncbp,
&pencbi );
if ( hr == S_OK ) {
//
// Traverse each binding interface.
//
hr = HrGetBindingInterface( pencbi,
&pncbi );
while( !bExist && (hr == S_OK) ) {
//
// Is the upper component our protocol?
//
hr = pncbi->GetUpperComponent( &pnccUpper );
if ( hr == S_OK ) {
hr = pnccUpper->GetId( &lpszIdUpper );
if ( hr == S_OK ) {
bExist = !_wcsicmp( lpszIdUpper, c_szMuxProtocol );
CoTaskMemFree( lpszIdUpper );
}
else {
TraceMsg( L" Failed to get the upper component of the interface.\n" );
}
ReleaseObj( pnccUpper );
}
else {
TraceMsg( L" Failed to get the upper component of the interface.\n" );
}
ReleaseObj( pncbi );
if ( !bExist ) {
hr = HrGetBindingInterface( pencbi,
&pncbi );
}
}
ReleaseObj( pencbi );
}
else {
TraceMsg( L" Couldn't get the binding interface enumerator.\n" );
}
TraceMsg( L"<--CMuxNotify::IfExistMux(BOOL = %x).\n",
bExist );
return bExist;
}
// ----------------------------------------------------------------------
//
// Function: CMuxNotify::HrGetBindingPathEnum
//
// Purpose: Returns the binding path enumerator.
//
// Arguments:
// IN pnccAdapter : Pointer to the physical adapter.
// IN dwBindingType: Type of binding path enumerator.
// OUT ppencbp : Pointer to the binding path enumerator.
//
// Returns: S_OK on success, otherwise an error code.
//
// Notes:
//
HRESULT CMuxNotify::HrGetBindingPathEnum (
INetCfgComponent *pnccAdapter,
DWORD dwBindingType,
IEnumNetCfgBindingPath **ppencbp)
{
INetCfgComponentBindings *pnccb = NULL;
HRESULT hr;
*ppencbp = NULL;
hr = pnccAdapter->QueryInterface( IID_INetCfgComponentBindings,
(PVOID *)&pnccb );
if ( hr == S_OK ) {
hr = pnccb->EnumBindingPaths( dwBindingType,
ppencbp );
ReleaseObj( pnccb );
}
return hr;
}
// ----------------------------------------------------------------------
//
// Function: CMuxNotify::HrGetBindingPath
//
// Purpose: Returns a binding path.
//
// Arguments:
// IN pencbp : Pointer to the binding path enumerator.
// OUT ppncbp : Pointer to the binding path.
//
// Returns: S_OK on success, otherwise an error code.
//
// Notes:
//
HRESULT CMuxNotify::HrGetBindingPath (IEnumNetCfgBindingPath *pencbp,
INetCfgBindingPath **ppncbp)
{
ULONG ulCount;
HRESULT hr;
*ppncbp = NULL;
hr = pencbp->Next( 1,
ppncbp,
&ulCount );
return hr;
}
// ----------------------------------------------------------------------
//
// Function: CMuxNotify::HrGetBindingInterfaceEnum
//
// Purpose: Returns the binding interface enumerator.
//
// Arguments:
// IN pncbp : Pointer to the binding path.
// OUT ppencbi: Pointer to the binding path enumerator.
//
// Returns: S_OK on success, otherwise an error code.
//
// Notes:
//
HRESULT CMuxNotify::HrGetBindingInterfaceEnum (
INetCfgBindingPath *pncbp,
IEnumNetCfgBindingInterface **ppencbi)
{
HRESULT hr;
*ppencbi = NULL;
hr = pncbp->EnumBindingInterfaces( ppencbi );
return hr;
}
// ----------------------------------------------------------------------
//
// Function: CMuxNotify::HrGetBindingInterface
//
// Purpose: Returns a binding interface.
//
// Arguments:
// IN pencbi : Pointer to the binding interface enumerator.
// OUT ppncbi : Pointer to the binding interface.
//
// Returns: S_OK on success, otherwise an error code.
//
// Notes:
//
HRESULT CMuxNotify::HrGetBindingInterface (
IEnumNetCfgBindingInterface *pencbi,
INetCfgBindingInterface **ppncbi)
{
ULONG ulCount;
HRESULT hr;
*ppncbi = NULL;
hr = pencbi->Next( 1,
ppncbi,
&ulCount );
return hr;
}
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -