<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 TRANSITIONAL//EN">
<HTML>
<HEAD>
  <META HTTP-EQUIV="Content-Type" CONTENT="text/html; CHARSET=UTF-8">
  <META NAME="GENERATOR" CONTENT="GtkHTML/3.10.1">
</HEAD>
<BODY>
<PRE>
Hi,

</PRE>
MSDN states that we should use a blank password when a NULL password is given together with a NON-NULL username.<BR>
<!--+GtkHTML:<DATA class="ClueFlow" key="orig" value="0">--><BR>
Ethereal confirms this :-)
<PRE>
<!--+GtkHTML:<DATA class="ClueFlow" clear="orig">-->
Changelog
&nbsp; Use a blank password if a NULL password is given

Cheers,

Paul.
<!--+GtkHTML:<DATA class="ClueFlow" key="orig" value="0">-->
---
<!--+GtkHTML:<DATA class="ClueFlow" clear="orig">--> dlls/wininet/<A HREF="ftp://ftp.c">ftp.c</A> |    6 +++++-
 1 files changed, 5 insertions(+), 1 deletions(-)

diff --git a/dlls/wininet/<A HREF="ftp://ftp.c">ftp.c</A> b/dlls/wininet/<A HREF="ftp://ftp.c">ftp.c</A>
index 5873ee8..32e21ab 100644
--- a/dlls/wininet/<A HREF="ftp://ftp.c">ftp.c</A>
+++ b/dlls/wininet/<A HREF="ftp://ftp.c">ftp.c</A>
@@ -1674,6 +1674,7 @@ HINTERNET FTP_Connect(LPWININETAPPINFOW 
 {
     static const WCHAR szDefaultUsername[] = {'a','n','o','n','y','m','o','u','s','\0'};
     static const WCHAR szDefaultPassword[] = {'u','s','e','r','@','s','e','r','v','e','r','\0'};
+    static const WCHAR szBlankPassword[] = {'\0'};
     struct sockaddr_in socketAddr;
     INT nsocket = -1;
     UINT sock_namelen;
@@ -1733,7 +1734,10 @@ HINTERNET FTP_Connect(LPWININETAPPINFOW 
     }
     else {
         lpwfs-&gt;lpszUserName = WININET_strdupW(lpszUserName);
-        lpwfs-&gt;lpszPassword = WININET_strdupW(lpszPassword);
+        if ( !lpszPassword)
+            lpwfs-&gt;lpszPassword = WININET_strdupW(szBlankPassword);
+        else 
+            lpwfs-&gt;lpszPassword = WININET_strdupW(lpszPassword);
     }
     
     /* Don't send a handle created callback if this handle was created with InternetOpenUrl */
-- 
1.4.1
</PRE>
</BODY>
</HTML>