ReactOS 0.4.17-dev-205-g2e13f97
ReadFile.c
Go to the documentation of this file.
1/*
2 * PROJECT: ReactOS API tests
3 * LICENSE: MIT (https://spdx.org/licenses/MIT)
4 * PURPOSE: Test for ReadFile
5 * COPYRIGHT: Copyright 2026 Timo Kreuzer <timo.kreuzer@reactos.org>
6 */
7
8#include "precomp.h"
9
11{
12 UCHAR Buffer[128];
13 DWORD dwBytesRead;
14 BOOL bResult;
15
17
18 /* Test NULL File */
19 SetLastError(0xdeadbeef);
20 dwBytesRead = 0xdeadbeef;
21 bResult = ReadFile(NULL, Buffer, sizeof(Buffer), &dwBytesRead, NULL);
22 ok_eq_bool(bResult, FALSE);
23 ok_eq_ulong(dwBytesRead, 0);
25
26 /* Test INVALID_HANDLE_VALUE */
27 SetLastError(0xdeadbeef);
28 dwBytesRead = 0xdeadbeef;
29 bResult = ReadFile(INVALID_HANDLE_VALUE, Buffer, sizeof(Buffer), &dwBytesRead, NULL);
30 ok_eq_bool(bResult, FALSE);
31 ok_eq_ulong(dwBytesRead, 0);
33
34 /* Read some bytes */
35 SetLastError(0xdeadbeef);
36 dwBytesRead = 0xdeadbeef;
37 bResult = ReadFile(hFile, Buffer, sizeof(Buffer), &dwBytesRead, NULL);
38 ok_eq_bool(bResult, TRUE);
39 ok_eq_ulong(dwBytesRead, sizeof(Buffer));
40 ok_eq_ulong(GetLastError(), 0xdeadbeef);
41
42 /* Try to read at end of file */
43 SetLastError(0xdeadbeef);
44 dwBytesRead = 0xdeadbeef;
45 ok(SetFilePointer(hFile, 0, NULL, FILE_END) > 0, "SetFilePointer failed\n");
46 bResult = ReadFile(hFile, Buffer, sizeof(Buffer), &dwBytesRead, NULL);
47 ok_eq_bool(bResult, TRUE);
48 ok_eq_ulong(dwBytesRead, 0);
49 ok_eq_ulong(GetLastError(), 0xdeadbeef);
50
51 /* Try to read 0 bytes at end of file */
52 SetLastError(0xdeadbeef);
53 bResult = ReadFile(hFile, Buffer, 0, &dwBytesRead, NULL);
54 ok_eq_bool(bResult, TRUE);
55 ok_eq_ulong(dwBytesRead, 0);
56 ok_eq_ulong(GetLastError(), 0xdeadbeef);
58
59 /* Test with NULL lpBuffer */
60 SetLastError(0xdeadbeef);
61 dwBytesRead = 0xdeadbeef;
62 StartSeh()
63 bResult = ReadFile(hFile, NULL, sizeof(Buffer), &dwBytesRead, NULL);
64 ok_eq_bool(bResult, FALSE);
65 ok_eq_ulong(dwBytesRead, 0);
68
69 /* Test with NULL lpBuffer and 0 nNumberOfBytesToRead */
70 SetLastError(0xdeadbeef);
71 dwBytesRead = 0xdeadbeef;
72 StartSeh()
73 bResult = ReadFile(hFile, NULL, 0, &dwBytesRead, NULL);
74 ok_eq_bool(bResult, TRUE);
75 ok_eq_ulong(dwBytesRead, 0);
76 ok_eq_ulong(GetLastError(), 0xdeadbeef);
78
79 /* Test with NULL lpNumberOfBytesRead */
80 SetLastError(0xdeadbeef);
81 StartSeh()
82 bResult = ReadFile(hFile, Buffer, sizeof(Buffer), NULL, NULL);
83 ok_eq_bool(bResult, TRUE);
84 ok_eq_ulong(GetLastError(), 0xdeadbeef);
86
87 /* Test with NULL lpNumberOfBytesRead at end of file */
88 ok(SetFilePointer(hFile, 0, NULL, FILE_END) > 0, "SetFilePointer failed\n");
89 SetLastError(0xdeadbeef);
90 StartSeh()
91 bResult = ReadFile(hFile, Buffer, sizeof(Buffer), NULL, NULL);
92 ok_eq_bool(bResult, TRUE);
93 ok_eq_ulong(GetLastError(), 0xdeadbeef);
95}
96
98{
99 BOOL bResult;
100 UCHAR Buffer[128];
101 DWORD dwBytesRead;
102 OVERLAPPED ol = { 0 };
103
105
106 /* Test NULL File */
107 SetLastError(0xdeadbeef);
108 dwBytesRead = 0xdeadbeef;
109 bResult = ReadFile(NULL, Buffer, sizeof(Buffer), &dwBytesRead, &ol);
110 ok_eq_bool(bResult, FALSE);
111 ok_eq_ulong(dwBytesRead, 0);
113
114 /* Test INVALID_HANDLE_VALUE */
115 SetLastError(0xdeadbeef);
116 dwBytesRead = 0xdeadbeef;
117 bResult = ReadFile(INVALID_HANDLE_VALUE, Buffer, sizeof(Buffer), &dwBytesRead, &ol);
118 ok_eq_bool(bResult, FALSE);
119 ok_eq_ulong(dwBytesRead, 0);
121
122 /* Read some bytes */
123 SetLastError(0xdeadbeef);
124 dwBytesRead = 0xdeadbeef;
125 bResult = ReadFile(hFile, Buffer, sizeof(Buffer), &dwBytesRead, &ol);
126 ok_eq_bool(bResult, TRUE);
127 dwBytesRead = 0xdeadbeef;
128 bResult = GetOverlappedResult(hFile, &ol, &dwBytesRead, TRUE);
129 ok_eq_bool(bResult, TRUE);
130 ok_eq_ulong(dwBytesRead, sizeof(Buffer));
131 ok_eq_ulong(GetLastError(), (GetNTVersion() >= _WIN32_WINNT_WIN10) ? 0 : 0xdeadbeef);
132
133 /* Try to read at end of file */
134 SetLastError(0xdeadbeef);
135 dwBytesRead = 0xdeadbeef;
137 ok(ol.Offset > 0, "GetFileSize failed\n");
138 bResult = ReadFile(hFile, Buffer, sizeof(Buffer), &dwBytesRead, &ol);
139 ok_eq_bool(bResult, FALSE);
140 ok_eq_ulong(dwBytesRead, 0);
142
143 /* Try to read 0 bytes at end of file */
144 SetLastError(0xdeadbeef);
145 bResult = ReadFile(hFile, Buffer, 0, &dwBytesRead, &ol);
146 ok_eq_bool(bResult, TRUE);
147 ok_eq_ulong(dwBytesRead, 0);
148 ok_eq_ulong(GetLastError(), 0xdeadbeef);
149 ol.Offset = 0;
150
151 /* Test with NULL lpBuffer */
152 SetLastError(0xdeadbeef);
153 dwBytesRead = 0xdeadbeef;
154 StartSeh()
155 bResult = ReadFile(hFile, NULL, sizeof(Buffer), &dwBytesRead, &ol);
156 ok_eq_bool(bResult, FALSE);
159
160 /* Test with NULL lpBuffer and 0 nNumberOfBytesToRead */
161 SetLastError(0xdeadbeef);
162 dwBytesRead = 0xdeadbeef;
163 StartSeh()
164 bResult = ReadFile(hFile, NULL, 0, &dwBytesRead, &ol);
165 ok_eq_bool(bResult, TRUE);
166 ok_eq_ulong(GetLastError(), 0xdeadbeef);
167 bResult = GetOverlappedResult(hFile, &ol, &dwBytesRead, TRUE);
168 ok_eq_bool(bResult, TRUE);
169 ok_eq_ulong(dwBytesRead, 0);
170 ok_eq_ulong(GetLastError(), (GetNTVersion() >= _WIN32_WINNT_WIN10) ? 0 : 0xdeadbeef);
172
173 /* Test with NULL lpNumberOfBytesRead */
174 SetLastError(0xdeadbeef);
175 bResult = ReadFile(hFile, Buffer, sizeof(Buffer), NULL, &ol);
176 ok_eq_bool(bResult, TRUE);
177 ok_eq_ulong(GetLastError(), 0xdeadbeef);
178 bResult = GetOverlappedResult(hFile, &ol, &dwBytesRead, TRUE);
179 ok_eq_bool(bResult, TRUE);
180 ok_eq_ulong(dwBytesRead, sizeof(Buffer));
181 ok_eq_ulong(GetLastError(), (GetNTVersion() >= _WIN32_WINNT_WIN10) ? 0 : 0xdeadbeef);
182
183 /* Test with NULL lpNumberOfBytesRead at end of file */
184 SetLastError(0xdeadbeef);
186 ok(ol.Offset > 0, "GetFileSize failed\n");
187 bResult = ReadFile(hFile, Buffer, sizeof(Buffer), NULL, &ol);
188 ok_eq_bool(bResult, FALSE);
190 SetLastError(0xdeadbeef);
191 dwBytesRead = 0xdeadbeef;
192 bResult = GetOverlappedResult(hFile, &ol, &dwBytesRead, TRUE);
193 ok_eq_bool(bResult, FALSE);
194 ok_eq_ulong(dwBytesRead, 0);
196 ol.Offset = 0;
197}
198
200{
203
204 /* Open the executable file */
209 NULL,
212 NULL);
214 {
215 skip("CreateFileA failed with error %lu\n", GetLastError());
216 return;
217 }
218
221
223}
static void Test_ReadFile_sync(HANDLE hFile)
Definition: ReadFile.c:10
static void Test_ReadFile_async(HANDLE hFile)
Definition: ReadFile.c:97
#define ok_eq_ulong(value, expected)
Definition: apitest.h:120
#define GetNTVersion()
Definition: apitest.h:17
#define StartSeh()
Definition: apitest.h:93
#define ok_eq_bool(value, expected)
Definition: apitest.h:137
#define EndSeh(ExpectedStatus)
Definition: apitest.h:99
#define ok(value,...)
Definition: atltest.h:57
#define skip(...)
Definition: atltest.h:64
#define START_TEST(x)
Definition: atltest.h:75
Definition: bufpool.h:45
#define NULL
Definition: types.h:112
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
#define ARRAYSIZE(array)
Definition: filtermapper.c:47
#define CloseHandle
Definition: compat.h:739
#define FILE_BEGIN
Definition: compat.h:761
#define OPEN_EXISTING
Definition: compat.h:775
#define ReadFile(a, b, c, d, e)
Definition: compat.h:742
#define SetFilePointer
Definition: compat.h:743
#define SetLastError(x)
Definition: compat.h:752
#define INVALID_HANDLE_VALUE
Definition: compat.h:731
#define CreateFileA(a, b, c, d, e, f, g)
Definition: compat.h:740
#define MAX_PATH
Definition: compat.h:34
#define ERROR_INVALID_HANDLE
Definition: compat.h:98
#define FILE_ATTRIBUTE_NORMAL
Definition: compat.h:137
#define FILE_SHARE_READ
Definition: compat.h:136
DWORD WINAPI GetFileSize(HANDLE hFile, LPDWORD lpFileSizeHigh)
Definition: fileinfo.c:331
DWORD WINAPI GetModuleFileNameA(HINSTANCE hModule, LPSTR lpFilename, DWORD nSize)
Definition: loader.c:539
unsigned int BOOL
Definition: ntddk_ex.h:94
unsigned long DWORD
Definition: ntddk_ex.h:95
BOOL WINAPI GetOverlappedResult(IN HANDLE hFile, IN LPOVERLAPPED lpOverlapped, OUT LPDWORD lpNumberOfBytesTransferred, IN BOOL bWait)
Definition: iocompl.c:221
#define EXCEPTION_ACCESS_VIOLATION
Definition: minwinbase.h:44
_In_ HANDLE hFile
Definition: mswsock.h:90
#define FILE_READ_ACCESS
Definition: nt_native.h:610
char CHAR
Definition: pedump.c:57
#define _WIN32_WINNT_WIN10
Definition: sdkddkver.h:32
#define _WIN32_WINNT_WIN8
Definition: sdkddkver.h:29
#define STATUS_SUCCESS
Definition: shellext.h:65
DWORD Offset
Definition: minwinbase.h:225
unsigned char UCHAR
Definition: typedefs.h:53
#define FILE_END
Definition: winbase.h:116
DWORD WINAPI GetLastError(void)
Definition: except.c:1042
#define ERROR_HANDLE_EOF
Definition: winerror.h:262
#define ERROR_NOACCESS
Definition: winerror.h:902