[PATCH v3 4/5] ntdll: Return STATUS_PENDING from NtWriteFile() for async write.

Jacek Caban jacek at codeweavers.com
Mon Mar 4 16:15:44 CST 2019


On 3/4/19 6:57 PM, Paul Gofman wrote:
> On 3/4/19 20:10, Jacek Caban wrote:
>> On 3/4/19 3:03 PM, Paul Gofman wrote:
>>> Hello Jacek,
>>>
>>>     so far I grepped the source tree for the WriteFile. This was 
>>> supposed to show me WriteFileEx and NtWriteFile calls too. If 
>>> LPOVERLAPPED (the last parameter to WriteFile) is NULL, WriteFile is 
>>> going to fail with async file handles (at least for regular / serial 
>>> / device files) regardless of actual sync or async.
>>
>>
>> Why would WriteFile with NULL overlapped fail? It will wait on 
>> provided handle, which is suboptimal, but it should work. Anyway, 
>> it's fine to skip those cases in your case.
>>
> While kernel32.WriteFile() is ok with NULL overlapped structure and is 
> ready to wait, NtWriteFile() is not: it will get 'PLARGE_INTEGER 
> offset' parameter as NULL from kernel32.WriteFile, and will fail with 
> STATUS_INVALID_PARAMETER for async files (at least regular, serial or 
> device files). I also just tested that on a minimal example which 
> attempts to call kernel32.WriteFile() without overlapped structure, 
> this fails for me for file created with FILE_FLAG_OVERLAPPED both 
> under Wine and Windows 7.


Ah, right.


>
>>
>>> Do you think it makes sense if I proceed to change ntdll tests as 
>>> described before (marking pre-Vista behaviour as invalid) and then 
>>> resend the patch concerning NtWriteFile() with the async return for 
>>> regular files only? 
>>
>>
>> Mostly yes. I'm not sure about doing this only for regular files, 
>> through. I know it addresses my concern, but your testing seems to 
>> indicate that it's pipes that are unusual and, as far as I 
>> understand, all other tested types return STATUS_PENDING. If that's 
>> the case, maybe we should return STATUS_PENDING without depending on 
>> handle type?
>>
> My testing covered regular files so far. The change (in its initial 
> form) can pass the existing tests for special files (as STATUS_PENDING 
> return is surely possible for the other types), but I don't think we 
> have enough tests yet to be sure it is always async for all the file 
> types. Besides pipes (for which we probably should avoid always 
> returning async, even if NtReadFile() is not used in Wine for them?), 
> I would expect sync return to be possible at least for sockets.


Named pipes on Wine use NtWriteFile, just not the code path that you 
change. They just call server_write_file. The same is true for device files.


> It is also hard to be sure whether we really can never get sync result 
> from a special file, or just did not reproduce the right case. I also 
> thought that in any case, even if sockets and all the other types turn 
> out to work async always, it is safer to change the behaviour in 
> smaller parts for more precise bisect in case of regressions (yes, my 
> initial patch did it for all file types together, but I tend to treat 
> that as a very unfortunate overlook from my side).


Sounds reasonable to me.


> Anyway, if you feel like it is better to cover that in respect to all 
> the possible file types, I can start thinking of adding fd type 
> specific tests. In this case, do you think we should try bringing all 
> the tests directly to ntdll/tests, or rather extend the tests existing 
> elsewhere (e. g. in ws2_32 for sockets)? I would probably stick to the 
> latter unless there are reasons not to.


I didn't really mean sockets specifically. Mailslot may be easier to 
test just as a data point. I just quickly tested that and mailslots, 
like named pipes, don't return STATUS_PENDING. With that information, 
making the change only for regular files seems indeed better.


Thanks,

Jacek




More information about the wine-devel mailing list