Author: tfaber
Date: Sun Jun 18 19:48:45 2017
New Revision: 75103

URL: http://svn.reactos.org/svn/reactos?rev=75103&view=rev
Log:
[NTOS:PNP]
- If PFN tracing is enabled, create a device object that allows the user to 
trigger a PFN dump (e.g. via "type \\.\Global\GLOBALROOT\Device\PfnDump")

Modified:
    trunk/reactos/ntoskrnl/io/pnpmgr/pnproot.c

Modified: trunk/reactos/ntoskrnl/io/pnpmgr/pnproot.c
URL: 
http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/io/pnpmgr/pnproot.c?rev=75103&r1=75102&r2=75103&view=diff
==============================================================================
--- trunk/reactos/ntoskrnl/io/pnpmgr/pnproot.c  [iso-8859-1] (original)
+++ trunk/reactos/ntoskrnl/io/pnpmgr/pnproot.c  [iso-8859-1] Sun Jun 18 
19:48:45 2017
@@ -1344,19 +1344,75 @@
     return STATUS_SUCCESS;
 }
 
+#if MI_TRACE_PFNS
+PDEVICE_OBJECT IopPfnDumpDeviceObject;
+
+NTSTATUS NTAPI
+PnpRootCreateClose(
+    _In_ PDEVICE_OBJECT DeviceObject,
+    _In_ PIRP Irp)
+{
+    PIO_STACK_LOCATION IoStack;
+
+    if (DeviceObject != IopPfnDumpDeviceObject)
+    {
+        Irp->IoStatus.Status = STATUS_INVALID_DEVICE_REQUEST;
+        IoCompleteRequest(Irp, IO_NO_INCREMENT);
+        return STATUS_INVALID_DEVICE_REQUEST;
+    }
+
+    IoStack = IoGetCurrentIrpStackLocation(Irp);
+    if (IoStack->MajorFunction == IRP_MJ_CREATE)
+    {
+        MmDumpArmPfnDatabase(TRUE);
+    }
+
+    Irp->IoStatus.Status = STATUS_SUCCESS;
+    IoCompleteRequest(Irp, IO_NO_INCREMENT);
+    return STATUS_SUCCESS;
+}
+#endif
+
 NTSTATUS NTAPI
 PnpRootDriverEntry(
     IN PDRIVER_OBJECT DriverObject,
     IN PUNICODE_STRING RegistryPath)
 {
+#if MI_TRACE_PFNS
+    NTSTATUS Status;
+    UNICODE_STRING PfnDumpDeviceName = 
RTL_CONSTANT_STRING(L"\\Device\\PfnDump");
+#endif
+
     DPRINT("PnpRootDriverEntry(%p %wZ)\n", DriverObject, RegistryPath);
 
     IopRootDriverObject = DriverObject;
 
     DriverObject->DriverExtension->AddDevice = PnpRootAddDevice;
 
+#if MI_TRACE_PFNS
+    DriverObject->MajorFunction[IRP_MJ_CREATE] = PnpRootCreateClose;
+    DriverObject->MajorFunction[IRP_MJ_CLOSE] = PnpRootCreateClose;
+#endif
     DriverObject->MajorFunction[IRP_MJ_PNP] = PnpRootPnpControl;
     DriverObject->MajorFunction[IRP_MJ_POWER] = PnpRootPowerControl;
 
+#if MI_TRACE_PFNS
+    Status = IoCreateDevice(DriverObject,
+                            0,
+                            &PfnDumpDeviceName,
+                            FILE_DEVICE_UNKNOWN,
+                            0,
+                            FALSE,
+                            &IopPfnDumpDeviceObject);
+    if (!NT_SUCCESS(Status))
+    {
+        DPRINT1("Creating PFN Dump device failed with %lx\n", Status);
+    }
+    else
+    {
+        IopPfnDumpDeviceObject->Flags &= ~DO_DEVICE_INITIALIZING;
+    }
+#endif
+
     return STATUS_SUCCESS;
 }


Reply via email to