📄 adapter.cpp
字号:
//+---------------------------------------------------------------------------
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation, 1992-2001.
//
// File: A D A P T E R . C P P
//
// Contents: Physical adapter class definition.
//
// Notes:
//
// Author: Alok Sinha
//
//----------------------------------------------------------------------------
#include "adapter.h"
#include "common.h"
#ifdef CUSTOM_EVENTS
#include "public.h"
#endif
//+---------------------------------------------------------------------------
//
// Function: CMuxPhysicalAdapter::CMuxPhysicalAdapter
//
// Purpose: Constructor for class CMuxPhysicalAdapter
//
// Arguments: None
//
// Returns:
//
// Notes:
//
CMuxPhysicalAdapter::CMuxPhysicalAdapter (INetCfg *pnc,
GUID *pguidAdapter)
{
TraceMsg( L"-->CMuxPhysicalAdapter::CMuxPhysicalAdapter(Constructor).\n" );
m_pnc = pnc;
m_pnc->AddRef();
CopyMemory( &m_guidAdapter,
pguidAdapter,
sizeof(GUID) );
TraceMsg( L"<--CMuxPhysicalAdapter::CMuxPhysicalAdapter(Constructor).\n" );
}
//+---------------------------------------------------------------------------
//
// Function: CMuxPhysicalAdapter::~CMuxPhysicalAdapter
//
// Purpose: Destructor for class CMuxPhysicalAdapter
//
// Arguments: None
//
// Returns:
//
// Notes:
//
CMuxPhysicalAdapter::~CMuxPhysicalAdapter (VOID)
{
CMuxVirtualMiniport *pMiniport;
DWORD dwMiniportCount;
DWORD i;
TraceMsg( L"-->CMuxPhysicalAdapter::~CMuxPhysicalAdapter(Destructor).\n" );
//
// Delete all the instances representing the virtual miniports.
// We are only deleting the class instances, not uninstalling the
// the virtual miniports.
//
dwMiniportCount = m_MiniportList.ListCount();
for (i=0; i < dwMiniportCount; ++i) {
m_MiniportList.Remove( &pMiniport );
delete pMiniport;
}
dwMiniportCount = m_MiniportsToAdd.ListCount();
for (i=0; i < dwMiniportCount; ++i) {
m_MiniportsToAdd.Remove( &pMiniport );
delete pMiniport;
}
dwMiniportCount = m_MiniportsToRemove.ListCount();
for (i=0; i < dwMiniportCount; ++i) {
m_MiniportsToRemove.Remove( &pMiniport );
delete pMiniport;
}
ReleaseObj( m_pnc );
TraceMsg( L"<--CMuxPhysicalAdapter::~CMuxPhysicalAdapter(Destructor).\n" );
}
//+---------------------------------------------------------------------------
//
// Function: CMuxPhysicalAdapter::LoadConfiguration
//
// Purpose: Read the registry to get the device IDs of the
// virtual miniports installed on the adapter and
// crate an instance to represent each virtual miniport.
//
// Arguments: None
//
// Returns: S_OK on success, otherwise an error code.
//
// Notes:
//
HRESULT CMuxPhysicalAdapter::LoadConfiguration (VOID)
{
HKEY hkeyAdapterGuid;
WCHAR szAdapterGuidKey[MAX_PATH+1];
WCHAR szAdapterGuid[MAX_PATH+1];
LPWSTR lpMiniportList;
LPWSTR lpMiniport;
LPWSTR lpMiniportGuid;
DWORD dwDisp;
CMuxVirtualMiniport *pMiniport;
GUID guidMiniport;
DWORD dwBytes;
LONG lResult;
TraceMsg( L"-->CMuxPhysicalAdapter::LoadConfiguration.\n" );
//
// Build the registry key using the adapter guid under which
// device IDs of the virtual miniports are stored.
//
StringFromGUID2( m_guidAdapter,
szAdapterGuid,
MAX_PATH+1 );
swprintf( szAdapterGuidKey,
L"%s\\%s",
c_szAdapterList,
szAdapterGuid );
lResult = RegCreateKeyExW( HKEY_LOCAL_MACHINE,
szAdapterGuidKey,
0,
NULL,
REG_OPTION_NON_VOLATILE,
KEY_ALL_ACCESS,
NULL,
&hkeyAdapterGuid,
&dwDisp);
if ( lResult == ERROR_SUCCESS ) {
//
// If dwDisp indicates that a new key is created then, we know there
// is no virtual miniport currently listed underneath and we simply
// return.
//
if ( dwDisp != REG_CREATED_NEW_KEY ) {
dwBytes = 0;
lResult = RegQueryValueExW(
hkeyAdapterGuid,
c_szUpperBindings,
NULL,
NULL,
NULL,
&dwBytes );
lpMiniportList = (LPWSTR)calloc( dwBytes, 1 );
if ( lpMiniportList ) {
lResult = RegQueryValueExW(
hkeyAdapterGuid,
c_szUpperBindings,
NULL,
NULL,
(LPBYTE)lpMiniportList,
&dwBytes );
if ( lResult == ERROR_SUCCESS ) {
lpMiniport = lpMiniportList;
#ifndef PASSTHRU_NOTIFY
//
// In case of mux, c_szUpperBindings is a multi_sz string.
//
while ( wcslen(lpMiniport) ) {
lpMiniportGuid = RemoveDevicePrefix( lpMiniport );
TraceMsg( L" Loading configuration for miniport %s...\n",
lpMiniportGuid );
if ( lpMiniportGuid ) {
CLSIDFromString( lpMiniportGuid,
&guidMiniport );
//
// Create an instance representing the virtual miniport.
//
pMiniport = new CMuxVirtualMiniport( m_pnc,
&guidMiniport,
&m_guidAdapter );
if ( pMiniport ) {
//
// Load any miniport specific configuration.
//
pMiniport->LoadConfiguration();
//
// Save the miniport instance in a list.
//
m_MiniportList.Insert( pMiniport,
guidMiniport );
}
free( lpMiniportGuid );
}
//
// Get next miniport guid.
//
lpMiniport += wcslen(lpMiniport) + 1;
}
#else
//
// In case of the passthru driver, c_szUpperBindings is
// a reg_sz string.
//
lpMiniportGuid = RemoveDevicePrefix( lpMiniport );
TraceMsg( L" Loading configuration for miniport %s...\n",
lpMiniportGuid );
if ( lpMiniportGuid ) {
CLSIDFromString( lpMiniportGuid,
&guidMiniport );
//
// Create an instance representing the virtual miniport.
//
pMiniport = new CMuxVirtualMiniport( m_pnc,
&guidMiniport,
&m_guidAdapter );
if ( pMiniport ) {
//
// Load any miniport specific configuration.
//
pMiniport->LoadConfiguration();
//
// Save the miniport instance in a list.
//
m_MiniportList.Insert( pMiniport,
guidMiniport );
}
free( lpMiniportGuid );
}
#endif
}
else {
TraceMsg( L" Failed to read the registry value: %s.\n",
c_szUpperBindings );
}
free( lpMiniportList );
}
else {
lResult = ERROR_NOT_ENOUGH_MEMORY;
}
}
RegCloseKey( hkeyAdapterGuid );
}
else {
TraceMsg( L" Failed to open the registry key: %s.\n",
szAdapterGuidKey );
}
TraceMsg( L"<--CMuxPhysicalAdapter::LoadConfiguration(HRESULT = %x).\n",
HRESULT_FROM_WIN32(lResult) );
return HRESULT_FROM_WIN32(lResult);
}
//+---------------------------------------------------------------------------
//
// Function: CMuxPhysicalAdapter::GetAdapterGUID
//
// Purpose: Returns the adapter GUID.
//
// Arguments:
// OUT pguidAdapter: GUID of the adapter returned.
//
// Returns: None.
//
// Notes:
//
VOID CMuxPhysicalAdapter::GetAdapterGUID (GUID *pguidAdapter)
{
TraceMsg( L"-->CMuxPhysicalAdapter::GetAdapterGUID.\n" );
CopyMemory( pguidAdapter,
&m_guidAdapter,
sizeof(GUID) );
TraceMsg( L"<--CMuxPhysicalAdapter::GetAdapterGUID.\n" );
}
//+---------------------------------------------------------------------------
//
// Function: CMuxPhysicalAdapter::AddMiniport
//
// Purpose: Puts the miniport instance into the list of newly added miniports.
//
// Arguments:
// IN pMiniport: A newly create miniport instance.
//
// Returns: S_OK on success, otherwize and error code.
//
// Notes:
//
HRESULT CMuxPhysicalAdapter::AddMiniport (CMuxVirtualMiniport *pMiniport)
{
GUID guidMiniport;
HRESULT hr;
TraceMsg( L"-->CMuxPhysicalAdapter::AddMiniport.\n" );
pMiniport->GetMiniportGUID( &guidMiniport );
hr = m_MiniportsToAdd.Insert( pMiniport,
guidMiniport );
TraceMsg( L"<--CMuxPhysicalAdapter::AddMiniport(HRESULT = %x).\n",
hr );
return hr;
}
//+---------------------------------------------------------------------------
//
// Function: CMuxPhysicalAdapter::RemoveMiniport
//
// Purpose: Remove a specified miniport instance from the list and
// uninstalls the corresponding virtual miniport.
//
// Arguments:
// IN pguidMiniportToRemove: GUID of the miniport to be removed
// and uninstalled. If it is NULL then,
// the first miniport instance is removed.
//
// Returns: S_OK on success, otherwize and error code.
//
// Notes:
//
HRESULT CMuxPhysicalAdapter::RemoveMiniport (GUID *pguidMiniportToRemove)
{
CMuxVirtualMiniport *pMiniport;
GUID guidMiniport;
HRESULT hr;
TraceMsg( L"-->CMuxPhysicalAdapter::RemoveMiniport.\n" );
//
// If miniport GUID specified then, delete that one.
//
if ( pguidMiniportToRemove ) {
hr = m_MiniportList.RemoveByKey( *pguidMiniportToRemove,
&pMiniport );
}
else {
//
// No GUID specified, so we just delete the first one.
//
hr = m_MiniportList.Remove( &pMiniport );
}
if ( hr == S_OK ) {
pMiniport->GetMiniportGUID( &guidMiniport );
m_MiniportsToRemove.Insert( pMiniport,
guidMiniport );
pMiniport->DeInstall();
}
TraceMsg( L"<--CMuxPhysicalAdapter::RemoveMiniport(HRESULT = %x).\n",
hr );
return hr;
}
//+---------------------------------------------------------------------------
//
// Function: CMuxPhysicalAdapter::Remove
//
// Purpose: Uninstall all the instances of virtual miniports.
//
// Arguments: None
//
// Returns: S_OK.
//
// Notes:
//
HRESULT CMuxPhysicalAdapter::Remove (VOID)
{
CMuxVirtualMiniport *pMiniport;
GUID guidMiniport;
DWORD dwMiniportCount;
DWORD i;
TraceMsg( L"-->CMuxPhysicalAdapter::Remove.\n" );
dwMiniportCount = m_MiniportList.ListCount();
TraceMsg ( L" Removing %d miniports.\n",
dwMiniportCount );
for (i=0; i < dwMiniportCount; ++i) {
m_MiniportList.Remove( &pMiniport );
pMiniport->GetMiniportGUID( &guidMiniport );
m_MiniportsToRemove.Insert( pMiniport,
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -