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.
 
 
 
 
 
 

5499 lines
120 KiB

/*++
Copyright (C) 1992-98 Microsft Corporation. All rights reserved.
Module Name:
apis.c
Abstract:
This file contains all entry points for the RASMAN.DLL of
RAS Manager Component.
Author:
Gurdeep Singh Pall (gurdeep) 06-Jun-1997
Revision History:
Miscellaneous Modifications - raos 31-Dec-1997
--*/
#include <nt.h>
#include <ntrtl.h>
#include <nturtl.h>
#include <rasman.h>
#include <wanpub.h>
#include <media.h>
#include <stdio.h>
#include <raserror.h>
#include <rasppp.h>
#include <stdarg.h>
#include <stdlib.h>
#include <string.h>
#include <sechost.h>
#include <winsock.h>
#include "defs.h"
#include "structs.h"
#include <sechost.h>
#include "globals.h"
#include "rasmxs.h"
#include "protos.h"
#include "nouiutil.h"
#include "loaddlls.h"
#include "rpc.h"
#include "process.h"
extern RPC_BINDING_HANDLE g_hBinding;
BOOL g_fRasInitialized = FALSE;
BOOL g_fWinsockInitialized = FALSE;
BOOL g_fRasAutoStarted = FALSE;
DWORD g_dwEventCount = 0;
#define SECS_WaitTimeOut 500
#define NET_SVCS_GROUP "-k netsvcs"
DWORD
DwRasGetHostByName(CHAR *pszHostName, DWORD **pdwAddress, DWORD *pcAddresses);
/*++
Routine Description:
This function is called to check if a port handle
supplied to the the API is valid.
Arguments:
Return Value:
TRUE (if valid)
FALSE
--*/
BOOL
ValidatePortHandle (HPORT porthandle)
{
if ((porthandle >= 0))
{
return TRUE ;
}
return FALSE ;
}
BOOL
ValidateConnectionHandle(HANDLE hConnection)
{
RAS_RPC *pRasRpcConnection = (RAS_RPC *) hConnection;
if( NULL != pRasRpcConnection
&& NULL == pRasRpcConnection->hRpcBinding)
{
return FALSE;
}
return TRUE;
}
BOOL
IsRasmanProcess()
{
CHAR *pszCmdLine = NULL;
BOOL fRet = FALSE;
pszCmdLine = GetCommandLine();
RasmanOutputDebug("IsRasmanProcess: CmdLine=%s\n",
(NULL == pszCmdLine)
? "NULL"
: pszCmdLine);
if( (NULL != pszCmdLine)
&& (strstr(pszCmdLine, NET_SVCS_GROUP)))
{
fRet = TRUE;
}
RasmanOutputDebug("IsRasmanProcess: returning %d\n",
fRet);
return fRet;
}
BOOL
IsKnownDll(WCHAR *pwszCustomDialerName)
{
BOOL fRet = FALSE;
WCHAR *pwszDialerName, *pwsz;
if(NULL == pwszCustomDialerName)
{
goto done;
}
pwsz = pwszCustomDialerName + wcslen(pwszCustomDialerName);
while( (L'\\' != *pwsz)
&& (pwsz != pwszCustomDialerName))
{
pwsz--;
}
if(L'\\' == *pwsz)
{
pwsz++;
}
if(0 == _wcsicmp(pwsz, L"cmdial32.dll"))
{
fRet = TRUE;
}
done:
return fRet;
}
/*++
Routine Description:
Used for detecting processes attaching and detaching
to the DLL.
Arguments:
Return Value:
--*/
BOOL
InitRasmanDLL (HANDLE hInst, DWORD ul_reason_being_called, LPVOID lpReserved)
{
WSADATA wsaData;
switch (ul_reason_being_called)
{
case DLL_PROCESS_ATTACH:
DisableThreadLibraryCalls(hInst);
break ;
case DLL_PROCESS_DETACH:
//
// If this is the rasman process detaching -
// don't do anything, else check if rasman
// service should be stopped and then stop
// it.
//
if (!IsRasmanProcess())
{
DWORD dwAttachedCount;
BOOL fPortsOpen;
//
// Dereference rasman only if Ras was initialized in
// this process
//
if (!g_fRasInitialized)
{
break;
}
#if 0
RasGetAttachedCount (&dwAttachedCount);
SubmitRequest(NULL, REQTYPE_CLOSEPROCESSPORTS);
fPortsOpen = SubmitRequest(NULL, REQTYPE_NUMPORTOPEN);
RasReferenceRasman (FALSE);
if ( !fPortsOpen
&& 1 == dwAttachedCount)
{
WaitForRasmanServiceStop () ;
}
#endif
//
// Disconnect from rasmans
//
if (g_hBinding)
{
DWORD dwErr;
dwErr = RasRpcDisconnect (&g_hBinding);
}
}
else
{
//
// Free rasmans dll if we loaded it i.e when in
// mprouter process
//
if (hInstRasmans)
{
FreeLibrary (hInstRasmans);
}
hInstRasmans = NULL;
}
if(NULL != lpReserved)
{
break;
}
//
// Terminate winsock.
//
if(g_fWinsockInitialized)
{
WSACleanup();
g_fWinsockInitialized = FALSE;
}
break ;
}
return 1;
}
/*++
Routine Description:
Returns the product type and sku
Arguments:
ppt - Address to receive the product type
pps - Address to receive the sku
Return Value:
ERROR_SUCCESS if successful
Registry apis errors
--*/
LONG
GetProductTypeAndSku(
PRODUCT_TYPE *ppt,
PRODUCT_SKU *pps OPTIONAL
)
{
LONG lr = ERROR_SUCCESS;
CHAR szProductType[128] = {0};
CHAR szProductSku[128] = {0};
HKEY hkey = NULL;
DWORD dwsize;
DWORD dwtype;
CHAR *pszProductType = "ProductType";
CHAR *pszProductSku = "ProductSuite";
CHAR *pszProductOptions =
"System\\CurrentControlSet\\Control\\ProductOptions";
CHAR *pszServerNT = "ServerNT";
CHAR *pszWinNT = "WinNT";
CHAR *pszPersonal = "Personal";
//
// default to workstation
//
*ppt = PT_WORKSTATION;
if (pps)
{
*pps = 0;
}
//
// Open the ProductOptions key
//
if (ERROR_SUCCESS != (lr = RegOpenKeyEx(HKEY_LOCAL_MACHINE,
pszProductOptions,
0, KEY_READ,
&hkey)))
{
goto done;
}
//
// Query the product type
//
dwsize = sizeof(szProductType);
if(ERROR_SUCCESS != (lr = RegQueryValueEx(
hkey,
pszProductType,
NULL,
&dwtype,
(LPBYTE) szProductType,
&dwsize)))
{
goto done;
}
if(0 == _stricmp(szProductType,
pszServerNT))
{
*ppt = PT_SERVER;
}
else if(0 == _stricmp(szProductType,
pszWinNT))
{
*ppt = PT_WORKSTATION;
}
//
// Query the product sku as appropriate
//
if (*ppt == PT_WORKSTATION && pps)
{
dwsize = sizeof(szProductSku);
if(ERROR_SUCCESS != (lr = RegQueryValueEx(
hkey,
pszProductSku,
NULL,
&dwtype,
(LPBYTE) szProductSku,
&dwsize)))
{
goto done;
}
if (0 == _stricmp(szProductSku, pszPersonal))
{
*pps = PS_PERSONAL;
}
else
{
*pps = PS_PROFESSIONAL;
}
}
done:
if(hkey)
{
RegCloseKey(hkey);
}
RasmanOutputDebug("GetProductType returning 0x%x\n", lr);
return lr;
}
/*++
Routine Description:
Returns the product type
Arguments:
ppt - Address to receive the product type
Return Value:
ERROR_SUCCESS if successful
Registry apis errors
--*/
LONG
GetProductType(PRODUCT_TYPE *ppt)
{
return GetProductTypeAndSku(ppt, NULL);
}
DWORD
RasStartRasAutoIfRequired()
{
SC_HANDLE schandle = NULL;
SC_HANDLE svchandle = NULL;
SERVICE_STATUS status;
DWORD dwErr = SUCCESS;
BOOL fServiceStarted = FALSE;
BOOL fConsumer = FALSE;
if(g_fRasAutoStarted)
{
RasmanOutputDebug(
"StartRasAuto: RasAuto already started. pid=%d\n", _getpid());
goto done;
}
//
// Check to see if this is a consumer platform
// Return if not.
//
fConsumer = IsConsumerPlatform();
if(! fConsumer)
{
RasmanOutputDebug(
"StartRasAuto: not a consumer platform. pid=%d\n", _getpid());
goto done;
}
else
{
RasmanOutputDebug(
"StartRasAuto: is consumer platform. pid=%d\n", _getpid());
}
if( !(schandle = OpenSCManager(NULL,
NULL,
SC_MANAGER_CONNECT))
|| !(svchandle = OpenService(schandle,
TEXT("RasAuto"),
SERVICE_START |
SERVICE_QUERY_STATUS)))
{
dwErr = GetLastError();
RasmanOutputDebug("StartRasAuto: Failed to open SCM/Service. dwErr=%d\n",
dwErr);
goto done;
}
while (TRUE)
{
//
// Check if service is already starting:
//
if (QueryServiceStatus(svchandle, &status) == FALSE)
{
dwErr = GetLastError();
goto done;
}
RasmanOutputDebug("StartRasAuto: ServiceStatus=%d\n",
status.dwCurrentState);
switch (status.dwCurrentState)
{
case SERVICE_STOPPED:
{
//
// If we had previously tried to start the service
// and failed. Quit
//
if (fServiceStarted)
{
RasmanOutputDebug("StartRasAuto: failed to start rasauto\n");
dwErr = ERROR_RASAUTO_CANNOT_INITIALIZE;
goto done;
}
RasmanOutputDebug("StartRasAuto: Starting RasAuto...\n");
if (StartService (svchandle, 0, NULL) == FALSE)
{
dwErr = GetLastError() ;
RasmanOutputDebug("StartRasAuto: StartService failed. rc=0x%x",
dwErr);
if(ERROR_SERVICE_ALREADY_RUNNING == dwErr)
{
dwErr = SUCCESS;
}
else if(SUCCESS != dwErr)
{
dwErr = ERROR_RASAUTO_CANNOT_INITIALIZE;
goto done;
}
}
fServiceStarted = TRUE;
break;
}
case SERVICE_START_PENDING:
{
Sleep (500L) ;
break ;
}
case SERVICE_RUNNING:
{
g_fRasAutoStarted = TRUE;
goto done;
}
default:
{
dwErr = ERROR_RASAUTO_CANNOT_INITIALIZE;
goto done;
}
}
}
done:
if(NULL != schandle)
{
CloseServiceHandle(schandle);
}
if(NULL != svchandle)
{
CloseServiceHandle(svchandle);
}
RasmanOutputDebug("StartRasAuto: returning 0x%x\n",
dwErr);
return dwErr;
}
DWORD
RasmanUninitialize()
{
DWORD dwRetcode = ERROR_SUCCESS;
if (!IsRasmanProcess())
{
#if 0
DbgPrint("RasmanUninitialize: Uninitializing rasman. pid=%d\n",
GetCurrentProcessId());
#endif
//
// Dereference rasman only if Ras was initialized in
// this process
//
if (!g_fRasInitialized)
{
goto done;
}
RasReferenceRasman (FALSE);
//
// Disconnect from rasmans
//
if (g_hBinding)
{
DWORD dwErr;
dwErr = RasRpcDisconnect (&g_hBinding);
g_hBinding = NULL;
}
}
else
{
//
// Free rasmans dll if we loaded it i.e when in
// mprouter process
//
if (hInstRasmans)
{
FreeLibrary (hInstRasmans);
}
hInstRasmans = NULL;
}
//
// Terminate winsock.
//
if(g_fWinsockInitialized)
{
WSACleanup();
g_fWinsockInitialized = FALSE;
}
g_fRasInitialized = FALSE;
done:
#if 0
DbgPrint("\nRasmanUninitialize: uninitialized rasman\n");
#endif
return dwRetcode;
}
DWORD
RasInitializeNoWait ()
{
hInstRasmans = NULL;
g_fnServiceRequest = NULL;
// GetStartupInfo(&startupinfo) ;
if (IsRasmanProcess())
{
//
// Load rasmans dll and initialize "ServiceRequest"
// fn pointer
//
hInstRasmans = LoadLibrary ("rasmans.dll");
if (NULL == hInstRasmans)
{
RasmanOutputDebug("RasIntializeNoWait: hInstRasmans==NULL!\n");
return ERROR_RASMAN_CANNOT_INITIALIZE;
}
g_fnServiceRequest = GetProcAddress (hInstRasmans,
TEXT("ServiceRequestInProcess"));
if (NULL == g_fnServiceRequest)
{
FreeLibrary (hInstRasmans);
RasmanOutputDebug("RasInitializeNoWait: g_fnServiceRequest==NULL!\n");
return ERROR_RASMAN_CANNOT_INITIALIZE;
}
return SUCCESS;
}
//
// Initialize winsock if we haven't done so already
//
if (!g_fWinsockInitialized)
{
int status = 0;
WSADATA wsaData;
status = WSAStartup(MAKEWORD(2,0), &wsaData);
if(0 != status)
{
return WSAGetLastError();
}
g_fWinsockInitialized = TRUE;
}
return SUCCESS ;
}
/*++
Routine Description:
Called to map the shared space into the attaching process.
Arguments:
Return Value:
SUCCESS
--*/
DWORD
RasInitialize ()
{
SC_HANDLE schandle = NULL;
SC_HANDLE svchandle = NULL;
SERVICE_STATUS status ;
BOOL fRasmanStarted = FALSE;
DWORD dwErr = ERROR_SUCCESS;
dwErr = RasInitializeNoWait ();
if (dwErr)
{
goto done;
}
//
// Get handles to check status of service and
// (if it is not started -) to start it.
//
if ( !(schandle = OpenSCManager(NULL,
NULL,
SC_MANAGER_CONNECT))
|| !(svchandle = OpenService(schandle,
RASMAN_SERVICE_NAME,SERVICE_START
|SERVICE_QUERY_STATUS)))
{
dwErr = GetLastError();
goto done;
}
while (TRUE)
{
//
// Check if service is already starting:
//
if (QueryServiceStatus(svchandle,&status) == FALSE)
{
dwErr = GetLastError();
goto done;
}
switch (status.dwCurrentState)
{
case SERVICE_STOPPED:
//
// If we had previously tried to start rasman
// and failed. Quit
//
if (fRasmanStarted)
{
RasmanOutputDebug("RasInitialize: SERVICE_STOPPED!\n");
dwErr = ERROR_RASMAN_CANNOT_INITIALIZE;
goto done;
}
if (StartService (svchandle, 0, NULL) == FALSE)
{
GlobalError = GetLastError() ;
RasmanOutputDebug("RasInitialize: StartService returned 0x%x\n",
GlobalError);
if(ERROR_SERVICE_ALREADY_RUNNING == GlobalError)
{
GlobalError = SUCCESS;
}
else if(SUCCESS != dwErr)
{
dwErr = ERROR_RASMAN_CANNOT_INITIALIZE;
goto done;
}
}
fRasmanStarted = TRUE;
break;
case SERVICE_START_PENDING:
Sleep (500L) ;
break ;
case SERVICE_RUNNING:
{
BOOL fRasmanProcess = IsRasmanProcess();
//
// This means that local rpc server is already running
// We should be able to connect to it if we haven't
// already
//
if ( !fRasmanProcess
&& (NULL != g_hBinding))
{
goto done;
}
if(!fRasmanProcess)
{
#if 0
DbgPrint("RasInitialize: Initializing rasman. pid %d\n",
GetCurrentProcessId());
#endif
if (dwErr = RasRpcConnect (NULL, &g_hBinding))
{
RasmanOutputDebug ("RasInitialize: Failed to "
"connect to local server. %d\n",
dwErr);
dwErr = ERROR_RASMAN_CANNOT_INITIALIZE;
goto done;
}
}
//
// Reference rasman only if this is not running in
// svchost.exe. Otherwise the service calling
// RasInitialize explicitly references rasman.
// Change this to be done in a more graceful
// way.
//
// GetStartupInfo(&startupinfo) ;
if (!fRasmanProcess)
{
if (dwErr = RasReferenceRasman(TRUE))
{
RasmanOutputDebug("RasInitialize: failed to "
"reference rasman. %d\n",
dwErr );
dwErr = ERROR_RASMAN_CANNOT_INITIALIZE;
goto done;
}
}
g_fRasInitialized = TRUE;
goto done;
}
default:
RasmanOutputDebug("RasInitialize: Invalid service.status=%d\n",
status.dwCurrentState);
dwErr = ERROR_RASMAN_CANNOT_INITIALIZE;
break;
}
}
done:
if(NULL != schandle)
{
CloseServiceHandle(schandle);
}
if(NULL != svchandle)
{
CloseServiceHandle(svchandle);
}
return dwErr ;
}
/*++
Routine Description:
Opens Port for which name is specified.
Arguments:
Return Value:
SUCCESS
ERROR_PORT_ALREADY_OPEN
ERROR_PORT_NOT_FOUND
--*/
DWORD APIENTRY
RasPortOpen ( PCHAR portname,
HPORT* porthandle,
HANDLE notifier)
{
DWORD pid ;
pid = GetCurrentProcessId() ;
return SubmitRequest( NULL,
REQTYPE_PORTOPEN,
portname,
notifier,
pid,
TRUE,
porthandle);
}
DWORD APIENTRY
RasPortOpenEx(CHAR *pszDeviceName,
DWORD dwDeviceLineCounter,
HPORT *phport,
HANDLE hnotifier,
DWORD *pdwUsageFlags)
{
DWORD retcode =
SubmitRequest(NULL,
REQTYPE_PORTOPENEX,
pszDeviceName,
dwDeviceLineCounter,
hnotifier,
TRUE,
pdwUsageFlags,
phport);
//
// If user name is not NULL and password is
// NULL and this is not the svchost process,
// get the user sid and save it in the ports
// user data
//
if( (ERROR_SUCCESS == retcode)
&& (!IsRasmanProcess()))
{
DWORD dwErr;
PWCHAR pszSid = LocalAlloc(LPTR, 5000);
if(NULL != pszSid)
{
dwErr = GetUserSid(pszSid, 5000);
if(ERROR_SUCCESS == dwErr)
{
dwErr = RasSetPortUserData(
*phport,
PORT_USERSID_INDEX,
(PBYTE) pszSid,
5000);
}
LocalFree(pszSid);
}
else
{
RasmanOutputDebug("RASMAN: RasPppStart: failed to allocate sid\n");
}
}
return retcode;
}
/*++
Routine Description:
Opens Port for which name is specified.
Arguments:
Return Value:
SUCCESS
ERROR_PORT_ALREADY_OPEN
ERROR_PORT_NOT_FOUND
--*/
DWORD APIENTRY
RasPortReserve (PCHAR portname, HPORT* porthandle)
{
DWORD pid ;
pid = GetCurrentProcessId() ;
return SubmitRequest( NULL,
REQTYPE_PORTOPEN,
portname,
NULL,
pid,
FALSE,
porthandle) ;
}
/*++
Routine Description:
Opens Port for which name is specified.
Arguments:
Return Value:
SUCCESS
ERROR_PORT_ALREADY_OPEN
ERROR_PORT_NOT_FOUND
--*/
DWORD APIENTRY
RasPortFree (HPORT porthandle)
{
DWORD pid ;
pid = GetCurrentProcessId() ;
if (ValidatePortHandle (porthandle) == FALSE)
{
return ERROR_INVALID_PORT_HANDLE ;
}
return SubmitRequest ( NULL,
REQTYPE_PORTCLOSE,
porthandle,
pid,
FALSE) ;
}
/*++
Routine Description:
Closes the Port for which the handle is specified.
Arguments:
Return Value:
SUCCESS
ERROR_INVALID_PORT_HANDLE
--*/
DWORD APIENTRY
RasPortClose (HPORT porthandle)
{
DWORD pid ;
pid = GetCurrentProcessId() ;
if (ValidatePortHandle (porthandle) == FALSE)
{
return ERROR_INVALID_PORT_HANDLE ;
}
return SubmitRequest ( NULL,
REQTYPE_PORTCLOSE,
porthandle,
pid,
TRUE) ;
}
/*++
Routine Description:
Enumerates all the Ports configured for RAS.
Arguments:
Return Value:
SUCCESS
ERROR_BUFFER_TOO_SMALL
--*/
DWORD APIENTRY
RasPortEnum (HANDLE hConnection,
PBYTE buffer,
PDWORD size,
PDWORD entries)
{
DWORD dwError = SUCCESS;
RAS_RPC *pRasRpcConnection = (RAS_RPC *) hConnection;
PBYTE buffer40 = NULL;
PBYTE buffer32 = NULL;
DWORD dwSize32 = 0;
DWORD dwsize40 = 0;
if(!ValidateConnectionHandle(hConnection))
{
dwError = E_INVALIDARG;
goto done;
}
//
// If the request is for a remote server and the server
// version is 4.0 - steelhead, then defer to the old way
// of getting this information since rasman has become
// a rpc server only in version 50.
//
if( NULL != pRasRpcConnection
&& VERSION_40 == pRasRpcConnection->dwVersion)
{
//
// Allocate 40 buffer
//
if(buffer != NULL)
{
dwsize40 = sizeof(RASMAN_PORT_400)
* ((*size)/sizeof(RASMAN_PORT));
buffer40 = LocalAlloc(LPTR, dwsize40);
if(NULL == buffer40)
{
dwError = GetLastError();
goto done;
}
}
dwError = RemoteRasPortEnum(hConnection,
buffer40,
&dwsize40,
entries);
if( (ERROR_SUCCESS == dwError)
&& (NULL != buffer))
{
DWORD i;
RASMAN_PORT *pPort = (RASMAN_PORT *) buffer;
RASMAN_PORT_400 *pPort400 = (RASMAN_PORT_400 *) buffer40;
//
// Copy over the information from the 40 buffer
// to 50 buffer
//
for(i = 0; i < *entries; i++)
{
pPort[i].P_Handle = pPort400[i].P_Handle;
strcpy(pPort[i].P_PortName,
pPort400[i].P_PortName);
pPort[i].P_Status = pPort400[i].P_Status;
pPort[i].P_ConfiguredUsage =
pPort400[i].P_ConfiguredUsage;
pPort[i].P_CurrentUsage = pPort400[i].P_CurrentUsage;
strcpy(pPort[i].P_MediaName,
pPort400[i].P_MediaName);
strcpy(pPort[i].P_DeviceType,
pPort400[i].P_DeviceType);
strcpy(pPort[i].P_DeviceName,
pPort400[i].P_DeviceName);
pPort[i].P_LineDeviceId = pPort400[i].P_LineDeviceId;
pPort[i].P_AddressId = pPort400[i].P_AddressId;
if(0 == _stricmp(pPort400[i].P_DeviceType,
"modem"))
{
pPort->P_rdtDeviceType = RDT_Modem;
}
else if(0 == _stricmp(pPort400[i].P_DeviceType,
"isdn"))
{
pPort->P_rdtDeviceType = RDT_Isdn;
}
else if(0 == _stricmp(pPort400[i].P_DeviceType,
"x25"))
{
pPort->P_rdtDeviceType = RDT_X25;
}
else if(0 == _stricmp(pPort400[i].P_DeviceType,
"vpn"))
{
pPort->P_rdtDeviceType = RDT_Tunnel_Pptp | RDT_Tunnel;
}
else
{
pPort->P_rdtDeviceType = RDT_Other;
}
}
}
else if(ERROR_BUFFER_TOO_SMALL == dwError)
{
*size = sizeof(RASMAN_PORT)
* (dwsize40/sizeof(RASMAN_PORT_400));
}
}
else
{
//
// Thunk the ports structure
//
if(NULL == size)
{
dwError = E_INVALIDARG;
goto done;
}
dwSize32 = (*size/sizeof(RASMAN_PORT)) * sizeof(RASMAN_PORT_32);
if(0 != dwSize32)
{
buffer32 = LocalAlloc(LPTR, dwSize32);
if(NULL == buffer32)
{
dwError = E_OUTOFMEMORY;
goto done;
}
}
dwError = SubmitRequest(hConnection,
REQTYPE_PORTENUM,
&dwSize32, //size,
buffer32, //buffer,
entries) ;
if( (dwError != ERROR_SUCCESS)
&& (dwError != ERROR_BUFFER_TOO_SMALL))
{
goto done;
}
if(*size < (dwSize32/sizeof(RASMAN_PORT_32)) * sizeof(RASMAN_PORT))
{
dwError = ERROR_BUFFER_TOO_SMALL;
}
*size = (dwSize32/sizeof(RASMAN_PORT_32)) * sizeof(RASMAN_PORT);
if(ERROR_SUCCESS == dwError)
{
DWORD i;
RASMAN_PORT *pPort;
RASMAN_PORT_32 *pPort32;
#if defined (_WIN64)
//
// Thunk the rasman port structures
//
for(i = 0; i < *entries; i++)
{
pPort = &((RASMAN_PORT *) buffer)[i];
pPort32 = &((RASMAN_PORT_32 *) buffer32 )[i];
//
// Copy handle
//
pPort->P_Handle = UlongToHandle(pPort32->P_Port);
//
// Copy rest of the structure - this should be the
// same for all platforms
//
CopyMemory(
(PBYTE) pPort + FIELD_OFFSET(RASMAN_PORT, P_PortName),
(PBYTE) pPort32 + FIELD_OFFSET(RASMAN_PORT_32, P_PortName),
sizeof(RASMAN_PORT_32) - sizeof(DWORD));
}
#else
if(NULL != buffer32)
CopyMemory(buffer, buffer32, *size);
#endif
}
}
done:
if(NULL != buffer40)
{
LocalFree(buffer40);
}
if(NULL != buffer32)
{
LocalFree(buffer32);
}
return dwError;
}
/*++
Routine Description:
Gets parameters (info) for the Port for which handle
is supplied
Arguments:
Return Value:
SUCCESS
ERROR_BUFFER_TOO_SMALL
ERROR_INVALID_PORT_HANDLE
--*/
DWORD APIENTRY
RasPortGetInfo ( HANDLE hConnection,
HPORT porthandle,
PBYTE buffer,
PDWORD size)
{
DWORD dwError = SUCCESS;
RAS_RPC *pRasRpcConnection = (RAS_RPC *) hConnection;
if (ValidatePortHandle (porthandle) == FALSE)
{
dwError = ERROR_INVALID_PORT_HANDLE;
goto done;
}
if(!ValidateConnectionHandle(hConnection))
{
dwError = E_INVALIDARG;
goto done;
}
//
// If the request is for a remote server and the server
// version is 4.0 - steelhead, then defer to the old way
// of getting this information since rasman has become
// a rpc server only in version 50.
//
if( NULL != pRasRpcConnection
&& VERSION_40 == pRasRpcConnection->dwVersion)
{
dwError = RemoteRasPortGetInfo(hConnection,
porthandle,
buffer,
size);
}
else
{
dwError = SubmitRequest(hConnection,
REQTYPE_PORTGETINFO,
porthandle,
buffer,
size);
}
done:
return dwError;
}
/*++
Routine Description:
Sets parameters (info) for the Port for which handle
is supplied
Arguments:
Return Value:
SUCCESS
ERROR_CANNOT_SET_PORT_INFO
ERROR_WRONG_INFO_SPECIFIED
ERROR_INVALID_PORT_HANDLE
--*/
DWORD APIENTRY
RasPortSetInfo (HPORT porthandle,
RASMAN_PORTINFO* info)
{
DWORD size=info->PI_NumOfParams*sizeof(RAS_PARAMS) ;
if (ValidatePortHandle (porthandle) == FALSE)
{
return ERROR_INVALID_PORT_HANDLE ;
}
return SubmitRequest ( NULL,
REQTYPE_PORTSETINFO,
porthandle,
info) ;
}
/*++
Routine Description:
Disconnects the port for which handle is supplied.
Arguments:
Return Value:
PENDING
ERROR_NOT_CONNECTED
ERROR_EVENT_INVALID
ERROR_INVALID_PORT_HANDLE
anything GetLastError returns from CreateEvent calls
--*/
DWORD APIENTRY
RasPortDisconnect (HPORT porthandle,
HANDLE winevent)
{
DWORD pid ;
HANDLE hEvent;
DWORD dwError;
BOOL fCreateEvent = FALSE;
if (ValidatePortHandle (porthandle) == FALSE)
{
dwError = ERROR_INVALID_PORT_HANDLE ;
goto done;
}
fCreateEvent = !!(INVALID_HANDLE_VALUE == winevent);
if (fCreateEvent)
{
hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
if (NULL == hEvent)
{
fCreateEvent = FALSE;
dwError = GetLastError();
goto done;
}
}
else
{
hEvent = winevent;
}
pid = GetCurrentProcessId () ;
dwError = SubmitRequest( NULL,
REQTYPE_PORTDISCONNECT,
porthandle,
hEvent,
pid);
if ( fCreateEvent
&& PENDING == dwError)
{
//
// Wait till the pending operation
// is done. We are making this call synchronous.
//
WaitForSingleObject(hEvent, INFINITE);
//
//clear the pending error
//
dwError = SUCCESS;
}
if (ERROR_ALREADY_DISCONNECTING == dwError)
{
//
// hit the rare case where there is already
// a disconnect pending on this port and the
// event handle was thrown away. Sleep for
// 5s. before proceeding. The actual disconnect
// should have happened by then. The disconnect
// timeout is 10s in rasman.
//
Sleep(5000);
dwError = ERROR_SUCCESS;
}
done:
if (fCreateEvent)
{
CloseHandle(hEvent);
}
return dwError;
}
/*++
Routine Description:
Sends supplied buffer. If connected writes to RASHUB.
Else it writes to the port directly.
Arguments:
Return Value:
SUCCESS
ERROR_BUFFER_INVALID
ERROR_EVENT_INVALID
ERROR_INVALID_PORT_HANDLE
--*/
DWORD APIENTRY
RasPortSend ( HPORT porthandle,
PBYTE buffer,
DWORD size)
{
NDISWAN_IO_PACKET *pPacket;
SendRcvBuffer *pSendRcvBuffer;
if (ValidatePortHandle (porthandle) == FALSE)
{
return ERROR_INVALID_PORT_HANDLE ;
}
//
// Get Pointer to ndiswan io data
//
pPacket = CONTAINING_RECORD (buffer, NDISWAN_IO_PACKET, PacketData);
//
// Get Pointer to SendRcvBuffer
//
pSendRcvBuffer = CONTAINING_RECORD (pPacket, SendRcvBuffer, SRB_Packet);
return SubmitRequest( NULL,
REQTYPE_PORTSEND,
porthandle,
pSendRcvBuffer,
size );
}
/*++
Routine Description:
Receives in supplied buffer. If connected reads through
RASHUB. Else, it writes to the port directly.
Arguments:
Return Value:
PENDING
ERROR_BUFFER_INVALID
ERROR_EVENT_INVALID
ERROR_INVALID_PORT_HANDLE
--*/
DWORD APIENTRY
RasPortReceive ( HPORT porthandle,
PBYTE buffer,
PDWORD size,
DWORD timeout,
HANDLE winevent)
{
DWORD pid ;
NDISWAN_IO_PACKET *pPacket;
SendRcvBuffer *pSendRcvBuffer;
if (ValidatePortHandle (porthandle) == FALSE)
{
return ERROR_INVALID_PORT_HANDLE ;
}
pid = GetCurrentProcessId () ;
//
// Get Pointer to ndiswan io data
//
pPacket = CONTAINING_RECORD ( buffer, NDISWAN_IO_PACKET, PacketData );
//
// Get Pointer to SendRcvBuffer
//
pSendRcvBuffer = CONTAINING_RECORD ( pPacket, SendRcvBuffer, SRB_Packet );
return SubmitRequest ( NULL,
REQTYPE_PORTRECEIVE,
porthandle,
pSendRcvBuffer,
size,
timeout,
winevent,
pid) ;
}
DWORD APIENTRY
RasPortReceiveEx ( HPORT porthandle,
PBYTE buffer,
PDWORD size )
{
if (ValidatePortHandle (porthandle) == FALSE)
{
return ERROR_INVALID_PORT_HANDLE;
}
return SubmitRequest ( NULL,
REQTYPE_PORTRECEIVEEX,
porthandle,
buffer,
size);
}
/*++
Routine Description:
Cancels a previously pending receive
Arguments:
Return Value:
SUCCESS
ERROR_INVALID_PORT_HANDLE
--*/
DWORD APIENTRY
RasPortCancelReceive (HPORT porthandle)
{
if (ValidatePortHandle (porthandle) == FALSE)
{
return ERROR_INVALID_PORT_HANDLE ;
}
return SubmitRequest (NULL,
REQTYPE_CANCELRECEIVE,
porthandle) ;
}
/*++
Routine Description:
Posts a listen on the device connected to the port.
Arguments:
Return Value:
PENDING
ERROR_EVENT_INVALID
ERROR_INVALID_PORT_HANDLE
--*/
DWORD APIENTRY
RasPortListen( HPORT porthandle,
ULONG timeout,
HANDLE winevent)
{
DWORD pid ;
if (ValidatePortHandle (porthandle) == FALSE)
{
return ERROR_INVALID_PORT_HANDLE ;
}
pid = GetCurrentProcessId () ;
return SubmitRequest ( NULL,
REQTYPE_PORTLISTEN,
porthandle,
timeout,
winevent,
pid) ;
}
/*++
Routine Description:
Changes state of port to CONNECTED and does other
necessary switching.
Arguments:
Return Value:
SUCCESS
ERROR_INVALID_PORT_HANDLE
--*/
DWORD APIENTRY
RasPortConnectComplete (HPORT porthandle)
{
if (ValidatePortHandle (porthandle) == FALSE)
{
return ERROR_INVALID_PORT_HANDLE ;
}
return SubmitRequest ( NULL,
REQTYPE_PORTCONNECTCOMPLETE,
porthandle) ;
}
/*++
Routine Description:
Fetches statistics for the port for which the handle
is supplied
Arguments:
Return Value:
SUCCESS
ERROR_INVALID_PORT_HANDLE
--*/
DWORD APIENTRY
RasPortGetStatistics ( HANDLE hConnection,
HPORT porthandle,
PBYTE statbuffer,
PDWORD size)
{
DWORD dwError = SUCCESS;
if (ValidatePortHandle (porthandle) == FALSE)
{
dwError = ERROR_INVALID_PORT_HANDLE;
goto done;
}
if(!ValidateConnectionHandle(hConnection))
{
dwError = ERROR_INVALID_PORT_HANDLE;
goto done;
}
dwError = SubmitRequest ( hConnection,
REQTYPE_PORTGETSTATISTICS,
porthandle,
statbuffer,
size) ;
done:
return dwError;
}
/*++
Routine Description:
Fetches statistics for the bundle for which the handle
is supplied
Arguments:
Return Value:
SUCCESS
ERROR_INVALID_PORT_HANDLE
--*/
DWORD APIENTRY
RasBundleGetStatistics ( HANDLE hConnection,
HPORT porthandle,
PBYTE statbuffer,
PDWORD size)
{
DWORD dwError = SUCCESS;
if (ValidatePortHandle (porthandle) == FALSE)
{
dwError = ERROR_INVALID_PORT_HANDLE;
goto done;
}
if(!ValidateConnectionHandle(hConnection))
{
dwError = E_INVALIDARG;
goto done;
}
dwError = SubmitRequest (hConnection,
REQTYPE_BUNDLEGETSTATISTICS,
porthandle,
statbuffer,
size) ;
done:
return dwError;
}
DWORD APIENTRY
RasPortGetStatisticsEx ( HANDLE hConnection,
HPORT porthandle,
PBYTE statBuffer,
PDWORD size)
{
DWORD dwError = SUCCESS;
if (ValidatePortHandle (porthandle) == FALSE)
{
dwError = ERROR_INVALID_HANDLE;
goto done;
}
if(!ValidateConnectionHandle(hConnection))
{
dwError = E_INVALIDARG;
goto done;
}
dwError = SubmitRequest(hConnection,
REQTYPE_PORTGETSTATISTICSEX,
porthandle,
statBuffer,
size);
done:
return dwError;
}
DWORD APIENTRY
RasBundleGetStatisticsEx ( HANDLE hConnection,
HPORT portHandle,
PBYTE statbuffer,
PDWORD size)
{
DWORD dwError = SUCCESS;
if (ValidatePortHandle (portHandle) == FALSE)
{
dwError = ERROR_INVALID_PORT_HANDLE;
goto done;
}
if(!ValidateConnectionHandle(hConnection))
{
dwError = E_INVALIDARG;
goto done;
}
dwError = SubmitRequest ( hConnection,
REQTYPE_BUNDLEGETSTATISTICSEX,
portHandle,
statbuffer,
size);
done:
return dwError;
}
/*++
Routine Description:
Clears statistics for the port for which the handle
is supplied
Arguments:
Return Value:
SUCCESS
ERROR_INVALID_PORT_HANDLE
--*/
DWORD APIENTRY RasPortClearStatistics (HANDLE hConnection,
HPORT porthandle)
{
DWORD dwError = SUCCESS;
if (ValidatePortHandle (porthandle) == FALSE)
{
dwError = ERROR_INVALID_PORT_HANDLE;
goto done;
}
if(!ValidateConnectionHandle(hConnection))
{
dwError = E_INVALIDARG;
goto done;
}
dwError = SubmitRequest ( hConnection,
REQTYPE_PORTCLEARSTATISTICS,
porthandle) ;
done:
return dwError;
}
/*++
Routine Description:
Clears statistics for the bundle for which the
handle is supplied
Arguments:
Return Value:
SUCCESS
ERROR_INVALID_PORT_HANDLE
--*/
DWORD APIENTRY RasBundleClearStatistics(HANDLE hConnection,
HPORT porthandle)
{
DWORD dwError = SUCCESS;
if (ValidatePortHandle (porthandle) == FALSE)
{
dwError = ERROR_INVALID_PORT_HANDLE;
goto done;
}
if(!ValidateConnectionHandle(hConnection))
{
dwError = E_INVALIDARG;
goto done;
}
dwError = SubmitRequest ( hConnection,
REQTYPE_BUNDLECLEARSTATISTICS,
porthandle) ;
done:
return dwError;
}
DWORD APIENTRY RasBundleClearStatisticsEx(HANDLE hConnection,
HCONN hconn)
{
DWORD dwErr;
HPORT hPort;
dwErr = RasBundleGetPort(hConnection,
(HBUNDLE) hconn,
&hPort);
if (dwErr)
{
goto done;
}
dwErr = SubmitRequest ( hConnection,
REQTYPE_BUNDLECLEARSTATISTICS,
hPort);
done:
return dwErr;
}
/*++
Routine Description:
Enumerates all the devices of a device type.
Arguments:
Return Value:
SUCCESS
ERROR_DEVICE_DOES_NOT_EXIST
ERROR_BUFFER_TOO_SMALL
--*/
DWORD APIENTRY
RasDeviceEnum (HANDLE hConnection,
PCHAR devicetype,
PBYTE buffer,
PDWORD size,
PDWORD entries)
{
DWORD dwError = SUCCESS;
RAS_RPC *pRasRpcConnection = (RAS_RPC *) hConnection;
if(!ValidateConnectionHandle(hConnection))
{
dwError = E_INVALIDARG;
goto done;
}
//
// If the request is for a remote server and the server
// version is 4.0 - steelhead, then defer to the old way
// of getting this information since rasman has become
// a rpc server only in version 50.
//
if( pRasRpcConnection
&& VERSION_40 == pRasRpcConnection->dwVersion)
{
dwError = RemoteRasDeviceEnum(hConnection,
devicetype,
buffer,
size,
entries);
}
else
{
dwError = SubmitRequest ( hConnection,
REQTYPE_DEVICEENUM,
devicetype,
size,
buffer,
entries
);
}
done:
return dwError;
}
/*++
Routine Description:
Gets info for the specified device.
Arguments:
Return Value:
SUCCESS
ERROR_INVALID_PORT_HANDLE
ERROR_DEVICETYPE_DOES_NOT_EXIST
ERROR_DEVICE_DOES_NOT_EXIST
ERROR_BUFFER_TOO_SMALL
--*/
DWORD APIENTRY
RasDeviceGetInfo ( HANDLE hConnection,
HPORT porthandle,
PCHAR devicetype,
PCHAR devicename,
PBYTE buffer,
PDWORD size)
{
DWORD dwError = SUCCESS;
if (ValidatePortHandle (porthandle) == FALSE)
{
dwError = ERROR_INVALID_PORT_HANDLE;
goto done;
}
if(!ValidateConnectionHandle(hConnection))
{
dwError = E_INVALIDARG;
goto done;
}
dwError = SubmitRequest ( hConnection,
REQTYPE_DEVICEGETINFO,
porthandle,
devicetype,
devicename,
buffer,
size) ;
done:
return dwError;
}
/*++
Routine Description:
Sets info for the specified device.
Arguments:
Return Value:
SUCCESS
ERROR_INVALID_PORT_HANDLE
ERROR_DEVICETYPE_DOES_NOT_EXIST
ERROR_DEVICE_DOES_NOT_EXIST
ERROR_INVALID_INFO_SPECIFIED
--*/
DWORD APIENTRY
RasDeviceSetInfo (HPORT porthandle,
PCHAR devicetype,
PCHAR devicename,
RASMAN_DEVICEINFO* info)
{
DWORD i,
dwOldIndex,
dwcbOldString = 0,
retcode;
PCHAR szOldString = NULL;
BOOL fVpn = FALSE;
RASMAN_INFO ri;
if (ValidatePortHandle (porthandle) == FALSE)
{
return ERROR_INVALID_PORT_HANDLE ;
}
retcode = RasGetInfo(NULL,
porthandle,
&ri);
if(ERROR_SUCCESS == retcode)
{
if(0 == _stricmp(ri.RI_szDeviceType,
"vpn"))
{
fVpn = TRUE;
}
}
if (fVpn)
{
for (i = 0; i < info->DI_NumOfParams; i++)
{
//
// We're only looking for the
// MXS_PHONENUMBER_KEY key.
//
if ( info->DI_Params[i].P_Type != String
|| _stricmp(info->DI_Params[i].P_Key,
MXS_PHONENUMBER_KEY))
{
continue;
}
//
// We found it. If the phone number is a
// DNS address, convert it to an IP address.
//
if (inet_addr(info->DI_Params[i].P_Value.String.Data)
== -1L)
{
struct hostent *hostp;
DWORD dwErr;
DWORD *pdwAddress;
DWORD cAddresses;
DWORD dwAddress;
dwErr = DwRasGetHostByName(
info->DI_Params[i].P_Value.String.Data,
&pdwAddress,
&cAddresses);
//
// If gethostbyname() succeeds, then replace
// the DNS address with the IP address.
//
/*
hostp = gethostbyname(
info->DI_Params[i].P_Value.String.Data
);
*/
if ( (SUCCESS == dwErr)
&& (0 != cAddresses)
&& (0 != (dwAddress = *pdwAddress)))
{
struct in_addr in;
in.s_addr = dwAddress;
//
// We save the old string value away,
// and set the new value. The old
// value will be restored after the
// call to SubmitRequest(). This works
// because SubmitRequest() has to copy
// the user's params anyway.
//
szOldString =
info->DI_Params[i].P_Value.String.Data;
dwcbOldString =
info->DI_Params[i].P_Value.String.Length;
info->DI_Params[i].P_Value.String.Data =
inet_ntoa(in);
info->DI_Params[i].P_Value.String.Length =
strlen(info->DI_Params[i].P_Value.String.Data);
dwOldIndex = i;
}
if(NULL != pdwAddress)
{
LocalFree(pdwAddress);
}
}
}
}
retcode = SubmitRequest ( NULL,
REQTYPE_DEVICESETINFO,
porthandle,
devicetype,
devicename,
info) ;
if (dwcbOldString)
{
info->DI_Params[dwOldIndex].P_Value.String.Data =
szOldString;
info->DI_Params[dwOldIndex].P_Value.String.Length =
dwcbOldString;
}
return retcode;
}
/*++
Routine Description:
Connects through the device specified.
Arguments:
Return Value:
PENDING
ERROR_INVALID_PORT_HANDLE
ERROR_DEVICETYPE_DOES_NOT_EXIST
ERROR_DEVICE_DOES_NOT_EXIST
ERROR_INVALID_INFO_SPECIFIED
--*/
DWORD APIENTRY
RasDeviceConnect ( HPORT porthandle,
PCHAR devicetype,
PCHAR devicename,
ULONG timeout,
HANDLE winevent)
{
DWORD pid ;
if (ValidatePortHandle (porthandle) == FALSE)
{
return ERROR_INVALID_PORT_HANDLE ;
}
pid = GetCurrentProcessId () ;
return SubmitRequest ( NULL,
REQTYPE_DEVICECONNECT,
porthandle,
devicetype,
devicename,
timeout,
winevent,
pid) ;
}
/*++
Routine Description:
Gets general info for the port for which handle is
supplied.
Arguments:
Return Value:
SUCCESS
ERROR_INVALID_PORT_HANDLE
--*/
DWORD APIENTRY
RasGetInfo (HANDLE hConnection,
HPORT porthandle,
RASMAN_INFO* info)
{
DWORD dwError = SUCCESS;
if (ValidatePortHandle (porthandle) == FALSE)
{
dwError = ERROR_INVALID_PORT_HANDLE;
goto done;
}
if(!ValidateConnectionHandle(hConnection))
{
dwError = E_INVALIDARG;
goto done;
}
dwError = SubmitRequest ( hConnection,
REQTYPE_GETINFO,
porthandle,
info) ;
done:
return dwError;
}
/*++
Routine Description:
Gets general info for all the ports.
Arguments:
Return Value:
SUCCESS
--*/
DWORD APIENTRY
RasGetInfoEx (HANDLE hConnection,
RASMAN_INFO* info,
PWORD entries)
{
return ERROR_NOT_SUPPORTED;
#if 0
DWORD dwError = SUCCESS;
if (info == NULL)
{
dwError = ERROR_BUFFER_TOO_SMALL;
goto done;
}
if(!ValidateConnectionHandle(hConnection))
{
dwError = E_INVALIDARG;
goto done;
}
dwError = SubmitRequest (hConnection,
REQTYPE_GETINFOEX,
info) ;
done:
return dwError;
#endif
}
/*++
Routine Description:
Gets a buffer to be used with send and receive.
Arguments:
Return Value:
SUCCESS
ERROR_OUT_OF_BUFFERS
--*/
DWORD APIENTRY
RasGetBuffer (PBYTE* buffer, PDWORD size)
{
HANDLE handle = NULL;
DWORD retcode = SUCCESS;
SendRcvBuffer *pSendRcvBuffer = NULL;
//
// Alloc a buffer
//
pSendRcvBuffer = LocalAlloc (LPTR,
sizeof (SendRcvBuffer));
if (NULL == pSendRcvBuffer)
{
retcode = GetLastError();
RasmanOutputDebug ("RASMAN: RasGetBuffer Failed to "
"allocate. %d\n",
retcode);
goto done;
}
pSendRcvBuffer->SRB_Pid = GetCurrentProcessId();
*size = (*size < MAX_SENDRCVBUFFER_SIZE)
? *size
: MAX_SENDRCVBUFFER_SIZE;
*buffer = pSendRcvBuffer->SRB_Packet.PacketData;
done:
return retcode ;
}
/*++
Routine Description:
Frees a buffer gotten earlier with RasGetBuffer()
Arguments:
Return Value:
SUCCESS
ERROR_BUFFER_INVALID
--*/
DWORD APIENTRY
RasFreeBuffer (PBYTE buffer)
{
HANDLE handle;
DWORD retcode = SUCCESS;
SendRcvBuffer *pSendRcvBuffer;
NDISWAN_IO_PACKET *pPacket;
//
// Get Pointer to ndiswan io data
//
pPacket = CONTAINING_RECORD(buffer, NDISWAN_IO_PACKET, PacketData);
//
// Get Pointer to SendRcvBuffer
//
pSendRcvBuffer = CONTAINING_RECORD(pPacket, SendRcvBuffer, SRB_Packet);
LocalFree (pSendRcvBuffer);
return retcode ;
}
/*++
Routine Description:
Retrieves information about protocols configured
in the system.
Arguments:
Return Value:
SUCCESS
ERROR_BUFFER_TOO_SMALL
--*/
DWORD APIENTRY
RasProtocolEnum ( PBYTE buffer,
PDWORD size,
PDWORD entries)
{
return SubmitRequest ( NULL,
REQTYPE_PROTOCOLENUM,
size,
buffer,
entries) ;
}
/*++
Routine Description:
Allocates a route (binding) without actually activating it.
Arguments:
Return Value:
SUCCESS
ERROR_INVALID_PORT_HANDLE
ERROR_ROUTE_NOT_AVAILABLE
--*/
DWORD APIENTRY
RasAllocateRoute ( HPORT porthandle,
RAS_PROTOCOLTYPE type,
BOOL wrknet,
RASMAN_ROUTEINFO* info)
{
if (ValidatePortHandle (porthandle) == FALSE)
{
return ERROR_INVALID_PORT_HANDLE ;
}
//
// Even though this can be done by this process - we pass
// this on to the requestor thread since we get the
// serialization for free.
//
return SubmitRequest ( NULL,
REQTYPE_ALLOCATEROUTE,
porthandle,
type,
wrknet,
info) ;
}
/*++
Routine Description:
Activates a previously allocated route (binding).
Arguments:
Return Value:
SUCCESS
ERROR_INVALID_PORT_HANDLE
ERROR_ROUTE_NOT_AVAILABLE
--*/
DWORD APIENTRY
RasActivateRoute ( HPORT porthandle,
RAS_PROTOCOLTYPE type,
RASMAN_ROUTEINFO* info,
PROTOCOL_CONFIG_INFO *config)
{
if (ValidatePortHandle (porthandle) == FALSE)
{
return ERROR_INVALID_PORT_HANDLE ;
}
return SubmitRequest ( NULL,
REQTYPE_ACTIVATEROUTE,
porthandle,
type,
config,
info) ;
}
/*++
Routine Description:
Activates a previously allocated route (binding).
Allows you to set the max frame size as well
Arguments:
Return Value:
SUCCESS
ERROR_INVALID_PORT_HANDLE
ERROR_ROUTE_NOT_AVAILABLE
--*/
DWORD APIENTRY
RasActivateRouteEx ( HPORT porthandle,
RAS_PROTOCOLTYPE type,
DWORD framesize,
RASMAN_ROUTEINFO* info,
PROTOCOL_CONFIG_INFO *config)
{
if (ValidatePortHandle (porthandle) == FALSE)
{
return ERROR_INVALID_PORT_HANDLE ;
}
return SubmitRequest ( NULL,
REQTYPE_ACTIVATEROUTEEX,
porthandle,
type,
framesize,
config,
info) ;
}
/*++
Routine Description:
DeAllocates a route (binding) that was previously
activated.
Arguments:
Return Value:
SUCCESS
ERROR_INVALID_PORT_HANDLE
ERROR_ROUTE_NOT_ALLOCATED
--*/
DWORD APIENTRY
RasDeAllocateRoute ( HBUNDLE hbundle,
RAS_PROTOCOLTYPE type)
{
return SubmitRequest ( NULL,
REQTYPE_DEALLOCATEROUTE,
hbundle,
type) ;
}
/*++
Routine Description:
Gets compression information for the port.
Arguments:
Return Value:
SUCCESS
ERROR_INVALID_PORT_HANDLE
--*/
DWORD APIENTRY
RasCompressionGetInfo ( HPORT porthandle,
RAS_COMPRESSION_INFO *send,
RAS_COMPRESSION_INFO *recv)
{
if (ValidatePortHandle (porthandle) == FALSE)
{
return ERROR_INVALID_PORT_HANDLE ;
}
return SubmitRequest ( NULL,
REQTYPE_COMPRESSIONGETINFO,
porthandle,
send,
recv ) ;
}
/*++
Routine Description:
Sets compression information for the port.
Arguments:
Return Value:
SUCCESS
ERROR_INVALID_PORT_HANDLE
ERROR_INVALID_COMPRESSION_SPECIFIED
--*/
DWORD APIENTRY
RasCompressionSetInfo ( HPORT porthandle,
RAS_COMPRESSION_INFO *send,
RAS_COMPRESSION_INFO *recv)
{
if (ValidatePortHandle (porthandle) == FALSE)
{
return ERROR_INVALID_PORT_HANDLE ;
}
return SubmitRequest( NULL,
REQTYPE_COMPRESSIONSETINFO,
porthandle,
send,
recv) ;
}
/*++
Routine Description:
Gets user credentials (username, password) from LSA.
Arguments:
Return Value:
SUCCESS
Non zero (failure)
--*/
DWORD APIENTRY
RasGetUserCredentials(
PBYTE pChallenge,
PLUID LogonId,
PWCHAR UserName,
PBYTE CaseSensitiveChallengeResponse,
PBYTE CaseInsensitiveChallengeResponse,
PBYTE LMSessionKey,
PBYTE UserSessionKey
)
{
return SubmitRequest (
NULL,
REQTYPE_GETUSERCREDENTIALS,
pChallenge,
LogonId,
UserName,
CaseSensitiveChallengeResponse,
CaseInsensitiveChallengeResponse,
LMSessionKey,
UserSessionKey) ;
}
/*++
Routine Description:
Changes user's cached credentials with LSA.
Arguments:
Return Value:
SUCCESS
Non zero (failure)
--*/
DWORD APIENTRY
RasSetCachedCredentials(
PCHAR Account,
PCHAR Domain,
PCHAR NewPassword )
{
return
SubmitRequest(
NULL,
REQTYPE_SETCACHEDCREDENTIALS,
Account,
Domain,
NewPassword );
}
/*++
Routine Description:
A request event is assocaited with a port for signalling
Arguments:
Return Value:
SUCCESS
ERROR_EVENT_INVALID
ERROR_INVALID_PORT_HANDLE
--*/
DWORD APIENTRY
RasRequestNotification (HPORT porthandle, HANDLE winevent)
{
DWORD pid ;
if (ValidatePortHandle (porthandle) == FALSE)
{
return ERROR_INVALID_PORT_HANDLE ;
}
pid = GetCurrentProcessId () ;
return SubmitRequest ( NULL,
REQTYPE_REQUESTNOTIFICATION,
porthandle,
winevent,
pid) ;
}
/*++
Routine Description:
Gets the lan nets lana numbers read from the
registry by Rasman
Arguments:
Return Value:
SUCCESS
--*/
DWORD APIENTRY
RasEnumLanNets ( DWORD *count,
UCHAR* lanas)
{
return SubmitRequest ( NULL,
REQTYPE_ENUMLANNETS,
count,
lanas) ;
}
/*++
Routine Description:
Gets the lan nets lana numbers read from the
registry by Rasman
Arguments:
Return Value:
SUCCESS
--*/
DWORD APIENTRY
RasPortEnumProtocols ( HANDLE hConnection,
HPORT porthandle,
RAS_PROTOCOLS* protocols,
PDWORD count)
{
DWORD dwError = SUCCESS;
if (ValidatePortHandle (porthandle) == FALSE)
{
dwError = ERROR_INVALID_PORT_HANDLE;
goto done;
}
if(!ValidateConnectionHandle(hConnection))
{
dwError = E_INVALIDARG;
goto done;
}
dwError = SubmitRequest (hConnection,
REQTYPE_PORTENUMPROTOCOLS,
porthandle,
protocols,
count) ;
done:
return dwError;
}
/*++
Routine Description:
Sets the framing type once the port is connected
Arguments:
Return Value:
SUCCESS
--*/
DWORD APIENTRY
RasPortSetFraming ( HPORT porthandle,
RAS_FRAMING type,
RASMAN_PPPFEATURES *Send,
RASMAN_PPPFEATURES *Recv)
{
DWORD sendfeatures = 0 ;
DWORD recvfeatures = 0 ;
DWORD sendbits = 0 ;
DWORD recvbits = 0 ;
if (ValidatePortHandle (porthandle) == FALSE)
{
return ERROR_INVALID_PORT_HANDLE ;
}
if (type == PPP)
{
sendfeatures = PPP_FRAMING ;
if (Send)
{
sendfeatures |= (Send->ACFC
? PPP_COMPRESS_ADDRESS_CONTROL
: 0) ;
sendbits = Send->ACCM ;
}
recvfeatures = PPP_FRAMING ;
if (Recv)
{
recvfeatures |= (Recv->ACFC
? PPP_COMPRESS_ADDRESS_CONTROL
: 0) ;
recvbits = Recv->ACCM ;
}
}
else if (type == SLIP)
{
sendfeatures = recvfeatures = SLIP_FRAMING ;
}
else if (type == SLIPCOMP)
{
sendfeatures = recvfeatures = SLIP_FRAMING
| SLIP_VJ_COMPRESSION ;
}
else if (type == SLIPCOMPAUTO)
{
sendfeatures = recvfeatures = SLIP_FRAMING
| SLIP_VJ_AUTODETECT ;
}
else if (type == RAS)
{
sendfeatures = recvfeatures = OLD_RAS_FRAMING ;
}
else if (type == AUTODETECT)
{
}
return SubmitRequest ( NULL,
REQTYPE_SETFRAMING,
porthandle,
sendfeatures,
recvfeatures,
sendbits,
recvbits) ;
}
DWORD APIENTRY
RasPortStoreUserData ( HPORT porthandle,
PBYTE data,
DWORD size)
{
if (ValidatePortHandle (porthandle) == FALSE)
return ERROR_INVALID_PORT_HANDLE ;
return SubmitRequest ( NULL,
REQTYPE_STOREUSERDATA,
porthandle,
data,
size) ;
}
DWORD APIENTRY
RasPortRetrieveUserData ( HPORT porthandle,
PBYTE data,
DWORD *size)
{
if (ValidatePortHandle (porthandle) == FALSE)
return ERROR_INVALID_PORT_HANDLE ;
return SubmitRequest ( NULL,
REQTYPE_RETRIEVEUSERDATA,
porthandle,
data,
size) ;
}
/*++
Routine Description:
A generic scheme for apps to attach disconnect
action that must be performed when the link drops.
Arguments:
Return Value:
SUCCESS
ERROR_INVALID_PORT_HANDLE
ERROR_PORT_NOT_OPEN
--*/
DWORD APIENTRY
RasPortRegisterSlip (HPORT porthandle,
DWORD ipaddr,
DWORD dwFrameSize,
BOOL priority,
WCHAR *pszDNSAddress,
WCHAR *pszDNS2Address,
WCHAR *pszWINSAddress,
WCHAR *pszWINS2Address)
{
if (ValidatePortHandle (porthandle) == FALSE)
{
return ERROR_INVALID_PORT_HANDLE ;
}
return SubmitRequest (NULL,
REQTYPE_REGISTERSLIP,
porthandle,
ipaddr,
dwFrameSize,
priority,
pszDNSAddress,
pszDNS2Address,
pszWINSAddress,
pszWINS2Address);
}
/*++
Routine Description:
Sets the framing info once the port is connected
Arguments:
Return Value:
SUCCESS
--*/
DWORD APIENTRY
RasPortSetFramingEx ( HPORT porthandle,
RAS_FRAMING_INFO *info)
{
if (ValidatePortHandle (porthandle) == FALSE)
{
return ERROR_INVALID_PORT_HANDLE ;
}
return SubmitRequest ( NULL,
REQTYPE_SETFRAMINGEX,
porthandle,
info) ;
}
/*++
Routine Description:
Gets the framing info once the port is connected
Arguments:
Return Value:
SUCCESS
--*/
DWORD APIENTRY
RasPortGetFramingEx ( HANDLE hConnection,
HPORT porthandle,
RAS_FRAMING_INFO *info)
{
DWORD dwError = SUCCESS;
if (ValidatePortHandle (porthandle) == FALSE)
{
dwError = ERROR_INVALID_PORT_HANDLE;
goto done;
}
if(!ValidateConnectionHandle(hConnection))
{
dwError = E_INVALIDARG;
goto done;
}
dwError = SubmitRequest ( hConnection,
REQTYPE_GETFRAMINGEX,
porthandle,
info) ;
done:
return dwError;
}
/*++
Routine Description:
Gets the protocol compression attributes for the port
Arguments:
Return Value:
SUCCESS
--*/
DWORD APIENTRY
RasPortGetProtocolCompression (HPORT porthandle,
RAS_PROTOCOLTYPE type,
RAS_PROTOCOLCOMPRESSION *send,
RAS_PROTOCOLCOMPRESSION *recv)
{
if (ValidatePortHandle (porthandle) == FALSE)
{
return ERROR_INVALID_PORT_HANDLE ;
}
return SubmitRequest (NULL,
REQTYPE_GETPROTOCOLCOMPRESSION,
porthandle,
type,
send,
recv) ;
}
/*++
Routine Description:
Gets the protocol compression attributes for the port
Arguments:
Return Value:
SUCCESS
--*/
DWORD APIENTRY
RasPortSetProtocolCompression (HPORT porthandle,
RAS_PROTOCOLTYPE type,
RAS_PROTOCOLCOMPRESSION *send,
RAS_PROTOCOLCOMPRESSION *recv)
{
if (ValidatePortHandle (porthandle) == FALSE)
{
return ERROR_INVALID_PORT_HANDLE ;
}
return SubmitRequest (NULL,
REQTYPE_SETPROTOCOLCOMPRESSION,
porthandle,
type,
send,
recv) ;
}
/*++
Routine Description:
Gets the framing capabilities for the
port from the mac
Arguments:
Return Value:
SUCCESS
--*/
DWORD APIENTRY
RasGetFramingCapabilities ( HPORT porthandle,
RAS_FRAMING_CAPABILITIES* caps)
{
if (ValidatePortHandle (porthandle) == FALSE)
{
return ERROR_INVALID_PORT_HANDLE ;
}
return SubmitRequest ( NULL,
REQTYPE_GETFRAMINGCAPABILITIES,
porthandle,
caps) ;
}
/*++
Routine Description:
Exported call for third party security send
Arguments:
Return Value:
returns from RasPortSend.
--*/
DWORD APIENTRY
RasSecurityDialogSend(
IN HPORT hPort,
IN PBYTE pBuffer,
IN WORD BufferLength
)
{
RASMAN_INFO RasInfo;
DWORD dwRetCode = RasGetInfo( NULL, hPort, &RasInfo );
if ( RasInfo.RI_ConnState != LISTENCOMPLETED )
{
return( ERROR_PORT_DISCONNECTED );
}
return( RasPortSend( hPort, pBuffer, ( DWORD ) BufferLength ) );
}
/*++
Routine Description:
Exported call for third party security send
Arguments:
Return Value:
returns from RasPortSend.
--*/
DWORD APIENTRY
RasSecurityDialogReceive(
IN HPORT hPort,
IN PBYTE pBuffer,
IN PWORD pBufferLength,
IN DWORD Timeout,
IN HANDLE hEvent
)
{
RASMAN_INFO RasInfo;
DWORD dwRetCode = RasGetInfo( NULL, hPort, &RasInfo );
DWORD dwBufLength;
if(ERROR_SUCCESS != dwRetCode)
{
return dwRetCode;
}
if ( RasInfo.RI_ConnState != LISTENCOMPLETED )
{
return( ERROR_PORT_DISCONNECTED );
}
if(NULL == pBufferLength)
{
return E_INVALIDARG;
}
dwBufLength = ( DWORD ) *pBufferLength;
dwRetCode = RasPortReceive( hPort,
pBuffer,
&dwBufLength,
Timeout,
hEvent );
*pBufferLength = (WORD) dwBufLength;
return dwRetCode;
}
/*++
Routine Description:
Gets parameters (info) for the
Port for which handle is supplied
Arguments:
Return Value:
returns from RasPortGetInfo
--*/
DWORD APIENTRY
RasSecurityDialogGetInfo(
IN HPORT hPort,
IN RAS_SECURITY_INFO* pBuffer
)
{
RASMAN_INFO RasInfo;
DWORD dwRetCode = RasGetInfo( NULL, hPort, &RasInfo );
if ( dwRetCode != NO_ERROR )
{
return( dwRetCode );
}
memcpy( pBuffer->DeviceName,
RasInfo.RI_DeviceConnecting,
DEVICE_NAME_LEN + 1);
pBuffer->BytesReceived = RasInfo.RI_BytesReceived;
pBuffer->LastError = RasInfo.RI_LastError;
return( NO_ERROR );
}
/*++
Routine Description:
Sets second HPORT to be multilinked
(bundled) with the first HPORT
Arguments:
Return Value:
SUCCESS
--*/
DWORD APIENTRY
RasPortBundle (HPORT firstporthandle, HPORT secondporthandle)
{
if (ValidatePortHandle (firstporthandle) == FALSE)
{
return ERROR_INVALID_PORT_HANDLE ;
}
if (ValidatePortHandle (secondporthandle) == FALSE)
return ERROR_INVALID_PORT_HANDLE ;
return SubmitRequest ( NULL,
REQTYPE_PORTBUNDLE,
firstporthandle,
secondporthandle) ;
}
/*++
Routine Description:
Given a port this API returns a connected
port handle from the same bundle this port
is or was (if not connected) part of.
Arguments:
Return Value:
SUCCESS
--*/
DWORD APIENTRY
RasPortGetBundledPort (HPORT oldport, HPORT *pnewport)
{
if (ValidatePortHandle (oldport) == FALSE)
{
return ERROR_INVALID_PORT_HANDLE ;
}
return SubmitRequest (NULL,
REQTYPE_GETBUNDLEDPORT,
oldport,
pnewport) ;
}
/*++
Routine Description:
Given a port this API returns handle to a bundle
Arguments:
Return Value:
SUCCESS
ERROR_PORT_DISCONNECTED
--*/
DWORD APIENTRY
RasPortGetBundle (HANDLE hConnection,
HPORT hport,
HBUNDLE *phbundle)
{
DWORD dwError = SUCCESS;
if (ValidatePortHandle (hport) == FALSE)
{
dwError = ERROR_INVALID_PORT_HANDLE;
goto done;
}
if(!ValidateConnectionHandle(hConnection))
{
dwError = E_INVALIDARG;
goto done;
}
dwError = SubmitRequest (hConnection,
REQTYPE_PORTGETBUNDLE,
hport,
phbundle) ;
done:
return dwError;
}
/*++
Routine Description:
Given a bundle this API returns a connected
port handle part of the bundle.
Arguments:
Return Value:
SUCCESS
ERROR_INVALID_PORT_HANDLE
--*/
DWORD APIENTRY
RasBundleGetPort (HANDLE hConnection,
HBUNDLE hbundle,
HPORT *phport)
{
DWORD dwError = SUCCESS;
if(!ValidateConnectionHandle(hConnection))
{
dwError = E_INVALIDARG;
goto done;
}
dwError = SubmitRequest (hConnection,
REQTYPE_BUNDLEGETPORT,
hbundle,
phport) ;
done:
return dwError;
}
/*++
Routine Description:
Increment/decrement the shared buffer attach count for
use with other services inside the rasman.exe process.
Arguments:
Return Value:
SUCCESS
--*/
DWORD APIENTRY
RasReferenceRasman (BOOL fAttach)
{
return SubmitRequest (NULL,
REQTYPE_SETATTACHCOUNT,
fAttach);
}
/*++
Routine Description:
Retrieve the stored dial parameters for an entry UID.
Arguments:
Return Value:
SUCCESS
--*/
DWORD APIENTRY
RasGetDialParams(
DWORD dwUID,
LPDWORD pdwMask,
PRAS_DIALPARAMS pDialParams
)
{
return SubmitRequest ( NULL,
REQTYPE_GETDIALPARAMS,
dwUID,
pdwMask,
pDialParams);
}
/*++
Routine Description:
Store new dial parameters for an entry UID.
Arguments:
Return Value:
SUCCESS
--*/
DWORD APIENTRY
RasSetDialParams(
DWORD dwUID,
DWORD dwMask,
PRAS_DIALPARAMS pDialParams,
BOOL fDelete
)
{
return SubmitRequest ( NULL,
REQTYPE_SETDIALPARAMS,
dwUID,
dwMask,
pDialParams,
fDelete);
}
/*++
Routine Description:
Create a rasapi32 connection.
Arguments:
Return Value:
SUCCESS
--*/
DWORD APIENTRY
RasCreateConnection(
HCONN *lphconn,
DWORD dwSubEntries,
DWORD *lpdwEntryAlreadyConnected,
DWORD *lpdwSubEntryInfo,
DWORD dwDialMode,
GUID *pGuidEntry,
CHAR *lpszPhonebookPath,
CHAR *lpszEntryName,
CHAR *lpszRefPbkPath,
CHAR *lpszRefEntryName
)
{
return SubmitRequest ( NULL,
REQTYPE_CREATECONNECTION,
GetCurrentProcessId(),
dwSubEntries,
dwDialMode,
pGuidEntry,
lpszPhonebookPath,
lpszEntryName,
lpszRefPbkPath,
lpszRefEntryName,
lphconn,
lpdwEntryAlreadyConnected,
lpdwSubEntryInfo);
}
/*++
Routine Description:
Return a list of active HCONNs
Arguments:
Return Value:
SUCCESS
--*/
DWORD APIENTRY
RasConnectionEnum(
HANDLE hConnection,
HCONN *lphconn,
LPDWORD lpdwcbConnections,
LPDWORD lpdwcConnections
)
{
DWORD dwError = SUCCESS;
if(!ValidateConnectionHandle(hConnection))
{
dwError = E_INVALIDARG;
goto done;
}
dwError = SubmitRequest (hConnection,
REQTYPE_ENUMCONNECTION,
lpdwcbConnections,
lphconn,
lpdwcConnections);
done:
return dwError;
}
/*++
Routine Description:
Associate a rasapi32 connection with a port
Arguments:
Return Value:
SUCCESS
--*/
DWORD APIENTRY
RasAddConnectionPort(
HCONN hconn,
HPORT hport,
DWORD dwSubEntry
)
{
return SubmitRequest ( NULL,
REQTYPE_ADDCONNECTIONPORT,
hconn,
hport,
dwSubEntry);
}
/*++
Routine Description:
Enumerate all ports in a connection
Arguments:
Return Value:
SUCCESS
--*/
DWORD APIENTRY
RasEnumConnectionPorts(
HANDLE hConnection,
HCONN hconn,
RASMAN_PORT *lpPorts,
LPDWORD lpdwcbPorts,
LPDWORD lpdwcPorts
)
{
DWORD dwError = SUCCESS;
if(!ValidateConnectionHandle(hConnection))
{
dwError = E_INVALIDARG;
goto done;
}
dwError = SubmitRequest (hConnection,
REQTYPE_ENUMCONNECTIONPORTS,
hconn,
lpdwcbPorts,
lpPorts,
lpdwcPorts);
done:
return dwError;
}
/*++
Routine Description:
Destroy a rasapi32 connection.
Arguments:
Return Value:
SUCCESS
ERROR_NOT_ENOUGH_MEMORY
ERROR_ACCESS_DENIED
whatever RasEnumConnectionPorts returns
--*/
DWORD APIENTRY
RasDestroyConnection(
HCONN hconn
)
{
RASMAN_PORT *lpPorts = NULL;
DWORD dwPort;
DWORD dwcbPorts;
DWORD dwcPorts;
DWORD dwError = SUCCESS;
DWORD dwLastError = SUCCESS;
//
// allocate buffer for 2 ports up front
// We don't have to make more than one
// rasman call in base cases.
//
lpPorts = LocalAlloc(LPTR,
2 * sizeof(RASMAN_PORT));
if (NULL == lpPorts)
{
dwError = ERROR_NOT_ENOUGH_MEMORY;
goto done;
}
dwcbPorts = 2 * sizeof(RASMAN_PORT);
do {
//
// enumerate the ports in this connection
//
dwError = RasEnumConnectionPorts(NULL,
hconn,
lpPorts,
&dwcbPorts,
&dwcPorts);
if (ERROR_BUFFER_TOO_SMALL == dwError)
{
LocalFree(lpPorts);
lpPorts = NULL;
//
// allocate a larger buffer and call the api again
//
lpPorts = LocalAlloc(LPTR, dwcbPorts);
if (NULL == lpPorts)
{
dwError = ERROR_NOT_ENOUGH_MEMORY;
}
}
} while (ERROR_BUFFER_TOO_SMALL == dwError);
if (SUCCESS != dwError)
{
goto done;
}
for (dwPort = 0; dwPort < dwcPorts; dwPort++)
{
//
//disconnect the port
//
dwError = RasPortDisconnect( lpPorts[dwPort].P_Handle,
INVALID_HANDLE_VALUE);
if(ERROR_SUCCESS != dwError)
{
dwLastError = dwError;
}
//
// close the port
//
dwError = RasPortClose( lpPorts[dwPort].P_Handle );
if(ERROR_SUCCESS != dwError)
{
dwLastError = dwError;
}
}
done:
if (lpPorts)
{
LocalFree(lpPorts);
}
if( (ERROR_SUCCESS == dwError)
&& (ERROR_SUCCESS != dwLastError))
{
dwError = dwLastError;
}
return dwError;
}
/*++
Routine Description:
Retrieve rasapi32 bandwidth-on-demand, idle disconnect,
and redial-on-link-failure parameters for a bundle
Arguments:
Return Value:
SUCCESS
--*/
DWORD APIENTRY
RasGetConnectionParams(
HCONN hconn,
PRAS_CONNECTIONPARAMS pConnectionParams
)
{
return SubmitRequest ( NULL,
REQTYPE_GETCONNECTIONPARAMS,
hconn,
pConnectionParams);
}
/*++
Routine Description:
Store rasapi32 bandwidth-on-demand, idle disconnect,
and redial-on-link-failure parameters for a bundle
Arguments:
Return Value:
SUCCESS
--*/
DWORD APIENTRY
RasSetConnectionParams(
HCONN hconn,
PRAS_CONNECTIONPARAMS pConnectionParams
)
{
return SubmitRequest ( NULL,
REQTYPE_SETCONNECTIONPARAMS,
hconn,
pConnectionParams);
}
/*++
Routine Description:
Retrieve tagged user data for a connection
Arguments:
Return Value:
SUCCESS
--*/
DWORD APIENTRY
RasGetConnectionUserData(
HCONN hconn,
DWORD dwTag,
PBYTE pBuf,
LPDWORD lpdwcbBuf
)
{
return SubmitRequest ( NULL,
REQTYPE_GETCONNECTIONUSERDATA,
hconn,
dwTag,
pBuf,
lpdwcbBuf);
}
/*++
Routine Description:
Store tagged user data for a connection
Arguments:
Return Value:
SUCCESS
--*/
DWORD APIENTRY
RasSetConnectionUserData(
HCONN hconn,
DWORD dwTag,
PBYTE pBuf,
DWORD dwcbBuf
)
{
return SubmitRequest ( NULL,
REQTYPE_SETCONNECTIONUSERDATA,
hconn,
dwTag,
pBuf,
dwcbBuf);
}
/*++
Routine Description:
Retrieve tagged user data for a port
Arguments:
Return Value:
SUCCESS
--*/
DWORD APIENTRY
RasGetPortUserData(
HPORT hport,
DWORD dwTag,
PBYTE pBuf,
LPDWORD lpdwcbBuf
)
{
return SubmitRequest ( NULL,
REQTYPE_GETPORTUSERDATA,
hport,
dwTag,
pBuf,
lpdwcbBuf);
}
/*++
Routine Description:
Store tagged user data for a port
Arguments:
Return Value:
SUCCESS
--*/
DWORD APIENTRY
RasSetPortUserData(
HPORT hport,
DWORD dwTag,
PBYTE pBuf,
DWORD dwcbBuf
)
{
return SubmitRequest ( NULL,
REQTYPE_SETPORTUSERDATA,
hport,
dwTag,
pBuf,
dwcbBuf);
}
/*++
Routine Description:
Sends message to rasman.
Arguments:
Return Value:
SUCCESS
Non-zero returns - Failure
--*/
DWORD APIENTRY
RasSendPppMessageToRasman (
IN HPORT hPort,
LPBYTE lpPppMessage
)
{
return SubmitRequest ( NULL,
REQTYPE_SENDPPPMESSAGETORASMAN,
hPort,
lpPppMessage);
}
/*++
Routine Description:
Stops PPP on 'hPort'.
Arguments:
Return Value:
SUCCESS
Non-zero returns - Failure
--*/
DWORD APIENTRY
RasPppStop(
IN HPORT hPort
)
{
if (ValidatePortHandle (hPort) == FALSE)
{
return ERROR_INVALID_PORT_HANDLE ;
}
return SubmitRequest( NULL,
REQTYPE_PPPSTOP,
hPort );
}
/*++
Routine Description:
Called in response to a "CallbackRequest" notification to
set the callback number (or not) for the "set-by-caller"
user.
Arguments:
Return Value:
SUCCESS
Non-zero returns - Failure
--*/
DWORD APIENTRY
RasPppCallback(
IN HPORT hPort,
IN CHAR* pszCallbackNumber
)
{
if (ValidatePortHandle (hPort) == FALSE)
return ERROR_INVALID_PORT_HANDLE ;
return SubmitRequest ( NULL,
REQTYPE_PPPCALLBACK,
hPort,
pszCallbackNumber );
}
/*++
Routine Description:
Called in response to a "ChangePwRequest" notification
to set a new password (replacing the one that has expired)
of 'pszNewPassword'. The username and old password are
specified because in the auto-logon case they have not
yet been specified in change password useable form.
Arguments:
Return Value:
SUCCESS
Non-zero returns - Failure
--*/
DWORD APIENTRY
RasPppChangePassword(
IN HPORT hPort,
IN CHAR* pszUserName,
IN CHAR* pszOldPassword,
IN CHAR* pszNewPassword )
{
if (ValidatePortHandle (hPort) == FALSE)
{
return ERROR_INVALID_PORT_HANDLE ;
}
return SubmitRequest( NULL,
REQTYPE_PPPCHANGEPWD,
hPort,
pszUserName,
pszOldPassword,
pszNewPassword );
}
/*++
Routine Description:
Called when the PPP event is set to retrieve the latest PPP
** notification info which is loaded into caller's 'pMsg'
buffer.
Arguments:
Return Value:
SUCCESS
Non-zero returns - Failure
--*/
DWORD APIENTRY
RasPppGetInfo(
IN HPORT hPort,
OUT PPP_MESSAGE* pMsg
)
{
if (ValidatePortHandle (hPort) == FALSE)
{
return ERROR_INVALID_PORT_HANDLE ;
}
return SubmitRequest( NULL,
REQTYPE_PPPGETINFO,
hPort,
pMsg );
}
/*++
Routine Description:
Called in response to an "AuthRetry" notification to retry
authentication with the new credentials, 'pszUserName',
'pszPassword', and 'pszDomain'.
Arguments:
Return Value:
SUCCESS
Non-zero returns - Failure
--*/
DWORD APIENTRY
RasPppRetry(
IN HPORT hPort,
IN CHAR* pszUserName,
IN CHAR* pszPassword,
IN CHAR* pszDomain
)
{
if (ValidatePortHandle (hPort) == FALSE)
{
return ERROR_INVALID_PORT_HANDLE ;
}
return SubmitRequest( NULL,
REQTYPE_PPPRETRY,
hPort,
pszUserName,
pszPassword,
pszDomain );
}
/*++
Routine Description:
Starts PPP on open and connected RAS Manager port 'hPort'.
If successful, 'hEvent' (a manual-reset event) is thereafter
set whenever a PPP notification is available (via RasPppGetInfo).
'pszUserName', 'pszPassword', and 'pszDomain' specify the
credentials to be authenticated during authentication phase.
'pConfigInfo' specifies further configuration info such as
which CPs to request, callback and compression parameters,
etc. 'pszzParameters' is a buffer of length PARAMETERBUFLEN
containing a string of NUL-terminated key=value strings,
all terminated by a double-NUL.
Arguments:
Return Value:
SUCCESS
Non-zero returns - Failure
--*/
DWORD APIENTRY
RasPppStart(
IN HPORT hPort,
IN CHAR* pszPortName,
IN CHAR* pszUserName,
IN CHAR* pszPassword,
IN CHAR* pszDomain,
IN LUID* pLuid,
IN PPP_CONFIG_INFO* pConfigInfo,
IN LPVOID pInterfaceInfo,
IN CHAR* pszzParameters,
IN BOOL fThisIsACallback,
IN HANDLE hEvent,
IN DWORD dwAutoDisconnectTime,
IN BOOL fRedialOnLinkFailure,
IN PPP_BAPPARAMS* pBapParams,
IN BOOL fNonInteractive,
IN DWORD dwEapTypeId,
IN DWORD dwFlags
)
{
PPP_INTERFACE_INFO * pPppInterfaceInfo = pInterfaceInfo;
if (ValidatePortHandle (hPort) == FALSE)
{
return ERROR_INVALID_PORT_HANDLE ;
}
//
// If user name is not NULL and password is
// NULL and this is not the svchost process,
// get the user sid and save it in the ports
// user data
//
if(!IsRasmanProcess())
{
DWORD dwErr;
PWCHAR pszSid = LocalAlloc(LPTR, 5000);
if(NULL != pszSid)
{
dwErr = GetUserSid(pszSid, 5000);
if(ERROR_SUCCESS == dwErr)
{
dwErr = RasSetPortUserData(
hPort,
PORT_USERSID_INDEX,
(PBYTE) pszSid,
5000);
}
LocalFree(pszSid);
}
else
{
RasmanOutputDebug("RASMAN: RasPppStart: failed to allocate sid\n");
}
}
return SubmitRequest( NULL,
REQTYPE_PPPSTART,
hPort,
pszPortName,
pszUserName,
pszPassword,
pszDomain,
pLuid,
pConfigInfo,
pPppInterfaceInfo,
pszzParameters,
fThisIsACallback,
hEvent,
GetCurrentProcessId(),
dwAutoDisconnectTime,
fRedialOnLinkFailure,
pBapParams,
fNonInteractive,
dwEapTypeId,
dwFlags);
}
/*++
Routine Description:
Adds an event to be signalled on disconnect
state for either an existing connection, or an
existing port.
Arguments:
Return Value:
SUCCESS
Non-zero returns - Failure
--*/
DWORD APIENTRY
RasAddNotification(
IN HCONN hconn,
IN HANDLE hevent,
IN DWORD dwfFlags
)
{
DWORD pid = GetCurrentProcessId();
return SubmitRequest ( NULL,
REQTYPE_ADDNOTIFICATION,
pid,
hconn,
hevent,
dwfFlags );
}
/*++
Routine Description:
Allows rasapi32 to notify rasman when a new connection
is ready to have data sent over it.
Arguments:
Return Value:
SUCCESS
Non-zero returns - Failure
--*/
DWORD APIENTRY
RasSignalNewConnection(
IN HCONN hconn
)
{
return SubmitRequest( NULL,
REQTYPE_SIGNALCONNECTION,
hconn );
}
/*++
Routine Description:
Allows apps to set dev config that is specific to the device.
This is passed on to the approp. media dll
Arguments:
Return Value:
SUCCESS
Non-zero returns - Failure
--*/
DWORD APIENTRY
RasSetDevConfig( IN HPORT hport,
IN CHAR *devicetype,
IN PBYTE config,
IN DWORD size)
{
if (ValidatePortHandle (hport) == FALSE)
{
return ERROR_INVALID_PORT_HANDLE ;
}
return SubmitRequest ( NULL,
REQTYPE_SETDEVCONFIG,
hport,
devicetype,
config,
size);
}
/*++
Routine Description:
Allows apps to get dev config that is specific to the device.
Arguments:
Return Value:
SUCCESS
Non-zero returns - Failure
--*/
DWORD APIENTRY
RasGetDevConfig ( IN HANDLE hConnection,
IN HPORT hport,
IN CHAR *devicetype,
IN PBYTE config,
IN OUT DWORD *size)
{
DWORD dwError = SUCCESS;
RAS_RPC *pRasRpcConnection = (RAS_RPC *) hConnection;
if (ValidatePortHandle (hport) == FALSE)
{
dwError = ERROR_INVALID_PORT_HANDLE;
goto done;
}
if(!ValidateConnectionHandle(hConnection))
{
dwError = E_INVALIDARG;
goto done;
}
//
// If the request is for a remote server and the server
// version is 4.0 - steelhead, then defer to the old way
// of getting this information since rasman has become
// a rpc server only in version 50.
//
if( NULL != pRasRpcConnection
&& VERSION_40 == pRasRpcConnection->dwVersion)
{
DWORD dwSizeRequired = *size;
dwError = RemoteRasGetDevConfig(hConnection,
hport,
devicetype,
config,
&dwSizeRequired);
//
// Since this is a buffer returned from a 4.0
// server, we need to change this to a format
// that nt 5.0 understands.
//
if( (SUCCESS == dwError)
&& (dwSizeRequired > 0)
&& (*size >= (dwSizeRequired + sizeof(RAS_DEVCONFIG))))
{
RAS_DEVCONFIG *pDevConfig = (RAS_DEVCONFIG *) config;
MoveMemory((PBYTE) pDevConfig->abInfo,
config,
dwSizeRequired);
pDevConfig->dwOffsetofModemSettings =
FIELD_OFFSET(RAS_DEVCONFIG, abInfo);
pDevConfig->dwSizeofModemSettings = dwSizeRequired;
pDevConfig->dwSizeofExtendedCaps = 0;
pDevConfig->dwOffsetofExtendedCaps = 0;
}
else if ( (dwSizeRequired > 0)
&& (*size < (dwSizeRequired + sizeof(RAS_DEVCONFIG))))
{
dwError = ERROR_BUFFER_TOO_SMALL;
}
else if (dwSizeRequired > 0)
{
*size = dwSizeRequired + sizeof(RAS_DEVCONFIG);
}
else
{
*size = dwSizeRequired;
}
}
else
{
dwError = SubmitRequest (hConnection,
REQTYPE_GETDEVCONFIG,
hport,
devicetype,
config,
size);
}
done:
return dwError;
}
/*++
Routine Description:
Gets time in seconds from NDISWAN since the last activity on
this port
Arguments:
Return Value:
SUCCESS
Non-zero returns - Failure
--*/
DWORD APIENTRY
RasGetTimeSinceLastActivity(
IN HPORT hport,
OUT LPDWORD lpdwTimeSinceLastActivity
)
{
if (ValidatePortHandle (hport) == FALSE)
{
return( ERROR_INVALID_PORT_HANDLE );
}
return SubmitRequest( NULL,
REQTYPE_GETTIMESINCELASTACTIVITY,
hport,
lpdwTimeSinceLastActivity );
}
/*++
Routine Description:
Debug routine to test PnP operations
Arguments:
Return Value:
SUCCESS
Non-zero returns - Failure
--*/
DWORD APIENTRY
RasPnPControl(
IN DWORD dwOp,
IN HPORT hport
)
{
return SubmitRequest( NULL,
REQTYPE_PNPCONTROL,
dwOp,
hport );
}
/*++
Routine Description:
Set the I/O Completion Port associated with a port.
Arguments:
Return Value:
SUCCESS
Non-zero returns - Failure
--*/
DWORD APIENTRY
RasSetIoCompletionPort(
IN HPORT hport,
IN HANDLE hIoCompletionPort,
IN PRAS_OVERLAPPED lpOvDrop,
IN PRAS_OVERLAPPED lpOvStateChange,
IN PRAS_OVERLAPPED lpOvPpp,
IN PRAS_OVERLAPPED lpOvLast,
IN HRASCONN hConn
)
{
return SubmitRequest(
NULL,
REQTYPE_SETIOCOMPLETIONPORT,
hport,
hIoCompletionPort,
lpOvDrop,
lpOvStateChange,
lpOvPpp,
lpOvLast,
hConn);
}
/*++
Routine Description:
Set the I/O Completion Port associated with a port.
Arguments:
Return Value:
SUCCESS
Non-zero returns - Failure
--*/
DWORD APIENTRY
RasSetRouterUsage(
IN HPORT hport,
IN BOOL fRouter
)
{
return SubmitRequest(
NULL,
REQTYPE_SETROUTERUSAGE,
hport,
fRouter);
}
/*++
Routine Description:
Close the server's side of a port.
Arguments:
Return Value:
SUCCESS
Non-zero returns - Failure
--*/
DWORD APIENTRY
RasServerPortClose(
IN HPORT hport
)
{
DWORD pid = GetCurrentProcessId();
if (!ValidatePortHandle (hport))
{
return ERROR_INVALID_PORT_HANDLE ;
}
return SubmitRequest ( NULL,
REQTYPE_SERVERPORTCLOSE,
hport,
pid,
TRUE) ;
}
DWORD APIENTRY
RasSetRasdialInfo (
IN HPORT hport,
IN CHAR *pszPhonebookPath,
IN CHAR *pszEntryName,
IN CHAR *pszPhoneNumber,
IN DWORD cbCustomAuthData,
IN PBYTE pbCustomAuthData)
{
if (!ValidatePortHandle (hport))
{
return ERROR_INVALID_PORT_HANDLE;
}
return SubmitRequest ( NULL,
REQTYPE_SETRASDIALINFO,
hport,
pszPhonebookPath,
pszEntryName,
pszPhoneNumber,
cbCustomAuthData,
pbCustomAuthData);
}
DWORD
RasRegisterPnPCommon ( PVOID pvNotifier,
HANDLE hAlertableThread,
DWORD dwFlags,
BOOL fRegister)
{
DWORD dwErr;
DWORD pid = GetCurrentProcessId();
HANDLE hThreadHandle = NULL;
if ( NULL == pvNotifier
|| ( 0 == ( dwFlags & PNP_NOTIFEVENT )
&& 0 == ( dwFlags & PNP_NOTIFCALLBACK )))
{
dwErr = ERROR_INVALID_PARAMETER;
goto done;
}
if ( dwFlags & PNP_NOTIFCALLBACK )
{
if (fRegister )
{
if(NULL == hAlertableThread )
{
RasmanOutputDebug ("RasRegisterPnPCommon: "
"hAlertableThread == NULL\n");
dwErr = ERROR_INVALID_PARAMETER;
goto done;
}
if ( !DuplicateHandle( GetCurrentProcess(),
hAlertableThread,
GetCurrentProcess(),
&hThreadHandle,
0,
FALSE,
DUPLICATE_SAME_ACCESS ) )
{
RasmanOutputDebug("RasRegisterPnPCommon: Failed to"
" duplicate handle\n");
dwErr = GetLastError();
goto done;
}
}
}
dwErr = SubmitRequest ( NULL,
REQTYPE_REGISTERPNPNOTIF,
pvNotifier,
dwFlags,
pid,
hThreadHandle,
fRegister);
done:
return dwErr;
}
DWORD APIENTRY
RasRegisterPnPEvent ( HANDLE hEvent, BOOL fRegister )
{
DWORD pid = GetCurrentProcessId ();
return RasRegisterPnPCommon ( (PVOID) hEvent,
NULL,
PNP_NOTIFEVENT,
fRegister);
}
DWORD APIENTRY
RasRegisterPnPHandler(PAPCFUNC pfnPnPHandler,
HANDLE hAlertableThread,
BOOL fRegister)
{
return RasRegisterPnPCommon ( (PVOID) pfnPnPHandler,
hAlertableThread,
PNP_NOTIFCALLBACK,
fRegister);
}
DWORD APIENTRY
RasGetAttachedCount ( DWORD *pdwAttachedCount )
{
return SubmitRequest ( NULL,
REQTYPE_GETATTACHEDCOUNT,
pdwAttachedCount );
}
DWORD APIENTRY
RasGetNumPortOpen (void)
{
return SubmitRequest ( NULL,
REQTYPE_NUMPORTOPEN );
}
DWORD APIENTRY
RasSetBapPolicy ( HCONN hConn,
DWORD dwLowThreshold,
DWORD dwLowSamplePeriod,
DWORD dwHighThreshold,
DWORD dwHighSamplePeriod)
{
return SubmitRequest ( NULL,
REQTYPE_SETBAPPOLICY,
hConn,
dwLowThreshold,
dwLowSamplePeriod,
dwHighThreshold,
dwHighSamplePeriod );
}
DWORD APIENTRY
RasPppStarted ( HPORT hPort )
{
return SubmitRequest ( NULL,
REQTYPE_PPPSTARTED,
hPort );
}
DWORD APIENTRY
RasRefConnection( HCONN hConn,
BOOL fAddref,
DWORD *pdwRefCount )
{
return SubmitRequest ( NULL,
REQTYPE_REFCONNECTION,
hConn,
fAddref,
pdwRefCount );
}
DWORD APIENTRY
RasPppGetEapInfo( HCONN hConn,
DWORD dwSubEntry,
DWORD *pdwContextId,
DWORD *pdwEapTypeId,
DWORD *pdwSizeOfUIData,
PBYTE pbdata )
{
return SubmitRequest( NULL,
REQTYPE_GETEAPINFO,
hConn,
dwSubEntry,
pdwSizeOfUIData,
pbdata,
pdwContextId,
pdwEapTypeId);
}
DWORD APIENTRY
RasPppSetEapInfo( HPORT hPort,
DWORD dwContextId,
DWORD dwSizeOfEapUIData,
PBYTE pbdata)
{
return SubmitRequest( NULL,
REQTYPE_SETEAPINFO,
hPort,
dwContextId,
dwSizeOfEapUIData,
pbdata);
}
DWORD APIENTRY
RasSetDeviceConfigInfo( HANDLE hConnection,
DWORD cEntries,
DWORD cbBuffer,
BYTE *pbBuffer
)
{
DWORD dwError = SUCCESS;
if(!ValidateConnectionHandle(hConnection))
{
dwError = E_INVALIDARG;
goto done;
}
dwError = SubmitRequest( hConnection,
REQTYPE_SETDEVICECONFIGINFO,
cEntries,
cbBuffer,
pbBuffer);
done:
return dwError;
}
DWORD APIENTRY
RasGetDeviceConfigInfo( HANDLE hConnection,
DWORD *pdwVersion,
DWORD *pcEntries,
DWORD *pcbdata,
BYTE *pbBuffer)
{
DWORD dwError = SUCCESS;
if(!ValidateConnectionHandle(hConnection))
{
dwError = E_INVALIDARG;
goto done;
}
dwError = SubmitRequest( hConnection,
REQTYPE_GETDEVICECONFIGINFO,
pdwVersion,
pcbdata,
pbBuffer,
pcEntries);
done:
return dwError;
}
DWORD APIENTRY
RasFindPrerequisiteEntry( HCONN hConn,
HCONN *phConnPrerequisiteEntry)
{
return SubmitRequest( NULL,
REQTYPE_FINDPREREQUISITEENTRY,
hConn,
phConnPrerequisiteEntry);
}
DWORD APIENTRY
RasLinkGetStatistics( HANDLE hConnection,
HCONN hConn,
DWORD dwSubEntry,
PBYTE pbStats)
{
DWORD dwError = SUCCESS;
if(!ValidateConnectionHandle(hConnection))
{
dwError = E_INVALIDARG;
goto done;
}
dwError = SubmitRequest( hConnection,
REQTYPE_GETLINKSTATS,
hConn,
dwSubEntry,
pbStats);
done:
return dwError;
}
DWORD APIENTRY
RasConnectionGetStatistics(HANDLE hConnection,
HCONN hConn,
PBYTE pbStats)
{
DWORD dwError = SUCCESS;
if(!ValidateConnectionHandle(hConnection))
{
dwError = E_INVALIDARG;
goto done;
}
dwError = SubmitRequest( hConnection,
REQTYPE_GETCONNECTIONSTATS,
hConn,
pbStats);
done:
return dwError;
}
DWORD APIENTRY
RasGetHportFromConnection(HANDLE hConnection,
HCONN hConn,
HPORT *phport)
{
DWORD dwError = SUCCESS;
if(!ValidateConnectionHandle(hConnection))
{
dwError = E_INVALIDARG;
goto done;
}
dwError = SubmitRequest(hConnection,
REQTYPE_GETHPORTFROMCONNECTION,
hConn,
phport);
done:
return dwError;
}
DWORD APIENTRY
RasReferenceCustomCount(HCONN hConn,
BOOL fAddref,
CHAR* pszPhonebookPath,
CHAR* pszEntryName,
DWORD* pdwCount)
{
return SubmitRequest(NULL,
REQTYPE_REFERENCECUSTOMCOUNT,
hConn,
fAddref,
pszPhonebookPath,
pszEntryName,
pdwCount);
}
DWORD APIENTRY
RasGetHConnFromEntry(HCONN *phConn,
CHAR *pszPhonebookPath,
CHAR *pszEntryName)
{
return SubmitRequest(NULL,
REQTYPE_GETHCONNFROMENTRY,
pszPhonebookPath,
pszEntryName,
phConn);
}
DWORD APIENTRY
RasGetConnectInfo(HPORT hPort,
DWORD *pdwSize,
RAS_CONNECT_INFO *pConnectInfo)
{
if(NULL == pdwSize)
{
return E_INVALIDARG;
}
return SubmitRequest(NULL,
REQTYPE_GETCONNECTINFO,
hPort,
pdwSize,
pConnectInfo);
}
DWORD APIENTRY
RasGetDeviceName(RASDEVICETYPE eDeviceType,
CHAR *pszDeviceName)
{
if(NULL == pszDeviceName)
{
return E_INVALIDARG;
}
return SubmitRequest(NULL,
REQTYPE_GETDEVICENAME,
eDeviceType,
pszDeviceName);
}
DWORD APIENTRY
RasGetDeviceNameW(RASDEVICETYPE eDeviceType,
WCHAR *pszDeviceName)
{
if(NULL == pszDeviceName)
{
return E_INVALIDARG;
}
return SubmitRequest(NULL,
REQTYPE_GETDEVICENAMEW,
eDeviceType,
pszDeviceName);
}
DWORD APIENTRY
RasGetCalledIdInfo(HANDLE hConnection,
RAS_DEVICE_INFO *pDeviceInfo,
DWORD *pdwSize,
RAS_CALLEDID_INFO *pCalledIdInfo)
{
if( (NULL == pDeviceInfo)
|| (NULL == pdwSize))
{
return E_INVALIDARG;
}
return SubmitRequest(hConnection,
REQTYPE_GETCALLEDID,
pDeviceInfo,
pdwSize,
pCalledIdInfo);
}
DWORD APIENTRY
RasSetCalledIdInfo(HANDLE hConnection,
RAS_DEVICE_INFO *pDeviceInfo,
RAS_CALLEDID_INFO *pCalledIdInfo,
BOOL fWrite)
{
if( (NULL == pDeviceInfo)
|| (NULL == pCalledIdInfo))
{
return E_INVALIDARG;
}
return SubmitRequest(hConnection,
REQTYPE_SETCALLEDID,
pDeviceInfo,
pCalledIdInfo,
fWrite);
}
DWORD APIENTRY
RasEnableIpSec(HPORT hPort,
BOOL fEnable,
BOOL fServer,
RAS_L2TP_ENCRYPTION eEncryption)
{
DWORD retcode = ERROR_SUCCESS;
retcode = SubmitRequest(NULL,
REQTYPE_ENABLEIPSEC,
hPort,
fEnable,
fServer,
eEncryption);
if( (ERROR_SUCCESS != retcode)
&& (ERROR_CERT_FOR_ENCRYPTION_NOT_FOUND != retcode)
&& (ERROR_NO_CERTIFICATE != retcode))
{
if(!fServer)
{
return ERROR_FAILED_TO_ENCRYPT;
}
}
return retcode;
}
DWORD APIENTRY
RasIsIpSecEnabled(HPORT hPort,
BOOL *pfIsIpSecEnabled)
{
if(NULL == pfIsIpSecEnabled)
{
return E_INVALIDARG;
}
return SubmitRequest(NULL,
REQTYPE_ISIPSECENABLED,
hPort,
pfIsIpSecEnabled);
}
DWORD APIENTRY
RasGetEapUserInfo(HANDLE hToken,
PBYTE pbEapInfo,
DWORD *pdwInfoSize,
GUID *pGuid,
BOOL fRouter,
DWORD dwEapTypeId)
{
return DwGetEapUserInfo(hToken,
pbEapInfo,
pdwInfoSize,
pGuid,
fRouter,
dwEapTypeId);
}
DWORD APIENTRY
RasSetEapUserInfo(HANDLE hToken,
GUID *pGuid,
PBYTE pbUserInfo,
DWORD dwInfoSize,
BOOL fClear,
BOOL fRouter,
DWORD dwEapTypeId)
{
return DwSetEapUserInfo(hToken,
pGuid,
pbUserInfo,
dwInfoSize,
fClear,
fRouter,
dwEapTypeId);
}
DWORD APIENTRY
RasSetEapLogonInfo(HPORT hPort,
BOOL fLogon,
RASEAPINFO *pEapInfo)
{
ASSERT(NULL != pEapInfo);
return SubmitRequest(NULL,
REQTYPE_SETEAPLOGONINFO,
hPort,
fLogon,
pEapInfo);
}
DWORD APIENTRY
RasSendNotification(RASEVENT *pRasEvent)
{
ASSERT(NULL != pRasEvent);
return SubmitRequest(NULL,
REQTYPE_SENDNOTIFICATION,
pRasEvent);
}
DWORD APIENTRY RasGetNdiswanDriverCaps(
HANDLE hConnection,
RAS_NDISWAN_DRIVER_INFO *pInfo)
{
if(NULL == pInfo)
{
return E_INVALIDARG;
}
return SubmitRequest(hConnection,
REQTYPE_GETNDISWANDRIVERCAPS,
pInfo);
}
DWORD APIENTRY RasGetBandwidthUtilization(
HPORT hPort,
RAS_GET_BANDWIDTH_UTILIZATION *pUtilization)
{
if(NULL == pUtilization)
{
return E_INVALIDARG;
}
return SubmitRequest(NULL,
REQTYPE_GETBANDWIDTHUTILIZATION,
hPort,
pUtilization);
}
/*++
Routine Description:
This function allows rasauto.dll to provide
a callback procedure that gets invoked when
a connection is terminated due to hardware
failure on its remaining link.
Arguments:
Return Value:
--*/
VOID
RasRegisterRedialCallback(
LPVOID func
)
{
if(NULL == g_fnServiceRequest)
{
goto done;
}
(void) SubmitRequest(NULL,
REQTYPE_REGISTERREDIALCALLBACK,
func);
done:
return;
}
DWORD APIENTRY RasGetProtocolInfo(
HANDLE hConnection,
RASMAN_GET_PROTOCOL_INFO *pInfo)
{
if(NULL == pInfo)
{
return E_INVALIDARG;
}
return SubmitRequest(NULL,
REQTYPE_GETPROTOCOLINFO,
pInfo);
}
DWORD APIENTRY RasGetCustomScriptDll(
CHAR *pszCustomDll)
{
if(NULL == pszCustomDll)
{
return E_INVALIDARG;
}
return SubmitRequest(
NULL,
REQTYPE_GETCUSTOMSCRIPTDLL,
pszCustomDll);
}
DWORD APIENTRY RasIsTrustedCustomDll(
HANDLE hConnection,
WCHAR *pwszCustomDll,
BOOL *pfTrusted)
{
if( (NULL == pwszCustomDll)
|| (wcslen(pwszCustomDll) > MAX_PATH)
|| (NULL == pfTrusted))
{
return E_INVALIDARG;
}
*pfTrusted = FALSE;
if(IsKnownDll(pwszCustomDll))
{
*pfTrusted = TRUE;
return SUCCESS;
}
return SubmitRequest(
NULL,
REQTYPE_ISTRUSTEDCUSTOMDLL,
pwszCustomDll,
pfTrusted);
}
DWORD APIENTRY RasDoIke(
HANDLE hConnection,
HPORT hPort,
DWORD *pdwStatus)
{
DWORD retcode = ERROR_SUCCESS;
HANDLE hEvent = NULL;
ASSERT(NULL != pdwStatus);
if(NULL == (hEvent = CreateEvent(
NULL,
FALSE,
FALSE,
NULL)))
{
retcode = GetLastError();
goto done;
}
retcode = SubmitRequest(
NULL,
REQTYPE_DOIKE,
hPort,
hEvent);
if(SUCCESS == retcode)
{
DWORD dwRet;
for(;;)
{
//
// go into wait and keep checking to see
// if the port has been disconnected.
//
dwRet = WaitForSingleObject(hEvent, SECS_WaitTimeOut);
if(WAIT_TIMEOUT == dwRet)
{
RASMAN_INFO ri;
retcode = SubmitRequest(
NULL,
REQTYPE_GETINFO,
hPort,
&ri);
if( (ERROR_SUCCESS == retcode)
&& (CLOSED != ri.RI_PortStatus)
&& (LISTENING != ri.RI_ConnState))
{
continue;
}
else
{
break;
}
}
else
{
if (WAIT_OBJECT_0 == dwRet)
{
retcode = SubmitRequest(
NULL,
REQTYPE_QUERYIKESTATUS,
hPort,
pdwStatus);
}
break;
}
}
}
if(E_ABORT == retcode)
{
retcode = SUCCESS;
}
done:
if(NULL != hEvent)
{
CloseHandle(hEvent);
}
return retcode;
}
DWORD APIENTRY RasSetCommSettings(
HPORT hPort,
RASCOMMSETTINGS *pRasCommSettings,
PVOID pv)
{
UNREFERENCED_PARAMETER(pv);
if(NULL == pRasCommSettings)
{
E_INVALIDARG;
}
if( (sizeof(RASCOMMSETTINGS) != pRasCommSettings->dwSize)
|| sizeof(RASMANCOMMSETTINGS) != sizeof(RASCOMMSETTINGS))
{
ASSERT(FALSE);
return ERROR_INVALID_SIZE;
}
return SubmitRequest(
NULL,
REQTYPE_SETRASCOMMSETTINGS,
hPort,
pRasCommSettings);
}
DWORD
RasSetKey(
HANDLE hConnection,
GUID *pGuid,
DWORD dwMask,
DWORD cbkey,
PBYTE pbkey)
{
return SubmitRequest(
hConnection,
REQTYPE_SETKEY,
pGuid,
dwMask,
cbkey,
pbkey);
}
DWORD
RasGetKey(
HANDLE hConnection,
GUID *pGuid,
DWORD dwMask,
DWORD *pcbkey,
PBYTE pbkey)
{
return SubmitRequest(
hConnection,
REQTYPE_GETKEY,
pGuid,
dwMask,
pcbkey,
pbkey);
}
DWORD
RasSetAddressDisable(
WCHAR *pszAddress,
BOOL fDisable)
{
return SubmitRequest(
NULL,
REQTYPE_ADDRESSDISABLE,
pszAddress,
fDisable);
}
DWORD APIENTRY
RasGetDevConfigEx ( IN HANDLE hConnection,
IN HPORT hport,
IN CHAR *devicetype,
IN PBYTE config,
IN OUT DWORD *size)
{
return SubmitRequest(
hConnection,
REQTYPE_GETDEVCONFIGEX,
hport,
devicetype,
config,
size
);
}
DWORD APIENTRY
RasSendCreds(IN HPORT hport,
IN CHAR controlchar)
{
return SubmitRequest(
NULL,
REQTYPE_SENDCREDS,
hport,
controlchar);
}
DWORD APIENTRY
RasGetUnicodeDeviceName(IN HPORT hport,
IN WCHAR *wszDeviceName)
{
return SubmitRequest(
NULL,
REQTYPE_GETUNICODEDEVICENAME,
hport,
wszDeviceName);
}
DWORD APIENTRY
RasGetBestInterface( IN DWORD DestAddr,
OUT DWORD *pdwBestIf,
OUT DWORD *pdwMask)
{
return SubmitRequest(
NULL,
REQTYPE_GETBESTINTERFACE,
DestAddr,
pdwBestIf,
pdwMask);
}
DWORD APIENTRY
RasIsPulseDial(IN HPORT hport,
OUT BOOL *pfPulse)
{
return SubmitRequest(
NULL,
REQTYPE_ISPULSEDIAL,
hport,
pfPulse);
}