2004-10-24 Casper S. Hornstrup <chorns@users.sourceforge.net>
[reactos.git] / reactos / lib / kernel32 / tests / tests / CreateFile.c
1 #include "../../k32.h"
2 #include "regtests.h"
3
4 #define NDEBUG
5 #include "../../include/debug.h"
6
7 #define TestFilename L"C:\\File"
8 #define TestExpectedFilename L"\\??\\" TestFilename
9 #define TestHandle (HANDLE) 1
10
11 typedef struct
12 {
13 LPCWSTR lpFileName;
14 DWORD dwDesiredAccess;
15 DWORD dwShareMode;
16 LPSECURITY_ATTRIBUTES lpSecurityAttributes;
17 DWORD dwCreationDisposition;
18 DWORD dwFlagsAndAttributes;
19 HANDLE hTemplateFile;
20 } CreateFile_PARAMETERS;
21
22 typedef struct
23 {
24 PWCHAR ObjectName;
25 ACCESS_MASK DesiredAccess;
26 ULONG FileAttributes;
27 ULONG ShareAccess;
28 ULONG CreateDisposition;
29 ULONG CreateOptions;
30 PVOID EaBuffer;
31 ULONG EaLength;
32 } NtCreateFile_PARAMETERS;
33
34 typedef struct
35 {
36 CreateFile_PARAMETERS CreateFileParameters;
37 NtCreateFile_PARAMETERS NtCreateFileParameters;
38 } CreateFileTest_Parameters;
39
40 static CreateFileTest_Parameters CreateFileTests[] =
41 {
42 {
43 CreateFileParameters:
44 {
45 lpFileName: TestFilename,
46 dwDesiredAccess: GENERIC_ALL,
47 dwShareMode: FILE_SHARE_WRITE,
48 lpSecurityAttributes: NULL,
49 dwCreationDisposition: CREATE_ALWAYS,
50 dwFlagsAndAttributes: 0,
51 hTemplateFile: NULL
52 },
53 NtCreateFileParameters:
54 {
55 ObjectName: TestExpectedFilename,
56 DesiredAccess: GENERIC_ALL|SYNCHRONIZE|FILE_READ_ATTRIBUTES,
57 FileAttributes: 0,
58 ShareAccess: FILE_SHARE_WRITE,
59 CreateDisposition: FILE_OVERWRITE_IF,
60 CreateOptions: FILE_NON_DIRECTORY_FILE|FILE_SYNCHRONOUS_IO_NONALERT,
61 NULL,
62 0
63 }
64 }
65 };
66
67 static CreateFileTest_Parameters *CurrentTest;
68
69 static NTSTATUS STDCALL
70 MockNtCreateFile(PHANDLE FileHandle,
71 ACCESS_MASK DesiredAccess,
72 POBJECT_ATTRIBUTES ObjectAttributes,
73 PIO_STATUS_BLOCK IoStatusBlock,
74 PLARGE_INTEGER AllocateSize,
75 ULONG FileAttributes,
76 ULONG ShareAccess,
77 ULONG CreateDisposition,
78 ULONG CreateOptions,
79 PVOID EaBuffer,
80 ULONG EaLength)
81 {
82 _AssertEqualWideString(CurrentTest->NtCreateFileParameters.ObjectName,
83 ObjectAttributes->ObjectName->Buffer);
84 _AssertEqualValue(CurrentTest->NtCreateFileParameters.DesiredAccess, DesiredAccess);
85 _AssertEqualValue(CurrentTest->NtCreateFileParameters.FileAttributes, FileAttributes);
86 _AssertEqualValue(CurrentTest->NtCreateFileParameters.ShareAccess, ShareAccess);
87 _AssertEqualValue(CurrentTest->NtCreateFileParameters.CreateDisposition, CreateDisposition);
88 _AssertEqualValue(CurrentTest->NtCreateFileParameters.CreateOptions, CreateOptions);
89 *FileHandle = TestHandle;
90 return STATUS_SUCCESS;
91 }
92
93 static HOOK NtCreateFileHooks[] =
94 {
95 {"NtCreateFile", MockNtCreateFile},
96 NULL, NULL
97 };
98
99 static void TestFile()
100 {
101 HANDLE FileHandle;
102 int index;
103
104 _SetHooks(NtCreateFileHooks);
105 for (index = 0; index < sizeof(CreateFileTests) / sizeof(CreateFileTests[0]); index++)
106 {
107 CurrentTest = &CreateFileTests[index];
108 FileHandle = CreateFileW(CurrentTest->CreateFileParameters.lpFileName,
109 CurrentTest->CreateFileParameters.dwDesiredAccess,
110 CurrentTest->CreateFileParameters.dwShareMode,
111 CurrentTest->CreateFileParameters.lpSecurityAttributes,
112 CurrentTest->CreateFileParameters.dwCreationDisposition,
113 CurrentTest->CreateFileParameters.dwFlagsAndAttributes,
114 CurrentTest->CreateFileParameters.hTemplateFile);
115 _AssertEqualValue(NO_ERROR, GetLastError());
116 _AssertEqualValue(TestHandle, FileHandle);
117 }
118 _UnsetAllHooks();
119 }
120
121 static void RunTest()
122 {
123 TestFile();
124 }
125
126 _Dispatcher(CreatefileTest, "CreateFileW")