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>
20 Status
= NtQueryInformationProcess(NtCurrentProcess(),
21 ProcessWow64Information
,
25 if (NT_SUCCESS(Status
))
38 return Is64BitSystem() ? 48 : 28;
41 START_TEST(NtReadFile
)
45 UNICODE_STRING FileName
= RTL_CONSTANT_STRING(L
"\\SystemRoot\\ntdll-apitest-NtReadFile-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_READ_DATA
| 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 ByteOffset
.QuadPart
= 0x10000;
94 Status
= NtWriteFile(FileHandle
,
100 BufferSize
- 0x10000,
103 ok_hex(Status
, STATUS_SUCCESS
);
104 ByteOffset
.QuadPart
= 0;
106 /* non-cached, max size -- succeeds */
107 Status
= NtReadFile(FileHandle
,
113 LargeMdlMaxDataSize
- PAGE_SIZE
,
116 ok_hex(Status
, STATUS_SUCCESS
);
118 /* non-cached, max size -- succeeds */
119 Status
= NtReadFile(FileHandle
,
128 ok_hex(Status
, STATUS_SUCCESS
);
130 /* non-cached, too large -- fails to allocate MDL
131 * Note: this returns STATUS_SUCCESS on Win7 -- higher MDL size limit */
132 Status
= NtReadFile(FileHandle
,
138 LargeMdlMaxDataSize
+ PAGE_SIZE
,
141 ok_hex(Status
, STATUS_INSUFFICIENT_RESOURCES
);
143 /* non-cached, unaligned -- fails with invalid parameter */
144 Status
= NtReadFile(FileHandle
,
150 LargeMdlMaxDataSize
+ 1,
153 ok_hex(Status
, STATUS_INVALID_PARAMETER
);
155 DispositionInfo
.DeleteFile
= TRUE
;
156 Status
= NtSetInformationFile(FileHandle
,
159 sizeof(DispositionInfo
),
160 FileDispositionInformation
);
161 ok_hex(Status
, STATUS_SUCCESS
);
162 Status
= NtClose(FileHandle
);
163 ok_hex(Status
, STATUS_SUCCESS
);
165 Status
= NtCreateFile(&FileHandle
,
166 FILE_READ_DATA
| FILE_WRITE_DATA
| DELETE
| SYNCHRONIZE
,
173 FILE_NON_DIRECTORY_FILE
| FILE_SYNCHRONOUS_IO_NONALERT
,
176 ok_hex(Status
, STATUS_SUCCESS
);
178 ByteOffset
.QuadPart
= 0x10000;
179 Status
= NtWriteFile(FileHandle
,
185 BufferSize
- 0x10000,
188 ok_hex(Status
, STATUS_SUCCESS
);
189 ByteOffset
.QuadPart
= 0;
191 /* cached: succeeds with arbitrary length */
192 Status
= NtReadFile(FileHandle
,
201 ok_hex(Status
, STATUS_SUCCESS
);
203 Status
= NtReadFile(FileHandle
,
209 LargeMdlMaxDataSize
+ 1,
212 ok_hex(Status
, STATUS_SUCCESS
);
214 Status
= NtReadFile(FileHandle
,
223 ok_hex(Status
, STATUS_SUCCESS
);
225 DispositionInfo
.DeleteFile
= TRUE
;
226 Status
= NtSetInformationFile(FileHandle
,
229 sizeof(DispositionInfo
),
230 FileDispositionInformation
);
231 ok_hex(Status
, STATUS_SUCCESS
);
232 Status
= NtClose(FileHandle
);
233 ok_hex(Status
, STATUS_SUCCESS
);
235 Status
= NtFreeVirtualMemory(NtCurrentProcess(),
239 ok_hex(Status
, STATUS_SUCCESS
);