windows-nt/Source/XPSP1/NT/net/diagnostics/netdiag/modemtst.c
2020-09-26 16:20:57 +08:00

408 lines
12 KiB
C

//++
//
// Copyright (C) Microsoft Corporation, 1987 - 1999
//
// Module Name:
//
// modemtst.c
//
// Abstract:
//
// Queries into network drivers
//
// Author:
//
// Anilth - 4-20-1998
//
// Environment:
//
// User mode only.
// Contains NT-specific code.
//
// Revision History:
//
//--
#include "precomp.h"
#undef IsEqualGUID
#include <ras.h>
#include <tapi.h>
#include <unimodem.h>
#define PRINT_MODEM( _i, _ids, _mdm) \
PrintMessage(pParams, _ids, \
MAP_ON_OFF(pResults->Modem.pModemDevice[_i].dwModemOptions & _mdm))
void GetLineId(NETDIAG_RESULT *pResults,
int cModems,
HLINEAPP hLineApp,
DWORD dwDeviceID);
HRESULT
ModemTest(NETDIAG_PARAMS* pParams, NETDIAG_RESULT* pResults)
//
// Description:
//
// This function performs diagnostics on all the line devices
//
// Arguments
// None
//
// Return:
// None
{
LONG lReturn;
DWORD dwNumDevs = 0;
DWORD dwAPIVersion = TAPI_CURRENT_VERSION;
HLINEAPP hLineApp = 0;
DWORD dwDeviceID;
// char pszDeviceClass[] = "tapi/line/diagnostics";
char pszDeviceClass[] = "comm";
LPVARSTRING lpVarString = NULL;
VARSTRING varStringT;
DWORD dwSize;
LINEINITIALIZEEXPARAMS lineParams;
int cModems = 0;
PUMDEVCFG lpDevConfig = NULL;
LPMODEMSETTINGS lpModemSettings = NULL;
LPCOMMCONFIG lpCommConfig = NULL;
HRESULT hr = hrOK;
PrintStatusMessage(pParams, 4, IDS_MODEM_STATUS_MSG);
ZeroMemory(&lineParams, sizeof(lineParams));
lineParams.dwTotalSize = sizeof(lineParams);
lineParams.dwOptions = LINEINITIALIZEEXOPTION_USEEVENT;
pResults->Modem.fPerformed = TRUE;
lReturn = lineInitializeEx(
&hLineApp,
NULL,
NULL,
"NetDiag",
&dwNumDevs,
&dwAPIVersion,
&lineParams);
//
// Check whether this version can support our calls.
//
if (lReturn != 0)
{
SetMessage(&pResults->Modem.ndOutput,
Nd_Quiet,
IDS_MODEM_LINEINIT_FAILED,
lReturn);
pResults->Modem.hr = E_FAIL;
return S_FALSE;
}
if (dwNumDevs == 0)
{
SetMessage(&pResults->Modem.ndOutput,
Nd_ReallyVerbose,
IDS_MODEM_NO_DEVICES);
pResults->Modem.hr = hrOK;
pResults->Modem.fPerformed = FALSE; //test is skipped
return hrOK;
}
// Need to allocate a device structure for each device
Free(pResults->Modem.pModemDevice);
pResults->Modem.pModemDevice = (MODEM_DEVICE *) Malloc(
sizeof(MODEM_DEVICE) * dwNumDevs);
if (pResults->Modem.pModemDevice == NULL)
return E_OUTOFMEMORY;
ZeroMemory(pResults->Modem.pModemDevice,
sizeof(MODEM_DEVICE) * dwNumDevs);
pResults->Modem.cModems = dwNumDevs;
//
// Get the line device configuration settings
//
for (dwDeviceID = 0; dwDeviceID < dwNumDevs ; dwDeviceID++)
{
Free(lpVarString);
lpVarString = NULL;
// Get the proper size for the structure
ZeroMemory(&varStringT, sizeof(VARSTRING));
varStringT.dwTotalSize = sizeof(VARSTRING);
lReturn = lineGetDevConfig(dwDeviceID,
&varStringT,
pszDeviceClass);
if ((lReturn != 0) && (lReturn != LINEERR_STRUCTURETOOSMALL))
continue;
// dwSize = varStringT.dwNeededSize + sizeof(VARSTRING);
dwSize = varStringT.dwNeededSize;
lpVarString = (VARSTRING *) Malloc(dwSize);
ZeroMemory(lpVarString, dwSize);
lpVarString->dwTotalSize = dwSize;
lpVarString->dwStringFormat = STRINGFORMAT_BINARY;
lReturn = lineGetDevConfig(dwDeviceID,
lpVarString,
pszDeviceClass);
if (lReturn != 0)
{
DebugMessage2("Error: lineGetDevConfig for line id %d\n",lReturn);
continue;
}
//
// Interpret the results
//
if (lpVarString->dwStringFormat == STRINGFORMAT_BINARY
&& lpVarString->dwStringSize > sizeof(UMDEVCFG))
{
lpDevConfig = (PUMDEVCFG) ((LPBYTE) lpVarString + lpVarString->dwStringOffset);
lpCommConfig = &lpDevConfig->commconfig;
if (lpCommConfig->dwProviderSubType == PST_MODEM)
{
lpModemSettings = (LPMODEMSETTINGS)((LPBYTE) lpCommConfig + lpCommConfig->dwProviderOffset);
GetLineId(pResults, cModems, hLineApp, dwDeviceID);
pResults->Modem.pModemDevice[cModems].dwNegotiatedSpeed =
lpModemSettings->dwNegotiatedDCERate;
pResults->Modem.pModemDevice[cModems].dwModemOptions =
lpModemSettings->dwNegotiatedModemOptions;
pResults->Modem.pModemDevice[cModems].dwDeviceID = dwDeviceID;
cModems++;
}
}
}
pResults->Modem.cModems = cModems;
Free(lpVarString);
//
// Shutdown TAPI
//
lReturn = lineShutdown(hLineApp);
if (lReturn != 0)
{
// if (pParams->fDebugVerbose)
// printf("Error : lineShutdown!\n");
pResults->Modem.hr = S_FALSE;
return S_FALSE;
}
pResults->Modem.hr = hrOK;
return hrOK;
}
/*!--------------------------------------------------------------------------
ModemGlobalPrint
-
Author: KennT
---------------------------------------------------------------------------*/
void ModemGlobalPrint( NETDIAG_PARAMS* pParams,
NETDIAG_RESULT* pResults)
{
int i;
if (pParams->fVerbose || !FHrOK(pResults->Modem.hr))
{
PrintNewLine(pParams, 2);
PrintTestTitleResult(pParams, IDS_MODEM_LONG, IDS_MODEM_SHORT, pResults->Modem.fPerformed,
pResults->Modem.hr, 0);
PrintNdMessage(pParams, &pResults->Modem.ndOutput);
if (pParams->fReallyVerbose)
{
for ( i=0; i<pResults->Modem.cModems; i++)
{
PrintNewLine(pParams, 1);
PrintMessage(pParams, IDS_MODEM_NAME,
pResults->Modem.pModemDevice[i].pszName);
PrintMessage(pParams, IDS_MODEM_DEVICEID,
pResults->Modem.pModemDevice[i].dwDeviceID);
PrintMessage(pParams, IDS_MODEM_PORT,
pResults->Modem.pModemDevice[i].pszPort);
PrintMessage(pParams, IDS_MODEM_NEGOTIATED_SPEED,
pResults->Modem.pModemDevice[i].dwNegotiatedSpeed);
PRINT_MODEM( i, IDS_MODEM_COMPRESSION, MDM_COMPRESSION);
PRINT_MODEM( i, IDS_MODEM_ERROR_CONTROL, MDM_ERROR_CONTROL);
PRINT_MODEM( i, IDS_MODEM_FORCED_EC, MDM_FORCED_EC);
PRINT_MODEM( i, IDS_MODEM_CELLULAR, MDM_CELLULAR);
PRINT_MODEM( i, IDS_MODEM_FLOWCONTROL_HARD, MDM_FLOWCONTROL_HARD);
PRINT_MODEM( i, IDS_MODEM_FLOWCONTROL_SOFT, MDM_FLOWCONTROL_SOFT);
PRINT_MODEM( i, IDS_MODEM_CCITT_OVERRIDE, MDM_CCITT_OVERRIDE);
PRINT_MODEM( i, IDS_MODEM_SPEED_ADJUST, MDM_SPEED_ADJUST);
PRINT_MODEM( i, IDS_MODEM_TONE_DIAL, MDM_TONE_DIAL);
PRINT_MODEM( i, IDS_MODEM_BLIND_DIAL, MDM_BLIND_DIAL);
PRINT_MODEM( i, IDS_MODEM_V23_OVERRIDE, MDM_V23_OVERRIDE);
}
}
}
}
/*!--------------------------------------------------------------------------
ModemPerInterfacePrint
-
Author: KennT
---------------------------------------------------------------------------*/
void ModemPerInterfacePrint( NETDIAG_PARAMS* pParams,
NETDIAG_RESULT* pResults,
INTERFACE_RESULT *pInterfaceResults)
{
// no per-interface results
}
/*!--------------------------------------------------------------------------
ModemCleanup
-
Author: KennT
---------------------------------------------------------------------------*/
void ModemCleanup( NETDIAG_PARAMS* pParams, NETDIAG_RESULT* pResults)
{
int i;
ClearMessage(&pResults->Modem.ndOutput);
for (i=0; i<pResults->Modem.cModems; i++)
{
Free(pResults->Modem.pModemDevice[i].pszPort);
pResults->Modem.pModemDevice[i].pszPort = NULL;
}
Free(pResults->Modem.pModemDevice);
pResults->Modem.pModemDevice = NULL;
pResults->Modem.cModems = 0;
}
void GetLineId(NETDIAG_RESULT *pResults,
int cModems,
HLINEAPP hLineApp,
DWORD dwDeviceID)
{
HLINE hLine = 0;
LONG lReturn;
VARSTRING varString;
VARSTRING * lpVarString;
LINEDEVCAPS lineDevCaps;
LINEDEVCAPS * pLineDevCaps = NULL;
lReturn = lineOpen(hLineApp,
dwDeviceID,
&hLine,
TAPI_CURRENT_VERSION,
0,
0,
LINECALLPRIVILEGE_NONE,
LINEMEDIAMODE_UNKNOWN,
NULL);
if (lReturn == 0)
{
ZeroMemory(&varString, sizeof(VARSTRING));
varString.dwTotalSize = sizeof(VARSTRING);
lReturn = lineGetID(hLine, 0, 0, LINECALLSELECT_LINE,
&varString, "comm/datamodem/portname");
if ((lReturn == 0) || (lReturn == LINEERR_STRUCTURETOOSMALL))
{
lpVarString = (VARSTRING *) Malloc(varString.dwNeededSize);
if (lpVarString)
{
ZeroMemory(lpVarString, varString.dwNeededSize);
lpVarString->dwTotalSize = varString.dwNeededSize;
lReturn = lineGetID(hLine, 0, 0, LINECALLSELECT_LINE,
lpVarString, "comm/datamodem/portname");
pResults->Modem.pModemDevice[cModems].pszPort =
StrDupTFromA((char *) (lpVarString + 1));
Free(lpVarString);
}
}
lineClose(hLine);
}
// Get the name of this line
ZeroMemory(&lineDevCaps, sizeof(lineDevCaps));
lineDevCaps.dwTotalSize = sizeof(LINEDEVCAPS);
lineDevCaps.dwStringFormat = STRINGFORMAT_UNICODE;
lReturn = lineGetDevCaps(hLineApp,
dwDeviceID,
TAPI_CURRENT_VERSION,
0,
&lineDevCaps);
if ((lReturn == 0) || (lReturn == LINEERR_STRUCTURETOOSMALL))
{
pLineDevCaps = (LINEDEVCAPS *) Malloc(lineDevCaps.dwNeededSize);
if (pLineDevCaps)
{
ZeroMemory(pLineDevCaps, lineDevCaps.dwNeededSize);
pLineDevCaps->dwTotalSize = lineDevCaps.dwNeededSize;
pLineDevCaps->dwStringFormat = STRINGFORMAT_UNICODE;
lReturn = lineGetDevCaps(hLineApp,
dwDeviceID,
TAPI_CURRENT_VERSION,
0,
pLineDevCaps);
if (lReturn == 0)
{
if (pLineDevCaps->dwStringFormat == STRINGFORMAT_UNICODE)
{
pResults->Modem.pModemDevice[cModems].pszName =
StrDupTFromW((WCHAR *) (((BYTE *) pLineDevCaps) +
pLineDevCaps->dwLineNameOffset));
}
else
{
pResults->Modem.pModemDevice[cModems].pszName =
StrDupTFromA((char *) (((BYTE *) pLineDevCaps) +
pLineDevCaps->dwLineNameOffset));
}
}
}
}
if (pLineDevCaps)
Free(pLineDevCaps);
}