/********************************************************************/ /** Copyright(c) 1995 Microsoft Corporation. **/ /********************************************************************/ //*** // // Filename: ddmapi.c // // Description: This file contains code to call into DDM to process // admin requests // // History: May 11,1995 NarenG Created original version. // #include "dimsvcp.h" #include //#define DimIndexToHandle(_x) ((_x == 0xFFFFFFFF) ? INVALID_HANDLE_VALUE : (HANDLE) UlongToPtr(_x)) //** // // Call: IsDDMRunning // // Returns: TRUE - Service is running and API calls can be serviced // FALSE - API calls cannot be serviced. // // Description: Called to see if API calls can be serviced. // BOOL IsDDMRunning( VOID ) { switch( gblDIMConfigInfo.ServiceStatus.dwCurrentState ) { case SERVICE_STOP_PENDING: case SERVICE_START_PENDING: case SERVICE_STOPPED: return( FALSE ); default: return( TRUE ); } } //** // // Call: RMprAdminServerGetInfo // // Returns: ERROR_ACCESS_DENIED - The caller does not have sufficient priv. // non-zero returns from DDMAdminServerGetInfo // // Description: Simply calles into DDM to do the work // DWORD RMprAdminServerGetInfo( IN MPR_SERVER_HANDLE hMprServer, IN DWORD dwLevel, IN OUT PDIM_INFORMATION_CONTAINER pInfoStruct ) { DWORD dwAccessStatus; ULARGE_INTEGER qwCurrentTime; ULARGE_INTEGER qwUpTime; DWORD dwRemainder; // // Check if caller has access // if ( DimSecObjAccessCheck( DIMSVC_ALL_ACCESS, &dwAccessStatus) != NO_ERROR ) { return( ERROR_ACCESS_DENIED ); } if ( dwAccessStatus != NO_ERROR ) { return( ERROR_ACCESS_DENIED ); } if ( !IsDDMRunning() ) { return( ERROR_DDM_NOT_RUNNING ); } if ( dwLevel != 0 ) { return( ERROR_NOT_SUPPORTED ); } pInfoStruct->pBuffer = MIDL_user_allocate( sizeof( MPR_SERVER_0 ) ); if ( pInfoStruct->pBuffer == NULL ) { return( ERROR_NOT_ENOUGH_MEMORY ); } pInfoStruct->dwBufferSize = sizeof( MPR_SERVER_0 ); GetSystemTimeAsFileTime( (FILETIME*)&qwCurrentTime ); if ( ( qwCurrentTime.QuadPart > gblDIMConfigInfo.qwStartTime.QuadPart ) && ( gblDIMConfigInfo.qwStartTime.QuadPart > 0 ) ) { qwUpTime.QuadPart = qwCurrentTime.QuadPart - gblDIMConfigInfo.qwStartTime.QuadPart; ((MPR_SERVER_0*)(pInfoStruct->pBuffer))->dwUpTime = RtlEnlargedUnsignedDivide( qwUpTime, (DWORD)10000000, &dwRemainder ); } if ( gblDIMConfigInfo.dwRouterRole == ROUTER_ROLE_LAN ) { ((MPR_SERVER_0*)(pInfoStruct->pBuffer))->fLanOnlyMode = TRUE; return( NO_ERROR ); } else { DWORD (*DDMAdminServerGetInfo)( PVOID, DWORD ) = (DWORD(*)( PVOID, DWORD ))GetDDMEntryPoint("DDMAdminServerGetInfo"); if(NULL == DDMAdminServerGetInfo) { return ERROR_PROC_NOT_FOUND; } return( DDMAdminServerGetInfo( pInfoStruct->pBuffer, dwLevel ) ); } } //** // // Call: RRasAdminConnectionEnum // // Returns: ERROR_ACCESS_DENIED - The caller does not have sufficient priv. // ERROR_DDM_NOT_RUNNING - This call cannot be made because DDM is // not loaded // non-zero returns from DDMAdminConnectionEnum // // Description: Simply calles into DDM to do the work // DWORD RRasAdminConnectionEnum( IN RAS_SERVER_HANDLE hRasServer, IN DWORD dwLevel, IN OUT PDIM_INFORMATION_CONTAINER pInfoStruct, IN DWORD dwPreferedMaximumLength, OUT LPDWORD lpdwEntriesRead, OUT LPDWORD lpdwTotalEntries, IN OUT LPDWORD lpdwResumeHandle OPTIONAL ) { DWORD dwAccessStatus; // // Check if caller has access // if ( DimSecObjAccessCheck(DIMSVC_ALL_ACCESS, &dwAccessStatus) != NO_ERROR ) { return( ERROR_ACCESS_DENIED ); } if ( dwAccessStatus ) { return( ERROR_ACCESS_DENIED ); } if ( !IsDDMRunning() ) { return( ERROR_DDM_NOT_RUNNING ); } if ( gblDIMConfigInfo.dwRouterRole == ROUTER_ROLE_LAN ) { return( ERROR_DDM_NOT_RUNNING ); } else { DWORD (*DDMAdminConnectionEnum)( PDIM_INFORMATION_CONTAINER, DWORD, DWORD, LPDWORD, LPDWORD, LPDWORD ) = (DWORD(*)( PDIM_INFORMATION_CONTAINER, DWORD, DWORD, LPDWORD, LPDWORD, LPDWORD ))GetDDMEntryPoint("DDMAdminConnectionEnum"); if(NULL == DDMAdminConnectionEnum) { return ERROR_PROC_NOT_FOUND; } return( DDMAdminConnectionEnum( pInfoStruct, dwLevel, dwPreferedMaximumLength, lpdwEntriesRead, lpdwTotalEntries, lpdwResumeHandle ) ); } } //** // // Call: RRasAdminConnectionGetInfo // // Returns: ERROR_ACCESS_DENIED - The caller does not have sufficient priv. // ERROR_DDM_NOT_RUNNING - This call cannot be made because DDM is // not loaded // non-zero returns from DDMAdminConnectionGetInfo // // Description: Simply calles into DDM to do the work. // DWORD RRasAdminConnectionGetInfo( IN RAS_SERVER_HANDLE hRasServer, IN DWORD dwLevel, IN DWORD hDimConnection, IN OUT PDIM_INFORMATION_CONTAINER pInfoStruct ) { DWORD dwAccessStatus; // // Check if caller has access // if ( DimSecObjAccessCheck( DIMSVC_ALL_ACCESS, &dwAccessStatus) != NO_ERROR ) { return( ERROR_ACCESS_DENIED ); } if ( dwAccessStatus ) { return( ERROR_ACCESS_DENIED ); } if ( !IsDDMRunning() ) { return( ERROR_DDM_NOT_RUNNING ); } if ( gblDIMConfigInfo.dwRouterRole == ROUTER_ROLE_LAN ) { return( ERROR_DDM_NOT_RUNNING ); } else { DWORD (*DDMAdminConnectionGetInfo)( HANDLE, PDIM_INFORMATION_CONTAINER, DWORD ) = (DWORD(*)( HANDLE, PDIM_INFORMATION_CONTAINER, DWORD ) ) GetDDMEntryPoint("DDMAdminConnectionGetInfo"); if(NULL == DDMAdminConnectionGetInfo) { return ERROR_PROC_NOT_FOUND; } return( DDMAdminConnectionGetInfo( DimIndexToHandle(hDimConnection), pInfoStruct, dwLevel ) ); } } //** // // Call: RRasAdminConnectionClearStats // // Returns: ERROR_ACCESS_DENIED - The caller does not have sufficient priv. // ERROR_DDM_NOT_RUNNING - This call cannot be made because DDM is // not loaded // non-zero returns from DDMAdminConnectionClearStats // // Description: Simply calles into DDM to do the work. // DWORD RRasAdminConnectionClearStats( IN RAS_SERVER_HANDLE hRasServer, IN DWORD hRasConnection ) { DWORD dwAccessStatus; // // Check if caller has access // if ( DimSecObjAccessCheck( DIMSVC_ALL_ACCESS, &dwAccessStatus) != NO_ERROR ) { return( ERROR_ACCESS_DENIED ); } if ( dwAccessStatus ) { return( ERROR_ACCESS_DENIED ); } if ( !IsDDMRunning() ) { return( ERROR_DDM_NOT_RUNNING ); } if ( gblDIMConfigInfo.dwRouterRole == ROUTER_ROLE_LAN ) { return( ERROR_DDM_NOT_RUNNING ); } else { DWORD (*DDMAdminConnectionClearStats)( HANDLE ) = (DWORD(*)( HANDLE ) )GetDDMEntryPoint("DDMAdminConnectionClearStats"); if(NULL == DDMAdminConnectionClearStats) { return ERROR_PROC_NOT_FOUND; } return( DDMAdminConnectionClearStats( DimIndexToHandle(hRasConnection ) )); } } //** // // Call: RRasAdminPortEnum // // Returns: ERROR_ACCESS_DENIED - The caller does not have sufficient priv. // ERROR_DDM_NOT_RUNNING - This call cannot be made because DDM is // not loaded // non-zero returns from DDMAdminPortEnum // // Description: Simply calles into DDM to do the work. // DWORD RRasAdminPortEnum( IN RAS_SERVER_HANDLE hRasServer, IN DWORD dwLevel, IN DWORD hDimConnection, IN OUT PDIM_INFORMATION_CONTAINER pInfoStruct, IN DWORD dwPreferedMaximumLength, OUT LPDWORD lpdwEntriesRead, OUT LPDWORD lpdwTotalEntries, IN OUT LPDWORD lpdwResumeHandle OPTIONAL ) { DWORD dwAccessStatus; // // Check if caller has access // if ( DimSecObjAccessCheck( DIMSVC_ALL_ACCESS, &dwAccessStatus) != NO_ERROR ) { return( ERROR_ACCESS_DENIED ); } if ( dwAccessStatus ) { return( ERROR_ACCESS_DENIED ); } if ( !IsDDMRunning() ) { return( ERROR_DDM_NOT_RUNNING ); } if (dwPreferedMaximumLength == 0) { return( ERROR_MORE_DATA ); } if ( gblDIMConfigInfo.dwRouterRole == ROUTER_ROLE_LAN ) { return( ERROR_DDM_NOT_RUNNING ); } else { DWORD (*DDMAdminPortEnum)( PDIM_INFORMATION_CONTAINER, HANDLE, DWORD, DWORD, LPDWORD, LPDWORD, LPDWORD ) = (DWORD(*)( PDIM_INFORMATION_CONTAINER, HANDLE, DWORD, DWORD, LPDWORD, LPDWORD, LPDWORD ))GetDDMEntryPoint("DDMAdminPortEnum"); if(NULL == DDMAdminPortEnum) { return ERROR_PROC_NOT_FOUND; } return( DDMAdminPortEnum( pInfoStruct, DimIndexToHandle(hDimConnection), dwLevel, dwPreferedMaximumLength, lpdwEntriesRead, lpdwTotalEntries, lpdwResumeHandle ) ); } } //** // // Call: RRasAdminPortGetInfo // // Returns: ERROR_ACCESS_DENIED - The caller does not have sufficient priv. // ERROR_DDM_NOT_RUNNING - This call cannot be made because DDM is // not loaded // non-zero returns from DDMAdminPortGetInfo // // Description: Simply calles into DDM to do the work. // DWORD RRasAdminPortGetInfo( IN RAS_SERVER_HANDLE hRasServer, IN DWORD dwLevel, IN DWORD hPort, IN OUT PDIM_INFORMATION_CONTAINER pInfoStruct ) { DWORD dwAccessStatus; // // Check if caller has access // if ( DimSecObjAccessCheck( DIMSVC_ALL_ACCESS, &dwAccessStatus) != NO_ERROR ) { return( ERROR_ACCESS_DENIED ); } if ( dwAccessStatus ) { return( ERROR_ACCESS_DENIED ); } if ( !IsDDMRunning() ) { return( ERROR_DDM_NOT_RUNNING ); } if ( gblDIMConfigInfo.dwRouterRole == ROUTER_ROLE_LAN ) { return( ERROR_DDM_NOT_RUNNING ); } else { DWORD (*DDMAdminPortGetInfo)( HANDLE, PDIM_INFORMATION_CONTAINER, DWORD ) = (DWORD(*)( HANDLE, PDIM_INFORMATION_CONTAINER, DWORD ) ) GetDDMEntryPoint("DDMAdminPortGetInfo"); if(NULL == DDMAdminPortGetInfo) { return ERROR_PROC_NOT_FOUND; } return( DDMAdminPortGetInfo( DimIndexToHandle(hPort), pInfoStruct, dwLevel ) ); } } //** // // Call: RRasAdminPortClearStats // // Returns: ERROR_ACCESS_DENIED - The caller does not have sufficient priv. // ERROR_DDM_NOT_RUNNING - This call cannot be made because DDM is // not loaded // non-zero returns from DDMAdminPortClearStats // // Description: Simply calles into DDM to do the work. // DWORD RRasAdminPortClearStats( IN RAS_SERVER_HANDLE hRasServer, IN DWORD hPort ) { DWORD dwAccessStatus; // // Check if caller has access // if ( DimSecObjAccessCheck( DIMSVC_ALL_ACCESS, &dwAccessStatus) != NO_ERROR ) { return( ERROR_ACCESS_DENIED ); } if ( dwAccessStatus ) { return( ERROR_ACCESS_DENIED ); } if ( !IsDDMRunning() ) { return( ERROR_DDM_NOT_RUNNING ); } if ( gblDIMConfigInfo.dwRouterRole == ROUTER_ROLE_LAN ) { return( ERROR_DDM_NOT_RUNNING ); } else { DWORD (*DDMAdminPortClearStats)( HANDLE ) = (DWORD(*)( HANDLE ) )GetDDMEntryPoint("DDMAdminPortClearStats"); if(NULL == DDMAdminPortClearStats) { return ERROR_PROC_NOT_FOUND; } return( DDMAdminPortClearStats( DimIndexToHandle(hPort ) )); } } //** // // Call: RRasAdminPortReset // // Returns: ERROR_ACCESS_DENIED - The caller does not have sufficient priv. // ERROR_DDM_NOT_RUNNING - This call cannot be made because DDM is // not loaded // non-zero returns from DDMAdminPortReset // // Description: Simply calles into DDM to do the work // DWORD RRasAdminPortReset( IN RAS_SERVER_HANDLE hRasServer, IN DWORD hPort ) { DWORD dwAccessStatus; // // Check if caller has access // if ( DimSecObjAccessCheck( DIMSVC_ALL_ACCESS, &dwAccessStatus) != NO_ERROR ) { return( ERROR_ACCESS_DENIED ); } if ( dwAccessStatus ) { return( ERROR_ACCESS_DENIED ); } if ( !IsDDMRunning() ) { return( ERROR_DDM_NOT_RUNNING ); } if ( gblDIMConfigInfo.dwRouterRole == ROUTER_ROLE_LAN ) { return( ERROR_DDM_NOT_RUNNING ); } else { DWORD (*DDMAdminPortReset)( HANDLE ) = (DWORD(*)( HANDLE ) )GetDDMEntryPoint("DDMAdminPortReset"); if(NULL == DDMAdminPortReset) { return ERROR_PROC_NOT_FOUND; } return( DDMAdminPortReset( DimIndexToHandle(hPort ) )); } } //** // // Call: RRasAdminPortDisconnect // // Returns: ERROR_ACCESS_DENIED - The caller does not have sufficient priv. // ERROR_DDM_NOT_RUNNING - This call cannot be made because DDM is // not loaded // non-zero returns from DDMAdminPortDisconnect // // Description: Simply calles into DDM to do the work. // DWORD RRasAdminPortDisconnect( IN RAS_SERVER_HANDLE hRasServer, IN DWORD hPort ) { DWORD dwAccessStatus; // // Check if caller has access // if ( DimSecObjAccessCheck( DIMSVC_ALL_ACCESS, &dwAccessStatus) != NO_ERROR ) { return( ERROR_ACCESS_DENIED ); } if ( dwAccessStatus ) { return( ERROR_ACCESS_DENIED ); } if ( !IsDDMRunning() ) { return( ERROR_DDM_NOT_RUNNING ); } if ( gblDIMConfigInfo.dwRouterRole == ROUTER_ROLE_LAN ) { return( ERROR_DDM_NOT_RUNNING ); } else { DWORD (*DDMAdminPortDisconnect)( HANDLE ) = (DWORD(*)( HANDLE ) )GetDDMEntryPoint("DDMAdminPortDisconnect"); if(NULL == DDMAdminPortDisconnect) { return ERROR_PROC_NOT_FOUND; } return( DDMAdminPortDisconnect( DimIndexToHandle(hPort ) )); } } //** // // Call: RRasAdminConnectionNotification // // Returns: NO_ERROR - Success // Non-zero returns - Failure // // Description: // DWORD RRasAdminConnectionNotification( IN MPR_SERVER_HANDLE hMprServer, IN DWORD fRegister, IN DWORD dwCallersProcessId, IN ULONG_PTR hEventNotification ) { DWORD dwRetCode = NO_ERROR; DWORD dwAccessStatus; DWORD (*DDMRegisterConnectionNotification)( BOOL, HANDLE, HANDLE ) = (DWORD(*)( BOOL, HANDLE, HANDLE )) GetDDMEntryPoint("DDMRegisterConnectionNotification"); // // Check if caller has access // if ( DimSecObjAccessCheck( DIMSVC_ALL_ACCESS, &dwAccessStatus) != NO_ERROR ) { return( ERROR_ACCESS_DENIED ); } if ( dwAccessStatus ) { return( ERROR_ACCESS_DENIED ); } if ( !IsDDMRunning() ) { return( ERROR_DDM_NOT_RUNNING ); } if ( gblDIMConfigInfo.dwRouterRole == ROUTER_ROLE_LAN ) { return( ERROR_DDM_NOT_RUNNING ); } if ( (BOOL)fRegister ) { HANDLE hEventDuplicated = NULL; HANDLE hClientProcess = NULL; do { // // Get process handle of the caller of this API // hClientProcess = OpenProcess( STANDARD_RIGHTS_REQUIRED | SPECIFIC_RIGHTS_ALL, FALSE, dwCallersProcessId); if ( hClientProcess == NULL ) { dwRetCode = GetLastError(); break; } // // Duplicate the handle to the event // if ( !DuplicateHandle( hClientProcess, (HANDLE)hEventNotification, GetCurrentProcess(), &hEventDuplicated, 0, FALSE, DUPLICATE_SAME_ACCESS ) ) { dwRetCode = GetLastError(); break; } dwRetCode = DDMRegisterConnectionNotification( TRUE, (HANDLE)hEventNotification, hEventDuplicated ); }while( FALSE ); if ( hClientProcess != NULL ) { CloseHandle( hClientProcess ); } if ( dwRetCode != NO_ERROR ) { if ( hEventDuplicated != NULL ) { CloseHandle( hEventDuplicated ); } } } else { dwRetCode = DDMRegisterConnectionNotification( FALSE, (HANDLE)hEventNotification, NULL ); } return( dwRetCode ); } //** // // Call: RRasAdminSendUserMessage // // Returns: NO_ERROR - Success // Non-zero returns - Failure // // Description: Send message for ARAP // DWORD RRasAdminSendUserMessage( IN MPR_SERVER_HANDLE hMprServer, IN DWORD hRasConnection, IN LPWSTR lpwszMessage ) { DWORD dwAccessStatus; DWORD (*DDMSendUserMessage)(HANDLE, LPWSTR ) = (DWORD(*)( HANDLE, LPWSTR ) )GetDDMEntryPoint("DDMSendUserMessage"); // // Check if caller has access // if ( DimSecObjAccessCheck( DIMSVC_ALL_ACCESS, &dwAccessStatus) != NO_ERROR ) { return( ERROR_ACCESS_DENIED ); } if ( dwAccessStatus ) { return( ERROR_ACCESS_DENIED ); } if ( !IsDDMRunning() ) { return( ERROR_DDM_NOT_RUNNING ); } if ( gblDIMConfigInfo.dwRouterRole == ROUTER_ROLE_LAN ) { return( ERROR_DDM_NOT_RUNNING ); } return( DDMSendUserMessage( (HANDLE)UlongToPtr(hRasConnection), lpwszMessage ) ); } DWORD RRasAdminConnectionRemoveQuarantine( IN MPR_SERVER_HANDLE hMprServer, IN DWORD hRasConnection, IN BOOL fIsIpAddress) { DWORD dwAccessStatus; DWORD (*DDMAdminRemoveQuarantine) (HANDLE, BOOL) = (DWORD (*) (HANDLE, BOOL)) GetDDMEntryPoint("DDMAdminRemoveQuarantine"); // // Check to see if caller has access // if(DimSecObjAccessCheck(DIMSVC_ALL_ACCESS, &dwAccessStatus) != NO_ERROR) { // // Check to see if the thread is running as local service. // We want services running as local service to also be able // to remove the quarantine on a connection. // if(!DimIsLocalService()) { return ERROR_ACCESS_DENIED; } } if(!IsDDMRunning()) { return ERROR_DDM_NOT_RUNNING; } return DDMAdminRemoveQuarantine((HANDLE) UlongToPtr(hRasConnection), fIsIpAddress); }