📄 srvstruc.h
字号:
//
// Structure related defines
//
#define SRV_SERVBSIZE(a) \
((WORD)(a->srvio.packetsize) > (WORD)0 \
? (WORD)(a->srvio.packetsize) \
: (WORD)512)
#define SRV_DEFAULT_SERVBSIZE 512
#define MAX_NETLIBS 16 // Maximum server side net-libs
#define SRV_SERVNETFUNCS 11
#ifdef BRIDGE
#define SRV_CLIENTNETFUNCS 12
#endif
typedef long (CDECL *LGFARPROC)();
typedef struct srv_handler {
struct srv_handler * previous;
struct srv_handler * next;
struct srv_handler * last;
int (* handler)(void *);
} SRV_HANDLER;
typedef struct srv_pevents {
SRV_HANDLER * srv_attention;
SRV_HANDLER * srv_connect;
SRV_HANDLER * srv_disconnect;
SRV_HANDLER * srv_rpc;
SRV_HANDLER * srv_language;
SRV_HANDLER * srv_start;
SRV_HANDLER * srv_stop;
SRV_HANDLER * srv_sleep;
SRV_HANDLER * srv_restart;
SRV_HANDLER * srv_transmgr;
SRV_HANDLER * srv_oledb;
} SRV_PEVENTS;
typedef struct srv_events {
int (*srv_hndl_attention)(void *); // ( SRV_PROC * )
int (*srv_hndl_connect)(void *); // ( SRV_PROC * )
int (*srv_hndl_disconnect)(void *); // ( SRV_PROC * )
int (*srv_hndl_restart)(void *); // ( SRV_SERVER * )
int (*srv_hndl_rpc)(void *); // ( SRV_PROC * )
int (*srv_hndl_sleep)(void *); // ( SRV_SERVER * )
int (*srv_hndl_language)(void *); // ( SRV_PROC * )
int (*srv_hndl_start)(void *); // ( SRV_SERVER * )
int (*srv_hndl_stop)(void *); // ( SRV_SERVER * )
int (*srv_hndl_attention_ack)(void *); // ( SRV_PROC * )
int (*srv_hndl_transmgr)(void *); // ( SRV_PROC * )
int (*srv_hndl_insertexec)(void *); // ( SRV_PROC * )
int (*srv_hndl_oledb)(void *); // ( SRV_PROC * )
} SRV_EVENTS;
typedef struct srv_subchannel {
struct srv_proc * srvproc;
HANDLE threadHDL;
THREAD threadID;
HANDLE ss_handle;
HANDLE cs_handle;
HANDLE hEvent;
BOOL status;
struct srv_proc * site_srvproc;
DWORD index;
struct srv_proc ** master_list;
} SRV_SUBCHANNEL;
//
// define structures
//
typedef struct translation_info
{
BOOL flag; // data translation flag
void (*int2)(short*); // 2-byte integer swap function
void (*int4)(long*); // 4-byte integer swap function
void (*recvflt)(float*); // receive 8-byte float translation function
void (*sendflt)(float*); // send 8-byte float translation function
void (*recvflt4)(float*); // receive 4-byte float translation function
void (*sendflt4)(float*); // send 4-byte float translation function
void (*recvchar)(char *, int); // ASCII translation function
void (*sendchar)(char *, int); // ASCII translation function
void (*twoint4)(char *); // 2 4-byte integer swap function
void (*twoint2)(char *); // 2 2-byte interger swap function
} TRANSLATION_INFO;
typedef struct srv_params
{
struct srv_server * server;
struct srv_proc * srvproc;
struct srv_queuehead * queuehead;
struct srv_comport * comport;
THREAD threadID;
HANDLE threadHDL;
} SRV_PARAMS;
#if defined( _MSSQLRISC_)
#pragma pack(2)
#endif
// SRV_LOGIN
// The (TDS 4.0) login record received from the server client at login time.
//
typedef struct srv_loginrec {
BYTE lhostname[SRV_MAXNAME]; // name of host or generic
BYTE lhostnlen; // length of lhostname
BYTE lusername[SRV_MAXNAME]; // name of user
BYTE lusernlen; // length of lusername
BYTE lpw[SRV_MAXNAME]; // password (plaintext)
BYTE lpwnlen; // length of lpw
BYTE lhostproc[SRV_HOSTIDLEN]; // host process identification
BYTE lunused[SRV_MAXNAME-SRV_HOSTIDLEN - 6]; // unused
BYTE lapptype [6]; // Application specific.
BYTE lhplen; // length of host process id
BYTE lint2; // type of int2 on this host
BYTE lint4; // type of int4 on this host
BYTE lchar; // type of char
BYTE lflt; // type of float
BYTE ldate; // type of datetime
BYTE lusedb; // notify on exec of use db cmd
BYTE ldmpld; // disallow use of dump/load and bulk insert
BYTE linterface; // SQL interface type
BYTE ltype; // type of network connection
BYTE spare[7]; // NOTE: Apparently used by System-10
BYTE lappname[SRV_MAXNAME]; // application name
BYTE lappnlen; // length of appl name
BYTE lservname[SRV_MAXNAME]; // name of server
BYTE lservnlen; // length of lservname
BYTE lrempw[0xff]; // passwords for remote servers
BYTE lrempwlen; // length of lrempw
BYTE ltds[4]; // tds version
BYTE lprogname[DBPROGNLEN]; // client program name
BYTE lprognlen; // length of client program name
BYTE lprogvers[4]; // client program version
BYTE lnoshort; // NEW: auto convert of short datatypes
BYTE lflt4; // NEW: type of flt4 on this host
BYTE ldate4; // NEW: type of date4 on this host
BYTE llanguage[SRV_MAXNAME]; // NEW: initial language
BYTE llanglen; // NEW: length of language
BYTE lsetlang; // NEW: notify on language change
short slhier; // NEW: security label hierarchy
BYTE slcomp[8]; // NEW: security components
short slspare; // NEW: security label spare
BYTE slrole; // NEW: security login role
BYTE lcharset[SRV_MAXNAME]; // character set name (unused)
BYTE lcharsetlen; // length of character set (unused)
BYTE lsetcharset; // notify on character set change (unused)
BYTE lpacketsize[SRV_PKTLEN]; // length of TDS packets
BYTE lpacketsizelen; // length of lpacketsize
BYTE ldummy[3]; // NEW: pad to longword
} SRV_LOGINREC;
//
// SRV_LOGIN_OLDTDS
// The login record received from "old" TDS 2.0 or 3.4 server clients.
// The format is basically the same as 4.0, it is just shorter (no server
// name or password, etc appended at the end).
//
typedef struct srv_login_oldtds {
BYTE lhostname[SRV_MAXNAME]; // name of host or generic
BYTE lhostnlen; // length of lhostname
BYTE lusername[SRV_MAXNAME]; // name of user
BYTE lusernlen; // length of lusername
BYTE lpw[SRV_MAXNAME]; // password (plaintext)
BYTE lpwnlen; // length of lpw
BYTE lhostproc[SRV_MAXNAME]; // host process identification
BYTE lhplen; // length of host process id
BYTE lint2; // type of int2 on this host
BYTE lint4; // type of int4 on this host
BYTE lchar; // type of char
BYTE lflt; // type of float
BYTE ldate; // type of datetime
BYTE lusedb; // notify on exec of use db cmd
BYTE ldmpld; // disallow use of dump/load and bulk insert
BYTE linterface; // SQL interface type
BYTE spare[8]; // spare fields
BYTE lappname[SRV_MAXNAME]; // application name
BYTE lappnlen; // length of appl name
BYTE ldummy; // pad length to even boundary
} SRV_LOGIN_OLDTDS;
#if defined( _MSSQLRISC_)
#pragma pack()
#endif
// Define structure for ODS statistics
typedef struct srv_stats {
int NumReads;
int NumWrites;
} SRV_STATS;
// Define list elements used in queuing
// network request.
typedef struct srv_queuehead {
struct srv_queuehead * Flink;
struct srv_queuehead * Blink;
struct srv_listhead * ListHead;
} SRV_QUEUEHEAD, *PSRV_QUEUEHEAD;
typedef struct srv_listhead {
struct srv_listentry * Flink;
struct srv_listentry * Blink;
int NumListEntries;
int NumReadRequest;
int MaxQueueLength;
long ListLock;
HANDLE ListEvent;
} SRV_LISTHEAD, *PSRV_LISTHEAD;
typedef struct srv_listentry {
struct srv_listentry * Flink;
struct srv_listentry * Blink;
struct srv_proc * pSrvProc;
} SRV_LISTENTRY, *PSRV_LISTENTRY;
// Define routines to manage list entries.
//
// VOID
// InitializeListHead(
// PSRV_LISTENTRY ListHead
// );
//
#define InitializeListHead(TYPE, ListHead) (\
(ListHead)->Flink = (ListHead)->Blink = (TYPE)(ListHead))
//
// BOOLEAN
// IsListEmpty(
// PSRV_LISTENTRY ListHead
// );
//
#define IsListEmpty(ListHead) (\
( ((ListHead)->Flink == (ListHead)) ? TRUE : FALSE ) )
//
// SRV_LISTENTRY
// RemoveHeadList(
// TYPE,
// TYPE ListHead
// );
//
#define RemoveHeadList(TYPE,ListHead) \
(TYPE)(ListHead)->Flink;\
{\
TYPE FirstEntry;\
FirstEntry = (ListHead)->Flink;\
FirstEntry->Flink->Blink = (TYPE)(ListHead);\
(ListHead)->Flink = FirstEntry->Flink;\
}
//
// VOID
// RemoveEntryList(
// PSRV_LISTENTRY Entry
// );
//
#define RemoveEntryList(Entry) {\
PSRV_LISTENTRY _EX_Entry;\
_EX_Entry = (Entry);\
_EX_Entry->Blink->Flink = _EX_Entry->Flink;\
_EX_Entry->Flink->Blink = _EX_Entry->Blink;\
}
//
// VOID
// InsertTailList(
// PSRV_LISTHEAD ListHead,
// PSRV_LISTENTRY Entry
// );
//
#define InsertTailList(ListHead,Entry) \
(Entry)->Flink = (ListHead);\
(Entry)->Blink = (ListHead)->Blink;\
(ListHead)->Blink->Flink = (Entry);\
(ListHead)->Blink = (Entry);\
InterlockedIncrement(&(ListHead)->NumListEntries);
//
// VOID
// InsertHeadList(
// PSRV_LISTHEAD ListHead,
// PSRV_LISTENTRY Entry
// );
//
#define InsertHeadList(ListHead,Entry) \
(Entry)->Flink = (ListHead)->Flink;\
(Entry)->Blink = (ListHead);\
(ListHead)->Flink->Blink = (Entry);\
(ListHead)->Flink = (Entry);\
InterlockedIncrement(&(ListHead)->NumListEntries);
//
// VOID
// InsertHeadQueue(
// PSRV_QUEUEHEAD ListHead,
// PSRV_QUEUEHEAD Entry
// );
//
#define InsertHeadQueue(ListHead,Entry) \
(Entry)->Flink = (ListHead)->Flink;\
(Entry)->Blink = (ListHead);\
(ListHead)->Flink->Blink = (Entry);\
(ListHead)->Flink = (Entry);
//
// VOID
// InsertTailQueue(
// PSRV_QUEUEHEAD ListHead,
// PSRV_QUEUEHEAD Entry
// );
//
#define InsertTailQueue(ListHead,Entry) \
(Entry)->Flink = (ListHead);\
(Entry)->Blink = (ListHead)->Blink;\
(ListHead)->Blink->Flink = (Entry);\
(ListHead)->Blink = (Entry);
//
// VOID
// RemoveEntryQueue(
// PSRV_QUEUEHEAD Entry
// );
//
#define RemoveEntryQueue(Entry) {\
PSRV_QUEUEHEAD _EX_Entry;\
_EX_Entry = (Entry);\
_EX_Entry->Blink->Flink = _EX_Entry->Flink;\
_EX_Entry->Flink->Blink = _EX_Entry->Blink;\
}
// Configuration structure.
typedef struct srv_config {
unsigned connections; // maximum allowed client connections
unsigned stacksize; // stack size of new threads created
BOOL log_file_open; // flag indicating log file open
HANDLE log_handle; // handle of openned log file
char log_file_name[SRV_MAXFILENAME]; // name of log file
BOOL print_recv; // dump reads to screen
BOOL print_send; // dump sends to screen
BOOL remote_access; // flag indicating remote server access
unsigned max_remote_sites; // simultaneous remote sites accessing
unsigned max_remote_connections; // maximum allowed in/out remote connections
WORD numConnectsPerThread; // Number of connections to monitor per network thread
WORD MaxWorkingThreads; // Max number of working threads
WORD MinWorkingThreads; // Min Number of working threads
WORD ConcurrentThreads; // Min Number of working threads
DWORD WorkingThreadTimeout; // Time to wait before exiting when idle
unsigned max_packets; // maximum number of network packets buffered
//
// Multi Server Side Net-Library support
//
WORD numNetLibs;
WORD spare;
LGFARPROC SSNetLibs[MAX_NETLIBS][SRV_SERVNETFUNCS]; // NetLib Function ptrs
HANDLE SSModules[MAX_NETLIBS]; // NetLib Module handles
char connect_names[MAX_NETLIBS][SRV_MAXFILENAME]; // NetLib connection names
char connect_dlls[MAX_NETLIBS][SRV_MAXFILENAME]; // NetLib names
char connect_versions[MAX_NETLIBS][SRV_MAXFILENAME]; // NetLib versions
char server_name[SRV_MAXFILENAME]; // Server name
BOOL local_only; // flag indicating local access only
BOOL unpack_rpc; // flag indicating if RPCs should be unpacked
unsigned max_packetsize; // maximum network packet size
unsigned dflt_packetsize; // The default packet size.
int ThreadPriority; // Priority of thread in class.
BOOL ansi; // flag indicating if ANSI codepage is used
BYTE tdsversion[4];
BYTE progversion[4];
DWORD threadaffinity; // thread affinity option
#ifdef BRIDGE
HANDLE CSModule; // Client NetLib Module handle
LGFARPROC CSNetLib[SRV_CLIENTNETFUNCS]; // NetLib Function ptrs
char client_name[SRV_MAXFILENAME]; // Client side name
BOOL bAuditConnects; // flag indicating if connects should be logged
#endif
} SRV_CONFIG;
//
// SRV_TDSHDR
// The first 8 bytes of each network packet constitute the packet
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -