//++ // // 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)); }