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>
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(NtReadFile
)
54 UNICODE_STRING FileName
= RTL_CONSTANT_STRING(L
"\\SystemRoot\\ntdll-apitest-NtReadFile-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_READ_DATA
| 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 ByteOffset
.QuadPart
= 0x10000;
103 Status
= NtWriteFile(FileHandle
,
109 BufferSize
- 0x10000,
112 ok_hex(Status
, STATUS_SUCCESS
);
113 ByteOffset
.QuadPart
= 0;
115 /* non-cached, max size -- succeeds */
116 Status
= NtReadFile(FileHandle
,
122 LargeMdlMaxDataSize
- PAGE_SIZE
,
125 ok_hex(Status
, STATUS_SUCCESS
);
127 /* non-cached, max size -- succeeds */
128 Status
= NtReadFile(FileHandle
,
137 ok_hex(Status
, STATUS_SUCCESS
);
139 /* non-cached, too large -- fails to allocate MDL
140 * Note: this returns STATUS_SUCCESS on Win7 -- higher MDL size limit */
141 Status
= NtReadFile(FileHandle
,
147 LargeMdlMaxDataSize
+ PAGE_SIZE
,
150 ok_hex(Status
, STATUS_INSUFFICIENT_RESOURCES
);
152 /* non-cached, unaligned -- fails with invalid parameter */
153 Status
= NtReadFile(FileHandle
,
159 LargeMdlMaxDataSize
+ 1,
162 ok_hex(Status
, STATUS_INVALID_PARAMETER
);
164 DispositionInfo
.DeleteFile
= TRUE
;
165 Status
= NtSetInformationFile(FileHandle
,
168 sizeof(DispositionInfo
),
169 FileDispositionInformation
);
170 ok_hex(Status
, STATUS_SUCCESS
);
171 Status
= NtClose(FileHandle
);
172 ok_hex(Status
, STATUS_SUCCESS
);
174 Status
= NtCreateFile(&FileHandle
,
175 FILE_READ_DATA
| FILE_WRITE_DATA
| DELETE
| SYNCHRONIZE
,
182 FILE_NON_DIRECTORY_FILE
| FILE_SYNCHRONOUS_IO_NONALERT
,
185 ok_hex(Status
, STATUS_SUCCESS
);
187 ByteOffset
.QuadPart
= 0x10000;
188 Status
= NtWriteFile(FileHandle
,
194 BufferSize
- 0x10000,
197 ok_hex(Status
, STATUS_SUCCESS
);
198 ByteOffset
.QuadPart
= 0;
200 /* cached: succeeds with arbitrary length */
201 Status
= NtReadFile(FileHandle
,
210 ok_hex(Status
, STATUS_SUCCESS
);
212 Status
= NtReadFile(FileHandle
,
218 LargeMdlMaxDataSize
+ 1,
221 ok_hex(Status
, STATUS_SUCCESS
);
223 Status
= NtReadFile(FileHandle
,
232 ok_hex(Status
, STATUS_SUCCESS
);
234 DispositionInfo
.DeleteFile
= TRUE
;
235 Status
= NtSetInformationFile(FileHandle
,
238 sizeof(DispositionInfo
),
239 FileDispositionInformation
);
240 ok_hex(Status
, STATUS_SUCCESS
);
241 Status
= NtClose(FileHandle
);
242 ok_hex(Status
, STATUS_SUCCESS
);
244 Status
= NtFreeVirtualMemory(NtCurrentProcess(),
248 ok_hex(Status
, STATUS_SUCCESS
);