mirror of https://github.com/lianthony/NT4.0
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
669 lines
12 KiB
669 lines
12 KiB
/*++
|
|
|
|
Copyright (c) 1996 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
sockutil.c
|
|
|
|
Abstract:
|
|
|
|
General socket utilities.
|
|
|
|
Author:
|
|
|
|
Keith Moore (keithmo) 20-May-1996
|
|
|
|
Revision History:
|
|
|
|
--*/
|
|
|
|
|
|
#include "precomp.h"
|
|
#pragma hdrstop
|
|
#include <wsipx.h>
|
|
#include <wsnetbs.h>
|
|
|
|
|
|
//
|
|
// Private constants.
|
|
//
|
|
|
|
#define ACTUAL_ADDRESS(a,s,f) \
|
|
( (DWORD)(a) + ( (PUCHAR)(&(s)->f) - (PUCHAR)(s) ) )
|
|
|
|
#define IS_LIST_EMPTY(a,s,f) \
|
|
( (DWORD)(s)->f.Flink == ACTUAL_ADDRESS(a,s,f) )
|
|
|
|
|
|
//
|
|
// Private globals.
|
|
//
|
|
|
|
PSTR SocketStates[] =
|
|
{
|
|
"Open",
|
|
"Bound",
|
|
"BoundSpecific",
|
|
"Listening",
|
|
"Connected",
|
|
"Closing"
|
|
};
|
|
|
|
|
|
//
|
|
// Private prototypes.
|
|
//
|
|
|
|
PSTR
|
|
SocketStateToString(
|
|
SOCKET_STATE State
|
|
);
|
|
|
|
PSTR
|
|
NetbiosNameTypeToString(
|
|
USHORT NetbiosNameType
|
|
);
|
|
|
|
PSTR
|
|
GroupTypeToString(
|
|
AFD_GROUP_TYPE GroupType
|
|
);
|
|
|
|
|
|
//
|
|
// Public functions.
|
|
//
|
|
|
|
VOID
|
|
DumpSocket(
|
|
PSOCKET_INFORMATION Socket,
|
|
DWORD ActualAddress
|
|
)
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Dumps the specified SOCKET_INFORMATION structure.
|
|
|
|
Arguments:
|
|
|
|
Socket - Points to the SOCKET_INFORMATION to dump.
|
|
|
|
ActualAddress - The actual address where the structure resides in the
|
|
target process.
|
|
|
|
Return Value:
|
|
|
|
None.
|
|
|
|
--*/
|
|
|
|
{
|
|
|
|
SOCKADDR addr;
|
|
ULONG result;
|
|
|
|
dprintf(
|
|
"SOCKET_INFORMATION @ %08lx:\n",
|
|
ActualAddress
|
|
);
|
|
|
|
dprintf(
|
|
" State = %s\n",
|
|
SocketStateToString( Socket->State )
|
|
);
|
|
|
|
dprintf(
|
|
" ReferenceCount = %lu\n",
|
|
Socket->ReferenceCount
|
|
);
|
|
|
|
dprintf(
|
|
" Handle = %08lx\n",
|
|
Socket->Handle
|
|
);
|
|
|
|
dprintf(
|
|
" SocketSerialNumber = %lu\n",
|
|
Socket->SocketSerialNumber
|
|
);
|
|
|
|
dprintf(
|
|
" AddressFamily = %d\n",
|
|
Socket->AddressFamily
|
|
);
|
|
|
|
dprintf(
|
|
" SocketType = %d\n",
|
|
Socket->SocketType
|
|
);
|
|
|
|
dprintf(
|
|
" Protocol = %d\n",
|
|
Socket->Protocol
|
|
);
|
|
|
|
dprintf(
|
|
" HelperDll = %08lx\n",
|
|
Socket->HelperDll
|
|
);
|
|
|
|
dprintf(
|
|
" HelperdllContext = %08lx\n",
|
|
Socket->HelperDllContext
|
|
);
|
|
|
|
dprintf(
|
|
" HelperdllNotificationEvents = %08lx\n",
|
|
Socket->HelperDllNotificationEvents
|
|
);
|
|
|
|
dprintf(
|
|
" LocalAddress = %08lx\n",
|
|
Socket->LocalAddress
|
|
);
|
|
|
|
dprintf(
|
|
" LocalAddressLength = %lu\n",
|
|
Socket->LocalAddressLength
|
|
);
|
|
|
|
if( Socket->LocalAddress != NULL &&
|
|
Socket->LocalAddressLength == sizeof(addr) ) {
|
|
|
|
if( ReadMemory(
|
|
(DWORD)Socket->LocalAddress,
|
|
&addr,
|
|
sizeof(addr),
|
|
&result
|
|
) ) {
|
|
|
|
DumpSockaddr(
|
|
" ",
|
|
&addr,
|
|
(DWORD)Socket->LocalAddress
|
|
);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
dprintf(
|
|
" RemoteAddress = %08lx\n",
|
|
Socket->RemoteAddress
|
|
);
|
|
|
|
dprintf(
|
|
" RemoteAddressLength = %lu\n",
|
|
Socket->RemoteAddressLength
|
|
);
|
|
|
|
if( Socket->RemoteAddress != NULL &&
|
|
Socket->RemoteAddressLength == sizeof(addr) ) {
|
|
|
|
if( ReadMemory(
|
|
(DWORD)Socket->RemoteAddress,
|
|
&addr,
|
|
sizeof(addr),
|
|
&result
|
|
) ) {
|
|
|
|
DumpSockaddr(
|
|
" ",
|
|
&addr,
|
|
(DWORD)Socket->RemoteAddress
|
|
);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
dprintf(
|
|
" TdiAddressHandle = %08lx\n",
|
|
Socket->TdiAddressHandle
|
|
);
|
|
|
|
dprintf(
|
|
" TdiConnectionHandle = %08lx\n",
|
|
Socket->TdiConnectionHandle
|
|
);
|
|
|
|
dprintf(
|
|
" AsyncSelectSerialNumber = %lu\n",
|
|
Socket->AsyncSelectSerialNumber
|
|
);
|
|
|
|
dprintf(
|
|
" AsyncSelecthWnd = %08lx\n",
|
|
Socket->AsyncSelecthWnd
|
|
);
|
|
|
|
dprintf(
|
|
" AsyncSelectwMsg = %08lx\n",
|
|
Socket->AsyncSelectwMsg
|
|
);
|
|
|
|
dprintf(
|
|
" AsyncSelectlEvent = %08lx\n",
|
|
Socket->AsyncSelectlEvent
|
|
);
|
|
|
|
dprintf(
|
|
" DisabledAsyncSelectEvents = %08lx\n",
|
|
Socket->DisabledAsyncSelectEvents
|
|
);
|
|
|
|
dprintf(
|
|
" EventSelectEventObject = %08lx\n",
|
|
Socket->EventSelectEventObject
|
|
);
|
|
|
|
dprintf(
|
|
" EventSelectlNetworkEvents = %08lx\n",
|
|
Socket->EventSelectlNetworkEvents
|
|
);
|
|
|
|
dprintf(
|
|
" LingerInfo = (%d,%d)\n",
|
|
Socket->LingerInfo.l_onoff,
|
|
Socket->LingerInfo.l_linger
|
|
);
|
|
|
|
dprintf(
|
|
" SendTimeout = %lu\n",
|
|
Socket->SendTimeout
|
|
);
|
|
|
|
dprintf(
|
|
" ReceiveTimeout = %lu\n",
|
|
Socket->ReceiveTimeout
|
|
);
|
|
|
|
dprintf(
|
|
" ReceiveBufferSize = %lu\n",
|
|
Socket->ReceiveBufferSize
|
|
);
|
|
|
|
dprintf(
|
|
" SendBufferSize = %lu\n",
|
|
Socket->SendBufferSize
|
|
);
|
|
|
|
dprintf(
|
|
" Broadcast = %s\n",
|
|
BooleanToString( Socket->Broadcast )
|
|
);
|
|
|
|
dprintf(
|
|
" Debug = %s\n",
|
|
BooleanToString( Socket->Debug )
|
|
);
|
|
|
|
dprintf(
|
|
" OobInline = %s\n",
|
|
BooleanToString( Socket->OobInline )
|
|
);
|
|
|
|
dprintf(
|
|
" ReuseAddresses = %s\n",
|
|
BooleanToString( Socket->ReuseAddresses )
|
|
);
|
|
|
|
dprintf(
|
|
" NonBlocking = %s\n",
|
|
BooleanToString( Socket->NonBlocking )
|
|
);
|
|
|
|
dprintf(
|
|
" DontUseWildcard = %s\n",
|
|
BooleanToString( Socket->DontUseWildcard )
|
|
);
|
|
|
|
dprintf(
|
|
" ConnectInProgress = %s\n",
|
|
BooleanToString( Socket->ConnectInProgress )
|
|
);
|
|
|
|
dprintf(
|
|
" ReceiveShutdown = %s\n",
|
|
BooleanToString( Socket->ReceiveShutdown )
|
|
);
|
|
|
|
dprintf(
|
|
" SendShutdown = %s\n",
|
|
BooleanToString( Socket->SendShutdown )
|
|
);
|
|
|
|
dprintf(
|
|
" ConnectOutstanding = %s\n",
|
|
BooleanToString( Socket->ConnectOutstanding )
|
|
);
|
|
|
|
dprintf(
|
|
" Lock @ %08lx\n",
|
|
ACTUAL_ADDRESS(
|
|
ActualAddress,
|
|
Socket,
|
|
Lock
|
|
)
|
|
);
|
|
|
|
dprintf(
|
|
" CreationFlags = %08lx\n",
|
|
Socket->CreationFlags
|
|
);
|
|
|
|
dprintf(
|
|
" CatalogEntryId = %08lx\n",
|
|
Socket->CatalogEntryId
|
|
);
|
|
|
|
dprintf(
|
|
" LastError = %d\n",
|
|
Socket->LastError
|
|
);
|
|
|
|
dprintf(
|
|
" GroupID = %d\n",
|
|
Socket->GroupID
|
|
);
|
|
|
|
dprintf(
|
|
" GroupType = %s\n",
|
|
GroupTypeToString( Socket->GroupType )
|
|
);
|
|
|
|
dprintf(
|
|
" GroupPriority = %d\n",
|
|
Socket->GroupPriority
|
|
);
|
|
|
|
dprintf( "\n" );
|
|
|
|
} // DumpSocket
|
|
|
|
|
|
VOID
|
|
DumpSockaddr(
|
|
PSTR Prefix,
|
|
PSOCKADDR Sockaddr,
|
|
DWORD ActualAddress
|
|
)
|
|
{
|
|
|
|
//
|
|
// Hack for uninitialized addresses.
|
|
//
|
|
|
|
if( Sockaddr->sa_family == 0 ) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
dprintf(
|
|
"%sSOCKADDR @ %08lx\n",
|
|
Prefix,
|
|
ActualAddress
|
|
);
|
|
|
|
switch( Sockaddr->sa_family ) {
|
|
|
|
case AF_INET : {
|
|
|
|
PSOCKADDR_IN ipAddr;
|
|
|
|
ipAddr = (PSOCKADDR_IN)Sockaddr;
|
|
|
|
dprintf(
|
|
"%s sin_family = %d (IP)\n",
|
|
Prefix,
|
|
ipAddr->sin_family
|
|
);
|
|
|
|
dprintf(
|
|
"%s sin_port = %u\n",
|
|
Prefix,
|
|
NTOHS( ipAddr->sin_port )
|
|
);
|
|
|
|
dprintf(
|
|
"%s sin_addr = %d.%d.%d.%d\n",
|
|
Prefix,
|
|
UC( ipAddr->sin_addr.s_addr >> 0 ),
|
|
UC( ipAddr->sin_addr.s_addr >> 8 ),
|
|
UC( ipAddr->sin_addr.s_addr >> 16 ),
|
|
UC( ipAddr->sin_addr.s_addr >> 24 )
|
|
);
|
|
|
|
}
|
|
break;
|
|
|
|
case AF_IPX : {
|
|
|
|
PSOCKADDR_IPX ipxAddr;
|
|
|
|
ipxAddr = (PSOCKADDR_IPX)Sockaddr;
|
|
|
|
dprintf(
|
|
"%s sa_family = %d (IPX)\n",
|
|
Prefix,
|
|
ipxAddr->sa_family
|
|
);
|
|
|
|
dprintf(
|
|
"%s sa_netnum = %02X-%02X-%02X-%02X\n",
|
|
Prefix,
|
|
ipxAddr->sa_netnum[0],
|
|
ipxAddr->sa_netnum[1],
|
|
ipxAddr->sa_netnum[2],
|
|
ipxAddr->sa_netnum[3]
|
|
);
|
|
|
|
dprintf(
|
|
"%s sa_nodenum = %02X-%02X-%02X-%02X-%02X-%02X\n",
|
|
Prefix,
|
|
ipxAddr->sa_nodenum[0],
|
|
ipxAddr->sa_nodenum[1],
|
|
ipxAddr->sa_nodenum[2],
|
|
ipxAddr->sa_nodenum[3],
|
|
ipxAddr->sa_nodenum[4],
|
|
ipxAddr->sa_nodenum[5]
|
|
);
|
|
|
|
dprintf(
|
|
"%s sa_socket = %04X\n",
|
|
Prefix,
|
|
ipxAddr->sa_socket
|
|
);
|
|
|
|
}
|
|
break;
|
|
|
|
case AF_NETBIOS : {
|
|
|
|
PSOCKADDR_NB netbiosAddr;
|
|
UCHAR netbiosName[NETBIOS_NAME_LENGTH + 1];
|
|
|
|
netbiosAddr = (PSOCKADDR_NB)Sockaddr;
|
|
|
|
dprintf(
|
|
"%s snb_family = %d (NetBIOS)\n",
|
|
Prefix,
|
|
netbiosAddr->snb_family
|
|
);
|
|
|
|
dprintf(
|
|
"%s snb_type = %04x (%s)\n",
|
|
Prefix,
|
|
netbiosAddr->snb_type,
|
|
NetbiosNameTypeToString( netbiosAddr->snb_type )
|
|
);
|
|
|
|
RtlCopyMemory(
|
|
netbiosName,
|
|
netbiosAddr->snb_name,
|
|
NETBIOS_NAME_LENGTH
|
|
);
|
|
|
|
netbiosName[NETBIOS_NAME_LENGTH] = '\0';
|
|
|
|
dprintf(
|
|
"%s snb_name = %s\n",
|
|
Prefix,
|
|
netbiosName
|
|
);
|
|
|
|
}
|
|
break;
|
|
|
|
default :
|
|
dprintf(
|
|
"%s Unsupported address family %d\n",
|
|
Prefix,
|
|
Sockaddr->sa_family
|
|
);
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
} // DumpSockaddr
|
|
|
|
|
|
//
|
|
// Private functions.
|
|
//
|
|
|
|
PSTR
|
|
SocketStateToString(
|
|
SOCKET_STATE State
|
|
)
|
|
{
|
|
|
|
static CHAR invalidString[32];
|
|
|
|
if( State >= SocketStateOpen &&
|
|
State <= SocketStateClosing ) {
|
|
|
|
return SocketStates[State];
|
|
|
|
}
|
|
|
|
sprintf(
|
|
invalidString,
|
|
"INVALID STATE %d",
|
|
State
|
|
);
|
|
|
|
return invalidString;
|
|
|
|
} // SocketStateToString
|
|
|
|
PSTR
|
|
NetbiosNameTypeToString(
|
|
USHORT NetbiosNameType
|
|
)
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Maps a NetBIOS name type to a displayable string.
|
|
|
|
Arguments:
|
|
|
|
NetbiosNameType - The NetBIOS name type to map.
|
|
|
|
Return Value:
|
|
|
|
PSTR - Points to the displayable form of the NetBIOS name type.
|
|
|
|
--*/
|
|
|
|
{
|
|
|
|
static CHAR invalidString[32];
|
|
|
|
switch( NetbiosNameType ) {
|
|
|
|
case NETBIOS_UNIQUE_NAME :
|
|
|
|
return "Unique";
|
|
|
|
case NETBIOS_GROUP_NAME :
|
|
|
|
return "Group";
|
|
|
|
case NETBIOS_TYPE_QUICK_UNIQUE :
|
|
|
|
return "Quick Unique";
|
|
|
|
case NETBIOS_TYPE_QUICK_GROUP :
|
|
|
|
return "Quick Group";
|
|
|
|
}
|
|
|
|
sprintf(
|
|
invalidString,
|
|
"INVALID TYPE %u\n",
|
|
NetbiosNameType
|
|
);
|
|
|
|
return invalidString;
|
|
|
|
} // NetbiosNameTypeToString
|
|
|
|
|
|
|
|
PSTR
|
|
GroupTypeToString(
|
|
AFD_GROUP_TYPE GroupType
|
|
)
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Maps an AFD_GROUP_TYPE to a displayable string.
|
|
|
|
Arguments:
|
|
|
|
GroupType - The AFD_GROUP_TYPE to map.
|
|
|
|
Return Value:
|
|
|
|
PSTR - Points to the displayable form of the AFD_GROUP_TYPE.
|
|
|
|
--*/
|
|
|
|
{
|
|
|
|
static CHAR invalidString[32];
|
|
|
|
switch( GroupType ) {
|
|
|
|
case GroupTypeNeither :
|
|
return "Neither";
|
|
|
|
case GroupTypeConstrained :
|
|
return "Constrained";
|
|
|
|
case GroupTypeUnconstrained :
|
|
return "Unconstrained";
|
|
|
|
}
|
|
|
|
sprintf(
|
|
invalidString,
|
|
"INVALID TYPE %d\n",
|
|
GroupType
|
|
);
|
|
|
|
return invalidString;
|
|
|
|
} // GroupTypeToString
|
|
|