Sync with trunk r63502.
[reactos.git] / ntoskrnl / fsrtl / fastio.c
index d28b447..174c8bc 100644 (file)
@@ -295,11 +295,6 @@ FsRtlCopyWrite(IN PFILE_OBJECT FileObject,
     ASSERT(FileObject);
     ASSERT(FileObject->FsContext);
 
-#if defined(__GNUC__) && (__GNUC__ * 100 + __GNUC_MINOR__ == 405)
-    /* Silence incorrect GCC 4.5.x warning */
-    OldFileSize.LowPart = 0;
-#endif
-
     /* Initialize some of the vars and pointers */
     NewSize.QuadPart = 0;
     Offset.QuadPart = FileOffset->QuadPart + Length;
@@ -547,11 +542,6 @@ FsRtlCopyWrite(IN PFILE_OBJECT FileObject,
     {
         LARGE_INTEGER OldFileSize;
 
-#if defined(__GNUC__) && (__GNUC__ * 100 + __GNUC_MINOR__ == 405)
-        /* Silence incorrect GCC 4.5.x warning */
-        OldFileSize.QuadPart = 0;
-#endif
-
         /* Sanity check */
         ASSERT(!KeIsExecutingDpc());
 
@@ -1812,7 +1802,7 @@ FsRtlAcquireFileForModWriteEx(IN PFILE_OBJECT FileObject,
         Exclusive = TRUE;
         ResourceToAcquire = FcbHeader->Resource;
     }
-    else if (!FcbHeader->PagingIoResource || 
+    else if (!FcbHeader->PagingIoResource ||
              (FcbHeader->Flags & FSRTL_FLAG_ACQUIRE_MAIN_RSRC_SH))
     {
         /* Acquire main resource shared if flag is specified or
@@ -1952,9 +1942,35 @@ FsRtlReleaseFileForModWrite(IN PFILE_OBJECT FileObject,
  *--*/
 NTSTATUS
 NTAPI
-FsRtlRegisterFileSystemFilterCallbacks(IN PDRIVER_OBJECT FilterDriverObject,
-                                       IN PFS_FILTER_CALLBACKS Callbacks)
+FsRtlRegisterFileSystemFilterCallbacks(
+    PDRIVER_OBJECT FilterDriverObject,
+    PFS_FILTER_CALLBACKS Callbacks)
 {
-    UNIMPLEMENTED;
-    return STATUS_NOT_IMPLEMENTED;
+    PFS_FILTER_CALLBACKS NewCallbacks;
+    PEXTENDED_DRIVER_EXTENSION DriverExtension;
+    PAGED_CODE();
+
+    /* Verify parameters */
+    if ((FilterDriverObject == NULL) || (Callbacks == NULL))
+    {
+        return STATUS_INVALID_PARAMETER;
+    }
+
+    /* Allocate a buffer for a copy of the callbacks */
+    NewCallbacks = ExAllocatePoolWithTag(NonPagedPool,
+                                         Callbacks->SizeOfFsFilterCallbacks,
+                                         'gmSF');
+    if (NewCallbacks == NULL)
+    {
+        return STATUS_INSUFFICIENT_RESOURCES;
+    }
+
+    /* Copy the callbacks */
+    RtlCopyMemory(NewCallbacks, Callbacks, Callbacks->SizeOfFsFilterCallbacks);
+
+    /* Set the callbacks in the driver extension */
+    DriverExtension = (PEXTENDED_DRIVER_EXTENSION)FilterDriverObject->DriverExtension;
+    DriverExtension->FsFilterCallbacks = NewCallbacks;
+
+    return STATUS_SUCCESS;
 }