|
|
/********************************************************************/ /** Copyright(c) 1995 Microsoft Corporation. **/ /********************************************************************/
//***
//
// Filename: mibapi.c
//
// Description: Contains code to manipulate MIB apis
//
// History: May 11,1995 NarenG Created original version.
//
#include "dimsvcp.h"
#include <dimsvc.h> // Generated by MIDL
//**
//
// Call: RMIBEntryCreate
//
// Returns: NO_ERROR - Success
// ERROR_UNKNOWN_PROTOCOL_ID or non-zero return code from
// MIBEntryCreate
//
// Description: Simply called the appropriate router manager to do the real
// work.
//
DWORD RMIBEntryCreate( IN MIB_SERVER_HANDLE hMibServer, IN DWORD dwPid, IN DWORD dwRoutingPid, IN PDIM_MIB_ENTRY_CONTAINER pInfoStruct ) { DWORD dwAccessStatus; DWORD dwRetCode = NO_ERROR; DWORD dwTransportIndex = GetTransportIndex( dwPid );
//
// Check if caller has access
//
if ( DimSecObjAccessCheck( DIMSVC_ALL_ACCESS, &dwAccessStatus) != NO_ERROR) { return( ERROR_ACCESS_DENIED ); }
if ( dwAccessStatus ) { return( ERROR_ACCESS_DENIED ); }
if ( dwTransportIndex == (DWORD)-1 ) { return( ERROR_UNKNOWN_PROTOCOL_ID ); }
dwRetCode = gblRouterManagers[dwTransportIndex].DdmRouterIf.MIBEntryCreate( dwRoutingPid, pInfoStruct->dwMibInEntrySize, pInfoStruct->pMibInEntry );
return( dwRetCode ); }
//**
//
// Call: RMIBEntryDelete
//
// Returns: NO_ERROR - Success
// ERROR_UNKNOWN_PROTOCOL_ID or non-zero return code from
// MIBEntryCreate
//
// Description: Simply called the appropriate router manager to do the real
// work.
//
DWORD RMIBEntryDelete( IN MIB_SERVER_HANDLE hMibServer, IN DWORD dwPid, IN DWORD dwRoutingPid, IN PDIM_MIB_ENTRY_CONTAINER pInfoStruct ) { DWORD dwAccessStatus; DWORD dwRetCode = NO_ERROR; DWORD dwTransportIndex = GetTransportIndex( dwPid );
//
// Check if caller has access
//
if ( DimSecObjAccessCheck( DIMSVC_ALL_ACCESS, &dwAccessStatus) != NO_ERROR) { return( ERROR_ACCESS_DENIED ); }
if ( dwAccessStatus ) { return( ERROR_ACCESS_DENIED ); }
if ( dwTransportIndex == (DWORD)-1 ) { return( ERROR_UNKNOWN_PROTOCOL_ID ); }
dwRetCode = gblRouterManagers[dwTransportIndex].DdmRouterIf.MIBEntryDelete( dwRoutingPid, pInfoStruct->dwMibInEntrySize, pInfoStruct->pMibInEntry );
return( dwRetCode ); }
//**
//
// Call: RMIBEntrySet
//
// Returns: NO_ERROR - Success
// ERROR_UNKNOWN_PROTOCOL_ID or non-zero return code from
// MIBEntryCreate
//
// Description: Simply called the appropriate router manager to do the real
// work.
//
DWORD RMIBEntrySet( IN MIB_SERVER_HANDLE hMibServer, IN DWORD dwPid, IN DWORD dwRoutingPid, IN PDIM_MIB_ENTRY_CONTAINER pInfoStruct ) { DWORD dwAccessStatus; DWORD dwRetCode = NO_ERROR; DWORD dwTransportIndex = GetTransportIndex( dwPid );
//
// Check if caller has access
//
if ( DimSecObjAccessCheck( DIMSVC_ALL_ACCESS, &dwAccessStatus) != NO_ERROR) { return( ERROR_ACCESS_DENIED ); }
if ( dwAccessStatus ) { return( ERROR_ACCESS_DENIED ); }
if ( dwTransportIndex == (DWORD)-1 ) { return( ERROR_UNKNOWN_PROTOCOL_ID ); }
dwRetCode = gblRouterManagers[dwTransportIndex].DdmRouterIf.MIBEntrySet( dwRoutingPid, pInfoStruct->dwMibInEntrySize, pInfoStruct->pMibInEntry );
return( dwRetCode ); }
//**
//
// Call: RMIBEntryGet
//
// Returns: NO_ERROR - Success
// ERROR_UNKNOWN_PROTOCOL_ID
// ERROR_NOT_ENOUGH_MEMORY
// non-zero return code from MIBEntryGet
//
// Description: Simply called the appropriate router manager to do the real
// work.
//
//
DWORD RMIBEntryGet( IN MIB_SERVER_HANDLE hMibServer, IN DWORD dwPid, IN DWORD dwRoutingPid, IN OUT PDIM_MIB_ENTRY_CONTAINER pInfoStruct ) { LPBYTE pOutputBuf = NULL; DWORD dwOutputBufSize = 0; DWORD dwRetCode = NO_ERROR; DWORD dwTransportIndex = GetTransportIndex( dwPid );
//
// We do not do access check for MIB Get apis since these are called
// by iphlpapi.dll which can be run in the user's context. It is assumed
// that the various mibs will take care of their own security.
//
if ( dwTransportIndex == (DWORD)-1 ) { return( ERROR_UNKNOWN_PROTOCOL_ID ); }
//
// First get the size of the required entry
//
dwRetCode = gblRouterManagers[dwTransportIndex].DdmRouterIf.MIBEntryGet( dwRoutingPid, pInfoStruct->dwMibInEntrySize, pInfoStruct->pMibInEntry, &dwOutputBufSize, NULL );
if ( dwRetCode != ERROR_INSUFFICIENT_BUFFER ) { return( dwRetCode ); }
pOutputBuf = MIDL_user_allocate( dwOutputBufSize );
if ( pOutputBuf == NULL ) { return( ERROR_NOT_ENOUGH_MEMORY ); }
dwRetCode = gblRouterManagers[dwTransportIndex].DdmRouterIf.MIBEntryGet( dwRoutingPid, pInfoStruct->dwMibInEntrySize, pInfoStruct->pMibInEntry, &dwOutputBufSize, pOutputBuf ); if ( dwRetCode == NO_ERROR ) { pInfoStruct->dwMibOutEntrySize = dwOutputBufSize; pInfoStruct->pMibOutEntry = pOutputBuf; } else { pInfoStruct->dwMibOutEntrySize = 0; pInfoStruct->pMibOutEntry = NULL; MIDL_user_free( pOutputBuf ); }
return( dwRetCode ); }
//**
//
// Call: RMIBEntryGetFirst
//
// Returns: NO_ERROR - Success
// ERROR_UNKNOWN_PROTOCOL_ID
// ERROR_NOT_ENOUGH_MEMORY
// non-zero return code from MIBEntryGetFirst
//
// Description: Simply called the appropriate router manager to do the real
// work.
//
//
DWORD RMIBEntryGetFirst( IN MIB_SERVER_HANDLE hMibServer, IN DWORD dwPid, IN DWORD dwRoutingPid, IN OUT PDIM_MIB_ENTRY_CONTAINER pInfoStruct ) { LPBYTE pOutputBuf = NULL; DWORD dwOutputBufSize = 0; DWORD dwRetCode = NO_ERROR; DWORD dwTransportIndex = GetTransportIndex( dwPid );
//
// We do not do access check for MIB Get apis since these are called
// by iphlpapi.dll which can be run in the user's context. It is assumed
// that the various mibs will take care of their own security.
//
if ( dwTransportIndex == (DWORD)-1 ) { return( ERROR_UNKNOWN_PROTOCOL_ID ); }
//
// First get the size of the required entry
//
dwRetCode=gblRouterManagers[dwTransportIndex].DdmRouterIf.MIBEntryGetFirst( dwRoutingPid, pInfoStruct->dwMibInEntrySize, pInfoStruct->pMibInEntry, &dwOutputBufSize, NULL );
if ( dwRetCode != ERROR_INSUFFICIENT_BUFFER ) { return( dwRetCode ); }
pOutputBuf = MIDL_user_allocate( dwOutputBufSize );
if ( pOutputBuf == NULL ) { return( ERROR_NOT_ENOUGH_MEMORY ); }
dwRetCode=gblRouterManagers[dwTransportIndex].DdmRouterIf.MIBEntryGetFirst( dwRoutingPid, pInfoStruct->dwMibInEntrySize, pInfoStruct->pMibInEntry, &dwOutputBufSize, pOutputBuf );
if ( dwRetCode == NO_ERROR ) { pInfoStruct->dwMibOutEntrySize = dwOutputBufSize; pInfoStruct->pMibOutEntry = pOutputBuf; } else { pInfoStruct->dwMibOutEntrySize = 0; pInfoStruct->pMibOutEntry = NULL; MIDL_user_free( pOutputBuf ); }
return( dwRetCode ); }
//**
//
// Call: RMIBEntryGetNext
//
// Returns: NO_ERROR - Success
// ERROR_UNKNOWN_PROTOCOL_ID
// ERROR_NOT_ENOUGH_MEMORY
// non-zero return code from MIBEntryGetNext
//
// Description: Simply called the appropriate router manager to do the real
// work.
//
DWORD RMIBEntryGetNext( IN MIB_SERVER_HANDLE hMibServer, IN DWORD dwPid, IN DWORD dwRoutingPid, IN OUT PDIM_MIB_ENTRY_CONTAINER pInfoStruct ) { LPBYTE pOutputBuf = NULL; DWORD dwOutputBufSize = 0; DWORD dwRetCode = NO_ERROR; DWORD dwTransportIndex = GetTransportIndex( dwPid );
//
// We do not do access check for MIB Get apis since these are called
// by iphlpapi.dll which can be run in the user's context. It is assumed
// that the various mibs will take care of their own security.
//
if ( dwTransportIndex == (DWORD)-1 ) { return( ERROR_UNKNOWN_PROTOCOL_ID ); }
//
// First get the size of the required entry
//
dwRetCode = gblRouterManagers[dwTransportIndex].DdmRouterIf.MIBEntryGetNext( dwRoutingPid, pInfoStruct->dwMibInEntrySize, pInfoStruct->pMibInEntry, &dwOutputBufSize, NULL );
if ( dwRetCode != ERROR_INSUFFICIENT_BUFFER ) { return( dwRetCode ); }
pOutputBuf = MIDL_user_allocate( dwOutputBufSize );
if ( pOutputBuf == NULL ) { return( ERROR_NOT_ENOUGH_MEMORY ); }
dwRetCode = gblRouterManagers[dwTransportIndex].DdmRouterIf.MIBEntryGetNext( dwRoutingPid, pInfoStruct->dwMibInEntrySize, pInfoStruct->pMibInEntry, &dwOutputBufSize, pOutputBuf );
if ( dwRetCode == NO_ERROR ) { pInfoStruct->dwMibOutEntrySize = dwOutputBufSize; pInfoStruct->pMibOutEntry = pOutputBuf; } else { pInfoStruct->dwMibOutEntrySize = 0; pInfoStruct->pMibOutEntry = NULL; MIDL_user_free( pOutputBuf ); }
return( dwRetCode ); }
//**
//
// Call: RMIBGetTrapInfo
//
// Returns: NO_ERROR - Success
// ERROR_UNKNOWN_PROTOCOL_ID
// ERROR_NOT_ENOUGH_MEMORY
// non-zero return code from MIBGetTrapInfo
//
// Description: Simply called the appropriate router manager to do the real
// work.
//
DWORD RMIBGetTrapInfo( IN MIB_SERVER_HANDLE hMibServer, IN DWORD dwPid, IN DWORD dwRoutingPid, IN OUT PDIM_MIB_ENTRY_CONTAINER pInfoStruct ) { LPBYTE pOutputBuf = NULL; DWORD dwOutputBufSize = 0; DWORD dwRetCode = NO_ERROR; DWORD dwTransportIndex = GetTransportIndex( dwPid );
//
// We do not do access check for MIB Get apis since these are called
// by iphlpapi.dll which can be run in the user's context. It is assumed
// that the various mibs will take care of their own security.
//
if ( dwTransportIndex == (DWORD)-1 ) { return( ERROR_UNKNOWN_PROTOCOL_ID ); }
if (gblRouterManagers[dwTransportIndex].DdmRouterIf.MIBGetTrapInfo == NULL) { return ERROR_CAN_NOT_COMPLETE; } //
// First get the size of the required entry
//
dwRetCode = gblRouterManagers[dwTransportIndex].DdmRouterIf.MIBGetTrapInfo( dwRoutingPid, pInfoStruct->dwMibInEntrySize, pInfoStruct->pMibInEntry, &dwOutputBufSize, NULL );
if ( dwRetCode != ERROR_INSUFFICIENT_BUFFER ) { return( dwRetCode ); }
pOutputBuf = MIDL_user_allocate( dwOutputBufSize );
if ( pOutputBuf == NULL ) { return( ERROR_NOT_ENOUGH_MEMORY ); }
dwRetCode = gblRouterManagers[dwTransportIndex].DdmRouterIf.MIBGetTrapInfo( dwRoutingPid, pInfoStruct->dwMibInEntrySize, pInfoStruct->pMibInEntry, &dwOutputBufSize, pOutputBuf );
if ( dwRetCode == NO_ERROR ) { pInfoStruct->dwMibOutEntrySize = dwOutputBufSize; pInfoStruct->pMibOutEntry = pOutputBuf; } else { pInfoStruct->dwMibOutEntrySize = 0; pInfoStruct->pMibOutEntry = NULL; MIDL_user_free( pOutputBuf ); }
return( dwRetCode ); }
//**
//
// Call: RMIBSetTrapInfo
//
// Returns: NO_ERROR - Success
// ERROR_UNKNOWN_PROTOCOL_ID
// ERROR_NOT_ENOUGH_MEMORY
// non-zero return code from MIBSetTrapInfo
// Failures from OpenProcess
// Failures from DuplicateHandle
//
// Description: Simply called the appropriate router manager to do the real
// work.
//
DWORD RMIBSetTrapInfo( IN MIB_SERVER_HANDLE hMibServer, IN DWORD dwPid, IN DWORD dwRoutingPid, IN ULONG_PTR hEvent, IN DWORD dwClientProcessId, IN OUT PDIM_MIB_ENTRY_CONTAINER pInfoStruct ) { DWORD dwAccessStatus; LPBYTE pOutputBuf = NULL; DWORD dwOutputBufSize = 0; DWORD dwRetCode = NO_ERROR; HANDLE hDuplicatedEvent; HANDLE hClientProcess; DWORD dwTransportIndex = GetTransportIndex( dwPid );
//
// Check if caller has access
//
if ( DimSecObjAccessCheck( DIMSVC_ALL_ACCESS, &dwAccessStatus) != NO_ERROR) { return( ERROR_ACCESS_DENIED ); }
if ( dwAccessStatus ) { return( ERROR_ACCESS_DENIED ); }
if ( dwTransportIndex == (DWORD)-1 ) { return( ERROR_UNKNOWN_PROTOCOL_ID ); }
if (gblRouterManagers[dwTransportIndex].DdmRouterIf.MIBSetTrapInfo == NULL) { return ERROR_CAN_NOT_COMPLETE; }
//
// Get process handle of the caller of this API
//
hClientProcess = OpenProcess( STANDARD_RIGHTS_REQUIRED | SPECIFIC_RIGHTS_ALL, FALSE, dwClientProcessId);
if ( hClientProcess == NULL ) { return( GetLastError() ); }
//
// Duplicate the handle to the event
//
if ( !DuplicateHandle( hClientProcess, (HANDLE)hEvent, GetCurrentProcess(), &hDuplicatedEvent, 0, FALSE, DUPLICATE_SAME_ACCESS ) ) { CloseHandle( hClientProcess );
return( GetLastError() ); }
CloseHandle( hClientProcess );
//
// First get the size of the required entry
//
dwRetCode = gblRouterManagers[dwTransportIndex].DdmRouterIf.MIBSetTrapInfo( dwRoutingPid, hDuplicatedEvent, pInfoStruct->dwMibInEntrySize, pInfoStruct->pMibInEntry, &dwOutputBufSize, NULL );
if ( dwRetCode != ERROR_INSUFFICIENT_BUFFER ) { CloseHandle( hDuplicatedEvent );
return( dwRetCode ); }
pOutputBuf = MIDL_user_allocate( dwOutputBufSize );
if ( pOutputBuf == NULL ) { CloseHandle( hDuplicatedEvent );
return( ERROR_NOT_ENOUGH_MEMORY ); }
dwRetCode = gblRouterManagers[dwTransportIndex].DdmRouterIf.MIBSetTrapInfo( dwRoutingPid, hDuplicatedEvent, pInfoStruct->dwMibInEntrySize, pInfoStruct->pMibInEntry, &dwOutputBufSize, pOutputBuf );
if ( dwRetCode == NO_ERROR ) { pInfoStruct->dwMibOutEntrySize = dwOutputBufSize; pInfoStruct->pMibOutEntry = pOutputBuf; } else { pInfoStruct->dwMibOutEntrySize = 0; pInfoStruct->pMibOutEntry = NULL; MIDL_user_free( pOutputBuf ); CloseHandle( hDuplicatedEvent ); }
return( dwRetCode ); }
|