[NTDLL_APITEST]
authorThomas Faber <thomas.faber@reactos.org>
Sun, 20 Apr 2014 18:15:41 +0000 (18:15 +0000)
committerThomas Faber <thomas.faber@reactos.org>
Sun, 20 Apr 2014 18:15:41 +0000 (18:15 +0000)
- Add test for NtQueryVolumeInformationFile. Patch by Víctor Martínez.
ROSTESTS-134 #resolve

svn path=/trunk/; revision=62844

rostests/apitests/ntdll/CMakeLists.txt
rostests/apitests/ntdll/NtQueryVolumeInformationFile.c [new file with mode: 0644]
rostests/apitests/ntdll/testlist.c

index bc6b6be..12afccf 100644 (file)
@@ -9,6 +9,7 @@ list(APPEND SOURCE
     NtMapViewOfSection.c
     NtProtectVirtualMemory.c
     NtQuerySystemEnvironmentValue.c
+    NtQueryVolumeInformationFile.c
     RtlBitmap.c
     RtlDetermineDosPathNameType.c
     RtlDoesFileExists.c
diff --git a/rostests/apitests/ntdll/NtQueryVolumeInformationFile.c b/rostests/apitests/ntdll/NtQueryVolumeInformationFile.c
new file mode 100644 (file)
index 0000000..6de9859
--- /dev/null
@@ -0,0 +1,85 @@
+/*
+ * PROJECT:         ReactOS API Tests
+ * LICENSE:         GPLv2+ - See COPYING in the top level directory
+ * PURPOSE:         NtQueryVolumeInformationFile tests
+ * PROGRAMMER:      Víctor Martínez Calvo <vicmarcal@gmail.com>
+ */
+
+#define WIN32_NO_STATUS
+#include <stdio.h>
+#include <wine/test.h>
+#include <ndk/ntndk.h>
+
+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;
+
+    /*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);
+    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 %lx\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 %lx\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 %lx\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 %lx\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 %lx\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 %lx\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 %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());
+
+    NtClose(handle);
+}
index 0f45d26..ff74480 100644 (file)
@@ -12,6 +12,7 @@ extern void func_NtFreeVirtualMemory(void);
 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 @@ const struct test winetest_testlist[] =
     { "NtMapViewOfSection",             func_NtMapViewOfSection },
     { "NtProtectVirtualMemory",         func_NtProtectVirtualMemory },
     { "NtQuerySystemEnvironmentValue",  func_NtQuerySystemEnvironmentValue },
+    { "NtQueryVolumeInformationFile",   func_NtQueryVolumeInformationFile },
     { "NtSystemInformation",            func_NtSystemInformation },
     { "RtlBitmapApi",                   func_RtlBitmap },
     { "RtlDetermineDosPathNameType",    func_RtlDetermineDosPathNameType },