Author: tfaber
Date: Tue Jun 16 11:33:35 2015
New Revision: 68160
URL:
http://svn.reactos.org/svn/reactos?rev=68160&view=rev
Log:
[NTDLL_APITEST]
- Test FileFsVolumeInformation in NtQueryVolumeInformationFile test
CORE-9820
Modified:
trunk/rostests/apitests/ntdll/NtQueryVolumeInformationFile.c
Modified: trunk/rostests/apitests/ntdll/NtQueryVolumeInformationFile.c
URL:
http://svn.reactos.org/svn/reactos/trunk/rostests/apitests/ntdll/NtQueryVol…
==============================================================================
--- trunk/rostests/apitests/ntdll/NtQueryVolumeInformationFile.c [iso-8859-1] (original)
+++ trunk/rostests/apitests/ntdll/NtQueryVolumeInformationFile.c [iso-8859-1] Tue Jun 16
11:33:35 2015
@@ -10,30 +10,13 @@
#include <wine/test.h>
#include <ndk/ntndk.h>
-START_TEST(NtQueryVolumeInformationFile)
+static
+VOID
+TestFileFsDeviceInformation(HANDLE handle)
{
IO_STATUS_BLOCK IoStatusBlock;
FILE_FS_DEVICE_INFORMATION FileFsDevice;
- OBJECT_ATTRIBUTES attr;
- HANDLE handle;
- WCHAR path[MAX_PATH];
- UNICODE_STRING pathW;
NTSTATUS status;
-
- /*Store a valid Handle*/
- GetWindowsDirectoryW(path, MAX_PATH);
- RtlDosPathNameToNtPathName_U(path, &pathW, NULL, NULL);
-
- InitializeObjectAttributes(&attr, &pathW, OBJ_CASE_INSENSITIVE, NULL, NULL);
- status = NtOpenFile(&handle, SYNCHRONIZE|FILE_LIST_DIRECTORY, &attr,
&IoStatusBlock, FILE_SHARE_READ|FILE_SHARE_WRITE,
FILE_DIRECTORY_FILE|FILE_SYNCHRONOUS_IO_NONALERT);
-
- RtlFreeUnicodeString(&pathW);
-
- if (!NT_SUCCESS(status))
- {
- skip("NtOpenFile failed: 0x%lx\n", status);
- return;
- }
/*Testing VALID handle, with NULL IN parameters*/
SetLastError(0xdeadb33f);
@@ -69,17 +52,131 @@
ok(status == STATUS_OBJECT_TYPE_MISMATCH, "Expected STATUS_OBJECT_TYPE_MISMATCH,
got 0x%lx\n", status);
ok(GetLastError() == 0xdeaddead, "Expected 0xdeaddead, got %lx\n",
GetLastError());
+ /*Almost all NULL. Then it checks against the Length!*/
+ SetLastError(0xdeadbeef);
+ status = NtQueryVolumeInformationFile(NULL, NULL, NULL, 0, FileFsDeviceInformation);
+ ok(status == STATUS_INFO_LENGTH_MISMATCH, "Expected STATUS_INFO_LENGTH_MISMATCH,
got 0x%lx\n", status);
+ ok(GetLastError() == 0xdeadbeef, "Expected 0xdeadbeef, got %lx\n",
GetLastError());
+}
+
+static
+VOID
+TestFileFsVolumeInformation(HANDLE handle)
+{
+ IO_STATUS_BLOCK IoStatusBlock;
+ ULONG Buffer[(sizeof(FILE_FS_VOLUME_INFORMATION) + MAX_PATH * sizeof(WCHAR)) /
sizeof(ULONG)];
+ PFILE_FS_VOLUME_INFORMATION VolumeInfo = (PFILE_FS_VOLUME_INFORMATION)Buffer;
+ NTSTATUS status;
+
+ status = NtQueryVolumeInformationFile(handle, NULL, NULL, 0,
FileFsVolumeInformation);
+ ok(status == STATUS_INFO_LENGTH_MISMATCH, "Got status 0x%lx\n", status);
+
+ RtlFillMemory(&IoStatusBlock, sizeof(IoStatusBlock), 0x55);
+ status = NtQueryVolumeInformationFile(handle, &IoStatusBlock, NULL, 0,
FileFsVolumeInformation);
+ ok(status == STATUS_INFO_LENGTH_MISMATCH, "Got status 0x%lx\n", status);
+ ok(IoStatusBlock.Status == 0x55555555, "IoStatusBlock.Status = 0x%lx\n",
IoStatusBlock.Status);
+ ok(IoStatusBlock.Information == (ULONG_PTR)0x5555555555555555,
"IoStatusBlock.Information = %Iu\n", IoStatusBlock.Information);
+
+ status = NtQueryVolumeInformationFile(handle, NULL, VolumeInfo, 0,
FileFsVolumeInformation);
+ ok(status == STATUS_INFO_LENGTH_MISMATCH, "Got status 0x%lx\n", status);
+
+ RtlFillMemory(&IoStatusBlock, sizeof(IoStatusBlock), 0x55);
+ status = NtQueryVolumeInformationFile(handle, &IoStatusBlock, (PUCHAR)Buffer + 2,
sizeof(FILE_FS_VOLUME_INFORMATION), FileFsVolumeInformation);
+ ok(status == STATUS_DATATYPE_MISALIGNMENT, "Got status 0x%lx\n", status);
+ ok(IoStatusBlock.Status == 0x55555555, "IoStatusBlock.Status = 0x%lx\n",
IoStatusBlock.Status);
+ ok(IoStatusBlock.Information == (ULONG_PTR)0x5555555555555555,
"IoStatusBlock.Information = %Iu\n", IoStatusBlock.Information);
+
+ RtlFillMemory(&IoStatusBlock, sizeof(IoStatusBlock), 0x55);
+ status = NtQueryVolumeInformationFile(handle, &IoStatusBlock, VolumeInfo, 0,
FileFsVolumeInformation);
+ ok(status == STATUS_INFO_LENGTH_MISMATCH, "Got status 0x%lx\n", status);
+ ok(IoStatusBlock.Status == 0x55555555, "IoStatusBlock.Status = 0x%lx\n",
IoStatusBlock.Status);
+ ok(IoStatusBlock.Information == (ULONG_PTR)0x5555555555555555,
"IoStatusBlock.Information = %Iu\n", IoStatusBlock.Information);
+
+ RtlFillMemory(&IoStatusBlock, sizeof(IoStatusBlock), 0x55);
+ status = NtQueryVolumeInformationFile(handle, &IoStatusBlock, VolumeInfo,
FIELD_OFFSET(FILE_FS_VOLUME_INFORMATION, VolumeLabel), FileFsVolumeInformation);
+ ok(status == STATUS_INFO_LENGTH_MISMATCH, "Got status 0x%lx\n", status);
+ ok(IoStatusBlock.Status == 0x55555555, "IoStatusBlock.Status = 0x%lx\n",
IoStatusBlock.Status);
+ ok(IoStatusBlock.Information == (ULONG_PTR)0x5555555555555555,
"IoStatusBlock.Information = %Iu\n", IoStatusBlock.Information);
+
+ RtlFillMemory(&IoStatusBlock, sizeof(IoStatusBlock), 0x55);
+ status = NtQueryVolumeInformationFile(handle, &IoStatusBlock, VolumeInfo,
sizeof(FILE_FS_VOLUME_INFORMATION) - 1, FileFsVolumeInformation);
+ ok(status == STATUS_INFO_LENGTH_MISMATCH, "Got status 0x%lx\n", status);
+ ok(IoStatusBlock.Status == 0x55555555, "IoStatusBlock.Status = 0x%lx\n",
IoStatusBlock.Status);
+ ok(IoStatusBlock.Information == (ULONG_PTR)0x5555555555555555,
"IoStatusBlock.Information = %Iu\n", IoStatusBlock.Information);
+
+ RtlFillMemory(Buffer, sizeof(Buffer), 0x55);
+ RtlFillMemory(&IoStatusBlock, sizeof(IoStatusBlock), 0x55);
+ status = NtQueryVolumeInformationFile(handle, &IoStatusBlock, VolumeInfo,
sizeof(FILE_FS_VOLUME_INFORMATION), FileFsVolumeInformation);
+ ok(status == STATUS_SUCCESS || status == STATUS_BUFFER_OVERFLOW, "Got status
0x%lx\n", status);
+ ok(IoStatusBlock.Status == status, "IoStatusBlock.Status = 0x%lx, expected
0x%lx\n", IoStatusBlock.Status, status);
+ if (status == STATUS_SUCCESS)
+ {
+ ok(VolumeInfo->VolumeLabelLength <= sizeof(FILE_FS_VOLUME_INFORMATION) -
FIELD_OFFSET(FILE_FS_VOLUME_INFORMATION, VolumeLabel),
+ "VolumeInfo->VolumeLabelLength = %Iu\n",
VolumeInfo->VolumeLabelLength);
+ ok(IoStatusBlock.Information >= FIELD_OFFSET(FILE_FS_VOLUME_INFORMATION,
VolumeLabel),
+ "IoStatusBlock.Information = %Iu, expected >=%lu\n",
IoStatusBlock.Information, (ULONG)FIELD_OFFSET(FILE_FS_VOLUME_INFORMATION, VolumeLabel));
+ ok(IoStatusBlock.Information <= sizeof(FILE_FS_VOLUME_INFORMATION),
+ "IoStatusBlock.Information = %Iu, expected <=%lu\n",
IoStatusBlock.Information, (ULONG)sizeof(FILE_FS_VOLUME_INFORMATION));
+ }
+ else
+ {
+ ok(VolumeInfo->VolumeLabelLength > sizeof(FILE_FS_VOLUME_INFORMATION) -
FIELD_OFFSET(FILE_FS_VOLUME_INFORMATION, VolumeLabel),
+ "VolumeInfo->VolumeLabelLength = %Iu\n",
VolumeInfo->VolumeLabelLength);
+ ok(IoStatusBlock.Information == sizeof(FILE_FS_VOLUME_INFORMATION),
+ "IoStatusBlock.Information = %Iu, expected %lu\n",
IoStatusBlock.Information, (ULONG)sizeof(FILE_FS_VOLUME_INFORMATION));
+ }
+ ok(VolumeInfo->VolumeLabel[VolumeInfo->VolumeLabelLength / sizeof(WCHAR)] ==
0x5555,
+ "Got %x\n", VolumeInfo->VolumeLabel[VolumeInfo->VolumeLabelLength
/ sizeof(WCHAR)]);
+
+ RtlFillMemory(Buffer, sizeof(Buffer), 0x55);
+ RtlFillMemory(&IoStatusBlock, sizeof(IoStatusBlock), 0x55);
+ status = NtQueryVolumeInformationFile(handle, &IoStatusBlock, VolumeInfo,
sizeof(Buffer), FileFsVolumeInformation);
+ ok(status == STATUS_SUCCESS, "Got status 0x%lx\n", status);
+ ok(IoStatusBlock.Status == STATUS_SUCCESS, "IoStatusBlock.Status =
0x%lx\n", IoStatusBlock.Status);
+ ok(IoStatusBlock.Information >= FIELD_OFFSET(FILE_FS_VOLUME_INFORMATION,
VolumeLabel),
+ "IoStatusBlock.Information = %Iu, expected >=%lu\n",
IoStatusBlock.Information, (ULONG)sizeof(FILE_FS_VOLUME_INFORMATION));
+ ok(VolumeInfo->VolumeCreationTime.QuadPart != 0x5555555555555555,
"VolumeInfo->VolumeCreationTime = %I64d\n",
VolumeInfo->VolumeCreationTime.QuadPart);
+ ok(VolumeInfo->VolumeSerialNumber != 0x55555555,
"VolumeInfo->VolumeSerialNumber = %u\n", VolumeInfo->VolumeSerialNumber);
+ ok(VolumeInfo->SupportsObjects == FALSE || VolumeInfo->SupportsObjects == TRUE,
"VolumeInfo->SupportsObjects = %u\n", VolumeInfo->SupportsObjects);
+ ok(VolumeInfo->VolumeLabelLength % sizeof(WCHAR) == 0,
"VolumeInfo->VolumeLabelLength = %Iu\n", VolumeInfo->VolumeLabelLength);
+ if (VolumeInfo->VolumeLabelLength >= sizeof(WCHAR))
+ ok(VolumeInfo->VolumeLabel[VolumeInfo->VolumeLabelLength / sizeof(WCHAR) -
1] != 0x5555, "Incorrect VolumeLabel or Length\n");
+ ok(VolumeInfo->VolumeLabel[VolumeInfo->VolumeLabelLength / sizeof(WCHAR)] ==
0x5555,
+ "Got %x\n", VolumeInfo->VolumeLabel[VolumeInfo->VolumeLabelLength
/ sizeof(WCHAR)]);
+}
+
+START_TEST(NtQueryVolumeInformationFile)
+{
+ IO_STATUS_BLOCK IoStatusBlock;
+ OBJECT_ATTRIBUTES attr;
+ HANDLE handle;
+ WCHAR path[MAX_PATH];
+ UNICODE_STRING pathW;
+ NTSTATUS status;
+
+ /*Store a valid Handle*/
+ GetWindowsDirectoryW(path, MAX_PATH);
+ RtlDosPathNameToNtPathName_U(path, &pathW, NULL, NULL);
+
+ InitializeObjectAttributes(&attr, &pathW, OBJ_CASE_INSENSITIVE, NULL, NULL);
+ status = NtOpenFile(&handle, SYNCHRONIZE|FILE_LIST_DIRECTORY, &attr,
&IoStatusBlock, FILE_SHARE_READ|FILE_SHARE_WRITE,
FILE_DIRECTORY_FILE|FILE_SYNCHRONOUS_IO_NONALERT);
+
+ RtlFreeUnicodeString(&pathW);
+
+ if (!NT_SUCCESS(status))
+ {
+ skip("NtOpenFile failed: 0x%lx\n", status);
+ return;
+ }
+
/*Now all NULL. Priority check: FsInformationClass value!*/
SetLastError(0xcacacaca);
status = NtQueryVolumeInformationFile(NULL, NULL, NULL, 0, 0);
ok(status == STATUS_INVALID_INFO_CLASS, "Expected STATUS_INVALID_INFO_CLASS, got
0x%lx\n", status);
ok(GetLastError() == 0xcacacaca, "Expected 0xcacacaca, got %lx\n",
GetLastError());
- /*Almost all NULL. Then it checks against the Length!*/
- SetLastError(0xdeadbeef);
- status = NtQueryVolumeInformationFile(NULL, NULL, NULL, 0, FileFsDeviceInformation);
- ok(status == STATUS_INFO_LENGTH_MISMATCH, "Expected STATUS_INFO_LENGTH_MISMATCH,
got 0x%lx\n", status);
- ok(GetLastError() == 0xdeadbeef, "Expected 0xdeadbeef, got %lx\n",
GetLastError());
+ TestFileFsDeviceInformation(handle);
+ TestFileFsVolumeInformation(handle);
NtClose(handle);
}