//++ // // Copyright (C) Microsoft Corporation, 1987 - 1999 // // Module Name: // // xportst.c // // Abstract: // // Tests for the transports on the local workstation // // Author: // // 1-Feb-1998 (karolys) // // Environment: // // User mode only. // Contains NT-specific code. // // Revision History: // //-- /*==========================< Include files >==============================*/ #include "precomp.h" #define BUFF_SIZE 650 /*===========================< NetBT vars >===============================*/ #define NETBIOS_NAME_SIZE 16 /*==========================< DHCP Include>==============================*/ #include "dhcptest.h" /*=======================< Function prototypes >=================================*/ DWORD OpenDriver( OUT HANDLE *Handle, IN LPWSTR DriverName ) //++ // // Routine Description: // // This function opens a specified IO drivers. // // Arguments: // // Handle - pointer to location where the opened drivers handle is // returned. // // DriverName - name of the driver to be opened. // // Return Value: // // Windows Error Code. //-- { OBJECT_ATTRIBUTES objectAttributes; IO_STATUS_BLOCK ioStatusBlock; UNICODE_STRING nameString; NTSTATUS status; *Handle = NULL; // // Open a Handle to the IP driver. // RtlInitUnicodeString(&nameString, DriverName); InitializeObjectAttributes( &objectAttributes, &nameString, OBJ_CASE_INSENSITIVE, (HANDLE) NULL, (PSECURITY_DESCRIPTOR) NULL ); status = NtCreateFile( Handle, SYNCHRONIZE | FILE_READ_DATA | FILE_WRITE_DATA, &objectAttributes, &ioStatusBlock, NULL, FILE_ATTRIBUTE_NORMAL, FILE_SHARE_READ | FILE_SHARE_WRITE, FILE_OPEN_IF, 0, NULL, 0 ); return( RtlNtStatusToDosError( status ) ); } //-------------------------------------------------------------------------// //###### I s I c m p R e s p o n s e () #################################// //-------------------------------------------------------------------------// BOOL IsIcmpResponseA( LPCSTR pszIpAddrStr ) //++ // // Routine Description: // // Sends ICMP echo request frames to the IP address specified. // // Arguments: // // pszIAddrStr - address to ping // // Return Value: // // TRUE: Test suceeded. // FALSE: Test failed // //-- { char *SendBuffer, *RcvBuffer; int i, nReplyCnt; int nReplySum = 0; HANDLE hIcmp; PICMP_ECHO_REPLY reply; // // contact ICMP driver // hIcmp = IcmpCreateFile(); if ( hIcmp == INVALID_HANDLE_VALUE ) { DebugMessage( " [FATAL] Cannot get ICMP handle." ); return FALSE; } // // prepare buffers // SendBuffer = Malloc( DEFAULT_SEND_SIZE ); if ( SendBuffer == NULL ) { DebugMessage(" [FATAL] Cannot allocate buffer for the ICMP echo frame." ); return FALSE; } ZeroMemory( SendBuffer, DEFAULT_SEND_SIZE ); RcvBuffer = Malloc( MAX_ICMP_BUF_SIZE ); if ( RcvBuffer == NULL ) { Free( SendBuffer ); DebugMessage(" [FATAL] Cannot allocate buffer for the ICMP echo frame." ); return FALSE; } ZeroMemory( RcvBuffer, MAX_ICMP_BUF_SIZE ); // // send ICMP echo request // for ( i = 0; i < PING_RETRY_CNT; i++ ) { nReplyCnt = IcmpSendEcho( hIcmp, inet_addr(pszIpAddrStr), SendBuffer, (unsigned short )DEFAULT_SEND_SIZE, NULL, RcvBuffer, MAX_ICMP_BUF_SIZE, DEFAULT_TIMEOUT ); // // test for destination unreachables // if ( nReplyCnt != 0 ) { reply = (PICMP_ECHO_REPLY )RcvBuffer; if ( reply->Status == IP_SUCCESS ) { nReplySum += nReplyCnt; } } } /* for loop */ // // cleanup // Free( SendBuffer ); Free( RcvBuffer ); IcmpCloseHandle( hIcmp ); if ( nReplySum == 0 ) { return FALSE; } else { return TRUE; } } /* END OF IsIcmpResponse() */ BOOL IsIcmpResponseW( LPCWSTR pszIpAddrStr ) { LPSTR pszAddr = NULL; BOOL fRetval; pszAddr = StrDupAFromW(pszIpAddrStr); if (pszAddr == NULL) return FALSE; fRetval = IsIcmpResponseA(pszAddr); Free(pszAddr); return fRetval; } //-------------------------------------------------------------------------// //###### W S L o o p B k T e s t () #####################################// //-------------------------------------------------------------------------// // Abstract: // // Opens a datagram socket and sends a UDP frame through the loopback.// // If the frame comes back then Winsock and AFD are most probably OK. // // Arguments: // // none // // Return value: // // TRUE - test passed // // FALSE - test failed // // Global variables used: // // none // //-------------------------------------------------------------------------// BOOL WSLoopBkTest( PVOID Context ) { BOOL RetVal = TRUE; SOCKET tstSock; DWORD optionValue; // helper var for setsockopt() SOCKADDR_IN sockAddr; // struct holding source socket info // // create a socket // /* tstSock = socket( PF_INET, SOCK_DGRAM, IPPROTO_UDP ); if ( tstSock == INVALID_SOCKET ) { printf( " [FATAL] socket creation failed!\n" ); printf( " You have a potential Winsock problem!\n" ); return FALSE; } tstSock = WSASocket( PF_INET, SOCK_DGRAM, IPPROTO_UDP, NULL, 0, WSA_FLAG_OVERLAPPED ); if ( tstSock == INVALID_SOCKET ) { printf( " [FATAL] socket creation failed!\n" ); printf( " You have a potential Winsock problem!\n" ); return FALSE; } sockAddr.sin_family = PF_INET; sockAddr.sin_addr.s_addr = 0; // use any local address sockAddr.sin_port = htons( PORT_4_LOOPBK_TST ); // RtlZeroMemory( sockAddr.sin_zero, 8 ); if ( bind(tstSock, (LPSOCKADDR )&sockAddr, sizeof(sockAddr)) == SOCKET_ERROR ) { printf( " [FATAL] bind() failed with error %d!\n", WSAGetLastError() ); printf( " You have a potential Winsock problem!\n" ); return FALSE; } */ return RetVal; UNREFERENCED_PARAMETER( Context ); } /* END OF WSLoopBkTest() */ //###################### END OF FILE xportst.c ##########################// //-------------------------------------------------------------------------//