📄 adapter.cpp
字号:
guidMiniport );
pMiniport->DeInstall();
}
TraceMsg( L"<--CMuxPhysicalAdapter::Remove(HRESULT = %x).\n",
S_OK );
return S_OK;
}
//+---------------------------------------------------------------------------
//
// Function: CMuxPhysicalAdapter::ApplyRegistryChanges
//
// Purpose: Update the registry depending on the actions performed.
//
// Arguments:
// IN eApplyAction: Action that was last performed.
//
//
// Returns: S_OK.
//
// Notes:
// More than one action could have been performed by the user
// but this function is called only once at the end. So, the argument
// only denotes the very last action performed. For example, if the
// user deletes one miniport and adds two miniports then, the argument
// will denote an add action.
//
HRESULT CMuxPhysicalAdapter::ApplyRegistryChanges (ConfigAction eApplyAction)
{
HKEY hkeyAdapterList;
HKEY hkeyAdapterGuid;
WCHAR szAdapterGuid[MAX_PATH+1];
CMuxVirtualMiniport *pMiniport = NULL;
DWORD dwMiniportCount;
DWORD dwDisp;
DWORD i;
LONG lResult;
HRESULT hr;
TraceMsg( L"-->CMuxPhysicalAdapter::ApplyRegistryChanges.\n" );
//
// Open/create and then close the registry key to ensure that it does exist.
//
StringFromGUID2( m_guidAdapter,
szAdapterGuid,
MAX_PATH+1 );
lResult = RegCreateKeyExW( HKEY_LOCAL_MACHINE,
c_szAdapterList,
0,
NULL,
REG_OPTION_NON_VOLATILE,
KEY_ALL_ACCESS,
NULL,
&hkeyAdapterList,
&dwDisp);
if ( lResult == ERROR_SUCCESS ) {
lResult = RegCreateKeyExW( hkeyAdapterList,
szAdapterGuid,
0,
NULL,
REG_OPTION_NON_VOLATILE,
KEY_ALL_ACCESS,
NULL,
&hkeyAdapterGuid,
&dwDisp);
if ( lResult == ERROR_SUCCESS ) {
RegCloseKey( hkeyAdapterGuid );
}
else {
TraceMsg( L" Failed to create/open the registry key: %s\\%s.\n",
c_szAdapterList, szAdapterGuid );
}
RegCloseKey( hkeyAdapterList );
}
else {
TraceMsg( L" Failed to open the registry key: %s.\n",
c_szAdapterList );
}
//
// Update the registry in case there were new miniports installed.
//
hr = HRESULT_FROM_WIN32( lResult );
dwMiniportCount = m_MiniportsToAdd.ListCount();
TraceMsg( L" Applying registry changes when %d miniports added.\n",
dwMiniportCount );
for (i=0; i < dwMiniportCount; ++i) {
m_MiniportsToAdd.Find( i,
&pMiniport );
//
// Do virtual miniport specific registry changes.
//
// We need to tell the miniport instance explicitly what the action
// is.
//
hr = pMiniport->ApplyRegistryChanges( eActAdd );
if ( hr != S_OK ) {
TraceMsg( L" Failed to apply registry changes to miniport(%d).\n",
i );
}
}
//
// Update the registry in case one or more miniports were uninstalled.
//
dwMiniportCount = m_MiniportsToRemove.ListCount();
TraceMsg( L" Applying registry changes when %d miniports removed.\n",
dwMiniportCount );
for (i=0; i < dwMiniportCount; ++i) {
m_MiniportsToRemove.Find( i,
&pMiniport );
//
// Do virtual miniport specific registry changes.
//
// We need to tell the miniport instance explicitly what the action
// is.
//
hr = pMiniport->ApplyRegistryChanges( eActRemove );
if ( hr != S_OK ) {
TraceMsg( L" Failed to apply registry changes to miniport(%d).\n",
i );
}
}
//
// If the adapter is being removed or the protocol is being uninstalled,
// delete the adatper registry key.
//
if ( eApplyAction == eActRemove ) {
//
// Delete the adapter key.
//
lResult = RegCreateKeyExW( HKEY_LOCAL_MACHINE,
c_szAdapterList,
0,
NULL,
REG_OPTION_NON_VOLATILE,
KEY_ALL_ACCESS,
NULL,
&hkeyAdapterList,
&dwDisp);
if ( lResult == ERROR_SUCCESS ) {
TraceMsg( L" Deleting the registry key: %s.\n", szAdapterGuid );
RegDeleteKeyW( hkeyAdapterList, szAdapterGuid );
RegCloseKey ( hkeyAdapterList );
}
}
TraceMsg( L"<--CMuxPhysicalAdapter::ApplyRegistryChanges(HRESULT = %x).\n",
S_OK );
return S_OK;
}
//+---------------------------------------------------------------------------
//
// Function: CMuxPhysicalAdapter::ApplyPnpChanges
//
// Purpose: Apply the PnP changes depending on the actions performed.
//
// Arguments:
// IN pfCallback : SendPnpConfig Callback interface.
// IN eApplyAction: Action that was last performed.
//
//
// Returns: S_OK.
//
// Notes:
// More than one action could have been performed by the user
// but this function is called only once at the end. So, the argument
// only denotes the very last action performed. For example, if the
// user deletes one miniport and adds two miniports then, the argument
// will denote an add action.
//
HRESULT CMuxPhysicalAdapter::ApplyPnpChanges(
INetCfgPnpReconfigCallback *pfCallback,
ConfigAction eApplyAction)
{
CMuxVirtualMiniport *pMiniport;
GUID guidMiniport;
WCHAR szMiniportGuid[MAX_PATH+1];
LPWSTR lpDevice;
DWORD dwMiniportCount;
DWORD i;
DWORD dwBytes;
INetCfgComponent *pncc;
HRESULT hr;
#ifdef CUSTOM_EVENTS
LPWSTR lpszBindName;
PNOTIFY_CUSTOM_EVENT lppnpEvent;
#endif
TraceMsg( L"-->CMuxPhysicalAdapter::ApplyPnpChanges.\n" );
#ifdef CUSTOM_EVENTS
//
// Find the instance of the adapter to get its bindname.
//
hr = HrFindInstance( m_pnc,
m_guidAdapter,
&pncc );
if ( hr == S_OK ) {
hr = pncc->GetBindName( &lpszBindName );
if ( hr != S_OK ) {
TraceMsg( L" GetBindName failed.(HRESULT = %x). PnP changes will not "
L"be applied and the driver will not be notified.\n",
hr );
}
ReleaseObj( pncc );
}
else {
TraceMsg( L" PnP changes will not "
L"be applied and the driver will not be notified.\n",
hr );
}
#endif
dwMiniportCount = m_MiniportsToAdd.ListCount();
TraceMsg( L" Applying PnP changes to %d new miniports.\n",
dwMiniportCount );
for (i=0; i < dwMiniportCount; ++i) {
m_MiniportsToAdd.Remove( &pMiniport );
pMiniport->GetMiniportGUID( &guidMiniport );
m_MiniportList.Insert( pMiniport,
guidMiniport );
//
// Do miniport specific Pnp Changes when they are added.
//
hr = pMiniport->ApplyPnpChanges( pfCallback,
eActAdd );
#ifdef CUSTOM_EVENTS
//
// Notify the driver that one or more virtual miniports have been added.
//
StringFromGUID2( guidMiniport,
szMiniportGuid,
MAX_PATH+1 );
lpDevice = AddDevicePrefix( szMiniportGuid );
if ( lpDevice ) {
dwBytes = sizeof(NOTIFY_CUSTOM_EVENT) +
((wcslen(lpDevice) + 1) * sizeof(WCHAR));
lppnpEvent = (PNOTIFY_CUSTOM_EVENT)malloc( dwBytes );
if ( lppnpEvent ) {
lppnpEvent->uSignature = NOTIFY_SIGNATURE;
lppnpEvent->uEvent = MUX_CUSTOM_EVENT;
wcscpy( lppnpEvent->szMiniport,
lpDevice );
hr = pfCallback->SendPnpReconfig( NCRL_NDIS,
c_szMuxService,
lpszBindName,
(PVOID)lppnpEvent,
dwBytes );
TraceMsg( L" INetCfgPnpReconfigCallback->SendPnpReconfig returned "
L"%#x.\n",
hr );
if ( hr != S_OK ) {
TraceMsg( L" Failed to apply Pnp changes, miniport(%d).\n",
i );
}
free( lppnpEvent );
}
free( lpDevice );
}
#endif
}
dwMiniportCount = m_MiniportsToRemove.ListCount();
TraceMsg( L" Applying PnP changes to %d removed miniports.\n",
dwMiniportCount );
for (i=0; i < dwMiniportCount; ++i) {
m_MiniportsToRemove.Remove( &pMiniport );
pMiniport->GetMiniportGUID( &guidMiniport );
//
// Do miniport specific Pnp Changes when they are uninstalled.
//
hr = pMiniport->ApplyPnpChanges( pfCallback,
eActRemove );
delete pMiniport;
#ifdef CUSTOM_EVENTS
//
// Notify the driver that one or more virtual miniports have been
// uninstalled.
//
// We can't notify the driver in case the adapter or the protocol is
// being uninstalled because the binding handle doesn't exist.
//
if ( eApplyAction != eActRemove ) {
StringFromGUID2( guidMiniport,
szMiniportGuid,
MAX_PATH+1 );
lpDevice = AddDevicePrefix( szMiniportGuid );
if ( lpDevice ) {
dwBytes = sizeof(NOTIFY_CUSTOM_EVENT) +
((wcslen(lpDevice) + 1) * sizeof(WCHAR));
lppnpEvent = (PNOTIFY_CUSTOM_EVENT)malloc( dwBytes );
if ( lppnpEvent ) {
lppnpEvent->uSignature = NOTIFY_SIGNATURE;
lppnpEvent->uEvent = MUX_CUSTOM_EVENT;
wcscpy( lppnpEvent->szMiniport,
lpDevice );
hr = pfCallback->SendPnpReconfig( NCRL_NDIS,
c_szMuxService,
lpszBindName,
(PVOID)lppnpEvent,
dwBytes );
TraceMsg( L" INetCfgPnpReconfigCallback->SendPnpReconfig returned "
L"%#x.\n",
hr );
if ( hr != S_OK ) {
TraceMsg( L" Failed to apply Pnp changes, miniport(%d).\n",
i );
}
free( lppnpEvent );
}
free( lpDevice );
}
}
#endif
}
#ifdef CUSTOM_EVENTS
CoTaskMemFree( lpszBindName );
#endif
TraceMsg( L"<--CMuxPhysicalAdapter::ApplyPnpChanges(HRESULT = %x).\n",
S_OK );
return S_OK;
}
//+---------------------------------------------------------------------------
//
// Function: CMuxPhysicalAdapter::CancelChanges
//
// Purpose: Cancel any changes made.
//
// Arguments: None
//
//
// Returns: S_OK.
//
// Notes:
//
HRESULT CMuxPhysicalAdapter::CancelChanges (VOID)
{
TraceMsg( L"-->CMuxPhysicalAdapter::CancelChanges.\n" );
TraceMsg( L"<--CMuxPhysicalAdapter::CancelChanges(HRESULT = %x).\n",
S_OK );
return S_OK;
}
//+---------------------------------------------------------------------------
//
// Function: CMuxPhysicalAdapter::AllMiniportsRemoved
//
// Purpose: Find out if there is no miniport installed on the adapter.
//
// Arguments: None
//
//
// Returns: TRUE if all the miniports associated with this adapter have been
// uninstalled and there is none pending to be added, otherwise FALSE.
//
// Notes:
//
BOOL CMuxPhysicalAdapter::AllMiniportsRemoved (VOID)
{
return (m_MiniportList.ListCount() + m_MiniportsToAdd.ListCount()) == 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -