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.
855 lines
23 KiB
855 lines
23 KiB
/********************************************************************/
|
|
/** 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 <dimsvc.h>
|
|
|
|
//#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);
|
|
|
|
}
|