mirror of
https://github.com/reactos/reactos.git
synced 2024-08-21 19:03:01 +00:00
113 lines
3.9 KiB
C
113 lines
3.9 KiB
C
/*
|
|
* PROJECT: ReactOS api tests
|
|
* LICENSE: GPLv2+ - See COPYING in the top level directory
|
|
* PURPOSE: Test for QueryPoints IOCTL
|
|
* PROGRAMMER: Pierre Schweitzer
|
|
*/
|
|
|
|
#include "precomp.h"
|
|
|
|
VOID
|
|
TraceMountPoint(PMOUNTMGR_MOUNT_POINTS MountPoints,
|
|
PMOUNTMGR_MOUNT_POINT MountPoint)
|
|
{
|
|
trace("MountPoint: %p\n", MountPoint);
|
|
trace("\tSymbolicOffset: %ld\n", MountPoint->SymbolicLinkNameOffset);
|
|
trace("\tSymbolicLinkName: %.*S\n", MountPoint->SymbolicLinkNameLength / sizeof(WCHAR), (PWSTR)((ULONG_PTR)MountPoints + MountPoint->SymbolicLinkNameOffset));
|
|
trace("\tDeviceOffset: %ld\n", MountPoint->DeviceNameOffset);
|
|
trace("\tDeviceName: %.*S\n", MountPoint->DeviceNameLength / sizeof(WCHAR), (PWSTR)((ULONG_PTR)MountPoints + MountPoint->DeviceNameOffset));
|
|
}
|
|
|
|
START_TEST(QueryPoints)
|
|
{
|
|
BOOL Ret;
|
|
HANDLE MountMgrHandle;
|
|
DWORD BytesReturned, Drives, i;
|
|
struct {
|
|
MOUNTMGR_MOUNT_POINT;
|
|
WCHAR Buffer[sizeof(L"\\DosDevice\\A:")];
|
|
} SinglePoint;
|
|
MOUNTMGR_MOUNT_POINTS MountPoints;
|
|
PMOUNTMGR_MOUNT_POINTS AllocatedPoints;
|
|
|
|
MountMgrHandle = CreateFileW(MOUNTMGR_DOS_DEVICE_NAME, 0,
|
|
FILE_SHARE_READ | FILE_SHARE_WRITE, NULL,
|
|
OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL,
|
|
INVALID_HANDLE_VALUE);
|
|
if (MountMgrHandle == INVALID_HANDLE_VALUE)
|
|
{
|
|
win_skip("MountMgr unavailable: %lx\n", GetLastError());
|
|
return;
|
|
}
|
|
|
|
ZeroMemory(&SinglePoint, sizeof(SinglePoint));
|
|
|
|
Ret = DeviceIoControl(MountMgrHandle, IOCTL_MOUNTMGR_QUERY_POINTS,
|
|
&SinglePoint, sizeof(MOUNTMGR_MOUNT_POINT),
|
|
&MountPoints, sizeof(MOUNTMGR_MOUNT_POINTS),
|
|
&BytesReturned, NULL);
|
|
ok(Ret == FALSE, "IOCTL unexpectedly succeed\n");
|
|
ok(GetLastError() == ERROR_MORE_DATA, "Unexcepted failure: %lx\n", GetLastError());
|
|
|
|
AllocatedPoints = RtlAllocateHeap(RtlGetProcessHeap(), 0, MountPoints.Size);
|
|
if (AllocatedPoints == NULL)
|
|
{
|
|
win_skip("Insufficiant memory\n");
|
|
}
|
|
else
|
|
{
|
|
AllocatedPoints->NumberOfMountPoints = 0;
|
|
|
|
Ret = DeviceIoControl(MountMgrHandle, IOCTL_MOUNTMGR_QUERY_POINTS,
|
|
&SinglePoint, sizeof(MOUNTMGR_MOUNT_POINT),
|
|
AllocatedPoints, MountPoints.Size,
|
|
&BytesReturned, NULL);
|
|
ok(Ret == TRUE, "IOCTL unexpectedly failed %lx\n", GetLastError());
|
|
|
|
for (i = 0; i < AllocatedPoints->NumberOfMountPoints; ++i)
|
|
{
|
|
TraceMountPoint(AllocatedPoints, &AllocatedPoints->MountPoints[i]);
|
|
}
|
|
|
|
RtlFreeHeap(RtlGetProcessHeap(), 0, AllocatedPoints);
|
|
}
|
|
|
|
Drives = GetLogicalDrives();
|
|
if (Drives == 0)
|
|
{
|
|
win_skip("Drives map unavailable: %lx\n", GetLastError());
|
|
goto Done;
|
|
}
|
|
|
|
for (i = 0; i < 26; i++)
|
|
{
|
|
if (!(Drives & (1 << i)))
|
|
{
|
|
break;
|
|
}
|
|
}
|
|
|
|
if (i == 26)
|
|
{
|
|
win_skip("All the drive letters are in use, skipping\n");
|
|
goto Done;
|
|
}
|
|
|
|
SinglePoint.SymbolicLinkNameOffset = sizeof(MOUNTMGR_MOUNT_POINT);
|
|
SinglePoint.SymbolicLinkNameLength = sizeof(L"\\DosDevice\\A:") - sizeof(UNICODE_NULL);
|
|
StringCbPrintfW((PWSTR)((ULONG_PTR)&SinglePoint + sizeof(MOUNTMGR_MOUNT_POINT)),
|
|
sizeof(L"\\DosDevice\\A:"),
|
|
L"\\DosDevice\\%C:",
|
|
i + L'A');
|
|
|
|
Ret = DeviceIoControl(MountMgrHandle, IOCTL_MOUNTMGR_QUERY_POINTS,
|
|
&SinglePoint, sizeof(SinglePoint),
|
|
&MountPoints, sizeof(MOUNTMGR_MOUNT_POINTS),
|
|
&BytesReturned, NULL);
|
|
ok(Ret == FALSE, "IOCTL unexpectedly succeed\n");
|
|
ok(GetLastError() == ERROR_FILE_NOT_FOUND, "Unexcepted failure: %lx\n", GetLastError());
|
|
|
|
Done:
|
|
CloseHandle(MountMgrHandle);
|
|
}
|