From: Elizabeth Figura <zfigura@codeweavers.com> --- dlls/ntoskrnl.exe/tests/driver.c | 12 ++++++++++-- dlls/ntoskrnl.exe/tests/ntoskrnl.c | 21 +++++++++++++++++++++ 2 files changed, 31 insertions(+), 2 deletions(-) diff --git a/dlls/ntoskrnl.exe/tests/driver.c b/dlls/ntoskrnl.exe/tests/driver.c index f30c340e9bd..ece4923dd06 100644 --- a/dlls/ntoskrnl.exe/tests/driver.c +++ b/dlls/ntoskrnl.exe/tests/driver.c @@ -2936,6 +2936,11 @@ static NTSTATUS WINAPI driver_QueryVolumeInformation(DEVICE_OBJECT *device, IRP return STATUS_PENDING; } + case FileFsDeviceInformation: + /* This one is actually handled by the I/O manager; + * it's never passed down to a driver. */ + todo_wine ok(0, "Unexpected call.\n"); + /* fall through */ default: ret = STATUS_NOT_IMPLEMENTED; break; @@ -3011,14 +3016,17 @@ NTSTATUS WINAPI DriverEntry(DRIVER_OBJECT *driver, PUNICODE_STRING registry) RtlInitUnicodeString(&nameW, L"\\Device\\WineTestDriver"); RtlInitUnicodeString(&linkW, L"\\DosDevices\\WineTestDriver"); - status = IoCreateDevice(driver, 0, &nameW, FILE_DEVICE_UNKNOWN, FILE_DEVICE_SECURE_OPEN, FALSE, &lower_device); + status = IoCreateDevice(driver, 0, &nameW, FILE_DEVICE_UNKNOWN, + FILE_DEVICE_SECURE_OPEN | FILE_FLOPPY_DISKETTE | FILE_PORTABLE_DEVICE, + FALSE, &lower_device); ok(!status, "failed to create device, status %#lx\n", status); status = IoCreateSymbolicLink(&linkW, &nameW); ok(!status, "failed to create link, status %#lx\n", status); lower_device->Flags &= ~DO_DEVICE_INITIALIZING; RtlInitUnicodeString(&nameW, L"\\Device\\WineTestUpper"); - status = IoCreateDevice(driver, 0, &nameW, FILE_DEVICE_UNKNOWN, FILE_DEVICE_SECURE_OPEN, FALSE, &upper_device); + status = IoCreateDevice(driver, 16, &nameW, FILE_DEVICE_UNKNOWN, + FILE_DEVICE_SECURE_OPEN | FILE_READ_ONLY_DEVICE, FALSE, &upper_device); ok(!status, "failed to create device, status %#lx\n", status); IoAttachDeviceToDeviceStack(upper_device, lower_device); diff --git a/dlls/ntoskrnl.exe/tests/ntoskrnl.c b/dlls/ntoskrnl.exe/tests/ntoskrnl.c index 0f0caf76132..944449ca859 100644 --- a/dlls/ntoskrnl.exe/tests/ntoskrnl.c +++ b/dlls/ntoskrnl.exe/tests/ntoskrnl.c @@ -1187,6 +1187,7 @@ static void test_object_info(void) OBJECT_TYPE_INFORMATION *type_info = (OBJECT_TYPE_INFORMATION *)buffer; FILE_FS_VOLUME_INFORMATION *volume_info = (FILE_FS_VOLUME_INFORMATION *)buffer; FILE_NAME_INFORMATION *file_info = (FILE_NAME_INFORMATION *)buffer; + FILE_FS_DEVICE_INFORMATION device_info; HANDLE file; NTSTATUS status; IO_STATUS_BLOCK io; @@ -1208,6 +1209,26 @@ static void test_object_info(void) status = NtQueryVolumeInformationFile(device, &io, buffer, sizeof(buffer), FileFsVolumeInformation); todo_wine ok(status == STATUS_INVALID_DEVICE_REQUEST, "got %#lx\n", status); + io.Status = 0xdeadf00d; + io.Information = 0xdeadf00d; + status = NtQueryVolumeInformationFile(device, &io, &device_info, sizeof(device_info) - 1, FileFsDeviceInformation); + todo_wine ok(status == STATUS_INFO_LENGTH_MISMATCH, "got %#lx\n", status); + ok(io.Status == 0xdeadf00d, "got status %#lx\n", io.Status); + ok(io.Information == 0xdeadf00d, "got information %Iu\n", io.Information); + + io.Status = 0xdeadf00d; + io.Information = 0xdeadf00d; + status = NtQueryVolumeInformationFile(device, &io, &device_info, sizeof(device_info), FileFsDeviceInformation); + todo_wine ok(!status, "got %#lx\n", status); + todo_wine ok(!io.Status, "got status %#lx\n", io.Status); + todo_wine ok(io.Information == sizeof(FILE_FS_DEVICE_INFORMATION), "got information %Iu\n", io.Information); + if (!status) + { + ok(device_info.DeviceType == FILE_DEVICE_UNKNOWN, "Got type %#lx.\n", device_info.DeviceType); + ok(device_info.Characteristics == (FILE_DEVICE_SECURE_OPEN | FILE_FLOPPY_DISKETTE | FILE_PORTABLE_DEVICE), + "Got characteristics %#lx.\n", device_info.Characteristics); + } + file = CreateFileA("\\\\.\\WineTestDriver\\subfile", 0, 0, NULL, OPEN_EXISTING, 0, NULL); todo_wine ok(file != INVALID_HANDLE_VALUE, "got error %lu\n", GetLastError()); if (file == INVALID_HANDLE_VALUE) return; -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/9941