/// <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)); }
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); } }
/// <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()); }
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); } } } }
void INdrStructure.Marshal(NdrMarshalBuffer m) { throw new NotImplementedException(); }
void INdrNonEncapsulatedUnion.Marshal(NdrMarshalBuffer m, long l) { throw new NotImplementedException(); }
/// <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)); }