This PR updates the behaviour of `NtQueryDirectoryFile`, bringing it in line with current Windows behaviour. The need for this update was discovered when attempting to build the Unreal Engine with MSVC under Wine. In certain cases conditional include statements do not behave as expected, due to MSVC depending on undocumented behaviour of `NtQueryDirectoryFile`.
We ran tests on multiple versions of Windows, and discovered that the behaviour has changed since the original Wine implementation, but the documentation has not. The source code for our test tool, and a set of results can be found [here](https://github.com/TensorWorks/NtQueryDirectoryFile-Test). As of Windows 8, calling `NtQueryDirectoryFile` with a re-used handle, a new mask, and setting the `RestartScan` flag to True, causes the cached results to be erased and a new scan to be performed with the updated mask. Currently, Wine performs as did earlier versions of Windows, where the changed mask is ignored, and the cache is reused. This can cause `NtQueryDirectoryFile` under Wine to falsely report that files exist, when they do not.
This PR corrects this behaviour, invalidating the cache when required. Implementing this exposed further undocumented behaviour of `NtQueryDirectoryFile`, where a search for a non-existent file will return either `STATUS_NO_MORE_FILES` or `STATUS_NO_SUCH_FILE`, depending on whether or not the handle had been previously used regardless of the value of `RestartScan`. This was reflected in a `winetest` which allowed for the response to be either `STATUS_SUCCESS` or `STATUS_NO_MORE_FILES`.
This patch also adds unit tests for the new behaviour of `NtQueryDirectoryFile`. These tests pass when running `winetest` under Windows, and under Wine with these changes in place, but they will fail under older versions of Wine. If run under older versions of Windows the test suite will detect that this functionality is not supported, and will not run the updated tests.
--
v7: ntdll: Update NtQueryDirectoryFile to purge cache if scan is reset with a new mask
ntdll: Test updated NtQueryDirectoryFile mask reset behaviour
https://gitlab.winehq.org/wine/wine/-/merge_requests/6904
I know it's been a year, but I'm not sure where else would be best to ask this, so:
Are there plans to support XDG_DECORATION in WINE ~11, and will it prefer SSDs on the application-side?
Aside from that, for those who have to deal with the CSD titlebars, is there any desire to upgrade the CSDs from Windows Classic to Windows Basic CSDs? All the textures for Windows Basic exist in Windows XP msstyles, afterall, given Windows Basic derivatives from Windows XP's window manager afterall, and this solution would also ensure consistency with programs that use Windows Basic's textures such as Mozilla Firefox.
Upgrading the CSDs to Windows Basic, especially now they're exposed to users as a requirement in GNOME, would likely be the preferred way, for users of visual styles, to have the CSDs be improved, would still provide the opportunity for WINE to have its own custom window decorations due to the WINE Visual Style, and would also preserve the Windows Classic CSDs for users who opt out of Visual Styles entirely. If GNOME CSDs are desired later down the line, those could be supplied via the "Use GTK+ theme as Visual Style" experiment or new Wine Configuration option.
--
https://gitlab.winehq.org/wine/wine/-/merge_requests/3909#note_93141