/****************************************************************************/ // sdapi.h // // TS protocol stack driver common definitions. // // Copyright (C) 1998-2000 Microsoft Corporation /****************************************************************************/ #ifndef __SDAPI_H #define __SDAPI_H /* * TRACE defines */ #if DBG #define TRACE(_arg) IcaStackTrace _arg #define TRACEBUF(_arg) IcaStackTraceBuffer _arg #else #define TRACE(_arg) #define TRACEBUF(_arg) #endif /* * Input buffer data structure */ typedef struct _INBUF { LIST_ENTRY Links; // Pointer to previous/next buffer PUCHAR pBuffer; // Pointer to current location in Buffer ULONG ByteCount; // Number of bytes in Buffer ULONG MaxByteCount; // Max size of Buffer PIRP pIrp; // pointer to Irp to use for I/O PMDL pMdl; // pointer to MDL to use for I/O PVOID pPrivate; // pointer to private data } INBUF, *PINBUF; /* * Outpuf Buffer data structure */ typedef struct _OUTBUF { /* * Non-inherited fields */ ULONG OutBufLength; // length of allocated memory for outbuf int PoolIndex; // Stores the buffer pool this buffer goes to. LIST_ENTRY Links; // pointer to previous/next outbuf PUCHAR pBuffer; // pointer within buffer memory ULONG ByteCount; // byte count pointed to by pBuffer ULONG MaxByteCount; // maximum byte count possible (static) PETHREAD ThreadId; // thread id which issued i/o reqst for this buf PIRP pIrp; // pointer to Irp to use for I/O PMDL pMdl; // pointer to MDL to use for I/O PVOID pPrivate; // pointer to private data /* * Inherited fields (when pd allocates new outbuf and copies the data) */ ULONG StartTime; // pdreli - transmit time (used to measure roundtrip) UCHAR Sequence; // pdreli - output sequence number UCHAR Fragment; // pdreli - outbuf fragment number ULONG fWait : 1; // pdreli - waits allowed on this outbuf ULONG fControl : 1; // pdreli - control buffer (ack/nak) ULONG fRetransmit : 1; // pdreli - buffer has been retransmited ULONG fCompress : 1; // pdcomp - buffer should be compressed // Other flags. ULONG fIrpCompleted : 1; // Used on completion to prevent canceling. } OUTBUF, * POUTBUF; /* * Typedefs for Stack Driver callup routines */ typedef NTSTATUS (*PSDBUFFERALLOC)( IN PVOID pContext, IN BOOLEAN bWait, IN BOOLEAN bControl, ULONG ByteCount, PVOID pBufferOrig, PVOID *pBuffer); typedef VOID (*PSDBUFFERFREE)(IN PVOID pContext, PVOID pBuffer); typedef NTSTATUS (*PSDRAWINPUT)( IN PVOID pContext, IN PINBUF pInBuf OPTIONAL, IN PUCHAR pBuffer OPTIONAL, IN ULONG ByteCount); typedef NTSTATUS (*PSDCHANNELINPUT)( IN PVOID pContext, IN CHANNELCLASS ChannelClass, IN VIRTUALCHANNELCLASS VirtualClass, IN PINBUF pInBuf OPTIONAL, IN PUCHAR pBuffer OPTIONAL, IN ULONG ByteCount); /* * Stack Driver callup table */ typedef struct _SDCALLUP { PSDBUFFERALLOC pSdBufferAlloc; PSDBUFFERFREE pSdBufferFree; PSDBUFFERFREE pSdBufferError; PSDRAWINPUT pSdRawInput; PSDCHANNELINPUT pSdChannelInput; } SDCALLUP, *PSDCALLUP; /* * Stack Driver Context structure * This is filled in by the SD at load time, and is passed * as an argument to most ICA driver helper routines. */ typedef struct _SDCONTEXT { PVOID pProcedures; // Pointer to proc table for this driver PSDCALLUP pCallup; // Pointer to callup table for this driver PVOID pContext; // Context value passed on calls to driver } SDCONTEXT, *PSDCONTEXT; /* * Stack Driver Load/Unload procedure prototype */ typedef NTSTATUS (_stdcall *PSDLOADPROC)( IN OUT PSDCONTEXT pSdContext, IN BOOLEAN bLoad); /* * Stack Driver procedure prototype */ typedef NTSTATUS (_stdcall *PSDPROCEDURE)( IN PVOID pContext, IN PVOID pParms); /*============================================================================= == Stack Driver interface =============================================================================*/ /* * Stack Driver (WD/PD/TD) APIs */ #define SD$OPEN 0 #define SD$CLOSE 1 #define SD$RAWWRITE 2 #define SD$CHANNELWRITE 3 #define SD$SYNCWRITE 4 #define SD$IOCTL 5 #define SD$COUNT 6 /* * SdOpen structure */ typedef struct _SD_OPEN { STACKCLASS StackClass; // IN: stack type PPROTOCOLSTATUS pStatus; // IN: PCLIENTMODULES pClient; // IN: WDCONFIG WdConfig; // IN: WD configuration data PDCONFIG PdConfig; // IN: PD configuration data char OEMId[4]; // IN: WinFrame Server OEM Id from registry WINSTATIONNAME WinStationRegName; // IN: WinStation registry name PDEVICE_OBJECT DeviceObject; // IN: pointer to device object to use with the unload safe completion routine ULONG OutBufHeader; // IN: number of header bytes to reserve ULONG OutBufTrailer; // IN: number of trailer bytes to reserve ULONG SdOutBufHeader; // OUT: returned by sd ULONG SdOutBufTrailer; // OUT: returned by sd } SD_OPEN, *PSD_OPEN; /* * SdClose structure */ typedef struct _SD_CLOSE { ULONG SdOutBufHeader; // OUT: returned by sd ULONG SdOutBufTrailer; // OUT: returned by sd } SD_CLOSE, *PSD_CLOSE; /* * SdRawWrite structure */ typedef struct _SD_RAWWRITE { POUTBUF pOutBuf; PUCHAR pBuffer; ULONG ByteCount; } SD_RAWWRITE, *PSD_RAWWRITE; /* * SdChannelWrite fFlags Values */ #define SD_CHANNELWRITE_LOWPRIO 0x00000001 // Write can block behind // default priority writes. /* * SdChannelWrite structure * * The flags field is passed to termdd.sys via an IRP_MJ_WRITE * Irp, as a ULONG pointer in the Irp->Tail.Overlay.DriverContext[0] field. */ typedef struct _SD_CHANNELWRITE { CHANNELCLASS ChannelClass; VIRTUALCHANNELCLASS VirtualClass; BOOLEAN fScreenData; POUTBUF pOutBuf; PUCHAR pBuffer; ULONG ByteCount; ULONG fFlags; } SD_CHANNELWRITE, *PSD_CHANNELWRITE; /* * SdIoctl structure */ typedef struct _SD_IOCTL { ULONG IoControlCode; // IN PVOID InputBuffer; // IN OPTIONAL ULONG InputBufferLength; // IN PVOID OutputBuffer; // OUT OPTIONAL ULONG OutputBufferLength; // OUT ULONG BytesReturned; // OUT } SD_IOCTL, *PSD_IOCTL; /* * SdSyncWrite structure */ typedef struct _SD_SYNCWRITE { ULONG notused; } SD_SYNCWRITE, *PSD_SYNCWRITE; /*============================================================================= == Stack Drivers helper routines =============================================================================*/ #define ICALOCK_IO 0x00000001 #define ICALOCK_DRIVER 0x00000002 NTSTATUS IcaBufferAlloc(PSDCONTEXT, BOOLEAN, BOOLEAN, ULONG, PVOID, PVOID *); void IcaBufferFree(PSDCONTEXT, PVOID); void IcaBufferError(PSDCONTEXT, PVOID); unsigned IcaBufferGetUsableSpace(unsigned); NTSTATUS IcaRawInput(PSDCONTEXT, PINBUF, PUCHAR, ULONG); NTSTATUS IcaChannelInput(PSDCONTEXT, CHANNELCLASS, VIRTUALCHANNELCLASS, PINBUF, PUCHAR, ULONG); NTSTATUS IcaCreateThread(PSDCONTEXT, PVOID, PVOID, ULONG, PHANDLE); NTSTATUS IcaCallNextDriver(PSDCONTEXT, ULONG, PVOID); NTSTATUS IcaTimerCreate(PSDCONTEXT, PVOID *); BOOLEAN IcaTimerStart(PVOID, PVOID, PVOID, ULONG, ULONG); BOOLEAN IcaTimerCancel(PVOID); BOOLEAN IcaTimerClose(PVOID); NTSTATUS IcaQueueWorkItem(PSDCONTEXT, PVOID, PVOID, ULONG); NTSTATUS IcaSleep(PSDCONTEXT, ULONG); NTSTATUS IcaWaitForSingleObject(PSDCONTEXT, PVOID, LONG); NTSTATUS IcaFlowControlSleep(PSDCONTEXT, ULONG); NTSTATUS IcaFlowControlWait(PSDCONTEXT, PVOID, LONG); NTSTATUS IcaWaitForMultipleObjects(PSDCONTEXT, ULONG, PVOID [], WAIT_TYPE, LONG); NTSTATUS IcaLogError(PSDCONTEXT, NTSTATUS, LPWSTR *, ULONG, PVOID, ULONG); VOID _cdecl IcaStackTrace(PSDCONTEXT, ULONG, ULONG, CHAR *, ...); VOID IcaStackTraceBuffer(PSDCONTEXT, ULONG, ULONG, PVOID, ULONG); NTSTATUS IcaQueueWorkItemEx( IN PSDCONTEXT pContext, IN PVOID pFunc, IN PVOID pParam, IN ULONG LockFlags, IN PVOID pIcaWorkItem ); NTSTATUS IcaAllocateWorkItem( OUT PVOID *pParam ); NTSTATUS IcaCreateHandle( PVOID Context, ULONG ContextSize, PVOID *ppHandle ); NTSTATUS IcaReturnHandle( PVOID Handle, PVOID *ppContext, PULONG pContextSize ); NTSTATUS IcaCloseHandle( PVOID Handle, PVOID *ppContext, PULONG pContextSize ); PVOID IcaStackAllocatePoolWithTag( IN POOL_TYPE PoolType, IN SIZE_T NumberOfBytes, IN ULONG Tag ); PVOID IcaStackAllocatePool( IN POOL_TYPE PoolType, IN SIZE_T NumberOfBytes); void IcaStackFreePool(IN PVOID Pointer); ULONG IcaGetLowWaterMark(IN PSDCONTEXT pContext); ULONG IcaGetSizeForNoLowWaterMark(IN PSDCONTEXT pContext); #endif // __SDAPI_H