+ WIN32_FIND_DATA info;
+ struct dirent *data;
+ int ret;
+
+ if (!dir->dd_handle) {
+ char *dirname;
+ if (*dir->dd_name) {
+ size_t n = strlen(dir->dd_name);
+ if ((dir = (char*)mem_a(n+5))) {
+ platform_strncpy(dirname, dir->dd_name, n);
+ platform_strncpy(dirname + n, "\\*.*", 4);
+ }
+ } else {
+ if (!(dirname = util_strdup("\\*.*")))
+ return NULL;
+ }
+
+ dir->dd_handle = (long)FindFirstFile(dirname, &info);
+ mem_d(dirname);
+ ret = !(!dir->dd_handle);
+ } else if (dir->dd_handle != -11) {
+ ret = FindNextFile((HANDLE)dir->dd_handle, &info);
+ } else {
+ ret = 0;
+ }
+
+ if (!ret)
+ return NULL;
+
+ if ((data = (struct dirent*)mem_a(sizeof(struct dirent)))) {
+ platform_strncpy(data->d_name, info.cFileName, FILENAME_MAX - 1);
+ data->d_name[FILENAME_MAX - 1] = '\0';
+ data->d_namelen = strlen(data->d_name);
+ }
+
+ return data;