diff --git a/src/include/port/win32_msvc/dirent.h b/src/include/port/win32_msvc/dirent.h
index 9fabdf3..d339242 100644
--- a/src/include/port/win32_msvc/dirent.h
+++ b/src/include/port/win32_msvc/dirent.h
@@ -10,6 +10,7 @@ struct dirent
 {
 	long		d_ino;
 	unsigned short d_reclen;
+	unsigned char d_type;
 	unsigned short d_namlen;
 	char		d_name[MAX_PATH];
 };
@@ -20,4 +21,14 @@ DIR		   *opendir(const char *);
 struct dirent *readdir(DIR *);
 int			closedir(DIR *);
 
+/* File types for 'd_type'.  */
+# define DT_UNKNOWN		0
+# define DT_FIFO		1
+# define DT_CHR			2
+# define DT_DIR			4
+# define DT_BLK			6
+# define DT_REG			8
+# define DT_LNK			10
+# define DT_SOCK		12
+# define DT_WHT			14
 #endif
diff --git a/src/port/dirent.c b/src/port/dirent.c
index b264484..83db153 100644
--- a/src/port/dirent.c
+++ b/src/port/dirent.c
@@ -69,6 +69,7 @@ opendir(const char *dirname)
 	d->handle = INVALID_HANDLE_VALUE;
 	d->ret.d_ino = 0;			/* no inodes on win32 */
 	d->ret.d_reclen = 0;		/* not used on win32 */
+	d->ret.d_type = DT_UNKNOWN;
 
 	return d;
 }
@@ -105,6 +106,15 @@ readdir(DIR *d)
 	}
 	strcpy(d->ret.d_name, fd.cFileName);	/* Both strings are MAX_PATH long */
 	d->ret.d_namlen = strlen(d->ret.d_name);
+	/* The only identifed types are: directory, regular file or symbolic link */
+	if ((fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) != 0)
+		d->ret.d_type = DT_DIR;
+	/* For reparse points dwReserved0 field will contain the ReparseTag */
+	else if ((fd.dwFileAttributes & FILE_ATTRIBUTE_REPARSE_POINT) != 0
+			 && (fd.dwReserved0 == IO_REPARSE_TAG_MOUNT_POINT))
+		d->ret.d_type = DT_LNK;
+	else
+		d->ret.d_type = DT_REG;
 
 	return &d->ret;
 }
