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>
10 #define WIN32_NO_STATUS
12 #include <ndk/cmfuncs.h>
13 #include <ndk/iofuncs.h>
14 #include <ndk/mmfuncs.h>
15 #include <ndk/obfuncs.h>
16 #include <ndk/psfuncs.h>
17 #include <ndk/rtlfuncs.h>
29 Status
= NtQueryInformationProcess(NtCurrentProcess(),
30 ProcessWow64Information
,
34 if (NT_SUCCESS(Status
))
47 return Is64BitSystem() ? 48 : 28;
50 START_TEST(NtWriteFile
)
54 UNICODE_STRING FileName
= RTL_CONSTANT_STRING(L
"\\SystemRoot\\ntdll-apitest-NtWriteFile-test.bin");
57 LARGE_INTEGER ByteOffset
;
58 OBJECT_ATTRIBUTES ObjectAttributes
;
59 IO_STATUS_BLOCK IoStatus
;
60 FILE_DISPOSITION_INFORMATION DispositionInfo
;
61 ULONG TooLargeDataSize
= (MAXUSHORT
+ 1 - SizeOfMdl()) / sizeof(ULONG_PTR
) * PAGE_SIZE
; // 0x3FF9000 on x86
62 ULONG LargeMdlMaxDataSize
= TooLargeDataSize
- PAGE_SIZE
;
64 trace("System is %d bits, Size of MDL: %lu\n", Is64BitSystem() ? 64 : 32, SizeOfMdl());
65 trace("Max MDL data size: 0x%lx bytes\n", LargeMdlMaxDataSize
);
67 ByteOffset
.QuadPart
= 0;
70 BufferSize
= TooLargeDataSize
;
71 Status
= NtAllocateVirtualMemory(NtCurrentProcess(),
75 MEM_RESERVE
| MEM_COMMIT
,
77 if (!NT_SUCCESS(Status
))
79 skip("Failed to allocate memory, status %lx\n", Status
);
83 InitializeObjectAttributes(&ObjectAttributes
,
88 Status
= NtCreateFile(&FileHandle
,
89 FILE_WRITE_DATA
| DELETE
| SYNCHRONIZE
,
96 FILE_NON_DIRECTORY_FILE
| FILE_SYNCHRONOUS_IO_NONALERT
|
97 FILE_NO_INTERMEDIATE_BUFFERING
,
100 ok_hex(Status
, STATUS_SUCCESS
);
102 /* non-cached, max size -- succeeds */
103 Status
= NtWriteFile(FileHandle
,
109 LargeMdlMaxDataSize
- PAGE_SIZE
,
112 ok_hex(Status
, STATUS_SUCCESS
);
114 /* non-cached, max size -- succeeds */
115 Status
= NtWriteFile(FileHandle
,
124 ok_hex(Status
, STATUS_SUCCESS
);
126 /* non-cached, too large -- fails to allocate MDL
127 * Note: this returns STATUS_SUCCESS on Win7 -- higher MDL size limit */
128 Status
= NtWriteFile(FileHandle
,
134 LargeMdlMaxDataSize
+ PAGE_SIZE
,
137 ok_hex(Status
, STATUS_INSUFFICIENT_RESOURCES
);
139 /* non-cached, unaligned -- fails with invalid parameter */
140 Status
= NtWriteFile(FileHandle
,
146 LargeMdlMaxDataSize
+ 1,
149 ok_hex(Status
, STATUS_INVALID_PARAMETER
);
151 DispositionInfo
.DeleteFile
= TRUE
;
152 Status
= NtSetInformationFile(FileHandle
,
155 sizeof(DispositionInfo
),
156 FileDispositionInformation
);
157 ok_hex(Status
, STATUS_SUCCESS
);
158 Status
= NtClose(FileHandle
);
159 ok_hex(Status
, STATUS_SUCCESS
);
161 Status
= NtCreateFile(&FileHandle
,
162 FILE_WRITE_DATA
| DELETE
| SYNCHRONIZE
,
169 FILE_NON_DIRECTORY_FILE
| FILE_SYNCHRONOUS_IO_NONALERT
,
172 ok_hex(Status
, STATUS_SUCCESS
);
174 /* cached: succeeds with arbitrary length */
175 Status
= NtWriteFile(FileHandle
,
184 ok_hex(Status
, STATUS_SUCCESS
);
186 Status
= NtWriteFile(FileHandle
,
192 LargeMdlMaxDataSize
+ 1,
195 ok_hex(Status
, STATUS_SUCCESS
);
197 Status
= NtWriteFile(FileHandle
,
206 ok_hex(Status
, STATUS_SUCCESS
);
208 DispositionInfo
.DeleteFile
= TRUE
;
209 Status
= NtSetInformationFile(FileHandle
,
212 sizeof(DispositionInfo
),
213 FileDispositionInformation
);
214 ok_hex(Status
, STATUS_SUCCESS
);
215 Status
= NtClose(FileHandle
);
216 ok_hex(Status
, STATUS_SUCCESS
);
218 Status
= NtFreeVirtualMemory(NtCurrentProcess(),
222 ok_hex(Status
, STATUS_SUCCESS
);