Skip directory symlinks in DOSFS_FindNextEx.

diff --git a/files/dos_fs.c b/files/dos_fs.c
index d4dd2c3..5c1da9a 100644
--- a/files/dos_fs.c
+++ b/files/dos_fs.c
@@ -1362,7 +1362,7 @@
  */
 static int DOSFS_FindNextEx( FIND_FIRST_INFO *info, WIN32_FIND_DATAA *entry )
 {
-    BYTE attr = info->attr | FA_UNUSED | FA_ARCHIVE | FA_RDONLY;
+    DWORD attr = info->attr | FA_UNUSED | FA_ARCHIVE | FA_RDONLY | FILE_ATTRIBUTE_SYMLINK;
     UINT flags = DRIVE_GetFlags( info->drive );
     char *p, buffer[MAX_PATHNAME_LEN];
     const char *drive_path;
@@ -1436,6 +1436,15 @@
             WARN("can't stat %s\n", buffer);
             continue;
         }
+        if ((fileinfo.dwFileAttributes & FILE_ATTRIBUTE_SYMLINK) &&
+            (fileinfo.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY))
+        {
+            static int show_dir_symlinks = -1;
+            if (show_dir_symlinks == -1)
+                show_dir_symlinks = PROFILE_GetWineIniBool("wine", "ShowDirSymlinks", 0);
+            if (!show_dir_symlinks) continue;
+        }
+
         if (fileinfo.dwFileAttributes & ~attr) continue;
 
         /* We now have a matching entry; fill the result and return */
diff --git a/files/file.c b/files/file.c
index 15201c3..2f9bc30 100644
--- a/files/file.c
+++ b/files/file.c
@@ -617,14 +617,24 @@
 {
     struct stat st;
 
-    if (!unixName || !info) return FALSE;
-
-    if (stat( unixName, &st ) == -1)
+    if (lstat( unixName, &st ) == -1)
     {
         FILE_SetDosError();
         return FALSE;
     }
-    FILE_FillInfo( &st, info );
+    if (!S_ISLNK(st.st_mode)) FILE_FillInfo( &st, info );
+    else
+    {
+        /* do a "real" stat to find out
+	   about the type of the symlink destination */
+        if (stat( unixName, &st ) == -1)
+        {
+            FILE_SetDosError();
+            return FALSE;
+        }
+        FILE_FillInfo( &st, info );
+        info->dwFileAttributes |= FILE_ATTRIBUTE_SYMLINK;
+    }
     return TRUE;
 }
 
diff --git a/include/winnt.h b/include/winnt.h
index 67b50d6..60afdc4 100644
--- a/include/winnt.h
+++ b/include/winnt.h
@@ -2891,6 +2891,7 @@
 #define FILE_ATTRIBUTE_XACTION_WRITE    0x00000400L
 #define FILE_ATTRIBUTE_COMPRESSED       0x00000800L
 #define FILE_ATTRIBUTE_OFFLINE		0x00001000L
+#define FILE_ATTRIBUTE_SYMLINK		0x80000000L  /* Not in Windows API */
 
 /* File notification flags */
 #define FILE_NOTIFY_CHANGE_FILE_NAME    0x00000001