Windows2003-3790/termsrv/rdpwsx/mcsmux/mcsmux.h
2020-09-30 16:53:55 +02:00

146 lines
3.7 KiB
C

/* (C) 1997 Microsoft Corp.
*
* file : MCSMUX.h
* author : Erik Mavrinac
*
* description: MCSMUX API types and definitions.
*/
#include "MCS.h"
#include "MCSIoctl.h"
#include "Trace.h"
#include "slist.h"
#include "tshrutil.h"
/*
* Defines
*/
// Memory alloc and copy functions.
#define Malloc(size) TSHeapAlloc(HEAP_ZERO_MEMORY, size, TS_HTAG_MCSMUX_ALL)
#define Free(ptr) TSHeapFree(ptr)
#define MemCpy(dest, src, len) memcpy((dest), (src), (len))
// Code common to all entry points except MCSInitialized(), we don't want it
// around in retail builds.
#if DBG
#define CheckInitialized(funcname) \
if (!g_bInitialized) { \
ErrOut(funcname " called when MCS not initialized"); \
return MCS_NOT_INITIALIZED; \
}
#else
#define CheckInitialized(funcname)
#endif
// Must be as large as the largest MCS node controller indication/confirm
// size sent up from PDMCS.
//TODO FUTURE: Will need to change if we support SendData indications to user
// mode.
#define DefaultInputBufSize sizeof(ConnectProviderIndicationIoctl)
/*
* Types
*/
// Forward reference.
typedef struct _Domain Domain;
typedef struct {
Domain *pDomain;
ConnectionHandle hConnKernel;
} Connection;
typedef enum
{
Dom_Unconnected, // Initial state.
Dom_Connected, // Up-and-running state.
Dom_PendingCPResponse, // Waiting for ConnectProvResponse.
Dom_Rejected, // Rejected during ConnectProvInd.
} DomainState;
typedef struct _Domain
{
LONG RefCount;
// Locks access to this struct.
CRITICAL_SECTION csLock;
#if MCS_Future
// Selector. This is determined by MCSMUX to be unique across the system.
// Not currently exported to node controller, may be in the future.
unsigned SelLen;
unsigned char Sel[MaxDomainSelectorLength];
#endif
// ICA-related bindings.
HANDLE hIca;
HANDLE hIcaStack;
HANDLE hIcaT120Channel;
void *NCUserDefined;
// Domain-specific information.
unsigned bDeleteDomainCalled :1;
unsigned bPortDisconnected :1;
DomainState State;
DomainParameters DomParams;
// IoPort required member.
OVERLAPPED Overlapped;
// TODO FUTURE: This is for a hack for single-connection system,
// get rid of it by implementing Connection objects.
HANDLE hConn;
//TODO FUTURE: Connection objects will need to be separate allocations
// for future systems with more than one connection.
Connection MainConn;
// Domain IOPort receive buffer.
BYTE InputBuf[DefaultInputBufSize];
} Domain;
typedef enum {
User_Attached,
User_AttachConfirmPending,
} UserState;
typedef struct {
MCSUserCallback Callback;
MCSSendDataCallback SDCallback;
void *UserDefined;
UserState State;
UserHandle hUserKernel; // Returned from kernel mode.
UserID UserID; // Returned from kernel mode.
Domain *pDomain;
SList JoinedChannelList;
unsigned MaxSendSize;
} UserInformation;
// Contains little info, this is used as a guard against bluescreens --
// if bad hChannel is presented a user-mode fault will occur.
typedef struct
{
ChannelHandle hChannelKernel;
ChannelID ChannelID;
} MCSChannel;
/*
* Globals
*/
extern BOOL g_bInitialized; // Overall DLL initialization status.
extern CRITICAL_SECTION g_csGlobalListLock;
extern SList g_DomainList; // List of active domains.
extern SList g_hUserList; // Maps hUsers to domains.
extern SList g_hConnList; // Maps hConnections to domains.