/* File pnp.c Handles pnp notifications such as lan interfaces coming up and down. */ #define UNICODE #define _UNICODE #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "radebug.h" extern HANDLE hPnpEventG; //** // // Call: PnpMediaSenseCb // // Returns: None // // Description: // VOID WINAPI PnpMediaSenseCb( PWNODE_HEADER pWnodeHeader, UINT_PTR NotificationContext ) { PWNODE_SINGLE_INSTANCE pWnode = (PWNODE_SINGLE_INSTANCE)pWnodeHeader; LPWSTR lpwsName = (LPWSTR)RtlOffsetToPointer( pWnode, pWnode->OffsetInstanceName ); // // Get the information for the media disconnect. // if ( memcmp( &(pWnodeHeader->Guid), &GUID_NDIS_STATUS_MEDIA_DISCONNECT, sizeof( GUID ) ) == 0 ) { RASAUTO_TRACE1( "PnpMediaSenseCb [disconnect] called for %ws", lpwsName ); if (hPnpEventG) { SetEvent(hPnpEventG); } } else { // // Get the information for the media connect. // if ( memcmp( &(pWnodeHeader->Guid), &GUID_NDIS_STATUS_MEDIA_CONNECT, sizeof( GUID ) ) == 0 ) { RASAUTO_TRACE1( "PnpMediaSenseCb [connect] called for %ws", lpwsName ); if (hPnpEventG) { SetEvent(hPnpEventG); } } } } //** // // Call: PnpMediaSenseRegister // // Returns: NO_ERROR - Success // Non-zero returns - Failure // // Description: // DWORD PnpMediaSenseRegister( IN BOOL fRegister ) { DWORD dwRetCode = NO_ERROR; PVOID pvDeliveryInfo = PnpMediaSenseCb; dwRetCode = WmiNotificationRegistration( (LPGUID)(&GUID_NDIS_STATUS_MEDIA_CONNECT), (BOOLEAN)fRegister, pvDeliveryInfo, (ULONG_PTR)NULL, NOTIFICATION_CALLBACK_DIRECT ); if ( dwRetCode != NO_ERROR ) { return( dwRetCode ); } dwRetCode = WmiNotificationRegistration( (LPGUID)(&GUID_NDIS_STATUS_MEDIA_DISCONNECT), (BOOLEAN)fRegister, pvDeliveryInfo, (ULONG_PTR)NULL, NOTIFICATION_CALLBACK_DIRECT ); if ( dwRetCode != NO_ERROR ) { return( dwRetCode ); } return( NO_ERROR ); } //** // // Call: PnpBindingsNotificationsCb // // Returns: None // // Description: // VOID WINAPI PnpBindingsNotificationsCb( PWNODE_HEADER pWnodeHeader, UINT_PTR NotificationContext ) { LPWSTR lpwszGUIDStart; LPWSTR lpwszGUIDEnd; LPWSTR lpwszGUID; WCHAR wchGUIDSaveLast; PWNODE_SINGLE_INSTANCE pWnode = (PWNODE_SINGLE_INSTANCE)pWnodeHeader; LPWSTR lpwsName = (LPWSTR)RtlOffsetToPointer( pWnode, pWnode->OffsetInstanceName ); LPWSTR lpwsTransportName = (LPWSTR)RtlOffsetToPointer( pWnode, pWnode->DataBlockOffset ); // // Extract GUID from the \device\GUID name // lpwszGUID = lpwsTransportName + wcslen( lpwsTransportName ) + 1; lpwszGUIDStart = wcsrchr( lpwszGUID, L'{' ); lpwszGUIDEnd = wcsrchr( lpwszGUID, L'}' ); if ( (lpwszGUIDStart != NULL ) && (lpwszGUIDEnd != NULL )) { BOOL fBind, fUnbind; // Only signal when something happens with IP. This will prevent // us from handling too many notifications // if ( _wcsicmp( L"TCPIP", lpwsTransportName ) == 0 ) { fBind = ( memcmp( &(pWnodeHeader->Guid), &GUID_NDIS_NOTIFY_BIND, sizeof( GUID ) ) == 0); fUnbind = (memcmp( &(pWnodeHeader->Guid), &GUID_NDIS_NOTIFY_UNBIND, sizeof(GUID))==0); if (fBind || fUnbind) { RASAUTO_TRACE4( "PnpBindingsNotificationsCb %d %d if=%ws, trans=%ws", fBind, fUnbind, lpwsName, lpwsTransportName ); if (hPnpEventG) { SetEvent(hPnpEventG); } } } else { RASAUTO_TRACE2( "PnpBindingsNotificationsCb non-tcp: if=%ws, trans=%ws", lpwsName, lpwsTransportName ); } } } //** // // Call: PnpBindingsNotificationsRegister // // Returns: NO_ERROR - Success // Non-zero returns - Failure // // Description: // DWORD PnpBindingsNotificationsRegister( IN BOOL fRegister ) { DWORD dwRetCode = NO_ERROR; PVOID pvDeliveryInfo = PnpBindingsNotificationsCb; dwRetCode = WmiNotificationRegistration( (LPGUID)(&GUID_NDIS_NOTIFY_BIND), (BOOLEAN)fRegister, pvDeliveryInfo, (ULONG_PTR)NULL, NOTIFICATION_CALLBACK_DIRECT ); if ( dwRetCode != NO_ERROR ) { return( dwRetCode ); } dwRetCode = WmiNotificationRegistration( (LPGUID)(&GUID_NDIS_NOTIFY_UNBIND), (BOOLEAN)fRegister, pvDeliveryInfo, (ULONG_PTR)NULL, NOTIFICATION_CALLBACK_DIRECT ); if ( dwRetCode != NO_ERROR ) { return( dwRetCode ); } return( NO_ERROR ); } DWORD PnpRegister( IN BOOL fRegister) { DWORD dwErr = NO_ERROR; RASAUTO_TRACE1("PnpRegister: %d", !!fRegister); dwErr = PnpBindingsNotificationsRegister(fRegister); if (dwErr == NO_ERROR) { dwErr = PnpMediaSenseRegister(fRegister); if (dwErr == NO_ERROR) { RASAUTO_TRACE("PnpRegister: success."); } else { if (fRegister) { PnpBindingsNotificationsRegister(FALSE); } RASAUTO_TRACE1("PnpRegister: MSense reg failure 0x%x", dwErr); } } else { RASAUTO_TRACE1("PnpRegister: Bingings reg failure 0x%x", dwErr); } return dwErr; }