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
) + VolumeInfo
->VolumeLabelLength
,
137 "IoStatusBlock.Information = %Iu, expected %lu+%lu\n", IoStatusBlock
.Information
, (ULONG
)FIELD_OFFSET(FILE_FS_VOLUME_INFORMATION
, VolumeLabel
), VolumeInfo
->VolumeLabelLength
);
138 ok(VolumeInfo
->VolumeCreationTime
.QuadPart
!= 0x5555555555555555, "VolumeInfo->VolumeCreationTime = %I64d\n", VolumeInfo
->VolumeCreationTime
.QuadPart
);
139 ok(VolumeInfo
->VolumeSerialNumber
!= 0x55555555, "VolumeInfo->VolumeSerialNumber = %lu\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 trace("VolumeLabel = %.*ls\n", (int)VolumeInfo
->VolumeLabelLength
/ sizeof(WCHAR
), VolumeInfo
->VolumeLabel
);
145 ok(VolumeInfo
->VolumeLabel
[VolumeInfo
->VolumeLabelLength
/ sizeof(WCHAR
)] == 0x5555,
146 "Got %x\n", VolumeInfo
->VolumeLabel
[VolumeInfo
->VolumeLabelLength
/ sizeof(WCHAR
)]);
151 TestFileFsAttributeInformation(HANDLE handle
)
153 IO_STATUS_BLOCK IoStatusBlock
;
154 ULONG Buffer
[(sizeof(FILE_FS_ATTRIBUTE_INFORMATION
) + 32 * sizeof(WCHAR
)) / sizeof(ULONG
)];
155 PFILE_FS_ATTRIBUTE_INFORMATION AttributeInfo
= (PFILE_FS_ATTRIBUTE_INFORMATION
)Buffer
;
158 status
= NtQueryVolumeInformationFile(handle
, NULL
, NULL
, 0, FileFsAttributeInformation
);
159 ok(status
== STATUS_INFO_LENGTH_MISMATCH
, "Got status 0x%lx\n", status
);
161 RtlFillMemory(&IoStatusBlock
, sizeof(IoStatusBlock
), 0x55);
162 status
= NtQueryVolumeInformationFile(handle
, &IoStatusBlock
, NULL
, 0, FileFsAttributeInformation
);
163 ok(status
== STATUS_INFO_LENGTH_MISMATCH
, "Got status 0x%lx\n", status
);
164 ok(IoStatusBlock
.Status
== 0x55555555, "IoStatusBlock.Status = 0x%lx\n", IoStatusBlock
.Status
);
165 ok(IoStatusBlock
.Information
== (ULONG_PTR
)0x5555555555555555, "IoStatusBlock.Information = %Iu\n", IoStatusBlock
.Information
);
167 status
= NtQueryVolumeInformationFile(handle
, NULL
, AttributeInfo
, 0, FileFsAttributeInformation
);
168 ok(status
== STATUS_INFO_LENGTH_MISMATCH
, "Got status 0x%lx\n", status
);
170 RtlFillMemory(&IoStatusBlock
, sizeof(IoStatusBlock
), 0x55);
171 status
= NtQueryVolumeInformationFile(handle
, &IoStatusBlock
, (PUCHAR
)Buffer
+ 2, sizeof(FILE_FS_ATTRIBUTE_INFORMATION
), FileFsAttributeInformation
);
172 ok(status
== STATUS_DATATYPE_MISALIGNMENT
, "Got status 0x%lx\n", status
);
173 ok(IoStatusBlock
.Status
== 0x55555555, "IoStatusBlock.Status = 0x%lx\n", IoStatusBlock
.Status
);
174 ok(IoStatusBlock
.Information
== (ULONG_PTR
)0x5555555555555555, "IoStatusBlock.Information = %Iu\n", IoStatusBlock
.Information
);
176 RtlFillMemory(&IoStatusBlock
, sizeof(IoStatusBlock
), 0x55);
177 status
= NtQueryVolumeInformationFile(handle
, &IoStatusBlock
, AttributeInfo
, 0, FileFsAttributeInformation
);
178 ok(status
== STATUS_INFO_LENGTH_MISMATCH
, "Got status 0x%lx\n", status
);
179 ok(IoStatusBlock
.Status
== 0x55555555, "IoStatusBlock.Status = 0x%lx\n", IoStatusBlock
.Status
);
180 ok(IoStatusBlock
.Information
== (ULONG_PTR
)0x5555555555555555, "IoStatusBlock.Information = %Iu\n", IoStatusBlock
.Information
);
182 RtlFillMemory(&IoStatusBlock
, sizeof(IoStatusBlock
), 0x55);
183 status
= NtQueryVolumeInformationFile(handle
, &IoStatusBlock
, AttributeInfo
, FIELD_OFFSET(FILE_FS_ATTRIBUTE_INFORMATION
, FileSystemName
), FileFsAttributeInformation
);
184 ok(status
== STATUS_INFO_LENGTH_MISMATCH
, "Got status 0x%lx\n", status
);
185 ok(IoStatusBlock
.Status
== 0x55555555, "IoStatusBlock.Status = 0x%lx\n", IoStatusBlock
.Status
);
186 ok(IoStatusBlock
.Information
== (ULONG_PTR
)0x5555555555555555, "IoStatusBlock.Information = %Iu\n", IoStatusBlock
.Information
);
188 RtlFillMemory(&IoStatusBlock
, sizeof(IoStatusBlock
), 0x55);
189 status
= NtQueryVolumeInformationFile(handle
, &IoStatusBlock
, AttributeInfo
, sizeof(FILE_FS_ATTRIBUTE_INFORMATION
) - 1, FileFsAttributeInformation
);
190 ok(status
== STATUS_INFO_LENGTH_MISMATCH
, "Got status 0x%lx\n", status
);
191 ok(IoStatusBlock
.Status
== 0x55555555, "IoStatusBlock.Status = 0x%lx\n", IoStatusBlock
.Status
);
192 ok(IoStatusBlock
.Information
== (ULONG_PTR
)0x5555555555555555, "IoStatusBlock.Information = %Iu\n", IoStatusBlock
.Information
);
194 RtlFillMemory(Buffer
, sizeof(Buffer
), 0x55);
195 RtlFillMemory(&IoStatusBlock
, sizeof(IoStatusBlock
), 0x55);
196 status
= NtQueryVolumeInformationFile(handle
, &IoStatusBlock
, AttributeInfo
, sizeof(FILE_FS_ATTRIBUTE_INFORMATION
), FileFsAttributeInformation
);
197 ok(status
== STATUS_BUFFER_OVERFLOW
, "Got status 0x%lx\n", status
);
198 ok(IoStatusBlock
.Status
== STATUS_BUFFER_OVERFLOW
, "IoStatusBlock.Status = 0x%lx\n", IoStatusBlock
.Status
);
199 ok(AttributeInfo
->FileSystemNameLength
== sizeof(FILE_FS_ATTRIBUTE_INFORMATION
) - FIELD_OFFSET(FILE_FS_ATTRIBUTE_INFORMATION
, FileSystemName
),
200 "AttributeInfo->FileSystemNameLength = %Iu\n", AttributeInfo
->FileSystemNameLength
);
201 ok(IoStatusBlock
.Information
== sizeof(FILE_FS_ATTRIBUTE_INFORMATION
),
202 "IoStatusBlock.Information = %Iu, expected %lu\n", IoStatusBlock
.Information
, (ULONG
)sizeof(FILE_FS_ATTRIBUTE_INFORMATION
));
203 ok(AttributeInfo
->FileSystemName
[AttributeInfo
->FileSystemNameLength
/ sizeof(WCHAR
)] == 0x5555,
204 "Got %x\n", AttributeInfo
->FileSystemName
[AttributeInfo
->FileSystemNameLength
/ sizeof(WCHAR
)]);
206 RtlFillMemory(Buffer
, sizeof(Buffer
), 0x55);
207 RtlFillMemory(&IoStatusBlock
, sizeof(IoStatusBlock
), 0x55);
208 status
= NtQueryVolumeInformationFile(handle
, &IoStatusBlock
, AttributeInfo
, sizeof(FILE_FS_ATTRIBUTE_INFORMATION
) + 1, FileFsAttributeInformation
);
209 ok(status
== STATUS_BUFFER_OVERFLOW
, "Got status 0x%lx\n", status
);
210 ok(IoStatusBlock
.Status
== STATUS_BUFFER_OVERFLOW
, "IoStatusBlock.Status = 0x%lx\n", IoStatusBlock
.Status
);
211 ok(AttributeInfo
->FileSystemNameLength
== sizeof(FILE_FS_ATTRIBUTE_INFORMATION
) + 1 - FIELD_OFFSET(FILE_FS_ATTRIBUTE_INFORMATION
, FileSystemName
),
212 "AttributeInfo->FileSystemNameLength = %Iu\n", AttributeInfo
->FileSystemNameLength
);
213 ok(IoStatusBlock
.Information
== sizeof(FILE_FS_ATTRIBUTE_INFORMATION
) + 1,
214 "IoStatusBlock.Information = %Iu, expected %lu\n", IoStatusBlock
.Information
, (ULONG
)sizeof(FILE_FS_ATTRIBUTE_INFORMATION
));
215 ok((AttributeInfo
->FileSystemName
[AttributeInfo
->FileSystemNameLength
/ sizeof(WCHAR
)] & 0xff00) == 0x5500,
216 "Got %x\n", AttributeInfo
->FileSystemName
[AttributeInfo
->FileSystemNameLength
/ sizeof(WCHAR
)]);
217 ok(AttributeInfo
->FileSystemName
[AttributeInfo
->FileSystemNameLength
/ sizeof(WCHAR
) + 1] == 0x5555,
218 "Got %x\n", AttributeInfo
->FileSystemName
[AttributeInfo
->FileSystemNameLength
/ sizeof(WCHAR
) + 1]);
220 RtlFillMemory(Buffer
, sizeof(Buffer
), 0x55);
221 RtlFillMemory(&IoStatusBlock
, sizeof(IoStatusBlock
), 0x55);
222 status
= NtQueryVolumeInformationFile(handle
, &IoStatusBlock
, AttributeInfo
, sizeof(FILE_FS_ATTRIBUTE_INFORMATION
) + sizeof(WCHAR
), FileFsAttributeInformation
);
223 if (status
!= STATUS_SUCCESS
)
225 ok(status
== STATUS_BUFFER_OVERFLOW
, "Got status 0x%lx\n", status
);
226 ok(IoStatusBlock
.Status
== STATUS_BUFFER_OVERFLOW
, "IoStatusBlock.Status = 0x%lx\n", IoStatusBlock
.Status
);
227 ok(AttributeInfo
->FileSystemNameLength
== sizeof(FILE_FS_ATTRIBUTE_INFORMATION
) + sizeof(WCHAR
) - FIELD_OFFSET(FILE_FS_ATTRIBUTE_INFORMATION
, FileSystemName
),
228 "AttributeInfo->FileSystemNameLength = %Iu\n", AttributeInfo
->FileSystemNameLength
);
229 ok(IoStatusBlock
.Information
== sizeof(FILE_FS_ATTRIBUTE_INFORMATION
) + sizeof(WCHAR
),
230 "IoStatusBlock.Information = %Iu, expected %lu\n", IoStatusBlock
.Information
, (ULONG
)sizeof(FILE_FS_ATTRIBUTE_INFORMATION
));
231 ok(AttributeInfo
->FileSystemName
[AttributeInfo
->FileSystemNameLength
/ sizeof(WCHAR
)] == 0x5555,
232 "Got %x\n", AttributeInfo
->FileSystemName
[AttributeInfo
->FileSystemNameLength
/ sizeof(WCHAR
)]);
235 RtlFillMemory(Buffer
, sizeof(Buffer
), 0x55);
236 RtlFillMemory(&IoStatusBlock
, sizeof(IoStatusBlock
), 0x55);
237 status
= NtQueryVolumeInformationFile(handle
, &IoStatusBlock
, AttributeInfo
, sizeof(Buffer
), FileFsAttributeInformation
);
238 ok(status
== STATUS_SUCCESS
, "Got status 0x%lx\n", status
);
239 ok(IoStatusBlock
.Status
== STATUS_SUCCESS
, "IoStatusBlock.Status = 0x%lx\n", IoStatusBlock
.Status
);
240 ok(IoStatusBlock
.Information
== FIELD_OFFSET(FILE_FS_ATTRIBUTE_INFORMATION
, FileSystemName
) + AttributeInfo
->FileSystemNameLength
,
241 "IoStatusBlock.Information = %Iu, expected %lu+%lu\n", IoStatusBlock
.Information
, (ULONG
)FIELD_OFFSET(FILE_FS_ATTRIBUTE_INFORMATION
, FileSystemName
), AttributeInfo
->FileSystemNameLength
);
242 ok(AttributeInfo
->FileSystemAttributes
!= 0x55555555, "AttributeInfo->FileSystemAttributes = 0x%lx\n", AttributeInfo
->FileSystemAttributes
);
243 ok(AttributeInfo
->MaximumComponentNameLength
!= 0x55555555, "AttributeInfo->MaximumComponentNameLength = 0x%lx\n", AttributeInfo
->MaximumComponentNameLength
);
244 ok(AttributeInfo
->FileSystemNameLength
% sizeof(WCHAR
) == 0, "AttributeInfo->FileSystemNameLength = %Iu\n", AttributeInfo
->FileSystemNameLength
);
245 ok(!wcsncmp(AttributeInfo
->FileSystemName
, L
"NTFS", 4) ||
246 !wcsncmp(AttributeInfo
->FileSystemName
, L
"FAT", 3) ||
247 !wcsncmp(AttributeInfo
->FileSystemName
, L
"FAT32", 5),
248 "FileSystemName = %.*ls\n", (int)AttributeInfo
->FileSystemNameLength
/ sizeof(WCHAR
), AttributeInfo
->FileSystemName
);
249 trace("FileSystemName = %.*ls\n", (int)AttributeInfo
->FileSystemNameLength
/ sizeof(WCHAR
), AttributeInfo
->FileSystemName
);
250 ok(AttributeInfo
->FileSystemName
[AttributeInfo
->FileSystemNameLength
/ sizeof(WCHAR
)] == 0x5555,
251 "Got %x\n", AttributeInfo
->FileSystemName
[AttributeInfo
->FileSystemNameLength
/ sizeof(WCHAR
)]);
254 START_TEST(NtQueryVolumeInformationFile
)
256 IO_STATUS_BLOCK IoStatusBlock
;
257 OBJECT_ATTRIBUTES attr
;
259 WCHAR path
[MAX_PATH
];
260 UNICODE_STRING pathW
;
263 /*Store a valid Handle*/
264 GetWindowsDirectoryW(path
, MAX_PATH
);
265 RtlDosPathNameToNtPathName_U(path
, &pathW
, NULL
, NULL
);
267 InitializeObjectAttributes(&attr
, &pathW
, OBJ_CASE_INSENSITIVE
, NULL
, NULL
);
268 status
= NtOpenFile(&handle
, SYNCHRONIZE
|FILE_LIST_DIRECTORY
, &attr
, &IoStatusBlock
, FILE_SHARE_READ
|FILE_SHARE_WRITE
, FILE_DIRECTORY_FILE
|FILE_SYNCHRONOUS_IO_NONALERT
);
269 ok(status
== STATUS_SUCCESS
, "NtOpenFile failed: 0x%lx\n", status
);
270 RtlFreeUnicodeString(&pathW
);
272 if (!NT_SUCCESS(status
))
274 skip("NtOpenFile failed: 0x%lx\n", status
);
278 /*Now all NULL. Priority check: FsInformationClass value!*/
279 SetLastError(0xcacacaca);
280 status
= NtQueryVolumeInformationFile(NULL
, NULL
, NULL
, 0, 0);
281 ok(status
== STATUS_INVALID_INFO_CLASS
, "Expected STATUS_INVALID_INFO_CLASS, got 0x%lx\n", status
);
282 ok(GetLastError() == 0xcacacaca, "Expected 0xcacacaca, got %lx\n", GetLastError());
284 TestFileFsDeviceInformation(handle
);
285 TestFileFsVolumeInformation(handle
);
286 TestFileFsAttributeInformation(handle
);