[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.
This commit is contained in:
Hermès Bélusca-Maïto 2020-04-02 18:25:44 +02:00
parent bf0dc6adb2
commit 5274857da9
No known key found for this signature in database
GPG key ID: 3B2539C65E7B93D0
2 changed files with 34 additions and 7 deletions

View file

@ -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);
if (server != NULL && *server != 0)
{
/* Trim any leading UNC server prefix. */
if (server[0] == '\\' && server[1] == '\\')
server += 2;
GetComputerNameA(ComputerName, &bufLen);
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 */

View file

@ -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));