Index: dll/win32/rpcrt4/rpc_transport.c =================================================================== --- dll/win32/rpcrt4/rpc_transport.c (revision 75041) +++ dll/win32/rpcrt4/rpc_transport.c (working copy) @@ -152,6 +152,11 @@ if (err == ERROR_PIPE_BUSY) { TRACE("connection failed, error=%x\n", err); return RPC_S_SERVER_TOO_BUSY; +#ifdef __REACTOS__ + } else if (err == ERROR_BAD_NETPATH) { + /*TRACE*/ERR("connection failed, error=%x\n", err); + return RPC_S_SERVER_UNAVAILABLE; +#endif } if (!wait || !WaitNamedPipeA(pname, NMPWAIT_WAIT_FOREVER)) { err = GetLastError(); @@ -232,8 +237,9 @@ return r; } -static char *ncacn_pipe_name(const char *endpoint) +static char *ncacn_pipe_name(const char *endpoint, const char *networkaddr) { +#ifndef __REACTOS__ static const char prefix[] = "\\\\."; char *pipe_name; @@ -240,6 +246,64 @@ /* protseq=ncacn_np: named pipes */ pipe_name = I_RpcAllocate(sizeof(prefix) + strlen(endpoint)); strcat(strcpy(pipe_name, prefix), endpoint); + +#else + + static const char prefix[] = "\\\\"; + static const char local[] = "."; + + char *pipe_name; + + BOOL bUseLocalName = TRUE; + CHAR ComputerName[MAX_COMPUTERNAME_LENGTH + 1]; + DWORD bufLen = sizeof(ComputerName)/sizeof(ComputerName[0]); + LPCSTR NetworkAddr; + INT size; + + size = strlen(prefix); + + if (networkaddr == NULL || strlen(networkaddr) == 0) + { + bUseLocalName = TRUE; + size += strlen(local); + } + else + { + NetworkAddr = networkaddr; + if (NetworkAddr[0] == '\\' && NetworkAddr[1] == '\\') + NetworkAddr += 2; + + if (GetComputerNameA(ComputerName, &bufLen)) + { + if (stricmp(ComputerName, NetworkAddr) == 0) + { + bUseLocalName = TRUE; + size += strlen(local); + } + else + { + bUseLocalName = FALSE; + size += strlen(NetworkAddr); + } + } + else + { + bUseLocalName = FALSE; + size += strlen(NetworkAddr); + } + } + + size += strlen(endpoint) + 1; + + pipe_name = I_RpcAllocate(size); + strcpy(pipe_name, prefix); + if (bUseLocalName) + strcat(pipe_name, local); + else + strcat(pipe_name, NetworkAddr); + strcat(pipe_name, endpoint); + +#endif return pipe_name; } @@ -253,8 +317,13 @@ if (npc->pipe) return RPC_S_OK; - pname = ncacn_pipe_name(Connection->Endpoint); + ERR("rpcrt4_ncacn_np_open calling ncacn_pipe_name (endpoint = '%s' ; networkaddr = '%s')\n", Connection->Endpoint, Connection->NetworkAddr); + pname = ncacn_pipe_name(Connection->Endpoint, Connection->NetworkAddr); +#ifndef __REACTOS__ r = rpcrt4_conn_open_pipe(Connection, pname, FALSE); +#else + r = rpcrt4_conn_open_pipe(Connection, pname, TRUE); +#endif I_RpcFree(pname); return r; @@ -282,7 +351,7 @@ if (r != RPC_S_OK) return r; - pname = ncacn_pipe_name(Connection->Endpoint); + pname = ncacn_pipe_name(Connection->Endpoint, Connection->NetworkAddr); r = rpcrt4_conn_create_pipe(Connection, pname); I_RpcFree(pname); @@ -312,7 +381,7 @@ rpcrt4_conn_np_handoff((RpcConnection_np *)old_conn, (RpcConnection_np *)new_conn); - pname = ncacn_pipe_name(old_conn->Endpoint); + pname = ncacn_pipe_name(old_conn->Endpoint, old_conn->NetworkAddr); status = rpcrt4_conn_create_pipe(old_conn, pname); I_RpcFree(pname); @@ -319,11 +388,13 @@ /* Store the local computer name as the NetworkAddr for ncacn_np as long as * we don't support named pipes over the network. */ new_conn->NetworkAddr = HeapAlloc(GetProcessHeap(), 0, len); + ERR("rpcrt4_ncacn_np_handoff, calling GetComputerNameA\n"); if (!GetComputerNameA(new_conn->NetworkAddr, &len)) { ERR("Failed to retrieve the computer name, error %u\n", GetLastError()); return RPC_S_OUT_OF_RESOURCES; } + ERR("rpcrt4_ncacn_np_handoff, got GetComputerNameA == '%*.s'\n", len, new_conn->NetworkAddr); return status; } @@ -338,7 +409,7 @@ char *pipe_name; RPC_STATUS status; - pipe_name = ncacn_pipe_name(endpoint); + pipe_name = ncacn_pipe_name(endpoint, NULL); status = is_pipe_listening(pipe_name); I_RpcFree(pipe_name); return status; @@ -371,11 +442,13 @@ /* Store the local computer name as the NetworkAddr for ncalrpc. */ new_conn->NetworkAddr = HeapAlloc(GetProcessHeap(), 0, len); + ERR("rpcrt4_ncalrpc_handoff, calling GetComputerNameA\n"); if (!GetComputerNameA(new_conn->NetworkAddr, &len)) { ERR("Failed to retrieve the computer name, error %u\n", GetLastError()); return RPC_S_OUT_OF_RESOURCES; } + ERR("rpcrt4_ncalrpc_handoff, got GetComputerNameA == '%*.s'\n", len, new_conn->NetworkAddr); return status; }