[NTOSKRNL]
authorTimo Kreuzer <timo.kreuzer@reactos.org>
Mon, 16 Aug 2010 20:18:25 +0000 (20:18 +0000)
committerTimo Kreuzer <timo.kreuzer@reactos.org>
Mon, 16 Aug 2010 20:18:25 +0000 (20:18 +0000)
- Fixed IoGetRequestorProcess, IoGetRequestorProcessId, IoGetRequestorSessionId
- Pass user buffer in NtNotifyChangeDirectoryFile
- Fixed magic value in IoGetPagingIoPriority
Patch by Pierre Schweitzer

svn path=/trunk/; revision=48557

reactos/include/ddk/wdm.h
reactos/include/xdk/iotypes.h
reactos/ntoskrnl/io/iomgr/iofunc.c
reactos/ntoskrnl/io/iomgr/irp.c

index b1475af..daffb9b 100644 (file)
@@ -5456,6 +5456,8 @@ typedef struct _IO_COMPLETION_CONTEXT {
 #define IRP_DEFER_IO_COMPLETION         0x00000800
 #define IRP_OB_QUERY_NAME               0x00001000
 #define IRP_HOLD_DEVICE_QUEUE           0x00002000
+#define IRP_RETRY_IO_COMPLETION         0x00004000
+#define IRP_CLASS_CACHE_OPERATION       0x00008000
 
 #define IRP_QUOTA_CHARGED                 0x01
 #define IRP_ALLOCATED_MUST_SUCCEED        0x02
index 5567324..9e1446c 100644 (file)
@@ -1793,6 +1793,9 @@ $if (_WDMDDK_)
 #define IRP_DEFER_IO_COMPLETION         0x00000800
 #define IRP_OB_QUERY_NAME               0x00001000
 #define IRP_HOLD_DEVICE_QUEUE           0x00002000
+/* The following 2 are missing in latest WDK */
+#define IRP_RETRY_IO_COMPLETION         0x00004000
+#define IRP_CLASS_CACHE_OPERATION       0x00008000
 
 #define IRP_QUOTA_CHARGED                 0x01
 #define IRP_ALLOCATED_MUST_SUCCEED        0x02
index c40e7c9..6a3bfbc 100644 (file)
@@ -1175,6 +1175,7 @@ NtNotifyChangeDirectoryFile(IN HANDLE FileHandle,
     Irp->RequestorMode = PreviousMode;
     Irp->UserIosb = IoStatusBlock;
     Irp->UserEvent = Event;
+    Irp->UserBuffer = Buffer;
     Irp->Tail.Overlay.Thread = PsGetCurrentThread();
     Irp->Tail.Overlay.OriginalFileObject = FileObject;
     Irp->Overlay.AsynchronousParameters.UserApcRoutine = ApcRoutine;
index a578e89..53649f1 100644 (file)
@@ -1415,7 +1415,6 @@ IofCompleteRequest(IN PIRP Irp,
     else
     {
         /* The IRP just got canceled... does a thread still own it? */
-        Thread = Irp->Tail.Overlay.Thread;
         if (Thread)
         {
             /* Yes! There is still hope! Initialize the APC */
@@ -1576,7 +1575,7 @@ IoGetPagingIoPriority(IN PIRP Irp)
     Flags = Irp->Flags;
 
     /* Check what priority it has */
-    if (Flags & 0x8000) // FIXME: Undocumented flag
+    if (Flags & IRP_CLASS_CACHE_OPERATION)
     {
         /* High priority */
         Priority = IoPagingPriorityHigh;
@@ -1604,7 +1603,12 @@ NTAPI
 IoGetRequestorProcess(IN PIRP Irp)
 {
     /* Return the requestor process */
-    return Irp->Tail.Overlay.Thread->ThreadsProcess;
+    if (Irp->Tail.Overlay.Thread)
+    {
+        return Irp->Tail.Overlay.Thread->ThreadsProcess;
+    }
+
+    return NULL;
 }
 
 /*
@@ -1614,8 +1618,15 @@ ULONG
 NTAPI
 IoGetRequestorProcessId(IN PIRP Irp)
 {
+    PEPROCESS Process;
+
     /* Return the requestor process' id */
-    return PtrToUlong(IoGetRequestorProcess(Irp)->UniqueProcessId);
+    if ((Process = IoGetRequestorProcess(Irp)))
+    {
+        return PtrToUlong(Process->UniqueProcessId);
+    }
+
+    return 0;
 }
 
 /*
@@ -1626,9 +1637,17 @@ NTAPI
 IoGetRequestorSessionId(IN PIRP Irp,
                         OUT PULONG pSessionId)
 {
+    PEPROCESS Process;
+
     /* Return the session */
-    *pSessionId = IoGetRequestorProcess(Irp)->Session;
-    return STATUS_SUCCESS;
+    if ((Process = IoGetRequestorProcess(Irp)))
+    {
+        *pSessionId = Process->Session;
+        return STATUS_SUCCESS;
+    }
+
+    *pSessionId = (ULONG)-1;
+    return STATUS_UNSUCCESSFUL;
 }
 
 /*