Windows NT 4.0 source code leak
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.
 
 
 
 
 
 

404 lines
7.9 KiB

/*++
Module Name:
common.h
Abstract:
Author:
Mazhar Mohammed (mazharm) 15-Jun-1995
Revision History:
--*/
#ifndef _COMMON_H_
#define _COMMON_H_
#include <stdlib.h>
#include "sysinc.h"
#include "rpc.h"
#include "rpcerrp.h"
#include "rpcdcep.h"
#include "rpctran.h"
#include <winsock.h>
#ifdef NTENV
#include "wsnetbs.h" /* netbios specific */
#endif // NTENV
#include <wsipx.h> /* SPX specific */
#include <wsnwlink.h>
#include <nspapi.h>
#ifdef NTENV
#include <atalkwsh.h> /* MAC specific */
#endif // NTENV
#define STATIC static
//
//
// Debugging code...
//
//
#if DBG
#define OPTIONAL_STATIC
#else
#define OPTIONAL_STATIC static
#endif
#define ENDPOINT_LEN 6
#define SYNC_FLAGS 0
#define ENDIAN_MASK 16
#if DBG
#define INITIAL_MASK_SIZE 1
#define INITIAL_MAPSIZE 1
#else
#define INITIAL_MASK_SIZE 128
#define INITIAL_MAPSIZE 128
#endif
#define TCP_ADDRESS_FAMILY AF_INET
#define TCP_PROTOCOL 0
#define LOOPBACK htonl(INADDR_LOOPBACK)
#define RECV_TIMEOUT 721334L
#define RECV_ANY_TIMEOUT_TCPSPX 31349
#define RECV_ANY_TIMEOUT 721334
//
// Data Structures
//
//
//
typedef struct
{
int ProtocolId ;
SOCKET Sock;
void * Conn;
void * pAddress ;
} SOCKMAP, *PSOCKMAP;
//
// In order to listen to any number of sockets we need our own version
// of fd_set and FD_SET(). These are call fd_big_set.
//
typedef struct fd_big_set {
u_int fd_count; /* how many are SET? */
SOCKET fd_array[0]; /* an array of SOCKETs */
} fd_big_set;
typedef struct
{
unsigned char rpc_vers;
unsigned char rpc_vers_minor;
unsigned char PTYPE;
unsigned char pfc_flags;
unsigned char drep[4];
unsigned short frag_length;
unsigned short auth_length;
unsigned long call_id;
} message_header;
typedef struct
{
unsigned MaxEntries ;
unsigned LastEntry ;
unsigned StartEntry ;
} MAPINFO ;
typedef struct
{
int NumConnections;
// Synchronization stuff
SOCKET SyncListenSock ; // Synchronization Listening Socket
SOCKET SyncSock; // Synchronization Data Socket
SOCKET SyncClient ; // Client side socket used for synchronization
int SyncPort ; // Port that SyncListenSock is listening on
int SyncSockType ;
// Address and data masks and maps
unsigned int MaskSize;
fd_big_set *MasterMask;
fd_big_set *Mask;
PSOCKMAP DataSockMap;
PSOCKMAP ListenSockMap ;
MAPINFO DataMapInfo ;
MAPINFO ListenMapInfo ;
fd_big_set *PreviousMask ;
PSOCKMAP PreviousDataMap;
PSOCKMAP PreviousListenMap ;
// Misc stuff
int RecvDirectPossible ;
int ThreadListening ;
CRITICAL_SECTION TransCritSec;
} PRIMARYADDR, *PPRIMARYADDR;
#define INITIAL_SOCKET_LIST_SIZE 32
typedef struct
{
int ListenSockReady;
int ListenSockType ;
char Endpoint[ENDPOINT_LEN+1];
int iOpen ; /* index for the opensocket */
SOCKET *ListenSock; /* keep track of open sockets on this address*/
int MaxListenSock ;
} ADDRESS, *PADDRESS;
typedef struct
{
SOCKET ConnSock;
int ConnSockClosed;
PADDRESS Address;
unsigned int ReceiveDirectFlag;
void * CoalescedBuffer;
unsigned int CoalescedBufferLength;
int ProtocolId ;
int old_client;
int seq_num;
} SCONNECTION, *PSCONNECTION;
// common macros
//
// This code is stolen from winsock.h. It does the same thing as FD_SET()
// except that it assumes the fd_array is large enough. AddConnection()
// grows the Masks as needed, so this better always be true.
//
#define FD_BIG_SET(fd, address) do { \
ASSERT((address).MaskSize > (address).MasterMask->fd_count); \
(address).MasterMask->fd_array[(address).MasterMask->fd_count++]=(fd);\
} while(0)
unsigned
FindSockWithDataReady (
BOOL bListenMap
);
// common functions
InitializePrimaryAddress() ;
RPC_STATUS
GrowMap(
BOOL bIsListenMap
);
RPC_STATUS
GrowMask(
);
RPC_STATUS
AddSyncSocket(
SOCKET socket
);
RPC_STATUS
AddListenSocket(
PADDRESS Address,
SOCKET socket,
int ProtocolId
);
RPC_STATUS
InsertDataSocket(
PADDRESS Address,
BOOL bListenMap,
SOCKET Socket,
PSCONNECTION pConn,
int ProtocolId
);
RPC_STATUS ConnectToSyncSocket() ;
RPC_STATUS PokeSyncSocket() ;
RPC_STATUS MaybePokeSyncSocket() ;
RPC_STATUS RPC_ENTRY
TimeoutHandler(
IN PSCONNECTION SConnection
) ;
#ifdef NTENV
RPC_STATUS RPC_ENTRY
ADSP_ServerReceive (
IN PSCONNECTION SConnection,
IN void * * Buffer,
IN unsigned int * BufferLength
) ;
#endif
RPC_STATUS RPC_ENTRY
NB_ServerReceive (
IN PSCONNECTION SConnection,
IN void * * Buffer,
IN unsigned int * BufferLength
) ;
RPC_STATUS RPC_ENTRY
COMMON_ServerReceiveAny (
IN PADDRESS Address,
OUT PSCONNECTION * pSConnection,
OUT void PAPI * PAPI * Buffer,
OUT unsigned int PAPI * BufferLength,
IN long Timeout
) ;
RPC_STATUS RPC_ENTRY
COMMON_ServerReceive (
IN PSCONNECTION SConnection,
IN void * * Buffer,
IN unsigned int * BufferLength
) ;
RPC_STATUS
DG_ServerReceive(
IN void __RPC_FAR * SConnection,
IN OUT void PAPI * PAPI * Buffer,
IN OUT unsigned int PAPI * BufferLength
);
RPC_STATUS
DeleteDataSocket(
SOCKET Socket) ;
RPC_STATUS
DeleteListenSocket(
SOCKET Socket) ;
RPC_STATUS
ThreadListening(
IN PADDRESS Address
) ;
typedef RPC_SERVER_TRANSPORT_INFO * (*TRANSFUNC) () ;
typedef RPC_STATUS (* RECVFUNC) (
IN PSCONNECTION SConnection,
IN OUT void PAPI * PAPI * Buffer,
IN OUT unsigned int PAPI * BufferLength
) ;
typedef struct
{
RPC_CHAR * RpcProtocolSequence ;
TRANSFUNC TransFunc ;
int protocolId ;
RECVFUNC RecvFunc;
unsigned IsDatagram : 1;
} TRANSTAB ;
/* For some reason, getsockname wants to return more then sizeof(SOCKADDR_IPX)
bytes. bugbug. */
typedef union SOCKADDR_FIX
{
SOCKADDR_IPX s;
struct sockaddr unused;
} SOCKADDR_FIX;
typedef struct
{
char *ProtoSeq; // protocol sequence of entry
unsigned char Lana; // lana_num in NCB for this protocol
unsigned char SelfName; // trailing byte of client's NetBIOS name
#ifdef NTENV
unsigned char ResetDone; // flag to indicate if Reset has been done
#endif
} PROTOCOL_MAP, *PPROTOCOL_MAP;
RPC_STATUS
MapProtocol(
IN RPC_CHAR *ProtoSeq,
IN int DriverNumber,
OUT PPROTOCOL_MAP *ProtocolEntry
);
void
InitialNtRegistry( );
RPC_STATUS ConnectToSyncSocket() ;
RPC_STATUS TCP_ConnectToSyncSocket() ;
RPC_STATUS NB_ConnectToSyncSocket() ;
RPC_STATUS SPX_ConnectToSyncSocket() ;
RPC_STATUS RPC_ENTRY
CONN_StartListening(
IN PADDRESS Address
) ;
#if 0
extern RPC_SERVER_TRANSPORT_INFO * NP_TransportLoad(INT protocolId) ;
#endif
extern RPC_SERVER_TRANSPORT_INFO * TCP_TransportLoad(INT protocolId) ;
#ifdef NTENV
extern RPC_SERVER_TRANSPORT_INFO * ADSP_TransportLoad(INT protocolId) ;
#endif
extern RPC_SERVER_TRANSPORT_INFO * UDP_TransportLoad(INT protocolId) ;
extern RPC_SERVER_TRANSPORT_INFO * IPX_TransportLoad(INT protocolId) ;
extern RPC_SERVER_TRANSPORT_INFO * SPX_TransportLoad(INT protocolId) ;
extern RPC_SERVER_TRANSPORT_INFO * NB_TransportLoad(INT protocolId) ;
BOOL NB_CreateSyncSocket(int protocolId) ;
BOOL TCP_CreateSyncSocket() ;
BOOL SPX_CreateSyncSocket() ;
//
// Protects socket masks and maps.
//
extern PRIMARYADDR PrimaryAddress ;
extern TRANSTAB TransportTab[];
extern int initialized ;
//
// list of protocols
//
enum
{
NCACN_IP_TCP,
NCACN_SPX,
#ifdef NTENV
NCACN_ADSP,
NCACN_NB_NB,
NCACN_NB_TCP,
NCACN_NB_IPX,
#endif
#if defined (NTENV) || defined (WIN96)
NCADG_IP_UDP,
NCADG_IPX,
#endif
NCA_MAX_PROTOCOL_VALUE_PLUS_ONE
};
#define AddListenSocket(_Address,_socket,_ProtocolId) \
InsertDataSocket((_Address), TRUE, (_socket), NULL, (_ProtocolId))
#endif