ReactOS 0.4.16-dev-2284-g3529151
NtReadFile.c
Go to the documentation of this file.
1/*
2 * PROJECT: ReactOS API tests
3 * LICENSE: LGPLv2.1+ - See COPYING.LIB in the top level directory
4 * PURPOSE: Test for NtReadFile
5 * PROGRAMMER: Thomas Faber <thomas.faber@reactos.org>
6 */
7
8#include "precomp.h"
9
10static
11BOOL
13{
14#ifdef _WIN64
15 return TRUE;
16#else
19
22 &IsWow64,
23 sizeof(IsWow64),
24 NULL);
25 if (NT_SUCCESS(Status))
26 {
27 return IsWow64 != 0;
28 }
29
30 return FALSE;
31#endif
32}
33
34#ifdef _WIN64
35#define IsWow64() FALSE
36#else
37#define IsWow64() Is64BitSystem()
38#endif
39
40static
43{
44 return Is64BitSystem() ? 48 : 28;
45}
46
48{
51 UNICODE_STRING FileName = RTL_CONSTANT_STRING(L"\\SystemRoot\\ntdll-apitest-NtReadFile-test.bin");
57 FILE_DISPOSITION_INFORMATION DispositionInfo;
58 ULONG TooLargeDataSize = (MAXUSHORT + 1 - SizeOfMdl()) / sizeof(ULONG_PTR) * PAGE_SIZE; // 0x3FF9000 on x86
59 ULONG LargeMdlMaxDataSize = TooLargeDataSize - PAGE_SIZE;
60
61 trace("System is %d bits, Size of MDL: %lu\n", Is64BitSystem() ? 64 : 32, SizeOfMdl());
62 trace("Max MDL data size: 0x%lx bytes\n", LargeMdlMaxDataSize);
63
64 ByteOffset.QuadPart = 0;
65
66 Buffer = NULL;
67 BufferSize = TooLargeDataSize;
69 &Buffer,
70 0,
74 if (!NT_SUCCESS(Status))
75 {
76 skip("Failed to allocate memory, status %lx\n", Status);
77 return;
78 }
79
81 &FileName,
83 NULL,
84 NULL);
88 &IoStatus,
89 NULL,
90 0,
91 0,
95 NULL,
96 0);
98
99 ByteOffset.QuadPart = 0x10000;
101 NULL,
102 NULL,
103 NULL,
104 &IoStatus,
105 Buffer,
106 BufferSize - 0x10000,
107 &ByteOffset,
108 NULL);
110 ByteOffset.QuadPart = 0;
111
112 /* non-cached, max size -- succeeds */
114 NULL,
115 NULL,
116 NULL,
117 &IoStatus,
118 Buffer,
119 LargeMdlMaxDataSize - PAGE_SIZE,
120 &ByteOffset,
121 NULL);
123
124 /* non-cached, max size -- succeeds */
126 NULL,
127 NULL,
128 NULL,
129 &IoStatus,
130 Buffer,
131 LargeMdlMaxDataSize,
132 &ByteOffset,
133 NULL);
135
136 /* non-cached, too large -- fails to allocate MDL
137 * Note: this returns STATUS_SUCCESS on Vista+ -- higher MDL size limit */
139 NULL,
140 NULL,
141 NULL,
142 &IoStatus,
143 Buffer,
144 LargeMdlMaxDataSize + PAGE_SIZE,
145 &ByteOffset,
146 NULL);
149 else
151
152 /* Invalid buffer address */
154 NULL,
155 NULL,
156 NULL,
157 &IoStatus,
158 LongToPtr(-1),
159 PAGE_SIZE,
160 &ByteOffset,
161 NULL);
163
164 /* Buffer probing fails */
166 NULL,
167 NULL,
168 NULL,
169 &IoStatus,
170 Buffer,
171 2 * LargeMdlMaxDataSize,
172 &ByteOffset,
173 NULL);
174 ok_hex(Status, STATUS_ACCESS_VIOLATION); // Different to NtWriteFile
175
176 /* non-cached, unaligned -- fails with invalid parameter */
178 NULL,
179 NULL,
180 NULL,
181 &IoStatus,
182 Buffer,
183 LargeMdlMaxDataSize + 1,
184 &ByteOffset,
185 NULL);
186 ok_hex(Status, STATUS_INVALID_PARAMETER); // Different to NtWriteFile
187
188 DispositionInfo.DeleteFile = TRUE;
190 &IoStatus,
191 &DispositionInfo,
192 sizeof(DispositionInfo),
197
201 &IoStatus,
202 NULL,
203 0,
204 0,
207 NULL,
208 0);
210
211 ByteOffset.QuadPart = 0x10000;
213 NULL,
214 NULL,
215 NULL,
216 &IoStatus,
217 Buffer,
218 BufferSize - 0x10000,
219 &ByteOffset,
220 NULL);
222 ByteOffset.QuadPart = 0;
223
224 /* cached: succeeds with arbitrary length */
226 NULL,
227 NULL,
228 NULL,
229 &IoStatus,
230 Buffer,
231 LargeMdlMaxDataSize,
232 &ByteOffset,
233 NULL);
235
237 NULL,
238 NULL,
239 NULL,
240 &IoStatus,
241 Buffer,
242 LargeMdlMaxDataSize + 1,
243 &ByteOffset,
244 NULL);
246
248 NULL,
249 NULL,
250 NULL,
251 &IoStatus,
252 Buffer,
253 TooLargeDataSize,
254 &ByteOffset,
255 NULL);
257
258 DispositionInfo.DeleteFile = TRUE;
260 &IoStatus,
261 &DispositionInfo,
262 sizeof(DispositionInfo),
267
269 &Buffer,
270 &BufferSize,
273}
static BOOL Is64BitSystem(VOID)
Definition: NtReadFile.c:12
static ULONG SizeOfMdl(VOID)
Definition: NtReadFile.c:42
#define IsWow64()
Definition: NtReadFile.c:37
#define GetNTVersion()
Definition: apitest.h:17
#define ok_hex(expression, result)
Definition: atltest.h:94
#define trace
Definition: atltest.h:70
#define skip(...)
Definition: atltest.h:64
#define START_TEST(x)
Definition: atltest.h:75
LONG NTSTATUS
Definition: precomp.h:26
#define FILE_NON_DIRECTORY_FILE
Definition: constants.h:492
#define LongToPtr(l)
Definition: basetsd.h:85
@ ProcessWow64Information
Definition: cicbase.cpp:65
Definition: bufpool.h:45
IN PUNICODE_STRING IN POBJECT_ATTRIBUTES ObjectAttributes
Definition: conport.c:36
#define BufferSize
Definition: mmc.h:75
#define NULL
Definition: types.h:112
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:33
#define L(x)
Definition: resources.c:13
#define PAGE_SIZE
Definition: env_spec_w32.h:49
IN PDCB IN PCCB IN VBO IN OUT PULONG OUT PDIRENT OUT PBCB OUT PVBO ByteOffset
Definition: fatprocs.h:732
unsigned int BOOL
Definition: ntddk_ex.h:94
_Must_inspect_result_ _In_opt_ PFLT_INSTANCE _Out_ PHANDLE FileHandle
Definition: fltkernel.h:1231
#define STATUS_ACCESS_VIOLATION
@ FileDispositionInformation
Definition: from_kernel.h:74
#define FILE_SYNCHRONOUS_IO_NONALERT
Definition: from_kernel.h:31
#define FILE_NO_INTERMEDIATE_BUFFERING
Definition: from_kernel.h:28
#define FILE_SUPERSEDE
Definition: from_kernel.h:53
Status
Definition: gdiplustypes.h:25
#define OBJ_CASE_INSENSITIVE
Definition: winternl.h:228
#define InitializeObjectAttributes(p, n, a, r, s)
Definition: reg.c:106
__in UCHAR __in POWER_STATE __in_opt PVOID __in PIO_STATUS_BLOCK IoStatus
Definition: mxum.h:159
#define SYNCHRONIZE
Definition: nt_native.h:61
#define FILE_WRITE_DATA
Definition: nt_native.h:631
#define FILE_READ_DATA
Definition: nt_native.h:628
#define PAGE_READWRITE
Definition: nt_native.h:1307
NTSYSAPI NTSTATUS NTAPI NtWriteFile(IN HANDLE hFile, IN HANDLE hEvent OPTIONAL, IN PIO_APC_ROUTINE IoApcRoutine OPTIONAL, IN PVOID IoApcContext OPTIONAL, OUT PIO_STATUS_BLOCK pIoStatusBlock, IN PVOID WriteBuffer, IN ULONG WriteBufferLength, IN PLARGE_INTEGER FileOffset OPTIONAL, IN PULONG LockOperationKey OPTIONAL)
#define NtCurrentProcess()
Definition: nt_native.h:1660
NTSYSAPI NTSTATUS NTAPI NtSetInformationFile(IN HANDLE hFile, OUT PIO_STATUS_BLOCK pIoStatusBlock, IN PVOID FileInformationBuffer, IN ULONG FileInformationBufferLength, IN FILE_INFORMATION_CLASS FileInfoClass)
Definition: iofunc.c:3096
NTSTATUS NTAPI NtClose(IN HANDLE Handle)
Definition: obhandle.c:3402
#define DELETE
Definition: nt_native.h:57
#define MEM_RESERVE
Definition: nt_native.h:1317
#define MEM_RELEASE
Definition: nt_native.h:1319
NTSTATUS NTAPI NtCreateFile(OUT PHANDLE FileHandle, IN ACCESS_MASK DesiredAccess, IN POBJECT_ATTRIBUTES ObjectAttributes, OUT PIO_STATUS_BLOCK IoStatusBlock, IN PLARGE_INTEGER AllocationSize OPTIONAL, IN ULONG FileAttributes, IN ULONG ShareAccess, IN ULONG CreateDisposition, IN ULONG CreateOptions, IN PVOID EaBuffer OPTIONAL, IN ULONG EaLength)
#define MEM_COMMIT
Definition: nt_native.h:1316
NTSTATUS NTAPI NtFreeVirtualMemory(IN HANDLE ProcessHandle, IN PVOID *UBaseAddress, IN PSIZE_T URegionSize, IN ULONG FreeType)
Definition: virtual.c:5192
NTSTATUS NTAPI NtAllocateVirtualMemory(IN HANDLE ProcessHandle, IN OUT PVOID *UBaseAddress, IN ULONG_PTR ZeroBits, IN OUT PSIZE_T URegionSize, IN ULONG AllocationType, IN ULONG Protect)
Definition: virtual.c:4457
NTSTATUS NTAPI NtQueryInformationProcess(_In_ HANDLE ProcessHandle, _In_ PROCESSINFOCLASS ProcessInformationClass, _Out_writes_bytes_to_opt_(ProcessInformationLength, *ReturnLength) PVOID ProcessInformation, _In_ ULONG ProcessInformationLength, _Out_opt_ PULONG ReturnLength)
Definition: query.c:211
#define _WIN32_WINNT_VISTA
Definition: sdkddkver.h:25
#define STATUS_SUCCESS
Definition: shellext.h:65
NTSTATUS NTAPI NtReadFile(HANDLE FileHandle, HANDLE Event, PIO_APC_ROUTINE ApcRoutine, PVOID ApcContext, PIO_STATUS_BLOCK IoStatusBlock, PVOID Buffer, ULONG Length, PLARGE_INTEGER ByteOffset, PULONG Key)
#define RTL_CONSTANT_STRING(s)
Definition: tunneltest.c:14
ULONG_PTR SIZE_T
Definition: typedefs.h:80
#define MAXUSHORT
Definition: typedefs.h:83
uint32_t ULONG_PTR
Definition: typedefs.h:65
uint32_t ULONG
Definition: typedefs.h:59
#define STATUS_INVALID_PARAMETER
Definition: udferr_usr.h:135
#define STATUS_INSUFFICIENT_RESOURCES
Definition: udferr_usr.h:158
_In_ WDFMEMORY _Out_opt_ size_t * BufferSize
Definition: wdfmemory.h:254