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>
12 TestFileFsDeviceInformation(HANDLE handle
)
14 IO_STATUS_BLOCK IoStatusBlock
;
15 FILE_FS_DEVICE_INFORMATION FileFsDevice
;
18 /*Testing VALID handle, with NULL IN parameters*/
19 SetLastError(0xdeadb33f);
20 status
= NtQueryVolumeInformationFile(handle
, NULL
, &FileFsDevice
, sizeof(FILE_FS_DEVICE_INFORMATION
), FileFsDeviceInformation
);
21 ok(status
== STATUS_ACCESS_VIOLATION
, "Expected STATUS_ACCESS_VIOLATION, got 0x%lx\n", status
);
22 ok(GetLastError() == 0xdeadb33f, "Expected 0xdeadb33f, got %lx\n", GetLastError());
24 SetLastError(0xcacacaca);
25 status
= NtQueryVolumeInformationFile(handle
, &IoStatusBlock
, NULL
, sizeof(FILE_FS_DEVICE_INFORMATION
), FileFsDeviceInformation
);
26 ok(status
== STATUS_ACCESS_VIOLATION
, "Expected STATUS_ACCESS_VIOLATION, got 0x%lx\n", status
);
27 ok(GetLastError() == 0xcacacaca, "Expected 0xcacacaca, got %lx\n", GetLastError());
29 SetLastError(0xdadadada);
30 status
= NtQueryVolumeInformationFile(handle
, &IoStatusBlock
, &FileFsDevice
, 0, FileFsDeviceInformation
);
31 ok(status
== STATUS_INFO_LENGTH_MISMATCH
, "Expected STATUS_INFO_LENGTH_MISMATCH, got 0x%lx\n", status
);
32 ok(GetLastError() == 0xdadadada, "Expected 0xdadadada, got %lx\n", GetLastError());
34 /*All valid, invalid FsInformationClass value.*/
35 SetLastError(0xdeadbeef);
36 status
= NtQueryVolumeInformationFile(handle
, &IoStatusBlock
, &FileFsDevice
, sizeof(FILE_FS_DEVICE_INFORMATION
), 0);
37 ok(status
== STATUS_INVALID_INFO_CLASS
, "Expected STATUS_INVALID_INFO_CLASS, got 0x%lx\n", status
);
38 ok(GetLastError() == 0xdeadbeef, "Expected 0xdeadbeef, got %lx\n", GetLastError());
40 /*Testing NULL handle*/
41 SetLastError(0xdeadbeef);
42 status
= NtQueryVolumeInformationFile(NULL
, &IoStatusBlock
, &FileFsDevice
, sizeof(FILE_FS_DEVICE_INFORMATION
), FileFsDeviceInformation
);
43 ok(status
== STATUS_INVALID_HANDLE
, "Expected STATUS_INVALID_HANDLE, got 0x%lx\n", status
);
44 ok(GetLastError() == 0xdeadbeef, "Expected 0xdeadbeef, got %lx\n", GetLastError());
46 /*Testing INVALID_HANDLE_VALUE*/
47 SetLastError(0xdeaddead);
48 status
= NtQueryVolumeInformationFile((HANDLE
)(-1), &IoStatusBlock
, &FileFsDevice
, sizeof(FILE_FS_DEVICE_INFORMATION
), FileFsDeviceInformation
);
49 ok(status
== STATUS_OBJECT_TYPE_MISMATCH
, "Expected STATUS_OBJECT_TYPE_MISMATCH, got 0x%lx\n", status
);
50 ok(GetLastError() == 0xdeaddead, "Expected 0xdeaddead, got %lx\n", GetLastError());
52 /*Almost all NULL. Then it checks against the Length!*/
53 SetLastError(0xdeadbeef);
54 status
= NtQueryVolumeInformationFile(NULL
, NULL
, NULL
, 0, FileFsDeviceInformation
);
55 ok(status
== STATUS_INFO_LENGTH_MISMATCH
, "Expected STATUS_INFO_LENGTH_MISMATCH, got 0x%lx\n", status
);
56 ok(GetLastError() == 0xdeadbeef, "Expected 0xdeadbeef, got %lx\n", GetLastError());
61 TestFileFsVolumeInformation(HANDLE handle
)
63 IO_STATUS_BLOCK IoStatusBlock
;
64 ULONG Buffer
[(sizeof(FILE_FS_VOLUME_INFORMATION
) + MAX_PATH
* sizeof(WCHAR
)) / sizeof(ULONG
)];
65 PFILE_FS_VOLUME_INFORMATION VolumeInfo
= (PFILE_FS_VOLUME_INFORMATION
)Buffer
;
68 status
= NtQueryVolumeInformationFile(handle
, NULL
, NULL
, 0, FileFsVolumeInformation
);
69 ok(status
== STATUS_INFO_LENGTH_MISMATCH
, "Got status 0x%lx\n", status
);
71 RtlFillMemory(&IoStatusBlock
, sizeof(IoStatusBlock
), 0x55);
72 status
= NtQueryVolumeInformationFile(handle
, &IoStatusBlock
, NULL
, 0, FileFsVolumeInformation
);
73 ok(status
== STATUS_INFO_LENGTH_MISMATCH
, "Got status 0x%lx\n", status
);
74 ok(IoStatusBlock
.Status
== 0x55555555, "IoStatusBlock.Status = 0x%lx\n", IoStatusBlock
.Status
);
75 ok(IoStatusBlock
.Information
== (ULONG_PTR
)0x5555555555555555, "IoStatusBlock.Information = %Iu\n", IoStatusBlock
.Information
);
77 status
= NtQueryVolumeInformationFile(handle
, NULL
, VolumeInfo
, 0, FileFsVolumeInformation
);
78 ok(status
== STATUS_INFO_LENGTH_MISMATCH
, "Got status 0x%lx\n", status
);
80 RtlFillMemory(&IoStatusBlock
, sizeof(IoStatusBlock
), 0x55);
81 status
= NtQueryVolumeInformationFile(handle
, &IoStatusBlock
, (PUCHAR
)Buffer
+ 2, sizeof(FILE_FS_VOLUME_INFORMATION
), FileFsVolumeInformation
);
82 ok(status
== STATUS_DATATYPE_MISALIGNMENT
, "Got status 0x%lx\n", status
);
83 ok(IoStatusBlock
.Status
== 0x55555555, "IoStatusBlock.Status = 0x%lx\n", IoStatusBlock
.Status
);
84 ok(IoStatusBlock
.Information
== (ULONG_PTR
)0x5555555555555555, "IoStatusBlock.Information = %Iu\n", IoStatusBlock
.Information
);
86 RtlFillMemory(&IoStatusBlock
, sizeof(IoStatusBlock
), 0x55);
87 status
= NtQueryVolumeInformationFile(handle
, &IoStatusBlock
, VolumeInfo
, 0, FileFsVolumeInformation
);
88 ok(status
== STATUS_INFO_LENGTH_MISMATCH
, "Got status 0x%lx\n", status
);
89 ok(IoStatusBlock
.Status
== 0x55555555, "IoStatusBlock.Status = 0x%lx\n", IoStatusBlock
.Status
);
90 ok(IoStatusBlock
.Information
== (ULONG_PTR
)0x5555555555555555, "IoStatusBlock.Information = %Iu\n", IoStatusBlock
.Information
);
92 RtlFillMemory(&IoStatusBlock
, sizeof(IoStatusBlock
), 0x55);
93 status
= NtQueryVolumeInformationFile(handle
, &IoStatusBlock
, VolumeInfo
, FIELD_OFFSET(FILE_FS_VOLUME_INFORMATION
, VolumeLabel
), FileFsVolumeInformation
);
94 ok(status
== STATUS_INFO_LENGTH_MISMATCH
, "Got status 0x%lx\n", status
);
95 ok(IoStatusBlock
.Status
== 0x55555555, "IoStatusBlock.Status = 0x%lx\n", IoStatusBlock
.Status
);
96 ok(IoStatusBlock
.Information
== (ULONG_PTR
)0x5555555555555555, "IoStatusBlock.Information = %Iu\n", IoStatusBlock
.Information
);
98 RtlFillMemory(&IoStatusBlock
, sizeof(IoStatusBlock
), 0x55);
99 status
= NtQueryVolumeInformationFile(handle
, &IoStatusBlock
, VolumeInfo
, sizeof(FILE_FS_VOLUME_INFORMATION
) - 1, FileFsVolumeInformation
);
100 ok(status
== STATUS_INFO_LENGTH_MISMATCH
, "Got status 0x%lx\n", status
);
101 ok(IoStatusBlock
.Status
== 0x55555555, "IoStatusBlock.Status = 0x%lx\n", IoStatusBlock
.Status
);
102 ok(IoStatusBlock
.Information
== (ULONG_PTR
)0x5555555555555555, "IoStatusBlock.Information = %Iu\n", IoStatusBlock
.Information
);
104 RtlFillMemory(Buffer
, sizeof(Buffer
), 0x55);
105 RtlFillMemory(&IoStatusBlock
, sizeof(IoStatusBlock
), 0x55);
106 status
= NtQueryVolumeInformationFile(handle
, &IoStatusBlock
, VolumeInfo
, sizeof(FILE_FS_VOLUME_INFORMATION
), FileFsVolumeInformation
);
107 ok(status
== STATUS_SUCCESS
|| status
== STATUS_BUFFER_OVERFLOW
, "Got status 0x%lx\n", status
);
108 ok(IoStatusBlock
.Status
== status
, "IoStatusBlock.Status = 0x%lx, expected 0x%lx\n", IoStatusBlock
.Status
, status
);
109 if (status
== STATUS_SUCCESS
)
111 ok(VolumeInfo
->VolumeLabelLength
<= sizeof(FILE_FS_VOLUME_INFORMATION
) - FIELD_OFFSET(FILE_FS_VOLUME_INFORMATION
, VolumeLabel
),
112 "VolumeInfo->VolumeLabelLength = %Iu\n", VolumeInfo
->VolumeLabelLength
);
113 ok(IoStatusBlock
.Information
>= FIELD_OFFSET(FILE_FS_VOLUME_INFORMATION
, VolumeLabel
),
114 "IoStatusBlock.Information = %Iu, expected >=%lu\n", IoStatusBlock
.Information
, (ULONG
)FIELD_OFFSET(FILE_FS_VOLUME_INFORMATION
, VolumeLabel
));
115 ok(IoStatusBlock
.Information
<= sizeof(FILE_FS_VOLUME_INFORMATION
),
116 "IoStatusBlock.Information = %Iu, expected <=%lu\n", IoStatusBlock
.Information
, (ULONG
)sizeof(FILE_FS_VOLUME_INFORMATION
));
120 ok(VolumeInfo
->VolumeLabelLength
> sizeof(FILE_FS_VOLUME_INFORMATION
) - FIELD_OFFSET(FILE_FS_VOLUME_INFORMATION
, VolumeLabel
),
121 "VolumeInfo->VolumeLabelLength = %Iu\n", VolumeInfo
->VolumeLabelLength
);
122 ok(IoStatusBlock
.Information
== sizeof(FILE_FS_VOLUME_INFORMATION
),
123 "IoStatusBlock.Information = %Iu, expected %lu\n", IoStatusBlock
.Information
, (ULONG
)sizeof(FILE_FS_VOLUME_INFORMATION
));
125 ok(VolumeInfo
->VolumeLabel
[VolumeInfo
->VolumeLabelLength
/ sizeof(WCHAR
)] == 0x5555,
126 "Got %x\n", VolumeInfo
->VolumeLabel
[VolumeInfo
->VolumeLabelLength
/ sizeof(WCHAR
)]);
128 RtlFillMemory(Buffer
, sizeof(Buffer
), 0x55);
129 RtlFillMemory(&IoStatusBlock
, sizeof(IoStatusBlock
), 0x55);
130 status
= NtQueryVolumeInformationFile(handle
, &IoStatusBlock
, VolumeInfo
, sizeof(Buffer
), FileFsVolumeInformation
);
131 ok(status
== STATUS_SUCCESS
, "Got status 0x%lx\n", status
);
132 ok(IoStatusBlock
.Status
== STATUS_SUCCESS
, "IoStatusBlock.Status = 0x%lx\n", IoStatusBlock
.Status
);
133 ok(IoStatusBlock
.Information
== FIELD_OFFSET(FILE_FS_VOLUME_INFORMATION
, VolumeLabel
) + VolumeInfo
->VolumeLabelLength
,
134 "IoStatusBlock.Information = %Iu, expected %lu+%lu\n", IoStatusBlock
.Information
, (ULONG
)FIELD_OFFSET(FILE_FS_VOLUME_INFORMATION
, VolumeLabel
), VolumeInfo
->VolumeLabelLength
);
135 ok(VolumeInfo
->VolumeCreationTime
.QuadPart
!= 0x5555555555555555, "VolumeInfo->VolumeCreationTime = %I64d\n", VolumeInfo
->VolumeCreationTime
.QuadPart
);
136 ok(VolumeInfo
->VolumeSerialNumber
!= 0x55555555, "VolumeInfo->VolumeSerialNumber = %lu\n", VolumeInfo
->VolumeSerialNumber
);
137 ok(VolumeInfo
->SupportsObjects
== FALSE
|| VolumeInfo
->SupportsObjects
== TRUE
, "VolumeInfo->SupportsObjects = %u\n", VolumeInfo
->SupportsObjects
);
138 ok(VolumeInfo
->VolumeLabelLength
% sizeof(WCHAR
) == 0, "VolumeInfo->VolumeLabelLength = %Iu\n", VolumeInfo
->VolumeLabelLength
);
139 if (VolumeInfo
->VolumeLabelLength
>= sizeof(WCHAR
))
140 ok(VolumeInfo
->VolumeLabel
[VolumeInfo
->VolumeLabelLength
/ sizeof(WCHAR
) - 1] != 0x5555, "Incorrect VolumeLabel or Length\n");
141 trace("VolumeLabel = %.*ls\n", (int)VolumeInfo
->VolumeLabelLength
/ sizeof(WCHAR
), VolumeInfo
->VolumeLabel
);
142 ok(VolumeInfo
->VolumeLabel
[VolumeInfo
->VolumeLabelLength
/ sizeof(WCHAR
)] == 0x5555,
143 "Got %x\n", VolumeInfo
->VolumeLabel
[VolumeInfo
->VolumeLabelLength
/ sizeof(WCHAR
)]);
148 TestFileFsAttributeInformation(HANDLE handle
)
150 IO_STATUS_BLOCK IoStatusBlock
;
151 ULONG Buffer
[(sizeof(FILE_FS_ATTRIBUTE_INFORMATION
) + 32 * sizeof(WCHAR
)) / sizeof(ULONG
)];
152 PFILE_FS_ATTRIBUTE_INFORMATION AttributeInfo
= (PFILE_FS_ATTRIBUTE_INFORMATION
)Buffer
;
155 status
= NtQueryVolumeInformationFile(handle
, NULL
, NULL
, 0, FileFsAttributeInformation
);
156 ok(status
== STATUS_INFO_LENGTH_MISMATCH
, "Got status 0x%lx\n", status
);
158 RtlFillMemory(&IoStatusBlock
, sizeof(IoStatusBlock
), 0x55);
159 status
= NtQueryVolumeInformationFile(handle
, &IoStatusBlock
, NULL
, 0, FileFsAttributeInformation
);
160 ok(status
== STATUS_INFO_LENGTH_MISMATCH
, "Got status 0x%lx\n", status
);
161 ok(IoStatusBlock
.Status
== 0x55555555, "IoStatusBlock.Status = 0x%lx\n", IoStatusBlock
.Status
);
162 ok(IoStatusBlock
.Information
== (ULONG_PTR
)0x5555555555555555, "IoStatusBlock.Information = %Iu\n", IoStatusBlock
.Information
);
164 status
= NtQueryVolumeInformationFile(handle
, NULL
, AttributeInfo
, 0, FileFsAttributeInformation
);
165 ok(status
== STATUS_INFO_LENGTH_MISMATCH
, "Got status 0x%lx\n", status
);
167 RtlFillMemory(&IoStatusBlock
, sizeof(IoStatusBlock
), 0x55);
168 status
= NtQueryVolumeInformationFile(handle
, &IoStatusBlock
, (PUCHAR
)Buffer
+ 2, sizeof(FILE_FS_ATTRIBUTE_INFORMATION
), FileFsAttributeInformation
);
169 ok(status
== STATUS_DATATYPE_MISALIGNMENT
, "Got status 0x%lx\n", status
);
170 ok(IoStatusBlock
.Status
== 0x55555555, "IoStatusBlock.Status = 0x%lx\n", IoStatusBlock
.Status
);
171 ok(IoStatusBlock
.Information
== (ULONG_PTR
)0x5555555555555555, "IoStatusBlock.Information = %Iu\n", IoStatusBlock
.Information
);
173 RtlFillMemory(&IoStatusBlock
, sizeof(IoStatusBlock
), 0x55);
174 status
= NtQueryVolumeInformationFile(handle
, &IoStatusBlock
, AttributeInfo
, 0, FileFsAttributeInformation
);
175 ok(status
== STATUS_INFO_LENGTH_MISMATCH
, "Got status 0x%lx\n", status
);
176 ok(IoStatusBlock
.Status
== 0x55555555, "IoStatusBlock.Status = 0x%lx\n", IoStatusBlock
.Status
);
177 ok(IoStatusBlock
.Information
== (ULONG_PTR
)0x5555555555555555, "IoStatusBlock.Information = %Iu\n", IoStatusBlock
.Information
);
179 RtlFillMemory(&IoStatusBlock
, sizeof(IoStatusBlock
), 0x55);
180 status
= NtQueryVolumeInformationFile(handle
, &IoStatusBlock
, AttributeInfo
, FIELD_OFFSET(FILE_FS_ATTRIBUTE_INFORMATION
, FileSystemName
), FileFsAttributeInformation
);
181 ok(status
== STATUS_INFO_LENGTH_MISMATCH
, "Got status 0x%lx\n", status
);
182 ok(IoStatusBlock
.Status
== 0x55555555, "IoStatusBlock.Status = 0x%lx\n", IoStatusBlock
.Status
);
183 ok(IoStatusBlock
.Information
== (ULONG_PTR
)0x5555555555555555, "IoStatusBlock.Information = %Iu\n", IoStatusBlock
.Information
);
185 RtlFillMemory(&IoStatusBlock
, sizeof(IoStatusBlock
), 0x55);
186 status
= NtQueryVolumeInformationFile(handle
, &IoStatusBlock
, AttributeInfo
, sizeof(FILE_FS_ATTRIBUTE_INFORMATION
) - 1, FileFsAttributeInformation
);
187 ok(status
== STATUS_INFO_LENGTH_MISMATCH
, "Got status 0x%lx\n", status
);
188 ok(IoStatusBlock
.Status
== 0x55555555, "IoStatusBlock.Status = 0x%lx\n", IoStatusBlock
.Status
);
189 ok(IoStatusBlock
.Information
== (ULONG_PTR
)0x5555555555555555, "IoStatusBlock.Information = %Iu\n", IoStatusBlock
.Information
);
191 RtlFillMemory(Buffer
, sizeof(Buffer
), 0x55);
192 RtlFillMemory(&IoStatusBlock
, sizeof(IoStatusBlock
), 0x55);
193 status
= NtQueryVolumeInformationFile(handle
, &IoStatusBlock
, AttributeInfo
, sizeof(FILE_FS_ATTRIBUTE_INFORMATION
), FileFsAttributeInformation
);
194 ok(status
== STATUS_BUFFER_OVERFLOW
, "Got status 0x%lx\n", status
);
195 ok(IoStatusBlock
.Status
== STATUS_BUFFER_OVERFLOW
, "IoStatusBlock.Status = 0x%lx\n", IoStatusBlock
.Status
);
196 ok(AttributeInfo
->FileSystemNameLength
== sizeof(FILE_FS_ATTRIBUTE_INFORMATION
) - FIELD_OFFSET(FILE_FS_ATTRIBUTE_INFORMATION
, FileSystemName
),
197 "AttributeInfo->FileSystemNameLength = %Iu\n", AttributeInfo
->FileSystemNameLength
);
198 ok(IoStatusBlock
.Information
== sizeof(FILE_FS_ATTRIBUTE_INFORMATION
),
199 "IoStatusBlock.Information = %Iu, expected %lu\n", IoStatusBlock
.Information
, (ULONG
)sizeof(FILE_FS_ATTRIBUTE_INFORMATION
));
200 ok(AttributeInfo
->FileSystemName
[AttributeInfo
->FileSystemNameLength
/ sizeof(WCHAR
)] == 0x5555,
201 "Got %x\n", AttributeInfo
->FileSystemName
[AttributeInfo
->FileSystemNameLength
/ sizeof(WCHAR
)]);
203 RtlFillMemory(Buffer
, sizeof(Buffer
), 0x55);
204 RtlFillMemory(&IoStatusBlock
, sizeof(IoStatusBlock
), 0x55);
205 status
= NtQueryVolumeInformationFile(handle
, &IoStatusBlock
, AttributeInfo
, sizeof(FILE_FS_ATTRIBUTE_INFORMATION
) + 1, FileFsAttributeInformation
);
206 ok(status
== STATUS_BUFFER_OVERFLOW
, "Got status 0x%lx\n", status
);
207 ok(IoStatusBlock
.Status
== STATUS_BUFFER_OVERFLOW
, "IoStatusBlock.Status = 0x%lx\n", IoStatusBlock
.Status
);
208 ok(AttributeInfo
->FileSystemNameLength
== sizeof(FILE_FS_ATTRIBUTE_INFORMATION
) + 1 - FIELD_OFFSET(FILE_FS_ATTRIBUTE_INFORMATION
, FileSystemName
),
209 "AttributeInfo->FileSystemNameLength = %Iu\n", AttributeInfo
->FileSystemNameLength
);
210 ok(IoStatusBlock
.Information
== sizeof(FILE_FS_ATTRIBUTE_INFORMATION
) + 1,
211 "IoStatusBlock.Information = %Iu, expected %lu\n", IoStatusBlock
.Information
, (ULONG
)sizeof(FILE_FS_ATTRIBUTE_INFORMATION
));
212 ok((AttributeInfo
->FileSystemName
[AttributeInfo
->FileSystemNameLength
/ sizeof(WCHAR
)] & 0xff00) == 0x5500,
213 "Got %x\n", AttributeInfo
->FileSystemName
[AttributeInfo
->FileSystemNameLength
/ sizeof(WCHAR
)]);
214 ok(AttributeInfo
->FileSystemName
[AttributeInfo
->FileSystemNameLength
/ sizeof(WCHAR
) + 1] == 0x5555,
215 "Got %x\n", AttributeInfo
->FileSystemName
[AttributeInfo
->FileSystemNameLength
/ sizeof(WCHAR
) + 1]);
217 RtlFillMemory(Buffer
, sizeof(Buffer
), 0x55);
218 RtlFillMemory(&IoStatusBlock
, sizeof(IoStatusBlock
), 0x55);
219 status
= NtQueryVolumeInformationFile(handle
, &IoStatusBlock
, AttributeInfo
, sizeof(FILE_FS_ATTRIBUTE_INFORMATION
) + sizeof(WCHAR
), FileFsAttributeInformation
);
220 if (status
!= STATUS_SUCCESS
)
222 ok(status
== STATUS_BUFFER_OVERFLOW
, "Got status 0x%lx\n", status
);
223 ok(IoStatusBlock
.Status
== STATUS_BUFFER_OVERFLOW
, "IoStatusBlock.Status = 0x%lx\n", IoStatusBlock
.Status
);
224 ok(AttributeInfo
->FileSystemNameLength
== sizeof(FILE_FS_ATTRIBUTE_INFORMATION
) + sizeof(WCHAR
) - FIELD_OFFSET(FILE_FS_ATTRIBUTE_INFORMATION
, FileSystemName
),
225 "AttributeInfo->FileSystemNameLength = %Iu\n", AttributeInfo
->FileSystemNameLength
);
226 ok(IoStatusBlock
.Information
== sizeof(FILE_FS_ATTRIBUTE_INFORMATION
) + sizeof(WCHAR
),
227 "IoStatusBlock.Information = %Iu, expected %lu\n", IoStatusBlock
.Information
, (ULONG
)sizeof(FILE_FS_ATTRIBUTE_INFORMATION
));
228 ok(AttributeInfo
->FileSystemName
[AttributeInfo
->FileSystemNameLength
/ sizeof(WCHAR
)] == 0x5555,
229 "Got %x\n", AttributeInfo
->FileSystemName
[AttributeInfo
->FileSystemNameLength
/ sizeof(WCHAR
)]);
232 RtlFillMemory(Buffer
, sizeof(Buffer
), 0x55);
233 RtlFillMemory(&IoStatusBlock
, sizeof(IoStatusBlock
), 0x55);
234 status
= NtQueryVolumeInformationFile(handle
, &IoStatusBlock
, AttributeInfo
, sizeof(Buffer
), FileFsAttributeInformation
);
235 ok(status
== STATUS_SUCCESS
, "Got status 0x%lx\n", status
);
236 ok(IoStatusBlock
.Status
== STATUS_SUCCESS
, "IoStatusBlock.Status = 0x%lx\n", IoStatusBlock
.Status
);
237 ok(IoStatusBlock
.Information
== FIELD_OFFSET(FILE_FS_ATTRIBUTE_INFORMATION
, FileSystemName
) + AttributeInfo
->FileSystemNameLength
,
238 "IoStatusBlock.Information = %Iu, expected %lu+%lu\n", IoStatusBlock
.Information
, (ULONG
)FIELD_OFFSET(FILE_FS_ATTRIBUTE_INFORMATION
, FileSystemName
), AttributeInfo
->FileSystemNameLength
);
239 ok(AttributeInfo
->FileSystemAttributes
!= 0x55555555, "AttributeInfo->FileSystemAttributes = 0x%lx\n", AttributeInfo
->FileSystemAttributes
);
240 ok(AttributeInfo
->MaximumComponentNameLength
!= 0x55555555, "AttributeInfo->MaximumComponentNameLength = 0x%lx\n", AttributeInfo
->MaximumComponentNameLength
);
241 ok(AttributeInfo
->FileSystemNameLength
% sizeof(WCHAR
) == 0, "AttributeInfo->FileSystemNameLength = %Iu\n", AttributeInfo
->FileSystemNameLength
);
242 ok(!wcsncmp(AttributeInfo
->FileSystemName
, L
"NTFS", 4) ||
243 !wcsncmp(AttributeInfo
->FileSystemName
, L
"FAT", 3) ||
244 !wcsncmp(AttributeInfo
->FileSystemName
, L
"FAT32", 5),
245 "FileSystemName = %.*ls\n", (int)AttributeInfo
->FileSystemNameLength
/ sizeof(WCHAR
), AttributeInfo
->FileSystemName
);
246 trace("FileSystemName = %.*ls\n", (int)AttributeInfo
->FileSystemNameLength
/ sizeof(WCHAR
), AttributeInfo
->FileSystemName
);
247 ok(AttributeInfo
->FileSystemName
[AttributeInfo
->FileSystemNameLength
/ sizeof(WCHAR
)] == 0x5555,
248 "Got %x\n", AttributeInfo
->FileSystemName
[AttributeInfo
->FileSystemNameLength
/ sizeof(WCHAR
)]);
251 START_TEST(NtQueryVolumeInformationFile
)
253 IO_STATUS_BLOCK IoStatusBlock
;
254 OBJECT_ATTRIBUTES attr
;
256 WCHAR path
[MAX_PATH
];
257 UNICODE_STRING pathW
;
260 /*Store a valid Handle*/
261 GetWindowsDirectoryW(path
, MAX_PATH
);
262 RtlDosPathNameToNtPathName_U(path
, &pathW
, NULL
, NULL
);
264 InitializeObjectAttributes(&attr
, &pathW
, OBJ_CASE_INSENSITIVE
, NULL
, NULL
);
265 status
= NtOpenFile(&handle
, SYNCHRONIZE
|FILE_LIST_DIRECTORY
, &attr
, &IoStatusBlock
, FILE_SHARE_READ
|FILE_SHARE_WRITE
, FILE_DIRECTORY_FILE
|FILE_SYNCHRONOUS_IO_NONALERT
);
266 ok(status
== STATUS_SUCCESS
, "NtOpenFile failed: 0x%lx\n", status
);
267 RtlFreeUnicodeString(&pathW
);
269 if (!NT_SUCCESS(status
))
271 skip("NtOpenFile failed: 0x%lx\n", status
);
275 /*Now all NULL. Priority check: FsInformationClass value!*/
276 SetLastError(0xcacacaca);
277 status
= NtQueryVolumeInformationFile(NULL
, NULL
, NULL
, 0, 0);
278 ok(status
== STATUS_INVALID_INFO_CLASS
, "Expected STATUS_INVALID_INFO_CLASS, got 0x%lx\n", status
);
279 ok(GetLastError() == 0xcacacaca, "Expected 0xcacacaca, got %lx\n", GetLastError());
281 status
= NtQueryVolumeInformationFile(NULL
, NULL
, NULL
, 0, 0x80000000);
282 ok(status
== STATUS_INVALID_INFO_CLASS
, "Expected STATUS_INVALID_INFO_CLASS, got 0x%lx\n", status
);
284 TestFileFsDeviceInformation(handle
);
285 TestFileFsVolumeInformation(handle
);
286 TestFileFsAttributeInformation(handle
);