diff --git a/cmd/geth/les_test.go b/cmd/geth/les_test.go
index 259d4a8067373625c5b523d366beeee7f8bc3693..24256465109aa42502abc9ed43d19846bae913f3 100644
--- a/cmd/geth/les_test.go
+++ b/cmd/geth/les_test.go
@@ -2,7 +2,10 @@ package main
 
 import (
 	"context"
+	"os"
 	"path/filepath"
+	"runtime"
+	"strings"
 	"testing"
 	"time"
 
@@ -95,6 +98,27 @@ func (g *gethrpc) waitSynced() {
 	}
 }
 
+// ipcEndpoint resolves an IPC endpoint based on a configured value, taking into
+// account the set data folders as well as the designated platform we're currently
+// running on.
+func ipcEndpoint(ipcPath, datadir string) string {
+	// On windows we can only use plain top-level pipes
+	if runtime.GOOS == "windows" {
+		if strings.HasPrefix(ipcPath, `\\.\pipe\`) {
+			return ipcPath
+		}
+		return `\\.\pipe\` + ipcPath
+	}
+	// Resolve names into the data directory full paths otherwise
+	if filepath.Base(ipcPath) == ipcPath {
+		if datadir == "" {
+			return filepath.Join(os.TempDir(), ipcPath)
+		}
+		return filepath.Join(datadir, ipcPath)
+	}
+	return ipcPath
+}
+
 func startGethWithIpc(t *testing.T, name string, args ...string) *gethrpc {
 	g := &gethrpc{name: name}
 	args = append([]string{"--networkid=42", "--port=0", "--nousb"}, args...)
@@ -103,10 +127,10 @@ func startGethWithIpc(t *testing.T, name string, args ...string) *gethrpc {
 	// wait before we can attach to it. TODO: probe for it properly
 	time.Sleep(1 * time.Second)
 	var err error
-	ipcpath := filepath.Join(g.geth.Datadir, "geth.ipc")
+	ipcpath := ipcEndpoint("geth.ipc", g.geth.Datadir)
 	g.rpc, err = rpc.Dial(ipcpath)
 	if err != nil {
-		t.Fatalf("%v rpc connect: %v", name, err)
+		t.Fatalf("%v rpc connect to %v: %v", name, ipcpath, err)
 	}
 	return g
 }