//+--------------------------------------------------------------------------- // // Microsoft Windows // Copyright (C) Microsoft Corporation, 1992-2001. // // File: V I R T U A L . C P P // // Contents: Virtual miniport class definition. // // Notes: // // Author: Alok Sinha //---------------------------------------------------------------------------- #include "virtual.h" #include "common.h" //+--------------------------------------------------------------------------- // // Function: CMuxVirtualMiniport::CMuxVirtualMiniport // // Purpose: Constructor for class CMuxVirtualMiniport // // Arguments: None // // Returns: // // Notes: // CMuxVirtualMiniport::CMuxVirtualMiniport(INetCfg *pnc, GUID *pguidMiniport, GUID *pguidAdapter) { TraceMsg( L"-->CMuxVirtualMiniport::CMuxVirtualMiniport(Constructor).\n" ); m_pnc = pnc; m_pnc->AddRef(); CopyMemory( &m_guidAdapter, pguidAdapter, sizeof(GUID) ); if ( pguidMiniport ) { CopyMemory( &m_guidMiniport, pguidMiniport, sizeof(GUID) ); } else { ZeroMemory( &m_guidMiniport, sizeof(GUID) ); } TraceMsg( L"<--CMuxVirtualMiniport::CMuxVirtualMiniport(Constructor).\n" ); } //+--------------------------------------------------------------------------- // // Function: CMuxVirtualMiniport::~CMuxVirtualMiniport // // Purpose: Destructor for class CMuxVirtualMiniport // // Arguments: None // // Returns: // // Notes: // CMuxVirtualMiniport::~CMuxVirtualMiniport(VOID) { TraceMsg( L"-->CMuxVirtualMiniport::~CMuxVirtualMiniport(Destructor).\n" ); ReleaseObj( m_pnc ); TraceMsg( L"<--CMuxVirtualMiniport::~CMuxVirtualMiniport(Destructor).\n" ); } //+--------------------------------------------------------------------------- // // Function: CMuxVirtualMiniport::LoadConfiguration // // Purpose: Load miniport configuration from the registry. // // Arguments: None // // Returns: S_OK on success, otherwise an error code. // // Notes: // HRESULT CMuxVirtualMiniport::LoadConfiguration(VOID) { TraceMsg( L"-->CMuxVirtualMiniport::LoadConfiguration.\n" ); TraceMsg( L"<--CMuxVirtualMiniport::LoadConfiguration(HRESULT = %x).\n", S_OK ); return S_OK; } //+--------------------------------------------------------------------------- // // Function: CMuxVirtualMiniport::GetAdapterGUID // // Purpose: Returns the adapter GUID. // // Arguments: // OUT pguidAdapter: GUID of the adapter returned. // // Returns: None. // // Notes: // VOID CMuxVirtualMiniport::GetAdapterGUID (GUID *pguidAdapter) { TraceMsg( L"-->CMuxVirtualMiniport::GetAdapterGUID.\n" ); CopyMemory( pguidAdapter, &m_guidAdapter, sizeof(GUID) ); TraceMsg( L"<--CMuxVirtualMiniport::GetAdapterGUID.\n" ); } //+--------------------------------------------------------------------------- // // Function: CMuxVirtualMiniport::GetMiniportGUID // // Purpose: Returns the miniport GUID. // // Arguments: // OUT pguidMiniport: GUID of the miniport returned. // // Returns: None. // // Notes: // VOID CMuxVirtualMiniport::GetMiniportGUID (GUID *pguidMiniport) { TraceMsg( L"-->CMuxVirtualMiniport::GetMiniportGUID.\n" ); CopyMemory( pguidMiniport, &m_guidMiniport, sizeof(GUID) ); TraceMsg( L"<--CMuxVirtualMiniport::GetMiniportGUID.\n" ); } //+--------------------------------------------------------------------------- // // Function: CMuxVirtualMiniport::Install // // Purpose: Installs a virtual miniport. // // Arguments: None // // Returns: S_OK on success, otherwise an error code. // // Notes: // HRESULT CMuxVirtualMiniport::Install (VOID) { INetCfgClass *pncClass; INetCfgClassSetup *pncClassSetup; INetCfgComponent *pnccMiniport; HRESULT hr; TraceMsg( L"-->CMuxVirtualMiniport::Install.\n" ); hr = m_pnc->QueryNetCfgClass( &GUID_DEVCLASS_NET, IID_INetCfgClass, (void **)&pncClass ); if ( hr == S_OK ) { hr = pncClass->QueryInterface( IID_INetCfgClassSetup, (void **)&pncClassSetup ); if ( hr == S_OK ) { hr = pncClassSetup->Install( c_szMuxMiniport, NULL, 0, 0, NULL, NULL, &pnccMiniport ); if ( hr == S_OK ) { hr = pnccMiniport->GetInstanceGuid( &m_guidMiniport ); if ( hr != S_OK ) { TraceMsg( L" Failed to get the instance guid, uninstalling " L" the miniport.\n" ); pncClassSetup->DeInstall( pnccMiniport, NULL, NULL ); } ReleaseObj( pnccMiniport ); } else { TraceMsg( L" Failed to install the miniport.\n" ); } ReleaseObj( pncClassSetup ); } else { TraceMsg( L" QueryInterface failed.\n" ); } ReleaseObj( pncClass ); } else { TraceMsg( L" QueryNetCfgClass failed.\n" ); } TraceMsg( L"<--CMuxVirtualMiniport::Install(HRESULT = %x).\n", hr ); return hr; } //+--------------------------------------------------------------------------- // // Function: CMuxVirtualMiniport::DeInstall // // Purpose: Uninstalls the virtual miniport. // // Arguments: None // // Returns: S_OK on success, otherwise an error code. // // Notes: // HRESULT CMuxVirtualMiniport::DeInstall (VOID) { INetCfgClass *pncClass; INetCfgClassSetup *pncClassSetup; INetCfgComponent *pnccMiniport; HRESULT hr; TraceMsg( L"-->CMuxVirtualMiniport::DeInstall.\n" ); hr = m_pnc->QueryNetCfgClass( &GUID_DEVCLASS_NET, IID_INetCfgClass, (void **)&pncClass ); if ( hr == S_OK ) { hr = pncClass->QueryInterface( IID_INetCfgClassSetup, (void **)&pncClassSetup ); if ( hr == S_OK ) { hr = HrFindInstance( m_pnc, m_guidMiniport, &pnccMiniport ); if ( hr == S_OK ) { TraceMsg( L" Found the miniport instance to uninstall.\n" ); hr = pncClassSetup->DeInstall( pnccMiniport, NULL, NULL ); ReleaseObj( pnccMiniport ); } else { TraceMsg( L" Didn't find the miniport instance to uninstall.\n" ); } ReleaseObj( pncClassSetup ); } else { TraceMsg( L" QueryInterface failed.\n" ); } ReleaseObj( pncClass ); } else { TraceMsg( L" QueryNetCfgClass failed.\n" ); } TraceMsg( L"<--CMuxVirtualMiniport::DeInstall(HRESULT = %x).\n", hr ); return hr; } //+--------------------------------------------------------------------------- // // Function: CMuxVirtualMiniport::ApplyRegistryChanges // // Purpose: Store the changes in the registry. // // Arguments: // IN eApplyAction: Action performed. // // Returns: S_OK on success, otherwise an error code. // // Notes: // HRESULT CMuxVirtualMiniport::ApplyRegistryChanges(ConfigAction eApplyAction) { HKEY hkeyAdapterGuid; WCHAR szAdapterGuid[MAX_PATH+1]; WCHAR szAdapterGuidKey[MAX_PATH+1]; WCHAR szMiniportGuid[MAX_PATH+1]; LPWSTR lpDevice; LONG lResult = 0; TraceMsg( L"-->CMuxVirtualMiniport::ApplyRegistryChanges.\n" ); switch( eApplyAction ) { case eActAdd: // Virtual miniport added. 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, NULL); if ( lResult == ERROR_SUCCESS ) { StringFromGUID2( m_guidMiniport, szMiniportGuid, MAX_PATH+1 ); lpDevice = AddDevicePrefix( szMiniportGuid ); if ( lpDevice ) { #ifndef PASSTHRU_NOTIFY lResult = AddToMultiSzValue( hkeyAdapterGuid, lpDevice ); #else lResult = RegSetValueExW( hkeyAdapterGuid, c_szUpperBindings, 0, REG_SZ, (LPBYTE)lpDevice, (wcslen(lpDevice) + 1) * sizeof(WCHAR) ); #endif if ( lResult != ERROR_SUCCESS ) { TraceMsg( L" Failed to save %s at %s\\%s.\n", lpDevice, szAdapterGuidKey, c_szUpperBindings ); } free( lpDevice ); } else { lResult = ERROR_NOT_ENOUGH_MEMORY; } RegCloseKey( hkeyAdapterGuid ); } else { TraceMsg( L" Failed to open the registry key: %s.\n", szAdapterGuidKey ); } break; case eActRemove: // Virtual miniport removed. 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, NULL); if ( lResult == ERROR_SUCCESS ) { StringFromGUID2( m_guidMiniport, szMiniportGuid, MAX_PATH+1 ); lpDevice = AddDevicePrefix( szMiniportGuid ); TraceMsg( L" Deleting %s at %s.\n", lpDevice, szAdapterGuidKey ); if ( lpDevice ) { #ifndef PASSTHRU_NOTIFY lResult = DeleteFromMultiSzValue( hkeyAdapterGuid, lpDevice ); #else lResult = RegDeleteValueW( hkeyAdapterGuid, c_szUpperBindings ); #endif if ( lResult != ERROR_SUCCESS ) { TraceMsg( L" Failed to delete %s at %s\\%s.\n", lpDevice, szAdapterGuidKey, c_szUpperBindings ); } free( lpDevice ); } RegCloseKey( hkeyAdapterGuid ); } else { TraceMsg( L" Failed to open the registry key: %s.\n", szAdapterGuidKey ); } } TraceMsg( L"<--CMuxVirtualMiniport::ApplyRegistryChanges(HRESULT = %x).\n", HRESULT_FROM_WIN32(lResult) ); return HRESULT_FROM_WIN32(lResult); } //+--------------------------------------------------------------------------- // // Function: CMuxVirtualMiniport::ApplyPnpChanges // // Purpose: // // Arguments: // IN eApplyAction: Action performed. // // Returns: S_OK on success, otherwise an error code. // // Notes: // HRESULT CMuxVirtualMiniport::ApplyPnpChanges (INetCfgPnpReconfigCallback *pfCallback, ConfigAction eApplyAction) { TraceMsg( L"-->CMuxVirtualMiniport::ApplyPnpChanges.\n" ); TraceMsg( L"<--CMuxVirtualMiniport::ApplyPnpChanges(HRESULT = %x).\n", S_OK ); return S_OK; }