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>
20 Status
= NtQueryInformationProcess(NtCurrentProcess(),
21 ProcessWow64Information
,
25 if (NT_SUCCESS(Status
))
38 return Is64BitSystem() ? 48 : 28;
48 /* FIXME: Would be better to actually open systemroot */
49 Ret
= GetDiskFreeSpaceW(NULL
, NULL
, &SectorSize
, NULL
, NULL
);
50 ok(Ret
!= FALSE
, "GetDiskFreeSpaceW failed: %lx\n", GetLastError());
53 SectorSize
= 4096; /* On failure, assume max size */
59 START_TEST(NtWriteFile
)
63 UNICODE_STRING FileName
= RTL_CONSTANT_STRING(L
"\\SystemRoot\\ntdll-apitest-NtWriteFile-test.bin");
66 LARGE_INTEGER ByteOffset
;
67 OBJECT_ATTRIBUTES ObjectAttributes
;
68 IO_STATUS_BLOCK IoStatus
;
69 FILE_DISPOSITION_INFORMATION DispositionInfo
;
70 ULONG TooLargeDataSize
= (MAXUSHORT
+ 1 - SizeOfMdl()) / sizeof(ULONG_PTR
) * PAGE_SIZE
; // 0x3FF9000 on x86
71 ULONG LargeMdlMaxDataSize
= TooLargeDataSize
- PAGE_SIZE
;
73 trace("System is %d bits, Size of MDL: %lu\n", Is64BitSystem() ? 64 : 32, SizeOfMdl());
74 trace("Max MDL data size: 0x%lx bytes\n", LargeMdlMaxDataSize
);
76 ByteOffset
.QuadPart
= 0;
79 BufferSize
= TooLargeDataSize
;
80 Status
= NtAllocateVirtualMemory(NtCurrentProcess(),
84 MEM_RESERVE
| MEM_COMMIT
,
86 if (!NT_SUCCESS(Status
))
88 skip("Failed to allocate memory, status %lx\n", Status
);
92 InitializeObjectAttributes(&ObjectAttributes
,
97 Status
= NtCreateFile(&FileHandle
,
98 FILE_WRITE_DATA
| DELETE
| SYNCHRONIZE
,
105 FILE_NON_DIRECTORY_FILE
| FILE_SYNCHRONOUS_IO_NONALERT
|
106 FILE_NO_INTERMEDIATE_BUFFERING
,
109 ok_hex(Status
, STATUS_SUCCESS
);
111 /* non-cached, max size -- succeeds */
112 Status
= NtWriteFile(FileHandle
,
118 LargeMdlMaxDataSize
- PAGE_SIZE
,
121 ok_hex(Status
, STATUS_SUCCESS
);
123 /* non-cached, max size -- succeeds */
124 Status
= NtWriteFile(FileHandle
,
133 ok_hex(Status
, STATUS_SUCCESS
);
135 /* non-cached, too large -- fails to allocate MDL
136 * Note: this returns STATUS_SUCCESS on Win7 -- higher MDL size limit */
137 Status
= NtWriteFile(FileHandle
,
143 LargeMdlMaxDataSize
+ PAGE_SIZE
,
146 ok_hex(Status
, STATUS_INSUFFICIENT_RESOURCES
);
148 /* non-cached, unaligned -- fails with invalid parameter */
149 Status
= NtWriteFile(FileHandle
,
155 LargeMdlMaxDataSize
+ 1,
158 ok_hex(Status
, STATUS_INVALID_PARAMETER
);
160 DispositionInfo
.DeleteFile
= TRUE
;
161 Status
= NtSetInformationFile(FileHandle
,
164 sizeof(DispositionInfo
),
165 FileDispositionInformation
);
166 ok_hex(Status
, STATUS_SUCCESS
);
167 Status
= NtClose(FileHandle
);
168 ok_hex(Status
, STATUS_SUCCESS
);
170 Status
= NtCreateFile(&FileHandle
,
171 FILE_WRITE_DATA
| DELETE
| SYNCHRONIZE
,
178 FILE_NON_DIRECTORY_FILE
| FILE_SYNCHRONOUS_IO_NONALERT
,
181 ok_hex(Status
, STATUS_SUCCESS
);
183 /* cached: succeeds with arbitrary length */
184 Status
= NtWriteFile(FileHandle
,
193 ok_hex(Status
, STATUS_SUCCESS
);
195 Status
= NtWriteFile(FileHandle
,
201 LargeMdlMaxDataSize
+ 1,
204 ok_hex(Status
, STATUS_SUCCESS
);
206 Status
= NtWriteFile(FileHandle
,
215 ok_hex(Status
, STATUS_SUCCESS
);
217 DispositionInfo
.DeleteFile
= TRUE
;
218 Status
= NtSetInformationFile(FileHandle
,
221 sizeof(DispositionInfo
),
222 FileDispositionInformation
);
223 ok_hex(Status
, STATUS_SUCCESS
);
224 Status
= NtClose(FileHandle
);
225 ok_hex(Status
, STATUS_SUCCESS
);
227 Status
= NtFreeVirtualMemory(NtCurrentProcess(),
231 ok_hex(Status
, STATUS_SUCCESS
);
233 /* Now, testing aligned/non aligned writes */
235 BufferSize
= SizeOfSector();
236 trace("Sector is %ld bytes\n", BufferSize
);
238 Status
= NtAllocateVirtualMemory(NtCurrentProcess(),
242 MEM_RESERVE
| MEM_COMMIT
,
244 if (!NT_SUCCESS(Status
))
246 skip("Failed to allocate memory, status %lx\n", Status
);
250 Status
= NtCreateFile(&FileHandle
,
251 FILE_WRITE_DATA
| DELETE
| SYNCHRONIZE
,
258 FILE_NON_DIRECTORY_FILE
| FILE_SYNCHRONOUS_IO_NONALERT
|
259 FILE_NO_INTERMEDIATE_BUFFERING
|
263 ok_hex(Status
, STATUS_SUCCESS
);
265 /* non-cached, broken length -- fails with invalid parameter */
266 ByteOffset
.QuadPart
= 0;
267 Status
= NtWriteFile(FileHandle
,
276 ok_hex(Status
, STATUS_INVALID_PARAMETER
);
278 /* non-cached, broken offset -- fails with invalid parameter */
279 ByteOffset
.QuadPart
= 4;
280 Status
= NtWriteFile(FileHandle
,
289 ok_hex(Status
, STATUS_INVALID_PARAMETER
);
291 /* non-cached, good length and offset -- succeeds */
292 ByteOffset
.QuadPart
= 0;
293 Status
= NtWriteFile(FileHandle
,
302 ok_hex(Status
, STATUS_SUCCESS
);
304 DispositionInfo
.DeleteFile
= TRUE
;
305 Status
= NtSetInformationFile(FileHandle
,
308 sizeof(DispositionInfo
),
309 FileDispositionInformation
);
310 ok_hex(Status
, STATUS_SUCCESS
);
311 Status
= NtClose(FileHandle
);
312 ok_hex(Status
, STATUS_SUCCESS
);
314 Status
= NtFreeVirtualMemory(NtCurrentProcess(),
318 ok_hex(Status
, STATUS_SUCCESS
);