|
|
/*++
Copyright (c) 1998-2000 Microsoft Corporation
Module Name :
rdrdr.h
Abstract:
Type definitions for the Rdp redirector protocol
Revision History: --*/
#ifndef _RDPDR_
#define _RDPDR_
#ifdef __cplusplus
extern "C" { #endif // __cplusplus
//
// Turn off compiler padding of structures
// Save previous packing style if 32-bit build.
//
#ifdef OS_WIN16
#pragma pack (1)
#else
#pragma pack (push, drpack, 1)
#endif
//
// version info.
//
#define RDPDR_MAJOR_VERSION 1
#define RDPDR_MINOR_VERSION 5
//
// version comparison macro
//
#define COMPARE_VERSION(Minor1, Major1, Minor2, Major2) \
(((LONG)MAKELONG(Minor1, Major1)) - ((LONG)MAKELONG(Minor2, Major2)))
#define RDPDR_MAJOR_VERSION_PORTS 1
#define RDPDR_MINOR_VERSION_PORTS 5
#define RDPDR_MAJOR_VERSION_DRIVE 1
#define RDPDR_MINOR_VERSION_DRIVE 5
//
// NULL Client Device ID.
//
#define RDPDR_INVALIDDEVICEID (ULONG)-1
//
// This string precedes the session id number in the file name path when
// a user-mode component opens us for device management.
//
#define RDPDYN_SESSIONIDSTRING L"\\session"
//
// Device Names for RDPDR Device Manager Control Device
//
// NT Names
#define RDPDRDVMGR_DEVICE_PATH_A "\\Device\\RdpDrDvMgr"
#define RDPDRDVMGR_DEVICE_PATH_U L"\\Device\\RdpDrDvMgr"
#define RDPDRDVMGR_DEVICE_PATH_A_LENGTH sizeof(RDPDRDVMGR_DEVICE_PATH_A)
#define RDPDRDVMGR_DEVICE_PATH_U_LENGTH sizeof(RDPDRDVMGR_DEVICE_PATH_U)
// Win32 Names
#define RDPDRDVMGR_W32DEVICE_NAME_A "RdpDrDvMgr"
#define RDPDRDVMGR_W32DEVICE_NAME_U L"RdpDrDvMgr"
#define RDPDRDVMGR_W32DEVICE_PATH_A "\\DosDevices\\RdpDrDvMgr"
#define RDPDRDVMGR_W32DEVICE_PATH_U L"\\DosDevices\\RdpDrDvMgr"
#define RDPDRDVMGR_W32DEVICE_PATH_A_LENGTH sizeof(RDPDRDVMGR_W32DEVICE_PATH_A)
#define RDPDRDVMGR_W32DEVICE_PATH_U_LENGTH sizeof(RDPDRDVMGR_W32DEVICE_PATH_U)
// Maximum number of characters in a ULONG -> STRING conversion.
#define RDPDRMAXULONGSTRING 16 // Big enough for a 32-bit int.
#define RDPDRMAXDOSNAMELEN 16
//
// Maximum number of characters (not bytes!) in a reference string.
//
#define RDPDRMAXREFSTRINGLEN \
(RDPDRMAXDOSNAMELEN + RDPDRMAXULONGSTRING + RDPDR_MAX_COMPUTER_NAME_LENGTH + 5 + RDPDRMAXDOSNAMELEN + 1) // DosDeviceName + Session ID + computer name + delimiters + preferred dos name + terminator
//
// Maximum number of characters in a NT device name string
//
#define RDPDRMAXNTDEVICENAMEGLEN \
((sizeof(RDPDR_PORT_DEVICE_NAME_U) / sizeof(WCHAR)) + RDPDRMAXREFSTRINGLEN + 1) // NT Device name + Reference string + terminator null
//
// Dr Network Provider Dll Name
//
#define RDPDR_PROVIDER_NAME_U L"Microsoft Terminal Services"
#define RDPDR_PROVIDER_NAME_A "Microsoft Terminal Services"
// The following constant defines the length of the above name.
#define RDPDR_PROVIDER_NAME_U_LENGTH (sizeof(RDPDR_PROVIDER_NAME_U))
#define RDPDR_PROVIDER_NAME_A_LENGTH (sizeof(RDPDR_PROVIDER_NAME_A))
//
// RDPDR Device Manager Event Codes for IOCTL Responses from Server
//
// Message Code Corresponding Message Meaning
// ---------------------------------------------------------------------------
// RDPDREVT_PRINTERANNOUNCE RDPDR_PRINTERDEVICE_SUB New printer device.
// RDPDREVT_BUFFERTOOSMALL RDPDR_BUFFERTOOSMALL IOCTL output buffer
// is too small.
// RDPDREVT_PORTANNOUNCE RDPDR_PORTDEVICE_SUB New redirect port
// device.
// RDPDREVT_REMOVEDEVICE RDPDR_REMOVEDEVICE A client-side device
// has been removed.
// RDPDREVT_SESSIONDISCONNECT NONE Client has disconnected
// from the session.
// RDPDREVT_DRIVEANNOUNCE RDPDR_DRIVEDEVICE_SUB New redirected drive
// device
//
// Message Codes
#define RDPDREVT_BASE 0
#define RDPDREVT_PRINTERANNOUNCE RDPDREVT_BASE + 1
#define RDPDREVT_BUFFERTOOSMALL RDPDREVT_BASE + 2
#define RDPDREVT_REMOVEDEVICE RDPDREVT_BASE + 3
#define RDPDREVT_PORTANNOUNCE RDPDREVT_BASE + 4
#define RDPDREVT_SESSIONDISCONNECT RDPDREVT_BASE + 5
#define RDPDREVT_DRIVEANNOUNCE RDPDREVT_BASE + 6
//
// Device Manager IOCTL's
//
// IOCTL Input Buffer Output Message Code
// (Above-Defined Buffer Follows
// Header in Driver-Response)
// ----------------------------------------------------------------------------
// IOCTL_RDPDR_GETNEXTDEVMGMTEVENT NONE RDPDREVT_PRINTERANNOUNCE
// RDPDREVT_BUFFERTOOSMALL
// IOCTL_RDPDR_DBGADDNEWPRINTER NONE NONE
// IOCTL_RDPDR_CLIENTMSG opaque data NONE
// intended for
// session's
// corresponding
// client.
//
#define IOCTL_RDPDR_GETNEXTDEVMGMTEVENT \
CTL_CODE(FILE_DEVICE_UNKNOWN, 0x801, METHOD_BUFFERED, FILE_ANY_ACCESS)
#ifdef DBG
#define IOCTL_RDPDR_DBGADDNEWPRINTER \
CTL_CODE(FILE_DEVICE_UNKNOWN, 0x802, METHOD_BUFFERED, FILE_ANY_ACCESS) #endif
#define IOCTL_RDPDR_CLIENTMSG \
CTL_CODE(FILE_DEVICE_UNKNOWN, 0x803, METHOD_BUFFERED, FILE_ANY_ACCESS)
//
// TS Printer Port Defines
//
#define RDPDRPRT_BASEPORTNAME L"TS" // TS Port Base Name
#define RDPDR_PORTNAMEDIGITS 6 // This value must match JobyL's value for USB
// max port number.
#define RDPDR_PORTNAMEDIGITSTOPAD 3 // We pad the first 3 to make things line
// up nicely in UI up to port 999
#define RDPDR_MAXPORTNAMELEN \
(((sizeof(RDPDRPRT_BASEPORTNAME)-sizeof(WCHAR))/sizeof(WCHAR)) \ + RDPDR_PORTNAMEDIGITS + 1) // In characters, including the terminator.
//
// Driver name and ioctls
//
#define RDPDR_DEVICE_NAME_A "\\Device\\RdpDr"
#define RDPDR_DEVICE_NAME_U L"\\Device\\RdpDr"
#define RDPDR_DEVICE_NAME_A_LENGTH sizeof(RDPDR_DEVICE_NAME_A)
#define RDPDR_DEVICE_NAME_U_LENGTH sizeof(RDPDR_DEVICE_NAME_U)
#define RDPDR_PORT_DEVICE_NAME_A "\\Device\\RdpDrPort"
#define RDPDR_PORT_DEVICE_NAME_U L"\\Device\\RdpDrPort"
#define RDPDR_PORT_DEVICE_NAME_A_LENGTH sizeof(RDPDR_PORT_DEVICE_NAME_A)
#define RDPDR_PORT_DEVICE_NAME_U_LENGTH sizeof(RDPDR_PORT_DEVICE_NAME_U)
#define FSCTL_DR_START CTL_CODE(FILE_DEVICE_NETWORK_FILE_SYSTEM, \
100, METHOD_BUFFERED, FILE_ANY_ACCESS) #define FSCTL_DR_STOP CTL_CODE(FILE_DEVICE_NETWORK_FILE_SYSTEM, \
101, METHOD_BUFFERED, FILE_ANY_ACCESS) #define FSCTL_DR_DELETE_CONNECTION CTL_CODE(FILE_DEVICE_NETWORK_FILE_SYSTEM, \
102, METHOD_BUFFERED, FILE_ANY_ACCESS) #define FSCTL_DR_GET_CONNECTION_INFO CTL_CODE(FILE_DEVICE_NETWORK_FILE_SYSTEM, \
103, METHOD_NEITHER, FILE_ANY_ACCESS) #define FSCTL_DR_ENUMERATE_CONNECTIONS CTL_CODE(FILE_DEVICE_NETWORK_FILE_SYSTEM, \
104, METHOD_NEITHER, FILE_ANY_ACCESS) #define FSCTL_DR_ENUMERATE_SHARES CTL_CODE(FILE_DEVICE_NETWORK_FILE_SYSTEM, \
105, METHOD_NEITHER, FILE_ANY_ACCESS) #define FSCTL_DR_ENUMERATE_SERVERS CTL_CODE(FILE_DEVICE_NETWORK_FILE_SYSTEM, \
106, METHOD_NEITHER, FILE_ANY_ACCESS)
//
// Channel Name
//
#define DR_CHANNEL_NAME "RDPDR"
//
// Smartcard Name
//
#define DR_SMARTCARD_SUBSYSTEM "SCARD"
//
// Smartcard Name
//
#define DR_SMARTCARD_FILEID 1
//
// Component Ids
//
#define RDPDR_CTYP_CORE 0x4472 /* 'Dr' */
#define RDPDR_CTYP_PRN 0x5052 /* 'PR' */
//
// Core Packet Ids
//
#define DR_CORE_SERVER_ANNOUNCE 0x496E /* 'In' */
#define DR_CORE_CLIENTID_CONFIRM 0x4343 /* 'CC' */
#define DR_CORE_CLIENT_NAME 0x434E /* 'CN' */
#define DR_CORE_DEVICE_ANNOUNCE 0x6461 /* 'da' */
#define DR_CORE_DEVICELIST_ANNOUNCE 0x4441 /* 'DA' */
#define DR_CORE_DEVICELIST_REPLY 0x4452 /* 'DR' */
#define DR_CORE_DEVICE_REPLY 0x6472 /* 'dr' */
#define DR_CORE_DEVICE_IOREQUEST 0x4952 /* 'IR' */
#define DR_CORE_DEVICE_IOCOMPLETION 0x4943 /* 'IC' */
#define DR_CORE_SERVER_CAPABILITY 0x5350 /* 'SP' */
#define DR_CORE_CLIENT_CAPABILITY 0x4350 /* 'CP' */
#define DR_CORE_DEVICE_REMOVE 0x646D /* 'dm' */
#define DR_CORE_DEVICELIST_REMOVE 0x444D /* 'DM' */
#define DR_CORE_CLIENT_DISPLAY_NAME 0x444E /* 'DN' */
#define DR_PRN_CACHE_DATA 0x5043 /* 'PC' */
//
// Protocol header
//
typedef struct tagRDPDR_HEADER { SHORT Component; SHORT PacketId; } RDPDR_HEADER, *PRDPDR_HEADER;
#ifdef __cplusplus
inline BOOL IsValidHeader( PVOID pData ) { PRDPDR_HEADER pRdpdrHeader;
pRdpdrHeader = (PRDPDR_HEADER)pData;
if( (pRdpdrHeader != NULL) && ((pRdpdrHeader->Component == RDPDR_CTYP_CORE) || (pRdpdrHeader->Component == RDPDR_CTYP_PRN)) ) {
SHORT sPacketId;
sPacketId = pRdpdrHeader->PacketId;
if( (sPacketId == DR_CORE_SERVER_ANNOUNCE ) || (sPacketId == DR_CORE_CLIENTID_CONFIRM ) || (sPacketId == DR_CORE_CLIENT_NAME ) || (sPacketId == DR_CORE_DEVICE_ANNOUNCE ) || (sPacketId == DR_CORE_DEVICELIST_ANNOUNCE) || (sPacketId == DR_CORE_DEVICELIST_REPLY ) || (sPacketId == DR_CORE_DEVICE_REPLY ) || (sPacketId == DR_CORE_DEVICE_IOREQUEST ) || (sPacketId == DR_CORE_DEVICE_IOCOMPLETION) || (sPacketId == DR_PRN_CACHE_DATA ) || (sPacketId == DR_CORE_SERVER_CAPABILITY ) || (sPacketId == DR_CORE_CLIENT_CAPABILITY ) || (sPacketId == DR_CORE_DEVICE_REMOVE ) || (sPacketId == DR_CORE_DEVICELIST_REMOVE ) || (sPacketId == DR_CORE_CLIENT_DISPLAY_NAME)) {
return( TRUE ); } }
return( FALSE ); } #endif // __cplusplus
//
// RDPDR capability PDUs
//
// This is used during the client/server connection time to determine what
// the client and server are capable of doing
//
typedef struct tagRDPDR_CAPABILITY_SET_HEADER { RDPDR_HEADER Header; UINT16 numberCapabilities; UINT16 pad1; } RDPDR_CAPABILITY_SET_HEADER, *PRDPDR_CAPABILITY_SET_HEADER;
typedef struct tagRDPDR_CAPABILITY_HEADER { UINT16 capabilityType; UINT16 capabilityLength; UINT32 version; } RDPDR_CAPABILITY_HEADER, *PRDPDR_CAPABILITY_HEADER;
#define RDPDR_GENERAL_CAPABILITY_TYPE 0x1
#define RDPDR_PRINT_CAPABILITY_TYPE 0x2
#define RDPDR_PORT_CAPABILITY_TYPE 0x3
#define RDPDR_FS_CAPABILITY_TYPE 0x4
#define RDPDR_SMARTCARD_CAPABILITY_TYPE 0x5
//
// RDPDR general capability
//
typedef struct tagRDPDR_GENERAL_CAPABILITY { UINT16 capabilityType; UINT16 capabilityLength; UINT32 version; #define RDPDR_GENERAL_CAPABILITY_VERSION_01 0x1
UINT32 osType; #define RDPDR_OS_TYPE_UNKNOWN 0x0
#define RDPDR_OS_TYPE_WIN9X 0x1
#define RDPDR_OS_TYPE_WINNT 0x2
UINT32 osVersion; // For windows platforms, the high word is the major version
// The low word is the minor version
UINT16 protocolMajorVersion; UINT16 protocolMinorVersion;
UINT32 ioCode1; #define RDPDR_IRP_MJ_CREATE 0x0001
#define RDPDR_IRP_MJ_CLEANUP 0x0002
#define RDPDR_IRP_MJ_CLOSE 0x0004
#define RDPDR_IRP_MJ_READ 0x0008
#define RDPDR_IRP_MJ_WRITE 0x0010
#define RDPDR_IRP_MJ_FLUSH_BUFFERS 0x0020
#define RDPDR_IRP_MJ_SHUTDOWN 0x0040
#define RDPDR_IRP_MJ_DEVICE_CONTROL 0x0080
#define RDPDR_IRP_MJ_QUERY_VOLUME_INFORMATION 0x0100
#define RDPDR_IRP_MJ_SET_VOLUME_INFORMATION 0x0200
#define RDPDR_IRP_MJ_QUERY_INFORMATION 0x0400
#define RDPDR_IRP_MJ_SET_INFORMATION 0x0800
#define RDPDR_IRP_MJ_DIRECTORY_CONTROL 0x1000
#define RDPDR_IRP_MJ_LOCK_CONTROL 0x2000
#define RDPDR_IRP_MJ_QUERY_SECURITY 0x4000
#define RDPDR_IRP_MJ_SET_SECURITY 0x8000
UINT32 ioCode2;
UINT32 extendedPDU; #define RDPDR_DEVICE_REMOVE_PDUS 0x0001
#define RDPDR_CLIENT_DISPLAY_NAME_PDU 0x0002
UINT32 extraFlags1; UINT32 extraFlags2; } RDPDR_GENERAL_CAPABILITY, *PRDPDR_GENERAL_CAPABILITY;
//
// RDPDR printing capability
//
typedef struct tagRDPDR_PRINT_CAPABILITY { UINT16 capabilityType; UINT16 capabilityLength; UINT32 version; #define RDPDR_PRINT_CAPABILITY_VERSION_01 0x1
} RDPDR_PRINT_CAPABILITY, *PRDPDR_PRINT_CAPABILITY;
//
// RDPDR port capability
//
typedef struct tagRDPDR_PORT_CAPABILITY { UINT16 capabilityType; UINT16 capabilityLength; UINT32 version; #define RDPDR_PORT_CAPABILITY_VERSION_01 0x1
} RDPDR_PORT_CAPABILITY, *PRDPDR_PORT_CAPABILITY;
//
// RDPDR file system capability
//
typedef struct tagRDPDR_FS_CAPABILITY { UINT16 capabilityType; UINT16 capabilityLength; UINT32 version; #define RDPDR_FS_CAPABILITY_VERSION_01 0x1
} RDPDR_FS_CAPABILITY, *PRDPDR_FS_CAPABILITY;
//
// RDPDR smart card subsystem capability
//
typedef struct tagRDPDR_SMARTCARD_CAPABILITY { UINT16 capabilityType; UINT16 capabilityLength; UINT32 version; #define RDPDR_SMARTCARD_CAPABILITY_VERSION_01 0x1
} RDPDR_SMARTCARD_CAPABILITY, *PRDPDR_SMARTCARD_CAPABILITY;
typedef struct tagRDPDR_VERSION { SHORT Major; SHORT Minor; } RDPDR_VERSION, *PRDPDR_VERSION;
//
// Device types
//
#define RDPDR_DTYP_SERIAL 0x00000001
#define RDPDR_DTYP_PARALLEL 0x00000002
#define RDPDR_DRYP_PRINTPORT 0x00000010
#define RDPDR_DTYP_PRINT 0x00000004
#define RDPDR_DTYP_FILESYSTEM 0x00000008
#define RDPDR_DTYP_SMARTCARD 0x00000020
//
// RDPDR_SERVER_ANNOUNCE
//
// Sent by the Server to establish communications and provide a client Id
//
typedef struct tagRDPDR_SERVER_ANNOUNCE { ULONG ClientId; // Unique client identifier.
} RDPDR_SERVER_ANNOUNCE, *PRDPDR_SERVER_ANNOUNCE;
typedef struct tagRDPDR_SERVER_ANNOUNCE_PACKET { RDPDR_HEADER Header; RDPDR_VERSION VersionInfo; // Server version Info.
RDPDR_SERVER_ANNOUNCE ServerAnnounce; } RDPDR_SERVER_ANNOUNCE_PACKET, *PRDPDR_SERVER_ANNOUNCE_PACKET;
//
// RDPDR_CLIENTID_CONFIRM
//
// Sent by the client to confirm the client id or propose reusing a
// pre-existing client Id. If the client sends acceptance the ID from the
// RDPDR_SERVER_ANNOUNCE, that's the end of it.
// If the client proposes a different id, the server will send a
// RPPDR_CLIENTID_CONFIRM back to either insist on the original clientId or
// accept the client provided one.
//
typedef struct tagRDPDR_CLIENTID_CONFIRM { ULONG ClientId; // Unique client identifier.
} RDPDR_CLIENTID_CONFIRM, *PRDPDR_CLIENTID_CONFIRM;
typedef struct tagRDPDR_CLIENT_CONFIRM_PACKET { RDPDR_HEADER Header; RDPDR_VERSION VersionInfo; // Client version Info.
RDPDR_CLIENTID_CONFIRM ClientConfirm; } RDPDR_CLIENT_CONFIRM_PACKET, *PRDPDR_CLIENT_CONFIRM_PACKET;
#ifndef MAX_COMPUTERNAME_LENGTH
#define MAX_COMPUTERNAME_LENGTH 15 // From winbase.h
#endif // MAX_COMPUTERNAME_LENGTH
#define RDPDR_MAX_COMPUTER_NAME_LENGTH (MAX_COMPUTERNAME_LENGTH + 1)
#define RDPDR_MAX_DOSNAMELEN 16
typedef struct tagRDPDR_CLIENT_NAME { ULONG Unicode:1; // flag to indicate the computer name is unicode or
// ansi.
ULONG CodePage; // code page of the ansi string.
ULONG ComputerNameLen;// length of the computer name in bytes that
// follows this structures.
//
// computer name follows.
//
} RDPDR_CLIENT_NAME, *PRDPDR_CLIENT_NAME;
typedef struct tagRDPDR_CLIENT_NAME_PACKET { RDPDR_HEADER Header; RDPDR_CLIENT_NAME Name; } RDPDR_CLIENT_NAME_PACKET, *PRDPDR_CLIENT_NAME_PACKET;
#define RDPDR_MAX_CLIENT_DISPLAY_NAME 64
typedef struct tagRDPDR_CLIENT_DISPLAY_NAME { BYTE ComputerDisplayNameLen;
//
// computer display name follows
//
} RDPDR_CLIENT_DISPLAY_NAME, *PRDPDR_CLIENT_DISPLAY_NAME;
typedef struct tagRDPDR_CLIENT_DISPLAY_NAME_PACKET { RDPDR_HEADER Header; RDPDR_CLIENT_DISPLAY_NAME Name; } RDPDR_CLIENT_DISPLAY_NAME_PACKET, *PRDPDR_CLIENT_DISPLAY_NAME_PACKET;
//
// RDPDR_DEVICE_ANNOUNCE
//
// Sent by the client to indicate a device is available
//
#define PREFERRED_DOS_NAME_SIZE 8
typedef struct tagRDPDR_DEVICE_ANNOUNCE { ULONG DeviceType; // Type of device, as listed above
ULONG DeviceId; // An id to refer the device later
UCHAR PreferredDosName[PREFERRED_DOS_NAME_SIZE]; // Preferred device name COM99:\null
// Long enough?
ULONG DeviceDataLength; // Length of Type specific data (follows)
} RDPDR_DEVICE_ANNOUNCE, *PRDPDR_DEVICE_ANNOUNCE;
typedef struct tagRDPDR_DEVICE_ANNOUNCE_PACKET { RDPDR_HEADER Header; RDPDR_DEVICE_ANNOUNCE DeviceAnnounce; } RDPDR_DEVICE_ANNOUNCE_PACKET, *PRDPDR_DEVICE_ANNOUNCE_PACKET;
//
// RDPDR_DEVICELIST_ANNOUNCE
//
// Sent by the client to indicate a number of devices are available
//
typedef struct tagRDPDR_DEVICELIST_ANNOUNCE { ULONG DeviceCount; // Number of devices
// DeviceCount RDPDR_DEVICE_ANNOUNCE structures follows
} RDPDR_DEVICELIST_ANNOUNCE, *PRDPDR_DEVICELIST_ANNOUNCE;
typedef struct tagRDPDR_DEVICELIST_ANNOUNCE_PACKET { RDPDR_HEADER Header; RDPDR_DEVICELIST_ANNOUNCE DeviceListAnnounce; RDPDR_DEVICE_ANNOUNCE DeviceAnnounce; } RDPDR_DEVICELIST_ANNOUNCE_PACKET, *PRDPDR_DEVICELIST_ANNOUNCE_PACKET;
#define DR_FIRSTDEVICEANNOUNCE(DeviceListPacket) \
(&((PRDPDR_DEVICELIST_ANNOUNCE_PACKET)(DeviceListPacket))->DeviceAnnounce) #define DR_NEXTDEVICEANNOUNCE(DeviceAnnounce) \
(PRDPDR_DEVICE_ANNOUNCE) \ ((((PUCHAR)(DeviceAnnounce)) + sizeof(RDPDR_DEVICE_ANNOUNCE) + \ ((DeviceAnnounce)->DeviceDataLength)))
#define DR_CHECK_DEVICEDATALEN(DeviceAnnounce, DeviceSub) \
(DeviceAnnounce->DeviceDataLength <= (sizeof(DeviceSub) - sizeof(*DeviceAnnounce)))
//
// RDPDR_DEVICE_REMOVE
//
// Sent by the client to indicate a device to be removed
//
typedef struct tagRDPDR_DEVICE_REMOVE { ULONG DeviceId; // An id to refer the device later
} RDPDR_DEVICE_REMOVE, *PRDPDR_DEVICE_REMOVE;
typedef struct tagRDPDR_DEVICE_REMOVE_PACKET { RDPDR_HEADER Header; RDPDR_DEVICE_REMOVE DeviceRemove; } RDPDR_DEVICE_REMOVE_PACKET, *PRDPDR_DEVICE_REMOVE_PACKET;
//
// RDPDR_DEVICELIST_REMOVE
//
// Sent by the client to indicate a number of devices are to be removed
//
typedef struct tagRDPDR_DEVICELIST_REMOVE { ULONG DeviceCount; // Number of devices
// DeviceCount RDPDR_DEVICE_REMOVE structures follows
} RDPDR_DEVICELIST_REMOVE, *PRDPDR_DEVICELIST_REMOVE;
typedef struct tagRDPDR_DEVICELIST_REMOVE_PACKET { RDPDR_HEADER Header; RDPDR_DEVICELIST_REMOVE DeviceListRemove; RDPDR_DEVICE_REMOVE DeviceRemove; } RDPDR_DEVICELIST_REMOVE_PACKET, *PRDPDR_DEVICELIST_REMOVE_PACKET;
#define DR_FIRSTDEVICEREMOVE(DeviceListPacket) \
(&((PRDPDR_DEVICELIST_REMOVE_PACKET)(DeviceListPacket))->DeviceRemove) #define DR_NEXTDEVICEREMOVE(DeviceRemove) \
(PRDPDR_DEVICE_REMOVE) \ ((((PUCHAR)(DeviceRemove)) + sizeof(RDPDR_DEVICE_REMOVE)))
#define RDPDR_DEVICE_REPLY_SUCCESS 0x00000000 // Accepted device
#define RDPDR_DEVICE_REPLY_REJECTED 0x00000001 // Generic will not use
//
// RDPDR_DEVICE_REPLY
//
// Sent by the server to indicate whether a device will be used
//
typedef struct tagRDPDR_DEVICE_REPLY { ULONG DeviceId; // Id supplied in RDPDR_DEVICE_ANNOUNCE
ULONG ResultCode; // Success or reason code
} RDPDR_DEVICE_REPLY, *PRDPDR_DEVICE_REPLY;
typedef struct tagRDPDR_DEVICE_REPLY_PACKET { RDPDR_HEADER Header; RDPDR_DEVICE_REPLY DeviceReply; } RDPDR_DEVICE_REPLY_PACKET, *PRDPDR_DEVICE_REPLY_PACKET;
//
// RDPDR_DEVICELIST_REPLY
//
// Sent by the server to indicate which devices will be used
//
typedef struct tagRDPDR_DEVICELIST_REPLY { ULONG DeviceCount; // Number of devices
// DeviceReplies follow
} RDPDR_DEVICELIST_REPLY, *PRDPDR_DEVICELIST_REPLY;
typedef struct tagRDPDR_DEVICELIST_REPLY_PACKET { RDPDR_HEADER Header; RDPDR_DEVICELIST_REPLY DeviceListReply; RDPDR_DEVICE_REPLY DeviceReply; } RDPDR_DEVICELIST_REPLY_PACKET_PACKET, *PRDPDR_DEVICELIST_REPLY_PACKET_PACKET;
//
// RDPDR_UPDATE_DEVICEINFO
//
// Sent by the server to update information about the device, for example
// if the user does configuration on it.
//
typedef struct tagRDPDR_UPDATE_DEVICEINFO { ULONG DeviceId; // Relevant device
ULONG DeviceDataLength; // Length of type specific data (follows)
} RDPDR_UPDATE_DEVICEINFO, *PRDPDR_UPDATE_DEVICEINFO;
typedef struct tagRDPDR_UPDATE_DEVICEINFO_PACKET { RDPDR_HEADER Header; RDPDR_UPDATE_DEVICEINFO DeviceUpdate; UCHAR Data; } RDPDR_UPDATE_DEVICEINFO_PACKET, *PRDPDR_UPDATE_DEVICEINFO_PACKET;
//
// Define the file create disposition values
// These are defined in ntioapi.h
//
#define FILE_SUPERSEDE 0x00000000
#define FILE_OPEN 0x00000001
#define FILE_CREATE 0x00000002
#define FILE_OPEN_IF 0x00000003
#define FILE_OVERWRITE 0x00000004
#define FILE_OVERWRITE_IF 0x00000005
#define FILE_MAXIMUM_DISPOSITION 0x00000005
//
// Define the I/O status information return values for NtCreateFile/NtOpenFile
// These are defined in ntioapi.h
//
#define FILE_SUPERSEDED 0x00000000
#define FILE_OPENED 0x00000001
#define FILE_CREATED 0x00000002
#define FILE_OVERWRITTEN 0x00000003
#define FILE_EXISTS 0x00000004
#define FILE_DOES_NOT_EXIST 0x00000005
//
// Define the file create/open option flags
// Also defined in ntioapi.h
//
#define FILE_DIRECTORY_FILE 0x00000001
#define FILE_WRITE_THROUGH 0x00000002
#define FILE_SEQUENTIAL_ONLY 0x00000004
#define FILE_NO_INTERMEDIATE_BUFFERING 0x00000008
#define FILE_SYNCHRONOUS_IO_ALERT 0x00000010
#define FILE_SYNCHRONOUS_IO_NONALERT 0x00000020
#define FILE_NON_DIRECTORY_FILE 0x00000040
#define FILE_CREATE_TREE_CONNECTION 0x00000080
#define FILE_COMPLETE_IF_OPLOCKED 0x00000100
#define FILE_NO_EA_KNOWLEDGE 0x00000200
#define FILE_OPEN_FOR_RECOVERY 0x00000400
#define FILE_RANDOM_ACCESS 0x00000800
#define FILE_DELETE_ON_CLOSE 0x00001000
#define FILE_OPEN_BY_FILE_ID 0x00002000
#define FILE_OPEN_FOR_BACKUP_INTENT 0x00004000
#define FILE_NO_COMPRESSION 0x00008000
#define FILE_RESERVE_OPFILTER 0x00100000
#define FILE_OPEN_REPARSE_POINT 0x00200000
#define FILE_OPEN_NO_RECALL 0x00400000
#define FILE_OPEN_FOR_FREE_SPACE_QUERY 0x00800000
#define FILE_COPY_STRUCTURED_STORAGE 0x00000041
#define FILE_STRUCTURED_STORAGE 0x00000441
#define FILE_VALID_OPTION_FLAGS 0x00ffffff
//
// Define the file system information class
// Server can query the client file system with
// each of these information class.
// These are defined in ntioapi.h
//
typedef enum _RDPFSINFOCLASS { RdpFsVolumeInformation = 1, RdpFsLabelInformation, // 2
RdpFsSizeInformation, // 3
RdpFsDeviceInformation, // 4
RdpFsAttributeInformation, // 5
RdpFsControlInformation, // 6
RdpFsFullSizeInformation, // 7
RdpFsObjectIdInformation, // 8
RdpFsMaximumInformation } RDP_FS_INFORMATION_CLASS, *PRDP_FS_INFORMATION_CLASS;
//
// This is the maximum length for the file system volume
// information structures
// (not including variable file length)
// Need to update this value if there is update to the file
// system volume information structures
//
#define RDP_FILE_VOLUME_INFO_MAXLENGTH 32
//
// Define file system information classes
//
typedef struct _RDP_FILE_FS_LABEL_INFORMATION { ULONG VolumeLabelLength; WCHAR VolumeLabel[1]; } RDP_FILE_FS_LABEL_INFORMATION; typedef UNALIGNED RDP_FILE_FS_LABEL_INFORMATION * PRDP_FILE_FS_LABEL_INFORMATION;
typedef struct _RDP_FILE_FS_VOLUME_INFORMATION { LARGE_INTEGER VolumeCreationTime; ULONG VolumeSerialNumber; ULONG VolumeLabelLength; BYTE SupportsObjects; WCHAR VolumeLabel[1]; } RDP_FILE_FS_VOLUME_INFORMATION; typedef UNALIGNED RDP_FILE_FS_VOLUME_INFORMATION * PRDP_FILE_FS_VOLUME_INFORMATION; typedef struct _RDP_FILE_FS_SIZE_INFORMATION { LARGE_INTEGER TotalAllocationUnits; LARGE_INTEGER AvailableAllocationUnits; ULONG SectorsPerAllocationUnit; ULONG BytesPerSector; } RDP_FILE_FS_SIZE_INFORMATION; typedef UNALIGNED RDP_FILE_FS_SIZE_INFORMATION * PRDP_FILE_FS_SIZE_INFORMATION;
typedef struct _RDP_FILE_FS_FULL_SIZE_INFORMATION { LARGE_INTEGER TotalAllocationUnits; LARGE_INTEGER CallerAvailableAllocationUnits; LARGE_INTEGER ActualAvailableAllocationUnits; ULONG SectorsPerAllocationUnit; ULONG BytesPerSector; } RDP_FILE_FS_FULL_SIZE_INFORMATION; typedef UNALIGNED RDP_FILE_FS_FULL_SIZE_INFORMATION * PRDP_FILE_FS_FULL_SIZE_INFORMATION;
typedef struct _RDP_FILE_FS_ATTRIBUTE_INFORMATION { ULONG FileSystemAttributes; LONG MaximumComponentNameLength; ULONG FileSystemNameLength; WCHAR FileSystemName[1]; } RDP_FILE_FS_ATTRIBUTE_INFORMATION; typedef UNALIGNED RDP_FILE_FS_ATTRIBUTE_INFORMATION * PRDP_FILE_FS_ATTRIBUTE_INFORMATION;
//
// Define the file information class
// Server can query the client file with
// each of these information class.
// These are defined in ntioapi.h
//
typedef enum _RDP_FILE_INFORMATION_CLASS { RdpFileDirectoryInformation = 1, RdpFileFullDirectoryInformation, // 2
RdpFileBothDirectoryInformation, // 3
RdpFileBasicInformation, // 4
RdpFileStandardInformation, // 5
RdpFileInternalInformation, // 6
RdpFileEaInformation, // 7
RdpFileAccessInformation, // 8
RdpFileNameInformation, // 9
RdpFileRenameInformation, // 10
RdpFileLinkInformation, // 11
RdpFileNamesInformation, // 12
RdpFileDispositionInformation, // 13
RdpFilePositionInformation, // 14
RdpFileFullEaInformation, // 15
RdpFileModeInformation, // 16
RdpFileAlignmentInformation, // 17
RdpFileAllInformation, // 18
RdpFileAllocationInformation, // 19
RdpFileEndOfFileInformation, // 20
RdpFileAlternateNameInformation, // 21
RdpFileStreamInformation, // 22
RdpFilePipeInformation, // 23
RdpFilePipeLocalInformation, // 24
RdpFilePipeRemoteInformation, // 25
RdpFileMailslotQueryInformation, // 26
RdpFileMailslotSetInformation, // 27
RdpFileCompressionInformation, // 28
RdpFileObjectIdInformation, // 29
RdpFileCompletionInformation, // 30
RdpFileMoveClusterInformation, // 31
RdpFileQuotaInformation, // 32
RdpFileReparsePointInformation, // 33
RdpFileNetworkOpenInformation, // 34
RdpFileAttributeTagInformation, // 35
RdpFileTrackingInformation, // 36
RdpFileMaximumInformation } RDP_FILE_INFORMATION_CLASS, *PRDP_FILE_INFORMATION_CLASS;
//
// This is the maximum length for the file information structures
// (not including variable file length)
// Need to update this value if there is update to the file
// information structures
//
#define RDP_FILE_INFORMATION_MAXLENGTH 36
//
// Define file information classes
//
typedef struct _RDP_FILE_BASIC_INFORMATION { LARGE_INTEGER CreationTime; LARGE_INTEGER LastAccessTime; LARGE_INTEGER LastWriteTime; LARGE_INTEGER ChangeTime; ULONG FileAttributes; } RDP_FILE_BASIC_INFORMATION; typedef UNALIGNED RDP_FILE_BASIC_INFORMATION * PRDP_FILE_BASIC_INFORMATION;
typedef struct _RDP_FILE_STANDARD_INFORMATION { LARGE_INTEGER AllocationSize; LARGE_INTEGER EndOfFile; ULONG NumberOfLinks; BOOLEAN DeletePending; BOOLEAN Directory; } RDP_FILE_STANDARD_INFORMATION; typedef UNALIGNED RDP_FILE_STANDARD_INFORMATION * PRDP_FILE_STANDARD_INFORMATION;
typedef struct _RDP_FILE_ATTRIBUTE_TAG_INFORMATION { ULONG FileAttributes; ULONG ReparseTag; } RDP_FILE_ATTRIBUTE_TAG_INFORMATION; typedef UNALIGNED RDP_FILE_ATTRIBUTE_TAG_INFORMATION * PRDP_FILE_ATTRIBUTE_TAG_INFORMATION;
typedef struct _RDP_FILE_INTERNAL_INFORMATION { LARGE_INTEGER IndexNumber; } RDP_FILE_INTERNAL_INFORMATION; typedef UNALIGNED RDP_FILE_INTERNAL_INFORMATION * PRDP_FILE_INTERNAL_INFORMATION;
typedef struct _RDP_FILE_RENAME_INFORMATION { BOOLEAN ReplaceIfExists; BOOLEAN RootDirectory; // Specify if the FileName contains the root directory
ULONG FileNameLength; WCHAR FileName[1]; } RDP_FILE_RENAME_INFORMATION; typedef RDP_FILE_RENAME_INFORMATION * PRDP_FILE_RENAME_INFORMATION;
//
// This is the maximum length for any directory information structure
// (not including variable file length)
// Need to update this macro if there is update to the directory
// information structure
//
#define RDP_FILE_DIRECTORY_INFO_MAXLENGTH 96
typedef struct _RDP_FILE_DIRECTORY_INFORMATION { ULONG NextEntryOffset; ULONG FileIndex; LARGE_INTEGER CreationTime; LARGE_INTEGER LastAccessTime; LARGE_INTEGER LastWriteTime; LARGE_INTEGER ChangeTime; LARGE_INTEGER EndOfFile; LARGE_INTEGER AllocationSize; ULONG FileAttributes; ULONG FileNameLength; WCHAR FileName[1]; } RDP_FILE_DIRECTORY_INFORMATION; typedef UNALIGNED RDP_FILE_DIRECTORY_INFORMATION * PRDP_FILE_DIRECTORY_INFORMATION;
typedef struct _RDP_FILE_FULL_DIR_INFORMATION { ULONG NextEntryOffset; ULONG FileIndex; LARGE_INTEGER CreationTime; LARGE_INTEGER LastAccessTime; LARGE_INTEGER LastWriteTime; LARGE_INTEGER ChangeTime; LARGE_INTEGER EndOfFile; LARGE_INTEGER AllocationSize; ULONG FileAttributes; ULONG FileNameLength; ULONG EaSize; WCHAR FileName[1]; } RDP_FILE_FULL_DIR_INFORMATION; typedef UNALIGNED RDP_FILE_FULL_DIR_INFORMATION *PRDP_FILE_FULL_DIR_INFORMATION;
typedef struct _RDP_FILE_BOTH_DIR_INFORMATION { ULONG NextEntryOffset; ULONG FileIndex; LARGE_INTEGER CreationTime; LARGE_INTEGER LastAccessTime; LARGE_INTEGER LastWriteTime; LARGE_INTEGER ChangeTime; LARGE_INTEGER EndOfFile; LARGE_INTEGER AllocationSize; ULONG FileAttributes; ULONG FileNameLength; ULONG EaSize; CHAR ShortNameLength; WCHAR ShortName[12]; WCHAR FileName[1]; } RDP_FILE_BOTH_DIR_INFORMATION; typedef UNALIGNED RDP_FILE_BOTH_DIR_INFORMATION *PRDP_FILE_BOTH_DIR_INFORMATION;
typedef struct _RDP_FILE_NAMES_INFORMATION { ULONG NextEntryOffset; ULONG FileIndex; ULONG FileNameLength; WCHAR FileName[1]; } RDP_FILE_NAMES_INFORMATION; typedef UNALIGNED RDP_FILE_NAMES_INFORMATION * PRDP_FILE_NAMES_INFORMATION;
typedef struct _RDP_FILE_END_OF_FILE_INFORMATION { LARGE_INTEGER EndOfFile; } RDP_FILE_END_OF_FILE_INFORMATION; typedef UNALIGNED RDP_FILE_END_OF_FILE_INFORMATION * PRDP_FILE_END_OF_FILE_INFORMATION;
//
// File I/O Operation
// This is defined in mrx.h
//
typedef enum _RDP_LOWIO_OPS { RDP_LOWIO_OP_READ=0, RDP_LOWIO_OP_WRITE, RDP_LOWIO_OP_SHAREDLOCK, RDP_LOWIO_OP_EXCLUSIVELOCK, RDP_LOWIO_OP_UNLOCK, RDP_LOWIO_OP_UNLOCK_MULTIPLE, //LOWIO_OP_UNLOCKALLBYKEY,
RDP_LOWIO_OP_FSCTL, RDP_LOWIO_OP_IOCTL, RDP_LOWIO_OP_NOTIFY_CHANGE_DIRECTORY, RDP_LOWIO_OP_CLEAROUT, RDP_LOWIO_OP_MAXIMUM } RDP_LOWIO_OPS;
//
// File locking information
//
typedef struct _RDP_LOCK_INFO { LONG LengthLow; // Number of bytes to lock
LONG LengthHigh; LONG OffsetLow; LONG OffsetHigh; // Byte offset where lock starts
} RDP_LOCK_INFO; typedef UNALIGNED RDP_LOCK_INFO *PRDP_LOCK_INFO;
//
// Lock flags
//
#define SL_FAIL_IMMEDIATELY 0x01
#define SL_EXCLUSIVE_LOCK 0x02
typedef ULONG SECURITY_INFORMATION, *PSECURITY_INFORMATION;
//
// RDPDR_DEVICE_IOREQUEST
//
// Sent by the server to get an IO Request processed on a device
//
// IRP_MJ_CREATE
// IRP_MJ_CLEANUP
// IRP_MJ_CLOSE
// IRP_MJ_READ
// IRP_MJ_WRITE
// IRP_MJ_FLUSH_BUFFERS
// IRP_MJ_SHUTDOWN
// IRP_MJ_DEVICE_CONTROL
// IRP_MJ_INTERNAL_DEVICE_CONTROL
//
// The specific IOCTLs for serial DEVICE_CONTROL calls are:
//
// <split these in to sent and handled locally?>
// IOCTL_SERIAL_SET_BAUD_RATE
// IOCTL_SERIAL_GET_BAUD_RATE
// IOCTL_SERIAL_SET_LINE_CONTROL
// IOCTL_SERIAL_GET_LINE_CONTROL
// IOCTL_SERIAL_SET_TIMEOUTS
// IOCTL_SERIAL_GET_TIMEOUTS
// IOCTL_SERIAL_SET_CHARS
// IOCTL_SERIAL_GET_CHARS
// IOCTL_SERIAL_SET_DTR
// IOCTL_SERIAL_CLR_DTR
// IOCTL_SERIAL_RESET_DEVICE
// IOCTL_SERIAL_SET_RTS
// IOCTL_SERIAL_CLR_RTS
// IOCTL_SERIAL_SET_XOFF
// IOCTL_SERIAL_SET_XON
// IOCTL_SERIAL_SET_BREAK_ON
// IOCTL_SERIAL_SET_BREAK_OFF
// IOCTL_SERIAL_SET_QUEUE_SIZE
// IOCTL_SERIAL_GET_WAIT_MASK
// IOCTL_SERIAL_SET_WAIT_MASK
// IOCTL_SERIAL_WAIT_ON_MASK
// IOCTL_SERIAL_IMMEDIATE_CHAR
// IOCTL_SERIAL_PURGE
// IOCTL_SERIAL_GET_HANDFLOW
// IOCTL_SERIAL_SET_HANDFLOW
// IOCTL_SERIAL_GET_MODEMSTATUS
// IOCTL_SERIAL_GET_DTRRTS
// IOCTL_SERIAL_GET_COMMSTATUS
// IOCTL_SERIAL_GET_PROPERTIES
// IOCTL_SERIAL_XOFF_COUNTER
// IOCTL_SERIAL_LSRMST_INSERT
// IOCTL_SERIAL_CONFIG_SIZE
// IOCTL_SERIAL_GET_STATS
// IOCTL_SERIAL_CLEAR_STATS
//
// The specific IOCTLs for parallel DEVICE_CONTROL calls are:
//
// For IRP_MJ_DEVICE_CONTROL:
// IOCTL_PAR_QUERY_INFORMATION
// IOCTL_PAR_SET_INFORMATION
// IOCTL_PAR_QUERY_DEVICE_ID
// IOCTL_PAR_QUERY_DEVICE_ID_SIZE
// IOCTL_SERIAL_GET_TIMEOUTS
// IOCTL_SERIAL_SET_TIMEOUTS
//
// For IRP_MJ_INTERNAL_DEVICE_CONTROL:
// IOCTL_INTERNAL_GET_PARALLEL_PORT_INFO
// IOCTL_INTERNAL_PARALLEL_PORT_ALLOCATE
// IOCTL_INTERNAL_PARALLEL_CONNECT_INTERRUPT
// IOCTL_INTERNAL_PARALLEL_DISCONNECT_INTERRUPT
//
//
typedef struct tagRDPDR_DEVICE_IOREQUEST { ULONG DeviceId; // Id used in DeviceAnnounce
ULONG FileId; // Id for file on the device
ULONG CompletionId; // Id to return completion status
ULONG MajorFunction; // The IRP_MJ_XXX request
ULONG MinorFunction; // The subfunction of above, usually for SCSI
//
// The following Parameters depend on the IRP_MJ_XXX that is set
// in MajorFunction.
//
union { // IRP_MJ_CREATE
struct { ACCESS_MASK DesiredAccess; LARGE_INTEGER AllocationSize; ULONG FileAttributes; ULONG ShareAccess; ULONG Disposition; ULONG CreateOptions; ULONG PathLength; // PathLength Bytes follow
} Create;
// IRP_MJ_CLEANUP
// Sent, no structure
// IRP_MJ_CLOSE
// Sent, no structure
// IRP_MJ_READ
struct { ULONG Length; // Number of UCHARs to read
LONG OffsetLow; // Byte offset where read starts
LONG OffsetHigh; // offset is defined from the beginning of the file
// Length Bytes follow
} Read; // IRP_MJ_WRITE
struct { ULONG Length; // Number of UCHARs to write
LONG OffsetLow; // Byte offset where write starts
LONG OffsetHigh; // offset is defined from the beginning of the file
// Length Bytes follow
} Write; // IRP_MJ_FLUSH_BUFFERS
// Sent, no structure
// IRP_MJ_SHUTDOWN
// Not sent, no structure
// IRP_MJ_DEVICE_CONTROL, IRP_MJ_INTERNAL_DEVICE_CONTROL
// IRP_MJ_FILE_SYSTEM_CONTROL is collapsed into device control
// on the client side
struct { ULONG OutputBufferLength; ULONG InputBufferLength; ULONG IoControlCode; // IOCTL_XXX
// InputBufferLength Bytes follow
} DeviceIoControl; // IRP_MJ_QUERY_VOLUME_INFORMATION
struct { RDP_FS_INFORMATION_CLASS FsInformationClass; ULONG Length; // length of query buffer
} QueryVolume;
// IRP_MJ_SET_VOLUME_INFORMATION
struct { RDP_FS_INFORMATION_CLASS FsInformationClass; ULONG Length; //Length Bytes follow
} SetVolume;
// IRP_MJ_QUERY_INFORMATION
struct { RDP_FILE_INFORMATION_CLASS FileInformationClass; ULONG Length; // length of query buffer
} QueryFile;
// IRP_MJ_SET_INFORMATION
struct { RDP_FILE_INFORMATION_CLASS FileInformationClass; ULONG Length; //Length Bytes follow
} SetFile;
// IRP_MJ_QUERY_SECURITY
struct { SECURITY_INFORMATION SecurityInformation; ULONG Length; // length of query buffer
} QuerySd;
// IRP_MJ_SET_SECURITY
struct { SECURITY_INFORMATION SecurityInformation; ULONG Length; } SetSd;
// IRP_MJ_DIRECTORY_CONTROL
struct { RDP_FILE_INFORMATION_CLASS FileInformationClass; BOOLEAN InitialQuery; ULONG PathLength; ULONG Length; // length of query buffer
// PathLength Bytes follow
} QueryDir;
// IRP_MJ_DIRECTORY_CONTROL
struct { BOOLEAN WatchTree; ULONG CompletionFilter; ULONG Length; } NotifyChangeDir; // IRP_MJ_LOCK_CONTROL
struct { ULONG Operation; ULONG Flags; ULONG NumLocks; // LockInfo List follow
} Locks;
} Parameters; } RDPDR_DEVICE_IOREQUEST, *PRDPDR_DEVICE_IOREQUEST;
typedef struct tagRDPDR_IOREQUEST_PACKET { RDPDR_HEADER Header; RDPDR_DEVICE_IOREQUEST IoRequest; } RDPDR_IOREQUEST_PACKET, *PRDPDR_IOREQUEST_PACKET;
//
// RDPDR_DEVICE_IOCOMPLETION
//
// Sent by the client to indicate an I/O operation has completed
//
typedef struct tagRDPDR_DEVICE_IOCOMPLETION { ULONG DeviceId; // Given a CompletionId, is this necessary?
ULONG CompletionId; // Completion Id supplied by the request
ULONG IoStatus; // Status code
//
// The following Parameters depend on the IRP_MJ_XXX that was set
// in the MajorFunction element of the original request.
//
union { // IRP_MJ_CREATE
struct { ULONG FileId; // File to refer to in future IO operations
UCHAR Information; // Create/Open return information
} Create; // Sent, no structure
// IRP_MJ_CLEANUP
// Sent, no structure
// IRP_MJ_CLOSE
// Sent, no structure
// IRP_MJ_READ
struct { ULONG Length; // Number of UCHARs that were read
UCHAR Buffer[1]; // UCHARs that were read
} Read;
// IRP_MJ_WRITE
struct { ULONG Length; // Number of UCHARs that were written
} Write;
// IRP_MJ_FLUSH_BUFFERS
// Sent, no structure
// IRP_MJ_SHUTDOWN
// Not sent, no structure
// IRP_MJ_DEVICE_CONTROL, IRP_MJ_INTERNAL_DEVICE_CONTROL
// IRP_MJ_FILE_SYSTEM_CONTROL is collapsed into device control
// on the client side
struct { ULONG OutputBufferLength; UCHAR OutputBuffer[1]; // Depends on IOCTL_XXX
} DeviceIoControl;
// IRP_MJ_QUERY_VOLUME_INFORMATION
struct { ULONG Length; UCHAR Buffer[1]; } QueryVolume;
// IRP_MJ_SET_VOLUME_INFORMATION
struct { ULONG Length; } SetVolume;
// IRP_MJ_QUERY_INFORMATION
struct { ULONG Length; UCHAR Buffer[1]; } QueryFile;
// IRP_MJ_SET_INFORMATION
struct { ULONG Length; } SetFile;
// IRP_MJ_DIRECTORY_CONTROL
struct { ULONG Length; UCHAR Buffer[1]; } QueryDir;
// IRP_MJ_QUERY_SECURITY
struct { ULONG Length; UCHAR Buffer[1]; } QuerySd;
// IRP_MJ_SET_SECURITY
struct { ULONG Length; } SetSd;
// IRP_MJ_LOCK_CONTROL
// Sent, no structure
} Parameters;
} RDPDR_DEVICE_IOCOMPLETION, *PRDPDR_DEVICE_IOCOMPLETION;
typedef struct tagRDPDR_IOCOMPLETION_PACKET { RDPDR_HEADER Header; RDPDR_DEVICE_IOCOMPLETION IoCompletion; } RDPDR_IOCOMPLETION_PACKET, *PRDPDR_IOCOMPLETION_PACKET;
//
// RDPDRDVMGR Event Header
//
// This header prefixes all device management events.
//
typedef struct tagRDPDRDVMGR_EVENTHEADER { ULONG EventType; // Event-Type Field
ULONG EventLength; // Event-Length Field
} RDPDRDVMGR_EVENTHEADER, *PRDPDRDVMGR_EVENTHEADER;
//
// Buffer Too-Small Event
//
typedef struct tagRDPDR_BUFFERTOOSMALL { ULONG RequiredSize; // Required Size for Request to Succeed.
} RDPDR_BUFFERTOOSMALL, *PRDPDR_BUFFERTOOSMALL;
//
// This information is sent to the server from the client.
//
// It contains information about a client-attached printing device and
// is included with the RDPDR_DEVICE_ANNOUNCE struct ... following the
// rest of the RDPDR_DEVICE_ANNOUNCE struct fields.
//
typedef struct tagRDPDR_PRINTERDEVICE_ANNOUNCE { ULONG Flags; // Contain the flag bits defined below
//
ULONG CodePage; // Ansi code page to use to convert the
// ansi string to unicode.
ULONG PnPNameLen; // Length (in bytes) of PnP wide-character name
// that was discovered by the client.
ULONG DriverLen; // Length (in bytes) of driver wide-character
// name that was discovered by the client.
ULONG PrinterNameLen; // Length (in bytes) of printer wide-character
// name that was discovered by the client.
ULONG CachedFieldsLen; // This is simply printer-associated binary
// data that is stashed away on the client
// machine for the server. Note that this
// data is specific to the server that
// cached the data.
// The actual fields corresponding to the above field lengths follow this
// struct in the order that the field lengths appear in this typedef.
} RDPDR_PRINTERDEVICE_ANNOUNCE, *PRDPDR_PRINTERDEVICE_ANNOUNCE;
// RDPDR_PRINTERDEVICE_ANNOUNCE structure contains ansi strings
#define RDPDR_PRINTER_ANNOUNCE_FLAG_ANSI 0x1
// The printer being announced is the default printer on the client.
#define RDPDR_PRINTER_ANNOUNCE_FLAG_DEFAULTPRINTER 0x2
// The printer being announced is a network printer
#define RDPDR_PRINTER_ANNOUNCE_FLAG_NETWORKPRINTER 0x4
// The printer being announced is a TS redirected printer
// It means that the printer name has been rebuilt by the client
// and the name is based on the original server/client/printer names
// (the printer is going to be nested or is nested at the nth level).
#define RDPDR_PRINTER_ANNOUNCE_FLAG_TSPRINTER 0x8
#define DEVICERDR_PRINT_SERVER_NAME TEXT("PrintServerName")
#define DEVICERDR_CLIENT_NAME TEXT("ClientName")
#define DEVICERDR_PRINTER_NAME TEXT("PrinterName")
//
// cache data printer events.
//
#define RDPDR_ADD_PRINTER_EVENT 0x1
#define RDPDR_UPDATE_PRINTER_EVENT 0x2
#define RDPDR_DELETE_PRINTER_EVENT 0x3
#define RDPDR_RENAME_PRINTER_EVENT 0x4
typedef struct tagRDPDR_PRINTER_CACHEDATA_PACKET { RDPDR_HEADER Header; ULONG EventId;
//
// data structure that corresponds to the EventID will follow.
// Ex: for AddPrinter Event RDPDR_PRINTER_ADD_CACHEDATA will follow.
//
} RDPDR_PRINTER_CACHEDATA_PACKET, *PRDPDR_PRINTER_CACHEDATA_PACKET;
//
// RDPDR_PRINTER_ADD_CACHEDATA
//
// This structure is sent to the client from the server, when a new printer
// queue is manually added to the user session.
//
//
typedef struct tagRDPDR_PRINTER_ADD_CACHEDATA { UCHAR PortDosName[PREFERRED_DOS_NAME_SIZE]; // port name in ANSI format.
ULONG PnPNameLen; // Length (in bytes) of PnP wide-character name
// that was discovered by the client.
ULONG DriverLen; // Length (in bytes) of driver wide-character
// name that was discovered by the client.
ULONG PrinterNameLen; // Length (in bytes) of printer wide-character
// name that was discovered by the client.
ULONG CachedFieldsLen; // This is simply printer-associated binary
// data that is stashed away on the client
// machine for the server. Note that this
// data is specific to the server that
// cached the data.
// variable length data will follow.
} RDPDR_PRINTER_ADD_CACHEDATA, *PRDPDR_PRINTER_ADD_CACHEDATA;
//
// RDPDR_PRINTER_DELETE_CACHEDATA
//
// This structure is sent to the client from the server, when a printer
// queue is manually deleted from the user session.
//
//
typedef struct tagRDPDR_PRINTER_DELETE_CACHEDATA { ULONG PrinterNameLen; // Length (in bytes) of printer wide-character
// name.
// string data will follow.
} RDPDR_PRINTER_DELETE_CACHEDATA, *PRDPDR_PRINTER_DELETE_CACHEDATA;
//
// RDPDR_PRINTER_RENAME_CACHEDATA
//
// This structure is sent to the client from the server, when a printer
// queue is manually renamed from the user session.
//
//
typedef struct tagRDPDR_PRINTER_RENAME_CACHEDATA { ULONG OldPrinterNameLen; // Length (in bytes) of printer
// wide-character name.
ULONG NewPrinterNameLen; // Length (in bytes) of printer
// wide-character name.
// string data will follow.
} RDPDR_PRINTER_RENAME_CACHEDATA, *PRDPDR_PRINTER_RENAME_CACHEDATA;
//
// RDPDR_PRINTER_UPDATE_CACHEDATA
//
// This structure is sent to the client from the server, when the printer
// configuration is modified.
//
//
typedef struct tagRDPDR_PRINTER_UPDATE_CACHEDATA { ULONG PrinterNameLen; // Length (in bytes) of printer wide-character
// name.
ULONG ConfigDataLen; // Length of the cache data that will
// follow the printer name.
// string data will follow.
} RDPDR_PRINTER_UPDATE_CACHEDATA, *PRDPDR_PRINTER_UPDATE_CACHEDATA;
//
// Printer device "subclass" of RDPDR_DEVICE_ANNOUNCE.
// This message is sent from the kernel-mode "dr" to the user-mode
// "dr" so the user-mode "dr" can install a printer.
//
typedef struct tagRDPDR_PRINTERDEVICE_SUB { WCHAR portName[RDPDR_MAXPORTNAMELEN]; WCHAR clientName[RDPDR_MAX_COMPUTER_NAME_LENGTH]; RDPDR_DEVICE_ANNOUNCE deviceFields; RDPDR_PRINTERDEVICE_ANNOUNCE clientPrinterFields; } RDPDR_PRINTERDEVICE_SUB, *PRDPDR_PRINTERDEVICE_SUB;
//
// Drive device "subclass" of RDPDR_DEVICE_ANNOUNCE.
// This message is sent from the kernel-mode "dr" to the user-mode
// "dr" so the user-mode "dr" can create a UNC connection.
//
typedef struct tagRDPDR_DRIVEDEVICE_SUB { WCHAR driveName[RDPDR_MAXPORTNAMELEN]; WCHAR clientName[RDPDR_MAX_COMPUTER_NAME_LENGTH]; RDPDR_DEVICE_ANNOUNCE deviceFields; WCHAR clientDisplayName[RDPDR_MAX_CLIENT_DISPLAY_NAME]; } RDPDR_DRIVEDEVICE_SUB, *PRDPDR_DRIVEDEVICE_SUB;
//
// Indicate to the user-mode component that a device has been removed.
//
typedef struct tagRDPDR_REMOVEDEVICE { ULONG deviceID; } RDPDR_REMOVEDEVICE, *PRDPDR_REMOVEDEVICE;
//
// Port device "subclass" of RDPDR_DEVICE_ANNOUNCE. This message is
// sent from the kernel-mode "dr" to the user-mode "dr" so the user-mode
// "dr" can install a port.
//
typedef struct tagRDPDR_PORTDEVICE_SUB { WCHAR portName[RDPDR_MAXPORTNAMELEN]; WCHAR devicePath[RDPDRMAXNTDEVICENAMEGLEN]; RDPDR_DEVICE_ANNOUNCE deviceFields; } RDPDR_PORTDEVICE_SUB, *PRDPDR_PORTDEVICE_SUB;
//
// Restore packing style (previous for 32-bit, default for 16-bit).
//
#ifdef OS_WIN16
#pragma pack ()
#else
#pragma pack (pop, drpack)
#endif
#ifdef __cplusplus
} #endif // __cplusplus
#endif // RDPDR
|