317 lines
7.3 KiB
C
317 lines
7.3 KiB
C
|
//++
|
||
|
//
|
||
|
// 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 ##########################//
|
||
|
//-------------------------------------------------------------------------//
|