[ros-diffs] [ion] 22703: - Completely reformat io.h to same style as ob.h and add I/O Tracing. - Fix irp.c file header - IopRemoveThreadIrp: - Get the DeviceObject and I/O Stack *before* going back to dispatch, otherwise race conditions will happen. - Don't complete and IRP if it's already been through two stacks. - Remove the IRP from the thread's IRP list before re-initializing the list, or else the IRP was lost. - Make sure we have an error log entry before writing to it.

ion at svn.reactos.org ion at svn.reactos.org
Fri Jun 30 01:52:46 CEST 2006


Author: ion
Date: Fri Jun 30 03:52:45 2006
New Revision: 22703

URL: http://svn.reactos.org/svn/reactos?rev=22703&view=rev
Log:
- Completely reformat io.h to same style as ob.h and add I/O Tracing.
- Fix irp.c file header
- IopRemoveThreadIrp:
  - Get the DeviceObject and I/O Stack *before* going back to dispatch, otherwise race conditions will happen.
  - Don't complete and IRP if it's already been through two stacks.
  - Remove the IRP from the thread's IRP list before re-initializing the list, or else the IRP was lost.
  - Make sure we have an error log entry before writing to it.

Modified:
    trunk/reactos/ntoskrnl/include/internal/io.h
    trunk/reactos/ntoskrnl/io/irp.c

Modified: trunk/reactos/ntoskrnl/include/internal/io.h
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/include/internal/io.h?rev=22703&r1=22702&r2=22703&view=diff
==============================================================================
--- trunk/reactos/ntoskrnl/include/internal/io.h (original)
+++ trunk/reactos/ntoskrnl/include/internal/io.h Fri Jun 30 03:52:45 2006
@@ -1,54 +1,169 @@
-#ifndef __NTOSKRNL_INCLUDE_INTERNAL_IO_H
-#define __NTOSKRNL_INCLUDE_INTERNAL_IO_H
-
-#include <ntdddisk.h>
-
-/* STRUCTURES ***************************************************************/
-
-typedef struct _DISKENTRY
-{
-  LIST_ENTRY ListEntry;
-  ULONG DiskNumber;
-  ULONG Signature;
-  ULONG Checksum;
-  PDEVICE_OBJECT DeviceObject;
-} DISKENTRY, *PDISKENTRY; 
-
-#define  PARTITION_TBL_SIZE 4
-
-#include <pshpack1.h>
-
-typedef struct _PARTITION
-{
-  unsigned char   BootFlags;					/* bootable?  0=no, 128=yes  */
-  unsigned char   StartingHead;					/* beginning head number */
-  unsigned char   StartingSector;				/* beginning sector number */
-  unsigned char   StartingCylinder;				/* 10 bit nmbr, with high 2 bits put in begsect */
-  unsigned char   PartitionType;				/* Operating System type indicator code */
-  unsigned char   EndingHead;					/* ending head number */
-  unsigned char   EndingSector;					/* ending sector number */
-  unsigned char   EndingCylinder;				/* also a 10 bit nmbr, with same high 2 bit trick */
-  unsigned int  StartingBlock;					/* first sector relative to start of disk */
-  unsigned int  SectorCount;					/* number of sectors in partition */
-} PARTITION, *PPARTITION;
-
-typedef struct _PARTITION_SECTOR
-{
-  UCHAR BootCode[440];				/* 0x000 */
-  ULONG Signature;				/* 0x1B8 */
-  UCHAR Reserved[2];				/* 0x1BC */
-  PARTITION Partition[PARTITION_TBL_SIZE];	/* 0x1BE */
-  USHORT Magic;					/* 0x1FE */
-} PARTITION_SECTOR, *PPARTITION_SECTOR;
-
-#include <poppack.h>
-
-#define IO_METHOD_FROM_CTL_CODE(ctlCode) (ctlCode&0x00000003)
-
-extern POBJECT_TYPE IoCompletionType;
-extern PDEVICE_NODE IopRootDeviceNode;
-
-/* This is like the IRP Overlay so we can optimize its insertion */
+/*
+* PROJECT:         ReactOS Kernel
+* LICENSE:         GPL - See COPYING in the top level directory
+* FILE:            ntoskrnl/include/io.h
+* PURPOSE:         Internal header for the I/O Manager
+* PROGRAMMERS:     Alex Ionescu (alex.ionescu at reactos.org)
+*/
+//#include "io_x.h"
+#include "ntdddisk.h"
+
+//
+// Define this if you want debugging support
+//
+#define _IO_DEBUG_                                      0x00
+
+//
+// These define the Debug Masks Supported
+//
+#define IO_IRP_DEBUG                                    0x01
+
+//
+// Debug/Tracing support
+//
+#if _IO_DEBUG_
+#ifdef NEW_DEBUG_SYSTEM_IMPLEMENTED // enable when Debug Filters are implemented
+#define IOTRACE DbgPrintEx
+#else
+#define IOTRACE(x, ...)                                 \
+    if (x & IopTraceLevel) DbgPrint(__VA_ARGS__)
+#endif
+#else
+#define IOTRACE(x, ...) DPRINT(__VA_ARGS__)
+#endif
+
+//
+// FIXME: What is this?
+//
+#define IO_METHOD_FROM_CTL_CODE(ctlCode)                (ctlCode&0x00000003)
+
+//
+// Packet Types when piggybacking on the IRP Overlay
+//
+#define IrpCompletionPacket                             0x1
+#define IrpMiniCompletionPacket                         0x2
+
+//
+// Number of partition tables in the Boot Record
+//
+#define PARTITION_TBL_SIZE                              4
+
+//
+// Returns the size of a CM_RESOURCE_LIST
+//
+#define CM_RESOURCE_LIST_SIZE(ResList)                  \
+    (ResList->Count == 1) ?                             \
+        FIELD_OFFSET(                                   \
+            CM_RESOURCE_LIST,                           \
+            List[0].PartialResourceList.                \
+            PartialDescriptors[(ResList)->              \
+                               List[0].                 \
+                               PartialResourceList.     \
+                               Count])                  \
+        :                                               \
+        FIELD_OFFSET(CM_RESOURCE_LIST, List)
+
+/*
+ * VOID
+ * IopDeviceNodeSetFlag(
+ *   PDEVICE_NODE DeviceNode,
+ *   ULONG Flag);
+ */
+#define IopDeviceNodeSetFlag(DeviceNode, Flag)          \
+    ((DeviceNode)->Flags |= (Flag))
+
+/*
+ * VOID
+ * IopDeviceNodeClearFlag(
+ *   PDEVICE_NODE DeviceNode,
+ *   ULONG Flag);
+ */
+#define IopDeviceNodeClearFlag(DeviceNode, Flag)        \
+    ((DeviceNode)->Flags &= ~(Flag))
+
+/*
+ * BOOLEAN
+ * IopDeviceNodeHasFlag(
+ *   PDEVICE_NODE DeviceNode,
+ *   ULONG Flag);
+ */
+#define IopDeviceNodeHasFlag(DeviceNode, Flag)          \
+    (((DeviceNode)->Flags & (Flag)) > 0)
+
+/*
+ * VOID
+ * IopDeviceNodeSetUserFlag(
+ *   PDEVICE_NODE DeviceNode,
+ *   ULONG UserFlag);
+ */
+#define IopDeviceNodeSetUserFlag(DeviceNode, UserFlag)  \
+    ((DeviceNode)->UserFlags |= (UserFlag))
+
+/*
+ * VOID
+ * IopDeviceNodeClearUserFlag(
+ *   PDEVICE_NODE DeviceNode,
+ *   ULONG UserFlag);
+ */
+#define IopDeviceNodeClearUserFlag(DeviceNode, UserFlag)\
+    ((DeviceNode)->UserFlags &= ~(UserFlag))
+
+/*
+ * BOOLEAN
+ * IopDeviceNodeHasUserFlag(
+ *   PDEVICE_NODE DeviceNode,
+ *   ULONG UserFlag);
+ */
+#define IopDeviceNodeHasUserFlag(DeviceNode, UserFlag)  \
+    (((DeviceNode)->UserFlags & (UserFlag)) > 0)
+
+ /*
+ * VOID
+ * IopDeviceNodeSetProblem(
+ *   PDEVICE_NODE DeviceNode,
+ *   ULONG Problem);
+ */
+#define IopDeviceNodeSetProblem(DeviceNode, Problem)    \
+    ((DeviceNode)->Problem |= (Problem))
+
+/*
+ * VOID
+ * IopDeviceNodeClearProblem(
+ *   PDEVICE_NODE DeviceNode,
+ *   ULONG Problem);
+ */
+#define IopDeviceNodeClearProblem(DeviceNode, Problem)  \
+    ((DeviceNode)->Problem &= ~(Problem))
+
+/*
+ * BOOLEAN
+ * IopDeviceNodeHasProblem(
+ *   PDEVICE_NODE DeviceNode,
+ *   ULONG Problem);
+ */
+#define IopDeviceNodeHasProblem(DeviceNode, Problem)    \
+    (((DeviceNode)->Problem & (Problem)) > 0)
+
+/*
+ * VOID
+ * IopInitDeviceTreeTraverseContext(
+ *   PDEVICETREE_TRAVERSE_CONTEXT DeviceTreeTraverseContext,
+ *   PDEVICE_NODE DeviceNode,
+ *   DEVICETREE_TRAVERSE_ROUTINE Action,
+ *   PVOID Context);
+ */
+#define IopInitDeviceTreeTraverseContext(               \
+    _DeviceTreeTraverseContext, _DeviceNode, _Action,   \
+    _Context) {                                         \
+    (_DeviceTreeTraverseContext)->FirstDeviceNode =     \
+        (_DeviceNode);                                  \
+    (_DeviceTreeTraverseContext)->Action = (_Action);   \
+    (_DeviceTreeTraverseContext)->Context = (_Context); }
+
+//
+// Special version of the IRP Overlay used to optimize I/O completion
+// by not using up a separate structure.
+//
 typedef struct _IO_COMPLETION_PACKET
 {
     struct
@@ -65,12 +180,20 @@
     IO_STATUS_BLOCK IoStatus;
 } IO_COMPLETION_PACKET, *PIO_COMPLETION_PACKET;
 
+//
+// Dummy File Object used inside the Open Packet so that OB knows how to
+// deal with the Object Pointer even though it's not a real file.
+//
 typedef struct _DUMMY_FILE_OBJECT
 {
     OBJECT_HEADER ObjectHeader;
     CHAR FileObjectBody[sizeof(FILE_OBJECT)];
 } DUMMY_FILE_OBJECT, *PDUMMY_FILE_OBJECT;
 
+//
+// Open packet used as a context for Device/File parsing so that the parse
+// routine can know what operation is being requested.
+//
 typedef struct _OPEN_PACKET
 {
     CSHORT Type;
@@ -102,8 +225,9 @@
     //PIO_DRIVER_CREATE_CONTEXT DriverCreateContext; Vista only, needs ROS DDK Update
 } OPEN_PACKET, *POPEN_PACKET;
 
-
-/* List of Bus Type GUIDs */
+//
+// List of Bus Type GUIDs
+//
 typedef struct _IO_BUS_TYPE_GUID_LIST
 {
     ULONG GuidCount;
@@ -112,145 +236,114 @@
 } IO_BUS_TYPE_GUID_LIST, *PIO_BUS_TYPE_GUID_LIST;
 extern PIO_BUS_TYPE_GUID_LIST IopBusTypeGuidList;
 
-/* Packet Types */
-#define IrpCompletionPacket     0x1
-#define IrpMiniCompletionPacket 0x2
-
-/*
- * VOID
- * IopDeviceNodeSetFlag(
- *   PDEVICE_NODE DeviceNode,
- *   ULONG Flag);
- */
-#define IopDeviceNodeSetFlag(DeviceNode, Flag) \
-    ((DeviceNode)->Flags |= (Flag))
-
-/*
- * VOID
- * IopDeviceNodeClearFlag(
- *   PDEVICE_NODE DeviceNode,
- *   ULONG Flag);
- */
-#define IopDeviceNodeClearFlag(DeviceNode, Flag) \
-    ((DeviceNode)->Flags &= ~(Flag))
-
-/*
- * BOOLEAN
- * IopDeviceNodeHasFlag(
- *   PDEVICE_NODE DeviceNode,
- *   ULONG Flag);
- */
-#define IopDeviceNodeHasFlag(DeviceNode, Flag) \
-    (((DeviceNode)->Flags & (Flag)) > 0)
-
-/*
- * VOID
- * IopDeviceNodeSetUserFlag(
- *   PDEVICE_NODE DeviceNode,
- *   ULONG UserFlag);
- */
-#define IopDeviceNodeSetUserFlag(DeviceNode, UserFlag) \
-    ((DeviceNode)->UserFlags |= (UserFlag))
-
-/*
- * VOID
- * IopDeviceNodeClearUserFlag(
- *   PDEVICE_NODE DeviceNode,
- *   ULONG UserFlag);
- */
-#define IopDeviceNodeClearUserFlag(DeviceNode, UserFlag) \
-    ((DeviceNode)->UserFlags &= ~(UserFlag))
-
-/*
- * BOOLEAN
- * IopDeviceNodeHasUserFlag(
- *   PDEVICE_NODE DeviceNode,
- *   ULONG UserFlag);
- */
-#define IopDeviceNodeHasUserFlag(DeviceNode, UserFlag) \
-    (((DeviceNode)->UserFlags & (UserFlag)) > 0)
-
- /*
- * VOID
- * IopDeviceNodeSetProblem(
- *   PDEVICE_NODE DeviceNode,
- *   ULONG Problem);
- */
-#define IopDeviceNodeSetProblem(DeviceNode, Problem) \
-    ((DeviceNode)->Problem |= (Problem))
-
-/*
- * VOID
- * IopDeviceNodeClearProblem(
- *   PDEVICE_NODE DeviceNode,
- *   ULONG Problem);
- */
-#define IopDeviceNodeClearProblem(DeviceNode, Problem) \
-    ((DeviceNode)->Problem &= ~(Problem))
-
-/*
- * BOOLEAN
- * IopDeviceNodeHasProblem(
- *   PDEVICE_NODE DeviceNode,
- *   ULONG Problem);
- */
-#define IopDeviceNodeHasProblem(DeviceNode, Problem) \
-    (((DeviceNode)->Problem & (Problem)) > 0)
-
-
-/*
-   Called on every visit of a node during a preorder-traversal of the device
-   node tree.
-   If the routine returns STATUS_UNSUCCESSFUL the traversal will stop and
-   STATUS_SUCCESS is returned to the caller who initiated the tree traversal.
-   Any other returned status code will be returned to the caller. If a status
-   code that indicates an error (other than STATUS_UNSUCCESSFUL) is returned,
-   the traversal is stopped immediately and the status code is returned to
-   the caller.
- */
-typedef NTSTATUS (*DEVICETREE_TRAVERSE_ROUTINE)(
-    PDEVICE_NODE DeviceNode,
-    PVOID Context
-);
-
-/* Context information for traversing the device tree */
+//
+// Called on every visit of a node during a preorder-traversal of the device
+// node tree.
+// If the routine returns STATUS_UNSUCCESSFUL the traversal will stop and
+// STATUS_SUCCESS is returned to the caller who initiated the tree traversal.
+// Any other returned status code will be returned to the caller. If a status
+// code that indicates an error (other than STATUS_UNSUCCESSFUL) is returned,
+// the traversal is stopped immediately and the status code is returned to
+// the caller.
+//
+typedef
+NTSTATUS
+(*DEVICETREE_TRAVERSE_ROUTINE)(
+    IN PDEVICE_NODE DeviceNode,
+    IN PVOID Context
+);
+
+//
+// Context information for traversing the device tree
+//
 typedef struct _DEVICETREE_TRAVERSE_CONTEXT
 {
-    /* Current device node during a traversal */
+    //
+    // Current device node during a traversal
+    //
     PDEVICE_NODE DeviceNode;
-    /* Initial device node where we start the traversal */
+
+    //
+    // Initial device node where we start the traversal
+    //
     PDEVICE_NODE FirstDeviceNode;
-    /* Action routine to be called for every device node */
+
+    //
+    // Action routine to be called for every device node
+    //
     DEVICETREE_TRAVERSE_ROUTINE Action;
-    /* Context passed to the action routine */
+
+    //
+    // Context passed to the action routine
+    //
     PVOID Context;
 } DEVICETREE_TRAVERSE_CONTEXT, *PDEVICETREE_TRAVERSE_CONTEXT;
 
-/*
- * VOID
- * IopInitDeviceTreeTraverseContext(
- *   PDEVICETREE_TRAVERSE_CONTEXT DeviceTreeTraverseContext,
- *   PDEVICE_NODE DeviceNode,
- *   DEVICETREE_TRAVERSE_ROUTINE Action,
- *   PVOID Context);
- */
-#define IopInitDeviceTreeTraverseContext( \
-  _DeviceTreeTraverseContext, _DeviceNode, _Action, _Context) { \
-  (_DeviceTreeTraverseContext)->FirstDeviceNode = (_DeviceNode); \
-  (_DeviceTreeTraverseContext)->Action = (_Action); \
-  (_DeviceTreeTraverseContext)->Context = (_Context); }
-
-VOID
-PnpInit(VOID);
-
-VOID
-PnpInit2(VOID);
-
-VOID
-IopInitDriverImplementation(VOID);
-
-VOID
-IopInitPnpNotificationImplementation(VOID);
+//
+// Internal Representation of a Disk
+//
+typedef struct _DISKENTRY
+{
+    LIST_ENTRY ListEntry;
+    ULONG DiskNumber;
+    ULONG Signature;
+    ULONG Checksum;
+    PDEVICE_OBJECT DeviceObject;
+} DISKENTRY, *PDISKENTRY; 
+
+//
+// Partition Table Entry
+//
+#include <pshpack1.h>
+typedef struct _PARTITION
+{
+    UCHAR BootFlags;
+    UCHAR StartingHead;
+    UCHAR StartingSector;
+    UCHAR StartingCylinder;
+    UCHAR PartitionType;
+    UCHAR EndingHead;
+    UCHAR EndingSector;
+    UCHAR EndingCylinder;
+    ULONG StartingBlock;
+    ULONG SectorCount;
+} PARTITION, *PPARTITION;
+
+//
+// Boot Record Structure
+//
+typedef struct _PARTITION_SECTOR
+{
+  UCHAR BootCode[440];
+  ULONG Signature;
+  UCHAR Reserved[2];
+  PARTITION Partition[PARTITION_TBL_SIZE];
+  USHORT Magic;
+} PARTITION_SECTOR, *PPARTITION_SECTOR;
+#include <poppack.h>
+
+//
+// PNP Routines
+//
+VOID
+PnpInit(
+    VOID
+);
+
+VOID
+PnpInit2(
+    VOID
+);
+
+VOID
+IopInitDriverImplementation(
+    VOID
+);
+
+VOID
+IopInitPnpNotificationImplementation(
+    VOID
+);
 
 VOID
 IopNotifyPlugPlayNotification(
@@ -262,26 +355,108 @@
 );
 
 NTSTATUS
-IopGetSystemPowerDeviceObject(PDEVICE_OBJECT *DeviceObject);
+IopGetSystemPowerDeviceObject(
+    IN PDEVICE_OBJECT *DeviceObject
+);
 
 NTSTATUS
 IopCreateDeviceNode(
-    PDEVICE_NODE ParentNode,
-    PDEVICE_OBJECT PhysicalDeviceObject,
-    PDEVICE_NODE *DeviceNode
-);
-
-NTSTATUS
-IopFreeDeviceNode(PDEVICE_NODE DeviceNode);
-
-VOID
-IoInitCancelHandling(VOID);
-
-VOID
-IoInitFileSystemImplementation(VOID);
-
-VOID
-IoInitVpbImplementation(VOID);
+    IN PDEVICE_NODE ParentNode,
+    IN PDEVICE_OBJECT PhysicalDeviceObject,
+    OUT PDEVICE_NODE *DeviceNode
+);
+
+NTSTATUS
+IopFreeDeviceNode(
+    IN PDEVICE_NODE DeviceNode
+);
+
+NTSTATUS
+IopInitiatePnpIrp(
+    IN PDEVICE_OBJECT DeviceObject,
+    IN PIO_STATUS_BLOCK IoStatusBlock,
+    IN ULONG MinorFunction,
+    IN PIO_STACK_LOCATION Stack
+);
+
+PDEVICE_NODE
+FASTCALL
+IopGetDeviceNode(
+    IN PDEVICE_OBJECT DeviceObject
+);
+
+NTSTATUS
+IopActionConfigureChildServices(
+    IN PDEVICE_NODE DeviceNode,
+    IN PVOID Context
+);
+
+NTSTATUS
+IopActionInitChildServices(
+    IN PDEVICE_NODE DeviceNode,
+    IN PVOID Context,
+    IN BOOLEAN BootDrivers
+);
+
+NTSTATUS
+IoCreateDriverList(
+    VOID
+);
+
+NTSTATUS
+IoDestroyDriverList(
+    VOID
+);
+
+NTSTATUS 
+INIT_FUNCTION
+IopInitPlugPlayEvents(VOID);
+
+NTSTATUS
+IopQueueTargetDeviceEvent(
+    const GUID *Guid,
+    PUNICODE_STRING DeviceIds
+);
+
+NTSTATUS
+IopInitializePnpServices(
+    IN PDEVICE_NODE DeviceNode,
+    IN BOOLEAN BootDrivers)
+;
+
+NTSTATUS
+IopInvalidateDeviceRelations(
+    IN PDEVICE_NODE DeviceNode,
+    IN DEVICE_RELATION_TYPE Type
+);
+
+//
+// Initialization Routines
+//
+NTSTATUS
+IoCreateArcNames(
+    VOID
+);
+
+NTSTATUS
+IoCreateSystemRootLink(
+    IN PCHAR ParameterLine
+);
+
+//
+// Device/Volume Routines
+//
+NTSTATUS
+FASTCALL
+IopInitializeDevice(
+    IN PDEVICE_NODE DeviceNode,
+    IN PDRIVER_OBJECT DriverObject
+);
+
+NTSTATUS
+IopStartDevice(
+    IN PDEVICE_NODE DeviceNode
+);
 
 NTSTATUS
 IoMountVolume(
@@ -290,116 +465,120 @@
 );
 
 PVOID 
-IoOpenSymlink(PVOID SymbolicLink);
-
-PVOID 
+IoOpenSymlink(
+    IN PVOID SymbolicLink
+);
+
+PVOID
 IoOpenFileOnDevice(
-    PVOID SymbolicLink, 
-    PWCHAR Name
+    IN PVOID SymbolicLink,
+    IN PWCHAR Name
 );
 
 NTSTATUS
 STDCALL
-IopCreateDevice(
-    PVOID ObjectBody,
-    PVOID Parent,
-    PWSTR RemainingPath,
-    POBJECT_ATTRIBUTES ObjectAttributes
-);
-
-NTSTATUS
+IopAttachVpb(
+    IN PDEVICE_OBJECT DeviceObject
+);
+
+VOID
+IoInitFileSystemImplementation(
+    VOID
+);
+
+VOID
+IoInitVpbImplementation(
+    VOID
+);
+
+//
+// Shutdown routines
+//
+VOID
+IoInitShutdownNotification(
+    VOID
+);
+
+VOID
+IoShutdownRegisteredDevices(
+    VOID
+);
+
+VOID
+IoShutdownRegisteredFileSystems(
+    VOID
+);
+
+//
+// Boot logging support
+//
+VOID
+IopInitBootLog(
+    IN BOOLEAN StartBootLog
+);
+
+VOID
+IopStartBootLog(
+    VOID
+);
+
+VOID
+IopStopBootLog(
+    VOID
+);
+
+VOID
+IopBootLog(
+    IN PUNICODE_STRING DriverName,
+    IN BOOLEAN Success
+);
+
+VOID
+IopSaveBootLogToFile(
+    VOID
+);
+
+//
+// I/O Cancellation Routines
+//
+VOID
 STDCALL
-IopAttachVpb(PDEVICE_OBJECT DeviceObject);
-
-VOID
-IoInitShutdownNotification(VOID);
-
-VOID
-IoShutdownRegisteredDevices(VOID);
-
-VOID
-IoShutdownRegisteredFileSystems(VOID);
-
-NTSTATUS
-IoCreateArcNames(VOID);
-
-NTSTATUS
-IoCreateSystemRootLink(PCHAR ParameterLine);
-
-NTSTATUS
-IopInitiatePnpIrp(
-    PDEVICE_OBJECT DeviceObject,
-    PIO_STATUS_BLOCK IoStatusBlock,
-    ULONG MinorFunction,
-    PIO_STACK_LOCATION Stack
-);
-
-NTSTATUS
-IoCreateDriverList(VOID);
-
-NTSTATUS
-IoDestroyDriverList(VOID);
-
-/* bootlog.c */
-
-VOID
-IopInitBootLog(BOOLEAN StartBootLog);
-
-VOID
-IopStartBootLog(VOID);
-
-VOID
-IopStopBootLog(VOID);
-
-VOID
-IopBootLog(
-    PUNICODE_STRING DriverName, 
-    BOOLEAN Success
-);
-
-VOID
-IopSaveBootLogToFile(VOID);
-
-/* cancel.c */
-
-VOID
+IoCancelThreadIo(
+    IN PETHREAD Thread
+);
+
+VOID
+IoInitCancelHandling(
+    VOID
+);
+
+//
+// Error Logging Routines
+//
+
+NTSTATUS
+IopInitErrorLog(
+    VOID
+);
+
+//
+// Raw File System MiniDriver
+//
+BOOLEAN
+RawFsIsRawFileSystemDeviceObject(
+    IN PDEVICE_OBJECT DeviceObject
+);
+
+NTSTATUS
 STDCALL
-IoCancelThreadIo(PETHREAD Thread);
-
-/* errlog.c */
-
-NTSTATUS
-IopInitErrorLog(VOID);
-
-/* rawfs.c */
-
-BOOLEAN
-RawFsIsRawFileSystemDeviceObject(IN PDEVICE_OBJECT DeviceObject);
-
-NTSTATUS
-STDCALL
-RawFsDriverEntry(PDRIVER_OBJECT DriverObject,
-                 PUNICODE_STRING RegistryPath);
-
-
-/* pnpmgr.c */
-
-PDEVICE_NODE
-FASTCALL
-IopGetDeviceNode(PDEVICE_OBJECT DeviceObject);
-
-NTSTATUS
-IopActionConfigureChildServices(PDEVICE_NODE DeviceNode,
-                                PVOID Context);
-
-NTSTATUS
-IopActionInitChildServices(PDEVICE_NODE DeviceNode,
-                           PVOID Context,
-                           BOOLEAN BootDrivers);
-
-
-/* pnproot.c */
-
+RawFsDriverEntry(
+    IN PDRIVER_OBJECT DriverObject,
+    IN PUNICODE_STRING RegistryPath
+);
+
+//
+// PnP Root MiniDriver
+//
 NTSTATUS
 STDCALL
 PnpRootDriverEntry(
@@ -408,47 +587,42 @@
 );
 
 NTSTATUS
-PnpRootCreateDevice(PDEVICE_OBJECT *PhysicalDeviceObject);
-
-/* device.c */
-
-NTSTATUS 
-FASTCALL
-IopInitializeDevice(
-    PDEVICE_NODE DeviceNode,
-    PDRIVER_OBJECT DriverObject
-);
-
-NTSTATUS
-IopStartDevice(PDEVICE_NODE DeviceNode);
-
-/* driver.c */
-
-VOID
-FASTCALL
-IopInitializeBootDrivers(VOID);
-
-VOID
-FASTCALL
-IopInitializeSystemDrivers(VOID);
+PnpRootCreateDevice(
+    IN OUT PDEVICE_OBJECT *PhysicalDeviceObject
+);
+
+//
+// Driver Routines
+//
+VOID
+FASTCALL
+IopInitializeBootDrivers(
+    VOID
+);
+
+VOID
+FASTCALL
+IopInitializeSystemDrivers(
+    VOID
+);
 
 NTSTATUS
 FASTCALL
 IopCreateDriverObject(
-    PDRIVER_OBJECT *DriverObject,
-    PUNICODE_STRING ServiceName,
-    ULONG CreateAttributes,
-    BOOLEAN FileSystemDriver,
-    PVOID DriverImageStart,
-    ULONG DriverImageSize
+    OUT PDRIVER_OBJECT *DriverObject,
+    IN PUNICODE_STRING ServiceName,
+    IN ULONG CreateAttributes,
+    IN BOOLEAN FileSystemDriver,
+    IN PVOID DriverImageStart,
+    IN ULONG DriverImageSize
 );
 
 NTSTATUS
 FASTCALL
 IopGetDriverObject(
-    PDRIVER_OBJECT *DriverObject,
-    PUNICODE_STRING ServiceName,
-    BOOLEAN FileSystem
+    OUT PDRIVER_OBJECT *DriverObject,
+    IN PUNICODE_STRING ServiceName,
+    IN BOOLEAN FileSystem
 );
 
 NTSTATUS
@@ -471,20 +645,25 @@
 NTSTATUS
 FASTCALL
 IopAttachFilterDrivers(
-    PDEVICE_NODE DeviceNode,
-    BOOLEAN Lower
-);
-
-VOID
-FASTCALL
-IopMarkLastReinitializeDriver(VOID);
-
-VOID
-FASTCALL
-IopReinitializeDrivers(VOID);
-
-/* file.c */
-
+    IN PDEVICE_NODE DeviceNode,
+    IN BOOLEAN Lower
+);
+
+VOID
+FASTCALL
+IopMarkLastReinitializeDriver(
+    VOID
+);
+
+VOID
+FASTCALL
+IopReinitializeDrivers(
+    VOID
+);
+
+//
+// File Routines
+//
 NTSTATUS
 NTAPI
 IopParseDevice(
@@ -517,29 +696,31 @@
 
 VOID
 STDCALL
-IopDeleteFile(PVOID ObjectBody);
+IopDeleteFile(
+    IN PVOID ObjectBody
+);
 
 NTSTATUS
 STDCALL
 IopSecurityFile(
-    PVOID ObjectBody,
-    SECURITY_OPERATION_CODE OperationCode,
-    SECURITY_INFORMATION SecurityInformation,
-    PSECURITY_DESCRIPTOR SecurityDescriptor,
-    PULONG BufferLength,
-	PSECURITY_DESCRIPTOR *OldSecurityDescriptor,    
-    POOL_TYPE PoolType,
-    PGENERIC_MAPPING GenericMapping
+    IN PVOID ObjectBody,
+    IN SECURITY_OPERATION_CODE OperationCode,
+    IN SECURITY_INFORMATION SecurityInformation,
+    IN OUT PSECURITY_DESCRIPTOR SecurityDescriptor,
+    IN OUT PULONG BufferLength,
+    OUT PSECURITY_DESCRIPTOR *OldSecurityDescriptor,
+    IN POOL_TYPE PoolType,
+    IN OUT PGENERIC_MAPPING GenericMapping
 );
 
 NTSTATUS
 STDCALL
 IopQueryNameFile(
-    PVOID ObjectBody,
+    IN PVOID ObjectBody,
     IN BOOLEAN HasName,
-    POBJECT_NAME_INFORMATION ObjectNameInfo,
-    ULONG Length,
-    PULONG ReturnLength,
+    OUT POBJECT_NAME_INFORMATION ObjectNameInfo,
+    IN ULONG Length,
+    OUT PULONG ReturnLength,
     IN KPROCESSOR_MODE PreviousMode
 );
 
@@ -553,54 +734,33 @@
     IN ULONG SystemHandleCount
 );
 
-/* plugplay.c */
-
-NTSTATUS 
-INIT_FUNCTION
-IopInitPlugPlayEvents(VOID);
-
-NTSTATUS
-IopQueueTargetDeviceEvent(
-    const GUID *Guid,
-    PUNICODE_STRING DeviceIds
-);
-
-/* pnpmgr.c */
-
-NTSTATUS
-IopInitializePnpServices(
-    IN PDEVICE_NODE DeviceNode,
-    IN BOOLEAN BootDrivers)
-;
-
-NTSTATUS
-IopInvalidateDeviceRelations(
-    IN PDEVICE_NODE DeviceNode,
-    IN DEVICE_RELATION_TYPE Type
-);
-
-/* timer.c */
-VOID
-FASTCALL
-IopInitTimerImplementation(VOID);
+//
+// I/O Timer Routines
+//
+VOID
+FASTCALL
+IopInitTimerImplementation(
+    VOID
+);
 
 VOID
 STDCALL
-IopRemoveTimerFromTimerList(IN PIO_TIMER Timer);
-
-/* iocomp.c */
-VOID
-FASTCALL
-IopInitIoCompletionImplementation(VOID);
-
-#define CM_RESOURCE_LIST_SIZE(ResList) \
-  (ResList->Count == 1) ? \
-    FIELD_OFFSET(CM_RESOURCE_LIST, List[0].PartialResourceList. \
-                 PartialDescriptors[(ResList)->List[0].PartialResourceList.Count]) \
-                        : \
-    FIELD_OFFSET(CM_RESOURCE_LIST, List)
-
-/* xhal.c */
+IopRemoveTimerFromTimerList(
+    IN PIO_TIMER Timer
+);
+
+//
+// I/O Completion Routines
+//
+VOID
+FASTCALL
+IopInitIoCompletionImplementation(
+    VOID
+);
+
+//
+// I/O HAL Entrypoints
+//
 NTSTATUS
 FASTCALL
 xHalQueryDriveLayout(
@@ -618,7 +778,7 @@
     OUT PVOID *Buffer
 );
 
-VOID 
+VOID
 FASTCALL
 xHalIoAssignDriveLetters(
     IN PROS_LOADER_PARAMETER_BLOCK LoaderBlock,
@@ -627,16 +787,16 @@
     OUT PSTRING NtSystemPathString
 );
 
-NTSTATUS 
+NTSTATUS
 FASTCALL
 xHalIoReadPartitionTable(
-    PDEVICE_OBJECT DeviceObject,
-    ULONG SectorSize,
-    BOOLEAN ReturnRecognizedPartitions,
-    PDRIVE_LAYOUT_INFORMATION *PartitionBuffer
-);
-
-NTSTATUS 
+    IN PDEVICE_OBJECT DeviceObject,
+    IN ULONG SectorSize,
+    IN BOOLEAN ReturnRecognizedPartitions,
+    OUT PDRIVE_LAYOUT_INFORMATION *PartitionBuffer
+);
+
+NTSTATUS
 FASTCALL
 xHalIoSetPartitionInformation(
     IN PDEVICE_OBJECT DeviceObject,
@@ -645,7 +805,7 @@
     IN ULONG PartitionType
 );
 
-NTSTATUS 
+NTSTATUS
 FASTCALL
 xHalIoWritePartitionTable(
     IN PDEVICE_OBJECT DeviceObject,
@@ -655,4 +815,10 @@
     IN PDRIVE_LAYOUT_INFORMATION PartitionBuffer
 );
 
-#endif
+//
+// Global I/O Data
+//
+extern POBJECT_TYPE IoCompletionType;
+extern PDEVICE_NODE IopRootDeviceNode;
+extern ULONG IopTraceLevel;
+

Modified: trunk/reactos/ntoskrnl/io/irp.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/io/irp.c?rev=22703&r1=22702&r2=22703&view=diff
==============================================================================
--- trunk/reactos/ntoskrnl/io/irp.c (original)
+++ trunk/reactos/ntoskrnl/io/irp.c Fri Jun 30 03:52:45 2006
@@ -1,11 +1,11 @@
 /*
- * COPYRIGHT:       See COPYING in the top level directory
- * PROJECT:         ReactOS kernel
+ * PROJECT:         ReactOS Kernel
+ * LICENSE:         GPL - See COPYING in the top level directory
  * FILE:            ntoskrnl/io/irp.c
- * PURPOSE:         Handle IRPs
- *
- * PROGRAMMERS:     Alex Ionescu (alex at relsoft.net)
- *                  David Welch (welch at mcmail.com)
+ * PURPOSE:         IRP Handling Functions
+ * PROGRAMMERS:     Alex Ionescu (alex.ionescu at reactos.org)
+ *                  Gunnar Dalsnes
+ *                  Filip Navara (navaraf at reactos.org)
  */
 
 /* INCLUDES ****************************************************************/
@@ -45,6 +45,8 @@
     PETHREAD IrpThread;
     PLIST_ENTRY IrpEntry;
     PIO_ERROR_LOG_PACKET ErrorLogEntry;
+    PDEVICE_OBJECT DeviceObject = NULL;
+    PIO_STACK_LOCATION IoStackLocation;
 
     /* First, raise to APC to protect IrpList */
     KeRaiseIrql(APC_LEVEL, &OldIrql);
@@ -61,26 +63,48 @@
     /* Get the misbehaving IRP */
     IrpEntry = IrpThread->IrpList.Flink;
     DeadIrp = CONTAINING_RECORD(IrpEntry, IRP, ThreadListEntry);
+    IOTRACE(IO_IRP_DEBUG,
+            "%s - Deassociating IRP %p for %p\n",
+            __FUNCTION__,
+            DeadIrp,
+            IrpThread);
+
+    /* Don't cancel the IRP if it's already been completed far */
+    if (DeadIrp->CurrentLocation == (DeadIrp->StackCount + 2))
+    {
+        /* Return */
+        KeLowerIrql(OldIrql);
+        return;
+    }
 
     /* Disown the IRP! */
     DeadIrp->Tail.Overlay.Thread = NULL;
+    RemoveHeadList(&IrpThread->IrpList);
     InitializeListHead(&DeadIrp->ThreadListEntry);
-    RemoveHeadList(&IrpThread->IrpList);
-
-    /* Lower IRQL now */
+
+    /* Get the stack location and check if it's valid */
+    IoStackLocation = IoGetCurrentIrpStackLocation(DeadIrp);
+    if (DeadIrp->CurrentLocation <= DeadIrp->StackCount)
+    {
+        /* Get the device object */
+        DeviceObject = IoStackLocation->DeviceObject;
+    }
+
+    /* Lower IRQL now, since we have the pointers we need */
     KeLowerIrql(OldIrql);
 
     /* Check if we can send an Error Log Entry*/
-    if (DeadIrp->CurrentLocation <= DeadIrp->StackCount)
+    if (DeviceObject)
     {
         /* Allocate an entry */
-        ErrorLogEntry = IoAllocateErrorLogEntry(
-            IoGetCurrentIrpStackLocation(DeadIrp)->DeviceObject,
-                                         sizeof(IO_ERROR_LOG_PACKET));
-
-        /* Write the entry */
-        ErrorLogEntry->ErrorCode = 0xBAADF00D; /* FIXME */
-        IoWriteErrorLogEntry(ErrorLogEntry);
+        ErrorLogEntry = IoAllocateErrorLogEntry(DeviceObject,
+                                                sizeof(IO_ERROR_LOG_PACKET));
+        if (ErrorLogEntry)
+        {
+            /* Write the entry */
+            ErrorLogEntry->ErrorCode = 0xBAADF00D; /* FIXME */
+            IoWriteErrorLogEntry(ErrorLogEntry);
+        }
     }
 }
 
@@ -90,6 +114,11 @@
               IN PFILE_OBJECT FileObject)
 {
     PMDL Mdl;
+    IOTRACE(IO_IRP_DEBUG,
+            "%s - Cleaning IRP %p for %p\n",
+            __FUNCTION__,
+            Irp,
+            FileObject);
 
     /* Check if there's an MDL */
     while ((Mdl = Irp->MdlAddress))
@@ -99,15 +128,19 @@
         IoFreeMdl(Mdl);
     }
 
-    /* Free the buffer */
+    /* Check if the IRP has system buffer */
     if (Irp->Flags & IRP_DEALLOCATE_BUFFER)
     {
+        /* Free the buffer */
         ExFreePoolWithTag(Irp->AssociatedIrp.SystemBuffer, TAG_SYS_BUF);
     }
 
-    /* Derefernce the User Event */
-    if (Irp->UserEvent && !(Irp->Flags & IRP_SYNCHRONOUS_API) && FileObject)
-    {
+    /* Check if this IRP has a user event, a file object, and is async */
+    if ((Irp->UserEvent) &&
+        !(Irp->Flags & IRP_SYNCHRONOUS_API) &&
+        (FileObject))
+    {
+        /* Derefernce the User Event */
         ObDereferenceObject(Irp->UserEvent);
     }
 




More information about the Ros-diffs mailing list