WindowsXP-SP1/termsrv/icaapi/icaapip.h

131 lines
3.9 KiB
C

/*************************************************************************
* ICAAPIP.H
*
* This module contains private ICA DLL defines and structures
*
* Copyright 1996, Citrix Systems Inc.
* Copyright (C) 1997-1999 Microsoft Corp.
*
* Author: Brad Pedersen (7/12/96)
*************************************************************************/
/*=============================================================================
== Defines
=============================================================================*/
#ifdef DBG
#define DBGPRINT(_arg) DbgPrint _arg
#else
#define DBGPRINT(_arg)
#endif
#if DBG
#undef TRACE
#undef TRACESTACK
#undef TRACECHANNEL
#define TRACE(_arg) IcaTrace _arg
#define TRACESTACK(_arg) IcaStackTrace _arg
#define TRACECHANNEL(_arg) IcaChannelTrace _arg
#else
#define TRACE(_arg)
#define TRACESTACK(_arg)
#define TRACECHANNEL(_arg)
#endif
#define ICA_SD_MODULE_EXTENTION L".SYS"
/*=============================================================================
== Typedefs
=============================================================================*/
typedef NTSTATUS (APIENTRY * PCDOPEN)( HANDLE, PPDCONFIG, PVOID * );
typedef NTSTATUS (APIENTRY * PCDCLOSE)( PVOID );
typedef NTSTATUS (APIENTRY * PCDIOCONTROL)( PVOID, ULONG, PVOID, ULONG, PVOID, ULONG, PULONG );
typedef NTSTATUS (APIENTRY * PSTACKIOCONTROLCALLBACK)( PVOID, PVOID, ULONG, PVOID, ULONG, PVOID, ULONG, PULONG );
/*=============================================================================
== Semaphores
=============================================================================*/
/*
* Citrical section macros
*/
#define INITLOCK( _sem, _status ) { \
_status = RtlInitializeCriticalSection( _sem ); \
TRACE((hIca,TC_ICAAPI,TT_SEM,"INITLOCK: "#_sem"\n")); \
}
#define DELETELOCK( _sem ) { \
RtlDeleteCriticalSection( _sem ); \
TRACESTACK((pStack,TC_ICAAPI,TT_SEM,"DELETELOCK: "#_sem"\n")); \
}
#define LOCK( _sem ) { \
ASSERTUNLOCK( _sem ); \
RtlEnterCriticalSection( _sem ); \
TRACESTACK((pStack,TC_ICAAPI,TT_SEM,"LOCK: "#_sem"\n")); \
}
#define UNLOCK( _sem ) { \
TRACESTACK((pStack,TC_ICAAPI,TT_SEM,"UNLOCK: "#_sem"\n")); \
ASSERTLOCK( _sem ); \
RtlLeaveCriticalSection( _sem ); \
}
#ifdef DBG
// (per JHavens) DWORD ThreadId is comparable to HANDLE OwningThread despite different sizes.
// Objects will still remain in <2GB address speace in Win64.
#define ASSERTLOCK(_sem) { ASSERT( LongToHandle(GetCurrentThreadId()) == (_sem)->OwningThread ); }
#define ASSERTUNLOCK(_sem) { ASSERT( LongToHandle(GetCurrentThreadId()) != (_sem)->OwningThread ); }
#else
#define ASSERTLOCK(_sem)
#define ASSERTUNLOCK(_sem)
#endif
/*=============================================================================
== Structures
=============================================================================*/
/*
* Stack data structure
*/
typedef struct _STACK {
/*
* Critical section protecting this structure and the
* connection driver
*/
CRITICAL_SECTION CritSec;
ULONG RefCount;
HANDLE hUnloadEvent;
HANDLE hCloseEvent;
/*
* ICA Device driver stack handle
*/
HANDLE hStack;
/*
* Data for Connection Driver
*/
HANDLE hCdDLL; // connection driver dll handle
PVOID pCdContext; // pointer to connection driver context
PCDOPEN pCdOpen; // pointer to connection driver open
PCDCLOSE pCdClose; // pointer to connection driver close
PCDIOCONTROL pCdIoControl; // pointer to connection driver IoControl
ULONG fStackLoaded: 1; // stack drivers are loaded
ULONG fUnloading: 1; // stack drivers are being unloaded
ULONG fClosing: 1; // stack is being closed
PSTACKIOCONTROLCALLBACK pStackIoControlCallback;
PVOID pCallbackContext;
} STACK, * PSTACK;