kernel32: Close the directory handle in FindNextFile as soon as we reach the end of the directory.

This commit is contained in:
Alexandre Julliard 2006-10-27 12:27:33 +02:00
parent 4471ad44a3
commit 5e08230568
1 changed files with 14 additions and 1 deletions

View File

@ -1546,6 +1546,7 @@ HANDLE WINAPI FindFirstFileExW( LPCWSTR filename, FINDEX_INFO_LEVELS level,
LPVOID data, FINDEX_SEARCH_OPS search_op,
LPVOID filter, DWORD flags)
{
static const WCHAR wildcardsW[] = { '*','?',0 };
WCHAR *mask, *p;
FIND_FIRST_INFO *info = NULL;
UNICODE_STRING nt_name;
@ -1637,6 +1638,12 @@ HANDLE WINAPI FindFirstFileExW( LPCWSTR filename, FINDEX_INFO_LEVELS level,
SetLastError( ERROR_FILE_NOT_FOUND );
return INVALID_HANDLE_VALUE;
}
if (!strpbrkW( info->mask.Buffer, wildcardsW ))
{
/* we can't find two files with the same name */
CloseHandle( info->handle );
info->handle = 0;
}
return (HANDLE)info;
error:
@ -1671,7 +1678,8 @@ BOOL WINAPI FindNextFileW( HANDLE handle, WIN32_FIND_DATAW *data )
RtlEnterCriticalSection( &info->cs );
for (;;)
if (!info->handle) SetLastError( ERROR_NO_MORE_FILES );
else for (;;)
{
if (info->data_pos >= info->data_len) /* need to read some more data */
{
@ -1682,6 +1690,11 @@ BOOL WINAPI FindNextFileW( HANDLE handle, WIN32_FIND_DATAW *data )
if (io.u.Status)
{
SetLastError( RtlNtStatusToDosError( io.u.Status ) );
if (io.u.Status == STATUS_NO_MORE_FILES)
{
CloseHandle( info->handle );
info->handle = 0;
}
break;
}
info->data_len = io.Information;