Author: tfaber Date: Sat Oct 29 11:39:07 2016 New Revision: 73059
URL: http://svn.reactos.org/svn/reactos?rev=73059&view=rev Log: [NTDLL_APITEST] - Add tests for NtWriteFile with buffer sizes larger than an MDL can describe. CORE-12132
Added: trunk/rostests/apitests/ntdll/NtWriteFile.c (with props) Modified: trunk/rostests/apitests/ntdll/CMakeLists.txt trunk/rostests/apitests/ntdll/testlist.c
Modified: trunk/rostests/apitests/ntdll/CMakeLists.txt URL: http://svn.reactos.org/svn/reactos/trunk/rostests/apitests/ntdll/CMakeLists.... ============================================================================== --- trunk/rostests/apitests/ntdll/CMakeLists.txt [iso-8859-1] (original) +++ trunk/rostests/apitests/ntdll/CMakeLists.txt [iso-8859-1] Sat Oct 29 11:39:07 2016 @@ -20,6 +20,7 @@ NtQueryVolumeInformationFile.c NtSaveKey.c NtSetValueKey.c + NtWriteFile.c RtlAllocateHeap.c RtlBitmap.c RtlCopyMappedMemory.c
Added: trunk/rostests/apitests/ntdll/NtWriteFile.c URL: http://svn.reactos.org/svn/reactos/trunk/rostests/apitests/ntdll/NtWriteFile... ============================================================================== --- trunk/rostests/apitests/ntdll/NtWriteFile.c (added) +++ trunk/rostests/apitests/ntdll/NtWriteFile.c [iso-8859-1] Sat Oct 29 11:39:07 2016 @@ -0,0 +1,223 @@ +/* + * PROJECT: ReactOS API tests + * LICENSE: LGPLv2.1+ - See COPYING.LIB in the top level directory + * PURPOSE: Test for NtWriteFile + * PROGRAMMER: Thomas Faber thomas.faber@reactos.org + */ + +#include <apitest.h> + +#define WIN32_NO_STATUS +#include <winreg.h> +#include <ndk/cmfuncs.h> +#include <ndk/iofuncs.h> +#include <ndk/mmfuncs.h> +#include <ndk/obfuncs.h> +#include <ndk/psfuncs.h> +#include <ndk/rtlfuncs.h> + +static +BOOL +Is64BitSystem(VOID) +{ +#ifdef _WIN64 + return TRUE; +#else + NTSTATUS Status; + ULONG_PTR IsWow64; + + Status = NtQueryInformationProcess(NtCurrentProcess(), + ProcessWow64Information, + &IsWow64, + sizeof(IsWow64), + NULL); + if (NT_SUCCESS(Status)) + { + return IsWow64 != 0; + } + + return FALSE; +#endif +} + +static +ULONG +SizeOfMdl(VOID) +{ + return Is64BitSystem() ? 48 : 28; +} + +START_TEST(NtWriteFile) +{ + NTSTATUS Status; + HANDLE FileHandle; + UNICODE_STRING FileName = RTL_CONSTANT_STRING(L"\SystemRoot\ntdll-apitest-NtWriteFile-test.bin"); + PVOID Buffer; + SIZE_T BufferSize; + LARGE_INTEGER ByteOffset; + OBJECT_ATTRIBUTES ObjectAttributes; + IO_STATUS_BLOCK IoStatus; + FILE_DISPOSITION_INFORMATION DispositionInfo; + ULONG TooLargeDataSize = (MAXUSHORT + 1 - SizeOfMdl()) / sizeof(ULONG_PTR) * PAGE_SIZE; // 0x3FF9000 on x86 + ULONG LargeMdlMaxDataSize = TooLargeDataSize - PAGE_SIZE; + + trace("System is %d bits, Size of MDL: %lu\n", Is64BitSystem() ? 64 : 32, SizeOfMdl()); + trace("Max MDL data size: 0x%lx bytes\n", LargeMdlMaxDataSize); + + ByteOffset.QuadPart = 0; + + Buffer = NULL; + BufferSize = TooLargeDataSize; + Status = NtAllocateVirtualMemory(NtCurrentProcess(), + &Buffer, + 0, + &BufferSize, + MEM_RESERVE | MEM_COMMIT, + PAGE_READONLY); + if (!NT_SUCCESS(Status)) + { + skip("Failed to allocate memory, status %lx\n", Status); + return; + } + + InitializeObjectAttributes(&ObjectAttributes, + &FileName, + OBJ_CASE_INSENSITIVE, + NULL, + NULL); + Status = NtCreateFile(&FileHandle, + FILE_WRITE_DATA | DELETE | SYNCHRONIZE, + &ObjectAttributes, + &IoStatus, + NULL, + 0, + 0, + FILE_SUPERSEDE, + FILE_NON_DIRECTORY_FILE | FILE_SYNCHRONOUS_IO_NONALERT | + FILE_NO_INTERMEDIATE_BUFFERING, + NULL, + 0); + ok_hex(Status, STATUS_SUCCESS); + + /* non-cached, max size -- succeeds */ + Status = NtWriteFile(FileHandle, + NULL, + NULL, + NULL, + &IoStatus, + Buffer, + LargeMdlMaxDataSize - PAGE_SIZE, + &ByteOffset, + NULL); + ok_hex(Status, STATUS_SUCCESS); + + /* non-cached, max size -- succeeds */ + Status = NtWriteFile(FileHandle, + NULL, + NULL, + NULL, + &IoStatus, + Buffer, + LargeMdlMaxDataSize, + &ByteOffset, + NULL); + ok_hex(Status, STATUS_SUCCESS); + + /* non-cached, too large -- fails to allocate MDL + * Note: this returns STATUS_SUCCESS on Win7 -- higher MDL size limit */ + Status = NtWriteFile(FileHandle, + NULL, + NULL, + NULL, + &IoStatus, + Buffer, + LargeMdlMaxDataSize + PAGE_SIZE, + &ByteOffset, + NULL); + ok_hex(Status, STATUS_INSUFFICIENT_RESOURCES); + + /* non-cached, unaligned -- fails with invalid parameter */ + Status = NtWriteFile(FileHandle, + NULL, + NULL, + NULL, + &IoStatus, + Buffer, + LargeMdlMaxDataSize + 1, + &ByteOffset, + NULL); + ok_hex(Status, STATUS_INVALID_PARAMETER); + + DispositionInfo.DeleteFile = TRUE; + Status = NtSetInformationFile(FileHandle, + &IoStatus, + &DispositionInfo, + sizeof(DispositionInfo), + FileDispositionInformation); + ok_hex(Status, STATUS_SUCCESS); + Status = NtClose(FileHandle); + ok_hex(Status, STATUS_SUCCESS); + + Status = NtCreateFile(&FileHandle, + FILE_WRITE_DATA | DELETE | SYNCHRONIZE, + &ObjectAttributes, + &IoStatus, + NULL, + 0, + 0, + FILE_SUPERSEDE, + FILE_NON_DIRECTORY_FILE | FILE_SYNCHRONOUS_IO_NONALERT, + NULL, + 0); + ok_hex(Status, STATUS_SUCCESS); + + /* cached: succeeds with arbitrary length */ + Status = NtWriteFile(FileHandle, + NULL, + NULL, + NULL, + &IoStatus, + Buffer, + LargeMdlMaxDataSize, + &ByteOffset, + NULL); + ok_hex(Status, STATUS_SUCCESS); + + Status = NtWriteFile(FileHandle, + NULL, + NULL, + NULL, + &IoStatus, + Buffer, + LargeMdlMaxDataSize + 1, + &ByteOffset, + NULL); + ok_hex(Status, STATUS_SUCCESS); + + Status = NtWriteFile(FileHandle, + NULL, + NULL, + NULL, + &IoStatus, + Buffer, + TooLargeDataSize, + &ByteOffset, + NULL); + ok_hex(Status, STATUS_SUCCESS); + + DispositionInfo.DeleteFile = TRUE; + Status = NtSetInformationFile(FileHandle, + &IoStatus, + &DispositionInfo, + sizeof(DispositionInfo), + FileDispositionInformation); + ok_hex(Status, STATUS_SUCCESS); + Status = NtClose(FileHandle); + ok_hex(Status, STATUS_SUCCESS); + + Status = NtFreeVirtualMemory(NtCurrentProcess(), + &Buffer, + &BufferSize, + MEM_RELEASE); + ok_hex(Status, STATUS_SUCCESS); +}
Propchange: trunk/rostests/apitests/ntdll/NtWriteFile.c ------------------------------------------------------------------------------ svn:eol-style = native
Modified: trunk/rostests/apitests/ntdll/testlist.c URL: http://svn.reactos.org/svn/reactos/trunk/rostests/apitests/ntdll/testlist.c?... ============================================================================== --- trunk/rostests/apitests/ntdll/testlist.c [iso-8859-1] (original) +++ trunk/rostests/apitests/ntdll/testlist.c [iso-8859-1] Sat Oct 29 11:39:07 2016 @@ -24,6 +24,7 @@ extern void func_NtSaveKey(void); extern void func_NtSetValueKey(void); extern void func_NtSystemInformation(void); +extern void func_NtWriteFile(void); extern void func_RtlAllocateHeap(void); extern void func_RtlBitmap(void); extern void func_RtlCopyMappedMemory(void); @@ -70,6 +71,7 @@ { "NtSaveKey", func_NtSaveKey}, { "NtSetValueKey", func_NtSetValueKey}, { "NtSystemInformation", func_NtSystemInformation }, + { "NtWriteFile", func_NtWriteFile }, { "RtlAllocateHeap", func_RtlAllocateHeap }, { "RtlBitmapApi", func_RtlBitmap }, { "RtlCopyMappedMemory", func_RtlCopyMappedMemory },