#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
#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
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;
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 */
Flags = Irp->Flags;
/* Check what priority it has */
- if (Flags & 0x8000) // FIXME: Undocumented flag
+ if (Flags & IRP_CLASS_CACHE_OPERATION)
{
/* High priority */
Priority = IoPagingPriorityHigh;
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;
}
/*
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;
}
/*
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;
}
/*