Was: [ros-dev] Re: [ros-svn] [hbirr] 14988: - Guard the copying
to the IOSB.
Hartmut Birr
hartmut.birr at gmx.de
Fri May 6 01:57:13 CEST 2005
Alex Ionescu wrote:
> Hartmut Birr wrote:
>
>> If the driver has returned STATUS_PENDING and completes the irp later
>> with an error, both events must be signaled, because two different
>> threads may waiting on this events. The IOSB must be also set. The apc
>> must be also deliver (I've tested this with the apc sample and some
>> modifications on windows). There is no difference between completing the
>> irp with and without an error if the driver has returned STATUS_PENDING.
>>
> Your code now says " if (NT_SUCCESS(Irp->IoStatus.Status) ||
> Irp->PendingReturned)". Not only is this incorrect because the flag
> must be checked, but my code had a path which handled this being
> FALSE. Currently ros does not have this path anymore after your
> changes. So if IoStatus.Status is a failure and PendingReturned is not
> set, nothing will be done. In my version of the code (which is what NT
> does), the events were still signaled in a specific case (see old code).
>
If a driver returns immediately with an error status, it isn't necessary
to signal any event. The caller does only wait on the event, if the
driver returns STATUS_PENDING (Some user mode functions may only check
for an error). If the driver returns STATUS_PENDING, the driver has
called IoMarkIrpPending , which sets Irp->PendingReturned. The error
path without STATUS_PENDING must not do anything.
- Hartmut
More information about the Ros-dev
mailing list