ReactOS 0.4.16-dev-2224-g3637fd8
NtWriteFile.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 NtWriteFile
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
47static
50{
51 BOOL Ret;
53
54 /* FIXME: Would be better to actually open systemroot */
56 ok(Ret != FALSE, "GetDiskFreeSpaceW failed: %lx\n", GetLastError());
57 if (!Ret)
58 {
59 SectorSize = 4096; /* On failure, assume max size */
60 }
61
62 return SectorSize;
63}
64
66{
69 UNICODE_STRING FileName = RTL_CONSTANT_STRING(L"\\SystemRoot\\ntdll-apitest-NtWriteFile-test.bin");
75 FILE_DISPOSITION_INFORMATION DispositionInfo;
76 ULONG TooLargeDataSize = (MAXUSHORT + 1 - SizeOfMdl()) / sizeof(ULONG_PTR) * PAGE_SIZE; // 0x3FF9000 on x86
77 ULONG LargeMdlMaxDataSize = TooLargeDataSize - PAGE_SIZE;
78
79 trace("System is %d bits, Size of MDL: %lu\n", Is64BitSystem() ? 64 : 32, SizeOfMdl());
80 trace("Max MDL data size: 0x%lx bytes\n", LargeMdlMaxDataSize);
81
82 ByteOffset.QuadPart = 0;
83
84 Buffer = NULL;
85 BufferSize = TooLargeDataSize;
87 &Buffer,
88 0,
92 if (!NT_SUCCESS(Status))
93 {
94 skip("Failed to allocate memory, status %lx\n", Status);
95 return;
96 }
97
99 &FileName,
101 NULL,
102 NULL);
106 &IoStatus,
107 NULL,
108 0,
109 0,
113 NULL,
114 0);
116
117 /* non-cached, max size -- succeeds */
119 NULL,
120 NULL,
121 NULL,
122 &IoStatus,
123 Buffer,
124 LargeMdlMaxDataSize - PAGE_SIZE,
125 &ByteOffset,
126 NULL);
128
129 /* non-cached, max size -- succeeds */
131 NULL,
132 NULL,
133 NULL,
134 &IoStatus,
135 Buffer,
136 LargeMdlMaxDataSize,
137 &ByteOffset,
138 NULL);
140
141 /* non-cached, too large -- fails to allocate MDL
142 * Note: this returns STATUS_SUCCESS on Vista+ -- higher MDL size limit */
144 NULL,
145 NULL,
146 NULL,
147 &IoStatus,
148 Buffer,
149 LargeMdlMaxDataSize + PAGE_SIZE,
150 &ByteOffset,
151 NULL);
154 else
156
157 /* Invalid buffer address */
159 NULL,
160 NULL,
161 NULL,
162 &IoStatus,
163 LongToPtr(-1),
164 PAGE_SIZE,
165 &ByteOffset,
166 NULL);
167 ok_hex(Status, IsWow64() ? STATUS_INVALID_PARAMETER : STATUS_ACCESS_VIOLATION); // Different to NtReadFile
168
169 /* Buffer probing fails */
171 NULL,
172 NULL,
173 NULL,
174 &IoStatus,
175 Buffer,
176 2 * LargeMdlMaxDataSize,
177 &ByteOffset,
178 NULL);
180
181 /* non-cached, unaligned -- fails with invalid parameter */
183 NULL,
184 NULL,
185 NULL,
186 &IoStatus,
187 Buffer,
188 LargeMdlMaxDataSize + 1,
189 &ByteOffset,
190 NULL);
192
193 DispositionInfo.DeleteFile = TRUE;
195 &IoStatus,
196 &DispositionInfo,
197 sizeof(DispositionInfo),
202
206 &IoStatus,
207 NULL,
208 0,
209 0,
212 NULL,
213 0);
215
216 /* cached: succeeds with arbitrary length */
218 NULL,
219 NULL,
220 NULL,
221 &IoStatus,
222 Buffer,
223 LargeMdlMaxDataSize,
224 &ByteOffset,
225 NULL);
227
229 NULL,
230 NULL,
231 NULL,
232 &IoStatus,
233 Buffer,
234 LargeMdlMaxDataSize + 1,
235 &ByteOffset,
236 NULL);
238
240 NULL,
241 NULL,
242 NULL,
243 &IoStatus,
244 Buffer,
245 TooLargeDataSize,
246 &ByteOffset,
247 NULL);
249
250 DispositionInfo.DeleteFile = TRUE;
252 &IoStatus,
253 &DispositionInfo,
254 sizeof(DispositionInfo),
259
261 &Buffer,
262 &BufferSize,
265
266 /* Now, testing aligned/non aligned writes */
267
269 trace("Sector is %ld bytes\n", BufferSize);
270
272 &Buffer,
273 0,
274 &BufferSize,
277 if (!NT_SUCCESS(Status))
278 {
279 skip("Failed to allocate memory, status %lx\n", Status);
280 return;
281 }
282
286 &IoStatus,
287 NULL,
288 0,
289 0,
294 NULL,
295 0);
297
298 /* non-cached, broken length -- fails with invalid parameter */
299 ByteOffset.QuadPart = 0;
301 NULL,
302 NULL,
303 NULL,
304 &IoStatus,
305 Buffer,
306 4,
307 &ByteOffset,
308 NULL);
310
311 /* non-cached, broken offset -- fails with invalid parameter */
312 ByteOffset.QuadPart = 4;
314 NULL,
315 NULL,
316 NULL,
317 &IoStatus,
318 Buffer,
320 &ByteOffset,
321 NULL);
323
324 /* non-cached, good length and offset -- succeeds */
325 ByteOffset.QuadPart = 0;
327 NULL,
328 NULL,
329 NULL,
330 &IoStatus,
331 Buffer,
333 &ByteOffset,
334 NULL);
336
337 DispositionInfo.DeleteFile = TRUE;
339 &IoStatus,
340 &DispositionInfo,
341 sizeof(DispositionInfo),
346
348 &Buffer,
349 &BufferSize,
352}
static ULONG SizeOfSector(VOID)
Definition: NtWriteFile.c:49
static BOOL Is64BitSystem(VOID)
Definition: NtWriteFile.c:12
static ULONG SizeOfMdl(VOID)
Definition: NtWriteFile.c:42
#define IsWow64()
Definition: NtWriteFile.c:37
#define GetNTVersion()
Definition: apitest.h:17
#define ok_hex(expression, result)
Definition: atltest.h:94
#define trace
Definition: atltest.h:70
#define ok(value,...)
Definition: atltest.h:57
#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 PAGE_READONLY
Definition: compat.h:138
BOOL WINAPI GetDiskFreeSpaceW(IN LPCWSTR lpRootPathName, OUT LPDWORD lpSectorsPerCluster, OUT LPDWORD lpBytesPerSector, OUT LPDWORD lpNumberOfFreeClusters, OUT LPDWORD lpTotalNumberOfClusters)
Definition: disk.c:173
#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_WRITE_THROUGH
Definition: from_kernel.h:26
#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
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
#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_INVALID_USER_BUFFER
Definition: udferr_usr.h:166
#define STATUS_INSUFFICIENT_RESOURCES
Definition: udferr_usr.h:158
_In_ WDFMEMORY _Out_opt_ size_t * BufferSize
Definition: wdfmemory.h:254
DWORD WINAPI GetLastError(void)
Definition: except.c:1042
_In_ ULONG SectorSize
Definition: halfuncs.h:291