public Smb2IOCtlResponsePacket CreateIOCtlResponse(
            Smb2Endpoint endpoint,
            ulong messageId,
            byte[] input,
            byte[] output
            )
        {
            Smb2IOCtlResponsePacket packet = new Smb2IOCtlResponsePacket();

            Smb2IOCtlRequestPacket requestPacket = context.FindRequestPacket(endpoint.EndpointId, messageId)
                as Smb2IOCtlRequestPacket;

            SetHeader(packet, endpoint, messageId);

            packet.PayLoad.CtlCode = (uint)requestPacket.PayLoad.CtlCode;
            packet.PayLoad.FileId = requestPacket.PayLoad.FileId;
            packet.PayLoad.Flags = IOCTL_Response_Flags_Values.V1;

            int bufferLen = 0;

            if (input != null)
            {
                packet.PayLoad.InputCount = (uint)input.Length;
                packet.PayLoad.InputOffset = Smb2Consts.InputOffsetInIOCtlResponse;
                bufferLen += Smb2Utility.AlignBy8Bytes(input.Length);
            }

            if (output != null)
            {
                packet.PayLoad.OutputCount = (uint)output.Length;
                packet.PayLoad.OutputOffset = (uint)(Smb2Consts.InputOffsetInIOCtlResponse + bufferLen);
                bufferLen += output.Length;
            }

            byte[] buffer = new byte[bufferLen];

            if (input != null)
            {
                Array.Copy(input, buffer, input.Length);
            }

            if (output != null)
            {
                Array.Copy(output, 0, buffer, packet.PayLoad.OutputOffset - Smb2Consts.InputOffsetInIOCtlResponse,
                    output.Length);
            }

            packet.PayLoad.Reserved = IOCTL_Response_Reserved_Values.V1;
            packet.PayLoad.Reserved2 = IOCTL_Response_Reserved2_Values.V1;
            packet.PayLoad.StructureSize = IOCTL_Response_StructureSize_Values.V1;
            packet.PayLoad.Buffer = buffer;

            packet.Sign();

            return packet;
        }