private AlpcSendMessageAttributes CreateFromParts() { var attrs = new AlpcSendMessageAttributes(); if (Object.Length > 0) { attrs.AddHandles(Object); } if (Handle.Length > 0) { attrs.AddHandles(Handle); } if (WorkOnBehalfOf) { attrs.Add(new AlpcWorkOnBehalfMessageAttribute()); } if (DataView != null) { attrs.Add(DataView.ToMessageAttribute()); } if (SecurityQualityOfService != null) { attrs.Add(AlpcSecurityMessageAttribute.CreateHandleAttribute(SecurityQualityOfService)); } else if (SecurityContext != null) { attrs.Add(SecurityContext.ToMessageAttribute()); } return(attrs); }
private RpcClientResponse SendAndReceiveImmediate(int proc_num, Guid objuuid, byte[] ndr_buffer, IReadOnlyCollection <NtObject> handles) { 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 (objuuid != Guid.Empty) { req_msg.ObjectUuid = objuuid; req_msg.Flags |= LRPC_REQUEST_MESSAGE_FLAGS.ObjectUuid; } AlpcMessageType <LRPC_IMMEDIATE_REQUEST_MESSAGE> send_msg = new AlpcMessageType <LRPC_IMMEDIATE_REQUEST_MESSAGE>(req_msg, ndr_buffer); AlpcMessageRaw resp_msg = new AlpcMessageRaw(0x1000); AlpcSendMessageAttributes send_attr = new AlpcSendMessageAttributes(); if (handles.Count > 0) { send_attr.AddHandles(handles); } using (AlpcReceiveMessageAttributes recv_attr = new AlpcReceiveMessageAttributes()) { _client.SendReceive(AlpcMessageFlags.SyncRequest, send_msg, send_attr, resp_msg, recv_attr, NtWaitTimeout.Infinite); RpcClientResponse response = HandleResponse(resp_msg, recv_attr, req_msg.CallId); ClearAttributes(resp_msg, recv_attr); return(response); } }
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); } }
private RpcClientResponse SendAndReceiveLarge(int proc_num, Guid objuuid, byte[] ndr_buffer, IReadOnlyCollection <NtObject> handles) { 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 = ndr_buffer.Length, Flags = LRPC_REQUEST_MESSAGE_FLAGS.ViewPresent }; if (objuuid != Guid.Empty) { req_msg.ObjectUuid = objuuid; 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 (handles.Count > 0) { send_attr.AddHandles(handles); } using (var port_section = _client.CreatePortSection(AlpcCreatePortSectionFlags.Secure, ndr_buffer.Length)) { using (var data_view = port_section.CreateSectionView(AlpcDataViewAttrFlags.Secure | AlpcDataViewAttrFlags.AutoRelease, ndr_buffer.Length)) { data_view.WriteBytes(ndr_buffer); send_attr.Add(data_view.ToMessageAttribute()); using (var recv_attr = new AlpcReceiveMessageAttributes()) { RpcUtils.DumpBuffer(true, "ALPC Request Large", send_msg); _client.SendReceive(AlpcMessageFlags.SyncRequest, send_msg, send_attr, recv_msg, recv_attr, NtWaitTimeout.Infinite); RpcUtils.DumpBuffer(true, "ALPC Response Large", recv_msg); RpcClientResponse response = HandleResponse(recv_msg, recv_attr, req_msg.CallId); ClearAttributes(recv_msg, recv_attr); return(response); } } } }
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); } } } }