From: Nello De Gregoris <bluechxindv@gmail.com> --- dlls/ntoskrnl.exe/tests/driver.c | 66 ++++++++++++++++++++++++++++++++ 1 file changed, 66 insertions(+) diff --git a/dlls/ntoskrnl.exe/tests/driver.c b/dlls/ntoskrnl.exe/tests/driver.c index 12fc1b8fc0a..030c6476a52 100644 --- a/dlls/ntoskrnl.exe/tests/driver.c +++ b/dlls/ntoskrnl.exe/tests/driver.c @@ -2015,6 +2015,71 @@ static void test_dir_kernel_object(void) ZwClose(dir_handle); } +static void test_fsrtl_get_file_size(void) +{ + static const char data[] = "hello, world!"; + OBJECT_ATTRIBUTES attr = { sizeof(attr) }; + UNICODE_STRING pathU; + IO_STATUS_BLOCK io; + LARGE_INTEGER file_size, offset; + HANDLE file_handle, dir_handle; + FILE_OBJECT *file_obj, *dir_obj; + NTSTATUS status; + + /* test regular file */ + RtlInitUnicodeString(&pathU, L"\\??\\C:\\windows\\winetest_ntoskrnl_fsrtl.tmp"); + InitializeObjectAttributes(&attr, &pathU, OBJ_KERNEL_HANDLE | OBJ_CASE_INSENSITIVE, NULL, NULL); + status = ZwCreateFile(&file_handle, DELETE | FILE_WRITE_DATA | SYNCHRONIZE, &attr, &io, NULL, + FILE_ATTRIBUTE_NORMAL, FILE_SHARE_READ | FILE_SHARE_WRITE, + FILE_CREATE, FILE_DELETE_ON_CLOSE | FILE_SYNCHRONOUS_IO_NONALERT, NULL, 0); + ok(!status, "ZwCreateFile failed: %#lx\n", status); + if (status) + return; + + offset.QuadPart = 0; + status = ZwWriteFile(file_handle, NULL, NULL, NULL, &io, (void *)data, sizeof(data), &offset, NULL); + ok(!status, "ZwWriteFile failed: %#lx\n", status); + + status = ObReferenceObjectByHandle(file_handle, 0, *pIoFileObjectType, KernelMode, + (void **)&file_obj, NULL); + ok(!status, "ObReferenceObjectByHandle failed: %#lx\n", status); + if (!status) + { + file_size.QuadPart = 0; + status = FsRtlGetFileSize(file_obj, &file_size); + ok(!status, "FsRtlGetFileSize failed: %#lx\n", status); + ok(file_size.QuadPart == sizeof(data), "expected %Iu, got %I64d\n", + sizeof(data), file_size.QuadPart); + ObDereferenceObject(file_obj); + } + + ZwClose(file_handle); + + /* test directory returns STATUS_FILE_IS_A_DIRECTORY */ + RtlInitUnicodeString(&pathU, L"\\??\\C:\\windows"); + InitializeObjectAttributes(&attr, &pathU, OBJ_KERNEL_HANDLE | OBJ_CASE_INSENSITIVE, NULL, NULL); + status = ZwOpenFile(&dir_handle, FILE_READ_ATTRIBUTES | SYNCHRONIZE, &attr, &io, + FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, + FILE_DIRECTORY_FILE | FILE_SYNCHRONOUS_IO_NONALERT); + ok(!status, "ZwOpenFile failed: %#lx\n", status); + if (status) + return; + + status = ObReferenceObjectByHandle(dir_handle, 0, *pIoFileObjectType, KernelMode, + (void **)&dir_obj, NULL); + ok(!status, "ObReferenceObjectByHandle failed: %#lx\n", status); + if (!status) + { + file_size.QuadPart = 0; + status = FsRtlGetFileSize(dir_obj, &file_size); + ok(status == STATUS_FILE_IS_A_DIRECTORY, + "expected STATUS_FILE_IS_A_DIRECTORY, got %#lx\n", status); + ObDereferenceObject(dir_obj); + } + + ZwClose(dir_handle); +} + static PIO_WORKITEM work_item; static void WINAPI main_test_task(DEVICE_OBJECT *device, void *context) @@ -2558,6 +2623,7 @@ static NTSTATUS main_test(DEVICE_OBJECT *device, IRP *irp, IO_STACK_LOCATION *st test_IoAttachDeviceToDeviceStack(); test_object_name(); test_dir_kernel_object(); + test_fsrtl_get_file_size(); #if defined(__i386__) || defined(__x86_64__) test_executable_pool(); #endif -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/10247