Index: apitests/ntdll/CMakeLists.txt =================================================================== --- apitests/ntdll/CMakeLists.txt (revision 62724) +++ apitests/ntdll/CMakeLists.txt (working copy) @@ -9,6 +9,7 @@ NtMapViewOfSection.c NtProtectVirtualMemory.c NtQuerySystemEnvironmentValue.c + NtQueryVolumeInformationFile.c RtlBitmap.c RtlDetermineDosPathNameType.c RtlDoesFileExists.c Index: apitests/ntdll/NtQueryVolumeInformationFile.c =================================================================== --- apitests/ntdll/NtQueryVolumeInformationFile.c (revision 0) +++ apitests/ntdll/NtQueryVolumeInformationFile.c (working copy) @@ -0,0 +1,84 @@ +/* + * PROJECT: ReactOS API Tests + * LICENSE: GPLv2+ - See COPYING in the top level directory + * PURPOSE: NtQueryVolumeInformationFile tests + * PROGRAMMER: Víctor Martínez Calvo + */ + +#define WIN32_NO_STATUS +#include +#include +#include + +START_TEST(NtQueryVolumeInformationFile) +{ + IO_STATUS_BLOCK IoStatusBlock; + FILE_FS_DEVICE_INFORMATION FileFsDevice; + OBJECT_ATTRIBUTES attr; + HANDLE handle; + WCHAR path[MAX_PATH]; + UNICODE_STRING pathW; + NTSTATUS status; + DWORD skipped = 0; + /*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); + + ok(NT_SUCCESS(status), "NtOpenFile failed: 0x%lx . Several tests skipped.\n", status); + + if (NT_SUCCESS(status)) + { + /*Testing VALID handle, with NULL IN parameters*/ + SetLastError(0xdeadb33f); + status = NtQueryVolumeInformationFile(handle, NULL, &FileFsDevice, sizeof(FILE_FS_DEVICE_INFORMATION), FileFsDeviceInformation); + ok(status == STATUS_ACCESS_VIOLATION, "Expected STATUS_ACCESS_VIOLATION, got 0x%lx\n", status); + ok(GetLastError() == 0xdeadb33f, "Expected 0xdeadb33f, got %x\n", GetLastError); + + SetLastError(0xcacacaca); + status = NtQueryVolumeInformationFile(handle, &IoStatusBlock, NULL, sizeof(FILE_FS_DEVICE_INFORMATION), FileFsDeviceInformation); + ok(status == STATUS_ACCESS_VIOLATION, "Expected STATUS_ACCESS_VIOLATION, got 0x%lx\n", status); + ok(GetLastError() == 0xcacacaca, "Expected 0xcacacaca, got %x\n", GetLastError); + + SetLastError(0xdadadada); + status = NtQueryVolumeInformationFile(handle, &IoStatusBlock, &FileFsDevice, 0, FileFsDeviceInformation); + ok(status == STATUS_INFO_LENGTH_MISMATCH, "Expected STATUS_INFO_LENGTH_MISMATCH, got 0x%lx\n", status); + ok(GetLastError() == 0xdadadada, "Expected 0xdadadada, got %x\n", GetLastError); + + /*All valid, invalid FsInformationClass value.*/ + SetLastError(0xdeadbeef); + status = NtQueryVolumeInformationFile(handle, &IoStatusBlock, &FileFsDevice, sizeof(FILE_FS_DEVICE_INFORMATION), 0); + ok(status == STATUS_INVALID_INFO_CLASS, "Expected STATUS_INVALID_INFO_CLASS, got 0x%lx\n", status); + ok(GetLastError() == 0xdeadbeef, "Expected 0xdeadbeef, got %x\n", GetLastError); + } + + /*Testing NULL handle*/ + SetLastError(0xdeadbeef); + status = NtQueryVolumeInformationFile(NULL, &IoStatusBlock, &FileFsDevice, sizeof(FILE_FS_DEVICE_INFORMATION), FileFsDeviceInformation); + ok(status == STATUS_INVALID_HANDLE, "Expected STATUS_INVALID_HANDLE, got 0x%lx\n", status); + ok(GetLastError() == 0xdeadbeef, "Expected 0xdeadbeef, got %x\n", GetLastError); + + /*Testing INVALID_HANDLE_VALUE*/ + SetLastError(0xdeaddead); + status = NtQueryVolumeInformationFile((HANDLE)(-1), &IoStatusBlock, &FileFsDevice, sizeof(FILE_FS_DEVICE_INFORMATION), FileFsDeviceInformation); + ok(status == STATUS_OBJECT_TYPE_MISMATCH, "Expected STATUS_OBJECT_TYPE_MISMATCH, got 0x%lx\n", status); + ok(GetLastError() == 0xdeaddead, "Expected 0xdeaddead, got %x\n", GetLastError); + + /*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 %x\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 %x\n", GetLastError); + + CloseHandle(handle); +} \ No newline at end of file Index: apitests/ntdll/testlist.c =================================================================== --- apitests/ntdll/testlist.c (revision 62724) +++ apitests/ntdll/testlist.c (working copy) @@ -12,6 +12,7 @@ extern void func_NtMapViewOfSection(void); extern void func_NtProtectVirtualMemory(void); extern void func_NtQuerySystemEnvironmentValue(void); +extern void func_NtQueryVolumeInformationFile(void); extern void func_NtSystemInformation(void); extern void func_RtlBitmap(void); extern void func_RtlDetermineDosPathNameType(void); @@ -39,6 +40,7 @@ { "NtMapViewOfSection", func_NtMapViewOfSection }, { "NtProtectVirtualMemory", func_NtProtectVirtualMemory }, { "NtQuerySystemEnvironmentValue", func_NtQuerySystemEnvironmentValue }, + { "NtQueryVolumeInformationFile", func_NtQueryVolumeInformationFile }, { "NtSystemInformation", func_NtSystemInformation }, { "RtlBitmapApi", func_RtlBitmap }, { "RtlDetermineDosPathNameType", func_RtlDetermineDosPathNameType },