implemeted waiting on file handles/file objects

svn path=/trunk/; revision=4527
This commit is contained in:
Gunnar Dalsnes 2003-04-12 20:34:27 +00:00
parent 7b5e0bebdf
commit 0871ebf88b

View file

@ -409,6 +409,20 @@ KeWaitForSingleObject(PVOID Object,
} }
inline
PVOID
KiGetWaitableObjectFromObject(PVOID Object)
{
//special case when waiting on file objects
if ( ((PDISPATCHER_HEADER)Object)->Type == InternalFileType)
{
return &((PFILE_OBJECT)Object)->Event;
}
return Object;
}
NTSTATUS STDCALL NTSTATUS STDCALL
KeWaitForMultipleObjects(ULONG Count, KeWaitForMultipleObjects(ULONG Count,
PVOID Object[], PVOID Object[],
@ -485,7 +499,7 @@ KeWaitForMultipleObjects(ULONG Count,
Abandoned = FALSE; Abandoned = FALSE;
for (i = 0; i < Count; i++) for (i = 0; i < Count; i++)
{ {
hdr = (DISPATCHER_HEADER *) Object[i]; hdr = (DISPATCHER_HEADER *) KiGetWaitableObjectFromObject(Object[i]);
if (KiIsObjectSignalled(hdr, CurrentThread)) if (KiIsObjectSignalled(hdr, CurrentThread))
{ {
@ -518,7 +532,7 @@ KeWaitForMultipleObjects(ULONG Count,
{ {
for (i = 0; i < Count; i++) for (i = 0; i < Count; i++)
{ {
hdr = (DISPATCHER_HEADER *) Object[i]; hdr = (DISPATCHER_HEADER *) KiGetWaitableObjectFromObject(Object[i]);
Abandoned = KiSideEffectsBeforeWake(hdr, CurrentThread) ? TRUE : Abandoned; Abandoned = KiSideEffectsBeforeWake(hdr, CurrentThread) ? TRUE : Abandoned;
} }
@ -566,9 +580,9 @@ KeWaitForMultipleObjects(ULONG Count,
for (i = 0; i < Count; i++) for (i = 0; i < Count; i++)
{ {
hdr = (DISPATCHER_HEADER *) Object[i]; hdr = (DISPATCHER_HEADER *) KiGetWaitableObjectFromObject(Object[i]);
blk->Object = Object[i]; blk->Object = KiGetWaitableObjectFromObject(Object[i]);
blk->Thread = CurrentThread; blk->Thread = CurrentThread;
blk->WaitKey = STATUS_WAIT_0 + i; blk->WaitKey = STATUS_WAIT_0 + i;
blk->WaitType = WaitType; blk->WaitType = WaitType;