2 * PROJECT: ReactOS API Tests
3 * LICENSE: GPLv2+ - See COPYING in the top level directory
4 * PURPOSE: NtQueryVolumeInformationFile tests
5 * PROGRAMMER: Víctor Martínez Calvo <vicmarcal@gmail.com>
8 #define WIN32_NO_STATUS
10 #include <wine/test.h>
11 #include <ndk/ntndk.h>
15 TestFileFsDeviceInformation(HANDLE handle
)
17 IO_STATUS_BLOCK IoStatusBlock
;
18 FILE_FS_DEVICE_INFORMATION FileFsDevice
;
21 /*Testing VALID handle, with NULL IN parameters*/
22 SetLastError(0xdeadb33f);
23 status
= NtQueryVolumeInformationFile(handle
, NULL
, &FileFsDevice
, sizeof(FILE_FS_DEVICE_INFORMATION
), FileFsDeviceInformation
);
24 ok(status
== STATUS_ACCESS_VIOLATION
, "Expected STATUS_ACCESS_VIOLATION, got 0x%lx\n", status
);
25 ok(GetLastError() == 0xdeadb33f, "Expected 0xdeadb33f, got %lx\n", GetLastError());
27 SetLastError(0xcacacaca);
28 status
= NtQueryVolumeInformationFile(handle
, &IoStatusBlock
, NULL
, sizeof(FILE_FS_DEVICE_INFORMATION
), FileFsDeviceInformation
);
29 ok(status
== STATUS_ACCESS_VIOLATION
, "Expected STATUS_ACCESS_VIOLATION, got 0x%lx\n", status
);
30 ok(GetLastError() == 0xcacacaca, "Expected 0xcacacaca, got %lx\n", GetLastError());
32 SetLastError(0xdadadada);
33 status
= NtQueryVolumeInformationFile(handle
, &IoStatusBlock
, &FileFsDevice
, 0, FileFsDeviceInformation
);
34 ok(status
== STATUS_INFO_LENGTH_MISMATCH
, "Expected STATUS_INFO_LENGTH_MISMATCH, got 0x%lx\n", status
);
35 ok(GetLastError() == 0xdadadada, "Expected 0xdadadada, got %lx\n", GetLastError());
37 /*All valid, invalid FsInformationClass value.*/
38 SetLastError(0xdeadbeef);
39 status
= NtQueryVolumeInformationFile(handle
, &IoStatusBlock
, &FileFsDevice
, sizeof(FILE_FS_DEVICE_INFORMATION
), 0);
40 ok(status
== STATUS_INVALID_INFO_CLASS
, "Expected STATUS_INVALID_INFO_CLASS, got 0x%lx\n", status
);
41 ok(GetLastError() == 0xdeadbeef, "Expected 0xdeadbeef, got %lx\n", GetLastError());
43 /*Testing NULL handle*/
44 SetLastError(0xdeadbeef);
45 status
= NtQueryVolumeInformationFile(NULL
, &IoStatusBlock
, &FileFsDevice
, sizeof(FILE_FS_DEVICE_INFORMATION
), FileFsDeviceInformation
);
46 ok(status
== STATUS_INVALID_HANDLE
, "Expected STATUS_INVALID_HANDLE, got 0x%lx\n", status
);
47 ok(GetLastError() == 0xdeadbeef, "Expected 0xdeadbeef, got %lx\n", GetLastError());
49 /*Testing INVALID_HANDLE_VALUE*/
50 SetLastError(0xdeaddead);
51 status
= NtQueryVolumeInformationFile((HANDLE
)(-1), &IoStatusBlock
, &FileFsDevice
, sizeof(FILE_FS_DEVICE_INFORMATION
), FileFsDeviceInformation
);
52 ok(status
== STATUS_OBJECT_TYPE_MISMATCH
, "Expected STATUS_OBJECT_TYPE_MISMATCH, got 0x%lx\n", status
);
53 ok(GetLastError() == 0xdeaddead, "Expected 0xdeaddead, got %lx\n", GetLastError());
55 /*Almost all NULL. Then it checks against the Length!*/
56 SetLastError(0xdeadbeef);
57 status
= NtQueryVolumeInformationFile(NULL
, NULL
, NULL
, 0, FileFsDeviceInformation
);
58 ok(status
== STATUS_INFO_LENGTH_MISMATCH
, "Expected STATUS_INFO_LENGTH_MISMATCH, got 0x%lx\n", status
);
59 ok(GetLastError() == 0xdeadbeef, "Expected 0xdeadbeef, got %lx\n", GetLastError());
64 TestFileFsVolumeInformation(HANDLE handle
)
66 IO_STATUS_BLOCK IoStatusBlock
;
67 ULONG Buffer
[(sizeof(FILE_FS_VOLUME_INFORMATION
) + MAX_PATH
* sizeof(WCHAR
)) / sizeof(ULONG
)];
68 PFILE_FS_VOLUME_INFORMATION VolumeInfo
= (PFILE_FS_VOLUME_INFORMATION
)Buffer
;
71 status
= NtQueryVolumeInformationFile(handle
, NULL
, NULL
, 0, FileFsVolumeInformation
);
72 ok(status
== STATUS_INFO_LENGTH_MISMATCH
, "Got status 0x%lx\n", status
);
74 RtlFillMemory(&IoStatusBlock
, sizeof(IoStatusBlock
), 0x55);
75 status
= NtQueryVolumeInformationFile(handle
, &IoStatusBlock
, NULL
, 0, FileFsVolumeInformation
);
76 ok(status
== STATUS_INFO_LENGTH_MISMATCH
, "Got status 0x%lx\n", status
);
77 ok(IoStatusBlock
.Status
== 0x55555555, "IoStatusBlock.Status = 0x%lx\n", IoStatusBlock
.Status
);
78 ok(IoStatusBlock
.Information
== (ULONG_PTR
)0x5555555555555555, "IoStatusBlock.Information = %Iu\n", IoStatusBlock
.Information
);
80 status
= NtQueryVolumeInformationFile(handle
, NULL
, VolumeInfo
, 0, FileFsVolumeInformation
);
81 ok(status
== STATUS_INFO_LENGTH_MISMATCH
, "Got status 0x%lx\n", status
);
83 RtlFillMemory(&IoStatusBlock
, sizeof(IoStatusBlock
), 0x55);
84 status
= NtQueryVolumeInformationFile(handle
, &IoStatusBlock
, (PUCHAR
)Buffer
+ 2, sizeof(FILE_FS_VOLUME_INFORMATION
), FileFsVolumeInformation
);
85 ok(status
== STATUS_DATATYPE_MISALIGNMENT
, "Got status 0x%lx\n", status
);
86 ok(IoStatusBlock
.Status
== 0x55555555, "IoStatusBlock.Status = 0x%lx\n", IoStatusBlock
.Status
);
87 ok(IoStatusBlock
.Information
== (ULONG_PTR
)0x5555555555555555, "IoStatusBlock.Information = %Iu\n", IoStatusBlock
.Information
);
89 RtlFillMemory(&IoStatusBlock
, sizeof(IoStatusBlock
), 0x55);
90 status
= NtQueryVolumeInformationFile(handle
, &IoStatusBlock
, VolumeInfo
, 0, FileFsVolumeInformation
);
91 ok(status
== STATUS_INFO_LENGTH_MISMATCH
, "Got status 0x%lx\n", status
);
92 ok(IoStatusBlock
.Status
== 0x55555555, "IoStatusBlock.Status = 0x%lx\n", IoStatusBlock
.Status
);
93 ok(IoStatusBlock
.Information
== (ULONG_PTR
)0x5555555555555555, "IoStatusBlock.Information = %Iu\n", IoStatusBlock
.Information
);
95 RtlFillMemory(&IoStatusBlock
, sizeof(IoStatusBlock
), 0x55);
96 status
= NtQueryVolumeInformationFile(handle
, &IoStatusBlock
, VolumeInfo
, FIELD_OFFSET(FILE_FS_VOLUME_INFORMATION
, VolumeLabel
), FileFsVolumeInformation
);
97 ok(status
== STATUS_INFO_LENGTH_MISMATCH
, "Got status 0x%lx\n", status
);
98 ok(IoStatusBlock
.Status
== 0x55555555, "IoStatusBlock.Status = 0x%lx\n", IoStatusBlock
.Status
);
99 ok(IoStatusBlock
.Information
== (ULONG_PTR
)0x5555555555555555, "IoStatusBlock.Information = %Iu\n", IoStatusBlock
.Information
);
101 RtlFillMemory(&IoStatusBlock
, sizeof(IoStatusBlock
), 0x55);
102 status
= NtQueryVolumeInformationFile(handle
, &IoStatusBlock
, VolumeInfo
, sizeof(FILE_FS_VOLUME_INFORMATION
) - 1, FileFsVolumeInformation
);
103 ok(status
== STATUS_INFO_LENGTH_MISMATCH
, "Got status 0x%lx\n", status
);
104 ok(IoStatusBlock
.Status
== 0x55555555, "IoStatusBlock.Status = 0x%lx\n", IoStatusBlock
.Status
);
105 ok(IoStatusBlock
.Information
== (ULONG_PTR
)0x5555555555555555, "IoStatusBlock.Information = %Iu\n", IoStatusBlock
.Information
);
107 RtlFillMemory(Buffer
, sizeof(Buffer
), 0x55);
108 RtlFillMemory(&IoStatusBlock
, sizeof(IoStatusBlock
), 0x55);
109 status
= NtQueryVolumeInformationFile(handle
, &IoStatusBlock
, VolumeInfo
, sizeof(FILE_FS_VOLUME_INFORMATION
), FileFsVolumeInformation
);
110 ok(status
== STATUS_SUCCESS
|| status
== STATUS_BUFFER_OVERFLOW
, "Got status 0x%lx\n", status
);
111 ok(IoStatusBlock
.Status
== status
, "IoStatusBlock.Status = 0x%lx, expected 0x%lx\n", IoStatusBlock
.Status
, status
);
112 if (status
== STATUS_SUCCESS
)
114 ok(VolumeInfo
->VolumeLabelLength
<= sizeof(FILE_FS_VOLUME_INFORMATION
) - FIELD_OFFSET(FILE_FS_VOLUME_INFORMATION
, VolumeLabel
),
115 "VolumeInfo->VolumeLabelLength = %Iu\n", VolumeInfo
->VolumeLabelLength
);
116 ok(IoStatusBlock
.Information
>= FIELD_OFFSET(FILE_FS_VOLUME_INFORMATION
, VolumeLabel
),
117 "IoStatusBlock.Information = %Iu, expected >=%lu\n", IoStatusBlock
.Information
, (ULONG
)FIELD_OFFSET(FILE_FS_VOLUME_INFORMATION
, VolumeLabel
));
118 ok(IoStatusBlock
.Information
<= sizeof(FILE_FS_VOLUME_INFORMATION
),
119 "IoStatusBlock.Information = %Iu, expected <=%lu\n", IoStatusBlock
.Information
, (ULONG
)sizeof(FILE_FS_VOLUME_INFORMATION
));
123 ok(VolumeInfo
->VolumeLabelLength
> sizeof(FILE_FS_VOLUME_INFORMATION
) - FIELD_OFFSET(FILE_FS_VOLUME_INFORMATION
, VolumeLabel
),
124 "VolumeInfo->VolumeLabelLength = %Iu\n", VolumeInfo
->VolumeLabelLength
);
125 ok(IoStatusBlock
.Information
== sizeof(FILE_FS_VOLUME_INFORMATION
),
126 "IoStatusBlock.Information = %Iu, expected %lu\n", IoStatusBlock
.Information
, (ULONG
)sizeof(FILE_FS_VOLUME_INFORMATION
));
128 ok(VolumeInfo
->VolumeLabel
[VolumeInfo
->VolumeLabelLength
/ sizeof(WCHAR
)] == 0x5555,
129 "Got %x\n", VolumeInfo
->VolumeLabel
[VolumeInfo
->VolumeLabelLength
/ sizeof(WCHAR
)]);
131 RtlFillMemory(Buffer
, sizeof(Buffer
), 0x55);
132 RtlFillMemory(&IoStatusBlock
, sizeof(IoStatusBlock
), 0x55);
133 status
= NtQueryVolumeInformationFile(handle
, &IoStatusBlock
, VolumeInfo
, sizeof(Buffer
), FileFsVolumeInformation
);
134 ok(status
== STATUS_SUCCESS
, "Got status 0x%lx\n", status
);
135 ok(IoStatusBlock
.Status
== STATUS_SUCCESS
, "IoStatusBlock.Status = 0x%lx\n", IoStatusBlock
.Status
);
136 ok(IoStatusBlock
.Information
>= FIELD_OFFSET(FILE_FS_VOLUME_INFORMATION
, VolumeLabel
),
137 "IoStatusBlock.Information = %Iu, expected >=%lu\n", IoStatusBlock
.Information
, (ULONG
)sizeof(FILE_FS_VOLUME_INFORMATION
));
138 ok(VolumeInfo
->VolumeCreationTime
.QuadPart
!= 0x5555555555555555, "VolumeInfo->VolumeCreationTime = %I64d\n", VolumeInfo
->VolumeCreationTime
.QuadPart
);
139 ok(VolumeInfo
->VolumeSerialNumber
!= 0x55555555, "VolumeInfo->VolumeSerialNumber = %u\n", VolumeInfo
->VolumeSerialNumber
);
140 ok(VolumeInfo
->SupportsObjects
== FALSE
|| VolumeInfo
->SupportsObjects
== TRUE
, "VolumeInfo->SupportsObjects = %u\n", VolumeInfo
->SupportsObjects
);
141 ok(VolumeInfo
->VolumeLabelLength
% sizeof(WCHAR
) == 0, "VolumeInfo->VolumeLabelLength = %Iu\n", VolumeInfo
->VolumeLabelLength
);
142 if (VolumeInfo
->VolumeLabelLength
>= sizeof(WCHAR
))
143 ok(VolumeInfo
->VolumeLabel
[VolumeInfo
->VolumeLabelLength
/ sizeof(WCHAR
) - 1] != 0x5555, "Incorrect VolumeLabel or Length\n");
144 ok(VolumeInfo
->VolumeLabel
[VolumeInfo
->VolumeLabelLength
/ sizeof(WCHAR
)] == 0x5555,
145 "Got %x\n", VolumeInfo
->VolumeLabel
[VolumeInfo
->VolumeLabelLength
/ sizeof(WCHAR
)]);
148 START_TEST(NtQueryVolumeInformationFile
)
150 IO_STATUS_BLOCK IoStatusBlock
;
151 OBJECT_ATTRIBUTES attr
;
153 WCHAR path
[MAX_PATH
];
154 UNICODE_STRING pathW
;
157 /*Store a valid Handle*/
158 GetWindowsDirectoryW(path
, MAX_PATH
);
159 RtlDosPathNameToNtPathName_U(path
, &pathW
, NULL
, NULL
);
161 InitializeObjectAttributes(&attr
, &pathW
, OBJ_CASE_INSENSITIVE
, NULL
, NULL
);
162 status
= NtOpenFile(&handle
, SYNCHRONIZE
|FILE_LIST_DIRECTORY
, &attr
, &IoStatusBlock
, FILE_SHARE_READ
|FILE_SHARE_WRITE
, FILE_DIRECTORY_FILE
|FILE_SYNCHRONOUS_IO_NONALERT
);
164 RtlFreeUnicodeString(&pathW
);
166 if (!NT_SUCCESS(status
))
168 skip("NtOpenFile failed: 0x%lx\n", status
);
172 /*Now all NULL. Priority check: FsInformationClass value!*/
173 SetLastError(0xcacacaca);
174 status
= NtQueryVolumeInformationFile(NULL
, NULL
, NULL
, 0, 0);
175 ok(status
== STATUS_INVALID_INFO_CLASS
, "Expected STATUS_INVALID_INFO_CLASS, got 0x%lx\n", status
);
176 ok(GetLastError() == 0xcacacaca, "Expected 0xcacacaca, got %lx\n", GetLastError());
178 TestFileFsDeviceInformation(handle
);
179 TestFileFsVolumeInformation(handle
);