/// <summary> /// Sends a message as an array of bytes and retrieves the response from the server, if /// AuthenticateAs() has not been called, the client will authenticate as Anonymous. /// </summary> public byte[] Execute(byte[] input) { if (!_authenticated) { RpcTrace.Warning("AuthenticateAs was not called, assuming Anonymous."); AuthenticateAs(Anonymous); } RpcTrace.Verbose("ExplicitBytesExecute(byte[{0}])", input.Length); return(InvokeRpc(_handle, IID, input)); }
private RPC_CALL_ATTRIBUTES_V2 GetCallInfo() { if (_callAttrs.Version != 0) { return(_callAttrs); } var attrs = new RPC_CALL_ATTRIBUTES_V2 { Version = 2, Flags = RPC_CALL_ATTRIBUTES_FLAGS.RPC_QUERY_NO_AUTH_REQUIRED }; RPC_STATUS err = NativeMethods.RpcServerInqCallAttributes(_clientHandle, ref attrs); if (err == RPC_STATUS.RPC_S_INVALID_ARG) //may not support v2 on early edditions of XP/SP3 { attrs.Version = 1; err = NativeMethods.RpcServerInqCallAttributes(_clientHandle, ref attrs); } if (err == RPC_STATUS.RPC_S_OK) { _callAttrs = attrs; _isAuthenticated = false; attrs.Flags = RPC_CALL_ATTRIBUTES_FLAGS.RPC_QUERY_IS_CLIENT_LOCAL | RPC_CALL_ATTRIBUTES_FLAGS.RPC_QUERY_NO_AUTH_REQUIRED; if ((err = NativeMethods.RpcServerInqCallAttributes(_clientHandle, ref attrs)) == RPC_STATUS.RPC_S_OK) { _callAttrs.IsClientLocal = attrs.IsClientLocal; if (_callAttrs.ProtocolSequence == RpcProtoseqType.LRPC) { attrs.Flags = RPC_CALL_ATTRIBUTES_FLAGS.RPC_QUERY_CLIENT_PID; if ((err = NativeMethods.RpcServerInqCallAttributes(_clientHandle, ref attrs)) == RPC_STATUS.RPC_S_OK) { _callAttrs.ClientPID = attrs.ClientPID; } } } if (_callAttrs.ProtocolSequence != RpcProtoseqType.LRPC) { using (Ptr <byte[]> callerAddress = new Ptr <byte[]>(new byte[1024])) { var localAddress = new RPC_CALL_LOCAL_ADDRESS_V1(); localAddress.Version = 1; localAddress.Buffer = callerAddress.Handle; localAddress.BufferSize = 1024; localAddress.AddressFormat = RpcLocalAddressFormat.Invalid; _callAttrs = attrs; using (var callerAddressv1 = new Ptr <RPC_CALL_LOCAL_ADDRESS_V1>(localAddress)) { attrs.CallLocalAddress = callerAddressv1.Handle; attrs.Flags = RPC_CALL_ATTRIBUTES_FLAGS.RPC_QUERY_CALL_LOCAL_ADDRESS | RPC_CALL_ATTRIBUTES_FLAGS.RPC_QUERY_NO_AUTH_REQUIRED; if ((err = NativeMethods.RpcServerInqCallAttributes(_clientHandle, ref attrs)) == RPC_STATUS.RPC_S_OK) { _clientAddress = new byte[callerAddressv1.Data.BufferSize]; Array.Copy(callerAddress.Data, _clientAddress, _clientAddress.Length); } } } } using (Ptr <byte[]> clientPrincipal = new Ptr <byte[]>(new byte[1024])) { attrs.ClientPrincipalName = clientPrincipal.Handle; attrs.ClientPrincipalNameBufferLength = 1024; attrs.Flags = RPC_CALL_ATTRIBUTES_FLAGS.RPC_QUERY_CLIENT_PRINCIPAL_NAME; if ((err = NativeMethods.RpcServerInqCallAttributes(_clientHandle, ref attrs)) == RPC_STATUS.RPC_S_OK) { _clientPrincipalName = Marshal.PtrToStringUni(clientPrincipal.Handle); if (!String.IsNullOrEmpty(_clientPrincipalName)) { _isAuthenticated = true; //On Windows XP this only returns a value on LRPC so we know they are local if (attrs.Version == 1) { _callAttrs.IsClientLocal = RpcCallClientLocality.Local; } } } } } else { RpcTrace.Warning("RpcServerInqCallAttributes error {0} = {1}", err, new RpcException(err).Message); } return(_callAttrs); }