Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

293 lines
7.2 KiB

/*
File pnp.c
Handles pnp notifications such as lan interfaces coming up and down.
*/
#define UNICODE
#define _UNICODE
#include <nt.h>
#include <ntrtl.h>
#include <nturtl.h>
#include <stdlib.h>
#include <windows.h>
#include <stdio.h>
#include <wchar.h>
#include <winsock.h>
#include <npapi.h>
#include <ipexport.h>
#include <ras.h>
#include <rasman.h>
#include <acd.h>
#include <tapi.h>
#include <ndisguid.h>
#include <wmium.h>
#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;
}