https://git.reactos.org/?p=reactos.git;a=commitdiff;h=3adf45086743d5f075e42…
commit 3adf45086743d5f075e4270af7af64017eb01d63
Author:     Jérôme Gardou <jerome.gardou(a)reactos.org>
AuthorDate: Tue May 11 17:13:14 2021 +0200
Commit:     Jérôme Gardou <zefklop(a)users.noreply.github.com>
CommitDate: Wed May 12 11:04:29 2021 +0200
    [REACTOS] Addendum to 5c7ce4475e246560d1622b8cc60dc603e3955f66 - Fix MSVC 2015 build
    Put data into PAGEDATA or INITDATA sections
    Keep section declaration for prototypes
    CORE-17540
---
 drivers/bus/pci/pci.c                      |   11 +-
 drivers/bus/pci/pci.h                      |    2 +
 drivers/filesystems/fastfat/fastio.c       |    4 -
 drivers/filesystems/fastfat/vfat.h         |    2 +
 drivers/filesystems/mup/dfs.c              |    4 -
 drivers/filesystems/mup/dfs.h              |    1 +
 drivers/filesystems/mup/mup.c              |   26 -
 drivers/filesystems/ntfs/ntfs.c            |   17 +-
 drivers/filesystems/ntfs/ntfs.h            |    2 +
 drivers/filters/fltmgr/Interface.c         | 2551 ++++++++++++----------------
 drivers/filters/fltmgr/fltmgr.h            |    2 +
 drivers/input/inport/hardware.c            |    5 +-
 drivers/input/inport/inport.c              |   11 +-
 drivers/input/inport/inport.h              |   15 +
 drivers/input/inport/pnp.c                 |   11 +-
 drivers/input/inport/wmi.c                 |   14 +-
 drivers/storage/class/disk_new/data.c      |   14 +-
 drivers/storage/class/disk_new/disk.h      |    6 +-
 drivers/storage/mountmgr/mntmgr.h          |    2 +
 drivers/storage/mountmgr/mountmgr.c        |    5 -
 drivers/storage/partmgr/partmgr.h          |    3 +
 hal/halx86/include/bus.h                   |    4 +
 hal/halx86/include/hal.h                   |    1 +
 hal/halx86/include/halacpi.h               |    1 +
 hal/halx86/include/halp.h                  |   19 +-
 hal/halx86/legacy/bussupp.c                |   86 +
 hal/halx86/pcidata.cmake                   |   10 +-
 ntoskrnl/cache/newcc.h                     |    2 +
 ntoskrnl/config/cmdata.c                   |   13 +-
 ntoskrnl/ex/sem.c                          |    4 +
 ntoskrnl/ex/uuid.c                         |    1 +
 ntoskrnl/ex/work.c                         |    4 +-
 ntoskrnl/include/internal/amd64/mm.h       |    1 +
 ntoskrnl/include/internal/cc.h             |    3 +
 ntoskrnl/include/internal/cm.h             |   16 +
 ntoskrnl/include/internal/dbgk.h           |    1 +
 ntoskrnl/include/internal/ex.h             |   21 +
 ntoskrnl/include/internal/fsrtl.h          |    3 +
 ntoskrnl/include/internal/i386/ke.h        |   21 +-
 ntoskrnl/include/internal/inbv.h           |    8 +
 ntoskrnl/include/internal/io.h             |   25 +
 ntoskrnl/include/internal/ke.h             |    9 +
 ntoskrnl/include/internal/lpc.h            |    1 +
 ntoskrnl/include/internal/mm.h             |   23 +
 ntoskrnl/include/internal/ob.h             |    3 +
 ntoskrnl/include/internal/po.h             |    2 +
 ntoskrnl/include/internal/ps.h             |    4 +
 ntoskrnl/include/internal/se.h             |    9 +
 ntoskrnl/include/ntoskrnl.h                |    4 +
 ntoskrnl/io/iomgr/driver.c                 |    7 +-
 ntoskrnl/io/pnpmgr/plugplay.c              |    3 +-
 ntoskrnl/ke/amd64/cpu.c                    |    3 -
 ntoskrnl/ke/amd64/kiinit.c                 |    1 -
 ntoskrnl/ke/arm/kiinit.c                   |    2 -
 ntoskrnl/ke/powerpc/cpu.c                  |    7 -
 ntoskrnl/ke/powerpc/kiinit.c               |    1 -
 ntoskrnl/mm/ARM3/miarm.h                   |   18 +
 ntoskrnl/mm/amd64/init.c                   |    4 +-
 ntoskrnl/mm/arm/page.c                     |    1 -
 ntoskrnl/mm/arm/stubs.c                    |    1 -
 ntoskrnl/mm/balance.c                      |    1 +
 ntoskrnl/mm/section.c                      |    1 +
 ntoskrnl/se/token.c                        |    7 +-
 sdk/include/ddk/aux_klib.h                 |    4 +
 sdk/include/ndk/halfuncs.h                 |    2 +
 sdk/include/xdk/iofuncs.h                  |    4 +
 win32ss/drivers/miniport/pc98vid/ioctl.c   |    1 -
 win32ss/drivers/miniport/pc98vid/pc98vid.c |    1 -
 win32ss/gdi/eng/device.h                   |    1 +
 win32ss/gdi/eng/ldevobj.h                  |    2 +
 win32ss/gdi/eng/pdevobj.h                  |    1 +
 win32ss/gdi/ntgdi/brush.h                  |    1 +
 win32ss/gdi/ntgdi/dc.h                     |    2 +-
 win32ss/gdi/ntgdi/gdiobj.h                 |    1 +
 win32ss/gdi/ntgdi/palette.h                |    1 +
 win32ss/user/ntuser/dce.h                  |    2 +-
 win32ss/user/ntuser/desktop.h              |    1 +
 win32ss/user/ntuser/input.h                |    4 +-
 win32ss/user/ntuser/msgqueue.h             |    2 +-
 win32ss/user/ntuser/ntuser.h               |    2 +-
 win32ss/user/ntuser/timer.h                |    2 +-
 win32ss/user/ntuser/winsta.h               |    1 +
 82 files changed, 1515 insertions(+), 1584 deletions(-)
diff --git a/drivers/bus/pci/pci.c b/drivers/bus/pci/pci.c
index 5395982747d..5245ccb12cf 100644
--- a/drivers/bus/pci/pci.c
+++ b/drivers/bus/pci/pci.c
@@ -26,16 +26,6 @@ static NTSTATUS NTAPI PciPowerControl(IN PDEVICE_OBJECT DeviceObject,
IN PIRP Ir
 static DRIVER_DISPATCH PciPnpControl;
 static NTSTATUS NTAPI PciPnpControl(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp);
-
-#ifdef  ALLOC_PRAGMA
-
-// Make the initialization routines discardable, so that they
-// don't waste space
-
-#pragma  alloc_text(INIT, DriverEntry)
-
-#endif  /*  ALLOC_PRAGMA  */
-
 /*** PUBLIC ******************************************************************/
 PPCI_DRIVER_EXTENSION DriverExtension = NULL;
@@ -204,6 +194,7 @@ PciUnload(
     UNREFERENCED_PARAMETER(DriverObject);
 }
+CODE_SEG("INIT")
 NTSTATUS
 NTAPI
 DriverEntry(
diff --git a/drivers/bus/pci/pci.h b/drivers/bus/pci/pci.h
index 3cd2204bf30..94d9ffe31c6 100644
--- a/drivers/bus/pci/pci.h
+++ b/drivers/bus/pci/pci.h
@@ -173,6 +173,8 @@ PdoPowerControl(
     PDEVICE_OBJECT DeviceObject,
     PIRP Irp);
+
+CODE_SEG("INIT")
 NTSTATUS
 NTAPI
 DriverEntry(
diff --git a/drivers/filesystems/fastfat/fastio.c b/drivers/filesystems/fastfat/fastio.c
index 5f1ab235dc6..6404ab448ae 100644
--- a/drivers/filesystems/fastfat/fastio.c
+++ b/drivers/filesystems/fastfat/fastio.c
@@ -12,10 +12,6 @@
 #define NDEBUG
 #include <debug.h>
-#if defined(ALLOC_PRAGMA)
-#pragma alloc_text(INIT, VfatInitFastIoRoutines)
-#endif
-
 static FAST_IO_CHECK_IF_POSSIBLE VfatFastIoCheckIfPossible;
 static
diff --git a/drivers/filesystems/fastfat/vfat.h b/drivers/filesystems/fastfat/vfat.h
index e3e5073c411..d57497c1fa5 100644
--- a/drivers/filesystems/fastfat/vfat.h
+++ b/drivers/filesystems/fastfat/vfat.h
@@ -824,6 +824,7 @@ VfatSetExtendedAttributes(
 /* fastio.c */
+CODE_SEG("INIT")
 VOID
 VfatInitFastIoRoutines(
     PFAST_IO_DISPATCH FastIoDispatch);
@@ -1128,6 +1129,7 @@ VfatFileSystemControl(
 /* iface.c */
+CODE_SEG("INIT")
 NTSTATUS
 NTAPI
 DriverEntry(
diff --git a/drivers/filesystems/mup/dfs.c b/drivers/filesystems/mup/dfs.c
index 61b54d63dd1..9a7a5a6d696 100644
--- a/drivers/filesystems/mup/dfs.c
+++ b/drivers/filesystems/mup/dfs.c
@@ -31,10 +31,6 @@
 #define NDEBUG
 #include <debug.h>
-#if defined(ALLOC_PRAGMA)
-#pragma alloc_text(INIT, DfsDriverEntry)
-#endif
-
 /* FUNCTIONS ****************************************************************/
 NTSTATUS
diff --git a/drivers/filesystems/mup/dfs.h b/drivers/filesystems/mup/dfs.h
index e8268984ba4..0b25be953a9 100644
--- a/drivers/filesystems/mup/dfs.h
+++ b/drivers/filesystems/mup/dfs.h
@@ -51,6 +51,7 @@ DfsUnload(
     PDRIVER_OBJECT DriverObject
 );
+CODE_SEG("INIT")
 NTSTATUS
 DfsDriverEntry(
     PDRIVER_OBJECT DriverObject,
diff --git a/drivers/filesystems/mup/mup.c b/drivers/filesystems/mup/mup.c
index 760bcfd5368..601d0f33896 100644
--- a/drivers/filesystems/mup/mup.c
+++ b/drivers/filesystems/mup/mup.c
@@ -32,32 +32,6 @@
 #define NDEBUG
 #include <debug.h>
-CODE_SEG("INIT")
-NTSTATUS
-NTAPI
-DriverEntry(
-    PDRIVER_OBJECT DriverObject,
-    PUNICODE_STRING RegistryPath
-);
-
-CODE_SEG("INIT")
-VOID
-MupInitializeData(
-    VOID
-);
-
-CODE_SEG("INIT")
-VOID
-MupInitializeVcb(
-    PMUP_VCB Vcb
-);
-
-#if defined(ALLOC_PRAGMA)
-#pragma alloc_text(INIT, DriverEntry)
-#pragma alloc_text(INIT, MupInitializeData)
-#pragma alloc_text(INIT, MupInitializeVcb)
-#endif
-
 ERESOURCE MupGlobalLock;
 ERESOURCE MupPrefixTableLock;
 ERESOURCE MupCcbListLock;
diff --git a/drivers/filesystems/ntfs/ntfs.c b/drivers/filesystems/ntfs/ntfs.c
index 087d56ccdbd..cfa88f70a50 100644
--- a/drivers/filesystems/ntfs/ntfs.c
+++ b/drivers/filesystems/ntfs/ntfs.c
@@ -21,7 +21,7 @@
  * FILE:             drivers/filesystem/ntfs/ntfs.c
  * PURPOSE:          NTFS filesystem driver
  * PROGRAMMER:       Eric Kohl
- *                   Pierre Schweitzer
+ *                   Pierre Schweitzer
  */
 /* INCLUDES *****************************************************************/
@@ -31,11 +31,6 @@
 #define NDEBUG
 #include <debug.h>
-#if defined(ALLOC_PRAGMA)
-#pragma alloc_text(INIT, DriverEntry)
-#pragma alloc_text(INIT, NtfsInitializeFunctionPointers)
-#endif
-
 /* GLOBALS *****************************************************************/
 PNTFS_GLOBAL_DATA NtfsGlobalData = NULL;
@@ -129,10 +124,10 @@ DriverEntry(PDRIVER_OBJECT DriverObject,
     NtfsInitializeFunctionPointers(DriverObject);
     /* Initialize CC functions array */
-    NtfsGlobalData->CacheMgrCallbacks.AcquireForLazyWrite = NtfsAcqLazyWrite;
-    NtfsGlobalData->CacheMgrCallbacks.ReleaseFromLazyWrite = NtfsRelLazyWrite;
-    NtfsGlobalData->CacheMgrCallbacks.AcquireForReadAhead = NtfsAcqReadAhead;
-    NtfsGlobalData->CacheMgrCallbacks.ReleaseFromReadAhead = NtfsRelReadAhead;
+    NtfsGlobalData->CacheMgrCallbacks.AcquireForLazyWrite = NtfsAcqLazyWrite;
+    NtfsGlobalData->CacheMgrCallbacks.ReleaseFromLazyWrite = NtfsRelLazyWrite;
+    NtfsGlobalData->CacheMgrCallbacks.AcquireForReadAhead = NtfsAcqReadAhead;
+    NtfsGlobalData->CacheMgrCallbacks.ReleaseFromReadAhead = NtfsRelReadAhead;
     NtfsGlobalData->FastIoDispatch.SizeOfFastIoDispatch = sizeof(FAST_IO_DISPATCH);
     NtfsGlobalData->FastIoDispatch.FastIoCheckIfPossible = NtfsFastIoCheckIfPossible;
@@ -164,7 +159,7 @@ DriverEntry(PDRIVER_OBJECT DriverObject,
 /*
- * FUNCTION: Called within the driver entry to initialize the IRP functions array
+ * FUNCTION: Called within the driver entry to initialize the IRP functions array
  * ARGUMENTS:
  *           DriverObject = object describing this driver
  * RETURNS: Nothing
diff --git a/drivers/filesystems/ntfs/ntfs.h b/drivers/filesystems/ntfs/ntfs.h
index 9b00ca3ec15..046037edfbc 100644
--- a/drivers/filesystems/ntfs/ntfs.h
+++ b/drivers/filesystems/ntfs/ntfs.h
@@ -1276,8 +1276,10 @@ NtfsSetVolumeInformation(PNTFS_IRP_CONTEXT IrpContext);
 /* ntfs.c */
+CODE_SEG("INIT")
 DRIVER_INITIALIZE DriverEntry;
+CODE_SEG("INIT")
 VOID
 NTAPI
 NtfsInitializeFunctionPointers(PDRIVER_OBJECT DriverObject);
diff --git a/drivers/filters/fltmgr/Interface.c b/drivers/filters/fltmgr/Interface.c
index b412adec1f0..1eec4521b5b 100644
--- a/drivers/filters/fltmgr/Interface.c
+++ b/drivers/filters/fltmgr/Interface.c
@@ -32,370 +32,8 @@ extern PDEVICE_OBJECT CommsDeviceObject;
 extern LIST_ENTRY FilterList;
 extern ERESOURCE FilterListLock;
-
-DRIVER_INITIALIZE DriverEntry;
-NTSTATUS
-NTAPI
-DriverEntry(
-    _In_ PDRIVER_OBJECT DriverObject,
-    _In_ PUNICODE_STRING RegistryPath
-);
-
-static
-NTSTATUS
-SetupDispatchAndCallbacksTables(
-    _In_ PDRIVER_OBJECT DriverObject
-);
-
-static
-NTSTATUS
-FltpAttachDeviceObject(
-    _In_ PDEVICE_OBJECT SourceDevice,
-    _In_ PDEVICE_OBJECT TargetDevice,
-    _Out_ PDEVICE_OBJECT *AttachedToDeviceObject
-);
-
-static
-VOID
-FltpCleanupDeviceObject(
-    _In_ PDEVICE_OBJECT DeviceObject
-);
-
-static
-BOOLEAN
-FltpIsAttachedToDevice(
-    _In_ PDEVICE_OBJECT DeviceObject,
-    _In_opt_ PDEVICE_OBJECT *AttachedDeviceObject
-);
-
-static
-NTSTATUS
-FltpEnumerateFileSystemVolumes(
-    _In_ PDEVICE_OBJECT DeviceObject
-);
-
-static
-NTSTATUS
-FltpAttachToFileSystemDevice(
-    _In_ PDEVICE_OBJECT DeviceObject,
-    _In_ PUNICODE_STRING DeviceName
-);
-
-static
-LONG_PTR
-FltpDetachFromFileSystemDevice(
-    _In_ PDEVICE_OBJECT DeviceObject
-);
-
-DRIVER_FS_NOTIFICATION FltpFsNotification;
-VOID
-NTAPI
-FltpFsNotification(
-    _In_ PDEVICE_OBJECT DeviceObject,
-    _In_ BOOLEAN FsActive
-);
-
-NTSTATUS
-NTAPI
-FltpDispatch(
-    _In_ PDEVICE_OBJECT DeviceObject,
-    _Inout_ PIRP Irp
-);
-
-NTSTATUS
-NTAPI
-FltpCreate(
-    _In_ PDEVICE_OBJECT DeviceObject,
-    _Inout_ PIRP Irp
-);
-
-NTSTATUS
-NTAPI
-FltpFsControl(
-    _In_ PDEVICE_OBJECT DeviceObject,
-    _Inout_ PIRP Irp
-);
-
-NTSTATUS
-NTAPI
-FltpDeviceControl(
-    _In_ PDEVICE_OBJECT DeviceObject,
-    _Inout_ PIRP Irp
-);
-
-BOOLEAN
-NTAPI
-FltpFastIoCheckIfPossible(
-    _In_ PFILE_OBJECT FileObject,
-    _In_ PLARGE_INTEGER FileOffset,
-    _In_ ULONG Length,
-    _In_ BOOLEAN Wait,
-    _In_ ULONG LockKey,
-    _In_ BOOLEAN CheckForReadOperation,
-    _Out_ PIO_STATUS_BLOCK IoStatus,
-    _In_ PDEVICE_OBJECT DeviceObject
-);
-
-
-BOOLEAN
-NTAPI
-FltpFastIoRead(
-    _In_ PFILE_OBJECT FileObject,
-    _In_ PLARGE_INTEGER FileOffset,
-    _In_ ULONG Length,
-    _In_ BOOLEAN Wait,
-    _In_ ULONG LockKey,
-    _Out_ PVOID Buffer,
-    _Out_ PIO_STATUS_BLOCK IoStatus,
-    _In_ PDEVICE_OBJECT DeviceObject
-);
-
-BOOLEAN
-NTAPI
-FltpFastIoWrite(
-    _In_ PFILE_OBJECT FileObject,
-    _In_ PLARGE_INTEGER FileOffset,
-    _In_ ULONG Length,
-    _In_ BOOLEAN Wait,
-    _In_ ULONG LockKey,
-    _In_ PVOID Buffer,
-    _Out_ PIO_STATUS_BLOCK IoStatus,
-    _In_ PDEVICE_OBJECT DeviceObject
-);
-
-BOOLEAN
-NTAPI
-FltpFastIoQueryBasicInfo(
-    _In_ PFILE_OBJECT FileObject,
-    _In_ BOOLEAN Wait,
-    _Out_ PFILE_BASIC_INFORMATION Buffer,
-    _Out_ PIO_STATUS_BLOCK IoStatus,
-    _In_ PDEVICE_OBJECT DeviceObject
-);
-
-BOOLEAN
-NTAPI
-FltpFastIoQueryStandardInfo(
-    _In_ PFILE_OBJECT FileObject,
-    _In_ BOOLEAN Wait,
-    _Out_ PFILE_STANDARD_INFORMATION Buffer,
-    _Out_ PIO_STATUS_BLOCK IoStatus,
-    _In_ PDEVICE_OBJECT DeviceObject
-);
-
-BOOLEAN
-NTAPI
-FltpFastIoLock(
-    _In_ PFILE_OBJECT FileObject,
-    _In_ PLARGE_INTEGER FileOffset,
-    _In_ PLARGE_INTEGER Length,
-    _In_ PEPROCESS ProcessId,
-    _In_ ULONG Key,
-    _In_ BOOLEAN FailImmediately,
-    _In_ BOOLEAN ExclusiveLock,
-    _Out_ PIO_STATUS_BLOCK IoStatus,
-    _In_ PDEVICE_OBJECT DeviceObject
-);
-
-BOOLEAN
-NTAPI
-FltpFastIoUnlockSingle(
-    _In_ PFILE_OBJECT FileObject,
-    _In_ PLARGE_INTEGER FileOffset,
-    _In_ PLARGE_INTEGER Length,
-    _In_ PEPROCESS ProcessId,
-    _In_ ULONG Key,
-    _Out_ PIO_STATUS_BLOCK IoStatus,
-    _In_ PDEVICE_OBJECT DeviceObject
-);
-
-BOOLEAN
-NTAPI
-FltpFastIoUnlockAll(
-    _In_ PFILE_OBJECT FileObject,
-    _In_ PEPROCESS ProcessId,
-    _Out_ PIO_STATUS_BLOCK IoStatus,
-    _In_ PDEVICE_OBJECT DeviceObject
-);
-
-BOOLEAN
-NTAPI
-FltpFastIoUnlockAllByKey(
-    _In_ PFILE_OBJECT FileObject,
-    _In_ PVOID ProcessId,
-    _In_ ULONG Key,
-    _Out_ PIO_STATUS_BLOCK IoStatus,
-    _In_ PDEVICE_OBJECT DeviceObject
-);
-
-BOOLEAN
-NTAPI
-FltpFastIoDeviceControl(
-    _In_ PFILE_OBJECT FileObject,
-    _In_ BOOLEAN Wait,
-    _In_opt_ PVOID InputBuffer,
-    _In_ ULONG InputBufferLength,
-    _Out_opt_ PVOID OutputBuffer,
-    _In_ ULONG OutputBufferLength,
-    _In_ ULONG IoControlCode,
-    _Out_ PIO_STATUS_BLOCK IoStatus,
-    _In_ PDEVICE_OBJECT DeviceObject
-);
-
-VOID
-NTAPI
-FltpFastIoDetachDevice(
-    _In_ PDEVICE_OBJECT SourceDevice,
-    _In_ PDEVICE_OBJECT TargetDevice
-);
-
-BOOLEAN
-NTAPI
-FltpFastIoQueryNetworkOpenInfo(
-    _In_ PFILE_OBJECT FileObject,
-    _In_ BOOLEAN Wait,
-    _Out_ PFILE_NETWORK_OPEN_INFORMATION Buffer,
-    _Out_ PIO_STATUS_BLOCK IoStatus,
-    _In_ PDEVICE_OBJECT DeviceObject
-);
-
-BOOLEAN
-NTAPI
-FltpFastIoMdlRead(
-    _In_ PFILE_OBJECT FileObject,
-    _In_ PLARGE_INTEGER FileOffset,
-    _In_ ULONG Length,
-    _In_ ULONG LockKey,
-    _Out_ PMDL *MdlChain,
-    _Out_ PIO_STATUS_BLOCK IoStatus,
-    _In_ PDEVICE_OBJECT DeviceObject
-);
-
-BOOLEAN
-NTAPI
-FltpFastIoMdlReadComplete(
-    _In_ PFILE_OBJECT FileObject,
-    _In_ PMDL MdlChain,
-    _In_ PDEVICE_OBJECT DeviceObject
-);
-
-BOOLEAN
-NTAPI
-FltpFastIoPrepareMdlWrite(
-    _In_ PFILE_OBJECT FileObject,
-    _In_ PLARGE_INTEGER FileOffset,
-    _In_ ULONG Length,
-    _In_ ULONG LockKey,
-    _Out_ PMDL *MdlChain,
-    _Out_ PIO_STATUS_BLOCK IoStatus,
-    _In_ PDEVICE_OBJECT DeviceObject
-);
-
-BOOLEAN
-NTAPI
-FltpFastIoMdlWriteComplete(
-    _In_ PFILE_OBJECT FileObject,
-    _In_ PLARGE_INTEGER FileOffset,
-    _In_ PMDL MdlChain,
-    _In_ PDEVICE_OBJECT DeviceObject
-);
-
-BOOLEAN
-NTAPI
-FltpFastIoReadCompressed(
-    _In_ PFILE_OBJECT FileObject,
-    _In_ PLARGE_INTEGER FileOffset,
-    _In_ ULONG Length,
-    _In_ ULONG LockKey,
-    _Out_ PVOID Buffer,
-    _Out_ PMDL *MdlChain,
-    _Out_ PIO_STATUS_BLOCK IoStatus,
-    _Out_ PCOMPRESSED_DATA_INFO CompressedDataInfo,
-    _In_ ULONG CompressedDataInfoLength,
-    _In_ PDEVICE_OBJECT DeviceObject
-);
-
-BOOLEAN
-NTAPI
-FltpFastIoWriteCompressed(
-    _In_ PFILE_OBJECT FileObject,
-    _In_ PLARGE_INTEGER FileOffset,
-    _In_ ULONG Length,
-    _In_ ULONG LockKey,
-    _In_ PVOID Buffer,
-    _Out_ PMDL *MdlChain,
-    _Out_ PIO_STATUS_BLOCK IoStatus,
-    _In_ PCOMPRESSED_DATA_INFO CompressedDataInfo,
-    _In_ ULONG CompressedDataInfoLength,
-    _In_ PDEVICE_OBJECT DeviceObject
-);
-
-BOOLEAN
-NTAPI
-FltpFastIoMdlReadCompleteCompressed(
-    _In_ PFILE_OBJECT FileObject,
-    _In_ PMDL MdlChain,
-    _In_ PDEVICE_OBJECT DeviceObject
-);
-
-BOOLEAN
-NTAPI
-FltpFastIoMdlWriteCompleteCompressed(
-    _In_ PFILE_OBJECT FileObject,
-    _In_ PLARGE_INTEGER FileOffset,
-    _In_ PMDL MdlChain,
-    _In_ PDEVICE_OBJECT DeviceObject
-);
-
-BOOLEAN
-NTAPI
-FltpFastIoQueryOpen(
-    _Inout_ PIRP Irp,
-    _Out_ PFILE_NETWORK_OPEN_INFORMATION NetworkInformation,
-    _In_ PDEVICE_OBJECT DeviceObject
-);
-
-
-
-#ifdef ALLOC_PRAGMA
-#pragma alloc_text(INIT, DriverEntry)
-#pragma alloc_text(INIT, SetupDispatchAndCallbacksTables)
-#pragma alloc_text(PAGE, FltpAttachDeviceObject)
-#pragma alloc_text(PAGE, FltpIsAttachedToDevice)
-#pragma alloc_text(PAGE, FltpEnumerateFileSystemVolumes)
-#pragma alloc_text(PAGE, FltpAttachToFileSystemDevice)
-#pragma alloc_text(PAGE, FltpDetachFromFileSystemDevice)
-#pragma alloc_text(PAGE, FltpFsNotification)
-#pragma alloc_text(PAGE, FltpCreate)
-#pragma alloc_text(PAGE, FltpFsControl)
-#pragma alloc_text(PAGE, FltpDeviceControl)
-#pragma alloc_text(PAGE, FltpFastIoRead)
-#pragma alloc_text(PAGE, FltpFastIoWrite)
-#pragma alloc_text(PAGE, FltpFastIoQueryBasicInfo)
-#pragma alloc_text(PAGE, FltpFastIoQueryStandardInfo)
-#pragma alloc_text(PAGE, FltpFastIoLock)
-#pragma alloc_text(PAGE, FltpFastIoUnlockSingle)
-#pragma alloc_text(PAGE, FltpFastIoUnlockAll)
-#pragma alloc_text(PAGE, FltpFastIoUnlockAllByKey)
-#pragma alloc_text(PAGE, FltpFastIoDeviceControl)
-#pragma alloc_text(PAGE, FltpFastIoDetachDevice)
-#pragma alloc_text(PAGE, FltpFastIoQueryNetworkOpenInfo)
-#pragma alloc_text(PAGE, FltpFastIoMdlRead)
-#pragma alloc_text(PAGE, FltpFastIoMdlReadComplete)
-#pragma alloc_text(PAGE, FltpFastIoPrepareMdlWrite)
-#pragma alloc_text(PAGE, FltpFastIoMdlWriteComplete)
-#pragma alloc_text(PAGE, FltpFastIoReadCompressed)
-#pragma alloc_text(PAGE, FltpFastIoWriteCompressed)
-#pragma alloc_text(PAGE, FltpFastIoMdlReadCompleteCompressed)
-#pragma alloc_text(PAGE, FltpFastIoMdlWriteCompleteCompressed)
-#pragma alloc_text(PAGE, FltpFastIoQueryOpen)
-#endif
-
-
-
 DRIVER_DATA DriverData;
-
 typedef struct _DETACH_DEVICE_WORK_ITEM
 {
     WORK_QUEUE_ITEM WorkItem;
@@ -404,501 +42,629 @@ typedef struct _DETACH_DEVICE_WORK_ITEM
 } DETACH_DEVICE_WORK_ITEM, *PDETACH_DEVICE_WORK_ITEM;
+/* LOCAL FUNCTIONS ****************************************/
-/* DISPATCH ROUTINES **********************************************/
-
-NTSTATUS
-NTAPI
-FltpPreFsFilterOperation(_In_ PFS_FILTER_CALLBACK_DATA Data,
-                         _Out_ PVOID *CompletionContext)
-{
-    UNREFERENCED_PARAMETER(Data);
-    UNREFERENCED_PARAMETER(CompletionContext);
-    __debugbreak();
-    return STATUS_SUCCESS;
-}
-
+static
 VOID
-NTAPI
-FltpPostFsFilterOperation(_In_ PFS_FILTER_CALLBACK_DATA Data,
-                          _In_ NTSTATUS OperationStatus,
-                          _In_ PVOID CompletionContext)
+FltpCleanupDeviceObject(_In_ PDEVICE_OBJECT DeviceObject)
 {
-    UNREFERENCED_PARAMETER(Data);
-    UNREFERENCED_PARAMETER(OperationStatus);
-    UNREFERENCED_PARAMETER(CompletionContext);
-    __debugbreak();
+    PFLTMGR_DEVICE_EXTENSION DeviceExtension;
+
+    DeviceExtension = DeviceObject->DeviceExtension;
+    if (DeviceExtension)
+    {
+        // cleanup device extension
+    }
 }
+CODE_SEG("PAGE")
+static
 NTSTATUS
-NTAPI
-FltpDispatch(_In_ PDEVICE_OBJECT DeviceObject,
-             _Inout_ PIRP Irp)
+FltpAttachDeviceObject(_In_ PDEVICE_OBJECT SourceDevice,
+                       _In_ PDEVICE_OBJECT TargetDevice,
+                       _Out_ PDEVICE_OBJECT *AttachedToDeviceObject)
 {
-    PFLTMGR_DEVICE_EXTENSION DeviceExtension;
-    PIO_STACK_LOCATION StackPtr;
     NTSTATUS Status;
-    DeviceExtension = DeviceObject->DeviceExtension;
+    PAGED_CODE();
-    /* Check if this is a request for us */
-    if (DeviceObject == DriverData.DeviceObject)
+    /* Before attaching, copy the flags from the device we're going to attach to */
+    if (FlagOn(SourceDevice->Flags, DO_BUFFERED_IO))
     {
-        FLT_ASSERT(DeviceObject->DriverObject == DriverData.DriverObject);
-        FLT_ASSERT(DeviceExtension == NULL);
-
-        /* Hand it off to our internal handler */
-        Status = FltpDispatchHandler(DeviceObject, Irp);
-        if (Status != STATUS_REPARSE)
-        {
-            Irp->IoStatus.Status = Status;
-            Irp->IoStatus.Information = 0;
-            IoCompleteRequest(Irp, 0);
-        }
-        return Status;
+        SetFlag(TargetDevice->Flags, DO_BUFFERED_IO);
     }
-
-    /* Check if this is a request for a the messaging device */
-    if (DeviceObject == CommsDeviceObject)
+    if (FlagOn(SourceDevice->Flags, DO_DIRECT_IO))
     {
-        /* Hand off to our internal routine */
-        return FltpMsgDispatch(DeviceObject, Irp);
+        SetFlag(TargetDevice->Flags, DO_DIRECT_IO);
     }
-
-    FLT_ASSERT(DeviceExtension &&
-               DeviceExtension->AttachedToDeviceObject);
-
-    StackPtr = IoGetCurrentIrpStackLocation(Irp);
-    if (StackPtr->MajorFunction == IRP_MJ_SHUTDOWN)
+    if (FlagOn(SourceDevice->Flags, DO_SYSTEM_BOOT_PARTITION))
     {
-        // handle shutdown request
+        SetFlag(TargetDevice->Characteristics, FILE_DEVICE_SECURE_OPEN);
     }
-    DPRINT1("Received %X from %wZ\n", StackPtr->MajorFunction,
&DeviceExtension->DeviceName);
+    /* Attach this device to the top of the driver stack */
+    Status = IoAttachDeviceToDeviceStackSafe(SourceDevice,
+                                             TargetDevice,
+                                             AttachedToDeviceObject);
-    /* Just pass the IRP down the stack */
-    IoSkipCurrentIrpStackLocation(Irp);
-    return IoCallDriver(DeviceExtension->AttachedToDeviceObject, Irp);
+    return Status;
 }
-NTSTATUS
-NTAPI
-FltpCreate(_In_ PDEVICE_OBJECT DeviceObject,
-           _Inout_ PIRP Irp)
+CODE_SEG("PAGE")
+static
+BOOLEAN
+FltpIsAttachedToDevice(_In_ PDEVICE_OBJECT DeviceObject,
+                       _In_opt_ PDEVICE_OBJECT *AttachedDeviceObject)
 {
-    PFLTMGR_DEVICE_EXTENSION DeviceExtension;
+    PDEVICE_OBJECT CurrentDeviceObject;
+    PDEVICE_OBJECT NextDeviceObject;
     PAGED_CODE();
-    DeviceExtension = DeviceObject->DeviceExtension;
+    /* Initialize the return pointer */
+    if (AttachedDeviceObject) *AttachedDeviceObject = NULL;
-    /* Check if this is a request for us */
-    if (DeviceObject == DriverData.DeviceObject)
+    /* Start by getting the top level device in the chain */
+    CurrentDeviceObject = IoGetAttachedDeviceReference(DeviceObject);
+
+    /* Loop while there are attached devices */
+    while (CurrentDeviceObject)
     {
-        FLT_ASSERT(DeviceObject->DriverObject == DriverData.DriverObject);
-        FLT_ASSERT(DeviceExtension == NULL);
+        /* Check if this device driver matches ours */
+        if (CurrentDeviceObject->DriverObject == DriverData.DriverObject)
+        {
+            FLT_ASSERT(CurrentDeviceObject->DeviceExtension != NULL);
-        /* Someone wants a handle to the fltmgr, allow it */
-        Irp->IoStatus.Status = STATUS_SUCCESS;
-        Irp->IoStatus.Information = 0;
-        IofCompleteRequest(Irp, 0);
-        return STATUS_SUCCESS;
-    }
+            /* We're attached, return the device object if the caller asked for it */
+            if (AttachedDeviceObject)
+            {
+                *AttachedDeviceObject = CurrentDeviceObject;
+            }
+            else
+            {
+                /* We aren't returning the reference, so decrement the count */
+                ObDereferenceObject(CurrentDeviceObject);
+            }
-    /* Check if this is a request for a the new comms connection */
-    if (DeviceObject == CommsDeviceObject)
-    {
-        /* Hand off to our internal routine */
-        return FltpMsgCreate(DeviceObject, Irp);
-    }
+            return TRUE;
+        }
-    FLT_ASSERT(DeviceExtension &&
-               DeviceExtension->AttachedToDeviceObject);
+        /* Get the next device in the chain */
+        NextDeviceObject = IoGetLowerDeviceObject(CurrentDeviceObject);
-    DPRINT1("Received create from %wZ (%lu)\n",
&DeviceExtension->DeviceName, PsGetCurrentProcessId());
+        /* Decrement the count on the last device before we update the pointer */
+        ObDereferenceObject(CurrentDeviceObject);
+        CurrentDeviceObject = NextDeviceObject;
+    }
-    /* Just pass the IRP down the stack */
-    IoSkipCurrentIrpStackLocation(Irp);
-    return IoCallDriver(DeviceExtension->AttachedToDeviceObject, Irp);
+    return FALSE;
 }
+CODE_SEG("PAGE")
+static
 NTSTATUS
-NTAPI
-FltpFsControl(_In_ PDEVICE_OBJECT DeviceObject,
-              _Inout_ PIRP Irp)
+FltpEnumerateFileSystemVolumes(_In_ PDEVICE_OBJECT DeviceObject)
 {
-    PFLTMGR_DEVICE_EXTENSION DeviceExtension;
+    PFLTMGR_DEVICE_EXTENSION NewDeviceExtension;
+    PDEVICE_OBJECT BaseDeviceObject;
+    PDEVICE_OBJECT NewDeviceObject;
+    PDEVICE_OBJECT *DeviceList;
+    PDEVICE_OBJECT StorageStackDeviceObject;
+    UNICODE_STRING DeviceName;
+    ULONG NumDevices;
+    ULONG i;
+    NTSTATUS Status;
     PAGED_CODE();
-    /* Check if this is a request for us */
-    if (DeviceObject == DriverData.DeviceObject)
+    /* Get the base device */
+    BaseDeviceObject = IoGetDeviceAttachmentBaseRef(DeviceObject);
+
+    /* get the number of device object linked to the base file system */
+    Status = IoEnumerateDeviceObjectList(BaseDeviceObject->DriverObject,
+                                         NULL,
+                                         0,
+                                         &NumDevices);
+    if (Status != STATUS_BUFFER_TOO_SMALL) return Status;
+
+    /* Add a few more slots in case the size changed between calls and allocate some
memory to hold the pointers */
+    NumDevices += 4;
+    DeviceList = ExAllocatePoolWithTag(NonPagedPool,
+                                       (NumDevices * sizeof(PDEVICE_OBJECT)),
+                                       FM_TAG_DEV_OBJ_PTRS);
+    if (DeviceList == NULL) return STATUS_INSUFFICIENT_RESOURCES;
+
+    /* Now get all the device objects that this base driver has created */
+    Status = IoEnumerateDeviceObjectList(BaseDeviceObject->DriverObject,
+                                         DeviceList,
+                                         (NumDevices * sizeof(PDEVICE_OBJECT)),
+                                         &NumDevices);
+    if (!NT_SUCCESS(Status))
     {
-        /* We don't handle this request */
-        Irp->IoStatus.Information = 0;
-        Irp->IoStatus.Status = STATUS_INVALID_DEVICE_REQUEST;
-        IofCompleteRequest(Irp, 0);
-        return STATUS_INVALID_DEVICE_REQUEST;
+        ExFreePoolWithTag(DeviceList, FM_TAG_DEV_OBJ_PTRS);
+        return Status;
     }
-    DeviceExtension = DeviceObject->DeviceExtension;
+    /* Loop through all the devices looking for ones to attach to */
+    for (i = 0; i < NumDevices; i++)
+    {
+        RtlInitUnicodeString(&DeviceName, NULL);
+        StorageStackDeviceObject = NULL;
+        NewDeviceObject = NULL;
-    FLT_ASSERT(DeviceExtension &&
-               DeviceExtension->AttachedToDeviceObject);
+        /* Ignore the device we passed in, and devices of the wrong type */
+        if ((DeviceList[i] == BaseDeviceObject) ||
+            (DeviceList[i]->DeviceType != BaseDeviceObject->DeviceType))
+        {
+            goto CleanupAndNext;
+        }
-    /* Just pass the IRP down the stack */
-    IoSkipCurrentIrpStackLocation(Irp);
-    return IoCallDriver(DeviceExtension->AttachedToDeviceObject, Irp);
-}
+        /* Ignore this device if we're already attached to it */
+        if (FltpIsAttachedToDevice(DeviceList[i], NULL) == FALSE)
+        {
+            goto CleanupAndNext;
+        }
-NTSTATUS
-NTAPI
-FltpDeviceControl(_In_ PDEVICE_OBJECT DeviceObject,
-                  _Inout_ PIRP Irp)
-{
-    PFLTMGR_DEVICE_EXTENSION DeviceExtension;
-    NTSTATUS Status;
-    /* Check if the request was meant for us */
-    if (DeviceObject == DriverData.DeviceObject)
-    {
-        Status = FltpDeviceControlHandler(DeviceObject, Irp);
-        if (Status != STATUS_REPARSE)
+        /*
+         * If the device has a name, it must be a control device.
+         * This handles drivers with more then one control device (like FastFat)
+         */
+        FltpGetBaseDeviceObjectName(DeviceList[i], &DeviceName);
+        if (NT_SUCCESS(Status) && DeviceName.Length > 0)
         {
-            Irp->IoStatus.Status = Status;
-            Irp->IoStatus.Information = 0;
-            IoCompleteRequest(Irp, 0);
+            goto CleanupAndNext;
         }
-        return Status;
-    }
+        /*
+         * Try to get the storage stack (disk) device object associated with
+         * this file system device object. Ignore the device if we don't have one
+         */
+        Status = IoGetDiskDeviceObject(DeviceList[i],
+                                       &StorageStackDeviceObject);
+        if (!NT_SUCCESS(Status))
+        {
+            goto CleanupAndNext;
+        }
-    DeviceExtension = DeviceObject->DeviceExtension;
-    FLT_ASSERT(DeviceExtension &&
-               DeviceExtension->AttachedToDeviceObject);
+        /*
+         * TODO: Don't attach to shadow copy volumes,
+         * ros doesn't have any so it's not an issues yet
+         */
-    /* Just pass the IRP down the stack */
-    IoSkipCurrentIrpStackLocation(Irp);
-    return IoCallDriver(DeviceExtension->AttachedToDeviceObject, Irp);
-}
+        /*
+         * We're far enough to be ready to attach, create a device
+         * object which we'll use to do so
+         */
+        Status = IoCreateDevice(DriverData.DriverObject,
+                                sizeof(FLTMGR_DEVICE_EXTENSION),
+                                NULL,
+                                DeviceList[i]->DeviceType,
+                                0,
+                                FALSE,
+                                &NewDeviceObject);
+        if (!NT_SUCCESS(Status))
+        {
+            goto CleanupAndNext;
+        }
+        /* Get the device extension for this new object and store our disk object there
*/
+        NewDeviceExtension = NewDeviceObject->DeviceExtension;
+        NewDeviceExtension->StorageStackDeviceObject = StorageStackDeviceObject;
+        /* Lookup and store the device name for the storage stack */
+        RtlInitEmptyUnicodeString(&NewDeviceExtension->DeviceName,
+                                  NewDeviceExtension->DeviceNameBuffer,
+                                  sizeof(NewDeviceExtension->DeviceNameBuffer));
+        FltpGetObjectName(StorageStackDeviceObject,
+                          &NewDeviceExtension->DeviceName);
-/* FASTIO ROUTINES ************************************************/
-BOOLEAN
-NTAPI
-FltpFastIoCheckIfPossible(_In_ PFILE_OBJECT FileObject,
-                          _In_ PLARGE_INTEGER FileOffset,
-                          _In_ ULONG Length,
-                          _In_ BOOLEAN Wait,
-                          _In_ ULONG LockKey,
-                          _In_ BOOLEAN CheckForReadOperation,
-                          _Out_ PIO_STATUS_BLOCK IoStatus,
-                          _In_ PDEVICE_OBJECT DeviceObject)
+        /* Grab the attach lock before we attempt to attach */
+        ExAcquireFastMutex(&DriverData.FilterAttachLock);
-{
-    PFLTMGR_DEVICE_EXTENSION DeviceExtension;
-    PDEVICE_OBJECT AttachedDeviceObject;
-    PFAST_IO_DISPATCH FastIoDispatch;
+        /* Check again that we aren't already attached. It may have changed since our
last check */
+        if (FltpIsAttachedToDevice(DeviceList[i], NULL) == FALSE)
+        {
+            FLT_ASSERT(NewDeviceObject->DriverObject == DriverData.DriverObject);
-    PAGED_CODE();
+            /* Finally, attach to the volume */
+            Status = FltpAttachDeviceObject(DeviceList[i],
+                                            NewDeviceObject,
+
&NewDeviceExtension->AttachedToDeviceObject);
+            if (NT_SUCCESS(Status))
+            {
+                /* Clean the initializing flag so other filters can attach to our device
object */
+                ClearFlag(NewDeviceObject->Flags, DO_DEVICE_INITIALIZING);
+            }
+        }
+        else
+        {
+            /* We're already attached. Just cleanup */
+            Status = STATUS_DEVICE_ALREADY_ATTACHED;
+        }
-    /* If it doesn't have a device extension, then it's not our device object */
-    if (DeviceObject->DeviceExtension == NULL)
-    {
-        /* Fail the call */
-        IoStatus->Status = STATUS_INVALID_DEVICE_REQUEST;
-        IoStatus->Information = 0;
-        return TRUE;
-    }
+        ExReleaseFastMutex(&DriverData.FilterAttachLock);
-    DeviceExtension = DeviceObject->DeviceExtension;
-    FLT_ASSERT(DeviceExtension->AttachedToDeviceObject);
+CleanupAndNext:
-    /* Get the device that we attached to */
-    AttachedDeviceObject = DeviceExtension->AttachedToDeviceObject;
-    FastIoDispatch = AttachedDeviceObject->DriverObject->FastIoDispatch;
+        if (!NT_SUCCESS(Status))
+        {
+            if (NewDeviceObject)
+            {
+                FltpCleanupDeviceObject(NewDeviceObject);
+                IoDeleteDevice(NewDeviceObject);
+            }
+        }
+
+        if (StorageStackDeviceObject)
+        {
+            /* A ref was added for us when we attached, so we can deref ours now */
+            ObDereferenceObject(StorageStackDeviceObject);
+        }
+
+        /* Remove the ref which was added by IoEnumerateDeviceObjectList */
+        ObDereferenceObject(DeviceList[i]);
+
+        /* Free the buffer that FltpGetBaseDeviceObjectName added */
+        FltpFreeUnicodeString(&DeviceName);
-    /* Make sure our FastIo table is valid */
-    if (FastIoDispatch && FastIoDispatch->FastIoCheckIfPossible)
-    {
-        /* Forward the call onto the device we attached to */
-        return FastIoDispatch->FastIoCheckIfPossible(FileObject,
-                                                     FileOffset,
-                                                     Length,
-                                                     Wait,
-                                                     LockKey,
-                                                     CheckForReadOperation,
-                                                     IoStatus,
-                                                     AttachedDeviceObject);
     }
-    /* We failed to handle the request, send it down the slow path */
-    FLT_ASSERT(FALSE);
-    return FALSE;
+    /* Free the memory we allocated for the list */
+    ExFreePoolWithTag(DeviceList, FM_TAG_DEV_OBJ_PTRS);
+
+    return STATUS_SUCCESS;
 }
-BOOLEAN
-NTAPI
-FltpFastIoRead(_In_ PFILE_OBJECT FileObject,
-               _In_ PLARGE_INTEGER FileOffset,
-               _In_ ULONG Length,
-               _In_ BOOLEAN Wait,
-               _In_ ULONG LockKey,
-               _Out_ PVOID Buffer,
-               _Out_ PIO_STATUS_BLOCK IoStatus,
-               _In_ PDEVICE_OBJECT DeviceObject)
+CODE_SEG("PAGE")
+static
+NTSTATUS
+FltpAttachToFileSystemDevice(_In_ PDEVICE_OBJECT DeviceObject,
+                             _In_ PUNICODE_STRING DeviceName)
 {
     PFLTMGR_DEVICE_EXTENSION DeviceExtension;
-    PDEVICE_OBJECT AttachedDeviceObject;
-    PFAST_IO_DISPATCH FastIoDispatch;
+    PDEVICE_OBJECT NewDeviceObject;
+    WCHAR Buffer[MAX_DEVNAME_LENGTH];
+    UNICODE_STRING FileSystemDeviceName;
+    UNICODE_STRING FsRecDeviceName;
+    NTSTATUS Status;
     PAGED_CODE();
-    /* If it doesn't have a device extension, then it's not our device object */
-    if (DeviceObject->DeviceExtension == NULL)
-    {
-        /* Fail the call */
-        IoStatus->Status = STATUS_INVALID_DEVICE_REQUEST;
-        IoStatus->Information = 0;
-        return TRUE;
-    }
-
-    DeviceExtension = DeviceObject->DeviceExtension;
-    FLT_ASSERT(DeviceExtension->AttachedToDeviceObject);
-
-    /* Get the device that we attached to */
-    AttachedDeviceObject = DeviceExtension->AttachedToDeviceObject;
-    FastIoDispatch = AttachedDeviceObject->DriverObject->FastIoDispatch;
-
-    /* Make sure our FastIo table is valid */
-    if (FastIoDispatch && FastIoDispatch->FastIoRead)
+    /* Only handle device types we're interested in */
+    if (DeviceObject->DeviceType != FILE_DEVICE_DISK_FILE_SYSTEM &&
+        DeviceObject->DeviceType != FILE_DEVICE_CD_ROM_FILE_SYSTEM &&
+        DeviceObject->DeviceType != FILE_DEVICE_NETWORK_FILE_SYSTEM)
     {
-        /* Forward the call onto the device we attached to */
-        return FastIoDispatch->FastIoRead(FileObject,
-                                          FileOffset,
-                                          Length,
-                                          Wait,
-                                          LockKey,
-                                          Buffer,
-                                          IoStatus,
-                                          AttachedDeviceObject);
+        return STATUS_SUCCESS;
     }
-    /* We failed to handle the request, send it down the slow path */
-    FLT_ASSERT(FALSE);
-    return FALSE;
-}
+    /* Setup the buffer to hold the device name */
+    RtlInitEmptyUnicodeString(&FileSystemDeviceName,
+                              Buffer,
+                              MAX_DEVNAME_LENGTH * sizeof(WCHAR));
-BOOLEAN
-NTAPI
-FltpFastIoWrite(_In_ PFILE_OBJECT FileObject,
-                _In_ PLARGE_INTEGER FileOffset,
-                 _In_ ULONG Length,
-                 _In_ BOOLEAN Wait,
-                 _In_ ULONG LockKey,
-                 _In_ PVOID Buffer,
-                 _Out_ PIO_STATUS_BLOCK IoStatus,
-                 _In_ PDEVICE_OBJECT DeviceObject)
-{
-    PFLTMGR_DEVICE_EXTENSION DeviceExtension;
-    PDEVICE_OBJECT AttachedDeviceObject;
-    PFAST_IO_DISPATCH FastIoDispatch;
+    /* Get the the name of the file system device */
+    Status = FltpGetObjectName(DeviceObject->DriverObject, &FileSystemDeviceName);
+    if (!NT_SUCCESS(Status)) return Status;
-    PAGED_CODE();
+    DPRINT("Found device %wZ, checking if we need to attach...\n",
&FileSystemDeviceName);
-    /* If it doesn't have a device extension, then it's not our device object */
-    if (DeviceObject->DeviceExtension == NULL)
+    /* Build up the name of the file system recognizer device */
+    RtlInitUnicodeString(&FsRecDeviceName, L"\\FileSystem\\Fs_Rec");
+
+    /* We don't attach to recognizer devices, so bail if this is one */
+    if (RtlCompareUnicodeString(&FileSystemDeviceName, &FsRecDeviceName, TRUE) ==
0)
     {
-        /* Fail the call */
-        IoStatus->Status = STATUS_INVALID_DEVICE_REQUEST;
-        IoStatus->Information = 0;
-        return TRUE;
+        return STATUS_SUCCESS;
     }
-    DeviceExtension = DeviceObject->DeviceExtension;
-    FLT_ASSERT(DeviceExtension->AttachedToDeviceObject);
+    /* Create a device object which we can attach to this file system */
+    Status = IoCreateDevice(DriverData.DriverObject,
+                            sizeof(FLTMGR_DEVICE_EXTENSION),
+                            NULL,
+                            DeviceObject->DeviceType,
+                            0,
+                            FALSE,
+                            &NewDeviceObject);
+    if (!NT_SUCCESS(Status))
+    {
+        DPRINT1("Failed to create a DO for attaching to a FS : 0x%X\n",
Status);
+        return Status;
+    }
-    /* Get the device that we attached to */
-    AttachedDeviceObject = DeviceExtension->AttachedToDeviceObject;
-    FastIoDispatch = AttachedDeviceObject->DriverObject->FastIoDispatch;
+    /* Cast the device extension to something we understand */
+    DeviceExtension = NewDeviceObject->DeviceExtension;
-    /* Make sure our FastIo table is valid */
-    if (FastIoDispatch && FastIoDispatch->FastIoWrite)
+    /* Attach this device to the top of the driver stack and store the DO we attached to
in the DE */
+    Status = FltpAttachDeviceObject(NewDeviceObject,
+                                    DeviceObject,
+                                    &DeviceExtension->AttachedToDeviceObject);
+    if (NT_SUCCESS(Status))
     {
-        /* Forward the call onto the device we attached to */
-        return FastIoDispatch->FastIoWrite(FileObject,
-                                           FileOffset,
-                                           Length,
-                                           Wait,
-                                           LockKey,
-                                           Buffer,
-                                           IoStatus,
-                                           AttachedDeviceObject);
+        DPRINT("Attached to %wZ\n", &FileSystemDeviceName);
+    }
+    else
+    {
+        DPRINT1("Failed to attach to the driver stack : 0x%X\n", Status);
+        goto Cleanup;
     }
-    /* We failed to handle the request, send it down the slow path */
-    FLT_ASSERT(FALSE);
-    return FALSE;
-}
-
-BOOLEAN
-NTAPI
-FltpFastIoQueryBasicInfo(_In_ PFILE_OBJECT FileObject,
-                         _In_ BOOLEAN Wait,
-                         _Out_ PFILE_BASIC_INFORMATION Buffer,
-                         _Out_ PIO_STATUS_BLOCK IoStatus,
-                         _In_ PDEVICE_OBJECT DeviceObject)
-{
-    PFLTMGR_DEVICE_EXTENSION DeviceExtension;
-    PDEVICE_OBJECT AttachedDeviceObject;
-    PFAST_IO_DISPATCH FastIoDispatch;
+    /* Setup the unicode string buffer and copy the device name to the device extension
*/
+    RtlInitEmptyUnicodeString(&DeviceExtension->DeviceName,
+                              DeviceExtension->DeviceNameBuffer,
+                              MAX_DEVNAME_LENGTH * sizeof(WCHAR));
+    RtlCopyUnicodeString(&DeviceExtension->DeviceName, DeviceName);
-    PAGED_CODE();
+    /* We're done, remove the initializing flag */
+    ClearFlag(NewDeviceObject->Flags, DO_DEVICE_INITIALIZING);
-    /* If it doesn't have a device extension, then it's not our device object */
-    if (DeviceObject->DeviceExtension == NULL)
+    /* Look for existing mounted devices for this file system */
+    Status = FltpEnumerateFileSystemVolumes(DeviceObject);
+    if (!NT_SUCCESS(Status))
     {
-        /* Fail the call */
-        IoStatus->Status = STATUS_INVALID_DEVICE_REQUEST;
-        IoStatus->Information = 0;
-        return TRUE;
+        DPRINT1("Failed to enumerate file system volumes for this file system :
0x%X\n", Status);
+        IoDetachDevice(DeviceExtension->AttachedToDeviceObject);
     }
-    DeviceExtension = DeviceObject->DeviceExtension;
-    FLT_ASSERT(DeviceExtension->AttachedToDeviceObject);
-
-    /* Get the device that we attached to */
-    AttachedDeviceObject = DeviceExtension->AttachedToDeviceObject;
-    FastIoDispatch = AttachedDeviceObject->DriverObject->FastIoDispatch;
+Cleanup:
-    /* Make sure our FastIo table is valid */
-    if (FastIoDispatch && FastIoDispatch->FastIoQueryBasicInfo)
+    if (!NT_SUCCESS(Status))
     {
-        /* Forward the call onto the device we attached to */
-        return FastIoDispatch->FastIoQueryBasicInfo(FileObject,
-                                                    Wait,
-                                                    Buffer,
-                                                    IoStatus,
-                                                    AttachedDeviceObject);
+        IoDeleteDevice(NewDeviceObject);
     }
-    /* We failed to handle the request, send it down the slow path */
-    FLT_ASSERT(FALSE);
-    return FALSE;
+    return Status;
 }
-BOOLEAN
-NTAPI
-FltpFastIoQueryStandardInfo(_In_ PFILE_OBJECT FileObject,
-                            _In_ BOOLEAN Wait,
-                            _Out_ PFILE_STANDARD_INFORMATION Buffer,
-                            _Out_ PIO_STATUS_BLOCK IoStatus,
-                            _In_ PDEVICE_OBJECT DeviceObject)
+CODE_SEG("PAGE")
+static
+LONG_PTR
+FltpDetachFromFileSystemDevice(_In_ PDEVICE_OBJECT DeviceObject)
 {
+    PDEVICE_OBJECT AttachedDevice, NextDevice;
     PFLTMGR_DEVICE_EXTENSION DeviceExtension;
-    PDEVICE_OBJECT AttachedDeviceObject;
-    PFAST_IO_DISPATCH FastIoDispatch;
+    LONG_PTR Count;
     PAGED_CODE();
-    /* If it doesn't have a device extension, then it's not our device object */
-    if (DeviceObject->DeviceExtension == NULL)
+    /* Get the top device in the chain and increment the ref count on it */
+    AttachedDevice = IoGetAttachedDeviceReference(DeviceObject);
+
+    /* Loop all attached devices looking for our file system driver */
+    while (AttachedDevice->DriverObject != DriverData.DriverObject)
     {
-        /* Fail the call */
-        IoStatus->Status = STATUS_INVALID_DEVICE_REQUEST;
-        IoStatus->Information = 0;
-        return TRUE;
-    }
+        FLT_ASSERT(AttachedDevice != NULL);
-    DeviceExtension = DeviceObject->DeviceExtension;
-    FLT_ASSERT(DeviceExtension->AttachedToDeviceObject);
+        /* Get the next lower device object. This adds a ref on NextDevice */
+        NextDevice = IoGetLowerDeviceObject(AttachedDevice);
-    /* Get the device that we attached to */
-    AttachedDeviceObject = DeviceExtension->AttachedToDeviceObject;
-    FastIoDispatch = AttachedDeviceObject->DriverObject->FastIoDispatch;
+        /* Remove the reference we added */
+        Count = ObDereferenceObject(AttachedDevice);
-    /* Make sure our FastIo table is valid */
-    if (FastIoDispatch && FastIoDispatch->FastIoQueryStandardInfo)
+        /* Bail if this is the last one */
+        if (NextDevice == NULL) return Count;
+
+        /* Try the next one */
+        AttachedDevice = NextDevice;
+    }
+
+
+    DeviceExtension = AttachedDevice->DeviceExtension;
+    if (DeviceExtension)
     {
-        /* Forward the call onto the device we attached to */
-        return FastIoDispatch->FastIoQueryStandardInfo(FileObject,
-                                                       Wait,
-                                                       Buffer,
-                                                       IoStatus,
-                                                       AttachedDeviceObject);
+        //
+        // FIXME: Put any device extension cleanup code here
+        //
     }
-    /* We failed to handle the request, send it down the slow path */
-    FLT_ASSERT(FALSE);
-    return FALSE;
+    /* Detach the device from the chain and delete the object */
+    IoDetachDevice(DeviceObject);
+    IoDeleteDevice(AttachedDevice);
+
+    /* Remove the reference we added so the delete can complete */
+    return ObDereferenceObject(AttachedDevice);
 }
-BOOLEAN
+
+/* DISPATCH ROUTINES **********************************************/
+
+NTSTATUS
 NTAPI
-FltpFastIoLock(_In_ PFILE_OBJECT FileObject,
-               _In_ PLARGE_INTEGER FileOffset,
-               _In_ PLARGE_INTEGER Length,
-               _In_ PEPROCESS ProcessId,
-               _In_ ULONG Key,
-               _In_ BOOLEAN FailImmediately,
-               _In_ BOOLEAN ExclusiveLock,
-               _Out_ PIO_STATUS_BLOCK IoStatus,
-               _In_ PDEVICE_OBJECT DeviceObject)
+FltpPreFsFilterOperation(_In_ PFS_FILTER_CALLBACK_DATA Data,
+                         _Out_ PVOID *CompletionContext)
 {
-    PFLTMGR_DEVICE_EXTENSION DeviceExtension;
-    PDEVICE_OBJECT AttachedDeviceObject;
-    PFAST_IO_DISPATCH FastIoDispatch;
-
-    PAGED_CODE();
+    UNREFERENCED_PARAMETER(Data);
+    UNREFERENCED_PARAMETER(CompletionContext);
+    __debugbreak();
+    return STATUS_SUCCESS;
+}
-    /* If it doesn't have a device extension, then it's not our device object */
-    if (DeviceObject->DeviceExtension == NULL)
+VOID
+NTAPI
+FltpPostFsFilterOperation(_In_ PFS_FILTER_CALLBACK_DATA Data,
+                          _In_ NTSTATUS OperationStatus,
+                          _In_ PVOID CompletionContext)
+{
+    UNREFERENCED_PARAMETER(Data);
+    UNREFERENCED_PARAMETER(OperationStatus);
+    UNREFERENCED_PARAMETER(CompletionContext);
+    __debugbreak();
+}
+
+NTSTATUS
+NTAPI
+FltpDispatch(_In_ PDEVICE_OBJECT DeviceObject,
+             _Inout_ PIRP Irp)
+{
+    PFLTMGR_DEVICE_EXTENSION DeviceExtension;
+    PIO_STACK_LOCATION StackPtr;
+    NTSTATUS Status;
+
+    DeviceExtension = DeviceObject->DeviceExtension;
+
+    /* Check if this is a request for us */
+    if (DeviceObject == DriverData.DeviceObject)
     {
-        /* Fail the call */
-        IoStatus->Status = STATUS_INVALID_DEVICE_REQUEST;
-        IoStatus->Information = 0;
-        return TRUE;
+        FLT_ASSERT(DeviceObject->DriverObject == DriverData.DriverObject);
+        FLT_ASSERT(DeviceExtension == NULL);
+
+        /* Hand it off to our internal handler */
+        Status = FltpDispatchHandler(DeviceObject, Irp);
+        if (Status != STATUS_REPARSE)
+        {
+            Irp->IoStatus.Status = Status;
+            Irp->IoStatus.Information = 0;
+            IoCompleteRequest(Irp, 0);
+        }
+        return Status;
+    }
+
+    /* Check if this is a request for a the messaging device */
+    if (DeviceObject == CommsDeviceObject)
+    {
+        /* Hand off to our internal routine */
+        return FltpMsgDispatch(DeviceObject, Irp);
+    }
+
+    FLT_ASSERT(DeviceExtension &&
+               DeviceExtension->AttachedToDeviceObject);
+
+    StackPtr = IoGetCurrentIrpStackLocation(Irp);
+    if (StackPtr->MajorFunction == IRP_MJ_SHUTDOWN)
+    {
+        // handle shutdown request
     }
+    DPRINT1("Received %X from %wZ\n", StackPtr->MajorFunction,
&DeviceExtension->DeviceName);
+
+    /* Just pass the IRP down the stack */
+    IoSkipCurrentIrpStackLocation(Irp);
+    return IoCallDriver(DeviceExtension->AttachedToDeviceObject, Irp);
+}
+
+CODE_SEG("PAGE")
+NTSTATUS
+NTAPI
+FltpCreate(_In_ PDEVICE_OBJECT DeviceObject,
+           _Inout_ PIRP Irp)
+{
+    PFLTMGR_DEVICE_EXTENSION DeviceExtension;
+
+    PAGED_CODE();
+
     DeviceExtension = DeviceObject->DeviceExtension;
-    FLT_ASSERT(DeviceExtension->AttachedToDeviceObject);
-    /* Get the device that we attached to */
-    AttachedDeviceObject = DeviceExtension->AttachedToDeviceObject;
-    FastIoDispatch = AttachedDeviceObject->DriverObject->FastIoDispatch;
+    /* Check if this is a request for us */
+    if (DeviceObject == DriverData.DeviceObject)
+    {
+        FLT_ASSERT(DeviceObject->DriverObject == DriverData.DriverObject);
+        FLT_ASSERT(DeviceExtension == NULL);
-    /* Make sure our FastIo table is valid */
-    if (FastIoDispatch && FastIoDispatch->FastIoLock)
+        /* Someone wants a handle to the fltmgr, allow it */
+        Irp->IoStatus.Status = STATUS_SUCCESS;
+        Irp->IoStatus.Information = 0;
+        IofCompleteRequest(Irp, 0);
+        return STATUS_SUCCESS;
+    }
+
+    /* Check if this is a request for a the new comms connection */
+    if (DeviceObject == CommsDeviceObject)
     {
-        /* Forward the call onto the device we attached to */
-        return FastIoDispatch->FastIoLock(FileObject,
-                                          FileOffset,
-                                          Length,
-                                          ProcessId,
-                                          Key,
-                                          FailImmediately,
-                                          ExclusiveLock,
-                                          IoStatus,
-                                          AttachedDeviceObject);
+        /* Hand off to our internal routine */
+        return FltpMsgCreate(DeviceObject, Irp);
     }
-    /* We failed to handle the request, send it down the slow path */
-    FLT_ASSERT(FALSE);
-    return FALSE;
+    FLT_ASSERT(DeviceExtension &&
+               DeviceExtension->AttachedToDeviceObject);
+
+    DPRINT1("Received create from %wZ (%lu)\n",
&DeviceExtension->DeviceName, PsGetCurrentProcessId());
+
+    /* Just pass the IRP down the stack */
+    IoSkipCurrentIrpStackLocation(Irp);
+    return IoCallDriver(DeviceExtension->AttachedToDeviceObject, Irp);
+}
+
+CODE_SEG("PAGE")
+NTSTATUS
+NTAPI
+FltpFsControl(_In_ PDEVICE_OBJECT DeviceObject,
+              _Inout_ PIRP Irp)
+{
+    PFLTMGR_DEVICE_EXTENSION DeviceExtension;
+
+    PAGED_CODE();
+
+    /* Check if this is a request for us */
+    if (DeviceObject == DriverData.DeviceObject)
+    {
+        /* We don't handle this request */
+        Irp->IoStatus.Information = 0;
+        Irp->IoStatus.Status = STATUS_INVALID_DEVICE_REQUEST;
+        IofCompleteRequest(Irp, 0);
+        return STATUS_INVALID_DEVICE_REQUEST;
+    }
+
+    DeviceExtension = DeviceObject->DeviceExtension;
+
+    FLT_ASSERT(DeviceExtension &&
+               DeviceExtension->AttachedToDeviceObject);
+
+    /* Just pass the IRP down the stack */
+    IoSkipCurrentIrpStackLocation(Irp);
+    return IoCallDriver(DeviceExtension->AttachedToDeviceObject, Irp);
+}
+
+NTSTATUS
+NTAPI
+FltpDeviceControl(_In_ PDEVICE_OBJECT DeviceObject,
+                  _Inout_ PIRP Irp)
+{
+    PFLTMGR_DEVICE_EXTENSION DeviceExtension;
+    NTSTATUS Status;
+
+    /* Check if the request was meant for us */
+    if (DeviceObject == DriverData.DeviceObject)
+    {
+        Status = FltpDeviceControlHandler(DeviceObject, Irp);
+        if (Status != STATUS_REPARSE)
+        {
+            Irp->IoStatus.Status = Status;
+            Irp->IoStatus.Information = 0;
+            IoCompleteRequest(Irp, 0);
+        }
+
+        return Status;
+    }
+
+    DeviceExtension = DeviceObject->DeviceExtension;
+
+    FLT_ASSERT(DeviceExtension &&
+               DeviceExtension->AttachedToDeviceObject);
+
+    /* Just pass the IRP down the stack */
+    IoSkipCurrentIrpStackLocation(Irp);
+    return IoCallDriver(DeviceExtension->AttachedToDeviceObject, Irp);
 }
+
+
+/* FASTIO ROUTINES ************************************************/
+
+CODE_SEG("PAGE")
 BOOLEAN
 NTAPI
-FltpFastIoUnlockSingle(_In_ PFILE_OBJECT FileObject,
-                       _In_ PLARGE_INTEGER FileOffset,
-                       _In_ PLARGE_INTEGER Length,
-                       _In_ PEPROCESS ProcessId,
-                       _In_ ULONG Key,
-                       _Out_ PIO_STATUS_BLOCK IoStatus,
-                       _In_ PDEVICE_OBJECT DeviceObject)
+FltpFastIoCheckIfPossible(_In_ PFILE_OBJECT FileObject,
+                          _In_ PLARGE_INTEGER FileOffset,
+                          _In_ ULONG Length,
+                          _In_ BOOLEAN Wait,
+                          _In_ ULONG LockKey,
+                          _In_ BOOLEAN CheckForReadOperation,
+                          _Out_ PIO_STATUS_BLOCK IoStatus,
+                          _In_ PDEVICE_OBJECT DeviceObject)
+
 {
     PFLTMGR_DEVICE_EXTENSION DeviceExtension;
     PDEVICE_OBJECT AttachedDeviceObject;
@@ -923,16 +689,17 @@ FltpFastIoUnlockSingle(_In_ PFILE_OBJECT FileObject,
     FastIoDispatch = AttachedDeviceObject->DriverObject->FastIoDispatch;
     /* Make sure our FastIo table is valid */
-    if (FastIoDispatch && FastIoDispatch->FastIoUnlockSingle)
+    if (FastIoDispatch && FastIoDispatch->FastIoCheckIfPossible)
     {
         /* Forward the call onto the device we attached to */
-        return FastIoDispatch->FastIoUnlockSingle(FileObject,
-                                                  FileOffset,
-                                                  Length,
-                                                  ProcessId,
-                                                  Key,
-                                                  IoStatus,
-                                                  AttachedDeviceObject);
+        return FastIoDispatch->FastIoCheckIfPossible(FileObject,
+                                                     FileOffset,
+                                                     Length,
+                                                     Wait,
+                                                     LockKey,
+                                                     CheckForReadOperation,
+                                                     IoStatus,
+                                                     AttachedDeviceObject);
     }
     /* We failed to handle the request, send it down the slow path */
@@ -940,13 +707,17 @@ FltpFastIoUnlockSingle(_In_ PFILE_OBJECT FileObject,
     return FALSE;
 }
+CODE_SEG("PAGE")
 BOOLEAN
 NTAPI
-FltpFastIoUnlockAll(_In_ PFILE_OBJECT FileObject,
-                    _In_ PEPROCESS ProcessId,
-                    _Out_ PIO_STATUS_BLOCK IoStatus,
-                    _In_ PDEVICE_OBJECT DeviceObject)
-
+FltpFastIoRead(_In_ PFILE_OBJECT FileObject,
+               _In_ PLARGE_INTEGER FileOffset,
+               _In_ ULONG Length,
+               _In_ BOOLEAN Wait,
+               _In_ ULONG LockKey,
+               _Out_ PVOID Buffer,
+               _Out_ PIO_STATUS_BLOCK IoStatus,
+               _In_ PDEVICE_OBJECT DeviceObject)
 {
     PFLTMGR_DEVICE_EXTENSION DeviceExtension;
     PDEVICE_OBJECT AttachedDeviceObject;
@@ -971,13 +742,17 @@ FltpFastIoUnlockAll(_In_ PFILE_OBJECT FileObject,
     FastIoDispatch = AttachedDeviceObject->DriverObject->FastIoDispatch;
     /* Make sure our FastIo table is valid */
-    if (FastIoDispatch && FastIoDispatch->FastIoUnlockAll)
+    if (FastIoDispatch && FastIoDispatch->FastIoRead)
     {
         /* Forward the call onto the device we attached to */
-        return FastIoDispatch->FastIoUnlockAll(FileObject,
-                                               ProcessId,
-                                               IoStatus,
-                                               AttachedDeviceObject);
+        return FastIoDispatch->FastIoRead(FileObject,
+                                          FileOffset,
+                                          Length,
+                                          Wait,
+                                          LockKey,
+                                          Buffer,
+                                          IoStatus,
+                                          AttachedDeviceObject);
     }
     /* We failed to handle the request, send it down the slow path */
@@ -985,13 +760,17 @@ FltpFastIoUnlockAll(_In_ PFILE_OBJECT FileObject,
     return FALSE;
 }
+CODE_SEG("PAGE")
 BOOLEAN
 NTAPI
-FltpFastIoUnlockAllByKey(_In_ PFILE_OBJECT FileObject,
-                         _In_ PVOID ProcessId,
-                         _In_ ULONG Key,
-                         _Out_ PIO_STATUS_BLOCK IoStatus,
-                         _In_ PDEVICE_OBJECT DeviceObject)
+FltpFastIoWrite(_In_ PFILE_OBJECT FileObject,
+                _In_ PLARGE_INTEGER FileOffset,
+                 _In_ ULONG Length,
+                 _In_ BOOLEAN Wait,
+                 _In_ ULONG LockKey,
+                 _In_ PVOID Buffer,
+                 _Out_ PIO_STATUS_BLOCK IoStatus,
+                 _In_ PDEVICE_OBJECT DeviceObject)
 {
     PFLTMGR_DEVICE_EXTENSION DeviceExtension;
     PDEVICE_OBJECT AttachedDeviceObject;
@@ -1016,14 +795,17 @@ FltpFastIoUnlockAllByKey(_In_ PFILE_OBJECT FileObject,
     FastIoDispatch = AttachedDeviceObject->DriverObject->FastIoDispatch;
     /* Make sure our FastIo table is valid */
-    if (FastIoDispatch && FastIoDispatch->FastIoUnlockAllByKey)
+    if (FastIoDispatch && FastIoDispatch->FastIoWrite)
     {
         /* Forward the call onto the device we attached to */
-        return FastIoDispatch->FastIoUnlockAllByKey(FileObject,
-                                                    ProcessId,
-                                                    Key,
-                                                    IoStatus,
-                                                    AttachedDeviceObject);
+        return FastIoDispatch->FastIoWrite(FileObject,
+                                           FileOffset,
+                                           Length,
+                                           Wait,
+                                           LockKey,
+                                           Buffer,
+                                           IoStatus,
+                                           AttachedDeviceObject);
     }
     /* We failed to handle the request, send it down the slow path */
@@ -1031,17 +813,14 @@ FltpFastIoUnlockAllByKey(_In_ PFILE_OBJECT FileObject,
     return FALSE;
 }
+CODE_SEG("PAGE")
 BOOLEAN
 NTAPI
-FltpFastIoDeviceControl(_In_ PFILE_OBJECT FileObject,
-                        _In_ BOOLEAN Wait,
-                        _In_opt_ PVOID InputBuffer,
-                        _In_ ULONG InputBufferLength,
-                        _Out_opt_ PVOID OutputBuffer,
-                        _In_ ULONG OutputBufferLength,
-                        _In_ ULONG IoControlCode,
-                        _Out_ PIO_STATUS_BLOCK IoStatus,
-                        _In_ PDEVICE_OBJECT DeviceObject)
+FltpFastIoQueryBasicInfo(_In_ PFILE_OBJECT FileObject,
+                         _In_ BOOLEAN Wait,
+                         _Out_ PFILE_BASIC_INFORMATION Buffer,
+                         _Out_ PIO_STATUS_BLOCK IoStatus,
+                         _In_ PDEVICE_OBJECT DeviceObject)
 {
     PFLTMGR_DEVICE_EXTENSION DeviceExtension;
     PDEVICE_OBJECT AttachedDeviceObject;
@@ -1052,8 +831,10 @@ FltpFastIoDeviceControl(_In_ PFILE_OBJECT FileObject,
     /* If it doesn't have a device extension, then it's not our device object */
     if (DeviceObject->DeviceExtension == NULL)
     {
-        /* Fail the request, send it down the slow path */
-        return FALSE;
+        /* Fail the call */
+        IoStatus->Status = STATUS_INVALID_DEVICE_REQUEST;
+        IoStatus->Information = 0;
+        return TRUE;
     }
     DeviceExtension = DeviceObject->DeviceExtension;
@@ -1064,18 +845,14 @@ FltpFastIoDeviceControl(_In_ PFILE_OBJECT FileObject,
     FastIoDispatch = AttachedDeviceObject->DriverObject->FastIoDispatch;
     /* Make sure our FastIo table is valid */
-    if (FastIoDispatch && FastIoDispatch->FastIoDeviceControl)
+    if (FastIoDispatch && FastIoDispatch->FastIoQueryBasicInfo)
     {
         /* Forward the call onto the device we attached to */
-        return FastIoDispatch->FastIoDeviceControl(FileObject,
-                                                   Wait,
-                                                   InputBuffer,
-                                                   InputBufferLength,
-                                                   OutputBuffer,
-                                                   OutputBufferLength,
-                                                   IoControlCode,
-                                                   IoStatus,
-                                                   AttachedDeviceObject);
+        return FastIoDispatch->FastIoQueryBasicInfo(FileObject,
+                                                    Wait,
+                                                    Buffer,
+                                                    IoStatus,
+                                                    AttachedDeviceObject);
     }
     /* We failed to handle the request, send it down the slow path */
@@ -1083,72 +860,65 @@ FltpFastIoDeviceControl(_In_ PFILE_OBJECT FileObject,
     return FALSE;
 }
-VOID
-NTAPI
-FltpFastIoDetachDeviceWorker(_In_ PVOID Parameter)
-{
-    PDETACH_DEVICE_WORK_ITEM DetachDeviceWorkItem = Parameter;
-
-    /* Run any cleanup routines */
-    FltpCleanupDeviceObject(DetachDeviceWorkItem->SourceDevice);
-
-    /* Detach from the target device */
-    IoDetachDevice(DetachDeviceWorkItem->TargetDevice);
-
-    /* Delete the source */
-    IoDeleteDevice(DetachDeviceWorkItem->SourceDevice);
-
-    /* Free the pool we allocated in FltpFastIoDetachDevice */
-    ExFreePoolWithTag(DetachDeviceWorkItem, 0x1234);
-}
-
-VOID
+CODE_SEG("PAGE")
+BOOLEAN
 NTAPI
-FltpFastIoDetachDevice(_In_ PDEVICE_OBJECT SourceDevice,
-                     _In_ PDEVICE_OBJECT TargetDevice)
+FltpFastIoQueryStandardInfo(_In_ PFILE_OBJECT FileObject,
+                            _In_ BOOLEAN Wait,
+                            _Out_ PFILE_STANDARD_INFORMATION Buffer,
+                            _Out_ PIO_STATUS_BLOCK IoStatus,
+                            _In_ PDEVICE_OBJECT DeviceObject)
 {
-    PDETACH_DEVICE_WORK_ITEM DetachDeviceWorkItem;
+    PFLTMGR_DEVICE_EXTENSION DeviceExtension;
+    PDEVICE_OBJECT AttachedDeviceObject;
+    PFAST_IO_DISPATCH FastIoDispatch;
     PAGED_CODE();
-    /*
-     * Detaching and deleting devices is a lot of work and takes too long
-     * to be a worthwhile FastIo candidate, so we defer this call to speed
-     * it up. There's no return value so we're okay to do this.
-     */
-
-    /* Allocate the work item and it's corresponding data */
-    DetachDeviceWorkItem = ExAllocatePoolWithTag(NonPagedPool,
-                                                 sizeof(DETACH_DEVICE_WORK_ITEM),
-                                                 0x1234);
-    if (DetachDeviceWorkItem)
+    /* If it doesn't have a device extension, then it's not our device object */
+    if (DeviceObject->DeviceExtension == NULL)
     {
-        /* Initialize the work item */
-        ExInitializeWorkItem(&DetachDeviceWorkItem->WorkItem,
-                             FltpFastIoDetachDeviceWorker,
-                             DetachDeviceWorkItem);
-
-        /* Queue the work item and return the call */
-        ExQueueWorkItem(&DetachDeviceWorkItem->WorkItem,
-                        DelayedWorkQueue);
+        /* Fail the call */
+        IoStatus->Status = STATUS_INVALID_DEVICE_REQUEST;
+        IoStatus->Information = 0;
+        return TRUE;
     }
-    else
+
+    DeviceExtension = DeviceObject->DeviceExtension;
+    FLT_ASSERT(DeviceExtension->AttachedToDeviceObject);
+
+    /* Get the device that we attached to */
+    AttachedDeviceObject = DeviceExtension->AttachedToDeviceObject;
+    FastIoDispatch = AttachedDeviceObject->DriverObject->FastIoDispatch;
+
+    /* Make sure our FastIo table is valid */
+    if (FastIoDispatch && FastIoDispatch->FastIoQueryStandardInfo)
     {
-        /* We failed to defer, just cleanup here */
-        FltpCleanupDeviceObject(SourceDevice);
-        IoDetachDevice(TargetDevice);
-        IoDeleteDevice(SourceDevice);
+        /* Forward the call onto the device we attached to */
+        return FastIoDispatch->FastIoQueryStandardInfo(FileObject,
+                                                       Wait,
+                                                       Buffer,
+                                                       IoStatus,
+                                                       AttachedDeviceObject);
     }
+    /* We failed to handle the request, send it down the slow path */
+    FLT_ASSERT(FALSE);
+    return FALSE;
 }
+CODE_SEG("PAGE")
 BOOLEAN
 NTAPI
-FltpFastIoQueryNetworkOpenInfo(_In_ PFILE_OBJECT FileObject,
-                               _In_ BOOLEAN Wait,
-                               _Out_ PFILE_NETWORK_OPEN_INFORMATION Buffer,
-                               _Out_ PIO_STATUS_BLOCK IoStatus,
-                               _In_ PDEVICE_OBJECT DeviceObject)
+FltpFastIoLock(_In_ PFILE_OBJECT FileObject,
+               _In_ PLARGE_INTEGER FileOffset,
+               _In_ PLARGE_INTEGER Length,
+               _In_ PEPROCESS ProcessId,
+               _In_ ULONG Key,
+               _In_ BOOLEAN FailImmediately,
+               _In_ BOOLEAN ExclusiveLock,
+               _Out_ PIO_STATUS_BLOCK IoStatus,
+               _In_ PDEVICE_OBJECT DeviceObject)
 {
     PFLTMGR_DEVICE_EXTENSION DeviceExtension;
     PDEVICE_OBJECT AttachedDeviceObject;
@@ -1173,14 +943,18 @@ FltpFastIoQueryNetworkOpenInfo(_In_ PFILE_OBJECT FileObject,
     FastIoDispatch = AttachedDeviceObject->DriverObject->FastIoDispatch;
     /* Make sure our FastIo table is valid */
-    if (FastIoDispatch && FastIoDispatch->FastIoQueryNetworkOpenInfo)
+    if (FastIoDispatch && FastIoDispatch->FastIoLock)
     {
         /* Forward the call onto the device we attached to */
-        return FastIoDispatch->FastIoQueryNetworkOpenInfo(FileObject,
-                                                          Wait,
-                                                          Buffer,
-                                                          IoStatus,
-                                                          AttachedDeviceObject);
+        return FastIoDispatch->FastIoLock(FileObject,
+                                          FileOffset,
+                                          Length,
+                                          ProcessId,
+                                          Key,
+                                          FailImmediately,
+                                          ExclusiveLock,
+                                          IoStatus,
+                                          AttachedDeviceObject);
     }
     /* We failed to handle the request, send it down the slow path */
@@ -1188,15 +962,16 @@ FltpFastIoQueryNetworkOpenInfo(_In_ PFILE_OBJECT FileObject,
     return FALSE;
 }
+CODE_SEG("PAGE")
 BOOLEAN
 NTAPI
-FltpFastIoMdlRead(_In_ PFILE_OBJECT FileObject,
-                  _In_ PLARGE_INTEGER FileOffset,
-                  _In_ ULONG Length,
-                  _In_ ULONG LockKey,
-                  _Out_ PMDL *MdlChain,
-                  _Out_ PIO_STATUS_BLOCK IoStatus,
-                  _In_ PDEVICE_OBJECT DeviceObject)
+FltpFastIoUnlockSingle(_In_ PFILE_OBJECT FileObject,
+                       _In_ PLARGE_INTEGER FileOffset,
+                       _In_ PLARGE_INTEGER Length,
+                       _In_ PEPROCESS ProcessId,
+                       _In_ ULONG Key,
+                       _Out_ PIO_STATUS_BLOCK IoStatus,
+                       _In_ PDEVICE_OBJECT DeviceObject)
 {
     PFLTMGR_DEVICE_EXTENSION DeviceExtension;
     PDEVICE_OBJECT AttachedDeviceObject;
@@ -1221,16 +996,16 @@ FltpFastIoMdlRead(_In_ PFILE_OBJECT FileObject,
     FastIoDispatch = AttachedDeviceObject->DriverObject->FastIoDispatch;
     /* Make sure our FastIo table is valid */
-    if (FastIoDispatch && FastIoDispatch->MdlRead)
+    if (FastIoDispatch && FastIoDispatch->FastIoUnlockSingle)
     {
         /* Forward the call onto the device we attached to */
-        return FastIoDispatch->MdlRead(FileObject,
-                                       FileOffset,
-                                       Length,
-                                       LockKey,
-                                       MdlChain,
-                                       IoStatus,
-                                       AttachedDeviceObject);
+        return FastIoDispatch->FastIoUnlockSingle(FileObject,
+                                                  FileOffset,
+                                                  Length,
+                                                  ProcessId,
+                                                  Key,
+                                                  IoStatus,
+                                                  AttachedDeviceObject);
     }
     /* We failed to handle the request, send it down the slow path */
@@ -1238,11 +1013,13 @@ FltpFastIoMdlRead(_In_ PFILE_OBJECT FileObject,
     return FALSE;
 }
+CODE_SEG("PAGE")
 BOOLEAN
 NTAPI
-FltpFastIoMdlReadComplete(_In_ PFILE_OBJECT FileObject,
-                          _In_ PMDL MdlChain,
-                          _In_ PDEVICE_OBJECT DeviceObject)
+FltpFastIoUnlockAll(_In_ PFILE_OBJECT FileObject,
+                    _In_ PEPROCESS ProcessId,
+                    _Out_ PIO_STATUS_BLOCK IoStatus,
+                    _In_ PDEVICE_OBJECT DeviceObject)
 {
     PFLTMGR_DEVICE_EXTENSION DeviceExtension;
@@ -1254,8 +1031,10 @@ FltpFastIoMdlReadComplete(_In_ PFILE_OBJECT FileObject,
     /* If it doesn't have a device extension, then it's not our device object */
     if (DeviceObject->DeviceExtension == NULL)
     {
-        /* Fail the request, send it down the slow path */
-        return FALSE;
+        /* Fail the call */
+        IoStatus->Status = STATUS_INVALID_DEVICE_REQUEST;
+        IoStatus->Information = 0;
+        return TRUE;
     }
     DeviceExtension = DeviceObject->DeviceExtension;
@@ -1266,11 +1045,12 @@ FltpFastIoMdlReadComplete(_In_ PFILE_OBJECT FileObject,
     FastIoDispatch = AttachedDeviceObject->DriverObject->FastIoDispatch;
     /* Make sure our FastIo table is valid */
-    if (FastIoDispatch && FastIoDispatch->MdlReadComplete)
+    if (FastIoDispatch && FastIoDispatch->FastIoUnlockAll)
     {
         /* Forward the call onto the device we attached to */
-        return FastIoDispatch->MdlReadComplete(FileObject,
-                                               MdlChain,
+        return FastIoDispatch->FastIoUnlockAll(FileObject,
+                                               ProcessId,
+                                               IoStatus,
                                                AttachedDeviceObject);
     }
@@ -1279,15 +1059,14 @@ FltpFastIoMdlReadComplete(_In_ PFILE_OBJECT FileObject,
     return FALSE;
 }
+CODE_SEG("PAGE")
 BOOLEAN
 NTAPI
-FltpFastIoPrepareMdlWrite(_In_ PFILE_OBJECT FileObject,
-                          _In_ PLARGE_INTEGER FileOffset,
-                          _In_ ULONG Length,
-                          _In_ ULONG LockKey,
-                          _Out_ PMDL *MdlChain,
-                          _Out_ PIO_STATUS_BLOCK IoStatus,
-                          _In_ PDEVICE_OBJECT DeviceObject)
+FltpFastIoUnlockAllByKey(_In_ PFILE_OBJECT FileObject,
+                         _In_ PVOID ProcessId,
+                         _In_ ULONG Key,
+                         _Out_ PIO_STATUS_BLOCK IoStatus,
+                         _In_ PDEVICE_OBJECT DeviceObject)
 {
     PFLTMGR_DEVICE_EXTENSION DeviceExtension;
     PDEVICE_OBJECT AttachedDeviceObject;
@@ -1312,16 +1091,14 @@ FltpFastIoPrepareMdlWrite(_In_ PFILE_OBJECT FileObject,
     FastIoDispatch = AttachedDeviceObject->DriverObject->FastIoDispatch;
     /* Make sure our FastIo table is valid */
-    if (FastIoDispatch && FastIoDispatch->PrepareMdlWrite)
+    if (FastIoDispatch && FastIoDispatch->FastIoUnlockAllByKey)
     {
         /* Forward the call onto the device we attached to */
-        return FastIoDispatch->PrepareMdlWrite(FileObject,
-                                               FileOffset,
-                                               Length,
-                                               LockKey,
-                                               MdlChain,
-                                               IoStatus,
-                                               AttachedDeviceObject);
+        return FastIoDispatch->FastIoUnlockAllByKey(FileObject,
+                                                    ProcessId,
+                                                    Key,
+                                                    IoStatus,
+                                                    AttachedDeviceObject);
     }
     /* We failed to handle the request, send it down the slow path */
@@ -1329,12 +1106,18 @@ FltpFastIoPrepareMdlWrite(_In_ PFILE_OBJECT FileObject,
     return FALSE;
 }
+CODE_SEG("PAGE")
 BOOLEAN
 NTAPI
-FltpFastIoMdlWriteComplete(_In_ PFILE_OBJECT FileObject,
-                           _In_ PLARGE_INTEGER FileOffset,
-                           _In_ PMDL MdlChain,
-                           _In_ PDEVICE_OBJECT DeviceObject)
+FltpFastIoDeviceControl(_In_ PFILE_OBJECT FileObject,
+                        _In_ BOOLEAN Wait,
+                        _In_opt_ PVOID InputBuffer,
+                        _In_ ULONG InputBufferLength,
+                        _Out_opt_ PVOID OutputBuffer,
+                        _In_ ULONG OutputBufferLength,
+                        _In_ ULONG IoControlCode,
+                        _Out_ PIO_STATUS_BLOCK IoStatus,
+                        _In_ PDEVICE_OBJECT DeviceObject)
 {
     PFLTMGR_DEVICE_EXTENSION DeviceExtension;
     PDEVICE_OBJECT AttachedDeviceObject;
@@ -1357,13 +1140,18 @@ FltpFastIoMdlWriteComplete(_In_ PFILE_OBJECT FileObject,
     FastIoDispatch = AttachedDeviceObject->DriverObject->FastIoDispatch;
     /* Make sure our FastIo table is valid */
-    if (FastIoDispatch && FastIoDispatch->MdlWriteComplete)
+    if (FastIoDispatch && FastIoDispatch->FastIoDeviceControl)
     {
         /* Forward the call onto the device we attached to */
-        return FastIoDispatch->MdlWriteComplete(FileObject,
-                                               FileOffset,
-                                               MdlChain,
-                                               AttachedDeviceObject);
+        return FastIoDispatch->FastIoDeviceControl(FileObject,
+                                                   Wait,
+                                                   InputBuffer,
+                                                   InputBufferLength,
+                                                   OutputBuffer,
+                                                   OutputBufferLength,
+                                                   IoControlCode,
+                                                   IoStatus,
+                                                   AttachedDeviceObject);
     }
     /* We failed to handle the request, send it down the slow path */
@@ -1371,119 +1159,74 @@ FltpFastIoMdlWriteComplete(_In_ PFILE_OBJECT FileObject,
     return FALSE;
 }
-BOOLEAN
+VOID
 NTAPI
-FltpFastIoReadCompressed(_In_ PFILE_OBJECT FileObject,
-                         _In_ PLARGE_INTEGER FileOffset,
-                         _In_ ULONG Length,
-                         _In_ ULONG LockKey,
-                         _Out_ PVOID Buffer,
-                         _Out_ PMDL *MdlChain,
-                         _Out_ PIO_STATUS_BLOCK IoStatus,
-                         _Out_ PCOMPRESSED_DATA_INFO CompressedDataInfo,
-                         _In_ ULONG CompressedDataInfoLength,
-                         _In_ PDEVICE_OBJECT DeviceObject)
+FltpFastIoDetachDeviceWorker(_In_ PVOID Parameter)
 {
-    PFLTMGR_DEVICE_EXTENSION DeviceExtension;
-    PDEVICE_OBJECT AttachedDeviceObject;
-    PFAST_IO_DISPATCH FastIoDispatch;
-
-    PAGED_CODE();
-
-    /* If it doesn't have a device extension, then it's not our device object */
-    if (DeviceObject->DeviceExtension == NULL)
-    {
-        /* Fail the request, send it down the slow path */
-        return FALSE;
-    }
+    PDETACH_DEVICE_WORK_ITEM DetachDeviceWorkItem = Parameter;
-    DeviceExtension = DeviceObject->DeviceExtension;
-    FLT_ASSERT(DeviceExtension->AttachedToDeviceObject);
+    /* Run any cleanup routines */
+    FltpCleanupDeviceObject(DetachDeviceWorkItem->SourceDevice);
-    /* Get the device that we attached to */
-    AttachedDeviceObject = DeviceExtension->AttachedToDeviceObject;
-    FastIoDispatch = AttachedDeviceObject->DriverObject->FastIoDispatch;
+    /* Detach from the target device */
+    IoDetachDevice(DetachDeviceWorkItem->TargetDevice);
-    /* Make sure our FastIo table is valid */
-    if (FastIoDispatch && FastIoDispatch->FastIoReadCompressed)
-    {
-        /* Forward the call onto the device we attached to */
-        return FastIoDispatch->FastIoReadCompressed(FileObject,
-                                                    FileOffset,
-                                                    Length,
-                                                    LockKey,
-                                                    Buffer,
-                                                    MdlChain,
-                                                    IoStatus,
-                                                    CompressedDataInfo,
-                                                    CompressedDataInfoLength,
-                                                    AttachedDeviceObject);
-    }
+    /* Delete the source */
+    IoDeleteDevice(DetachDeviceWorkItem->SourceDevice);
-    /* We failed to handle the request, send it down the slow path */
-    FLT_ASSERT(FALSE);
-    return FALSE;
+    /* Free the pool we allocated in FltpFastIoDetachDevice */
+    ExFreePoolWithTag(DetachDeviceWorkItem, 0x1234);
 }
-BOOLEAN
+CODE_SEG("PAGE")
+VOID
 NTAPI
-FltpFastIoWriteCompressed(_In_ PFILE_OBJECT FileObject,
-                          _In_ PLARGE_INTEGER FileOffset,
-                          _In_ ULONG Length,
-                          _In_ ULONG LockKey,
-                          _In_ PVOID Buffer,
-                          _Out_ PMDL *MdlChain,
-                          _Out_ PIO_STATUS_BLOCK IoStatus,
-                          _In_ PCOMPRESSED_DATA_INFO CompressedDataInfo,
-                          _In_ ULONG CompressedDataInfoLength,
-                          _In_ PDEVICE_OBJECT DeviceObject)
+FltpFastIoDetachDevice(_In_ PDEVICE_OBJECT SourceDevice,
+                     _In_ PDEVICE_OBJECT TargetDevice)
 {
-    PFLTMGR_DEVICE_EXTENSION DeviceExtension;
-    PDEVICE_OBJECT AttachedDeviceObject;
-    PFAST_IO_DISPATCH FastIoDispatch;
+    PDETACH_DEVICE_WORK_ITEM DetachDeviceWorkItem;
     PAGED_CODE();
-    /* If it doesn't have a device extension, then it's not our device object */
-    if (DeviceObject->DeviceExtension == NULL)
-    {
-        /* Fail the request, send it down the slow path */
-        return FALSE;
-    }
-
-    DeviceExtension = DeviceObject->DeviceExtension;
-    FLT_ASSERT(DeviceExtension->AttachedToDeviceObject);
+    /*
+     * Detaching and deleting devices is a lot of work and takes too long
+     * to be a worthwhile FastIo candidate, so we defer this call to speed
+     * it up. There's no return value so we're okay to do this.
+     */
-    /* Get the device that we attached to */
-    AttachedDeviceObject = DeviceExtension->AttachedToDeviceObject;
-    FastIoDispatch = AttachedDeviceObject->DriverObject->FastIoDispatch;
+    /* Allocate the work item and it's corresponding data */
+    DetachDeviceWorkItem = ExAllocatePoolWithTag(NonPagedPool,
+                                                 sizeof(DETACH_DEVICE_WORK_ITEM),
+                                                 0x1234);
+    if (DetachDeviceWorkItem)
+    {
+        /* Initialize the work item */
+        ExInitializeWorkItem(&DetachDeviceWorkItem->WorkItem,
+                             FltpFastIoDetachDeviceWorker,
+                             DetachDeviceWorkItem);
-    /* Make sure our FastIo table is valid */
-    if (FastIoDispatch && FastIoDispatch->FastIoWriteCompressed)
+        /* Queue the work item and return the call */
+        ExQueueWorkItem(&DetachDeviceWorkItem->WorkItem,
+                        DelayedWorkQueue);
+    }
+    else
     {
-        /* Forward the call onto the device we attached to */
-        return FastIoDispatch->FastIoWriteCompressed(FileObject,
-                                                     FileOffset,
-                                                     Length,
-                                                     LockKey,
-                                                     Buffer,
-                                                     MdlChain,
-                                                     IoStatus,
-                                                     CompressedDataInfo,
-                                                     CompressedDataInfoLength,
-                                                     AttachedDeviceObject);
+        /* We failed to defer, just cleanup here */
+        FltpCleanupDeviceObject(SourceDevice);
+        IoDetachDevice(TargetDevice);
+        IoDeleteDevice(SourceDevice);
     }
-    /* We failed to handle the request, send it down the slow path */
-    FLT_ASSERT(FALSE);
-    return FALSE;
 }
+CODE_SEG("PAGE")
 BOOLEAN
 NTAPI
-FltpFastIoMdlReadCompleteCompressed(_In_ PFILE_OBJECT FileObject,
-                                    _In_ PMDL MdlChain,
-                                    _In_ PDEVICE_OBJECT DeviceObject)
+FltpFastIoQueryNetworkOpenInfo(_In_ PFILE_OBJECT FileObject,
+                               _In_ BOOLEAN Wait,
+                               _Out_ PFILE_NETWORK_OPEN_INFORMATION Buffer,
+                               _Out_ PIO_STATUS_BLOCK IoStatus,
+                               _In_ PDEVICE_OBJECT DeviceObject)
 {
     PFLTMGR_DEVICE_EXTENSION DeviceExtension;
     PDEVICE_OBJECT AttachedDeviceObject;
@@ -1494,7 +1237,10 @@ FltpFastIoMdlReadCompleteCompressed(_In_ PFILE_OBJECT FileObject,
     /* If it doesn't have a device extension, then it's not our device object */
     if (DeviceObject->DeviceExtension == NULL)
     {
-        return FALSE;
+        /* Fail the call */
+        IoStatus->Status = STATUS_INVALID_DEVICE_REQUEST;
+        IoStatus->Information = 0;
+        return TRUE;
     }
     DeviceExtension = DeviceObject->DeviceExtension;
@@ -1505,12 +1251,14 @@ FltpFastIoMdlReadCompleteCompressed(_In_ PFILE_OBJECT FileObject,
     FastIoDispatch = AttachedDeviceObject->DriverObject->FastIoDispatch;
     /* Make sure our FastIo table is valid */
-    if (FastIoDispatch && FastIoDispatch->MdlReadCompleteCompressed)
+    if (FastIoDispatch && FastIoDispatch->FastIoQueryNetworkOpenInfo)
     {
         /* Forward the call onto the device we attached to */
-        return FastIoDispatch->MdlReadCompleteCompressed(FileObject,
-                                                         MdlChain,
-                                                         AttachedDeviceObject);
+        return FastIoDispatch->FastIoQueryNetworkOpenInfo(FileObject,
+                                                          Wait,
+                                                          Buffer,
+                                                          IoStatus,
+                                                          AttachedDeviceObject);
     }
     /* We failed to handle the request, send it down the slow path */
@@ -1518,12 +1266,16 @@ FltpFastIoMdlReadCompleteCompressed(_In_ PFILE_OBJECT FileObject,
     return FALSE;
 }
+CODE_SEG("PAGE")
 BOOLEAN
 NTAPI
-FltpFastIoMdlWriteCompleteCompressed(_In_ PFILE_OBJECT FileObject,
-                                     _In_ PLARGE_INTEGER FileOffset,
-                                     _In_ PMDL MdlChain,
-                                     _In_ PDEVICE_OBJECT DeviceObject)
+FltpFastIoMdlRead(_In_ PFILE_OBJECT FileObject,
+                  _In_ PLARGE_INTEGER FileOffset,
+                  _In_ ULONG Length,
+                  _In_ ULONG LockKey,
+                  _Out_ PMDL *MdlChain,
+                  _Out_ PIO_STATUS_BLOCK IoStatus,
+                  _In_ PDEVICE_OBJECT DeviceObject)
 {
     PFLTMGR_DEVICE_EXTENSION DeviceExtension;
     PDEVICE_OBJECT AttachedDeviceObject;
@@ -1534,7 +1286,10 @@ FltpFastIoMdlWriteCompleteCompressed(_In_ PFILE_OBJECT FileObject,
     /* If it doesn't have a device extension, then it's not our device object */
     if (DeviceObject->DeviceExtension == NULL)
     {
-        return FALSE;
+        /* Fail the call */
+        IoStatus->Status = STATUS_INVALID_DEVICE_REQUEST;
+        IoStatus->Information = 0;
+        return TRUE;
     }
     DeviceExtension = DeviceObject->DeviceExtension;
@@ -1545,13 +1300,16 @@ FltpFastIoMdlWriteCompleteCompressed(_In_ PFILE_OBJECT FileObject,
     FastIoDispatch = AttachedDeviceObject->DriverObject->FastIoDispatch;
     /* Make sure our FastIo table is valid */
-    if (FastIoDispatch && FastIoDispatch->MdlWriteCompleteCompressed)
+    if (FastIoDispatch && FastIoDispatch->MdlRead)
     {
         /* Forward the call onto the device we attached to */
-        return FastIoDispatch->MdlWriteCompleteCompressed(FileObject,
-                                                          FileOffset,
-                                                          MdlChain,
-                                                          AttachedDeviceObject);
+        return FastIoDispatch->MdlRead(FileObject,
+                                       FileOffset,
+                                       Length,
+                                       LockKey,
+                                       MdlChain,
+                                       IoStatus,
+                                       AttachedDeviceObject);
     }
     /* We failed to handle the request, send it down the slow path */
@@ -1559,22 +1317,24 @@ FltpFastIoMdlWriteCompleteCompressed(_In_ PFILE_OBJECT FileObject,
     return FALSE;
 }
+CODE_SEG("PAGE")
 BOOLEAN
 NTAPI
-FltpFastIoQueryOpen(_Inout_ PIRP Irp,
-                    _Out_ PFILE_NETWORK_OPEN_INFORMATION NetworkInformation,
-                    _In_ PDEVICE_OBJECT DeviceObject)
+FltpFastIoMdlReadComplete(_In_ PFILE_OBJECT FileObject,
+                          _In_ PMDL MdlChain,
+                          _In_ PDEVICE_OBJECT DeviceObject)
+
 {
     PFLTMGR_DEVICE_EXTENSION DeviceExtension;
     PDEVICE_OBJECT AttachedDeviceObject;
     PFAST_IO_DISPATCH FastIoDispatch;
-    BOOLEAN Success;
     PAGED_CODE();
     /* If it doesn't have a device extension, then it's not our device object */
     if (DeviceObject->DeviceExtension == NULL)
     {
+        /* Fail the request, send it down the slow path */
         return FALSE;
     }
@@ -1586,21 +1346,12 @@ FltpFastIoQueryOpen(_Inout_ PIRP Irp,
     FastIoDispatch = AttachedDeviceObject->DriverObject->FastIoDispatch;
     /* Make sure our FastIo table is valid */
-    if (FastIoDispatch && FastIoDispatch->FastIoQueryOpen)
+    if (FastIoDispatch && FastIoDispatch->MdlReadComplete)
     {
-        PIO_STACK_LOCATION StackPtr = IoGetCurrentIrpStackLocation(Irp);
-
-        /* Update the stack to contain the correct device for the next filter */
-        StackPtr->DeviceObject = AttachedDeviceObject;
-
-        /* Now forward the call */
-        Success = FastIoDispatch->FastIoQueryOpen(Irp,
-                                                  NetworkInformation,
-                                                  AttachedDeviceObject);
-
-        /* Restore the DeviceObject as we found it */
-        StackPtr->DeviceObject = DeviceObject;
-        return Success;
+        /* Forward the call onto the device we attached to */
+        return FastIoDispatch->MdlReadComplete(FileObject,
+                                               MdlChain,
+                                               AttachedDeviceObject);
     }
     /* We failed to handle the request, send it down the slow path */
@@ -1608,430 +1359,346 @@ FltpFastIoQueryOpen(_Inout_ PIRP Irp,
     return FALSE;
 }
-
-
-/* FUNCTIONS **********************************************/
-
-static
-VOID
-FltpCleanupDeviceObject(_In_ PDEVICE_OBJECT DeviceObject)
-{
-    PFLTMGR_DEVICE_EXTENSION DeviceExtension;
-
-    DeviceExtension = DeviceObject->DeviceExtension;
-    if (DeviceExtension)
-    {
-        // cleanup device extension
-    }
-}
-
-static
-NTSTATUS
-FltpAttachDeviceObject(_In_ PDEVICE_OBJECT SourceDevice,
-                       _In_ PDEVICE_OBJECT TargetDevice,
-                       _Out_ PDEVICE_OBJECT *AttachedToDeviceObject)
-{
-    NTSTATUS Status;
-
-    PAGED_CODE();
-
-    /* Before attaching, copy the flags from the device we're going to attach to */
-    if (FlagOn(SourceDevice->Flags, DO_BUFFERED_IO))
-    {
-        SetFlag(TargetDevice->Flags, DO_BUFFERED_IO);
-    }
-    if (FlagOn(SourceDevice->Flags, DO_DIRECT_IO))
-    {
-        SetFlag(TargetDevice->Flags, DO_DIRECT_IO);
-    }
-    if (FlagOn(SourceDevice->Flags, DO_SYSTEM_BOOT_PARTITION))
-    {
-        SetFlag(TargetDevice->Characteristics, FILE_DEVICE_SECURE_OPEN);
-    }
-
-    /* Attach this device to the top of the driver stack */
-    Status = IoAttachDeviceToDeviceStackSafe(SourceDevice,
-                                             TargetDevice,
-                                             AttachedToDeviceObject);
-
-    return Status;
-}
-
-static
+CODE_SEG("PAGE")
 BOOLEAN
-FltpIsAttachedToDevice(_In_ PDEVICE_OBJECT DeviceObject,
-                       _In_opt_ PDEVICE_OBJECT *AttachedDeviceObject)
-{
-    PDEVICE_OBJECT CurrentDeviceObject;
-    PDEVICE_OBJECT NextDeviceObject;
-
-    PAGED_CODE();
-
-    /* Initialize the return pointer */
-    if (AttachedDeviceObject) *AttachedDeviceObject = NULL;
-
-    /* Start by getting the top level device in the chain */
-    CurrentDeviceObject = IoGetAttachedDeviceReference(DeviceObject);
-
-    /* Loop while there are attached devices */
-    while (CurrentDeviceObject)
-    {
-        /* Check if this device driver matches ours */
-        if (CurrentDeviceObject->DriverObject == DriverData.DriverObject)
-        {
-            FLT_ASSERT(CurrentDeviceObject->DeviceExtension != NULL);
-
-            /* We're attached, return the device object if the caller asked for it */
-            if (AttachedDeviceObject)
-            {
-                *AttachedDeviceObject = CurrentDeviceObject;
-            }
-            else
-            {
-                /* We aren't returning the reference, so decrement the count */
-                ObDereferenceObject(CurrentDeviceObject);
-            }
-
-            return TRUE;
-        }
-
-        /* Get the next device in the chain */
-        NextDeviceObject = IoGetLowerDeviceObject(CurrentDeviceObject);
-
-        /* Decrement the count on the last device before we update the pointer */
-        ObDereferenceObject(CurrentDeviceObject);
-        CurrentDeviceObject = NextDeviceObject;
-    }
-
-    return FALSE;
-}
-
-static
-NTSTATUS
-FltpEnumerateFileSystemVolumes(_In_ PDEVICE_OBJECT DeviceObject)
+NTAPI
+FltpFastIoPrepareMdlWrite(_In_ PFILE_OBJECT FileObject,
+                          _In_ PLARGE_INTEGER FileOffset,
+                          _In_ ULONG Length,
+                          _In_ ULONG LockKey,
+                          _Out_ PMDL *MdlChain,
+                          _Out_ PIO_STATUS_BLOCK IoStatus,
+                          _In_ PDEVICE_OBJECT DeviceObject)
 {
-    PFLTMGR_DEVICE_EXTENSION NewDeviceExtension;
-    PDEVICE_OBJECT BaseDeviceObject;
-    PDEVICE_OBJECT NewDeviceObject;
-    PDEVICE_OBJECT *DeviceList;
-    PDEVICE_OBJECT StorageStackDeviceObject;
-    UNICODE_STRING DeviceName;
-    ULONG NumDevices;
-    ULONG i;
-    NTSTATUS Status;
+    PFLTMGR_DEVICE_EXTENSION DeviceExtension;
+    PDEVICE_OBJECT AttachedDeviceObject;
+    PFAST_IO_DISPATCH FastIoDispatch;
     PAGED_CODE();
-    /* Get the base device */
-    BaseDeviceObject = IoGetDeviceAttachmentBaseRef(DeviceObject);
-
-    /* get the number of device object linked to the base file system */
-    Status = IoEnumerateDeviceObjectList(BaseDeviceObject->DriverObject,
-                                         NULL,
-                                         0,
-                                         &NumDevices);
-    if (Status != STATUS_BUFFER_TOO_SMALL) return Status;
-
-    /* Add a few more slots in case the size changed between calls and allocate some
memory to hold the pointers */
-    NumDevices += 4;
-    DeviceList = ExAllocatePoolWithTag(NonPagedPool,
-                                       (NumDevices * sizeof(PDEVICE_OBJECT)),
-                                       FM_TAG_DEV_OBJ_PTRS);
-    if (DeviceList == NULL) return STATUS_INSUFFICIENT_RESOURCES;
-
-    /* Now get all the device objects that this base driver has created */
-    Status = IoEnumerateDeviceObjectList(BaseDeviceObject->DriverObject,
-                                         DeviceList,
-                                         (NumDevices * sizeof(PDEVICE_OBJECT)),
-                                         &NumDevices);
-    if (!NT_SUCCESS(Status))
-    {
-        ExFreePoolWithTag(DeviceList, FM_TAG_DEV_OBJ_PTRS);
-        return Status;
-    }
-
-    /* Loop through all the devices looking for ones to attach to */
-    for (i = 0; i < NumDevices; i++)
+    /* If it doesn't have a device extension, then it's not our device object */
+    if (DeviceObject->DeviceExtension == NULL)
     {
-        RtlInitUnicodeString(&DeviceName, NULL);
-        StorageStackDeviceObject = NULL;
-        NewDeviceObject = NULL;
-
-        /* Ignore the device we passed in, and devices of the wrong type */
-        if ((DeviceList[i] == BaseDeviceObject) ||
-            (DeviceList[i]->DeviceType != BaseDeviceObject->DeviceType))
-        {
-            goto CleanupAndNext;
-        }
-
-        /* Ignore this device if we're already attached to it */
-        if (FltpIsAttachedToDevice(DeviceList[i], NULL) == FALSE)
-        {
-            goto CleanupAndNext;
-        }
-
-
-        /*
-         * If the device has a name, it must be a control device.
-         * This handles drivers with more then one control device (like FastFat)
-         */
-        FltpGetBaseDeviceObjectName(DeviceList[i], &DeviceName);
-        if (NT_SUCCESS(Status) && DeviceName.Length > 0)
-        {
-            goto CleanupAndNext;
-        }
-
-        /*
-         * Try to get the storage stack (disk) device object associated with
-         * this file system device object. Ignore the device if we don't have one
-         */
-        Status = IoGetDiskDeviceObject(DeviceList[i],
-                                       &StorageStackDeviceObject);
-        if (!NT_SUCCESS(Status))
-        {
-            goto CleanupAndNext;
-        }
-
-
-        /*
-         * TODO: Don't attach to shadow copy volumes,
-         * ros doesn't have any so it's not an issues yet
-         */
-
-        /*
-         * We're far enough to be ready to attach, create a device
-         * object which we'll use to do so
-         */
-        Status = IoCreateDevice(DriverData.DriverObject,
-                                sizeof(FLTMGR_DEVICE_EXTENSION),
-                                NULL,
-                                DeviceList[i]->DeviceType,
-                                0,
-                                FALSE,
-                                &NewDeviceObject);
-        if (!NT_SUCCESS(Status))
-        {
-            goto CleanupAndNext;
-        }
-
-        /* Get the device extension for this new object and store our disk object there
*/
-        NewDeviceExtension = NewDeviceObject->DeviceExtension;
-        NewDeviceExtension->StorageStackDeviceObject = StorageStackDeviceObject;
-
-        /* Lookup and store the device name for the storage stack */
-        RtlInitEmptyUnicodeString(&NewDeviceExtension->DeviceName,
-                                  NewDeviceExtension->DeviceNameBuffer,
-                                  sizeof(NewDeviceExtension->DeviceNameBuffer));
-        FltpGetObjectName(StorageStackDeviceObject,
-                          &NewDeviceExtension->DeviceName);
-
-
-        /* Grab the attach lock before we attempt to attach */
-        ExAcquireFastMutex(&DriverData.FilterAttachLock);
-
-        /* Check again that we aren't already attached. It may have changed since our
last check */
-        if (FltpIsAttachedToDevice(DeviceList[i], NULL) == FALSE)
-        {
-            FLT_ASSERT(NewDeviceObject->DriverObject == DriverData.DriverObject);
-
-            /* Finally, attach to the volume */
-            Status = FltpAttachDeviceObject(DeviceList[i],
-                                            NewDeviceObject,
-
&NewDeviceExtension->AttachedToDeviceObject);
-            if (NT_SUCCESS(Status))
-            {
-                /* Clean the initializing flag so other filters can attach to our device
object */
-                ClearFlag(NewDeviceObject->Flags, DO_DEVICE_INITIALIZING);
-            }
-        }
-        else
-        {
-            /* We're already attached. Just cleanup */
-            Status = STATUS_DEVICE_ALREADY_ATTACHED;
-        }
+        /* Fail the call */
+        IoStatus->Status = STATUS_INVALID_DEVICE_REQUEST;
+        IoStatus->Information = 0;
+        return TRUE;
+    }
-        ExReleaseFastMutex(&DriverData.FilterAttachLock);
+    DeviceExtension = DeviceObject->DeviceExtension;
+    FLT_ASSERT(DeviceExtension->AttachedToDeviceObject);
-CleanupAndNext:
+    /* Get the device that we attached to */
+    AttachedDeviceObject = DeviceExtension->AttachedToDeviceObject;
+    FastIoDispatch = AttachedDeviceObject->DriverObject->FastIoDispatch;
-        if (!NT_SUCCESS(Status))
-        {
-            if (NewDeviceObject)
-            {
-                FltpCleanupDeviceObject(NewDeviceObject);
-                IoDeleteDevice(NewDeviceObject);
-            }
-        }
+    /* Make sure our FastIo table is valid */
+    if (FastIoDispatch && FastIoDispatch->PrepareMdlWrite)
+    {
+        /* Forward the call onto the device we attached to */
+        return FastIoDispatch->PrepareMdlWrite(FileObject,
+                                               FileOffset,
+                                               Length,
+                                               LockKey,
+                                               MdlChain,
+                                               IoStatus,
+                                               AttachedDeviceObject);
+    }
-        if (StorageStackDeviceObject)
-        {
-            /* A ref was added for us when we attached, so we can deref ours now */
-            ObDereferenceObject(StorageStackDeviceObject);
-        }
+    /* We failed to handle the request, send it down the slow path */
+    FLT_ASSERT(FALSE);
+    return FALSE;
+}
-        /* Remove the ref which was added by IoEnumerateDeviceObjectList */
-        ObDereferenceObject(DeviceList[i]);
+CODE_SEG("PAGE")
+BOOLEAN
+NTAPI
+FltpFastIoMdlWriteComplete(_In_ PFILE_OBJECT FileObject,
+                           _In_ PLARGE_INTEGER FileOffset,
+                           _In_ PMDL MdlChain,
+                           _In_ PDEVICE_OBJECT DeviceObject)
+{
+    PFLTMGR_DEVICE_EXTENSION DeviceExtension;
+    PDEVICE_OBJECT AttachedDeviceObject;
+    PFAST_IO_DISPATCH FastIoDispatch;
-        /* Free the buffer that FltpGetBaseDeviceObjectName added */
-        FltpFreeUnicodeString(&DeviceName);
+    PAGED_CODE();
+    /* If it doesn't have a device extension, then it's not our device object */
+    if (DeviceObject->DeviceExtension == NULL)
+    {
+        /* Fail the request, send it down the slow path */
+        return FALSE;
     }
-    /* Free the memory we allocated for the list */
-    ExFreePoolWithTag(DeviceList, FM_TAG_DEV_OBJ_PTRS);
+    DeviceExtension = DeviceObject->DeviceExtension;
+    FLT_ASSERT(DeviceExtension->AttachedToDeviceObject);
-    return STATUS_SUCCESS;
+    /* Get the device that we attached to */
+    AttachedDeviceObject = DeviceExtension->AttachedToDeviceObject;
+    FastIoDispatch = AttachedDeviceObject->DriverObject->FastIoDispatch;
+
+    /* Make sure our FastIo table is valid */
+    if (FastIoDispatch && FastIoDispatch->MdlWriteComplete)
+    {
+        /* Forward the call onto the device we attached to */
+        return FastIoDispatch->MdlWriteComplete(FileObject,
+                                               FileOffset,
+                                               MdlChain,
+                                               AttachedDeviceObject);
+    }
+
+    /* We failed to handle the request, send it down the slow path */
+    FLT_ASSERT(FALSE);
+    return FALSE;
 }
-static
-NTSTATUS
-FltpAttachToFileSystemDevice(_In_ PDEVICE_OBJECT DeviceObject,
-                             _In_ PUNICODE_STRING DeviceName)
+CODE_SEG("PAGE")
+BOOLEAN
+NTAPI
+FltpFastIoReadCompressed(_In_ PFILE_OBJECT FileObject,
+                         _In_ PLARGE_INTEGER FileOffset,
+                         _In_ ULONG Length,
+                         _In_ ULONG LockKey,
+                         _Out_ PVOID Buffer,
+                         _Out_ PMDL *MdlChain,
+                         _Out_ PIO_STATUS_BLOCK IoStatus,
+                         _Out_ PCOMPRESSED_DATA_INFO CompressedDataInfo,
+                         _In_ ULONG CompressedDataInfoLength,
+                         _In_ PDEVICE_OBJECT DeviceObject)
 {
     PFLTMGR_DEVICE_EXTENSION DeviceExtension;
-    PDEVICE_OBJECT NewDeviceObject;
-    WCHAR Buffer[MAX_DEVNAME_LENGTH];
-    UNICODE_STRING FileSystemDeviceName;
-    UNICODE_STRING FsRecDeviceName;
-    NTSTATUS Status;
+    PDEVICE_OBJECT AttachedDeviceObject;
+    PFAST_IO_DISPATCH FastIoDispatch;
     PAGED_CODE();
-    /* Only handle device types we're interested in */
-    if (DeviceObject->DeviceType != FILE_DEVICE_DISK_FILE_SYSTEM &&
-        DeviceObject->DeviceType != FILE_DEVICE_CD_ROM_FILE_SYSTEM &&
-        DeviceObject->DeviceType != FILE_DEVICE_NETWORK_FILE_SYSTEM)
+    /* If it doesn't have a device extension, then it's not our device object */
+    if (DeviceObject->DeviceExtension == NULL)
     {
-        return STATUS_SUCCESS;
+        /* Fail the request, send it down the slow path */
+        return FALSE;
     }
-    /* Setup the buffer to hold the device name */
-    RtlInitEmptyUnicodeString(&FileSystemDeviceName,
-                              Buffer,
-                              MAX_DEVNAME_LENGTH * sizeof(WCHAR));
+    DeviceExtension = DeviceObject->DeviceExtension;
+    FLT_ASSERT(DeviceExtension->AttachedToDeviceObject);
-    /* Get the the name of the file system device */
-    Status = FltpGetObjectName(DeviceObject->DriverObject, &FileSystemDeviceName);
-    if (!NT_SUCCESS(Status)) return Status;
+    /* Get the device that we attached to */
+    AttachedDeviceObject = DeviceExtension->AttachedToDeviceObject;
+    FastIoDispatch = AttachedDeviceObject->DriverObject->FastIoDispatch;
-    DPRINT("Found device %wZ, checking if we need to attach...\n",
&FileSystemDeviceName);
+    /* Make sure our FastIo table is valid */
+    if (FastIoDispatch && FastIoDispatch->FastIoReadCompressed)
+    {
+        /* Forward the call onto the device we attached to */
+        return FastIoDispatch->FastIoReadCompressed(FileObject,
+                                                    FileOffset,
+                                                    Length,
+                                                    LockKey,
+                                                    Buffer,
+                                                    MdlChain,
+                                                    IoStatus,
+                                                    CompressedDataInfo,
+                                                    CompressedDataInfoLength,
+                                                    AttachedDeviceObject);
+    }
-    /* Build up the name of the file system recognizer device */
-    RtlInitUnicodeString(&FsRecDeviceName, L"\\FileSystem\\Fs_Rec");
+    /* We failed to handle the request, send it down the slow path */
+    FLT_ASSERT(FALSE);
+    return FALSE;
+}
-    /* We don't attach to recognizer devices, so bail if this is one */
-    if (RtlCompareUnicodeString(&FileSystemDeviceName, &FsRecDeviceName, TRUE) ==
0)
+CODE_SEG("PAGE")
+BOOLEAN
+NTAPI
+FltpFastIoWriteCompressed(_In_ PFILE_OBJECT FileObject,
+                          _In_ PLARGE_INTEGER FileOffset,
+                          _In_ ULONG Length,
+                          _In_ ULONG LockKey,
+                          _In_ PVOID Buffer,
+                          _Out_ PMDL *MdlChain,
+                          _Out_ PIO_STATUS_BLOCK IoStatus,
+                          _In_ PCOMPRESSED_DATA_INFO CompressedDataInfo,
+                          _In_ ULONG CompressedDataInfoLength,
+                          _In_ PDEVICE_OBJECT DeviceObject)
+{
+    PFLTMGR_DEVICE_EXTENSION DeviceExtension;
+    PDEVICE_OBJECT AttachedDeviceObject;
+    PFAST_IO_DISPATCH FastIoDispatch;
+
+    PAGED_CODE();
+
+    /* If it doesn't have a device extension, then it's not our device object */
+    if (DeviceObject->DeviceExtension == NULL)
     {
-        return STATUS_SUCCESS;
+        /* Fail the request, send it down the slow path */
+        return FALSE;
     }
-    /* Create a device object which we can attach to this file system */
-    Status = IoCreateDevice(DriverData.DriverObject,
-                            sizeof(FLTMGR_DEVICE_EXTENSION),
-                            NULL,
-                            DeviceObject->DeviceType,
-                            0,
-                            FALSE,
-                            &NewDeviceObject);
-    if (!NT_SUCCESS(Status))
+    DeviceExtension = DeviceObject->DeviceExtension;
+    FLT_ASSERT(DeviceExtension->AttachedToDeviceObject);
+
+    /* Get the device that we attached to */
+    AttachedDeviceObject = DeviceExtension->AttachedToDeviceObject;
+    FastIoDispatch = AttachedDeviceObject->DriverObject->FastIoDispatch;
+
+    /* Make sure our FastIo table is valid */
+    if (FastIoDispatch && FastIoDispatch->FastIoWriteCompressed)
     {
-        DPRINT1("Failed to create a DO for attaching to a FS : 0x%X\n",
Status);
-        return Status;
+        /* Forward the call onto the device we attached to */
+        return FastIoDispatch->FastIoWriteCompressed(FileObject,
+                                                     FileOffset,
+                                                     Length,
+                                                     LockKey,
+                                                     Buffer,
+                                                     MdlChain,
+                                                     IoStatus,
+                                                     CompressedDataInfo,
+                                                     CompressedDataInfoLength,
+                                                     AttachedDeviceObject);
     }
-    /* Cast the device extension to something we understand */
-    DeviceExtension = NewDeviceObject->DeviceExtension;
+    /* We failed to handle the request, send it down the slow path */
+    FLT_ASSERT(FALSE);
+    return FALSE;
+}
-    /* Attach this device to the top of the driver stack and store the DO we attached to
in the DE */
-    Status = FltpAttachDeviceObject(NewDeviceObject,
-                                    DeviceObject,
-                                    &DeviceExtension->AttachedToDeviceObject);
-    if (NT_SUCCESS(Status))
+CODE_SEG("PAGE")
+BOOLEAN
+NTAPI
+FltpFastIoMdlReadCompleteCompressed(_In_ PFILE_OBJECT FileObject,
+                                    _In_ PMDL MdlChain,
+                                    _In_ PDEVICE_OBJECT DeviceObject)
+{
+    PFLTMGR_DEVICE_EXTENSION DeviceExtension;
+    PDEVICE_OBJECT AttachedDeviceObject;
+    PFAST_IO_DISPATCH FastIoDispatch;
+
+    PAGED_CODE();
+
+    /* If it doesn't have a device extension, then it's not our device object */
+    if (DeviceObject->DeviceExtension == NULL)
     {
-        DPRINT("Attached to %wZ\n", &FileSystemDeviceName);
+        return FALSE;
     }
-    else
+
+    DeviceExtension = DeviceObject->DeviceExtension;
+    FLT_ASSERT(DeviceExtension->AttachedToDeviceObject);
+
+    /* Get the device that we attached to */
+    AttachedDeviceObject = DeviceExtension->AttachedToDeviceObject;
+    FastIoDispatch = AttachedDeviceObject->DriverObject->FastIoDispatch;
+
+    /* Make sure our FastIo table is valid */
+    if (FastIoDispatch && FastIoDispatch->MdlReadCompleteCompressed)
     {
-        DPRINT1("Failed to attach to the driver stack : 0x%X\n", Status);
-        goto Cleanup;
+        /* Forward the call onto the device we attached to */
+        return FastIoDispatch->MdlReadCompleteCompressed(FileObject,
+                                                         MdlChain,
+                                                         AttachedDeviceObject);
     }
-    /* Setup the unicode string buffer and copy the device name to the device extension
*/
-    RtlInitEmptyUnicodeString(&DeviceExtension->DeviceName,
-                              DeviceExtension->DeviceNameBuffer,
-                              MAX_DEVNAME_LENGTH * sizeof(WCHAR));
-    RtlCopyUnicodeString(&DeviceExtension->DeviceName, DeviceName);
+    /* We failed to handle the request, send it down the slow path */
+    FLT_ASSERT(FALSE);
+    return FALSE;
+}
-    /* We're done, remove the initializing flag */
-    ClearFlag(NewDeviceObject->Flags, DO_DEVICE_INITIALIZING);
+CODE_SEG("PAGE")
+BOOLEAN
+NTAPI
+FltpFastIoMdlWriteCompleteCompressed(_In_ PFILE_OBJECT FileObject,
+                                     _In_ PLARGE_INTEGER FileOffset,
+                                     _In_ PMDL MdlChain,
+                                     _In_ PDEVICE_OBJECT DeviceObject)
+{
+    PFLTMGR_DEVICE_EXTENSION DeviceExtension;
+    PDEVICE_OBJECT AttachedDeviceObject;
+    PFAST_IO_DISPATCH FastIoDispatch;
-    /* Look for existing mounted devices for this file system */
-    Status = FltpEnumerateFileSystemVolumes(DeviceObject);
-    if (!NT_SUCCESS(Status))
+    PAGED_CODE();
+
+    /* If it doesn't have a device extension, then it's not our device object */
+    if (DeviceObject->DeviceExtension == NULL)
     {
-        DPRINT1("Failed to enumerate file system volumes for this file system :
0x%X\n", Status);
-        IoDetachDevice(DeviceExtension->AttachedToDeviceObject);
+        return FALSE;
     }
-Cleanup:
+    DeviceExtension = DeviceObject->DeviceExtension;
+    FLT_ASSERT(DeviceExtension->AttachedToDeviceObject);
-    if (!NT_SUCCESS(Status))
+    /* Get the device that we attached to */
+    AttachedDeviceObject = DeviceExtension->AttachedToDeviceObject;
+    FastIoDispatch = AttachedDeviceObject->DriverObject->FastIoDispatch;
+
+    /* Make sure our FastIo table is valid */
+    if (FastIoDispatch && FastIoDispatch->MdlWriteCompleteCompressed)
     {
-        IoDeleteDevice(NewDeviceObject);
+        /* Forward the call onto the device we attached to */
+        return FastIoDispatch->MdlWriteCompleteCompressed(FileObject,
+                                                          FileOffset,
+                                                          MdlChain,
+                                                          AttachedDeviceObject);
     }
-    return Status;
+    /* We failed to handle the request, send it down the slow path */
+    FLT_ASSERT(FALSE);
+    return FALSE;
 }
-static
-LONG_PTR
-FltpDetachFromFileSystemDevice(_In_ PDEVICE_OBJECT DeviceObject)
+CODE_SEG("PAGE")
+BOOLEAN
+NTAPI
+FltpFastIoQueryOpen(_Inout_ PIRP Irp,
+                    _Out_ PFILE_NETWORK_OPEN_INFORMATION NetworkInformation,
+                    _In_ PDEVICE_OBJECT DeviceObject)
 {
-    PDEVICE_OBJECT AttachedDevice, NextDevice;
     PFLTMGR_DEVICE_EXTENSION DeviceExtension;
-    LONG_PTR Count;
+    PDEVICE_OBJECT AttachedDeviceObject;
+    PFAST_IO_DISPATCH FastIoDispatch;
+    BOOLEAN Success;
     PAGED_CODE();
-    /* Get the top device in the chain and increment the ref count on it */
-    AttachedDevice = IoGetAttachedDeviceReference(DeviceObject);
-
-    /* Loop all attached devices looking for our file system driver */
-    while (AttachedDevice->DriverObject != DriverData.DriverObject)
+    /* If it doesn't have a device extension, then it's not our device object */
+    if (DeviceObject->DeviceExtension == NULL)
     {
-        FLT_ASSERT(AttachedDevice != NULL);
+        return FALSE;
+    }
-        /* Get the next lower device object. This adds a ref on NextDevice */
-        NextDevice = IoGetLowerDeviceObject(AttachedDevice);
+    DeviceExtension = DeviceObject->DeviceExtension;
+    FLT_ASSERT(DeviceExtension->AttachedToDeviceObject);
-        /* Remove the reference we added */
-        Count = ObDereferenceObject(AttachedDevice);
+    /* Get the device that we attached to */
+    AttachedDeviceObject = DeviceExtension->AttachedToDeviceObject;
+    FastIoDispatch = AttachedDeviceObject->DriverObject->FastIoDispatch;
-        /* Bail if this is the last one */
-        if (NextDevice == NULL) return Count;
+    /* Make sure our FastIo table is valid */
+    if (FastIoDispatch && FastIoDispatch->FastIoQueryOpen)
+    {
+        PIO_STACK_LOCATION StackPtr = IoGetCurrentIrpStackLocation(Irp);
-        /* Try the next one */
-        AttachedDevice = NextDevice;
-    }
+        /* Update the stack to contain the correct device for the next filter */
+        StackPtr->DeviceObject = AttachedDeviceObject;
+        /* Now forward the call */
+        Success = FastIoDispatch->FastIoQueryOpen(Irp,
+                                                  NetworkInformation,
+                                                  AttachedDeviceObject);
-    DeviceExtension = AttachedDevice->DeviceExtension;
-    if (DeviceExtension)
-    {
-        //
-        // FIXME: Put any device extension cleanup code here
-        //
+        /* Restore the DeviceObject as we found it */
+        StackPtr->DeviceObject = DeviceObject;
+        return Success;
     }
-    /* Detach the device from the chain and delete the object */
-    IoDetachDevice(DeviceObject);
-    IoDeleteDevice(AttachedDevice);
-
-    /* Remove the reference we added so the delete can complete */
-    return ObDereferenceObject(AttachedDevice);
+    /* We failed to handle the request, send it down the slow path */
+    FLT_ASSERT(FALSE);
+    return FALSE;
 }
+CODE_SEG("PAGE")
 DRIVER_FS_NOTIFICATION FltpFsNotification;
+
+CODE_SEG("PAGE")
 VOID
 NTAPI
 FltpFsNotification(_In_ PDEVICE_OBJECT DeviceObject,
@@ -2045,7 +1712,7 @@ FltpFsNotification(_In_ PDEVICE_OBJECT DeviceObject,
     /* Set an empty string */
     RtlInitUnicodeString(&DeviceName, NULL);
-    /* Get the name of the lowest device object on the stack */
+    /* Get the name of the lowest device object on the stack */
     Status = FltpGetBaseDeviceObjectName(DeviceObject, &DeviceName);
     if (NT_SUCCESS(Status))
     {
@@ -2066,7 +1733,83 @@ FltpFsNotification(_In_ PDEVICE_OBJECT DeviceObject,
     }
 }
-DRIVER_INITIALIZE DriverEntry;
+static
+CODE_SEG("INIT")
+NTSTATUS
+SetupDispatchAndCallbacksTables(_In_ PDRIVER_OBJECT DriverObject)
+{
+    PFAST_IO_DISPATCH FastIoDispatch;
+    FS_FILTER_CALLBACKS Callbacks;
+    ULONG i;
+
+    /* Plug all the IRPs */
+    for (i = 0; i <= IRP_MJ_MAXIMUM_FUNCTION; i++)
+    {
+        DriverObject->MajorFunction[i] = FltpDispatch;
+    }
+
+    /* Override the ones we're interested in */
+    DriverObject->MajorFunction[IRP_MJ_CREATE] = FltpCreate;
+    DriverObject->MajorFunction[IRP_MJ_CREATE_NAMED_PIPE] = FltpCreate;
+    DriverObject->MajorFunction[IRP_MJ_CREATE_MAILSLOT] = FltpCreate;
+    DriverObject->MajorFunction[IRP_MJ_FILE_SYSTEM_CONTROL] = FltpFsControl;
+    DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = FltpDeviceControl;
+
+    /* The FastIo dispatch table is stored in the pool along with a tag */
+    FastIoDispatch = ExAllocatePoolWithTag(NonPagedPool, sizeof(FAST_IO_DISPATCH),
FM_TAG_DISPATCH_TABLE);
+    if (FastIoDispatch == NULL) return STATUS_INSUFFICIENT_RESOURCES;
+
+    /* Fill out the FastIo table  */
+    RtlZeroMemory(FastIoDispatch, sizeof(FAST_IO_DISPATCH));
+    FastIoDispatch->SizeOfFastIoDispatch = sizeof(FAST_IO_DISPATCH);
+    FastIoDispatch->FastIoCheckIfPossible = FltpFastIoCheckIfPossible;
+    FastIoDispatch->FastIoRead = FltpFastIoRead;
+    FastIoDispatch->FastIoWrite = FltpFastIoWrite;
+    FastIoDispatch->FastIoQueryBasicInfo = FltpFastIoQueryBasicInfo;
+    FastIoDispatch->FastIoQueryStandardInfo = FltpFastIoQueryStandardInfo;
+    FastIoDispatch->FastIoLock = FltpFastIoLock;
+    FastIoDispatch->FastIoUnlockSingle = FltpFastIoUnlockSingle;
+    FastIoDispatch->FastIoUnlockAll = FltpFastIoUnlockAll;
+    FastIoDispatch->FastIoUnlockAllByKey = FltpFastIoUnlockAllByKey;
+    FastIoDispatch->FastIoDeviceControl = FltpFastIoDeviceControl;
+    FastIoDispatch->FastIoDetachDevice = FltpFastIoDetachDevice;
+    FastIoDispatch->FastIoQueryNetworkOpenInfo = FltpFastIoQueryNetworkOpenInfo;
+    FastIoDispatch->MdlRead = FltpFastIoMdlRead;
+    FastIoDispatch->MdlReadComplete = FltpFastIoMdlReadComplete;
+    FastIoDispatch->PrepareMdlWrite = FltpFastIoPrepareMdlWrite;
+    FastIoDispatch->MdlWriteComplete = FltpFastIoMdlWriteComplete;
+    FastIoDispatch->FastIoReadCompressed = FltpFastIoReadCompressed;
+    FastIoDispatch->FastIoWriteCompressed = FltpFastIoWriteCompressed;
+    FastIoDispatch->MdlReadCompleteCompressed = FltpFastIoMdlReadCompleteCompressed;
+    FastIoDispatch->MdlWriteCompleteCompressed = FltpFastIoMdlWriteCompleteCompressed;
+    FastIoDispatch->FastIoQueryOpen = FltpFastIoQueryOpen;
+
+    /* Store the FastIo table for internal and our access */
+    DriverObject->FastIoDispatch = FastIoDispatch;
+    DriverData.FastIoDispatch = FastIoDispatch;
+
+    /* Initialize the callback table */
+    Callbacks.SizeOfFsFilterCallbacks = sizeof(FS_FILTER_CALLBACKS);
+    Callbacks.PreAcquireForSectionSynchronization = FltpPreFsFilterOperation;
+    Callbacks.PostAcquireForSectionSynchronization = FltpPostFsFilterOperation;
+    Callbacks.PreReleaseForSectionSynchronization = FltpPreFsFilterOperation;
+    Callbacks.PostReleaseForSectionSynchronization = FltpPostFsFilterOperation;
+    Callbacks.PreAcquireForCcFlush = FltpPreFsFilterOperation;
+    Callbacks.PostAcquireForCcFlush = FltpPostFsFilterOperation;
+    Callbacks.PreReleaseForCcFlush = FltpPreFsFilterOperation;
+    Callbacks.PostReleaseForCcFlush = FltpPostFsFilterOperation;
+    Callbacks.PreAcquireForModifiedPageWriter = FltpPreFsFilterOperation;
+    Callbacks.PostAcquireForModifiedPageWriter = FltpPostFsFilterOperation;
+    Callbacks.PreReleaseForModifiedPageWriter = FltpPreFsFilterOperation;
+    Callbacks.PostReleaseForModifiedPageWriter = FltpPostFsFilterOperation;
+
+    /* Register our callbacks */
+    return FsRtlRegisterFileSystemFilterCallbacks(DriverObject, &Callbacks);
+}
+
+CODE_SEG("INIT") DRIVER_INITIALIZE DriverEntry;
+
+CODE_SEG("INIT")
 NTSTATUS
 NTAPI
 DriverEntry(_In_ PDRIVER_OBJECT DriverObject,
@@ -2182,77 +1925,3 @@ Cleanup:
     return Status;
 }
-
-
-static
-NTSTATUS
-SetupDispatchAndCallbacksTables(_In_ PDRIVER_OBJECT DriverObject)
-{
-    PFAST_IO_DISPATCH FastIoDispatch;
-    FS_FILTER_CALLBACKS Callbacks;
-    ULONG i;
-
-    /* Plug all the IRPs */
-    for (i = 0; i <= IRP_MJ_MAXIMUM_FUNCTION; i++)
-    {
-        DriverObject->MajorFunction[i] = FltpDispatch;
-    }
-
-    /* Override the ones we're interested in */
-    DriverObject->MajorFunction[IRP_MJ_CREATE] = FltpCreate;
-    DriverObject->MajorFunction[IRP_MJ_CREATE_NAMED_PIPE] = FltpCreate;
-    DriverObject->MajorFunction[IRP_MJ_CREATE_MAILSLOT] = FltpCreate;
-    DriverObject->MajorFunction[IRP_MJ_FILE_SYSTEM_CONTROL] = FltpFsControl;
-    DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = FltpDeviceControl;
-
-    /* The FastIo dispatch table is stored in the pool along with a tag */
-    FastIoDispatch = ExAllocatePoolWithTag(NonPagedPool, sizeof(FAST_IO_DISPATCH),
FM_TAG_DISPATCH_TABLE);
-    if (FastIoDispatch == NULL) return STATUS_INSUFFICIENT_RESOURCES;
-
-    /* Fill out the FastIo table  */
-    RtlZeroMemory(FastIoDispatch, sizeof(FAST_IO_DISPATCH));
-    FastIoDispatch->SizeOfFastIoDispatch = sizeof(FAST_IO_DISPATCH);
-    FastIoDispatch->FastIoCheckIfPossible = FltpFastIoCheckIfPossible;
-    FastIoDispatch->FastIoRead = FltpFastIoRead;
-    FastIoDispatch->FastIoWrite = FltpFastIoWrite;
-    FastIoDispatch->FastIoQueryBasicInfo = FltpFastIoQueryBasicInfo;
-    FastIoDispatch->FastIoQueryStandardInfo = FltpFastIoQueryStandardInfo;
-    FastIoDispatch->FastIoLock = FltpFastIoLock;
-    FastIoDispatch->FastIoUnlockSingle = FltpFastIoUnlockSingle;
-    FastIoDispatch->FastIoUnlockAll = FltpFastIoUnlockAll;
-    FastIoDispatch->FastIoUnlockAllByKey = FltpFastIoUnlockAllByKey;
-    FastIoDispatch->FastIoDeviceControl = FltpFastIoDeviceControl;
-    FastIoDispatch->FastIoDetachDevice = FltpFastIoDetachDevice;
-    FastIoDispatch->FastIoQueryNetworkOpenInfo = FltpFastIoQueryNetworkOpenInfo;
-    FastIoDispatch->MdlRead = FltpFastIoMdlRead;
-    FastIoDispatch->MdlReadComplete = FltpFastIoMdlReadComplete;
-    FastIoDispatch->PrepareMdlWrite = FltpFastIoPrepareMdlWrite;
-    FastIoDispatch->MdlWriteComplete = FltpFastIoMdlWriteComplete;
-    FastIoDispatch->FastIoReadCompressed = FltpFastIoReadCompressed;
-    FastIoDispatch->FastIoWriteCompressed = FltpFastIoWriteCompressed;
-    FastIoDispatch->MdlReadCompleteCompressed = FltpFastIoMdlReadCompleteCompressed;
-    FastIoDispatch->MdlWriteCompleteCompressed = FltpFastIoMdlWriteCompleteCompressed;
-    FastIoDispatch->FastIoQueryOpen = FltpFastIoQueryOpen;
-
-    /* Store the FastIo table for internal and our access */
-    DriverObject->FastIoDispatch = FastIoDispatch;
-    DriverData.FastIoDispatch = FastIoDispatch;
-
-    /* Initialize the callback table */
-    Callbacks.SizeOfFsFilterCallbacks = sizeof(FS_FILTER_CALLBACKS);
-    Callbacks.PreAcquireForSectionSynchronization = FltpPreFsFilterOperation;
-    Callbacks.PostAcquireForSectionSynchronization = FltpPostFsFilterOperation;
-    Callbacks.PreReleaseForSectionSynchronization = FltpPreFsFilterOperation;
-    Callbacks.PostReleaseForSectionSynchronization = FltpPostFsFilterOperation;
-    Callbacks.PreAcquireForCcFlush = FltpPreFsFilterOperation;
-    Callbacks.PostAcquireForCcFlush = FltpPostFsFilterOperation;
-    Callbacks.PreReleaseForCcFlush = FltpPreFsFilterOperation;
-    Callbacks.PostReleaseForCcFlush = FltpPostFsFilterOperation;
-    Callbacks.PreAcquireForModifiedPageWriter = FltpPreFsFilterOperation;
-    Callbacks.PostAcquireForModifiedPageWriter = FltpPostFsFilterOperation;
-    Callbacks.PreReleaseForModifiedPageWriter = FltpPreFsFilterOperation;
-    Callbacks.PostReleaseForModifiedPageWriter = FltpPostFsFilterOperation;
-
-    /* Register our callbacks */
-    return FsRtlRegisterFileSystemFilterCallbacks(DriverObject, &Callbacks);
-}
diff --git a/drivers/filters/fltmgr/fltmgr.h b/drivers/filters/fltmgr/fltmgr.h
index 7008c1d0942..8f38dcbc10d 100644
--- a/drivers/filters/fltmgr/fltmgr.h
+++ b/drivers/filters/fltmgr/fltmgr.h
@@ -7,6 +7,8 @@
 #include <fltkernel.h>
 #include <pseh/pseh2.h>
+#include <section_attribs.h>
+
 #define DRIVER_NAME     L"FltMgr"
 #define FLT_MAJOR_VERSION   0x0200
diff --git a/drivers/input/inport/hardware.c b/drivers/input/inport/hardware.c
index 6cc1583c860..33103f25311 100644
--- a/drivers/input/inport/hardware.c
+++ b/drivers/input/inport/hardware.c
@@ -16,10 +16,6 @@
 /* GLOBALS ********************************************************************/
-#ifdef ALLOC_PRAGMA
-#pragma alloc_text(PAGE, InPortInitializeMouse)
-#endif
-
 #define READ_MOUSE(DeviceExtension, Port) \
     READ_PORT_UCHAR((DeviceExtension)->IoBase + (Port))
@@ -338,6 +334,7 @@ InPortIsr(
     }
 }
+CODE_SEG("PAGE")
 VOID
 NTAPI
 InPortInitializeMouse(
diff --git a/drivers/input/inport/inport.c b/drivers/input/inport/inport.c
index 6ed5c71162a..745a86983e3 100644
--- a/drivers/input/inport/inport.c
+++ b/drivers/input/inport/inport.c
@@ -14,17 +14,11 @@
 /* GLOBALS ********************************************************************/
-#ifdef ALLOC_PRAGMA
-#pragma alloc_text(INIT, DriverEntry)
-#pragma alloc_text(PAGE, InPortCreateClose)
-#pragma alloc_text(PAGE, InPortAddDevice)
-#pragma alloc_text(PAGE, InPortUnload)
-#endif
-
 UNICODE_STRING DriverRegistryPath;
 /* FUNCTIONS ******************************************************************/
+CODE_SEG("PAGE")
 NTSTATUS
 NTAPI
 InPortCreateClose(
@@ -43,6 +37,7 @@ InPortCreateClose(
     return STATUS_SUCCESS;
 }
+CODE_SEG("PAGE")
 NTSTATUS
 NTAPI
 InPortAddDevice(
@@ -161,6 +156,7 @@ Failure:
     return Status;
 }
+CODE_SEG("PAGE")
 VOID
 NTAPI
 InPortUnload(
@@ -204,6 +200,7 @@ InPortPower(
     return Status;
 }
+CODE_SEG("INIT")
 NTSTATUS
 NTAPI
 DriverEntry(
diff --git a/drivers/input/inport/inport.h b/drivers/input/inport/inport.h
index 2cae1cd6115..d77097713ff 100644
--- a/drivers/input/inport/inport.h
+++ b/drivers/input/inport/inport.h
@@ -13,6 +13,8 @@
 #include <wmistr.h>
 #include <kbdmou.h>
+#include <section_attribs.h>
+
 #define INPORT_TAG 'tPnI'
 typedef enum
@@ -74,14 +76,18 @@ typedef struct _INPORT_DEVICE_EXTENSION
     MOUSE_ATTRIBUTES MouseAttributes;
 } INPORT_DEVICE_EXTENSION, *PINPORT_DEVICE_EXTENSION;
+CODE_SEG("INIT")
 DRIVER_INITIALIZE DriverEntry;
+CODE_SEG("PAGE")
 DRIVER_UNLOAD InPortUnload;
+CODE_SEG("PAGE")
 DRIVER_ADD_DEVICE InPortAddDevice;
 _Dispatch_type_(IRP_MJ_CREATE)
 _Dispatch_type_(IRP_MJ_CLOSE)
+CODE_SEG("PAGE")
 DRIVER_DISPATCH_PAGED InPortCreateClose;
 _Dispatch_type_(IRP_MJ_INTERNAL_DEVICE_CONTROL)
@@ -91,9 +97,11 @@ _Dispatch_type_(IRP_MJ_POWER)
 DRIVER_DISPATCH_RAISED InPortPower;
 _Dispatch_type_(IRP_MJ_SYSTEM_CONTROL)
+CODE_SEG("PAGE")
 DRIVER_DISPATCH_PAGED InPortWmi;
 _Dispatch_type_(IRP_MJ_PNP)
+CODE_SEG("PAGE")
 DRIVER_DISPATCH_PAGED InPortPnp;
 KSERVICE_ROUTINE InPortIsr;
@@ -104,33 +112,39 @@ KSYNCHRONIZE_ROUTINE InPortStartMouse;
 KSYNCHRONIZE_ROUTINE InPortStopMouse;
+CODE_SEG("PAGE")
 NTSTATUS
 NTAPI
 InPortStartDevice(
     _In_ PDEVICE_OBJECT DeviceObject,
     _Inout_ PIRP Irp);
+CODE_SEG("PAGE")
 NTSTATUS
 NTAPI
 InPortRemoveDevice(
     _In_ PDEVICE_OBJECT DeviceObject,
     _Inout_ PIRP Irp);
+CODE_SEG("PAGE")
 VOID
 NTAPI
 InPortInitializeMouse(
     _In_ PINPORT_DEVICE_EXTENSION DeviceExtension);
+CODE_SEG("PAGE")
 NTSTATUS
 NTAPI
 InPortWmiRegistration(
     _Inout_ PINPORT_DEVICE_EXTENSION DeviceExtension);
+CODE_SEG("PAGE")
 NTSTATUS
 NTAPI
 InPortWmiDeRegistration(
     _Inout_ PINPORT_DEVICE_EXTENSION DeviceExtension);
+CODE_SEG("PAGE")
 NTSTATUS
 NTAPI
 InPortQueryWmiRegInfo(
@@ -141,6 +155,7 @@ InPortQueryWmiRegInfo(
     _Inout_ PUNICODE_STRING MofResourceName,
     _Out_opt_ PDEVICE_OBJECT *Pdo);
+CODE_SEG("PAGE")
 NTSTATUS
 NTAPI
 InPortQueryWmiDataBlock(
diff --git a/drivers/input/inport/pnp.c b/drivers/input/inport/pnp.c
index 82d0cd5b2c4..5484c8be375 100644
--- a/drivers/input/inport/pnp.c
+++ b/drivers/input/inport/pnp.c
@@ -12,16 +12,9 @@
 #define NDEBUG
 #include <debug.h>
-/* GLOBALS ********************************************************************/
-
-#ifdef ALLOC_PRAGMA
-#pragma alloc_text(PAGE, InPortPnp)
-#pragma alloc_text(PAGE, InPortStartDevice)
-#pragma alloc_text(PAGE, InPortRemoveDevice)
-#endif
-
 /* FUNCTIONS ******************************************************************/
+CODE_SEG("PAGE")
 NTSTATUS
 NTAPI
 InPortStartDevice(
@@ -178,6 +171,7 @@ Complete:
     return Status;
 }
+CODE_SEG("PAGE")
 NTSTATUS
 NTAPI
 InPortRemoveDevice(
@@ -221,6 +215,7 @@ InPortRemoveDevice(
     return Status;
 }
+CODE_SEG("PAGE")
 NTSTATUS
 NTAPI
 InPortPnp(
diff --git a/drivers/input/inport/wmi.c b/drivers/input/inport/wmi.c
index 957fb14db53..1f5f996b22d 100644
--- a/drivers/input/inport/wmi.c
+++ b/drivers/input/inport/wmi.c
@@ -14,14 +14,6 @@
 /* GLOBALS ********************************************************************/
-#ifdef ALLOC_PRAGMA
-#pragma alloc_text(PAGE, InPortWmi)
-#pragma alloc_text(PAGE, InPortWmiRegistration)
-#pragma alloc_text(PAGE, InPortWmiDeRegistration)
-#pragma alloc_text(PAGE, InPortQueryWmiRegInfo)
-#pragma alloc_text(PAGE, InPortQueryWmiDataBlock)
-#endif
-
 GUID GuidWmiPortData = POINTER_PORT_WMI_STD_DATA_GUID;
 WMIGUIDREGINFO InPortWmiGuidList[] =
@@ -30,7 +22,7 @@ WMIGUIDREGINFO InPortWmiGuidList[] =
 };
 /* FUNCTIONS ******************************************************************/
-
+CODE_SEG("PAGE")
 NTSTATUS
 NTAPI
 InPortQueryWmiRegInfo(
@@ -57,6 +49,7 @@ InPortQueryWmiRegInfo(
     return STATUS_SUCCESS;
 }
+CODE_SEG("PAGE")
 NTSTATUS
 NTAPI
 InPortQueryWmiDataBlock(
@@ -119,6 +112,7 @@ Complete:
                               IO_NO_INCREMENT);
 }
+CODE_SEG("PAGE")
 NTSTATUS
 NTAPI
 InPortWmiRegistration(
@@ -140,6 +134,7 @@ InPortWmiRegistration(
                                     WMIREG_ACTION_REGISTER);
 }
+CODE_SEG("PAGE")
 NTSTATUS
 NTAPI
 InPortWmiDeRegistration(
@@ -151,6 +146,7 @@ InPortWmiDeRegistration(
                                     WMIREG_ACTION_DEREGISTER);
 }
+CODE_SEG("PAGE")
 NTSTATUS
 NTAPI
 InPortWmi(
diff --git a/drivers/storage/class/disk_new/data.c b/drivers/storage/class/disk_new/data.c
index 97214055bb1..2b28148e462 100644
--- a/drivers/storage/class/disk_new/data.c
+++ b/drivers/storage/class/disk_new/data.c
@@ -22,9 +22,11 @@ Revision History:
 #include "disk.h"
+#ifndef __REACTOS__
 #ifdef ALLOC_DATA_PRAGMA
 #pragma data_seg("PAGE")
 #endif
+#endif
 /*
 #define HackDisableTaggedQueuing            (0x01)
@@ -34,7 +36,9 @@ Revision History:
 #define HackCauseNotReportableHack          (0x10)
 #define HackRequiresStartUnitCommand        (0x20)
 */
-
+#ifdef __REACTOS__
+DATA_SEG("PAGEDATA")
+#endif
 CLASSPNP_SCAN_FOR_SPECIAL_INFO DiskBadControllers[] = {
     { "COMPAQ"  , "PD-1"                           , NULL,   0x02 },
     { "CONNER"  , "CP3500"                         , NULL,   0x02 },
@@ -64,11 +68,17 @@ CLASSPNP_SCAN_FOR_SPECIAL_INFO DiskBadControllers[] = {
 // Added MediaTypes in their own brace nesting level
 // ======== ROS DIFF ========
+#ifdef __REACTOS__
+DATA_SEG("PAGECONS")
+#endif
 DISK_MEDIA_TYPES_LIST const DiskMediaTypesExclude[] = {
     { "HP"      , "RDX"          , NULL,  0, 0, {0                 ,
0      , 0      , 0 }},
     { NULL      , NULL           , NULL,  0, 0, {0                 , 0      , 0      , 0
}}
 };
+#ifdef __REACTOS__
+DATA_SEG("PAGECONS")
+#endif
 DISK_MEDIA_TYPES_LIST const DiskMediaTypes[] = {
     { "COMPAQ"  , "PD-1 LF-1094" , NULL,  1, 1, {PC_5_RW           ,
0      , 0      , 0 }},
     { "HP"      , NULL           , NULL,  2, 2, {MO_5_WO           , MO_5_RW, 0
, 0 }},
@@ -83,6 +93,8 @@ DISK_MEDIA_TYPES_LIST const DiskMediaTypes[] = {
     { NULL      , NULL           , NULL,  0, 0, {0                 , 0      , 0      , 0
}}
 };
+#ifndef __REACTOS__
 #ifdef ALLOC_DATA_PRAGMA
 #pragma data_seg()
 #endif
+#endif
diff --git a/drivers/storage/class/disk_new/disk.h b/drivers/storage/class/disk_new/disk.h
index 7954cb0eb1e..d46bafe8ca4 100644
--- a/drivers/storage/class/disk_new/disk.h
+++ b/drivers/storage/class/disk_new/disk.h
@@ -469,6 +469,10 @@ extern CLASSPNP_SCAN_FOR_SPECIAL_INFO DiskBadControllers[];
 extern const DISK_MEDIA_TYPES_LIST DiskMediaTypes[];
 extern const DISK_MEDIA_TYPES_LIST DiskMediaTypesExclude[];
+#if defined(__REACTOS__) && defined(_MSC_VER)
+# pragma section("PAGECONS", read)
+# pragma section("PAGEDATA", read,write)
+#endif
 //
 // Macros
 //
@@ -477,7 +481,7 @@ extern const DISK_MEDIA_TYPES_LIST DiskMediaTypesExclude[];
 // Routine prototypes.
 //
-
+
 DRIVER_INITIALIZE DriverEntry;
 VOID
diff --git a/drivers/storage/mountmgr/mntmgr.h b/drivers/storage/mountmgr/mntmgr.h
index 11fa4bf3b6c..943568ff213 100644
--- a/drivers/storage/mountmgr/mntmgr.h
+++ b/drivers/storage/mountmgr/mntmgr.h
@@ -176,6 +176,7 @@ extern UNICODE_STRING Volume;
 extern KEVENT UnloadEvent;
 extern LONG Unloading;
+CODE_SEG("INIT")
 DRIVER_INITIALIZE DriverEntry;
 VOID
@@ -228,6 +229,7 @@ HasDriveLetter(
     IN PDEVICE_INFORMATION DeviceInformation
 );
+CODE_SEG("INIT")
 BOOLEAN
 MountmgrReadNoAutoMount(
     IN PUNICODE_STRING RegistryPath
diff --git a/drivers/storage/mountmgr/mountmgr.c b/drivers/storage/mountmgr/mountmgr.c
index e733d322766..468358eb92c 100644
--- a/drivers/storage/mountmgr/mountmgr.c
+++ b/drivers/storage/mountmgr/mountmgr.c
@@ -29,11 +29,6 @@
 #define NDEBUG
 #include <debug.h>
-#if defined(ALLOC_PRAGMA)
-#pragma alloc_text(INIT, MountmgrReadNoAutoMount)
-#pragma alloc_text(INIT, DriverEntry)
-#endif
-
 /* FIXME */
 GUID MountedDevicesGuid = {0x53F5630D, 0xB6BF, 0x11D0, {0x94, 0xF2, 0x00, 0xA0, 0xC9,
0x1E, 0xFB, 0x8B}};
diff --git a/drivers/storage/partmgr/partmgr.h b/drivers/storage/partmgr/partmgr.h
index 2878942629a..5bdc30a40cf 100644
--- a/drivers/storage/partmgr/partmgr.h
+++ b/drivers/storage/partmgr/partmgr.h
@@ -100,6 +100,7 @@ typedef struct _PARTITION_EXTENSION
     UNICODE_STRING DeviceName;
 } PARTITION_EXTENSION, *PPARTITION_EXTENSION;
+CODE_SEG("PAGE")
 NTSTATUS
 PartitionCreateDevice(
     _In_ PDEVICE_OBJECT FDObject,
@@ -108,11 +109,13 @@ PartitionCreateDevice(
     _In_ PARTITION_STYLE PartitionStyle,
     _Out_ PDEVICE_OBJECT *PDO);
+CODE_SEG("PAGE")
 NTSTATUS
 PartitionHandleRemove(
     _In_ PPARTITION_EXTENSION PartExt,
     _In_ BOOLEAN FinalRemove);
+CODE_SEG("PAGE")
 NTSTATUS
 PartitionHandlePnp(
     _In_ PDEVICE_OBJECT DeviceObject,
diff --git a/hal/halx86/include/bus.h b/hal/halx86/include/bus.h
index cfda40f9b34..443d649fc9c 100644
--- a/hal/halx86/include/bus.h
+++ b/hal/halx86/include/bus.h
@@ -282,6 +282,7 @@ extern PCI_CONFIG_HANDLER PCIConfigHandler;
 extern PCI_CONFIG_HANDLER PCIConfigHandlerType1;
 extern PCI_CONFIG_HANDLER PCIConfigHandlerType2;
+CODE_SEG("INIT")
 PPCI_REGISTRY_INFO_INTERNAL
 NTAPI
 HalpQueryPciRegistryInfo(
@@ -425,12 +426,14 @@ HalpSetCmosData(
     IN ULONG Length
 );
+CODE_SEG("INIT")
 VOID
 NTAPI
 HalpInitializePciBus(
     VOID
 );
+CODE_SEG("INIT")
 VOID
 NTAPI
 HalpInitializePciStubs(
@@ -470,6 +473,7 @@ HalpFindBusAddressTranslation(
     IN BOOLEAN NextBus
 );
+CODE_SEG("INIT")
 VOID
 NTAPI
 HalpRegisterPciDebuggingDeviceInfo(
diff --git a/hal/halx86/include/hal.h b/hal/halx86/include/hal.h
index ec38e8c70ce..a5a9ddb755c 100644
--- a/hal/halx86/include/hal.h
+++ b/hal/halx86/include/hal.h
@@ -39,6 +39,7 @@
 /* For MSVC, this is required before using DATA_SEG (used in pcidata) */
 #ifdef _MSC_VER
 # pragma section("INIT", read,execute,discard)
+# pragma section("INITDATA", read,discard)
 #endif
 /* Internal shared PCI and ACPI header */
diff --git a/hal/halx86/include/halacpi.h b/hal/halx86/include/halacpi.h
index 8f51fdf3693..e6c2728f34f 100644
--- a/hal/halx86/include/halacpi.h
+++ b/hal/halx86/include/halacpi.h
@@ -24,6 +24,7 @@ HalpAcpiGetTable(
     IN ULONG Signature
 );
+CODE_SEG("INIT")
 NTSTATUS
 NTAPI
 HalpSetupAcpiPhase0(
diff --git a/hal/halx86/include/halp.h b/hal/halx86/include/halp.h
index 746230f5d91..c8fc2715798 100644
--- a/hal/halx86/include/halp.h
+++ b/hal/halx86/include/halp.h
@@ -189,6 +189,7 @@ typedef struct _HalAddressUsage
 PADAPTER_OBJECT NTAPI HalpAllocateAdapterEx(ULONG NumberOfMapRegisters,BOOLEAN IsMaster,
BOOLEAN Dma32BitAddresses);
 /* sysinfo.c */
+CODE_SEG("INIT")
 VOID
 NTAPI
 HalpRegisterVector(IN UCHAR Flags,
@@ -196,6 +197,7 @@ HalpRegisterVector(IN UCHAR Flags,
                    IN ULONG SystemVector,
                    IN KIRQL Irql);
+CODE_SEG("INIT")
 VOID
 NTAPI
 HalpEnableInterruptHandler(IN UCHAR Flags,
@@ -217,7 +219,7 @@ DECLSPEC_NORETURN VOID FASTCALL HalpDispatchInterrupt2ndEntry(IN
PKTRAP_FRAME Tr
 extern BOOLEAN HalpProfilingStopped;
 /* timer.c */
-VOID NTAPI HalpInitializeClock(VOID);
+CODE_SEG("INIT") VOID NTAPI HalpInitializeClock(VOID);
 VOID __cdecl HalpClockInterrupt(VOID);
 VOID __cdecl HalpProfileInterrupt(VOID);
@@ -235,7 +237,7 @@ HalpCalibrateStallExecution(VOID);
 VOID HalpInitPciBus (VOID);
 /* dma.c */
-VOID HalpInitDma (VOID);
+CODE_SEG("INIT") VOID HalpInitDma (VOID);
 /* Non-generic initialization */
 VOID HalpInitPhase0 (PLOADER_PARAMETER_BLOCK LoaderBlock);
@@ -254,12 +256,14 @@ HalpCheckPowerButton(
     VOID
 );
+CODE_SEG("INIT")
 VOID
 NTAPI
 HalpRegisterKdSupportFunctions(
     VOID
 );
+CODE_SEG("INIT")
 NTSTATUS
 NTAPI
 HalpSetupPciDeviceForDebugging(
@@ -267,6 +271,7 @@ HalpSetupPciDeviceForDebugging(
     IN OUT PDEBUG_DEVICE_DESCRIPTOR PciDevice
 );
+CODE_SEG("INIT")
 NTSTATUS
 NTAPI
 HalpReleasePciDeviceForDebugging(
@@ -375,6 +380,7 @@ HaliHaltSystem(
 //
 // CMOS Routines
 //
+CODE_SEG("INIT")
 VOID
 NTAPI
 HalpInitializeCmos(
@@ -429,36 +435,42 @@ HalpOpenRegistryKey(
     IN BOOLEAN Create
 );
+CODE_SEG("INIT")
 VOID
 NTAPI
 HalpGetNMICrashFlag(
     VOID
 );
+CODE_SEG("INIT")
 BOOLEAN
 NTAPI
 HalpGetDebugPortTable(
     VOID
 );
+CODE_SEG("INIT")
 VOID
 NTAPI
 HalpReportSerialNumber(
     VOID
 );
+CODE_SEG("INIT")
 NTSTATUS
 NTAPI
 HalpMarkAcpiHal(
     VOID
 );
+CODE_SEG("INIT")
 VOID
 NTAPI
 HalpBuildAddressMap(
     VOID
 );
+CODE_SEG("INIT")
 VOID
 NTAPI
 HalpReportResourceUsage(
@@ -466,6 +478,7 @@ HalpReportResourceUsage(
     IN INTERFACE_TYPE InterfaceType
 );
+CODE_SEG("INIT")
 ULONG
 NTAPI
 HalpIs16BitPortDecodeSupported(
@@ -486,6 +499,7 @@ KeUpdateSystemTime(
     IN KIRQL OldIrql
 );
+CODE_SEG("INIT")
 VOID
 NTAPI
 HalpInitBusHandlers(
@@ -498,6 +512,7 @@ HaliInitPnpDriver(
     VOID
 );
+CODE_SEG("INIT")
 VOID
 NTAPI
 HalpDebugPciDumpBus(
diff --git a/hal/halx86/legacy/bussupp.c b/hal/halx86/legacy/bussupp.c
index 20174bb8b73..65a9e5c8e1c 100644
--- a/hal/halx86/legacy/bussupp.c
+++ b/hal/halx86/legacy/bussupp.c
@@ -12,6 +12,92 @@
 #define NDEBUG
 #include <debug.h>
+CODE_SEG("INIT")
+PBUS_HANDLER
+NTAPI
+HalpAllocateAndInitPciBusHandler(
+    IN ULONG PciType,
+    IN ULONG BusNo,
+    IN BOOLEAN TestAllocation
+);
+
+CODE_SEG("INIT")
+VOID
+NTAPI
+HalpFixupPciSupportedRanges(
+    IN ULONG BusCount
+);
+
+CODE_SEG("INIT")
+NTSTATUS
+NTAPI
+HalpGetChipHacks(
+    IN USHORT VendorId,
+    IN USHORT DeviceId,
+    IN UCHAR RevisionId,
+    IN PULONG HackFlags
+);
+
+CODE_SEG("INIT")
+BOOLEAN
+NTAPI
+HalpGetPciBridgeConfig(
+    IN ULONG PciType,
+    IN PUCHAR BusCount
+);
+
+CODE_SEG("INIT")
+BOOLEAN
+NTAPI
+HalpIsBridgeDevice(
+    IN PPCI_COMMON_CONFIG PciData
+);
+
+CODE_SEG("INIT")
+BOOLEAN
+NTAPI
+HalpIsIdeDevice(
+    IN PPCI_COMMON_CONFIG PciData
+);
+
+CODE_SEG("INIT")
+BOOLEAN
+NTAPI
+HalpIsRecognizedCard(
+    IN PPCI_REGISTRY_INFO_INTERNAL PciRegistryInfo,
+    IN PPCI_COMMON_CONFIG PciData,
+    IN ULONG Flags
+);
+
+CODE_SEG("INIT")
+BOOLEAN
+NTAPI
+HalpIsValidPCIDevice(
+    IN PBUS_HANDLER BusHandler,
+    IN PCI_SLOT_NUMBER Slot
+);
+
+CODE_SEG("INIT")
+NTSTATUS
+NTAPI
+HalpMarkChipsetDecode(
+    IN BOOLEAN OverrideEnable
+);
+
+CODE_SEG("INIT")
+VOID
+NTAPI
+HalpRegisterInternalBusHandlers(
+    VOID
+);
+
+CODE_SEG("INIT")
+VOID
+NTAPI
+ShowSize(
+    IN ULONG Size
+);
+
 /* GLOBALS ********************************************************************/
 extern KSPIN_LOCK HalpPCIConfigLock;
diff --git a/hal/halx86/pcidata.cmake b/hal/halx86/pcidata.cmake
index de18293f589..b2034c49d2b 100644
--- a/hal/halx86/pcidata.cmake
+++ b/hal/halx86/pcidata.cmake
@@ -3,11 +3,13 @@
 #
 add_custom_command(
     OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/pci_classes.c
${CMAKE_CURRENT_BINARY_DIR}/pci_classes.h
-    COMMAND native-bin2c ${CMAKE_CURRENT_SOURCE_DIR}/legacy/bus/pci_classes.ids
${CMAKE_CURRENT_BINARY_DIR}/pci_classes.c ${CMAKE_CURRENT_BINARY_DIR}/pci_classes.h BINSTR
ClassTable DATA_SEG\(\"INIT\"\) ${CMAKE_CURRENT_SOURCE_DIR}/include/hal.h
-    DEPENDS native-bin2c ${CMAKE_CURRENT_SOURCE_DIR}/legacy/bus/pci_classes.ids VERBATIM)
+    COMMAND native-bin2c ${CMAKE_CURRENT_SOURCE_DIR}/legacy/bus/pci_classes.ids
${CMAKE_CURRENT_BINARY_DIR}/pci_classes.c ${CMAKE_CURRENT_BINARY_DIR}/pci_classes.h BINSTR
ClassTable "DATA_SEG\(\"INITDATA\"\)"
${CMAKE_CURRENT_SOURCE_DIR}/include/hal.h
+    DEPENDS native-bin2c ${CMAKE_CURRENT_SOURCE_DIR}/legacy/bus/pci_classes.ids
+    VERBATIM)
 add_custom_command(
     OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/pci_vendors.c
${CMAKE_CURRENT_BINARY_DIR}/pci_vendors.h
-    COMMAND native-bin2c ${CMAKE_CURRENT_SOURCE_DIR}/legacy/bus/pci_vendors.ids
${CMAKE_CURRENT_BINARY_DIR}/pci_vendors.c ${CMAKE_CURRENT_BINARY_DIR}/pci_vendors.h BINSTR
VendorTable DATA_SEG\(\"INIT\"\) ${CMAKE_CURRENT_SOURCE_DIR}/include/hal.h
-    DEPENDS native-bin2c ${CMAKE_CURRENT_SOURCE_DIR}/legacy/bus/pci_vendors.ids VERBATIM)
+    COMMAND native-bin2c ${CMAKE_CURRENT_SOURCE_DIR}/legacy/bus/pci_vendors.ids
${CMAKE_CURRENT_BINARY_DIR}/pci_vendors.c ${CMAKE_CURRENT_BINARY_DIR}/pci_vendors.h BINSTR
VendorTable "DATA_SEG\(\"INITDATA\"\)"
${CMAKE_CURRENT_SOURCE_DIR}/include/hal.h
+    DEPENDS native-bin2c ${CMAKE_CURRENT_SOURCE_DIR}/legacy/bus/pci_vendors.ids
+    VERBATIM)
 #####################################
diff --git a/ntoskrnl/cache/newcc.h b/ntoskrnl/cache/newcc.h
index 801bdc08bb8..d71779f42ff 100644
--- a/ntoskrnl/cache/newcc.h
+++ b/ntoskrnl/cache/newcc.h
@@ -38,6 +38,7 @@ typedef struct _NOCC_CACHE_MAP
     ULONG ReadAheadGranularity;
 } NOCC_CACHE_MAP, *PNOCC_CACHE_MAP;
+CODE_SEG("INIT")
 VOID
 NTAPI
 CcPfInitializePrefetcher(VOID);
@@ -53,6 +54,7 @@ CcMdlWriteComplete2(IN PFILE_OBJECT FileObject,
                     IN PLARGE_INTEGER FileOffset,
                     IN PMDL MdlChain);
+CODE_SEG("INIT")
 VOID
 NTAPI
 CcInitView(VOID);
diff --git a/ntoskrnl/config/cmdata.c b/ntoskrnl/config/cmdata.c
index 95fafb225c6..28ac7041793 100644
--- a/ntoskrnl/config/cmdata.c
+++ b/ntoskrnl/config/cmdata.c
@@ -65,12 +65,7 @@ ULONG CmpTypeCount[MaximumType + 1];
 HANDLE CmpRegistryRootHandle;
-// for MSVC, this is required before using DATA_SEG
-#ifdef _MSC_VER
-# pragma section("INIT", read,execute,discard)
-#endif
-
-DATA_SEG("INIT") UNICODE_STRING CmClassName[MaximumClass + 1] =
+DATA_SEG("INITDATA") UNICODE_STRING CmClassName[MaximumClass + 1] =
 {
     RTL_CONSTANT_STRING(L"System"),
     RTL_CONSTANT_STRING(L"Processor"),
@@ -82,7 +77,7 @@ DATA_SEG("INIT") UNICODE_STRING CmClassName[MaximumClass + 1]
=
     RTL_CONSTANT_STRING(L"Undefined")
 };
-DATA_SEG("INIT") UNICODE_STRING CmTypeName[MaximumType + 1] =
+DATA_SEG("INITDATA") UNICODE_STRING CmTypeName[MaximumType + 1] =
 {
     RTL_CONSTANT_STRING(L"System"),
     RTL_CONSTANT_STRING(L"CentralProcessor"),
@@ -128,7 +123,7 @@ DATA_SEG("INIT") UNICODE_STRING CmTypeName[MaximumType + 1]
=
     RTL_CONSTANT_STRING(L"Undefined")
 };
-DATA_SEG("INIT") CMP_MF_TYPE CmpMultifunctionTypes[] =
+DATA_SEG("INITDATA") CMP_MF_TYPE CmpMultifunctionTypes[] =
 {
     {"ISA", Isa, 0},
     {"MCA", MicroChannel, 0},
@@ -141,7 +136,7 @@ DATA_SEG("INIT") CMP_MF_TYPE CmpMultifunctionTypes[] =
     {NULL, Internal, 0}
 };
-DATA_SEG("INIT") CM_SYSTEM_CONTROL_VECTOR CmControlVector[] =
+DATA_SEG("INITDATA") CM_SYSTEM_CONTROL_VECTOR CmControlVector[] =
 {
     {
         L"Session Manager",
diff --git a/ntoskrnl/ex/sem.c b/ntoskrnl/ex/sem.c
index ddd79761ac0..8a1810d5db7 100644
--- a/ntoskrnl/ex/sem.c
+++ b/ntoskrnl/ex/sem.c
@@ -13,6 +13,10 @@
 #define NDEBUG
 #include <debug.h>
+#if defined (ALLOC_PRAGMA)
+#pragma alloc_text(INIT, ExpInitializeSemaphoreImplementation)
+#endif
+
 /* GLOBALS ******************************************************************/
 POBJECT_TYPE ExSemaphoreObjectType;
diff --git a/ntoskrnl/ex/uuid.c b/ntoskrnl/ex/uuid.c
index 07530161d29..4df98a37d4a 100644
--- a/ntoskrnl/ex/uuid.c
+++ b/ntoskrnl/ex/uuid.c
@@ -29,6 +29,7 @@
 /* 10000 in 100-ns model = 0.1 microsecond */
 #define TIME_FRAME 10000
+
 /* GLOBALS ****************************************************************/
 FAST_MUTEX ExpUuidLock;
diff --git a/ntoskrnl/ex/work.c b/ntoskrnl/ex/work.c
index 03ab0c4bfdf..a10a4878b42 100644
--- a/ntoskrnl/ex/work.c
+++ b/ntoskrnl/ex/work.c
@@ -609,7 +609,7 @@ ExpSetSwappingKernelApc(IN PKAPC Apc,
     PKEVENT Event = (PKEVENT)*SystemArgument1;
     /* Make sure it's an active worker */
-    if (PsGetCurrentThread()->ActiveExWorker)
+    if (PsGetCurrentThread()->ActiveExWorker)
     {
         /* Read the setting from the context flag */
         AllowSwap = (PBOOLEAN)NormalContext;
@@ -670,7 +670,7 @@ ExSwapinWorkerThreads(IN BOOLEAN AllowSwap)
                 KeClearEvent(&Event);
             }
         }
-
+
         /* Next thread */
 Next:
         Thread = PsGetNextProcessThread(Process, Thread);
diff --git a/ntoskrnl/include/internal/amd64/mm.h b/ntoskrnl/include/internal/amd64/mm.h
index e62df71cfe0..bdb0066a8d4 100644
--- a/ntoskrnl/include/internal/amd64/mm.h
+++ b/ntoskrnl/include/internal/amd64/mm.h
@@ -295,6 +295,7 @@ MI_IS_MAPPED_PTE(PMMPTE PointerPte)
             (PointerPte->u.Hard.PageFrameNumber != 0));
 }
+CODE_SEG("INIT")
 FORCEINLINE
 BOOLEAN
 MiIsPdeForAddressValid(PVOID Address)
diff --git a/ntoskrnl/include/internal/cc.h b/ntoskrnl/include/internal/cc.h
index 52a7b19f0a6..1986e888f9e 100644
--- a/ntoskrnl/include/internal/cc.h
+++ b/ntoskrnl/include/internal/cc.h
@@ -287,6 +287,7 @@ extern LAZY_WRITER LazyWriter;
 #define NODE_TYPE_PRIVATE_MAP    0x02FE
 #define NODE_TYPE_SHARED_MAP     0x02FF
+CODE_SEG("INIT")
 VOID
 NTAPI
 CcPfInitializePrefetcher(
@@ -327,6 +328,7 @@ CcRosEnsureVacbResident(
     _In_ ULONG Length
 );
+CODE_SEG("INIT")
 VOID
 NTAPI
 CcInitView(VOID);
@@ -335,6 +337,7 @@ VOID
 NTAPI
 CcShutdownLazyWriter(VOID);
+CODE_SEG("INIT")
 BOOLEAN
 CcInitializeCacheManager(VOID);
diff --git a/ntoskrnl/include/internal/cm.h b/ntoskrnl/include/internal/cm.h
index 62d31b38544..a251ab1bead 100644
--- a/ntoskrnl/include/internal/cm.h
+++ b/ntoskrnl/include/internal/cm.h
@@ -695,6 +695,7 @@ CmpFlushNotify(
     IN BOOLEAN LockHeld
 );
+CODE_SEG("INIT")
 VOID
 NTAPI
 CmpInitCallback(
@@ -704,24 +705,28 @@ CmpInitCallback(
 //
 // KCB Cache/Delay Routines
 //
+CODE_SEG("INIT")
 VOID
 NTAPI
 CmpInitializeCache(
     VOID
 );
+CODE_SEG("INIT")
 VOID
 NTAPI
 CmpInitCmPrivateDelayAlloc(
     VOID
 );
+CODE_SEG("INIT")
 VOID
 NTAPI
 CmpInitCmPrivateAlloc(
     VOID
 );
+CODE_SEG("INIT")
 VOID
 NTAPI
 CmpInitDelayDerefKCBEngine(
@@ -964,6 +969,7 @@ VOID
 NTAPI
 CmpRemoveFromDelayedClose(IN PCM_KEY_CONTROL_BLOCK Kcb);
+CODE_SEG("INIT")
 VOID
 NTAPI
 CmpInitializeDelayedCloseTable(
@@ -1162,6 +1168,7 @@ CmpCreateLinkNode(
 //
 // Boot Routines
 //
+CODE_SEG("INIT")
 HCELL_INDEX
 NTAPI
 CmpFindControlSet(
@@ -1171,6 +1178,7 @@ CmpFindControlSet(
     OUT PBOOLEAN AutoSelect
 );
+CODE_SEG("INIT")
 VOID
 NTAPI
 CmGetSystemControlValues(
@@ -1187,6 +1195,7 @@ CmpSaveBootControlSet(
 //
 // Hardware Configuration Routines
 //
+CODE_SEG("INIT")
 NTSTATUS
 NTAPI
 CmpInitializeRegistryNode(
@@ -1204,6 +1213,7 @@ CmpInitializeMachineDependentConfiguration(
     IN PLOADER_PARAMETER_BLOCK LoaderBlock
 );
+CODE_SEG("INIT")
 NTSTATUS
 NTAPI
 CmpInitializeHardwareConfiguration(
@@ -1408,6 +1418,7 @@ CmSaveMergedKeys(
 //
 // Startup and Shutdown
 //
+CODE_SEG("INIT")
 BOOLEAN
 NTAPI
 CmInitSystem1(
@@ -1435,12 +1446,14 @@ CmpSetVersionData(
 //
 // Driver List Routines
 //
+CODE_SEG("INIT")
 PUNICODE_STRING*
 NTAPI
 CmGetSystemDriverList(
     VOID
 );
+CODE_SEG("INIT")
 BOOLEAN
 NTAPI
 CmpFindDrivers(
@@ -1451,6 +1464,7 @@ CmpFindDrivers(
     IN PLIST_ENTRY DriverListHead
 );
+CODE_SEG("INIT")
 BOOLEAN
 NTAPI
 CmpSortDriverList(
@@ -1459,12 +1473,14 @@ CmpSortDriverList(
     IN PLIST_ENTRY DriverListHead
 );
+CODE_SEG("INIT")
 BOOLEAN
 NTAPI
 CmpResolveDriverDependencies(
     IN PLIST_ENTRY DriverListHead
 );
+CODE_SEG("INIT")
 BOOLEAN
 NTAPI
 CmpIsSafe(
diff --git a/ntoskrnl/include/internal/dbgk.h b/ntoskrnl/include/internal/dbgk.h
index 96cbb1f309b..1fef45aba50 100644
--- a/ntoskrnl/include/internal/dbgk.h
+++ b/ntoskrnl/include/internal/dbgk.h
@@ -46,6 +46,7 @@
 #define DBGKTRACE(x, fmt, ...) DPRINT(fmt, ##__VA_ARGS__)
 #endif
+CODE_SEG("INIT")
 VOID
 NTAPI
 DbgkInitialize(
diff --git a/ntoskrnl/include/internal/ex.h b/ntoskrnl/include/internal/ex.h
index 4a0e94d7da4..2b8b0026794 100644
--- a/ntoskrnl/include/internal/ex.h
+++ b/ntoskrnl/include/internal/ex.h
@@ -190,6 +190,7 @@ C_ASSERT(RTL_FIELD_SIZE(UUID_CACHED_VALUES_STRUCT, GuidInit) ==
RTL_FIELD_SIZE(U
 /* INITIALIZATION FUNCTIONS *************************************************/
+CODE_SEG("INIT")
 BOOLEAN
 NTAPI
 ExpWin32kInit(VOID);
@@ -204,6 +205,7 @@ Phase1Initialization(
     IN PVOID Context
 );
+CODE_SEG("INIT")
 VOID
 NTAPI
 ExpInitializePushLocks(VOID);
@@ -214,6 +216,7 @@ ExRefreshTimeZoneInformation(
     IN PLARGE_INTEGER SystemBootTime
 );
+CODE_SEG("INIT")
 VOID
 NTAPI
 ExpInitializeWorkerThreads(VOID);
@@ -222,10 +225,12 @@ VOID
 NTAPI
 ExSwapinWorkerThreads(IN BOOLEAN AllowSwap);
+CODE_SEG("INIT")
 VOID
 NTAPI
 ExpInitLookasideLists(VOID);
+CODE_SEG("INIT")
 VOID
 NTAPI
 ExInitializeSystemLookasideList(
@@ -237,18 +242,22 @@ ExInitializeSystemLookasideList(
     IN PLIST_ENTRY ListHead
 );
+CODE_SEG("INIT")
 BOOLEAN
 NTAPI
 ExpInitializeCallbacks(VOID);
+CODE_SEG("INIT")
 BOOLEAN
 NTAPI
 ExpUuidInitialization(VOID);
+CODE_SEG("INIT")
 BOOLEAN
 NTAPI
 ExLuidInitialization(VOID);
+CODE_SEG("INIT")
 VOID
 NTAPI
 ExpInitializeExecutive(
@@ -260,38 +269,47 @@ VOID
 NTAPI
 ExShutdownSystem(VOID);
+CODE_SEG("INIT")
 BOOLEAN
 NTAPI
 ExpInitializeEventImplementation(VOID);
+CODE_SEG("INIT")
 BOOLEAN
 NTAPI
 ExpInitializeKeyedEventImplementation(VOID);
+CODE_SEG("INIT")
 BOOLEAN
 NTAPI
 ExpInitializeEventPairImplementation(VOID);
+CODE_SEG("INIT")
 BOOLEAN
 NTAPI
 ExpInitializeSemaphoreImplementation(VOID);
+CODE_SEG("INIT")
 BOOLEAN
 NTAPI
 ExpInitializeMutantImplementation(VOID);
+CODE_SEG("INIT")
 BOOLEAN
 NTAPI
 ExpInitializeTimerImplementation(VOID);
+CODE_SEG("INIT")
 BOOLEAN
 NTAPI
 ExpInitializeProfileImplementation(VOID);
+CODE_SEG("INIT")
 VOID
 NTAPI
 ExpResourceInitialization(VOID);
+CODE_SEG("INIT")
 VOID
 NTAPI
 ExInitPoolLookasidePointers(VOID);
@@ -431,6 +449,7 @@ typedef BOOLEAN
     ULONG_PTR Context
 );
+CODE_SEG("INIT")
 VOID
 NTAPI
 ExpInitializeHandleTables(
@@ -1486,12 +1505,14 @@ ExTimerRundown(
     VOID
 );
+CODE_SEG("INIT")
 VOID
 NTAPI
 HeadlessInit(
     IN PLOADER_PARAMETER_BLOCK LoaderBlock
 );
+CODE_SEG("INIT")
 VOID
 NTAPI
 XIPInit(
diff --git a/ntoskrnl/include/internal/fsrtl.h b/ntoskrnl/include/internal/fsrtl.h
index 228bb7a1cf8..5e106c38c1b 100644
--- a/ntoskrnl/include/internal/fsrtl.h
+++ b/ntoskrnl/include/internal/fsrtl.h
@@ -108,12 +108,14 @@ typedef struct _INT_MAPPING
 //
 // Initialization Routines
 //
+CODE_SEG("INIT")
 VOID
 NTAPI
 FsRtlInitializeLargeMcbs(
     VOID
 );
+CODE_SEG("INIT")
 VOID
 NTAPI
 FsRtlInitializeTunnels(
@@ -129,6 +131,7 @@ FsRtlPTeardownPerFileObjectContexts(
     IN PFILE_OBJECT FileObject
 );
+CODE_SEG("INIT")
 BOOLEAN
 NTAPI
 FsRtlInitSystem(
diff --git a/ntoskrnl/include/internal/i386/ke.h b/ntoskrnl/include/internal/i386/ke.h
index 71e302b4dde..95242fdbfa0 100644
--- a/ntoskrnl/include/internal/i386/ke.h
+++ b/ntoskrnl/include/internal/i386/ke.h
@@ -381,6 +381,7 @@ KiSetTebBase(PKPCR Pcr, PNT_TIB TebAddress)
     Ke386SetGdtEntryBase(&Pcr->GDT[KGDT_R3_TEB / sizeof(KGDTENTRY)], TebAddress);
 }
+CODE_SEG("INIT")
 VOID
 FASTCALL
 Ki386InitializeTss(
@@ -389,30 +390,36 @@ Ki386InitializeTss(
     IN PKGDTENTRY Gdt
 );
+CODE_SEG("INIT")
 VOID
 NTAPI
 KiSetCR0Bits(VOID);
+CODE_SEG("INIT")
 VOID
 NTAPI
 KiGetCacheInformation(VOID);
+CODE_SEG("INIT")
 BOOLEAN
 NTAPI
 KiIsNpxPresent(
     VOID
 );
+CODE_SEG("INIT")
 BOOLEAN
 NTAPI
 KiIsNpxErrataPresent(
     VOID
 );
+CODE_SEG("INIT")
 VOID
 NTAPI
 KiSetProcessorType(VOID);
+CODE_SEG("INIT")
 ULONG
 NTAPI
 KiGetFeatureBits(VOID);
@@ -447,18 +454,21 @@ Ki386SetupAndExitToV86Mode(
     OUT PTEB VdmTeb
 );
+CODE_SEG("INIT")
 VOID
 NTAPI
 KeI386VdmInitialize(
     VOID
 );
+CODE_SEG("INIT")
 ULONG_PTR
 NTAPI
 Ki386EnableGlobalPage(
     IN ULONG_PTR Context
 );
+CODE_SEG("INIT")
 ULONG_PTR
 NTAPI
 Ki386EnableTargetLargePage(
@@ -486,48 +496,56 @@ Ki386EnableCurrentLargePage(
     IN ULONG Cr3
 );
+CODE_SEG("INIT")
 VOID
 NTAPI
 KiI386PentiumLockErrataFixup(
     VOID
 );
+CODE_SEG("INIT")
 VOID
 NTAPI
 KiInitializePAT(
     VOID
 );
+CODE_SEG("INIT")
 VOID
 NTAPI
 KiInitializeMTRR(
     IN BOOLEAN FinalCpu
 );
+CODE_SEG("INIT")
 VOID
 NTAPI
 KiAmdK6InitializeMTRR(
     VOID
 );
+CODE_SEG("INIT")
 VOID
 NTAPI
 KiRestoreFastSyscallReturnState(
     VOID
 );
+CODE_SEG("INIT")
 ULONG_PTR
 NTAPI
 Ki386EnableDE(
     IN ULONG_PTR Context
 );
+CODE_SEG("INIT")
 ULONG_PTR
 NTAPI
 Ki386EnableFxsr(
     IN ULONG_PTR Context
 );
+CODE_SEG("INIT")
 ULONG_PTR
 NTAPI
 Ki386EnableXMMIExceptions(
@@ -791,12 +809,13 @@ KiCheckForApcDelivery(IN PKTRAP_FRAME TrapFrame)
 //
 // Switches from boot loader to initial kernel stack
 //
+CODE_SEG("INIT")
 FORCEINLINE
 DECLSPEC_NORETURN
 VOID
 KiSwitchToBootStack(IN ULONG_PTR InitialStack)
 {
-    DECLSPEC_NORETURN VOID NTAPI KiSystemStartupBootStack(VOID);
+    CODE_SEG("INIT") DECLSPEC_NORETURN VOID NTAPI
KiSystemStartupBootStack(VOID);
     /* We have to switch to a new stack before continuing kernel initialization */
 #ifdef __GNUC__
diff --git a/ntoskrnl/include/internal/inbv.h b/ntoskrnl/include/internal/inbv.h
index 204a2aa8023..3dbc8d9896d 100644
--- a/ntoskrnl/include/internal/inbv.h
+++ b/ntoskrnl/include/internal/inbv.h
@@ -6,6 +6,7 @@
 //
 // Driver Initialization
 //
+CODE_SEG("INIT")
 BOOLEAN
 NTAPI
 InbvDriverInitialize(
@@ -32,12 +33,14 @@ InbvBitBlt(
 //
 // Progress-Bar Functions
 //
+CODE_SEG("INIT")
 VOID
 NTAPI
 InbvIndicateProgress(
     VOID
 );
+CODE_SEG("INIT")
 VOID
 NTAPI
 InbvSetProgressBarSubset(
@@ -45,6 +48,7 @@ InbvSetProgressBarSubset(
     _In_ ULONG Ceiling
 );
+CODE_SEG("INIT")
 VOID
 NTAPI
 InbvUpdateProgressBar(
@@ -54,24 +58,28 @@ InbvUpdateProgressBar(
 //
 // Boot Splash-Screen Functions
 //
+CODE_SEG("INIT")
 VOID
 NTAPI
 InbvRotBarInit(
     VOID
 );
+CODE_SEG("INIT")
 VOID
 NTAPI
 DisplayBootBitmap(
     IN BOOLEAN TextMode
 );
+CODE_SEG("INIT")
 VOID
 NTAPI
 DisplayFilter(
     IN PCHAR *String
 );
+CODE_SEG("INIT")
 VOID
 NTAPI
 FinalizeBootLogo(
diff --git a/ntoskrnl/include/internal/io.h b/ntoskrnl/include/internal/io.h
index 12f9ebea0bc..095d63bbefc 100644
--- a/ntoskrnl/include/internal/io.h
+++ b/ntoskrnl/include/internal/io.h
@@ -571,6 +571,15 @@ IopDetectResourceConflict(
 //
 NTSTATUS
 NTAPI
+PipCallDriverAddDevice(
+    IN PDEVICE_NODE DeviceNode,
+    IN BOOLEAN LoadDriver,
+    IN PDRIVER_OBJECT DriverObject
+);
+
+CODE_SEG("INIT")
+NTSTATUS
+NTAPI
 IopInitializePlugPlayServices(
     VOID
 );
@@ -662,6 +671,7 @@ IoDestroyDriverList(
     VOID
 );
+CODE_SEG("INIT")
 NTSTATUS
 IopInitPlugPlayEvents(VOID);
@@ -713,12 +723,14 @@ IopCreateDeviceKeyPath(
 //
 // PnP Routines
 //
+CODE_SEG("INIT")
 NTSTATUS
 NTAPI
 IopUpdateRootKey(
     VOID
 );
+CODE_SEG("INIT")
 NTSTATUS
 NTAPI
 PiInitCacheGroupInformation(
@@ -761,12 +773,14 @@ PiSetDevNodeText(
 //
 // Initialization Routines
 //
+CODE_SEG("INIT")
 NTSTATUS
 NTAPI
 IopCreateArcNames(
     IN PLOADER_PARAMETER_BLOCK LoaderBlock
 );
+CODE_SEG("INIT")
 NTSTATUS
 NTAPI
 IopReassignSystemRoot(
@@ -774,6 +788,7 @@ IopReassignSystemRoot(
     OUT PANSI_STRING NtBootPath
 );
+CODE_SEG("INIT")
 BOOLEAN
 NTAPI
 IoInitSystem(
@@ -794,6 +809,7 @@ IoInitializeCrashDump(
     IN HANDLE PageFileHandle
 );
+CODE_SEG("INIT")
 VOID
 PiInitializeNotifications(
     VOID);
@@ -958,11 +974,13 @@ IopShutdownBaseFileSystems(
 //
 // Boot logging support
 //
+CODE_SEG("INIT")
 VOID
 IopInitBootLog(
     IN BOOLEAN StartBootLog
 );
+CODE_SEG("INIT")
 VOID
 IopStartBootLog(
     VOID
@@ -1034,6 +1052,7 @@ RawFsIsRawFileSystemDeviceObject(
     IN PDEVICE_OBJECT DeviceObject
 );
+CODE_SEG("INIT")
 NTSTATUS
 NTAPI
 RawFsDriverEntry(
@@ -1066,12 +1085,14 @@ PnpRootRegisterDevice(
 //
 // Driver Routines
 //
+CODE_SEG("INIT")
 VOID
 FASTCALL
 IopInitializeBootDrivers(
     VOID
 );
+CODE_SEG("INIT")
 VOID
 FASTCALL
 IopInitializeSystemDrivers(
@@ -1305,6 +1326,7 @@ IoSetIoCompletion(
 //
 // Ramdisk Routines
 //
+CODE_SEG("INIT")
 NTSTATUS
 NTAPI
 IopStartRamdisk(
@@ -1346,16 +1368,19 @@ PiPerformSyncDeviceAction(
 //
 // PnP notifications
 //
+CODE_SEG("PAGE")
 VOID
 PiNotifyDeviceInterfaceChange(
     _In_ LPCGUID Event,
     _In_ LPCGUID InterfaceClassGuid,
     _In_ PUNICODE_STRING SymbolicLinkName);
+CODE_SEG("PAGE")
 VOID
 PiNotifyHardwareProfileChange(
     _In_ LPCGUID Event);
+CODE_SEG("PAGE")
 VOID
 PiNotifyTargetDeviceChange(
     _In_ LPCGUID Event,
diff --git a/ntoskrnl/include/internal/ke.h b/ntoskrnl/include/internal/ke.h
index 884db0413c0..e5551a5527b 100644
--- a/ntoskrnl/include/internal/ke.h
+++ b/ntoskrnl/include/internal/ke.h
@@ -728,10 +728,12 @@ KeQueryValuesProcess(IN PKPROCESS Process,
 /* INITIALIZATION FUNCTIONS *************************************************/
+CODE_SEG("INIT")
 BOOLEAN
 NTAPI
 KeInitSystem(VOID);
+CODE_SEG("INIT")
 VOID
 NTAPI
 KeInitExceptions(VOID);
@@ -740,11 +742,13 @@ VOID
 NTAPI
 KeInitInterrupts(VOID);
+CODE_SEG("INIT")
 VOID
 NTAPI
 KiInitializeBugCheck(VOID);
 DECLSPEC_NORETURN
+CODE_SEG("INIT")
 VOID
 NTAPI
 KiSystemStartup(
@@ -905,6 +909,7 @@ KiChainedDispatch(
     IN PKINTERRUPT Interrupt
 );
+CODE_SEG("INIT")
 VOID
 NTAPI
 KiInitializeMachineType(
@@ -922,6 +927,7 @@ KiSetupStackAndInitializeKernel(
     IN PLOADER_PARAMETER_BLOCK LoaderBlock
 );
+CODE_SEG("INIT")
 VOID
 NTAPI
 KiInitSpinLocks(
@@ -929,6 +935,7 @@ KiInitSpinLocks(
     IN CCHAR Number
 );
+CODE_SEG("INIT")
 LARGE_INTEGER
 NTAPI
 KiComputeReciprocal(
@@ -936,6 +943,7 @@ KiComputeReciprocal(
     OUT PUCHAR Shift
 );
+CODE_SEG("INIT")
 VOID
 NTAPI
 KiInitSystem(
@@ -964,6 +972,7 @@ KiCallbackReturn(
     IN NTSTATUS Status
 );
+CODE_SEG("INIT")
 VOID
 NTAPI
 KiInitMachineDependent(VOID);
diff --git a/ntoskrnl/include/internal/lpc.h b/ntoskrnl/include/internal/lpc.h
index e862a4f2476..f8d8640c1c6 100644
--- a/ntoskrnl/include/internal/lpc.h
+++ b/ntoskrnl/include/internal/lpc.h
@@ -137,6 +137,7 @@ LpcExitThread(
 //
 // Initialization functions
 //
+CODE_SEG("INIT")
 BOOLEAN
 NTAPI
 LpcInitSystem(
diff --git a/ntoskrnl/include/internal/mm.h b/ntoskrnl/include/internal/mm.h
index 2f101c97956..7b284a01335 100644
--- a/ntoskrnl/include/internal/mm.h
+++ b/ntoskrnl/include/internal/mm.h
@@ -602,6 +602,7 @@ MiCheckAllProcessMemoryAreas(VOID);
 /* npool.c *******************************************************************/
+CODE_SEG("INIT")
 VOID
 NTAPI
 MiInitializeNonPagedPool(VOID);
@@ -652,6 +653,7 @@ MmInit1(
     VOID
 );
+CODE_SEG("INIT")
 BOOLEAN
 NTAPI
 MmInitSystem(IN ULONG Phase,
... 982 lines suppressed ...