예제 #1
0
 internal static extern int RpcMgmtEpEltInqNext(
     SafeRpcInquiryHandle InquiryContext,
     [Out] RPC_IF_ID IfId,
     out SafeRpcBindingHandle Binding,
     [Out] UUID ObjectUuid,
     out SafeRpcStringHandle Annotation
     );
        internal RpcEndpoint(RPC_IF_ID if_id, UUID uuid, SafeRpcStringHandle annotation, SafeRpcBindingHandle binding)
        {
            InterfaceId      = if_id.Uuid;
            InterfaceVersion = new Version(if_id.VersMajor, if_id.VersMinor);
            ObjectUuid       = uuid.Uuid;
            Annotation       = annotation.ToString();
            BindingString    = binding.ToString();
            var cracked = new CrackedBindingString(BindingString);

            Protseq        = cracked.Protseq;
            NetworkAddr    = cracked.NetworkAddr;
            Endpoint       = cracked.Endpoint;
            NetworkOptions = cracked.NetworkOptions;
            if (Protseq.Equals("ncalrpc", StringComparison.OrdinalIgnoreCase) && !string.IsNullOrEmpty(Endpoint))
            {
                EndpointPath = $@"\RPC Control\{Endpoint}";
            }
            else if (Protseq.Equals("ncacn_np", StringComparison.OrdinalIgnoreCase) && !string.IsNullOrEmpty(Endpoint))
            {
                EndpointPath = $@"\??{Endpoint}";
            }
            else
            {
                EndpointPath = string.Empty;
            }
        }
예제 #3
0
        public CrackedBindingString(string string_binding)
        {
            SafeRpcStringHandle objuuid        = null;
            SafeRpcStringHandle protseq        = null;
            SafeRpcStringHandle endpoint       = null;
            SafeRpcStringHandle networkaddr    = null;
            SafeRpcStringHandle networkoptions = null;

            try {
                int status = Win32NativeMethods.RpcStringBindingParse(string_binding,
                                                                      out objuuid, out protseq, out networkaddr, out endpoint, out networkoptions);
                if (status == 0)
                {
                    ObjUuid        = objuuid.ToString();
                    Protseq        = protseq.ToString();
                    Endpoint       = endpoint.ToString();
                    NetworkAddr    = networkaddr.ToString();
                    NetworkOptions = networkoptions.ToString();
                }
                else
                {
                    ObjUuid        = string.Empty;
                    Protseq        = string.Empty;
                    Endpoint       = string.Empty;
                    NetworkAddr    = string.Empty;
                    NetworkOptions = string.Empty;
                }
            } finally {
                objuuid?.Dispose();
                protseq?.Dispose();
                endpoint?.Dispose();
                networkaddr?.Dispose();
                networkoptions?.Dispose();
            }
        }
예제 #4
0
 internal RpcEndpoint(RPC_IF_ID if_id, UUID uuid, SafeRpcStringHandle annotation, SafeRpcBindingHandle binding, bool registered)
 {
     InterfaceId      = if_id.Uuid;
     InterfaceVersion = new Version(if_id.VersMajor, if_id.VersMinor);
     ObjectUuid       = uuid.Uuid;
     Annotation       = annotation?.ToString() ?? string.Empty;
     BindingString    = binding.ToString();
     ProtocolSequence = binding.Protseq;
     NetworkAddress   = binding.NetworkAddr;
     Endpoint         = binding.Endpoint;
     NetworkOptions   = binding.NetworkOptions;
     if (ProtocolSequence.Equals("ncalrpc", StringComparison.OrdinalIgnoreCase) && !string.IsNullOrEmpty(Endpoint))
     {
         if (Endpoint.Contains(@"\"))
         {
             EndpointPath = Endpoint;
         }
         else
         {
             EndpointPath = $@"\RPC Control\{Endpoint}";
         }
     }
     else if (ProtocolSequence.Equals("ncacn_np", StringComparison.OrdinalIgnoreCase) && !string.IsNullOrEmpty(Endpoint))
     {
         EndpointPath = $@"\??{Endpoint}";
     }
     else
     {
         EndpointPath = string.Empty;
     }
     Registered = registered;
 }
예제 #5
0
 internal static extern int RpcStringBindingCompose(
     string ObjUuid,
     string ProtSeq,
     string NetworkAddr,
     string Endpoint,
     string Options,
     out SafeRpcStringHandle StringBinding
     );
예제 #6
0
 internal static extern int RpcStringBindingParse(
     string StringBinding,
     out SafeRpcStringHandle ObjUuid,
     out SafeRpcStringHandle Protseq,
     out SafeRpcStringHandle NetworkAddr,
     out SafeRpcStringHandle Endpoint,
     out SafeRpcStringHandle NetworkOptions
     );
예제 #7
0
 internal static extern int RpcBindingToStringBinding(
     IntPtr Binding,
     out SafeRpcStringHandle StringBinding
     );
 internal RpcEndpoint(RPC_IF_ID if_id, UUID uuid, SafeRpcStringHandle annotation, SafeRpcBindingHandle binding, bool registered)
     : this(if_id.Uuid, new Version(if_id.VersMajor, if_id.VersMinor), annotation?.ToString(), binding.ToString(), registered)
 {
 }