Was: [ros-dev] Re: [ros-svn] [hbirr] 14988: - Guard the copying to the IOSB.

Alex Ionescu ionucu at videotron.ca
Thu May 5 19:05:15 CEST 2005


Hartmut Birr wrote:

>Copied from the archive because I will receive the mail in some hours:
>  
>
>>hbirr at svn.reactos.com wrote:
>>    
>>
>
>  
>
>>>- Guard the copying to the IOSB.
>>>- Do the main processing on success or if previous STATUS_PENDING was
>>>      
>>>
>returned.
>  
>
>>>Do not use some of the IRP and FO flags at this point.
>>>
>>>
>>>      
>>>
>>Ok, I was going to complain about this, but I realize that it must be
>>used since defintely some parts of ROS don't work properly with those
>>flags set.
>>    
>>
>
>It isn't possible to use the flags, because some functions are always
>synchronous independently which flags are set. Ntoskrnl may set the
>flags correctly, but a driver may possible not.
>  
>
It's not our job to make 3rd-party drivers happy. If they work on 
Windows, which uses the flags, then they must work on ReactOS. If our 
drivers are broken, then they must be fixed.

>  
>
>>>- Set all results before signaling the events.
>>>- Signal the FO event previous the user event.
>>>- Made the code a little bit shorter.
>>>
>>>
>>>
>>>      
>>>
>>I like your changes and have no complaints, except that the signaling
>>semantics of the File/User events should be different in the failure
>>case (my "else" path). You've completely removed that path and thus
>>changed the logic.
>>    
>>
>
>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).

Best regards,
Alex Ionescu



More information about the Ros-dev mailing list