/// <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>
        /// 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);
        }
        /// <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;
        }