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

198 lines
4.7 KiB
C

//++
//
// Copyright (C) Microsoft Corporation, 1987 - 1999
//
// Module Name:
//
// winsock.c
//
// Abstract:
//
// Queries into network drivers
//
// Author:
//
// Anilth - 4-20-1998
//
// Environment:
//
// User mode only.
// Contains NT-specific code.
//
// Revision History:
//
//--
#include "precomp.h"
HRESULT WinsockTest( NETDIAG_PARAMS* pParams, NETDIAG_RESULT* pResults)
{
int err,i;
LPWSAPROTOCOL_INFO lpProtocolBuffer = NULL;
DWORD reqd_length;
SOCKET sock;
UINT optval;
int optlen;
WSADATA WSAData;
HRESULT hr = S_OK;
PrintStatusMessage(pParams,0, IDS_WINSOCK_STATUS_MSG);
err = WSAStartup(MAKEWORD( 2, 0 ), &WSAData);
if(err != 0) // error
{
CHK_HR_CONTEXT(pResults->Winsock, hr = HRESULT_FROM_WIN32(err), IDS_WINSOCK_FAILED_START);
};
// determine the length of the buffer needed
reqd_length = 0;
err = WSAEnumProtocols(NULL, NULL, &reqd_length);
if(reqd_length == 0 || reqd_length == -1)
{
err = WSAGetLastError();
CHK_HR_CONTEXT(pResults->Winsock, hr = HRESULT_FROM_WIN32(err), IDS_WINSOCK_FAILED_ENUM);
};
lpProtocolBuffer = (LPWSAPROTOCOL_INFO)Malloc(reqd_length);
if (lpProtocolBuffer == NULL) {
CHK_HR_CONTEXT(pResults->Winsock, hr = E_OUTOFMEMORY, IDS_WINSOCK_FAILED_ENUM);
}
ZeroMemory( lpProtocolBuffer, reqd_length );
// get the information of the protocols
err = WSAEnumProtocols(
NULL,
(LPWSAPROTOCOL_INFO)lpProtocolBuffer,
(LPDWORD)&reqd_length
);
if(err == SOCKET_ERROR)
{
err = WSAGetLastError();
CHK_HR_CONTEXT(pResults->Winsock, hr = HRESULT_FROM_WIN32(err), IDS_WINSOCK_FAILED_ENUM);
}
pResults->Winsock.dwProts = err; // number of protocols
pResults->Winsock.pProtInfo = lpProtocolBuffer; // protocol information array
//
// Other TCP/IP information
//
sock = socket(PF_INET,SOCK_DGRAM,IPPROTO_UDP);
if ( sock == INVALID_SOCKET)
{
err = WSAGetLastError();
CHK_HR_CONTEXT(pResults->Winsock, hr = HRESULT_FROM_WIN32(err), IDS_WINSOCK_FAILED_UDPSOCKET);
}
optlen = sizeof(optval);
err = getsockopt(sock, SOL_SOCKET, SO_MAX_MSG_SIZE, (char FAR*)&optval, (int FAR*)&optlen);
if (err == SOCKET_ERROR)
{
err = WSAGetLastError();
CHK_HR_CONTEXT(pResults->Winsock, hr = HRESULT_FROM_WIN32(err), IDS_WINSOCK_FAILED_UDPSOCKET);
}
pResults->Winsock.dwMaxUDP = optval;
L_ERR:
WSACleanup();
//$REVIEW (nsun) we should return S_FALSE so that we can go on with
//other tests
if (!FHrOK(hr))
hr = S_FALSE;
return hr;
} /* END OF WINSTest() */
void WinsockGlobalPrint(IN NETDIAG_PARAMS *pParams, IN OUT NETDIAG_RESULT *pResults)
{
DWORD i = 0;
LPWSAPROTOCOL_INFO pProtInfo = pResults->Winsock.pProtInfo;
// print out the test result
if (pParams->fVerbose || !FHrOK(pResults->Winsock.hr))
{
PrintNewLine(pParams, 2);
PrintTestTitleResult(pParams,
IDS_WINSOCK_LONG,
IDS_WINSOCK_SHORT,
TRUE,
pResults->Winsock.hr, 0);
}
if (pParams->fReallyVerbose || !FHrOK(pResults->Winsock.hr))
{
if (!FHrOK(pResults->Winsock.hr))
{
PrintError(pParams, pResults->Winsock.idsContext, pResults->Winsock.hr);
}
}
if (pParams->fReallyVerbose)
{
if(pProtInfo)
{
// if there is any information about the providers
// " The number of protocols which have been reported : %d\n"
PrintMessage(pParams, IDS_WINSOCK_12605, pResults->Winsock.dwProts);
for (i = 0; i < pResults->Winsock.dwProts ; i++)
{
// " Description: %s\n"
PrintMessage(pParams, IDS_WINSOCK_12606,pProtInfo->szProtocol);
// " Provider Version :%d\n"
PrintMessage(pParams, IDS_WINSOCK_12607,pProtInfo->iVersion);
switch(pProtInfo++->dwMessageSize){
case 0:
// " Max message size : Stream Oriented\n"
PrintMessage(pParams, IDS_WINSOCK_12608);
break;
case 1:
// " Max message size : Message Oriented\n"
PrintMessage(pParams, IDS_WINSOCK_12609);
break;
case 0xffffffff:
// " Max message size : depends on MTU\n"
PrintMessage(pParams, IDS_WINSOCK_12610);
break;
}
}
}
// if there is any information about the UDP size
if(pResults->Winsock.dwMaxUDP)
// "\n Max UDP size : %d bytes\n"
PrintMessage(pParams, IDS_WINSOCK_12611,pResults->Winsock.dwMaxUDP);
}
}
void WinsockPerInterfacePrint(IN NETDIAG_PARAMS *pParams,
IN OUT NETDIAG_RESULT *pResults,
IN INTERFACE_RESULT *pIfResult)
{
// no perinterface information
}
void WinsockCleanup(IN NETDIAG_PARAMS *pParams,
IN OUT NETDIAG_RESULT *pResults)
{
if(pResults->Winsock.pProtInfo)
{
free(pResults->Winsock.pProtInfo);
}
ZeroMemory(&(pResults->Winsock), sizeof(GLOBAL_WINSOCK));
}