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;
41 START_TEST(NtWriteFile
)
45 UNICODE_STRING FileName
= RTL_CONSTANT_STRING(L
"\\SystemRoot\\ntdll-apitest-NtWriteFile-test.bin");
48 LARGE_INTEGER ByteOffset
;
49 OBJECT_ATTRIBUTES ObjectAttributes
;
50 IO_STATUS_BLOCK IoStatus
;
51 FILE_DISPOSITION_INFORMATION DispositionInfo
;
52 ULONG TooLargeDataSize
= (MAXUSHORT
+ 1 - SizeOfMdl()) / sizeof(ULONG_PTR
) * PAGE_SIZE
; // 0x3FF9000 on x86
53 ULONG LargeMdlMaxDataSize
= TooLargeDataSize
- PAGE_SIZE
;
55 trace("System is %d bits, Size of MDL: %lu\n", Is64BitSystem() ? 64 : 32, SizeOfMdl());
56 trace("Max MDL data size: 0x%lx bytes\n", LargeMdlMaxDataSize
);
58 ByteOffset
.QuadPart
= 0;
61 BufferSize
= TooLargeDataSize
;
62 Status
= NtAllocateVirtualMemory(NtCurrentProcess(),
66 MEM_RESERVE
| MEM_COMMIT
,
68 if (!NT_SUCCESS(Status
))
70 skip("Failed to allocate memory, status %lx\n", Status
);
74 InitializeObjectAttributes(&ObjectAttributes
,
79 Status
= NtCreateFile(&FileHandle
,
80 FILE_WRITE_DATA
| DELETE
| SYNCHRONIZE
,
87 FILE_NON_DIRECTORY_FILE
| FILE_SYNCHRONOUS_IO_NONALERT
|
88 FILE_NO_INTERMEDIATE_BUFFERING
,
91 ok_hex(Status
, STATUS_SUCCESS
);
93 /* non-cached, max size -- succeeds */
94 Status
= NtWriteFile(FileHandle
,
100 LargeMdlMaxDataSize
- PAGE_SIZE
,
103 ok_hex(Status
, STATUS_SUCCESS
);
105 /* non-cached, max size -- succeeds */
106 Status
= NtWriteFile(FileHandle
,
115 ok_hex(Status
, STATUS_SUCCESS
);
117 /* non-cached, too large -- fails to allocate MDL
118 * Note: this returns STATUS_SUCCESS on Win7 -- higher MDL size limit */
119 Status
= NtWriteFile(FileHandle
,
125 LargeMdlMaxDataSize
+ PAGE_SIZE
,
128 ok_hex(Status
, STATUS_INSUFFICIENT_RESOURCES
);
130 /* non-cached, unaligned -- fails with invalid parameter */
131 Status
= NtWriteFile(FileHandle
,
137 LargeMdlMaxDataSize
+ 1,
140 ok_hex(Status
, STATUS_INVALID_PARAMETER
);
142 DispositionInfo
.DeleteFile
= TRUE
;
143 Status
= NtSetInformationFile(FileHandle
,
146 sizeof(DispositionInfo
),
147 FileDispositionInformation
);
148 ok_hex(Status
, STATUS_SUCCESS
);
149 Status
= NtClose(FileHandle
);
150 ok_hex(Status
, STATUS_SUCCESS
);
152 Status
= NtCreateFile(&FileHandle
,
153 FILE_WRITE_DATA
| DELETE
| SYNCHRONIZE
,
160 FILE_NON_DIRECTORY_FILE
| FILE_SYNCHRONOUS_IO_NONALERT
,
163 ok_hex(Status
, STATUS_SUCCESS
);
165 /* cached: succeeds with arbitrary length */
166 Status
= NtWriteFile(FileHandle
,
175 ok_hex(Status
, STATUS_SUCCESS
);
177 Status
= NtWriteFile(FileHandle
,
183 LargeMdlMaxDataSize
+ 1,
186 ok_hex(Status
, STATUS_SUCCESS
);
188 Status
= NtWriteFile(FileHandle
,
197 ok_hex(Status
, STATUS_SUCCESS
);
199 DispositionInfo
.DeleteFile
= TRUE
;
200 Status
= NtSetInformationFile(FileHandle
,
203 sizeof(DispositionInfo
),
204 FileDispositionInformation
);
205 ok_hex(Status
, STATUS_SUCCESS
);
206 Status
= NtClose(FileHandle
);
207 ok_hex(Status
, STATUS_SUCCESS
);
209 Status
= NtFreeVirtualMemory(NtCurrentProcess(),
213 ok_hex(Status
, STATUS_SUCCESS
);