https://git.reactos.org/?p=reactos.git;a=commitdiff;h=5274857da98c5b1a4f6021f54ef8cbe1c3218376

commit 5274857da98c5b1a4f6021f54ef8cbe1c3218376
Author:     Hermès Bélusca-Maïto <hermes.belusca-ma...@reactos.org>
AuthorDate: Thu Apr 2 18:25:44 2020 +0200
Commit:     Hermès Bélusca-Maïto <hermes.belusca-ma...@reactos.org>
CommitDate: Thu Apr 2 18:35:39 2020 +0200

    [RPCRT4] Addendum to support for remote pipes names in ncacn_pipe_name() 
(24cd7bbe).
    CORE-6561 CORE-13442
    
    - Call GetComputerNameA() only when a non-empty server name has been
      provided, thus slightly improving speed for the most common case when
      local calls (with an empty server name) are done.
    
    - When a server name is passed, trim any leading UNC server prefix since
      the latter will be restored when building the pipe name string.
---
 dll/win32/rpcrt4/rpc_transport.c | 21 +++++++++++++++++----
 dll/win32/rpcrt4/rpcrt4_ros.diff | 20 +++++++++++++++++---
 2 files changed, 34 insertions(+), 7 deletions(-)

diff --git a/dll/win32/rpcrt4/rpc_transport.c b/dll/win32/rpcrt4/rpc_transport.c
index aee897644c9..e77cb287be9 100644
--- a/dll/win32/rpcrt4/rpc_transport.c
+++ b/dll/win32/rpcrt4/rpc_transport.c
@@ -262,18 +262,31 @@ static char *ncacn_pipe_name(const char *endpoint)
   static const char prefix[] = "\\\\";
   static const char local[] = ".";
   char ComputerName[MAX_COMPUTERNAME_LENGTH + 1];
+  DWORD bufLen = ARRAY_SIZE(ComputerName);
 #else
   static const char prefix[] = "\\\\.";
 #endif
   char *pipe_name;
 
 #ifdef __REACTOS__
-  DWORD bufLen = ARRAYSIZE(ComputerName);
-
-  GetComputerNameA(ComputerName, &bufLen);
+  if (server != NULL && *server != 0)
+  {
+    /* Trim any leading UNC server prefix. */
+    if (server[0] == '\\' && server[1] == '\\')
+      server += 2;
 
-  if (server == NULL || *server == 0 || stricmp(ComputerName, server) == 0)
+    /* If the server represents the local computer, use instead
+     * the local prefix to avoid a round in UNC name resolution. */
+    if (GetComputerNameA(ComputerName, &bufLen) &&
+        (stricmp(ComputerName, server) == 0))
+    {
       server = local;
+    }
+  }
+  else
+  {
+    server = local;
+  }
 #endif
 
   /* protseq=ncacn_np: named pipes */
diff --git a/dll/win32/rpcrt4/rpcrt4_ros.diff b/dll/win32/rpcrt4/rpcrt4_ros.diff
index ea7412c191c..c1ae133a864 100644
--- a/dll/win32/rpcrt4/rpcrt4_ros.diff
+++ b/dll/win32/rpcrt4/rpcrt4_ros.diff
@@ -129,13 +129,27 @@ diff -pudN e:\wine\dlls\rpcrt4/rpc_transport.c 
e:\reactos\dll\win32\rpcrt4/rpc_t
 +  static const char prefix[] = "\\\\";
 +  static const char local[] = ".";
 +  char ComputerName[MAX_COMPUTERNAME_LENGTH + 1];
++  DWORD bufLen = ARRAY_SIZE(ComputerName);
    char *pipe_name;
-+  DWORD bufLen = ARRAYSIZE(ComputerName);
 +
-+  GetComputerNameA(ComputerName, &bufLen);
++  if (server != NULL && *server != 0)
++  {
++    /* Trim any leading UNC server prefix. */
++    if (server[0] == '\\' && server[1] == '\\')
++      server += 2;
 +
-+  if (server == NULL || *server == 0 || stricmp(ComputerName, server) == 0)
++    /* If the server represents the local computer, use instead
++     * the local prefix to avoid a round in UNC name resolution. */
++    if (GetComputerNameA(ComputerName, &bufLen) &&
++        (stricmp(ComputerName, server) == 0))
++    {
 +      server = local;
++    }
++  }
++  else
++  {
++    server = local;
++  }
  
    /* protseq=ncacn_np: named pipes */
 -  pipe_name = I_RpcAllocate(sizeof(prefix) + strlen(endpoint));

Reply via email to