198 lines
4.7 KiB
C
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));
|
|
}
|
|
|
|
|