From: Sebastian Lackner Subject: ntdll: Return STATUS_INVALID_DEVICE_REQUEST when calling NtReadFile on directory. Message-Id: <56033C28.1060602@fds-team.de> Date: Thu, 24 Sep 2015 01:56:24 +0200 Signed-off-by: Sebastian Lackner --- dlls/ntdll/file.c | 2 +- dlls/ntdll/tests/file.c | 16 ++++++++++++++++ 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/dlls/ntdll/file.c b/dlls/ntdll/file.c index be6b591..e4370dc 100644 --- a/dlls/ntdll/file.c +++ b/dlls/ntdll/file.c @@ -444,7 +444,7 @@ NTSTATUS FILE_GetNtStatus(void) case EACCES: return STATUS_ACCESS_DENIED; case ENOTDIR: return STATUS_OBJECT_PATH_NOT_FOUND; case ENOENT: return STATUS_OBJECT_NAME_NOT_FOUND; - case EISDIR: return STATUS_FILE_IS_A_DIRECTORY; + case EISDIR: return STATUS_INVALID_DEVICE_REQUEST; case EMFILE: case ENFILE: return STATUS_TOO_MANY_OPENED_FILES; case EINVAL: return STATUS_INVALID_PARAMETER; diff --git a/dlls/ntdll/tests/file.c b/dlls/ntdll/tests/file.c index d68be15..d192afb 100644 --- a/dlls/ntdll/tests/file.c +++ b/dlls/ntdll/tests/file.c @@ -179,6 +179,9 @@ static void create_file_test(void) OBJECT_ATTRIBUTES attr; IO_STATUS_BLOCK io; UNICODE_STRING nameW; + LARGE_INTEGER offset; + char buf[32]; + DWORD ret; GetCurrentDirectoryW( MAX_PATH, path ); pRtlDosPathNameToNtPathName_U( path, &nameW, NULL, NULL ); @@ -193,6 +196,19 @@ static void create_file_test(void) status = pNtCreateFile( &dir, GENERIC_READ, &attr, &io, NULL, 0, FILE_SHARE_READ|FILE_SHARE_WRITE, FILE_OPEN, FILE_DIRECTORY_FILE, NULL, 0 ); ok( !status, "open %s failed %x\n", wine_dbgstr_w(nameW.Buffer), status ); + + U(io).Status = 0xdeadbeef; + offset.QuadPart = 0; + status = pNtReadFile( dir, NULL, NULL, NULL, &io, buf, sizeof(buf), &offset, NULL ); + ok( status == STATUS_INVALID_DEVICE_REQUEST || status == STATUS_PENDING, "NtReadFile error %08x\n", status ); + if (status == STATUS_PENDING) + { + ret = WaitForSingleObject( dir, 1000 ); + ok( ret == WAIT_OBJECT_0, "WaitForSingleObject error %u\n", ret ); + ok( U(io).Status == STATUS_INVALID_DEVICE_REQUEST, + "expected STATUS_INVALID_DEVICE_REQUEST, got %08x\n", U(io).Status ); + } + CloseHandle( dir ); status = pNtCreateFile( &dir, GENERIC_READ, &attr, &io, NULL, 0, FILE_SHARE_READ|FILE_SHARE_WRITE, -- 2.5.1