/// <summary> /// Send sqos request and receive sqos response /// </summary> /// <param name="request">The sqos request packet</param> /// <param name="response">The sqos response packet</param> /// <returns>Status of the sqos response</returns> public uint SendAndReceiveSqosPacket(SqosRequestPacket request, out SqosResponsePacket response) { transport.SendIoctlPayload(CtlCode_Values.FSCTL_STORAGE_QOS_CONTROL, request.ToBytes()); uint smb2Status; byte[] payload; transport.ExpectIoctlPayload(out smb2Status, out payload); if (smb2Status != Smb2Status.STATUS_SUCCESS || payload == null) { response = null; return(smb2Status); } response = new SqosResponsePacket(); STORAGE_QOS_CONTROL_Header responseHeader = TypeMarshal.ToStruct <STORAGE_QOS_CONTROL_Header>(payload); // Parse the header first to decode the ProtocolVersion field. if (responseHeader.ProtocolVersion == (ushort)SQOS_PROTOCOL_VERSION.Sqos10) { response.FromBytes(SqosResponseType.V10, payload); } else if (responseHeader.ProtocolVersion == (ushort)SQOS_PROTOCOL_VERSION.Sqos11) { response.FromBytes(SqosResponseType.V11, payload); } return(smb2Status); }
/// <summary> /// Unmarshal the packet from a byte array to the response structure based on the response type. /// </summary> public void FromBytes(SqosResponseType type, byte[] payload) { if (type == SqosResponseType.V10) { STORAGE_QOS_CONTROL_Response_V10 sqosResponseV10 = TypeMarshal.ToStruct <STORAGE_QOS_CONTROL_Response_V10>(payload); Header = sqosResponseV10.Header; TimeToLive = sqosResponseV10.TimeToLive; Status = sqosResponseV10.Status; MaximumIoRate = sqosResponseV10.MaximumIoRate; MinimumIoRate = sqosResponseV10.MinimumIoRate; BaseIoSize = sqosResponseV10.BaseIoSize; } else if (type == SqosResponseType.V11) { STORAGE_QOS_CONTROL_Response_V11 sqosResponseV11 = TypeMarshal.ToStruct <STORAGE_QOS_CONTROL_Response_V11>(payload); Header = sqosResponseV11.Header; TimeToLive = sqosResponseV11.TimeToLive; Status = sqosResponseV11.Status; MaximumIoRate = sqosResponseV11.MaximumIoRate; MinimumIoRate = sqosResponseV11.MinimumIoRate; MaximumBandwidth = sqosResponseV11.MaximumBandwidth; BaseIoSize = sqosResponseV11.BaseIoSize; } }
/// <summary> /// Unmarshal the packet from a byte array to the response structure based on the response type. /// </summary> public void FromBytes(SqosResponseType type, byte[] payload) { if (type == SqosResponseType.V10) { STORAGE_QOS_CONTROL_Response_V10 sqosResponseV10 = TypeMarshal.ToStruct<STORAGE_QOS_CONTROL_Response_V10>(payload); Header = sqosResponseV10.Header; TimeToLive = sqosResponseV10.TimeToLive; Status = sqosResponseV10.Status; MaximumIoRate = sqosResponseV10.MaximumIoRate; MinimumIoRate = sqosResponseV10.MinimumIoRate; BaseIoSize = sqosResponseV10.BaseIoSize; } else if (type == SqosResponseType.V11) { STORAGE_QOS_CONTROL_Response_V11 sqosResponseV11 = TypeMarshal.ToStruct<STORAGE_QOS_CONTROL_Response_V11>(payload); Header = sqosResponseV11.Header; TimeToLive = sqosResponseV11.TimeToLive; Status = sqosResponseV11.Status; MaximumIoRate = sqosResponseV11.MaximumIoRate; MinimumIoRate = sqosResponseV11.MinimumIoRate; MaximumBandwidth = sqosResponseV11.MaximumBandwidth; BaseIoSize = sqosResponseV11.BaseIoSize; } }