|
|
/*************************************************************************
* 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;
|