diff -urN putty-src/WINDOWS/window.c putty-0.60-file-dnd-src-for-cygwin1.7/WINDOWS/window.c
--- putty-src/WINDOWS/window.c	2008-11-20 15:46:04.000000000 +0900
+++ putty-0.60-file-dnd-src-for-cygwin1.7/WINDOWS/window.c	2009-10-12 15:23:04.531250000 +0900
@@ -159,6 +159,13 @@
 static void (*xtrans_paint_background)(HDC, int, int, int, int) = xtrans_paint_bg;
 /* < */
 
+/* > Cygwin path D&D patch */
+static int cygwin_conv_to_full_posix_path(const char *, char *, int);
+static WCHAR *convert_utf8_to_wcs(const char *, int *);
+static void release_wcs_string(WCHAR *);
+static void send_path_to_term(void *, const char *);
+/* < */
+
 #define FONT_NORMAL 0
 #define FONT_BOLD 1
 #define FONT_UNDERLINE 2
@@ -2405,6 +2412,7 @@
 	}
 	return 0;
       case WM_CREATE:
+        DragAcceptFiles(hwnd, TRUE);
         if (cfg.ctrl_tab_switch) {
 	    int wndExtra = GetClassLong(hwnd, GCL_CBWNDEXTRA);
 	    FILETIME filetime;
@@ -2427,6 +2435,21 @@
 	    sfree(str);
 	}
 	return 0;
+      case WM_DROPFILES:
+        {
+	    HDROP hDrop = (HDROP)wParam;
+	    UINT count = DragQueryFile(hDrop, 0xFFFFFFFFU, NULL, 0);
+	    CHAR filename[MAX_PATH+1];
+	    if (count > 0)
+	    {
+		int index = 0;		/* Always use the 1st dropped item */
+		DragQueryFile(hDrop, index, filename, sizeof(filename)/sizeof(CHAR));
+
+		send_path_to_term(ldisc, filename);
+	    }
+	    DragFinish(hDrop);
+        }
+        return 0;
       case WM_DESTROY:
 	show_mouseptr(1);
 	PostQuitMessage(0);
@@ -6057,3 +6080,125 @@
       f = !f;
     }
 }
+
+/* > Cygwin path D&D patch */
+static int
+cygwin_conv_to_full_posix_path(const char *win32_path, char *posix_path, int bufsize)
+{
+    SECURITY_ATTRIBUTES sa;
+    STARTUPINFO si;
+    PROCESS_INFORMATION pi;
+    HANDLE hRead_inheritable, hWrite;
+    HANDLE hRead_uninheritable;
+    DWORD bytes_read;
+    CHAR cmdline[1024];
+    int len;
+    char* p;
+
+    sprintf(cmdline, "cygpath.exe -u -C UTF8 \'%s\'", win32_path);
+
+    ZeroMemory(&sa, sizeof(sa));
+    sa.nLength = sizeof(sa);
+    sa.bInheritHandle = TRUE;
+    if (!CreatePipe(&hRead_inheritable, &hWrite, &sa, 0))
+    {
+	strcpy(posix_path, "CreatePipe Failed");
+	return 1;
+    }
+    if (!DuplicateHandle(GetCurrentProcess(),		// source process
+			 hRead_inheritable,		// original handle
+			 GetCurrentProcess(),		// destination process
+			 &hRead_uninheritable,		// duplication handle
+			 0,				// access rights
+			 FALSE,				// inherit
+			 DUPLICATE_SAME_ACCESS))	// ignore the 5th argument
+    {
+	strcpy(posix_path, "DuplicateHandle Failed");
+	return 1;
+    }
+
+    ZeroMemory(&si, sizeof(si));
+    si.cb = sizeof(si);
+    si.dwFlags = STARTF_USESTDHANDLES | STARTF_USESHOWWINDOW;
+    si.hStdInput = GetStdHandle(STD_INPUT_HANDLE);
+    si.hStdOutput = hWrite;
+    si.hStdError = GetStdHandle(STD_ERROR_HANDLE);
+    si.wShowWindow = SW_HIDE;
+    CreateProcess(NULL, cmdline, NULL, NULL, TRUE, 0, NULL, NULL, &si, &pi);
+    WaitForSingleObject(pi.hProcess, 1000);
+    ReadFile(hRead_uninheritable, posix_path, bufsize, &bytes_read, NULL);
+    CloseHandle(hWrite);
+    /* Add a trailing terminator '\0' */
+    posix_path[bytes_read] = '\0';
+
+    /* Remove the trailing CR or LF */
+    len = strlen(posix_path);
+    if (len > 0)
+    {
+	p = posix_path+len-1;
+	while (*p == '\r' || *p == '\n')
+	{
+	    *p-- = '\0';
+	}
+    }
+
+    return 0;
+}
+
+static WCHAR *
+convert_utf8_to_wcs(const char *str_utf8, int *len)
+{
+    int len_wcs;
+    WCHAR *str_wcs;
+    /* Obtain the length of converted string */
+    len_wcs = MultiByteToWideChar(CP_UTF8, MB_PRECOMPOSED,
+				  str_utf8,
+				  -1,		/* length auto calculation */
+				  NULL,
+				  0);
+    /* Allocate a buffer */
+    str_wcs = (WCHAR *)malloc(sizeof(WCHAR)*(len_wcs+1));	/* +1 for L'\0' */
+    /* Convert a string */
+    MultiByteToWideChar(CP_UTF8, MB_PRECOMPOSED,
+			str_utf8,
+			-1,		/* length auto calculation */
+			str_wcs,
+			len_wcs+1);
+    if (len)
+	*len = len_wcs;
+    return str_wcs;
+}
+
+static void
+release_wcs_string(WCHAR *str_wcs)
+{
+    free(str_wcs);
+}
+
+static void
+send_path_to_term(void *ldisc, const char *filename)
+{
+    WCHAR quot_wchar = L'\'';
+    char cygwin_path[MAX_PATH+1001];
+
+    int err_result = cygwin_conv_to_full_posix_path(filename, cygwin_path, sizeof(cygwin_path)/sizeof(char));
+    if (!err_result)
+    {
+	int i, len = 0;
+	WCHAR *posix_fname_wcs = convert_utf8_to_wcs(cygwin_path, &len);
+
+	luni_send(ldisc, &quot_wchar, 1, 1);	/* begin quotation character */
+	for (i=0; i<len; ++i)			/* transfer character one by one */
+	{
+	    WCHAR ch = *(posix_fname_wcs+i);
+	    if (ch == L'\\')
+		ch = L'/';
+	    luni_send(ldisc, &ch, 1, 1);
+	}
+	luni_send(ldisc, &quot_wchar, 1, 1);	/* final quotation character */
+
+	release_wcs_string(posix_fname_wcs);
+    }
+}
+/* < */
+
