📄 notify.cpp
字号:
case eActPropertyUIAdd:
hr = HrAddMiniport( pAdapter,
&guidAdapter );
break;
case eActPropertyUIRemove:
hr = HrRemoveMiniport( pAdapter,
&guidAdapter );
break;
}
}
}
ReleaseObj( pLanConnUiInfo );
}
}
TraceMsg(L"<--CMuxNotify INetCfgPropertyUi::ApplyProperties(HRESULT = %x).\n",
hr );
return hr;
}
// ----------------------------------------------------------------------
//
// Function: CMuxNotify::QueryPropertyUi
//
// Purpose: System is asking if we support property pages.
//
// Arguments:
// IN pUnk: Pointer to IUnknown.
//
// Returns: S_OK on success, otherwise an error code
//
// Notes: We display property pages only in the context of
// a LAN connection.
//
STDMETHODIMP CMuxNotify::QueryPropertyUi (IUnknown * pUnk)
{
INetLanConnectionUiInfo *pLanConnUiInfo;
HRESULT hr=S_FALSE;
TraceMsg(L"-->CMuxNotify INetCfgPropertyUi::QueryPropertyUi\n");
#ifndef PASSTHRU_NOTIFY
if ( pUnk ) {
hr = pUnk->QueryInterface(
IID_INetLanConnectionUiInfo,
reinterpret_cast<PVOID *>(&pLanConnUiInfo));
ReleaseObj( pLanConnUiInfo );
}
#endif
TraceMsg(L"<--CMuxNotify INetCfgPropertyUi::QueryPropertyUi(HRESULT = %x).\n",
hr );
return hr;
}
// ----------------------------------------------------------------------
//
// Function: CMuxNotify::SetContext
//
// Purpose: Save the LAN connection context.
//
// Arguments:
// IN pUnk: Pointer to IUnknown.
//
// Returns: S_OK on success, otherwise an error code
//
// Notes: It is also called to release the current LAN connection context.
//
STDMETHODIMP CMuxNotify::SetContext (IUnknown * pUnk)
{
TraceMsg(L"-->CMuxNotify INetCfgPropertyUi::SetContext\n");
//
// Release previous context, if any
//
ReleaseObj( m_pUnkContext );
m_pUnkContext = NULL;
if ( pUnk ) {
m_pUnkContext = pUnk;
m_pUnkContext->AddRef();
}
TraceMsg(L"<--CMuxNotify INetCfgPropertyUi::SetContext(HRESULT = %x).\n",
S_OK );
return S_OK;
}
//----------------------------------------------------------------------------
//
// Function: CMuxNotify::HrLoadAdapterConfiguration
//
// Purpose: This loads the Miniport and adapters that have already been
// installed into our own data structures
//
// Arguments: None.
//
// Returns: S_OK, or an error.
//
//
// Notes:
//
HRESULT CMuxNotify::HrLoadAdapterConfiguration (VOID)
{
HKEY hkeyAdapterList;
WCHAR szAdapterGuid[MAX_PATH+1];
DWORD dwDisp;
CMuxPhysicalAdapter *pAdapter;
GUID guidAdapter;
DWORD dwIndex;
LONG lResult;
TraceMsg( L"-->CMuxNotify::HrLoadAdapterConfiguration.\n" );
lResult = RegCreateKeyExW( HKEY_LOCAL_MACHINE,
c_szAdapterList,
0,
NULL,
REG_OPTION_NON_VOLATILE,
KEY_ALL_ACCESS,
NULL,
&hkeyAdapterList,
&dwDisp);
if ( lResult == ERROR_SUCCESS ) {
//
// If dwDisp indicates that a new key is created then, we know there
// is no adapter currently listed underneath and we simply
// return, otherwise, we enumerate the subkeys, each one representing an
// adapter.
//
if ( dwDisp != REG_CREATED_NEW_KEY ) {
lResult = RegEnumKeyW( hkeyAdapterList,
0,
szAdapterGuid,
MAX_PATH+1 );
for (dwIndex=1; lResult == ERROR_SUCCESS; ++dwIndex) {
TraceMsg( L" Loading configuration for adapter %s...\n",
szAdapterGuid );
//
// Subkeys are actually a guid/bindname of the adapters.
//
CLSIDFromString( szAdapterGuid,
&guidAdapter );
//
// Create an instance representing the adapter.
//
pAdapter = new CMuxPhysicalAdapter( m_pnc,
&guidAdapter );
if ( pAdapter ) {
//
// Load any adapter specific configuration.
//
pAdapter->LoadConfiguration();
//
// Save the adapter instance in a list.
//
m_AdaptersList.Insert( pAdapter,
guidAdapter );
//
// Get next subkey.
//
lResult = RegEnumKeyW( hkeyAdapterList,
dwIndex,
szAdapterGuid,
MAX_PATH+1 );
}
else {
lResult = ERROR_NOT_ENOUGH_MEMORY;
}
}
//
// RegEnumKeyW may have returned error when there are no more
// subkeys to read.
//
lResult = ERROR_SUCCESS;
}
RegCloseKey( hkeyAdapterList );
}
TraceMsg( L"<--CMuxNotify::HrLoadAdapterConfiguration(HRESULT = %x).\n",
HRESULT_FROM_WIN32(lResult) );
return HRESULT_FROM_WIN32(lResult);
}
//----------------------------------------------------------------------------
//
// Function: CMuxNotify::HrGetUpperAndLower
//
// Purpose: Get the upper and lower component of the first interface
// of a binding path.
//
// Arguments:
// IN pncbp : Binding path.
// OUT ppnccUpper: Upper component.
// OUT ppnccLower: Lower component.
//
// Returns: S_OK, or an error.
//
//
// Notes:
//
HRESULT CMuxNotify::HrGetUpperAndLower (INetCfgBindingPath* pncbp,
INetCfgComponent **ppnccUpper,
INetCfgComponent **ppnccLower)
{
IEnumNetCfgBindingInterface* pencbi;
INetCfgBindingInterface* pncbi;
ULONG ulCount;
HRESULT hr;
TraceMsg( L"-->CMuxNotify::HrGetUpperAndLowerComponent.\n" );
*ppnccUpper = NULL;
*ppnccLower = NULL;
hr = pncbp->EnumBindingInterfaces(&pencbi);
if (S_OK == hr) {
//
// get the first binding interface
//
hr = pencbi->Next(1, &pncbi, &ulCount);
if ( hr == S_OK ) {
hr = pncbi->GetUpperComponent( ppnccUpper );
if ( hr == S_OK ) {
hr = pncbi->GetLowerComponent ( ppnccLower );
}
else {
ReleaseObj( *ppnccUpper );
}
ReleaseObj( pncbi );
}
ReleaseObj( pencbi );
}
TraceMsg( L"<--CMuxNotify::HrGetUpperAndLowerComponent(HRESULT = %x).\n",
hr );
return hr;
}
//----------------------------------------------------------------------------
//
// Function: CMuxNotify::HrAddAdapter
//
// Purpose: Create an instance representing the physical adapter and install
// a virtual miniport.
//
// Arguments:
// IN pnccAdapter: Pointer to the physical adapter.
//
// Returns: S_OK, or an error.
//
//
// Notes:
//
HRESULT CMuxNotify::HrAddAdapter (INetCfgComponent *pnccAdapter)
{
GUID guidAdapter;
CMuxPhysicalAdapter *pAdapter;
HRESULT hr;
TraceMsg( L"-->CMuxNotify::HrAddAdapter.\n" );
hr = pnccAdapter->GetInstanceGuid( &guidAdapter );
if ( hr == S_OK ) {
pAdapter = new CMuxPhysicalAdapter( m_pnc,
&guidAdapter );
if ( pAdapter ) {
hr = HrAddMiniport( pAdapter,
&guidAdapter );
if ( hr == S_OK ) {
m_AdaptersToAdd.Insert( pAdapter,
guidAdapter );
}
else {
delete pAdapter;
}
}
else {
hr = HRESULT_FROM_WIN32( ERROR_NOT_ENOUGH_MEMORY );
}
}
TraceMsg( L"<--CMuxNotify::HrAddAdapter(HRESULT = %x).\n",
hr );
return hr;
}
//----------------------------------------------------------------------------
//
// Function: CMuxNotify::HrRemoveAdapter
//
// Purpose: Deletes the instance representing the physical adapter
// and uninstalls all the virtual miniports.
//
// Arguments:
// IN pnccAdapter: Pointer to the physical adapter.
//
// Returns: S_OK, or an error.
//
//
// Notes: This function is called when the adapter or the protocol
// is being uninstalled.
//
HRESULT CMuxNotify::HrRemoveAdapter (INetCfgComponent *pnccAdapter)
{
GUID guidAdapter;
CMuxPhysicalAdapter *pAdapter;
HRESULT hr;
TraceMsg( L"-->CMuxNotify::HrRemoveAdapter.\n" );
hr = pnccAdapter->GetInstanceGuid( &guidAdapter );
if ( hr == S_OK ) {
hr = m_AdaptersList.RemoveByKey( guidAdapter,
&pAdapter );
if ( hr == S_OK ) {
m_AdaptersToRemove.Insert( pAdapter,
guidAdapter );
hr = pAdapter->Remove();
#ifdef DISABLE_PROTOCOLS_TO_PHYSICAL
//
// Restore the bindings of other protocols to the physical
// adapter.
//
EnableBindings( pnccAdapter,
TRUE );
#endif
}
}
TraceMsg( L"<--CMuxNotify::HrRemoveAdapter(HRESULT = %x).\n",
hr );
return hr;
}
//----------------------------------------------------------------------------
//
// Function: CMuxNotify::HrAddMiniport
//
// Purpose: Installs a virtual miniport.
//
// Arguments:
// IN pAdapter : Pointer to the physical adapter class instance.
// IN pguidAdapter: Pointer to the GUID of the adapter.
//
// Returns: S_OK, or an error.
//
//
// Notes:
//
HRESULT CMuxNotify::HrAddMiniport (CMuxPhysicalAdapter *pAdapter,
GUID *pguidAdapter)
{
CMuxVirtualMiniport *pMiniport;
INetCfgComponent *pnccAdapter;
HRESULT hr;
TraceMsg( L"-->CMuxNotify::HrAddMiniport.\n" );
pMiniport = new CMuxVirtualMiniport( m_pnc,
NULL,
pguidAdapter );
if ( pMiniport ) {
hr = pMiniport->Install();
if ( hr == S_OK ) {
hr = pAdapter->AddMiniport( pMiniport );
if ( hr != S_OK ) {
pMiniport->DeInstall();
delete pMiniport;
}
}
}
else {
hr = HRESULT_FROM_WIN32( ERROR_NOT_ENOUGH_MEMORY );
}
#ifdef DISABLE_PROTOCOLS_TO_PHYSICAL
if ( hr == S_OK ) {
//
// If this is the first virtual miniport then, disable the bindings
// of other protocols to the physical adapter.
//
if ( pAdapter->MiniportCount() == 0 ) {
hr = HrFindInstance( m_pnc,
*pguidAdapter,
&pnccAdapter );
if ( hr == S_OK ) {
EnableBindings( pnccAdapter,
FALSE );
ReleaseObj( pnccAdapter );
}
}
}
#endif
TraceMsg( L"<--CMuxNotify::HrAddMiniport(HRESULT = %x).\n",
hr );
return hr;
}
//----------------------------------------------------------------------------
//
// Function: CMuxNotify::HrRemoveMiniport
//
// Purpose: Uninstalls a virtual miniport.
//
// Arguments:
// IN pAdapter : Pointer to the physical adapter class instance.
// IN pguidAdapter: Pointer to the GUID of the adapter.
//
// Returns: S_OK, or an error.
//
//
// Notes:
//
HRESULT CMuxNotify::HrRemoveMiniport (CMuxPhysicalAdapter *pAdapter,
GUID *pguidAdapter)
{
INetCfgComponent *pnccAdapter;
HRESULT hr;
TraceMsg( L"-->CMuxNotify::HrRemoveMiniport.\n" );
hr = pAdapter->RemoveMiniport( NULL );
#ifdef DISABLE_PROTOCOLS_TO_PHYSICAL
if ( hr == S_OK ) {
//
// If this was the last miniport that was removed then, restore the
// bindings of other protocols to the physical adapter.
//
if ( pAdapter->AllMiniportsRemoved() ) {
hr = HrFindInstance( m_pnc,
*pguidAdapter,
&pnccAdapter );
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -