From bae799382aa84dc54d01ddbc7259609194f922b5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Herm=C3=A8s=20B=C3=A9lusca-Ma=C3=AFto?= Date: Sat, 11 Jan 2025 22:31:47 +0100 Subject: [PATCH] [KMTESTS] Improve IoVolumeDeviceToDosName() tests (#6990) - Limit the HarddiskVolume loop to 32 trials (instead of an unknown number of them). Ideally the list of volumes has to be queried from the volume manager, instead of hardcoding them (TODO). - Verify that the buffer returned by IoVolumeDeviceToDosName() is indeed a unicode multi-string (ends with two NULs), and, in the case it specifies a volume GUID, that it's a valid one. --- modules/rostests/kmtests/ntos_io/IoVolume.c | 29 ++++++++++++++++----- 1 file changed, 23 insertions(+), 6 deletions(-) diff --git a/modules/rostests/kmtests/ntos_io/IoVolume.c b/modules/rostests/kmtests/ntos_io/IoVolume.c index 51d5eccfb3f..a0824e5ef82 100644 --- a/modules/rostests/kmtests/ntos_io/IoVolume.c +++ b/modules/rostests/kmtests/ntos_io/IoVolume.c @@ -6,7 +6,7 @@ */ #include - +#include static void @@ -24,17 +24,16 @@ TestIoVolumeDeviceToDosName(void) RtlInitEmptyUnicodeString(&VolumeDeviceName, VolumeDeviceNameBuffer, sizeof(VolumeDeviceNameBuffer)); - VolumeNumber = 0; - while (1) + // TODO: Query the partition/volume manager for the list of volumes. + for (VolumeNumber = 0; VolumeNumber < 32; ++VolumeNumber) { - VolumeNumber++; Status = RtlStringCbPrintfW(VolumeDeviceName.Buffer, VolumeDeviceName.MaximumLength, L"\\Device\\HarddiskVolume%lu", VolumeNumber); if (!NT_SUCCESS(Status)) { - trace("RtlStringCbPrintfW(0x%lx) failed with %lx\n", + trace("RtlStringCbPrintfW(%lu) failed with 0x%lx\n", VolumeNumber, Status); break; } @@ -46,7 +45,7 @@ TestIoVolumeDeviceToDosName(void) &DeviceObject); if (!NT_SUCCESS(Status)) { - trace("IoGetDeviceObjectPointer(%wZ) failed with %lx\n", + trace("IoGetDeviceObjectPointer(%wZ) failed with 0x%lx\n", &VolumeDeviceName, Status); continue; } @@ -56,6 +55,22 @@ TestIoVolumeDeviceToDosName(void) if (!skip(NT_SUCCESS(Status), "No DOS name\n")) { trace("DOS name for %wZ is %wZ\n", &VolumeDeviceName, &DosName); + + /* The DosName should contain one NUL-terminated string (always there?), + * plus one final NUL-terminator */ + ok(DosName.MaximumLength == DosName.Length + sizeof(UNICODE_NULL), + "Unexpected DOS name maximum length %hu, expected %hu\n", + DosName.MaximumLength, DosName.Length + sizeof(UNICODE_NULL)); + ok(DosName.Length >= sizeof(UNICODE_NULL), + "DOS name too short (length: %lu)\n", + DosName.Length / sizeof(WCHAR)); + ok(DosName.Buffer[DosName.Length / sizeof(WCHAR)] == UNICODE_NULL, + "Missing NUL-terminator (1)\n"); + ok(DosName.Buffer[DosName.MaximumLength / sizeof(WCHAR) - 1] == UNICODE_NULL, + "Missing NUL-terminator (2)\n"); + + /* The DOS name is either a drive letter, or a + * volume GUID name (if the volume is not mounted) */ if (DosName.Length == 2 * sizeof(WCHAR)) { ok(DosName.Buffer[0] >= L'A' && @@ -67,6 +82,8 @@ TestIoVolumeDeviceToDosName(void) { ok(RtlPrefixUnicodeString(&DosVolumePrefix, &DosName, FALSE), "Unexpected volume path: %wZ\n", &DosName); + ok(MOUNTMGR_IS_DOS_VOLUME_NAME(&DosName), + "Invalid DOS volume path returned: %wZ\n", &DosName); } RtlFreeUnicodeString(&DosName); }