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.
192 lines
5.6 KiB
192 lines
5.6 KiB
//
|
|
//
|
|
// UTIL.C
|
|
//
|
|
// This file contains various utility procedures that are VxD specific. These
|
|
// are called by other VxD specific routines.
|
|
|
|
#include "nbtprocs.h"
|
|
|
|
NTSTATUS
|
|
ConvertToIntegerArray(
|
|
char *pszString,
|
|
UNALIGNED UCHAR *pArray,
|
|
int *piNumParts) ;
|
|
|
|
NTSTATUS
|
|
NbtCreateAddressObjects(
|
|
IN ULONG IPAddr,
|
|
IN ULONG IPMask,
|
|
OUT tDEVICECONTEXT *pDeviceContext);
|
|
|
|
char * strrchr( const char * pch, int c );
|
|
|
|
//******************* Pageable Routine Declarations ****************
|
|
#ifdef ALLOC_PRAGMA
|
|
#pragma CTEMakePageable(PAGE, NbtCreateAddressObjects)
|
|
#pragma CTEMakePageable(INIT, strrchr)
|
|
#endif
|
|
//******************* Pageable Routine Declarations ****************
|
|
|
|
#pragma BEGIN_INIT
|
|
|
|
/*******************************************************************
|
|
|
|
NAME: strrchr
|
|
|
|
SYNOPSIS: Vxd-land doesn't have a strrchr runtime function so
|
|
roll our own.
|
|
|
|
ENTRY: pch - Pointer to string to search
|
|
c - Character to search for
|
|
|
|
RETURNS: Found position or NULL
|
|
|
|
HISTORY:
|
|
Johnl 31-Aug-1993 Created
|
|
|
|
********************************************************************/
|
|
|
|
char * strrchr( const char * pch, int c )
|
|
{
|
|
char * pchFound = NULL ;
|
|
|
|
while ( *pch != '\0' )
|
|
{
|
|
if ( *pch == c )
|
|
pchFound = (char *)pch ;
|
|
|
|
//
|
|
// If double byte do this twice
|
|
//
|
|
pch++ ;
|
|
}
|
|
|
|
return pchFound ;
|
|
}
|
|
|
|
#pragma END_INIT
|
|
|
|
|
|
//----------------------------------------------------------------------------
|
|
NTSTATUS
|
|
NbtCreateAddressObjects(
|
|
IN ULONG IPAddr,
|
|
IN ULONG IPMask,
|
|
OUT tDEVICECONTEXT *pDeviceContext)
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
This routine gets the ip address and subnet mask out of the registry
|
|
to calcuate the broadcast address. It then creates the address objects
|
|
with the transport.
|
|
|
|
Arguments:
|
|
|
|
pucRegistryPath - path to NBT config info in registry
|
|
pucBindName - name of the service to bind to.
|
|
pDeviceContext - ptr to the device context... place to store IP addr
|
|
and Broadcast address permanently
|
|
|
|
Return Value:
|
|
|
|
none
|
|
|
|
--*/
|
|
|
|
{
|
|
NTSTATUS status ;
|
|
pDeviceContext->IpAddress = IPAddr ;
|
|
pDeviceContext->SubnetMask = IPMask ;
|
|
|
|
CTEPagedCode();
|
|
|
|
if ( NbtConfig.UseRegistryBcastAddr )
|
|
{
|
|
pDeviceContext->BroadcastAddress = NbtConfig.RegistryBcastAddr ;
|
|
}
|
|
else
|
|
{
|
|
pDeviceContext->BroadcastAddress = (IPMask & IPAddr) | (~IPMask & -1);
|
|
}
|
|
|
|
// now create the address objects.
|
|
|
|
// open the Ip Address for inbound Datagrams.
|
|
status = NbtTdiOpenAddress(
|
|
NULL, // &pDeviceContext->hDgram,
|
|
NULL, // &pDeviceContext->pDgramDeviceObject,
|
|
&pDeviceContext->pDgramFileObject,
|
|
pDeviceContext,
|
|
(USHORT)NBT_DATAGRAM_UDP_PORT,
|
|
IPAddr, //IP_ANY_ADDRESS,
|
|
0); // not a TCP port
|
|
|
|
if (NT_SUCCESS(status))
|
|
{
|
|
// open the Nameservice UDP port ..
|
|
status = NbtTdiOpenAddress(
|
|
NULL, //&pDeviceContext->hNameServer,
|
|
NULL, //&pDeviceContext->pNameServerDeviceObject,
|
|
&pDeviceContext->pNameServerFileObject,
|
|
pDeviceContext,
|
|
(USHORT)NBT_NAMESERVICE_UDP_PORT,
|
|
IPAddr,
|
|
0); // not a TCP port
|
|
|
|
if (NT_SUCCESS(status))
|
|
{
|
|
KdPrint(("Nbt: Open Session port %X\n",pDeviceContext));
|
|
// Open the TCP port for Session Services
|
|
status = NbtTdiOpenAddress(
|
|
NULL, //&pDeviceContext->hSession,
|
|
NULL, //&pDeviceContext->pSessionDeviceObject,
|
|
&pDeviceContext->pSessionFileObject,
|
|
pDeviceContext,
|
|
(USHORT)NBT_SESSION_TCP_PORT,
|
|
IPAddr,
|
|
TCP_FLAG | SESSION_FLAG); // TCP port
|
|
|
|
if (NT_SUCCESS(status))
|
|
{
|
|
//
|
|
// Open the broadcast address ("*\0\0...") for this device.
|
|
//
|
|
TDI_REQUEST tdiRequest ;
|
|
TDI_ADDRESS_NETBIOS tdiaddr ;
|
|
|
|
tdiaddr.NetbiosNameType = TDI_ADDRESS_NETBIOS_TYPE_QUICK_GROUP ;
|
|
CTEZeroMemory( tdiaddr.NetbiosName, NETBIOS_NAME_SIZE ) ;
|
|
tdiaddr.NetbiosName[0] = '*' ;
|
|
|
|
status = NbtOpenAddress( &tdiRequest,
|
|
&tdiaddr,
|
|
pDeviceContext->BroadcastAddress,
|
|
NULL, // Security descriptor
|
|
pDeviceContext,
|
|
NULL ) ;
|
|
if (NT_SUCCESS(status))
|
|
{
|
|
pDeviceContext->hBroadcastAddress = tdiRequest.Handle.AddressHandle ;
|
|
return(status);
|
|
}
|
|
|
|
DbgPrint("Unable to Open broadcast name\r\n");
|
|
ASSERT(0);
|
|
CloseAddress( (HANDLE) pDeviceContext->pSessionFileObject ) ;
|
|
}
|
|
|
|
KdPrint(("Unable to Open Session address with TDI, status = %X\n",status));
|
|
CloseAddress( (HANDLE) pDeviceContext->pNameServerFileObject ) ;
|
|
|
|
}
|
|
KdPrint(("Unable to Open NameServer port with TDI, status = %X\n",status));
|
|
CloseAddress( (HANDLE) pDeviceContext->pDgramFileObject ) ;
|
|
}
|
|
|
|
return(status);
|
|
}
|
|
|
|
|