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
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;
|
|
}
|
|
|
|
|