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.
189 lines
4.3 KiB
189 lines
4.3 KiB
/*
|
|
File: client.c
|
|
|
|
Support for netsh commands that manipulate ras clients.
|
|
|
|
*/
|
|
|
|
#include "precomp.h"
|
|
#pragma hdrstop
|
|
|
|
//
|
|
// Callback function for enumerating clients
|
|
//
|
|
typedef
|
|
DWORD
|
|
(*CLIENT_ENUM_CB_FUNC)(
|
|
IN DWORD dwLevel,
|
|
IN LPBYTE pbClient,
|
|
IN HANDLE hData);
|
|
|
|
//
|
|
// Client enumerate callback that displays the connection
|
|
//
|
|
DWORD
|
|
ClientShow(
|
|
IN DWORD dwLevel,
|
|
IN LPBYTE pbClient,
|
|
IN HANDLE hData)
|
|
{
|
|
RAS_CONNECTION_0 * pClient = (RAS_CONNECTION_0*)pbClient;
|
|
DWORD dwDays, dwHours, dwMins, dwSecs, dwTime, dwTemp;
|
|
|
|
dwTime = pClient->dwConnectDuration;
|
|
dwDays = dwTime / (24*60*60);
|
|
dwTemp = dwTime - (dwDays * 24*60*60); // temp is # of secs in cur day
|
|
dwHours = dwTemp / (60*60);
|
|
dwTemp = dwTemp - (dwHours * 60*60); // temp is # of secs in cur min
|
|
dwMins = dwTemp / 60;
|
|
dwSecs = dwTemp % 60;
|
|
|
|
DisplayMessage(
|
|
g_hModule,
|
|
MSG_CLIENT_SHOW,
|
|
pClient->wszUserName,
|
|
pClient->wszLogonDomain,
|
|
pClient->wszRemoteComputer,
|
|
dwDays,
|
|
dwHours,
|
|
dwMins,
|
|
dwSecs);
|
|
|
|
return NO_ERROR;
|
|
}
|
|
|
|
//
|
|
// Enumerates the client connections
|
|
//
|
|
DWORD
|
|
ClientEnum(
|
|
IN CLIENT_ENUM_CB_FUNC pEnum,
|
|
IN DWORD dwLevel,
|
|
IN HANDLE hData)
|
|
{
|
|
DWORD dwErr = NO_ERROR;
|
|
HANDLE hAdmin = NULL;
|
|
LPBYTE pbBuffer = NULL;
|
|
DWORD dwRead, dwTot, dwResume = 0, i;
|
|
RAS_CONNECTION_0 * pCur;
|
|
BOOL bContinue = FALSE;
|
|
|
|
do
|
|
{
|
|
// Connection to mpr api server
|
|
//
|
|
dwErr = MprAdminServerConnect(
|
|
g_pServerInfo->pszServer,
|
|
&hAdmin);
|
|
BREAK_ON_DWERR(dwErr);
|
|
|
|
do
|
|
{
|
|
// Enumerate
|
|
//
|
|
dwErr = MprAdminConnectionEnum(
|
|
hAdmin,
|
|
dwLevel,
|
|
&pbBuffer,
|
|
4096,
|
|
&dwRead,
|
|
&dwTot,
|
|
&dwResume);
|
|
if (dwErr == ERROR_MORE_DATA)
|
|
{
|
|
dwErr = NO_ERROR;
|
|
bContinue = TRUE;
|
|
}
|
|
else
|
|
{
|
|
bContinue = FALSE;
|
|
}
|
|
if (dwErr != NO_ERROR)
|
|
{
|
|
break;
|
|
}
|
|
|
|
// Call the callback for each connection as long
|
|
// as we're instructed to keep going
|
|
//
|
|
pCur = (RAS_CONNECTION_0*)pbBuffer;
|
|
for (i = 0; (i < dwRead) && (dwErr == NO_ERROR); i++)
|
|
{
|
|
if (pCur->dwInterfaceType == ROUTER_IF_TYPE_CLIENT)
|
|
{
|
|
dwErr = (*pEnum)(
|
|
dwLevel,
|
|
(LPBYTE)pCur,
|
|
hData);
|
|
}
|
|
pCur++;
|
|
}
|
|
if (dwErr != NO_ERROR)
|
|
{
|
|
break;
|
|
}
|
|
|
|
// Free up the interface list buffer
|
|
//
|
|
if (pbBuffer)
|
|
{
|
|
MprAdminBufferFree(pbBuffer);
|
|
pbBuffer = NULL;
|
|
}
|
|
|
|
// Keep this loop going until there are
|
|
// no more connections
|
|
//
|
|
|
|
} while (bContinue);
|
|
|
|
} while (FALSE);
|
|
|
|
// Cleanup
|
|
{
|
|
if (hAdmin)
|
|
{
|
|
MprAdminServerDisconnect(hAdmin);
|
|
}
|
|
}
|
|
|
|
return dwErr;
|
|
}
|
|
|
|
//
|
|
// Shows whether HandleRasflagSet has been called on the
|
|
// given domain.
|
|
//
|
|
DWORD
|
|
HandleClientShow(
|
|
IN LPCWSTR pwszMachine,
|
|
IN OUT LPWSTR *ppwcArguments,
|
|
IN DWORD dwCurrentIndex,
|
|
IN DWORD dwArgCount,
|
|
IN DWORD dwFlags,
|
|
IN LPCVOID pvData,
|
|
OUT BOOL *pbDone
|
|
)
|
|
{
|
|
DWORD dwErr = NO_ERROR;
|
|
|
|
// Make sure no arguments were passed in
|
|
//
|
|
if (dwArgCount - dwCurrentIndex != 0)
|
|
{
|
|
return ERROR_INVALID_SYNTAX;
|
|
}
|
|
|
|
dwErr = ClientEnum(ClientShow, 0, NULL);
|
|
if (RPC_S_UNKNOWN_IF == dwErr)
|
|
{
|
|
DisplayMessage(
|
|
g_hModule,
|
|
EMSG_UNABLE_TO_ENUM_CLIENTS);
|
|
|
|
dwErr = NO_ERROR;
|
|
}
|
|
|
|
return dwErr;
|
|
}
|
|
|