/****************************************************************************/ // nwdwapi.h // // General RDPWD header. // // Copyright (C) 1997-2000 Microsoft Corporation /****************************************************************************/ #ifndef _H_NWDWAPI #define _H_NWDWAPI #include #include "license.h" #include #include #include #include #include /****************************************************************************/ /* Constants */ /****************************************************************************/ /****************************************************************************/ /* @@@MF Need to calculated real values for the following numbers */ /* Remeber that buffer size needs to allow for 32K of T.128 data ??plus hdr */ /* size. */ /****************************************************************************/ #define TSHARE_WD_BUFFER_COUNT 5 #define TSHARE_TD_BUFFER_SIZE (NET_MAX_SIZE_SEND_PKT + 1000) /****************************************************************************/ /* Macro for splitting the function from an IOCtl */ /****************************************************************************/ #define WDW_IOCTL_FUNCTION(ioctl) (((ioctl) >> 2) & 0xfff) /****************************************************************************/ /* Max decl def's */ /****************************************************************************/ #define WD_MAX_DOMAIN_LENGTH 48 #define WD_MAX_USERNAME_LENGTH 48 #define WD_MAX_PASSWORD_LENGTH 48 #define WD_MAX_SHADOW_BUFFER (8192 * 2) #define WD_MIN_COMPRESS_INPUT_BUF 50 #define WD_VC_DECOMPR_REASSEMBLY_BUF (CHANNEL_CHUNK_LENGTH*2) /****************************************************************************/ /* ID of the 'Thinwire' virtual channel */ /****************************************************************************/ #define WD_THINWIRE_CHANNEL 7 typedef struct tagMALLOC_HEADER MALLOC_HEADER, * PMALLOC_HEADER; typedef struct tagMALLOC_HEADER { PMALLOC_HEADER pNext; PMALLOC_HEADER pPrev; PVOID pCaller; UINT32 length; } MALLOC_HEADER, * PMALLOC_HEADER; typedef struct tagTSHARE_WD { /************************************************************************/ /* Returned from MCS initialization. Needed to attach a user to MCS. */ /* NOTE: This MUST be first in struct. MCS will assume so. */ /************************************************************************/ DomainHandle hDomainKernel; /************************************************************************/ /* Pointer back to the SDCONTEXT that is passed in on all calls. */ /************************************************************************/ PSDCONTEXT pContext; /************************************************************************/ /* Is this WD prepared to process data? */ /************************************************************************/ BOOLEAN dead; /************************************************************************/ /* Shadow data */ /************************************************************************/ BOOLEAN bInShadowShare; BYTE HotkeyVk; USHORT HotkeyModifiers; PSHADOW_INFO pShadowInfo; PSHADOWCERT pShadowCert; PCLIENTRANDOM pShadowRandom; PUSERDATAINFO pUserData; UINT32 shadowState; #define SHADOW_NONE 0 #define SHADOW_CLIENT 1 #define SHADOW_TARGET 2 /************************************************************************/ /* Pointer to protocol counters struct */ /************************************************************************/ PPROTOCOLSTATUS pProtocolStatus; /************************************************************************/ /* Display characteristics */ /************************************************************************/ unsigned desktopHeight; unsigned desktopWidth; unsigned desktopBpp; #ifdef DC_HICOLOR unsigned supportedBpps; // holds RNS_UD_xxBPP_SUPPORT OR'ed flags unsigned maxServerBpp; #endif /************************************************************************/ /* Timer to kick to talk to the DD */ /************************************************************************/ PKTIMER ritTimer; /************************************************************************/ /* Events to sleep on while waiting for */ /* - the connected indication */ /* - Share creation to complete. */ /* - security transaction tp complete. */ /************************************************************************/ PKEVENT pConnEvent; PKEVENT pCreateEvent; PKEVENT pSecEvent; PKEVENT pSessKeyEvent; PKEVENT pClientDisconnectEvent; // Associated error returns. NTSTATUS SessKeyCreationStatus; /************************************************************************/ /* Internal handles we need */ /************************************************************************/ PVOID dcShare; PVOID pSmInfo; PVOID pNMInfo; #ifdef USE_LICENSE PVOID pSLicenseHandle; #endif /************************************************************************/ /* Has the Share Class been initialized? */ /************************************************************************/ BOOLEAN shareClassInit; /************************************************************************/ /* Has the WD connected successfully to the Client? */ /************************************************************************/ BOOLEAN connected; /************************************************************************/ /* Was the Share created OK? */ /************************************************************************/ BOOLEAN shareCreated; /************************************************************************/ /* Other useful stuff from user data */ /************************************************************************/ HANDLE hDomain; UINT16 sas; UINT16 clientProductId; UINT32 version; ULONG kbdLayout; UINT32 clientBuild; WCHAR clientName[RNS_UD_CS_CLIENTNAME_LENGTH + 1]; ChannelID broadcastChannel; ULONG sessionId; ULONG serialNumber; ULONG clientAddressFamily; WCHAR clientAddress[CLIENTADDRESS_LENGTH + 2]; WCHAR clientDir[DIRECTORY_LENGTH]; RDP_TIME_ZONE_INFORMATION clientTimeZone; ULONG clientSessionId; WCHAR clientDigProductId[CLIENT_PRODUCT_ID_LENGTH]; //shadow loop fix // // Perf (slow link) disabled feature list (e.g wallpaper, themes) // defined in tsperf.h // ULONG performanceFlags; // // Client's active input locale information // (i.e. HKL returned from GetKeyboardLayout) // UINT32 activeInputLocale; /************************************************************************/ /* Temporary storage for an IOCtl. */ /************************************************************************/ PSD_IOCTL pSdIoctl; /************************************************************************/ /* Structs needed to support the keyboard IOCtls */ /************************************************************************/ KEYBOARD_TYPEMATIC_PARAMETERS KeyboardTypematic; KEYBOARD_INDICATOR_PARAMETERS KeyboardIndicators; PVOID pgafPhysKeyState; PVOID pKbdLayout; PVOID pKbdTbl; PVOID gpScancodeMap; BOOLEAN KeyboardType101; KEYBOARD_IME_STATUS KeyboardImeStatus; /************************************************************************/ /* Name information */ /************************************************************************/ DLLNAME DLLName; WINSTATIONNAME WinStationRegName; /************************************************************************/ /* These are used by the COM registry functions to store the handle of */ /* an open key and to keep track of calls to COM_OpenRegistry and */ /* COM_CloseRegistry. */ /************************************************************************/ HANDLE regKeyHandle; BOOLEAN regAttemptedOpen; /************************************************************************/ /* For determining is a QUERY_VIRTUAL_BINDINGS has already occurred. */ /************************************************************************/ BOOLEAN bVirtualChannelBound; /************************************************************************/ /* StartSessionInfo data */ /************************************************************************/ BOOLEAN fDontDisplayLastUserName; RNS_INFO_PACKET *pInfoPkt; /************************************************************************/ /* FE data */ /************************************************************************/ UINT32 keyboardType; UINT32 keyboardSubType; UINT32 keyboardFunctionKey; WCHAR imeFileName[TS_MAX_IMEFILENAME]; /************************************************************************/ /* Transfer variables for scheduler settings. These correspond to */ /* schNormalPeriod and schTurboPeriod respectively. */ /************************************************************************/ UINT32 outBufDelay; UINT32 interactiveDelay; /************************************************************************/ // Connection info /************************************************************************/ STACKCLASS StackClass; /* * Compression history */ BOOLEAN bCompress; BOOLEAN bFlushed; BOOLEAN bOutputFlush; SendContext *pMPPCContext; BYTE *pCompressBuffer; /************************************************************************/ /* Share load count */ /************************************************************************/ INT32 shareId; // Client load balancing capabilities. UINT32 bClientSupportsRedirection : 1; UINT32 bRequestedSessionIDFieldValid : 1; UINT32 bUseSmartcardLogon : 1; UINT32 RequestedSessionID; UINT32 ClientRedirectionVersion; // VC compression supported BOOLEAN bClientSupportsVCCompression; // // Recv decompression context // (this is 8K as VC's only support 8k compression // from client to server) to limit memory usage and // give better scalability. // RecvContext1 _DecomprContext1; RecvContext2_8K* _pRecvDecomprContext2; PUCHAR _pVcDecomprReassemblyBuf; /************************************************************************/ /* NOTE: Add new elements above here, so that the #ifdef DEBUG stuff */ /* below is always at the end. This allows the KD extensions to work */ /* correctly for retail/debug builds. */ /************************************************************************/ BOOL bSupportErrorInfoPDU; BOOL bForceEncryptedCSPDU; #ifdef DC_DEBUG /************************************************************************/ /* Memory allocation chain anchor point */ /************************************************************************/ UINT32 breakOnLeak; MALLOC_HEADER memoryHeader; /************************************************************************/ /* Trace config - should always be the last elements in this structure. */ /************************************************************************/ BOOL trcShmNeedsUpdate; TRC_SHARED_DATA trc; char traceString[TRC_BUFFER_SIZE]; #endif /************************************************************************/ /* Channel Write Flow Control Sleep Interval */ /************************************************************************/ UINT32 flowControlSleepInterval; BOOL fPolicyDisablesArc; // // Autoreconnect token // BOOL arcTokenValid; UINT32 arcReconnectSessionID; BYTE arcCookie[ARC_SC_SECURITY_TOKEN_LEN]; /************************************************************************/ /* The SM/NM data is allocated as part of the block of data containing */ /* this structure - it follows on at the next 4 byte boundary. */ /************************************************************************/ } TSHARE_WD, * PTSHARE_WD; /****************************************************************************/ /* FUNCTION PROTOTYPES */ /****************************************************************************/ /****************************************************************************/ /* Firstly, those APIs that are called by ICADD. */ /****************************************************************************/ #ifdef __cplusplus extern "C" { #endif NTSTATUS DriverEntry( PSDCONTEXT, BOOLEAN ); NTSTATUS WD_Open( PTSHARE_WD, PSD_OPEN ); NTSTATUS WD_RawWrite( PTSHARE_WD, PSD_RAWWRITE ); NTSTATUS WD_Close( PTSHARE_WD, PSD_CLOSE ); NTSTATUS WD_ChannelWrite( PTSHARE_WD, PSD_CHANNELWRITE ); NTSTATUS WD_Ioctl( PTSHARE_WD, PSD_IOCTL ); void RDPCALL WDW_LogAndDisconnect( PTSHARE_WD pTSWd, BOOL fSendErrorToClient, unsigned errDetailCode, PBYTE pDetailData, unsigned detailDataLen); /****************************************************************************/ /* Now those APIs that are called by the other components within the WD. */ /****************************************************************************/ void RDPCALL WDW_OnSMConnecting(PVOID, PRNS_UD_SC_SEC, PRNS_UD_SC_NET); void RDPCALL WDW_OnSMConnected(PVOID, unsigned); void WDW_OnSMDisconnected(PVOID); void WDW_InvalidateRect( PTSHARE_WD pTSWd, PTS_REFRESH_RECT_PDU pRRPDU, unsigned DataLength); void WDW_OnDataReceived(PTSHARE_WD, PVOID, unsigned, UINT16); PTS_CAPABILITYHEADER WDW_GetCapSet( PTSHARE_WD pTSWd, UINT32 CapSetType, PTS_COMBINED_CAPABILITIES pCaps, UINT32 capsLength); NTSTATUS RDPCALL WDW_WaitForConnectionEvent(PTSHARE_WD, PKEVENT, LONG); /****************************************************************************/ /* Name: WDW_ShareCreated */ /* */ /* Purpose: Called by Share Core when Share Create process is complete */ /* */ /* Params: pTSWd */ /* result - TRUE Share created OK */ /* - FALSE Share not created */ /****************************************************************************/ __inline void RDPCALL WDW_ShareCreated(PTSHARE_WD pTSWd, BOOLEAN result) { /************************************************************************/ /* Unblock the Connect IOCtl. */ /************************************************************************/ pTSWd->shareCreated = result; KeSetEvent(pTSWd->pCreateEvent, EVENT_INCREMENT, FALSE); } /****************************************************************************/ /* Name: WDW_Disconnect */ /* */ /* Purpose: Disconnect the session */ /* */ /* Params: pTSWd - pointer to WD structure */ /****************************************************************************/ __inline void WDW_Disconnect(PTSHARE_WD pTSWd) { ICA_CHANNEL_COMMAND BrokenConn; BrokenConn.Header.Command = ICA_COMMAND_BROKEN_CONNECTION; BrokenConn.BrokenConnection.Reason = Broken_Disconnect; BrokenConn.BrokenConnection.Source = BrokenSource_User; IcaChannelInput(pTSWd->pContext, Channel_Command, 0, NULL, (BYTE *)&BrokenConn, sizeof(BrokenConn)); } /****************************************************************************/ /* Name: WDW_StartRITTimer */ /* */ /* Purpose: Start the timer that will cause a kick to the WinStation's */ /* RIT. */ /* */ /* Params: IN pTSWd - pointer to WD struct */ /* IN milliSecs - time period. */ /****************************************************************************/ __inline void WDW_StartRITTimer(PTSHARE_WD pTSWd, UINT32 milliSecs) { if (pTSWd->ritTimer != NULL) { KeSetTimer(pTSWd->ritTimer, RtlConvertLongToLargeInteger( -((INT32)milliSecs * 10000)), NULL); } } /****************************************************************************/ // Returns the current state of the keyboard indicators. /****************************************************************************/ __inline NTSTATUS WDW_QueryKeyboardIndicators( PTSHARE_WD pTSWd, PSD_IOCTL pSdIoctl) { PKEYBOARD_INDICATOR_PARAMETERS pIndicator; if ( pSdIoctl->OutputBufferLength >= sizeof(KEYBOARD_INDICATOR_PARAMETERS)) { pIndicator = (PKEYBOARD_INDICATOR_PARAMETERS) pSdIoctl->OutputBuffer; *pIndicator = pTSWd->KeyboardIndicators; pSdIoctl->BytesReturned = sizeof(KEYBOARD_INDICATOR_PARAMETERS); return STATUS_SUCCESS; } else { return STATUS_BUFFER_TOO_SMALL; } } #ifdef __cplusplus } #endif #endif