Implemented Win16 behaviour of DDL_DRIVES in DlgDirList.

diff --git a/controls/listbox.c b/controls/listbox.c
index 5ebd498..91624bc 100644
--- a/controls/listbox.c
+++ b/controls/listbox.c
@@ -1661,42 +1661,47 @@
     WIN32_FIND_DATAA entry;
     int pos;
 
-    if ((handle = FindFirstFileA(filespec,&entry)) == INVALID_HANDLE_VALUE)
-    {
-        if (GetLastError() != ERROR_NO_MORE_FILES) return LB_ERR;
-    }
-    else
-    {
-        do
+    /* don't scan directory if we just want drives exclusively */
+    if (attrib != (DDL_DRIVES | DDL_EXCLUSIVE)) {
+        /* scan directory */
+        if ((handle = FindFirstFileA(filespec,&entry)) == INVALID_HANDLE_VALUE)
         {
-            char buffer[270];
-            if (entry.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
+            if (GetLastError() != ERROR_NO_MORE_FILES) return LB_ERR;
+        }
+        else
+        {
+            do
             {
-                if (!(attrib & DDL_DIRECTORY) ||
-                    !strcmp( entry.cAlternateFileName, "." )) continue;
-                if (long_names) sprintf( buffer, "[%s]", entry.cFileName );
-                else sprintf( buffer, "[%s]", entry.cAlternateFileName );
-            }
-            else  /* not a directory */
-            {
+                char buffer[270];
+                if (entry.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
+                {
+                    if (!(attrib & DDL_DIRECTORY) ||
+                        !strcmp( entry.cAlternateFileName, "." )) continue;
+                    if (long_names) sprintf( buffer, "[%s]", entry.cFileName );
+                    else sprintf( buffer, "[%s]", entry.cAlternateFileName );
+                }
+                else  /* not a directory */
+                {
 #define ATTRIBS (FILE_ATTRIBUTE_READONLY | FILE_ATTRIBUTE_HIDDEN | \
                  FILE_ATTRIBUTE_SYSTEM | FILE_ATTRIBUTE_ARCHIVE)
 
-                if ((attrib & DDL_EXCLUSIVE) &&
-                    ((attrib & ATTRIBS) != (entry.dwFileAttributes & ATTRIBS)))
-                    continue;
+                    if ((attrib & DDL_EXCLUSIVE) &&
+                        ((attrib & ATTRIBS) != (entry.dwFileAttributes & ATTRIBS)))
+                        continue;
 #undef ATTRIBS
-                if (long_names) strcpy( buffer, entry.cFileName );
-                else strcpy( buffer, entry.cAlternateFileName );
-            }
-            if (!long_names) CharLowerA( buffer );
-            pos = LISTBOX_FindFileStrPos( wnd, descr, buffer );
-            if ((ret = LISTBOX_InsertString( wnd, descr, pos, buffer )) < 0)
-                break;
-        } while (FindNextFileA( handle, &entry ));
-        FindClose( handle );
+                    if (long_names) strcpy( buffer, entry.cFileName );
+                    else strcpy( buffer, entry.cAlternateFileName );
+                }
+                if (!long_names) CharLowerA( buffer );
+                pos = LISTBOX_FindFileStrPos( wnd, descr, buffer );
+                if ((ret = LISTBOX_InsertString( wnd, descr, pos, buffer )) < 0)
+                    break;
+            } while (FindNextFileA( handle, &entry ));
+            FindClose( handle );
+        }
     }
 
+    /* scan drives */
     if ((ret >= 0) && (attrib & DDL_DRIVES))
     {
         char buffer[] = "[-a-]";
@@ -2689,6 +2694,9 @@
         return LB_OKAY;
 
     case LB_DIR16:
+        /* according to Win16 docs, DDL_DRIVES should make DDL_EXCLUSIVE
+         * be set automatically (this is different in Win32) */
+        if (wParam & DDL_DRIVES) wParam |= DDL_EXCLUSIVE;
         return LISTBOX_Directory( wnd, descr, wParam,
                                   (LPCSTR)PTR_SEG_TO_LIN(lParam), FALSE );
 
diff --git a/dlls/user/user.spec b/dlls/user/user.spec
index f7909d0..b85b729 100644
--- a/dlls/user/user.spec
+++ b/dlls/user/user.spec
@@ -102,7 +102,7 @@
 97  pascal16 CheckDlgButton(word word word) CheckDlgButton16
 98  pascal16 IsDlgButtonChecked(word word) IsDlgButtonChecked16
 99  pascal16 DlgDirSelect(word ptr word) DlgDirSelect16
-100 pascal16 DlgDirList(word ptr word word word) DlgDirList16
+100 pascal16 DlgDirList(word str word word word) DlgDirList16
 101 pascal   SendDlgItemMessage(word word word word long) SendDlgItemMessage16
 102 pascal16 AdjustWindowRect(ptr long word) AdjustWindowRect16
 103 pascal16 MapDialogRect(word ptr) MapDialogRect16
diff --git a/dlls/user/user32.spec b/dlls/user/user32.spec
index e1b441c..0cf3f38 100644
--- a/dlls/user/user32.spec
+++ b/dlls/user/user32.spec
@@ -155,10 +155,10 @@
 @ stdcall DialogBoxParamW(long wstr long ptr long) DialogBoxParamW
 @ stdcall DispatchMessageA(ptr) DispatchMessageA
 @ stdcall DispatchMessageW(ptr) DispatchMessageW
-@ stdcall DlgDirListA(long ptr long long long) DlgDirListA
+@ stdcall DlgDirListA(long str long long long) DlgDirListA
 @ stdcall DlgDirListComboBoxA(long ptr long long long) DlgDirListComboBoxA
 @ stdcall DlgDirListComboBoxW(long ptr long long long) DlgDirListComboBoxW
-@ stdcall DlgDirListW(long ptr long long long) DlgDirListW
+@ stdcall DlgDirListW(long wstr long long long) DlgDirListW
 @ stdcall DlgDirSelectComboBoxExA(long ptr long long) DlgDirSelectComboBoxExA
 @ stdcall DlgDirSelectComboBoxExW(long ptr long long) DlgDirSelectComboBoxExW
 @ stdcall DlgDirSelectExA(long ptr long long) DlgDirSelectExA