windows-nt/Source/XPSP1/NT/public/internal/termsrv/inc/rdpdr.h
2020-09-26 16:20:57 +08:00

1535 lines
50 KiB
C

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