1 /*
2 * PROJECT: ReactOS api tests
3 * LICENSE: GPLv2+ - See COPYING in the top level directory
4 * PURPOSE: Test for QueryPoints IOCTL
5 * PROGRAMMER: Pierre Schweitzer
6 */
7
8 #include "precomp.h"
9
10 VOID
TraceMountPoint(PMOUNTMGR_MOUNT_POINTS MountPoints,PMOUNTMGR_MOUNT_POINT MountPoint)11 TraceMountPoint(PMOUNTMGR_MOUNT_POINTS MountPoints,
12 PMOUNTMGR_MOUNT_POINT MountPoint)
13 {
14 trace("MountPoint: %p\n", MountPoint);
15 trace("\tSymbolicOffset: %ld\n", MountPoint->SymbolicLinkNameOffset);
16 trace("\tSymbolicLinkName: %.*S\n", MountPoint->SymbolicLinkNameLength / sizeof(WCHAR), (PWSTR)((ULONG_PTR)MountPoints + MountPoint->SymbolicLinkNameOffset));
17 trace("\tDeviceOffset: %ld\n", MountPoint->DeviceNameOffset);
18 trace("\tDeviceName: %.*S\n", MountPoint->DeviceNameLength / sizeof(WCHAR), (PWSTR)((ULONG_PTR)MountPoints + MountPoint->DeviceNameOffset));
19 }
20
START_TEST(QueryPoints)21 START_TEST(QueryPoints)
22 {
23 BOOL Ret;
24 HANDLE MountMgrHandle;
25 DWORD BytesReturned, Drives, i;
26 struct {
27 MOUNTMGR_MOUNT_POINT;
28 WCHAR Buffer[sizeof(L"\\DosDevice\\A:")];
29 } SinglePoint;
30 MOUNTMGR_MOUNT_POINTS MountPoints;
31 PMOUNTMGR_MOUNT_POINTS AllocatedPoints;
32
33 MountMgrHandle = CreateFileW(MOUNTMGR_DOS_DEVICE_NAME, 0,
34 FILE_SHARE_READ | FILE_SHARE_WRITE, NULL,
35 OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL,
36 INVALID_HANDLE_VALUE);
37 if (MountMgrHandle == INVALID_HANDLE_VALUE)
38 {
39 win_skip("MountMgr unavailable: %lx\n", GetLastError());
40 return;
41 }
42
43 ZeroMemory(&SinglePoint, sizeof(SinglePoint));
44
45 Ret = DeviceIoControl(MountMgrHandle, IOCTL_MOUNTMGR_QUERY_POINTS,
46 &SinglePoint, sizeof(MOUNTMGR_MOUNT_POINT),
47 &MountPoints, sizeof(MOUNTMGR_MOUNT_POINTS),
48 &BytesReturned, NULL);
49 ok(Ret == FALSE, "IOCTL unexpectedly succeed\n");
50 ok(GetLastError() == ERROR_MORE_DATA, "Unexcepted failure: %lx\n", GetLastError());
51
52 AllocatedPoints = RtlAllocateHeap(RtlGetProcessHeap(), 0, MountPoints.Size);
53 if (AllocatedPoints == NULL)
54 {
55 win_skip("Insufficiant memory\n");
56 }
57 else
58 {
59 AllocatedPoints->NumberOfMountPoints = 0;
60
61 Ret = DeviceIoControl(MountMgrHandle, IOCTL_MOUNTMGR_QUERY_POINTS,
62 &SinglePoint, sizeof(MOUNTMGR_MOUNT_POINT),
63 AllocatedPoints, MountPoints.Size,
64 &BytesReturned, NULL);
65 ok(Ret == TRUE, "IOCTL unexpectedly failed %lx\n", GetLastError());
66
67 for (i = 0; i < AllocatedPoints->NumberOfMountPoints; ++i)
68 {
69 TraceMountPoint(AllocatedPoints, &AllocatedPoints->MountPoints[i]);
70 }
71
72 RtlFreeHeap(RtlGetProcessHeap(), 0, AllocatedPoints);
73 }
74
75 Drives = GetLogicalDrives();
76 if (Drives == 0)
77 {
78 win_skip("Drives map unavailable: %lx\n", GetLastError());
79 goto Done;
80 }
81
82 for (i = 0; i < 26; i++)
83 {
84 if (!(Drives & (1 << i)))
85 {
86 break;
87 }
88 }
89
90 if (i == 26)
91 {
92 win_skip("All the drive letters are in use, skipping\n");
93 goto Done;
94 }
95
96 SinglePoint.SymbolicLinkNameOffset = sizeof(MOUNTMGR_MOUNT_POINT);
97 SinglePoint.SymbolicLinkNameLength = sizeof(L"\\DosDevice\\A:") - sizeof(UNICODE_NULL);
98 StringCbPrintfW((PWSTR)((ULONG_PTR)&SinglePoint + sizeof(MOUNTMGR_MOUNT_POINT)),
99 sizeof(L"\\DosDevice\\A:"),
100 L"\\DosDevice\\%C:",
101 i + L'A');
102
103 Ret = DeviceIoControl(MountMgrHandle, IOCTL_MOUNTMGR_QUERY_POINTS,
104 &SinglePoint, sizeof(SinglePoint),
105 &MountPoints, sizeof(MOUNTMGR_MOUNT_POINTS),
106 &BytesReturned, NULL);
107 ok(Ret == FALSE, "IOCTL unexpectedly succeed\n");
108 ok(GetLastError() == ERROR_FILE_NOT_FOUND, "Unexcepted failure: %lx\n", GetLastError());
109
110 Done:
111 CloseHandle(MountMgrHandle);
112 }
113