36 ULONG DeviceNameLength;
50 *pVolumePathPtr =
NULL;
64 &VolumePath,
sizeof(VolumePath));
69 skip(
"Device '%S': Doesn't support MountMgr queries, Status 0x%08lx\n",
76 "Device '%S': IOCTL 0x%lx failed unexpectedly, Status 0x%08lx\n",
77 NtVolumeName, IoctlPathOrPaths,
Status);
80 skip(
"Device '%S': Wrong Status\n", NtVolumeName);
90 "Device '%S': DOS volume path too large: %lu\n",
94 skip(
"Device '%S': Wrong Length\n", NtVolumeName);
102 skip(
"Device '%S': Failed to allocate buffer with size %lu)\n",
116 "Device '%S': IOCTL 0x%lx failed unexpectedly, Status 0x%08lx\n",
117 NtVolumeName, IoctlPathOrPaths,
Status);
127 *pVolumePathPtr = VolumePathPtr;
166 *pMountPointsPtr =
NULL;
182 &MountPoints,
sizeof(MountPoints));
187 skip(
"Device '%S': Doesn't support MountMgr queries, Status 0x%08lx\n",
194 "Device '%S': IOCTL 0x%lx failed unexpectedly, Status 0x%08lx\n",
198 skip(
"Device '%S': Wrong Status\n", NtVolumeName);
209 skip(
"Device '%S': Failed to allocate buffer with size %lu)\n",
223 "Device '%S': IOCTL 0x%lx failed unexpectedly, Status 0x%08lx\n",
228 trace(
"IOCTL_MOUNTMGR_QUERY_POINTS returned:\n"
230 " NumberOfMountPoints: %lu\n",
231 MountPointsPtr->
Size,
240 *pMountPointsPtr = MountPointsPtr;
244#define IS_DRIVE_LETTER_PFX(s) \
245 ((s)->Length >= 2*sizeof(WCHAR) && (s)->Buffer[0] >= 'A' && \
246 (s)->Buffer[0] <= 'Z' && (s)->Buffer[1] == ':')
249#define IS_DRIVE_LETTER(s) \
250 (IS_DRIVE_LETTER_PFX(s) && (s)->Length == 2*sizeof(WCHAR))
268 "DOS volume path string too short (length: %lu)\n",
269 VolumePath->MultiSzLength /
sizeof(
WCHAR));
271 "Missing NUL-terminator (2)\n");
273 "Missing NUL-terminator (1)\n");
279 DosPath.
Buffer = VolumePath->MultiSz;
285 "Invalid DOS volume path returned '%s'\n",
wine_dbgstr_us(&DosPath));
304 "DOS volume path string too short (length: %lu)\n",
305 VolumePaths->MultiSzLength /
sizeof(
WCHAR));
308 if (VolumePaths->MultiSzLength >= 2 *
sizeof(
UNICODE_NULL),
312 "Missing NUL-terminator (2)\n");
316 "Missing NUL-terminator (1)\n");
320 trace(
"\n%S =>\n", NtVolumeName);
321 for (pMountPoint = VolumePaths->MultiSz; *pMountPoint;
322 pMountPoint +=
wcslen(pMountPoint) + 1)
324 printf(
" '%S'\n", pMountPoint);
329 for (pMountPoint = VolumePaths->MultiSz; *pMountPoint;
330 pMountPoint +=
wcslen(pMountPoint) + 1)
337 "Invalid DOS volume path returned '%s'\n",
wine_dbgstr_us(&DosPath));
360 "DOS VolumePaths list isn't long enough\n");
362 "Empty DOS VolumePaths list\n");
366 ok(AreEqual,
"DOS paths '%s' and '%s' are not the same!\n",
377 "DOS VolumePaths list isn't 1 WCHAR long\n");
379 "Non-empty DOS VolumePaths list\n");
402 DosPath->Buffer[1] =
L'?';
404 for (
i = 0;
i < MountPoints->NumberOfMountPoints; ++
i)
441 DosPath->Buffer[1] =
L'\\';
463 trace(
"\n%S =>\n", NtVolumeName);
464 for (
i = 0;
i < MountPoints->NumberOfMountPoints; ++
i)
494 "DOS path '%s' %sfound in the mount points list, expected %sto be found\n",
504 for (pMountPoint = VolumePaths->MultiSz; *pMountPoint;
505 pMountPoint +=
wcslen(pMountPoint) + 1)
512 "DOS path '%s' %sfound in the mount points list, expected %sto be found\n",
533 trace(
"%S\n", NtVolumeName);
542 skip(
"Device '%S': IOCTL_MOUNTMGR_QUERY_DOS_VOLUME_PATH failed\n", NtVolumeName);
551 skip(
"Device '%S': IOCTL_MOUNTMGR_QUERY_DOS_VOLUME_PATHS failed\n", NtVolumeName);
557 skip(
"Device '%S': IOCTL_MOUNTMGR_QUERY_POINTS failed\n", NtVolumeName);
603 "No trailing backslash found\n");
609 if (szVolumeName[
Length - 1] ==
L'\\')
617 if (szVolumeName[0] ==
L'\\' && szVolumeName[1] ==
L'\\' &&
618 szVolumeName[2] ==
L'?' && szVolumeName[3] ==
L'\\')
620 szVolumeName[1] =
L'?';
629 wcscpy(szVolumeName,
L"\\DosDevices\\?:");
630 szVolumeName[
sizeof(
"\\DosDevices\\")-1] =
SharedUserData->NtSystemRoot[0];
static VOID Call_QueryDosVolume_Path_Paths(_In_ HANDLE MountMgrHandle, _In_ PCWSTR NtVolumeName, _In_ ULONG IoctlPathOrPaths, _Out_ PMOUNTMGR_VOLUME_PATHS *pVolumePathPtr)
Invokes either IOCTL_MOUNTMGR_QUERY_DOS_VOLUME_PATH or IOCTL_MOUNTMGR_QUERY_DOS_VOLUME_PATHS for test...
static VOID Test_QueryDosVolumePathAndPaths(_In_ HANDLE MountMgrHandle, _In_ PCWSTR NtVolumeName)
Tests the consistency of IOCTL_MOUNTMGR_QUERY_DOS_VOLUME_PATH, IOCTL_MOUNTMGR_QUERY_DOS_VOLUME_PATHS ...
static VOID Test_QueryPoints(_In_ PCWSTR NtVolumeName, _In_ PMOUNTMGR_MOUNT_POINTS MountPoints, _In_opt_ PMOUNTMGR_VOLUME_PATHS VolumePath, _In_opt_ PMOUNTMGR_VOLUME_PATHS VolumePaths)
Tests the output of IOCTL_MOUNTMGR_QUERY_POINTS.
#define IS_DRIVE_LETTER(s)
static VOID Test_QueryDosVolumePaths(_In_ PCWSTR NtVolumeName, _In_ PMOUNTMGR_VOLUME_PATHS VolumePaths, _In_opt_ PMOUNTMGR_VOLUME_PATHS VolumePath)
Tests the output of IOCTL_MOUNTMGR_QUERY_DOS_VOLUME_PATHS.
static VOID Test_QueryDosVolumePath(_In_ PCWSTR NtVolumeName, _In_ PMOUNTMGR_VOLUME_PATHS VolumePath)
Tests the output of IOCTL_MOUNTMGR_QUERY_DOS_VOLUME_PATH.
static BOOLEAN doesPathExistInMountPoints(_In_ PMOUNTMGR_MOUNT_POINTS MountPoints, _In_ PUNICODE_STRING DosPath)
static VOID Call_QueryPoints(_In_ HANDLE MountMgrHandle, _In_ PCWSTR NtVolumeName, _Out_ PMOUNTMGR_MOUNT_POINTS *pMountPointsPtr)
Invokes IOCTL_MOUNTMGR_QUERY_POINTS for testing, given the volume device name, and returns an allocat...
#define IS_DRIVE_LETTER_PFX(s)
PVOID NTAPI RtlAllocateHeap(IN PVOID HeapHandle, IN ULONG Flags, IN SIZE_T Size)
BOOLEAN NTAPI RtlFreeHeap(IN PVOID HeapHandle, IN ULONG Flags, IN PVOID HeapBase)
#define NT_SUCCESS(StatCode)
#define INVALID_HANDLE_VALUE
BOOL WINAPI FindNextVolumeW(IN HANDLE handle, IN LPWSTR volume, IN DWORD len)
HANDLE WINAPI FindFirstVolumeW(IN LPWSTR volume, IN DWORD len)
BOOL WINAPI FindVolumeClose(IN HANDLE hFindVolume)
_Must_inspect_result_ _Inout_opt_ PUNICODE_STRING VolumeName
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
_CRTIMP size_t __cdecl wcslen(_In_z_ const wchar_t *_Str)
#define RtlFillMemory(Dest, Length, Fill)
struct _MOUNTMGR_MOUNT_POINT MOUNTMGR_MOUNT_POINT
VOID DumpBuffer(_In_ PVOID Buffer, _In_ ULONG Length)
HANDLE GetMountMgrHandle(_In_ ACCESS_MASK DesiredAccess)
Retrieves a handle to the MountMgr controlling device. The handle should be closed with NtClose() onc...
LPCSTR wine_dbgstr_us(const UNICODE_STRING *us)
static OUT PIO_STATUS_BLOCK IoStatusBlock
#define IOCTL_MOUNTMGR_QUERY_DOS_VOLUME_PATH
#define IOCTL_MOUNTMGR_QUERY_DOS_VOLUME_PATHS
#define IOCTL_MOUNTMGR_QUERY_POINTS
#define MOUNTMGR_IS_DOS_VOLUME_NAME(s)
#define MOUNTMGR_IS_NT_VOLUME_NAME(s)
#define FILE_READ_ATTRIBUTES
NTSYSAPI VOID NTAPI RtlInitUnicodeString(PUNICODE_STRING DestinationString, PCWSTR SourceString)
NTSYSAPI BOOLEAN NTAPI RtlEqualUnicodeString(PUNICODE_STRING String1, PUNICODE_STRING String2, BOOLEAN CaseInSensitive)
NTSYSAPI NTSTATUS NTAPI NtDeviceIoControlFile(IN HANDLE hFile, IN HANDLE hEvent OPTIONAL, IN PIO_APC_ROUTINE IoApcRoutine OPTIONAL, IN PVOID IoApcContext OPTIONAL, OUT PIO_STATUS_BLOCK pIoStatusBlock, IN ULONG DeviceIoControlCode, IN PVOID InBuffer OPTIONAL, IN ULONG InBufferLength, OUT PVOID OutBuffer OPTIONAL, IN ULONG OutBufferLength)
NTSYSAPI BOOLEAN NTAPI RtlPrefixUnicodeString(IN PUNICODE_STRING String1, IN PUNICODE_STRING String2, IN BOOLEAN CaseInSensitive)
#define UNREFERENCED_PARAMETER(P)
_In_ ULONG _In_ ULONG _In_ ULONG Length
#define STATUS_BUFFER_OVERFLOW
ULONG NumberOfMountPoints
#define RTL_CONSTANT_STRING(s)
#define FIELD_OFFSET(t, f)
#define RtlCopyMemory(Destination, Source, Length)
#define STATUS_INVALID_DEVICE_REQUEST
#define STATUS_NO_MEDIA_IN_DEVICE
_Must_inspect_result_ _In_ PWDFDEVICE_INIT _In_opt_ PCUNICODE_STRING DeviceName
DWORD WINAPI GetLastError(void)