[NTOSKRNL]

- Fixed IoGetRequestorProcess, IoGetRequestorProcessId, IoGetRequestorSessionId
- Pass user buffer in NtNotifyChangeDirectoryFile
- Fixed magic value in IoGetPagingIoPriority
Patch by Pierre Schweitzer

svn path=/trunk/; revision=48557
This commit is contained in:
Timo Kreuzer 2010-08-16 20:18:25 +00:00
parent 49a96cdea9
commit 2ded5adf7c
4 changed files with 31 additions and 6 deletions

View 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

View 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

View 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;

View 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,9 +1603,14 @@ NTAPI
IoGetRequestorProcess(IN PIRP Irp)
{
/* Return the requestor process */
if (Irp->Tail.Overlay.Thread)
{
return Irp->Tail.Overlay.Thread->ThreadsProcess;
}
return NULL;
}
/*
* @implemented
*/
@ -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,11 +1637,19 @@ NTAPI
IoGetRequestorSessionId(IN PIRP Irp,
OUT PULONG pSessionId)
{
PEPROCESS Process;
/* Return the session */
*pSessionId = IoGetRequestorProcess(Irp)->Session;
if ((Process = IoGetRequestorProcess(Irp)))
{
*pSessionId = Process->Session;
return STATUS_SUCCESS;
}
*pSessionId = (ULONG)-1;
return STATUS_UNSUCCESSFUL;
}
/*
* @implemented
*/