Ejemplo n.º 1
0
        public static List <ResponsePDU> GetRPCResponse(RequestPDU requestPDU, RemoteService service, int maxTransmitFragmentSize)
        {
            byte[]             responseBytes    = service.GetResponseBytes(requestPDU.OpNum, requestPDU.Data);
            int                offset           = 0;
            List <ResponsePDU> result           = new List <ResponsePDU>();
            int                maxPDUDataLength = maxTransmitFragmentSize - RPCPDU.CommonFieldsLength - ResponsePDU.ResponseFieldsLength;

            do
            {
                ResponsePDU responsePDU   = new ResponsePDU();
                int         pduDataLength = Math.Min(responseBytes.Length - offset, maxPDUDataLength);
                responsePDU.DataRepresentation = requestPDU.DataRepresentation;
                responsePDU.CallID             = requestPDU.CallID;
                responsePDU.AllocationHint     = (uint)(responseBytes.Length - offset);
                responsePDU.Data = ByteReader.ReadBytes(responseBytes, offset, pduDataLength);
                if (offset == 0)
                {
                    responsePDU.Flags |= PacketFlags.FirstFragment;
                }
                if (offset + pduDataLength == responseBytes.Length)
                {
                    responsePDU.Flags |= PacketFlags.LastFragment;
                }
                result.Add(responsePDU);
                offset += pduDataLength;
            }while (offset < responseBytes.Length);

            return(result);
        }
Ejemplo n.º 2
0
        private static ResponsePDU GetRPCResponse(RequestPDU requestPDU, RemoteService service)
        {
            ResponsePDU responsePDU = new ResponsePDU();

            PrepareReply(responsePDU, requestPDU);
            responsePDU.Data = service.GetResponseBytes(requestPDU.OpNum, requestPDU.Data);
            return(responsePDU);
        }
Ejemplo n.º 3
0
        public static List <RPCPDU> GetRPCResponse(RequestPDU requestPDU, RemoteService service, int maxTransmitFragmentSize)
        {
            List <RPCPDU> result = new List <RPCPDU>();

            byte[] responseBytes;
            try
            {
                responseBytes = service.GetResponseBytes(requestPDU.OpNum, requestPDU.Data);
            }
            catch (UnsupportedOpNumException)
            {
                FaultPDU faultPDU = new FaultPDU
                {
                    Flags = PacketFlags.FirstFragment | PacketFlags.LastFragment | PacketFlags.DidNotExecute,
                    DataRepresentation = requestPDU.DataRepresentation,
                    CallID             = requestPDU.CallID,
                    AllocationHint     = RPCPDU.CommonFieldsLength + FaultPDU.FaultFieldsLength,
                    // Windows will return either nca_s_fault_ndr or nca_op_rng_error.
                    Status = FaultStatus.OpRangeError
                };
                result.Add(faultPDU);
                return(result);
            }

            int offset           = 0;
            int maxPDUDataLength = maxTransmitFragmentSize - RPCPDU.CommonFieldsLength - ResponsePDU.ResponseFieldsLength;

            do
            {
                ResponsePDU responsePDU   = new ResponsePDU();
                int         pduDataLength = Math.Min(responseBytes.Length - offset, maxPDUDataLength);
                responsePDU.DataRepresentation = requestPDU.DataRepresentation;
                responsePDU.CallID             = requestPDU.CallID;
                responsePDU.AllocationHint     = (uint)(responseBytes.Length - offset);
                responsePDU.Data = ByteReader.ReadBytes(responseBytes, offset, pduDataLength);
                if (offset == 0)
                {
                    responsePDU.Flags |= PacketFlags.FirstFragment;
                }
                if (offset + pduDataLength == responseBytes.Length)
                {
                    responsePDU.Flags |= PacketFlags.LastFragment;
                }
                result.Add(responsePDU);
                offset += pduDataLength;
            }while (offset < responseBytes.Length);

            return(result);
        }