/* Copyright (c) 1995, Microsoft Corporation, all rights reserved ** ** rassrv.c ** RAS Server helpers ** Listed alphabetically ** ** 03/05/96 Abolade Gbadegesin */ #include // Win32 root #include // Trace/Assert library #include // Our public header #include // 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; }