Пример #1
0
        /// <summary>
        /// Send and receive an RPC message.
        /// </summary>
        /// <param name="proc_num">The procedure number.</param>
        /// <param name="ndr_buffer">Marshal NDR buffer for the call.</param>
        /// <returns>Unmarshal NDR buffer for the result.</returns>
        public NdrUnmarshalBuffer SendReceive(int proc_num, NdrMarshalBuffer ndr_buffer)
        {
            var response = SendReceive(proc_num, ndr_buffer.DataRepresentation,
                                       ndr_buffer.ToArray(), ndr_buffer.Handles);

            return(new NdrUnmarshalBuffer(response.NdrBuffer, response.Handles, response.DataRepresentation));
        }
Пример #2
0
        private NdrUnmarshalBuffer SendAndReceiveImmediate(int proc_num, NdrMarshalBuffer ndr_buffer, byte[] buffer)
        {
            LRPC_IMMEDIATE_REQUEST_MESSAGE req_msg = new LRPC_IMMEDIATE_REQUEST_MESSAGE()
            {
                Header    = new LRPC_HEADER(LRPC_MESSAGE_TYPE.lmtRequest),
                BindingId = 0,
                CallId    = CallId++,
                ProcNum   = proc_num,
            };

            if (ObjectUuid != Guid.Empty)
            {
                req_msg.ObjectUuid = ObjectUuid;
                req_msg.Flags     |= LRPC_REQUEST_MESSAGE_FLAGS.ObjectUuid;
            }

            AlpcMessageType <LRPC_IMMEDIATE_REQUEST_MESSAGE> send_msg = new AlpcMessageType <LRPC_IMMEDIATE_REQUEST_MESSAGE>(req_msg, buffer);
            AlpcMessageRaw            resp_msg  = new AlpcMessageRaw(0x1000);
            AlpcSendMessageAttributes send_attr = new AlpcSendMessageAttributes();

            if (ndr_buffer.Handles.Count > 0)
            {
                send_attr.AddHandles(ndr_buffer.Handles);
            }

            using (AlpcReceiveMessageAttributes recv_attr = new AlpcReceiveMessageAttributes())
            {
                _client.SendReceive(AlpcMessageFlags.SyncRequest, send_msg, send_attr, resp_msg, recv_attr, NtWaitTimeout.Infinite);
                NdrUnmarshalBuffer unmarshal = HandleResponse(resp_msg, recv_attr, req_msg.CallId);
                ClearAttributes(resp_msg, recv_attr);
                return(unmarshal);
            }
        }
Пример #3
0
        /// <summary>
        /// Send and receive an RPC message.
        /// </summary>
        /// <param name="proc_num">The procedure number.</param>
        /// <param name="ndr_buffer">Marshal NDR buffer for the call.</param>
        /// <returns>Unmarshal NDR buffer for the result.</returns>
        protected NdrUnmarshalBuffer SendReceive(int proc_num, NdrMarshalBuffer ndr_buffer)
        {
            if (!Connected)
            {
                throw new InvalidOperationException("RPC client is not connected.");
            }

            byte[] buffer = ndr_buffer.ToArray();
            if (buffer.Length > 0xF00)
            {
                return(SendAndReceiveLarge(proc_num, ndr_buffer, buffer));
            }
            return(SendAndReceiveImmediate(proc_num, ndr_buffer, buffer));
        }
        public uint PrivGetPsmToken(int p0, int p1, string p2, string p3, out NtApiDotNet.NtToken p4, out int p5)
        {
            NdrMarshalBuffer m = new NdrMarshalBuffer();

            m.WriteInt32(p0);
            m.WriteInt32(p1);
            m.WriteTerminatedString(RpcUtils.CheckNull(p2, "p2"));
            m.WriteTerminatedString(RpcUtils.CheckNull(p3, "p3"));
            var resp             = SendReceive(21, m.DataRepresentation, m.ToArray(), m.Handles);
            NdrUnmarshalBuffer u = new NdrUnmarshalBuffer(resp.NdrBuffer, resp.Handles, resp.DataRepresentation);

            p4 = u.ReadSystemHandle <NtApiDotNet.NtToken>();
            p5 = u.ReadInt32();
            return(u.ReadUInt32());
        }
Пример #5
0
        private NdrUnmarshalBuffer SendAndReceiveLarge(int proc_num, NdrMarshalBuffer ndr_buffer, byte[] buffer)
        {
            LRPC_LARGE_REQUEST_MESSAGE req_msg = new LRPC_LARGE_REQUEST_MESSAGE()
            {
                Header        = new LRPC_HEADER(LRPC_MESSAGE_TYPE.lmtRequest),
                BindingId     = 0,
                CallId        = CallId++,
                ProcNum       = proc_num,
                LargeDataSize = buffer.Length,
                Flags         = LRPC_REQUEST_MESSAGE_FLAGS.ViewPresent
            };

            if (ObjectUuid != Guid.Empty)
            {
                req_msg.ObjectUuid = ObjectUuid;
                req_msg.Flags     |= LRPC_REQUEST_MESSAGE_FLAGS.ObjectUuid;
            }

            var send_msg  = new AlpcMessageType <LRPC_LARGE_REQUEST_MESSAGE>(req_msg);
            var recv_msg  = new AlpcMessageRaw(0x1000);
            var send_attr = new AlpcSendMessageAttributes();

            if (ndr_buffer.Handles.Count > 0)
            {
                send_attr.AddHandles(ndr_buffer.Handles);
            }

            using (var port_section = _client.CreatePortSection(AlpcCreatePortSectionFlags.Secure, buffer.Length))
            {
                using (var data_view = port_section.CreateSectionView(AlpcDataViewAttrFlags.Secure | AlpcDataViewAttrFlags.AutoRelease, buffer.Length))
                {
                    data_view.WriteBytes(buffer);
                    send_attr.Add(data_view.ToMessageAttribute());
                    using (var recv_attr = new AlpcReceiveMessageAttributes())
                    {
                        _client.SendReceive(AlpcMessageFlags.SyncRequest, send_msg, send_attr, recv_msg, recv_attr, NtWaitTimeout.Infinite);
                        NdrUnmarshalBuffer unmarshal = HandleResponse(recv_msg, recv_attr, req_msg.CallId);
                        ClearAttributes(recv_msg, recv_attr);
                        return(unmarshal);
                    }
                }
            }
        }
Пример #6
0
 void INdrStructure.Marshal(NdrMarshalBuffer m)
 {
     throw new NotImplementedException();
 }
Пример #7
0
 void INdrNonEncapsulatedUnion.Marshal(NdrMarshalBuffer m, long l)
 {
     throw new NotImplementedException();
 }
Пример #8
0
 /// <summary>
 /// Send and receive an RPC message.
 /// </summary>
 /// <param name="proc_num">The procedure number.</param>
 /// <param name="ndr_buffer">Marshal NDR buffer for the call.</param>
 /// <returns>Unmarshal NDR buffer for the result.</returns>
 new public NdrUnmarshalBuffer SendReceive(int proc_num, NdrMarshalBuffer ndr_buffer)
 {
     return(base.SendReceive(proc_num, ndr_buffer));
 }