Пример #1
0
        private DR_CORE_CAPABILITY_REQ CreateServerCoreCapabilityRequest()
        {
            DR_CORE_CAPABILITY_REQ req = new DR_CORE_CAPABILITY_REQ();

            req.numCapabilities = 5;
            List <CAPABILITY_SET> capabilitySet = new List <CAPABILITY_SET>();

            GENERAL_CAPS_SET generalCapability = new GENERAL_CAPS_SET(CAPABILITY_VERSION.V1);

            generalCapability.osType               = osType_Values.OS_TYPE_UNKNOWN;
            generalCapability.osVersion            = osVersion_Values.V1;
            generalCapability.protocolMinorVersion = DR_CORE_SERVER_CLIENTID_CONFIRM_VersionMinor_Values.V1;
            generalCapability.ioCode1              = (ioCode1_Values)0x0000FFFF;
            generalCapability.extendedPDU          = extendedPDU_Values.RDPDR_DEVICE_REMOVE_PDUS | extendedPDU_Values.RDPDR_CLIENT_DISPLAY_NAME_PDU;
            generalCapability.SpecialTypeDeviceCap = 2;
            capabilitySet.Add(generalCapability);

            capabilitySet.Add(new PRINTER_CAPS_SET());

            capabilitySet.Add(new PORT_CAPS_SET());

            capabilitySet.Add(new DRIVE_CAPS_SET());

            capabilitySet.Add(new SMARTCARD_CAPS_SET());

            req.CapabilityMessage = capabilitySet.ToArray();
            return(req);
        }
        /// <summary>
        /// Encode Server Core Capability Request packet.
        /// </summary>
        /// <param name="packet">Server Core Capability Request packet.</param>
        /// <returns>Encoded byte array.</returns>
        public static byte[] EncodeServerCoreCapabilityRequest(DR_CORE_CAPABILITY_REQ packet)
        {
            List <byte> buffer = new List <byte>();

            EncodeStructure(buffer, (ushort)packet.Header.Component);
            EncodeStructure(buffer, (ushort)packet.Header.PacketId);
            EncodeStructure(buffer, packet.numCapabilities);
            EncodeStructure(buffer, packet.Padding);

            if (packet.CapabilityMessage != null)
            {
                foreach (CAPABILITY_SET capability in packet.CapabilityMessage)
                {
                    if (capability is GENERAL_CAPS_SET)
                    {
                        GENERAL_CAPS_SET generalCapability = capability as GENERAL_CAPS_SET;
                        EncodeStructure(buffer, (ushort)generalCapability.Header.CapabilityType);
                        EncodeStructure(buffer, (ushort)generalCapability.Header.CapabilityLength);
                        EncodeStructure(buffer, (uint)generalCapability.Header.Version);
                        EncodeStructure(buffer, (uint)generalCapability.osType);
                        EncodeStructure(buffer, (uint)generalCapability.osVersion);
                        EncodeStructure(buffer, (ushort)generalCapability.protocolMajorVersion);
                        EncodeStructure(buffer, (ushort)generalCapability.protocolMinorVersion);
                        EncodeStructure(buffer, (uint)generalCapability.ioCode1);
                        EncodeStructure(buffer, (uint)generalCapability.ioCode2);
                        EncodeStructure(buffer, (uint)generalCapability.extendedPDU);
                        EncodeStructure(buffer, (uint)generalCapability.extraFlags1);
                        EncodeStructure(buffer, (uint)generalCapability.extraFlags2);
                        EncodeStructure(buffer, (uint)generalCapability.SpecialTypeDeviceCap);
                    }
                    else
                    {
                        EncodeStructure(buffer, (ushort)capability.Header.CapabilityType);
                        EncodeStructure(buffer, (ushort)capability.Header.CapabilityLength);
                        EncodeStructure(buffer, (uint)capability.Header.Version);
                    }
                }
            }

            return(buffer.ToArray());
        }
        /// <summary>
        /// Create Server Core Capability Request packet.
        /// </summary>
        /// <returns>Server Core Capability Request packet.</returns>
        public static DR_CORE_CAPABILITY_REQ CreateServerCoreCapabilityRequest()
        {
            DR_CORE_CAPABILITY_REQ request = new DR_CORE_CAPABILITY_REQ();

            request.Header           = new RDPDR_HEADER();
            request.Header.Component = Component_Values.RDPDR_CTYP_CORE;
            request.Header.PacketId  = PacketId_Values.PAKID_CORE_SERVER_CAPABILITY;
            request.numCapabilities  = 5;
            request.Padding          = 0;

            List <CAPABILITY_SET> capabilitySet = new List <CAPABILITY_SET>();

            GENERAL_CAPS_SET generalCapability = new GENERAL_CAPS_SET();

            generalCapability.Header = new CAPABILITY_HEADER();
            generalCapability.Header.CapabilityType   = CapabilityType_Values.CAP_GENERAL_TYPE;
            generalCapability.Header.CapabilityLength = 44;
            generalCapability.Header.Version          = CAPABILITY_VERSION.V1;
            generalCapability.osType               = osType_Values.OS_TYPE_UNKNOWN;
            generalCapability.osVersion            = osVersion_Values.V1;
            generalCapability.protocolMajorVersion = protocolMajorVersion_Values.V1;
            generalCapability.protocolMinorVersion = 0x000C;
            generalCapability.ioCode1              = (ioCode1_Values)0x0000FFFF;
            generalCapability.ioCode2              = ioCode2_Values.V1;
            generalCapability.extendedPDU          = extendedPDU_Values.RDPDR_DEVICE_REMOVE_PDUS | extendedPDU_Values.RDPDR_CLIENT_DISPLAY_NAME_PDU;
            generalCapability.extraFlags1          = extraFlags1_Values.ENABLE_ASYNCIO;
            generalCapability.extraFlags2          = extraFlags2_Values.V1;
            generalCapability.SpecialTypeDeviceCap = 2;
            capabilitySet.Add(generalCapability);

            PRINTER_CAPS_SET printerCapability = new PRINTER_CAPS_SET();

            printerCapability.Header = new CAPABILITY_HEADER();
            printerCapability.Header.CapabilityType   = CapabilityType_Values.CAP_PRINTER_TYPE;
            printerCapability.Header.CapabilityLength = 8;
            printerCapability.Header.Version          = CAPABILITY_VERSION.V1;
            capabilitySet.Add(printerCapability);


            PORT_CAPS_SET portCapability = new PORT_CAPS_SET();

            portCapability.Header = new CAPABILITY_HEADER();
            portCapability.Header.CapabilityType   = CapabilityType_Values.CAP_PORT_TYPE;
            portCapability.Header.CapabilityLength = 8;
            portCapability.Header.Version          = CAPABILITY_VERSION.V1;
            capabilitySet.Add(portCapability);

            DRIVE_CAPS_SET driveCapability = new DRIVE_CAPS_SET();

            driveCapability.Header = new CAPABILITY_HEADER();
            driveCapability.Header.CapabilityType   = CapabilityType_Values.CAP_DRIVE_TYPE;
            driveCapability.Header.CapabilityLength = 8;
            driveCapability.Header.Version          = CAPABILITY_VERSION.V2;
            capabilitySet.Add(driveCapability);

            SMARTCARD_CAPS_SET smartcardCapability = new SMARTCARD_CAPS_SET();

            smartcardCapability.Header = new CAPABILITY_HEADER();
            smartcardCapability.Header.CapabilityType   = CapabilityType_Values.CAP_SMARTCARD_TYPE;
            smartcardCapability.Header.CapabilityLength = 8;
            smartcardCapability.Header.Version          = CAPABILITY_VERSION.V1;
            capabilitySet.Add(smartcardCapability);

            request.CapabilityMessage = capabilitySet.ToArray();
            return(request);
        }
        /// <summary>
        /// Decode Client Core Capability Response packet
        /// </summary>
        /// <param name="data">Packet data</param>
        /// <returns>Client Core Capability Response packet</returns>
        public static DR_CORE_CAPABILITY_RSP DecodeClientCoreCapabilityRSP(byte[] data)
        {
            int index = 0;
            DR_CORE_CAPABILITY_RSP packet = new DR_CORE_CAPABILITY_RSP();

            packet.Header          = DecodeRdpdrHeader(data, ref index, false);
            packet.numCapabilities = ParseUInt16(data, ref index, false);
            packet.Padding         = ParseUInt16(data, ref index, false);

            List <CAPABILITY_SET> capbilityList = new List <CAPABILITY_SET>();

            while (index + 8 <= data.Length)
            {
                CAPABILITY_HEADER header = DecodeCapabilityHeader(data, ref index, false);
                if (header.CapabilityType == CapabilityType_Values.CAP_GENERAL_TYPE)
                {
                    int originalIndex       = index;
                    GENERAL_CAPS_SET capSet = new GENERAL_CAPS_SET();
                    capSet.Header               = header;
                    capSet.osType               = (osType_Values)ParseUInt32(data, ref index, false);
                    capSet.osVersion            = (osVersion_Values)ParseUInt32(data, ref index, false);
                    capSet.protocolMajorVersion = (protocolMajorVersion_Values)ParseUInt16(data, ref index, false);
                    capSet.protocolMinorVersion = ParseUInt16(data, ref index, false);
                    capSet.ioCode1              = (ioCode1_Values)ParseUInt32(data, ref index, false);
                    capSet.ioCode2              = (ioCode2_Values)ParseUInt32(data, ref index, false);
                    capSet.extendedPDU          = (extendedPDU_Values)ParseUInt32(data, ref index, false);
                    capSet.extraFlags1          = (extraFlags1_Values)ParseUInt32(data, ref index, false);
                    capSet.extraFlags2          = (extraFlags2_Values)ParseUInt32(data, ref index, false);
                    capSet.SpecialTypeDeviceCap = ParseUInt32(data, ref index, false);
                    index = originalIndex + header.CapabilityLength;
                    capbilityList.Add(capSet);
                }
                else if (header.CapabilityType == CapabilityType_Values.CAP_PRINTER_TYPE)
                {
                    PRINTER_CAPS_SET capSet = new PRINTER_CAPS_SET();
                    capSet.Header = header;
                    capbilityList.Add(capSet);
                }
                else if (header.CapabilityType == CapabilityType_Values.CAP_DRIVE_TYPE)
                {
                    DRIVE_CAPS_SET capSet = new DRIVE_CAPS_SET();
                    capSet.Header = header;
                    capbilityList.Add(capSet);
                }
                else if (header.CapabilityType == CapabilityType_Values.CAP_PORT_TYPE)
                {
                    PORT_CAPS_SET capSet = new PORT_CAPS_SET();
                    capSet.Header = header;
                    capbilityList.Add(capSet);
                }
                else if (header.CapabilityType == CapabilityType_Values.CAP_SMARTCARD_TYPE)
                {
                    SMARTCARD_CAPS_SET capSet = new SMARTCARD_CAPS_SET();
                    capSet.Header = header;
                    capbilityList.Add(capSet);
                }
                else
                {
                    return(null);
                }
            }
            packet.CapabilityMessage = capbilityList.ToArray();

            return(packet);
        }