Author: pschweitzer
Date: Sun Apr 30 11:43:04 2017
New Revision: 74432
URL:
http://svn.reactos.org/svn/reactos?rev=74432&view=rev
Log:
[KERNEL32_APITEST]
- Refactor a bit tests, to split more logically tests
- Fix a bug in tests
- Add new tests for MountMgr showing our storage stack doesn't behave as expected
Modified:
trunk/rostests/apitests/kernel32/DeviceIoControl.c
Modified: trunk/rostests/apitests/kernel32/DeviceIoControl.c
URL:
http://svn.reactos.org/svn/reactos/trunk/rostests/apitests/kernel32/DeviceI…
==============================================================================
--- trunk/rostests/apitests/kernel32/DeviceIoControl.c [iso-8859-1] (original)
+++ trunk/rostests/apitests/kernel32/DeviceIoControl.c [iso-8859-1] Sun Apr 30 11:43:04
2017
@@ -8,32 +8,19 @@
#include <apitest.h>
#include <strsafe.h>
#include <winioctl.h>
+#include <mountmgr.h>
-START_TEST(DeviceIoControl)
+WCHAR Letter;
+HANDLE Device;
+
+static
+VOID
+GetDiskGeometry(VOID)
{
UINT Ret;
- WCHAR Letter;
- HANDLE Device;
DISK_GEOMETRY DG;
DWORD Size, Error;
- WCHAR Path[MAX_PATH];
DISK_GEOMETRY_EX DGE;
-
- Path[0] = 'C';
- Path[1] = ':';
- Path[2] = '\\';
- Ret = GetSystemDirectoryW(Path, MAX_PATH);
- ok(Ret > 0, "GetSystemDirectory failed\n");
-
- Letter = Path[0];
- ok(Path[1] == ':', "Not a drive letter: %c\n", Path[1]);
- ok(Path[2] == '\\', "Not a drive letter: %c\n", Path[2]);
-
- Ret = StringCchPrintfW(Path, MAX_PATH, L"%\\\\?\\c:", Letter);
- ok(Ret == S_OK, "StringCchPrintfW failed: %d\n", Ret);
-
- Device = CreateFileW(Path, 0, FILE_SHARE_DELETE | FILE_SHARE_READ | FILE_SHARE_WRITE,
NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
- ok(Device != INVALID_HANDLE_VALUE, "CreateFileW for %S failed: %ld\n",
Path, GetLastError());
Size = 0;
Ret = DeviceIoControl(Device, IOCTL_DISK_GET_DRIVE_GEOMETRY, NULL, 0, &DG,
sizeof(DG) - 1, &Size, NULL);
@@ -63,6 +50,93 @@
Ret = DeviceIoControl(Device, IOCTL_DISK_GET_DRIVE_GEOMETRY_EX, NULL, 0, &DGE,
sizeof(DGE), &Size, NULL);
ok(Ret != 0, "DeviceIoControl failed: %ld\n", GetLastError());
ok(Size == sizeof(DGE), "Invalid output size: %ld\n", Size);
+}
+
+static
+VOID
+QueryDeviceName(VOID)
+{
+ UINT Ret;
+ BOOL IsValid;
+ DWORD Size, Error;
+ MOUNTDEV_NAME MDN, *AllocatedMDN;
+
+ Ret = DeviceIoControl(Device, IOCTL_MOUNTDEV_QUERY_DEVICE_NAME, NULL, 0, &MDN,
sizeof(MDN) - 1, &Size, NULL);
+ ok(Ret == 0, "DeviceIoControl succeed\n");
+ Error = GetLastError();
+ ok(Error == ERROR_INVALID_PARAMETER, "Expecting ERROR_INVALID_PARAMETER, got
%ld\n", Error);
+ ok(Size == 40 /* ?! */, "Invalid output size: %ld\n", Size);
+
+ Ret = DeviceIoControl(Device, IOCTL_MOUNTDEV_QUERY_DEVICE_NAME, NULL, 0, &MDN,
sizeof(MDN), &Size, NULL);
+ ok(Ret == 0, "DeviceIoControl succeed\n");
+ Error = GetLastError();
+ ok(Error == ERROR_MORE_DATA, "Expecting ERROR_MORE_DATA, got %ld\n",
Error);
+ ok(Size == sizeof(MOUNTDEV_NAME), "Invalid output size: %ld\n", Size);
+
+ AllocatedMDN = HeapAlloc(GetProcessHeap(), 0, FIELD_OFFSET(MOUNTDEV_NAME, Name) +
MDN.NameLength + sizeof(UNICODE_NULL));
+ if (AllocatedMDN == NULL)
+ {
+ skip("Memory allocation failure\n");
+ return;
+ }
+
+ Size = 0;
+ Ret = DeviceIoControl(Device, IOCTL_MOUNTDEV_QUERY_DEVICE_NAME, NULL, 0,
AllocatedMDN, FIELD_OFFSET(MOUNTDEV_NAME, Name) + MDN.NameLength, &Size, NULL);
+ ok(Ret != 0, "DeviceIoControl failed: %ld\n", GetLastError());
+ ok(Size == FIELD_OFFSET(MOUNTDEV_NAME, Name) + MDN.NameLength, "Invalid output
size: %ld\n", Size);
+ ok(AllocatedMDN->NameLength == MDN.NameLength, "Mismatching sizes: %d
%d\n", AllocatedMDN->NameLength, MDN.NameLength);
+
+ if (Ret != 0)
+ {
+ IsValid = FALSE;
+ AllocatedMDN->Name[AllocatedMDN->NameLength / sizeof(WCHAR) - 1] =
UNICODE_NULL;
+
+ if (wcsstr(AllocatedMDN->Name, L"\\Device\\HarddiskVolume") !=
NULL)
+ {
+ IsValid = TRUE;
+ }
+ else if (wcsstr(AllocatedMDN->Name, L"\\DosDevices\\") != NULL)
+ {
+ IsValid = (AllocatedMDN->Name[12] == Letter &&
AllocatedMDN->Name[13] == L':');
+ }
+
+ ok(IsValid, "Invalid name: %.*S", AllocatedMDN->NameLength,
AllocatedMDN->Name);
+ }
+ else
+ {
+ skip("Failed to query device name\n");
+ }
+
+ HeapFree(GetProcessHeap(), 0, AllocatedMDN);
+}
+
+START_TEST(DeviceIoControl)
+{
+ UINT Ret;
+ WCHAR Path[MAX_PATH];
+
+ Path[0] = 'C';
+ Path[1] = ':';
+ Path[2] = '\\';
+ Ret = GetSystemDirectoryW(Path, MAX_PATH);
+ ok(Ret > 0, "GetSystemDirectory failed\n");
+
+ Letter = towupper(Path[0]);
+ ok(Path[1] == ':', "Not a drive letter: %c\n", Path[1]);
+ ok(Path[2] == '\\', "Not a drive letter: %c\n", Path[2]);
+
+ Ret = StringCchPrintfW(Path, MAX_PATH, L"\\\\?\\%c:", Letter);
+ ok(Ret == S_OK, "StringCchPrintfW failed: %d\n", Ret);
+
+ Device = CreateFileW(Path, 0, FILE_SHARE_DELETE | FILE_SHARE_READ | FILE_SHARE_WRITE,
NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
+ if (Device == INVALID_HANDLE_VALUE)
+ {
+ skip("CreateFileW for %S failed: %ld\n", Path, GetLastError());
+ return;
+ }
+
+ GetDiskGeometry();
+ QueryDeviceName();
CloseHandle(Device);
}