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.
 
 
 
 
 
 

420 lines
9.1 KiB

/* Copyright (c) 1995, Microsoft Corporation, all rights reserved
**
** rassrv.c
** RAS Server helpers
** Listed alphabetically
**
** 03/05/96 Abolade Gbadegesin
*/
#include <windows.h> // Win32 root
#include <debug.h> // Trace/Assert library
#include <nouiutil.h> // Our public header
#include <raserror.h> // RAS error constants
HANDLE g_hserver = NULL;
DWORD
RasServerConnect(
IN HANDLE* phserver );
DWORD
GetRasConnection0Table(
OUT RAS_CONNECTION_0 ** ppRc0Table,
OUT DWORD * piRc0Count )
/* This function queries the RAS server for a table of the inbound
** connections on the local machine.
**
** (Abolade Gbadegesin Mar-05-1996)
*/
{
DWORD dwErr, dwTotal;
dwErr = RasServerConnect(&g_hserver);
if (dwErr != NO_ERROR) { return dwErr; }
return g_pRasAdminConnectionEnum(
g_hserver,
0,
(BYTE**)ppRc0Table,
(DWORD)-1,
piRc0Count,
&dwTotal,
NULL
);
}
DWORD
GetRasdevFromRasPort0(
IN RAS_PORT_0* pport,
OUT RASDEV** ppdev,
IN RASDEV* pDevTable OPTIONAL,
IN DWORD iDevCount OPTIONAL )
/* Given a RAS_PORT_0 structure, this function
** retrieves the RASDEV for the device referred to by the RAS_PORT_0.
** The second and third arguments are optional; they specify a
** table of RASDEV structures to be searched. This is useful if the
** caller has already enumerated the existing devices, so that this
** function does not need to re-enumerate them.
**
** (Abolade Gbadegesin Nov-9-1995)
*/
{
DWORD i, dwErr;
BOOL bFreeTable;
TCHAR szPort[MAX_PORT_NAME + 1], *pszPort;
//
// validate the arguments
//
if (pport == NULL || ppdev == NULL) { return ERROR_INVALID_PARAMETER; }
*ppdev = NULL;
//
// retrieve the device table if the caller didn't pass one in
//
bFreeTable = FALSE;
if (pDevTable == NULL) {
dwErr = GetRasdevTable(&pDevTable, &iDevCount);
if (dwErr != NO_ERROR) {
return dwErr;
}
bFreeTable = TRUE;
}
//
// retrieve the portname for the RAS_PORT_0 passed in
//
#ifdef UNICODE
pszPort = pport->wszPortName;
#else
StrCpyAFromW(
szPort,
pport->wszPortName,
MAX_PORT_NAME + 1);
pszPort = szPort;
#endif
//
// find the device to which the HPORT corresponds
//
for (i = 0; i < iDevCount; i++) {
if (lstrcmpi(pszPort, (pDevTable + i)->RD_PortName) == 0) { break; }
}
//
// see how the search ended
//
if (i >= iDevCount) {
dwErr = ERROR_NO_DATA;
}
else {
dwErr = NO_ERROR;
if (!bFreeTable) {
*ppdev = pDevTable + i;
}
else {
*ppdev = Malloc(sizeof(RASDEV));
if (!*ppdev) { dwErr = ERROR_NOT_ENOUGH_MEMORY; }
else {
**ppdev = *(pDevTable + i);
(*ppdev)->RD_DeviceName = StrDup(pDevTable[i].RD_DeviceName);
if (!(*ppdev)->RD_DeviceName) {
Free(*ppdev);
*ppdev = NULL;
dwErr = ERROR_NOT_ENOUGH_MEMORY;
}
}
}
}
if (bFreeTable) { FreeRasdevTable(pDevTable, iDevCount); }
return dwErr;
}
DWORD
GetRasPort0FromRasdev(
IN RASDEV* pdev,
OUT RAS_PORT_0** ppport,
IN RAS_PORT_0* pPortTable OPTIONAL,
IN DWORD iPortCount OPTIONAL )
/* Given a RASDEV structure for an active device, this function retrieves
** the RAS_PORT_0 which corresponds to the device. The
** second and third arguments are optional; they specify a table of
** RAS_PORT_0 structures to be searched. This is useful if the caller has
** already enumerated the server's ports, so that this function does
** not need to re-enumerate them.
**
** (Abolade Gbadegesin Feb-13-1996)
*/
{
BOOL bFreeTable;
DWORD dwErr, i;
WCHAR wszPort[MAX_PORT_NAME + 1], *pwszPort;
//
// validate arguments
//
if (pdev == NULL || ppport == NULL) { return ERROR_INVALID_PARAMETER; }
*ppport = NULL;
bFreeTable = FALSE;
//
// if the caller didn't pass in a table of RAS_PORT_0's, retrieve one
//
if (pPortTable == NULL) {
dwErr = GetRasPort0Table(&pPortTable, &iPortCount);
if (dwErr != NO_ERROR) { return dwErr; }
bFreeTable = TRUE;
}
//
// find the admin port which matches the RASDEV passed in
//
#ifdef UNICODE
pwszPort = pdev->RD_PortName;
#else
StrCpyWFromA(wszPort, pdev->P_PortName, MAX_PORT_NAME);
pwszPort = wszPort;
#endif
for (i = 0; i < iPortCount; i++) {
if (lstrcmpiW(pwszPort, (pPortTable + i)->wszPortName) == 0) {
break;
}
}
//
// see how the search ended
//
if (i >= iPortCount) {
dwErr = ERROR_NO_DATA;
}
else {
dwErr = NO_ERROR;
if (!bFreeTable) {
//
// point to the place where we found the RAS_PORT_0
//
*ppport = pPortTable + i;
}
else {
//
// make a copy of the RAS_PORT_0 found
//
*ppport = Malloc(sizeof(RAS_PORT_0));
if (!*ppport) { dwErr = ERROR_NOT_ENOUGH_MEMORY; }
else { **ppport = *(pPortTable + i); }
}
}
if (bFreeTable) { g_pRasAdminBufferFree(pPortTable); }
return dwErr;
}
DWORD
GetRasPort0Info(
IN HANDLE hPort,
OUT RAS_PORT_1 * pRasPort1 )
/* This function queries the local RAS server for information
** about the specified port.
**
** (Abolade Gbadegesin Mar-05-1996)
*/
{
DWORD dwErr;
dwErr = RasServerConnect(&g_hserver);
if (dwErr != NO_ERROR) { return dwErr; }
return g_pRasAdminPortGetInfo(
g_hserver,
1,
hPort,
(BYTE**)&pRasPort1
);
}
DWORD
GetRasPort0Table(
OUT RAS_PORT_0 ** ppPortTable,
OUT DWORD * piPortCount )
/* This function queries the RAS server for a table of the dial-in ports
** on the local machine.
**
** (Abolade Gbadegesin Mar-05-1996)
*/
{
DWORD dwErr;
DWORD dwTotal;
dwErr = RasServerConnect(&g_hserver);
if (dwErr != NO_ERROR) { return dwErr; }
dwErr = g_pRasAdminPortEnum(
g_hserver,
0,
INVALID_HANDLE_VALUE,
(BYTE**)ppPortTable,
(DWORD)-1,
piPortCount,
&dwTotal,
NULL
);
return dwErr;
}
TCHAR *
GetRasPort0UserString(
IN RAS_PORT_0 * pport,
IN TCHAR * pszUser OPTIONAL )
/* This function formats the user and domain in the specified port
** as a standard DOMAINNAME\username string and returns the result,
** unless the argument 'pszUser' is non-NULL in which case
** the result is formatted into the given string.
**
** (Abolade Gbadegesin Mar-06-1996)
*/
{
DWORD dwErr;
PTSTR psz = NULL;
RAS_CONNECTION_0 *prc0 = NULL;
dwErr = RasServerConnect(&g_hserver);
if (dwErr != NO_ERROR) { return NULL; }
do {
dwErr = g_pRasAdminConnectionGetInfo(
g_hserver,
0,
pport->hConnection,
(BYTE**)&prc0
);
if (dwErr != NO_ERROR) { break; }
if (pszUser) { psz = pszUser; }
else {
psz = Malloc(
(lstrlenW(prc0->wszUserName) +
lstrlenW(prc0->wszLogonDomain) + 2) * sizeof(TCHAR)
);
if (!psz) { break; }
}
wsprintf(psz, TEXT("%ls\\%ls"), prc0->wszLogonDomain, prc0->wszUserName);
} while(FALSE);
if (prc0) { g_pRasAdminBufferFree(prc0); }
return psz;
}
DWORD
RasPort0Hangup(
IN HANDLE hPort )
/* This function hangs up the specified dial-in port
** on the local RAS server.
**
** (Abolade Gbadegesin Mar-05-1996)
*/
{
DWORD dwErr;
dwErr = RasServerConnect(&g_hserver);
if (dwErr != NO_ERROR) { return dwErr; }
dwErr = g_pRasAdminPortDisconnect(g_hserver, hPort);
return dwErr;
}
DWORD
RasServerConnect(
IN HANDLE* phserver )
/* This function establishes a connection to the local MPR RAS server,
** if the connection has not already been established.
*/
{
DWORD dwErr;
if (*phserver) { return NO_ERROR; }
dwErr = g_pRasAdminServerConnect(NULL, phserver);
return dwErr;
}