Reactos
1/*
2 * PROJECT: ReactOS kernel-mode tests
3 * LICENSE: LGPL-2.1+ (https://spdx.org/licenses/LGPL-2.1+)
4 * PURPOSE: Test for GetFileAttributes/SetFileAttributes
5 * COPYRIGHT: Copyright 2017 Thomas Faber <thomas.faber@reactos.org>
6 * Copyright 2017 Katayama Hirofumi MZ <katayama.hirofumi.mz@gmail.com>
7 */
8
9#include <kmt_test.h>
10
11#include "kernel32_test.h"
12
13START_TEST(FileAttributes)
14{
15 PCWSTR FileName = L"\\\\.\\Global\\GLOBALROOT\\Device\\Kmtest-kernel32\\Somefile";
16 BOOL Ret;
17 DWORD Attributes;
18 DWORD Error;
19
20 Error = KmtLoadAndOpenDriver(L"kernel32", FALSE);
21 ok_eq_int(Error, ERROR_SUCCESS);
22 if (Error)
23 return;
24
25 /* Set read-only attribute */
26 KmtSendUlongToDriver(IOCTL_EXPECT_SET_ATTRIBUTES, FILE_ATTRIBUTE_READONLY | FILE_ATTRIBUTE_NORMAL);
27 Ret = SetFileAttributesW(FileName, FILE_ATTRIBUTE_READONLY);
28 ok(Ret == TRUE, "SetFileAttributesW returned %d, error %lu\n", Ret, GetLastError());
29
30 /* Set normal attribute */
31 KmtSendUlongToDriver(IOCTL_EXPECT_SET_ATTRIBUTES, FILE_ATTRIBUTE_NORMAL);
32 Ret = SetFileAttributesW(FileName, FILE_ATTRIBUTE_NORMAL);
33 ok(Ret == TRUE, "SetFileAttributesW returned %d, error %lu\n", Ret, GetLastError());
34
35 /* Set 0 attribute (driver should receive normal) */
36 KmtSendUlongToDriver(IOCTL_EXPECT_SET_ATTRIBUTES, FILE_ATTRIBUTE_NORMAL);
37 Ret = SetFileAttributesW(FileName, 0);
38 ok(Ret == TRUE, "SetFileAttributesW returned %d, error %lu\n", Ret, GetLastError());
39
40 /* Set invalid attributes */
41 KmtSendUlongToDriver(IOCTL_EXPECT_SET_ATTRIBUTES, FILE_ATTRIBUTE_VALID_SET_FLAGS);
42 Ret = SetFileAttributesW(FileName, INVALID_FILE_ATTRIBUTES);
43 ok(Ret == TRUE, "SetFileAttributesW returned %d, error %lu\n", Ret, GetLastError());
44
45 /* Query read-only attribute */
46 KmtSendUlongToDriver(IOCTL_RETURN_QUERY_ATTRIBUTES, FILE_ATTRIBUTE_READONLY);
47 Attributes = GetFileAttributesW(FileName);
48 ok_eq_hex(Attributes, FILE_ATTRIBUTE_READONLY);
49
50 /* Query read-only + normal attribute */
51 KmtSendUlongToDriver(IOCTL_RETURN_QUERY_ATTRIBUTES, FILE_ATTRIBUTE_READONLY | FILE_ATTRIBUTE_NORMAL);
52 Attributes = GetFileAttributesW(FileName);
53 ok_eq_hex(Attributes, FILE_ATTRIBUTE_READONLY | FILE_ATTRIBUTE_NORMAL);
54
55 /* Query normal attribute */
56 KmtSendUlongToDriver(IOCTL_RETURN_QUERY_ATTRIBUTES, FILE_ATTRIBUTE_NORMAL);
57 Attributes = GetFileAttributesW(FileName);
58 ok_eq_hex(Attributes, FILE_ATTRIBUTE_NORMAL);
59
60 /* Query 0 attribute */
61 KmtSendUlongToDriver(IOCTL_RETURN_QUERY_ATTRIBUTES, 0);
62 Attributes = GetFileAttributesW(FileName);
63 ok_eq_hex(Attributes, 0);
64
65 /* Query invalid attributes */
66 KmtSendUlongToDriver(IOCTL_RETURN_QUERY_ATTRIBUTES, INVALID_FILE_ATTRIBUTES);
67 Attributes = GetFileAttributesW(FileName);
68 ok_eq_hex(Attributes, INVALID_FILE_ATTRIBUTES);
69
70 /** Directory attribute **/
71 /* Set read-only and directory attribute */
72 KmtSendUlongToDriver(IOCTL_EXPECT_SET_ATTRIBUTES, FILE_ATTRIBUTE_NORMAL | FILE_ATTRIBUTE_READONLY);
73 Ret = SetFileAttributesW(FileName, FILE_ATTRIBUTE_READONLY | FILE_ATTRIBUTE_DIRECTORY);
74 ok(Ret == TRUE, "SetFileAttributesW returned %d, error %lu\n", Ret, GetLastError());
75
76 /* Set normal and directory attribute */
77 KmtSendUlongToDriver(IOCTL_EXPECT_SET_ATTRIBUTES, FILE_ATTRIBUTE_NORMAL);
78 Ret = SetFileAttributesW(FileName, FILE_ATTRIBUTE_NORMAL | FILE_ATTRIBUTE_DIRECTORY);
79 ok(Ret == TRUE, "SetFileAttributesW returned %d, error %lu\n", Ret, GetLastError());
80
81 /* Set directory attribute */
82 KmtSendUlongToDriver(IOCTL_EXPECT_SET_ATTRIBUTES, FILE_ATTRIBUTE_NORMAL);
83 Ret = SetFileAttributesW(FileName, FILE_ATTRIBUTE_DIRECTORY);
84 ok(Ret == TRUE, "SetFileAttributesW returned %d, error %lu\n", Ret, GetLastError());
85
86 /* Query read-only and directory attribute */
87 KmtSendUlongToDriver(IOCTL_RETURN_QUERY_ATTRIBUTES, FILE_ATTRIBUTE_READONLY | FILE_ATTRIBUTE_DIRECTORY);
88 Attributes = GetFileAttributesW(FileName);
89 ok_eq_hex(Attributes, FILE_ATTRIBUTE_READONLY | FILE_ATTRIBUTE_DIRECTORY);
90
91 /* Query read-only + normal + directory attribute */
92 KmtSendUlongToDriver(IOCTL_RETURN_QUERY_ATTRIBUTES, FILE_ATTRIBUTE_READONLY | FILE_ATTRIBUTE_NORMAL | FILE_ATTRIBUTE_DIRECTORY);
93 Attributes = GetFileAttributesW(FileName);
94 ok_eq_hex(Attributes, FILE_ATTRIBUTE_READONLY | FILE_ATTRIBUTE_NORMAL | FILE_ATTRIBUTE_DIRECTORY);
95
96 /* Query normal and directory attribute */
97 KmtSendUlongToDriver(IOCTL_RETURN_QUERY_ATTRIBUTES, FILE_ATTRIBUTE_NORMAL | FILE_ATTRIBUTE_DIRECTORY);
98 Attributes = GetFileAttributesW(FileName);
99 ok_eq_hex(Attributes, FILE_ATTRIBUTE_NORMAL | FILE_ATTRIBUTE_DIRECTORY);
100
101 /* Query directory attribute */
102 KmtSendUlongToDriver(IOCTL_RETURN_QUERY_ATTRIBUTES, FILE_ATTRIBUTE_DIRECTORY);
103 Attributes = GetFileAttributesW(FileName);
104 ok_eq_hex(Attributes, FILE_ATTRIBUTE_DIRECTORY);
105
106 KmtCloseDriver();
107 KmtUnloadDriver();
108}