PLARGE_INTEGER ValidDataLength;\r
PLARGE_INTEGER FileSize;\r
\r
+ PDEVICE_OBJECT pRelatedDo = NULL;\r
+ \r
/* Allocate a 100KB buffer to do IOs */\r
Buffer = ExAllocatePool(PagedPool,100*_1KB);\r
\r
Fh = NULL;\r
}\r
\r
+ /* ------------------------------------------------------------------------\r
+ TESTING:\r
+ BOOLEAN\r
+ NTAPI\r
+ FsRtlPrepareMdlWriteDev(IN PFILE_OBJECT FileObject,\r
+ IN PLARGE_INTEGER FileOffset,\r
+ IN ULONG Length,\r
+ IN ULONG LockKey,\r
+ OUT PMDL *MdlChain,\r
+ OUT PIO_STATUS_BLOCK IoStatus,\r
+ IN PDEVICE_OBJECT DeviceObject)\r
+\r
+ ------------------------------------------------------------------------ */\r
+\r
+ /* We are going to repeat the same bunch of tests but with Wait = FALSE. So we exercise the second part of the function. */\r
+ FsRtlTest_OpenTestFile(&Fh, &Pfo);\r
+\r
+ /* Extract the test variable from the FCB struct */\r
+ FcbHeader = (PFSRTL_COMMON_FCB_HEADER)Pfo->FsContext;\r
+ AllocationSize = &FcbHeader->AllocationSize;\r
+ ValidDataLength = &FcbHeader->ValidDataLength;\r
+ FileSize = &FcbHeader->FileSize;\r
+ \r
+ /* Try to cache without caching having been initialized. This should fail.*/\r
+ Length = 10*_1KB;\r
+ FSRTL_TEST("FsRtlPrepareMdlWriteDev() - No cache map test. Wait = FALSE",\r
+ !FsRtlPrepareMdlWriteDev(Pfo,AllocationSize,Length,0,MdlChain,&IoStatus,NULL));\r
+ \r
+ /* We are going to build a 100k file */\r
+ /* This will inititate caching and build some size */\r
+ Offset.QuadPart = 0;\r
+ Length = 100*_1KB;\r
+ Return = FsRltTest_WritefileZw(Fh,&Offset,Length, Buffer, &IoStatus);\r
+ FSRTL_TEST("FsRtlPrepareMdlWriteDev() - Building 100k filesize. Wait = FALSE",(NT_SUCCESS(Return) && NT_SUCCESS(IoStatus.Status ) && IoStatus.Information == Length));\r
+ Return = TRUE;\r
+\r
+ /* Extending the file by 1/2 sector, 256 bytes. */\r
+ Offset.QuadPart = 0x7fffffffffff;\r
+ Length = 0x100;\r
+ Return = FsRltTest_WritefileZw(Fh,NULL,Length, Buffer, &IoStatus);\r
+ FSRTL_TEST("FsRtlPrepareMdlWriteDev() - Extending by 1/2 sector. Wait = FALSE",(NT_SUCCESS(Return) && NT_SUCCESS(IoStatus.Status ) && IoStatus.Information == Length));\r
+ Return = TRUE;\r
+\r
+\r
+ pRelatedDo = IoGetRelatedDeviceObject(Pfo);\r
+ FSRTL_TEST("FsRtlPrepareMdlWriteDev() - Did we get related DO ?",pRelatedDo);\r
+ \r
+ \r
+ /* Append to the file past the allocation size*/\r
+ Offset.QuadPart = FileSize->QuadPart;\r
+ OldSize.QuadPart = FileSize->QuadPart;\r
+ Length = (ULONG) (AllocationSize->QuadPart -ValidDataLength->QuadPart);\r
+ FSRTL_TEST("FsRtlPrepareMdlWriteDev() - Testing extending past allocation size.",\r
+ !FsRtlPrepareMdlWriteDev(Pfo,&Offset,Length+1,0,&MdlChain,&IoStatus,pRelatedDo));\r
+ \r
+ FSRTL_TEST("FsRtlPrepareMdlWriteDev() - Testing extending not past allocation size.",\r
+ FsRtlPrepareMdlWriteDev(Pfo,&Offset,Length,0,&MdlChain,&IoStatus,pRelatedDo));\r
+ FSRTL_TEST("FsRtlPrepareMdlWriteDev() - Check filesize",(FileSize->QuadPart = (OldSize.QuadPart+Length)));\r
+ FSRTL_TEST("FsRtlPrepareMdlWriteDev() - Release the MDL.",FsRtlMdlWriteCompleteDev(Pfo,&Offset,MdlChain,pRelatedDo));\r
+ \r
+ \r
+ /* Try do write a 65kb IO and check that if fails. Maximum IO size for thus function is 64KB */\r
+ Offset.QuadPart = 0;\r
+ MdlChain = NULL;\r
+ Length = 65*_1KB;\r
+ FSRTL_TEST("FsRtlPrepareMdlWriteDev() - 65KB IO Test.",\r
+ FsRtlPrepareMdlWriteDev(Pfo,&Offset,Length,0,&MdlChain,&IoStatus,pRelatedDo));\r
+ FSRTL_TEST("FsRtlPrepareMdlWriteDev() - Release the MDL.",FsRtlMdlWriteCompleteDev(Pfo,&Offset,MdlChain,pRelatedDo));\r
+ \r
+ /* Try do write a 64kb IO. Maximum IO size for thus function is 64KB */\r
+ Length = 64*_1KB;\r
+ MdlChain = NULL;\r
+ FSRTL_TEST("FsRtlPrepareMdlWriteDev() - 64KB IO Test.",\r
+ FsRtlPrepareMdlWriteDev(Pfo,&Offset,Length,0,&MdlChain,&IoStatus,NULL))\r
+ FSRTL_TEST("FsRtlPrepareMdlWriteDev() - Release the MDL.",FsRtlMdlWriteCompleteDev(Pfo,&Offset,MdlChain,NULL));\r
+ \r
+ /* Test the fast Io not possible flag */\r
+ FcbHeader->IsFastIoPossible = FastIoIsNotPossible;\r
+ FSRTL_TEST("FsRtlPrepareMdlWriteDev() - FastIo is not possible flag.",\r
+ !FsRtlPrepareMdlWriteDev(Pfo,&Offset,Length,0,&MdlChain,&IoStatus,NULL))\r
+ \r
+ if (Pfo) \r
+ {\r
+ ObDereferenceObject(Pfo);\r
+ Pfo = NULL;\r
+ }\r
+\r
+ if (Fh)\r
+ {\r
+ ZwClose(Fh);\r
+ Fh = NULL;\r
+ }\r
+\r
+ /* ------------------------------------------------------------------------\r
+ TESTING:\r
+ BOOLEAN\r
+ NTAPI\r
+ FsRtlPrepareMdlWrite( IN PFILE_OBJECT FileObject,\r
+ IN PLARGE_INTEGER FileOffset,\r
+ IN ULONG Length,\r
+ IN ULONG LockKey,\r
+ OUT PMDL *MdlChain,\r
+ OUT PIO_STATUS_BLOCK IoStatus,\r
+ IN PDEVICE_OBJECT DeviceObject)\r
+\r
+ ------------------------------------------------------------------------ */\r
+\r
+ /* We are going to repeat the same bunch of tests but with Wait = FALSE. So we exercise the second part of the function. */\r
+ FsRtlTest_OpenTestFile(&Fh, &Pfo);\r
+\r
+ /* Extract the test variable from the FCB struct */\r
+ FcbHeader = (PFSRTL_COMMON_FCB_HEADER)Pfo->FsContext;\r
+ AllocationSize = &FcbHeader->AllocationSize;\r
+ ValidDataLength = &FcbHeader->ValidDataLength;\r
+ FileSize = &FcbHeader->FileSize;\r
+ \r
+ /* Try to cache without caching having been initialized. This should fail.*/\r
+ Length = 10*_1KB;\r
+ FSRTL_TEST("FsRtlPrepareMdlWrite() - No cache map test. Wait = FALSE",\r
+ !FsRtlPrepareMdlWrite(Pfo,AllocationSize,Length,0,MdlChain,&IoStatus));\r
+ \r
+ /* We are going to build a 100k file */\r
+ /* This will inititate caching and build some size */\r
+ Offset.QuadPart = 0;\r
+ Length = 100*_1KB;\r
+ Return = FsRltTest_WritefileZw(Fh,&Offset,Length, Buffer, &IoStatus);\r
+ FSRTL_TEST("FsRtlPrepareMdlWrite() - Building 100k filesize. Wait = FALSE",(NT_SUCCESS(Return) && NT_SUCCESS(IoStatus.Status ) && IoStatus.Information == Length));\r
+ Return = TRUE;\r
+\r
+ /* Extending the file by 1/2 sector, 256 bytes. */\r
+ Offset.QuadPart = 0x7fffffffffff;\r
+ Length = 0x100;\r
+ Return = FsRltTest_WritefileZw(Fh,NULL,Length, Buffer, &IoStatus);\r
+ FSRTL_TEST("FsRtlPrepareMdlWrite() - Extending by 1/2 sector. Wait = FALSE",(NT_SUCCESS(Return) && NT_SUCCESS(IoStatus.Status ) && IoStatus.Information == Length));\r
+ Return = TRUE;\r
+\r
+\r
+ /* Append to the file past the allocation size*/\r
+ MdlChain = NULL;\r
+ Offset.QuadPart = FileSize->QuadPart;\r
+ OldSize.QuadPart = FileSize->QuadPart;\r
+ Length = (ULONG) (AllocationSize->QuadPart -ValidDataLength->QuadPart);\r
+ FSRTL_TEST("FsRtlPrepareMdlWrite() - Testing extending past allocation size.",\r
+ !FsRtlPrepareMdlWrite(Pfo,&Offset,Length+1,0,&MdlChain,&IoStatus));\r
+ \r
+ FSRTL_TEST("FsRtlPrepareMdlWrite() - Testing extending not past allocation size.",\r
+ FsRtlPrepareMdlWrite(Pfo,&Offset,Length,0,&MdlChain,&IoStatus));\r
+ FSRTL_TEST("FsRtlPrepareMdlWrite() - Check filesize",(FileSize->QuadPart = (OldSize.QuadPart+Length)));\r
+ FSRTL_TEST("FsRtlPrepareMdlWrite() - Release the MDL.",FsRtlMdlWriteComplete(Pfo,&Offset,MdlChain));\r
+ \r
+ \r
+ /* Try do write a 65kb IO and check that if fails. Maximum IO size for thus function is 64KB */\r
+ Offset.QuadPart = 0;\r
+ MdlChain = NULL;\r
+ Length = 65*_1KB;\r
+ FSRTL_TEST("FsRtlPrepareMdlWrite() - 65KB IO Test.",\r
+ !FsRtlPrepareMdlWrite(Pfo,&Offset,Length,0,&MdlChain,&IoStatus));\r
+ //FSRTL_TEST("FsRtlPrepareMdlWrite() - Release the MDL.",FsRtlMdlWriteComplete(Pfo,&Offset,MdlChain));\r
+ \r
+ /* Try do write a 64kb IO. Maximum IO size for thus function is 64KB */\r
+ Length = 64*_1KB;\r
+ MdlChain = NULL;\r
+ FSRTL_TEST("FsRtlPrepareMdlWrite() - 64KB IO Test.",\r
+ FsRtlPrepareMdlWrite(Pfo,&Offset,Length,0,&MdlChain,&IoStatus))\r
+ FSRTL_TEST("FsRtlPrepareMdlWrite() - Release the MDL.",FsRtlMdlWriteComplete(Pfo,&Offset,MdlChain));\r
+ \r
+ /* Test the fast Io not possible flag */\r
+ FcbHeader->IsFastIoPossible = FastIoIsNotPossible;\r
+ FSRTL_TEST("FsRtlPrepareMdlWrite() - FastIo is not possible flag.",\r
+ !FsRtlPrepareMdlWrite(Pfo,&Offset,Length,0,&MdlChain,&IoStatus))\r
+ \r
+ if (Pfo) \r
+ {\r
+ ObDereferenceObject(Pfo);\r
+ Pfo = NULL;\r
+ }\r
+\r
+ if (Fh)\r
+ {\r
+ ZwClose(Fh);\r
+ Fh = NULL;\r
+ }\r
\r
/* ------------------------------------------------------------------------------------------\r
TESTING:\r