Author: dcote
Date: Sun Jan 28 07:15:39 2007
New Revision: 25655
URL:
http://svn.reactos.org/svn/reactos?rev=25655&view=rev
Log:
Added tests for FsRtlGetFileSize() and FsRtlReadMdl()
Modified:
trunk/reactos/ntoskrnl/tests/fsrtl.c
Modified: trunk/reactos/ntoskrnl/tests/fsrtl.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/tests/fsrtl.c?rev…
==============================================================================
--- trunk/reactos/ntoskrnl/tests/fsrtl.c (original)
+++ trunk/reactos/ntoskrnl/tests/fsrtl.c Sun Jan 28 07:15:39 2007
@@ -18,9 +18,15 @@
BOOLEAN FsRtlTest_StartTest() {
HANDLE Fh = NULL;
+ PFILE_OBJECT Pfo = NULL;
+
+ HANDLE DirFh = NULL;
+ PFILE_OBJECT DirPfo = NULL;
+
+
IO_STATUS_BLOCK IoStatus;
- NTSTATUS Return = TRUE;
- PFILE_OBJECT Pfo;
+ BOOLEAN Return;
+ NTSTATUS Status = STATUS_SUCCESS;
LONGLONG i = 0;
PCHAR Buffer;
@@ -56,7 +62,8 @@
------------------------------------------------------------------------ */
FsRtlTest_OpenTestFile(&Fh, &Pfo);
-
+ FSRTL_TEST("Opening Test File.",((Pfo != NULL) && (Fh != NULL)));
+
/* Extract the test variable from the FCB struct */
FcbHeader = (PFSRTL_COMMON_FCB_HEADER)Pfo->FsContext;
AllocationSize = &FcbHeader->AllocationSize;
@@ -340,12 +347,137 @@
Return = TRUE;
-
-
+ if (Pfo)
+ {
+ ObDereferenceObject(Pfo);
+ Pfo = NULL;
+ }
+
+ if (Fh)
+ {
+ ZwClose(Fh);
+ Fh = NULL;
+ }
+
+ /*
------------------------------------------------------------------------------------------
+ TESTING:
+
+ FsRtlMdlRead(IN PFILE_OBJECT FileObject,
+ IN PLARGE_INTEGER FileOffset,
+ IN ULONG Length,
+ IN ULONG LockKey,
+ OUT PMDL *MdlChain,
+ OUT PIO_STATUS_BLOCK IoStatus)
+
+ FsRtlMdlReadComplete(IN PFILE_OBJECT FileObject,
+ IN PMDL MemoryDescriptorList)
+
+
------------------------------------------------------------------------------------------
+ */
+
+ FsRtlTest_OpenTestFile(&Fh, &Pfo);
+
+ /* Extract the test variable from the FCB struct */
+ FcbHeader = (PFSRTL_COMMON_FCB_HEADER)Pfo->FsContext;
+ AllocationSize = &FcbHeader->AllocationSize;
+ ValidDataLength = &FcbHeader->ValidDataLength;
+ FileSize = &FcbHeader->FileSize;
+
+
+ /* We are going to build a 100k file */
+ /* This will inititate caching and build some size */
+ Offset.QuadPart = 0;
+ Length = 100*_1KB;
+ Return = FsRltTest_WritefileZw(Fh,&Offset,Length, Buffer, &IoStatus);
+ FSRTL_TEST("FsRtlMdlRead() - Building 100k filesize.",(NT_SUCCESS(Return)
&& NT_SUCCESS(IoStatus.Status ) && IoStatus.Information == Length));
+ Return = TRUE;
+
+
+ Offset.LowPart = 0x0;
+ Offset.HighPart = 0x0;
+ Length = 0x10000;
+
+ /* Testing a 64KB read */
+ MdlChain = NULL;
+ Return = FsRtlMdlRead(Pfo,&Offset,Length,0,&MdlChain,&IoStatus);
+ FSRTL_TEST("FsRtlMdlRead() - Testing 64k IO",(NT_SUCCESS(Return) &&
NT_SUCCESS(IoStatus.Status ) && IoStatus.Information == Length));
+ FSRTL_TEST("FsRtlMdlRead() - Releasing the
MDL",FsRtlMdlReadComplete(Pfo,MdlChain));
+
+
+ /* Testing read past the end of the file */
+ Offset.QuadPart = FileSize->QuadPart - (5 * _1KB);
+ Length = 10 * _1KB;
+ MdlChain = NULL;
+ Return = FsRtlMdlRead(Pfo,&Offset,Length,0,&MdlChain,&IoStatus);
+ FSRTL_TEST("FsRtlMdlRead() - Testing reading past end of file but starting
before EOF",(NT_SUCCESS(Return) && NT_SUCCESS(IoStatus.Status) &&
IoStatus.Information == (FileSize->QuadPart-Offset.QuadPart)));
+ FSRTL_TEST("FsRtlMdlRead() - Releasing the
MDL",FsRtlMdlReadComplete(Pfo,MdlChain));
+
+ Offset.QuadPart = FileSize->QuadPart + 1;
+ Length = 10 * _1KB;
+ MdlChain = NULL;
+ Return = FsRtlMdlRead(Pfo,&Offset,Length,0,&MdlChain,&IoStatus);
+ FSRTL_TEST("FsRtlMdlRead() - Testing reading past end of file but starting after
EOF",(NT_SUCCESS(Return) && (IoStatus.Status == STATUS_END_OF_FILE)
&& IoStatus.Information == 0));
+
+ /* Testing FastIoIsNotPossible */
+ Offset.LowPart = 0x0;
+ Offset.HighPart = 0x0;
+ MdlChain = NULL;
+ Length = 0x10000;
+ FcbHeader->IsFastIoPossible = FastIoIsNotPossible;
+ FSRTL_TEST("FsRtlMdlRead() - FastIo is not possible flag. Wait =
TRUE",!FsRtlMdlRead(Pfo,&Offset,Length,0,&MdlChain,&IoStatus));
+
+ Return = TRUE;
+
+ if (Pfo)
+ {
+ ObDereferenceObject(Pfo);
+ Pfo = NULL;
+ }
+
+ if (Fh)
+ {
+ ZwClose(Fh);
+ Fh = NULL;
+ }
+
+
+
+ /*
------------------------------------------------------------------------------------------
+ TESTING:
+
+ FsRtlGetFileSize(IN PFILE_OBJECT FileObject,
+ IN OUT PLARGE_INTEGER FileSize)
+
+
------------------------------------------------------------------------------------------
+ */
+ FsRtlTest_OpenTestFile(&Fh, &Pfo);
+ FSRTL_TEST("FsRtlGetFileSize() - Opening Test File.",((Pfo != NULL)
&& (Fh != NULL)));
+
+ FsRtlTest_OpenTestDirectory(&DirFh, &DirPfo);
+ FSRTL_TEST("FsRtlGetFileSize() - Opening Test Directory.",((DirPfo != NULL)
&& (DirFh != NULL)));
+
+ Status = FsRtlGetFileSize(Pfo,&OldSize);
+ FSRTL_TEST("FsRtlGetFileSize() - Get the size of a real
file",NT_SUCCESS(Status));
+
+ Status = FsRtlGetFileSize(DirPfo,&OldSize);
+ FSRTL_TEST("FsRtlGetFileSize() - Get the size of a directory file",(Status
== STATUS_FILE_IS_A_DIRECTORY));
+
+
/* The test if over. Do clean up */
Cleanup:
+ if (DirPfo)
+ {
+ ObDereferenceObject(DirPfo);
+ DirPfo = NULL;
+ }
+
+ if (DirFh)
+ {
+ ZwClose(DirFh);
+ DirFh = NULL;
+ }
if (Pfo)
{
ObDereferenceObject(Pfo);
@@ -442,6 +574,46 @@
);
}
+ NTSTATUS FsRtlTest_OpenTestDirectory(PHANDLE Pfh, PFILE_OBJECT *Ppfo) {
+ UNICODE_STRING FileName;
+ OBJECT_ATTRIBUTES oa;
+ IO_STATUS_BLOCK IoStatus;
+ NTSTATUS Return;
+
+ RtlInitUnicodeString(&FileName,L"\\??\\C:\\testdir01");
+
+ InitializeObjectAttributes(
+ &oa,
+ &FileName,
+ OBJ_KERNEL_HANDLE,
+ NULL,
+ NULL;
+ );
+
+ Return = IoCreateFile(Pfh,
+ GENERIC_WRITE,
+ &oa,
+ &IoStatus,
+ 0,
+ FILE_ATTRIBUTE_NORMAL,
+ 0,
+ FILE_OPEN_IF,
+ FILE_DIRECTORY_FILE,FILE_SYNCHRONOUS_IO_ALERT |
FILE_DELETE_ON_CLOSE,
+ NULL,
+ 0,
+ CreateFileTypeNone,
+ NULL,
+ 0);
+
+ Return = ObReferenceObjectByHandle(
+ *Pfh,
+ GENERIC_WRITE,
+ NULL,
+ KernelMode,
+ Ppfo,
+ NULL
+ );
+}
/* All the testing is done from driver entry */
NTSTATUS DriverEntry( IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegistryPath )