diff -pur global-6.2.11/libparser/parser.c global-6.2-11/libparser/parser.c
--- global-6.2.11/libparser/parser.c	2014-03-12 12:49:34 +1000
+++ global-6.2-11/libparser/parser.c	2014-04-17 17:24:49 +1000
@@ -171,6 +171,11 @@ load_plugin_parser(const char *pluginspe
 		if (p != NULL)
 			*p++ = '\0';
 		q = strchr(lt_dl_name, ':');
+#ifdef _WIN32
+		/* Assume a single-character name is a drive letter. */
+		if (q == lt_dl_name + 1)
+			q = strchr(q + 1, ':');
+#endif
 		if (q == NULL) {
 			parser_name = "parser";
 		} else {
diff -pur global-6.2.11/plugin-factory/exuberant-ctags.c global-6.2-11/plugin-factory/exuberant-ctags.c
--- global-6.2.11/plugin-factory/exuberant-ctags.c	2014-03-12 12:49:34 +1000
+++ global-6.2-11/plugin-factory/exuberant-ctags.c	2014-04-17 17:48:27 +1000
@@ -22,9 +22,6 @@
 #include <config.h>
 #endif
 #include <sys/types.h>
-#if !defined(_WIN32) || defined(__CYGWIN__)
-#include <sys/wait.h>
-#endif
 #include <assert.h>
 #include <ctype.h>
 #include <errno.h>
@@ -51,24 +48,15 @@
 #define LANGMAP_OPTION		"--langmap="
 #define INITIAL_BUFSIZE		1024
 
-static char *argv[] = {
-	EXUBERANT_CTAGS,
-	NULL,
-#ifdef USE_TYPE_STRING
-	"--gtags",
-#endif
-	"-xu",
-	"--filter",
-	"--filter-terminator=" TERMINATOR "\n",
-	"--format=1",
-	NULL
-};
-static pid_t pid;
 static FILE *ip, *op;
 static char *linebuf;
 static size_t bufsize;
 static char *ctagsnotfound = "Exuberant Ctags not found. Please see ./configure --help.";
 
+#ifdef __GNUC__
+static void terminate_ctags(void) __attribute__((destructor));
+#endif
+
 static void
 copy_langmap_converting_cpp(char *dst, const char *src)
 {
@@ -89,6 +77,88 @@ copy_langmap_converting_cpp(char *dst, c
 	strcpy(dst, src);
 }
 
+#if defined(_WIN32) && !defined(__CYGWIN__)
+#define WIN32_LEAN_AND_MEAN
+#include <windows.h>
+#include <fcntl.h>
+static HANDLE pid;
+static char argv[] = "ctags "
+#ifdef USE_TYPE_STRING
+	"--gtags "
+#endif
+	"-xu --filter --filter-terminator=" TERMINATOR "\n "
+	"--format=1 " LANGMAP_OPTION;
+static void
+start_ctags(const struct parser_param *param)
+{
+	HANDLE opipe[2], ipipe[2];
+	SECURITY_ATTRIBUTES sa;
+	STARTUPINFO si;
+	PROCESS_INFORMATION pi;
+	char* arg;
+
+	if (strlen(EXUBERANT_CTAGS) == 0 || !strcmp(EXUBERANT_CTAGS, "no"))
+		param->die(ctagsnotfound);
+	arg = malloc(sizeof(argv) + strlen(param->langmap));
+	if (arg == NULL)
+		param->die("short of memory.");
+	strcpy(arg, argv);
+	copy_langmap_converting_cpp(arg + sizeof(argv) - 1, param->langmap);
+
+	sa.nLength = sizeof(sa);
+	sa.bInheritHandle = TRUE;
+	sa.lpSecurityDescriptor = NULL;
+	if (!CreatePipe(&opipe[0], &opipe[1], &sa, 0) ||
+	    !CreatePipe(&ipipe[0], &ipipe[1], &sa, 0))
+		param->die("CreatePipe failed.");
+	SetHandleInformation(opipe[1], HANDLE_FLAG_INHERIT, 0);
+	SetHandleInformation(ipipe[0], HANDLE_FLAG_INHERIT, 0);
+	ZeroMemory(&si, sizeof(si));
+	si.cb = sizeof(si);
+	si.hStdInput = opipe[0];
+	si.hStdOutput = ipipe[1];
+	si.hStdError = GetStdHandle(STD_ERROR_HANDLE);
+	si.dwFlags = STARTF_USESTDHANDLES;
+	CreateProcess(EXUBERANT_CTAGS, arg, NULL, NULL, TRUE, 0, NULL, NULL, &si, &pi);
+	CloseHandle(opipe[0]);
+	CloseHandle(ipipe[1]);
+	CloseHandle(pi.hThread);
+	pid = pi.hProcess;
+	op = fdopen(_open_osfhandle((long)opipe[1], _O_WRONLY), "w");
+	ip = fdopen(_open_osfhandle((long)ipipe[0], _O_RDONLY), "r");
+	if (ip == NULL || op == NULL)
+		param->die("fdopen failed.");
+
+	bufsize = INITIAL_BUFSIZE;
+	linebuf = malloc(bufsize);
+	if (linebuf == NULL)
+		param->die("short of memory.");
+}
+static void
+terminate_ctags(void) {
+	if (op == NULL)
+		return;
+	free(linebuf);
+	fclose(op);
+	fclose(ip);
+	WaitForSingleObject(pid, INFINITE);
+	CloseHandle(pid);
+}
+#else
+#include <sys/wait.h>
+static pid_t pid;
+static char *argv[] = {
+	EXUBERANT_CTAGS,
+	NULL,
+#ifdef USE_TYPE_STRING
+	"--gtags",
+#endif
+	"-xu",
+	"--filter",
+	"--filter-terminator=" TERMINATOR "\n",
+	"--format=1",
+	NULL
+};
 static void
 start_ctags(const struct parser_param *param)
 {
@@ -134,10 +204,6 @@ start_ctags(const struct parser_param *p
 		param->die("short of memory.");
 }
 
-#ifdef __GNUC__
-static void terminate_ctags(void) __attribute__((destructor));
-#endif
-
 static void
 terminate_ctags(void)
 {
@@ -149,6 +215,7 @@ terminate_ctags(void)
 	while (waitpid(pid, NULL, 0) < 0 && errno == EINTR)
 		;
 }
+#endif
 
 static char *
 get_line(const struct parser_param *param)
diff -pur global-6.2.11/plugin-factory/Makefile.in global-6.2-11/plugin-factory/Makefile.in
--- global-6.2.11/plugin-factory/Makefile.in	2014-03-12 12:49:44 +1000
+++ global-6.2-11/plugin-factory/Makefile.in	2014-04-17 16:40:10 +1000
@@ -362,11 +362,11 @@ top_srcdir = @top_srcdir@
 plugindir = ${libdir}/gtags
 plugin_LTLIBRARIES = exuberant-ctags.la user-custom.la
 exuberant_ctags_la_SOURCES = exuberant-ctags.c
-exuberant_ctags_la_LDFLAGS = -module -avoid-version
+exuberant_ctags_la_LDFLAGS = -module -avoid-version -no-undefined
 
 # skeleton
 user_custom_la_SOURCES = user-custom.c
-user_custom_la_LDFLAGS = -module -avoid-version
+user_custom_la_LDFLAGS = -module -avoid-version -no-undefined
 gtagsdir = ${datadir}/gtags
 gtags_DATA = PLUGIN_HOWTO
 EXTRA_DIST = $(gtags_DATA)