I stumbled onto this while using freopen() for debugging purposes.
Basically, freopen() fails if the FILE has been created with
an invalid handle.
So, this MR contains:
- basic tests for freopen (no issue there, just for coverage purposes)
- tests for freopen on FILE with invalid handle
- fix for freopen
--
v2: msvcrt: Fix freopen() on FILE with handle=-2.
isfd
msvcrt/tests: Add tests for freopen().
https://gitlab.winehq.org/wine/wine/-/merge_requests/3578
Starting in Sonoma, apps can no longer force themselves to the
foreground with -activateIgnoringOtherApps:. winemac currently does
that in a few places - when an app creates its first window, and in
the implementation of APIs like SetFocus.
There's nothing we can do to work around the new behavior in the
general case. This patch makes Wine apps running in the same prefix
yield to one another, so that windows from multiple EXEs can at least
behave as intended.
---
As noted in a comment, there's an inherent race condition in handling this issue the way I've done it here. Sonoma does provide another API that would theoretically alleviate that, but in practice it has some quirks that make it unsuitable. Gory details follow.
An app can yield activation to either another `NSRunningApplication` (`-yieldActivationToApplication:`) or to the bundle identifier of an application that may not have launched yet (`-yieldActivationToApplicationWithBundleIdentifier:`). Ideally we could just use the latter to issue a blanket yield to the loader/preloader.
A temporary roadblock: yielding to the bundle ID of the loader/preloader doesn't work at all at the moment. It seems that the new APIs rely on LaunchServices' picture of the world, and even though the loader & preloader have an embedded Info.plist, LS only seems to notice them if they're actually in a .app bundle. I hacked that together locally, and yielding to a bundled preloader works, but...
Yields to bundle IDs seem to be canceled if the user interacts with the yielding application in certain ways. This includes clicking or typing into a window, or moving a window around. This is probably part of the "heuristics" that Apple mentioned are involved in deciding whether to let an app come forward.
So, it seems that we need to issue yields directly in response to another app trying to activate itself, rather than trying to do it preemptively. The distributed notification in this patch was the cleanest way I could think to orchestrate that.
--
https://gitlab.winehq.org/wine/wine/-/merge_requests/3582
After investigation, it looks like the PixelOffsetModeHalf/PixelOffsetModeHighQuality is using floating point numbers, while PixelOffsetModeNone/PixelOffsetModeHighSpeed is using integers to calculate bitmap colours.
After using floating numbers, most tests are passing now.
--
v2: gdiplus: implement PixelOffsetModeHighQuality for GdipDrawImagePointsRect
https://gitlab.winehq.org/wine/wine/-/merge_requests/3568
I stumbled onto this while using freopen() for debugging purposes.
Basically, freopen() fails if the FILE has been created with
an invalid handle.
So, this MR contains:
- basic tests for freopen (no issue there, just for coverage purposes)
- tests for freopen on FILE with invalid handle
- fix for freopen
--
https://gitlab.winehq.org/wine/wine/-/merge_requests/3578
This is meant to simplify testing conditions that generally hold true
but may occasionally fail due to interference from external factors
(such as processes that start / stop, network connections being
opened / closed, etc).
The trick is to loop a few times on the set of flaky conditions until
they succeed. During the last attempt all failures are recorded as
usual, while in the previous runs, the tryok() failures area ignored
but cause one more attempt to be made.
The simplest case looks like this:
LOOP_ON_FLAKY_TESTS(3)
{
// ok() failures are never ignored and not retried
ok(..., "check 1", ...);
// tryok() failures are ignored except on the last attempt
tryok(..., "check 2", ...);
}
There is also:
* attempt_retry() which marks the current attempt as failed as if
calling tryok(0), and returns true if another attempt can be made.
* attempt_failed() which returns true if an ok() call failed.
---
This is independent from the 'flaky' mechanism which adds some naming
constraints. The loop macro is still called LOOP_ON_FLAKY_TESTS()
despite being unrelated to the flaky mechanism. The attempt_retry()
and attempt_failed() macro names also don't make it obvious that they
are related to tryok().
I think this mechanism is better than the flaky one because a flaky test
can go bad without anyone noticing, whereas if a tryok() starts failing
systematically it will cause a real failure.
The other side of that coin is that, unlike flaky, the tryok()
mechanism does not entirely eliminate the possibility of getting a
failure, it just reduces it; though by adjusting the maximum number of
attempts one can achieve an arbitrarily low failure rate. For instance
if an ok() call fails 10% of the time and one wants a maximum of 1 in
a million failure rate, use LOOP_ON_FLAKY_TESTS(6). The cost is an
increased run time in the worst case.
This also limits the use of this mechanism to tests that have a
reasonably low failure rate to start with (otherwise one has to loop
too many times). Also note that there are cases where looping
essentially reduce the failure rate to zero. For instance
ieframe:webbrowser fails if IE creates a net session while the test is
counting them. But IE only creates the one net session on start up so
trying even one more time should guarantee that the test will succeed.
Other cases like scheduling delays and the creation of network
connections are more probabilistic in nature. Maybe a comment in test.h
should offer some guideline as to the target failure rate.
Eventually this may replace the flaky mechanism but that depends on
how well it works in practice and how practical it is to loop on flaky
tests. It seems to be going well in the few cases I looked at. But I
think this mechanism has value even if the two end up coexisting
indefinitely.
This MR uses the tryok() in some actual tests for illustration and testing purposes. The final MR will probably split most of those off to separate MRs.
--
v5: ieframe/tests: Work around a network session race condition.
advapi32/tests: Replace the custom loop with the tryok() mechanism.
ntdll/tests: Use tryok() to fix a free disk space race with other processes.
kernel32/tests: Use tryok() to fix a heap race with other processes.
tests: Add tryok() for tests that sometimes get outside interference.
tests: Update the documentation.
https://gitlab.winehq.org/wine/wine/-/merge_requests/3418
It's possible that a state object pointer not in the topology node collection gets passed to
session_get_node_object(). Instead of returning the last node when the object is not found, we
should return a NULL so that the state of the last node is not changed by mistake.
--
v2: mf/tests: Test IMFMediaSession::Start().
mf/tests: Add a create_media_session() helper.
mf: Add seeking support for IMFMediaSession::Start().
mf: Add a session_flush_transform_output_nodes() helper.
mf: Make session_get_node_object() more robust.
https://gitlab.winehq.org/wine/wine/-/merge_requests/3572
Signed-off-by: Torge Matthies <openglfreak(a)googlemail.com>
--
v2: loader: Add Default, Failed, and LastKnownGood values to HKLM\System\Select.
server: Create link from HKLM\System\CurrentControlSet to ControlSet001.
advapi32/tests: Add test for CurrentControlSet link.
https://gitlab.winehq.org/wine/wine/-/merge_requests/3563
Windows 10 [received support](https://devblogs.microsoft.com/commandline/af_unix-comes-to-window… for AF_UNIX sockets in Insider Build 17063. This merge request adds basic support for AF_UNIX sockets to ws2_32 and wineserver.
Of particular note is the difficulty in handling `sun_path`. Most of the functions that allow for translating Windows paths to Unix paths are not accessible from ws2_32. I considered the following options:
* Pass the Windows path to wineserver and do the conversion there.
* This is, as far as I can tell, not possible without major rearchitecting. wineserver does not have functions to translate Windows paths to Unix paths, for obvious reasons.
* Obtain the current working directory of the requesting process and temporarily change directories to there.
* This only handles relative paths and fails for absolute paths, UNC paths, etc.
* Conditionally change directories based on whether the path is relative or not.
* This is error-prone and wineserver does not have the requisite functions to do this cleanly.
I ultimately decided to pass the translated Unix path to wineserver, which changes directories to `dirname(path)`. It then provides `bind` and `connect` with `basename(path)`. This is not threadsafe, but wineserver is not (currently) multithreaded.
Abstract sockets are not fully supported by this patch, matching the behavior of Windows.
--
v47: ws2_32/tests: Add test for AF_UNIX sockets fix.
server: Fix getsockname() and accept() on AF_UNIX sockets.
server: Introduce error when attempting to create a SOCK_DGRAM AF_UNIX socket.
server: Allow for deletion of socket files.
ws2_32: Add support for AF_UNIX sockets.
ntdll/unix: Add support for AF_UNIX sockets to multiple functions.
ws2_32: Add afunix.h header.
https://gitlab.winehq.org/wine/wine/-/merge_requests/2786
This is meant to simplify testing conditions that generally hold true
but may occasionally fail due to interference from external factors
(such as processes that start / stop, network connections being
opened / closed, etc).
The trick is to loop a few times on the set of flaky conditions until
they succeed. During the last attempt all failures are recorded as
usual, while in the previous runs, the tryok() failures area ignored
but cause one more attempt to be made.
The simplest case looks like this:
LOOP_ON_FLAKY_TESTS(3)
{
// ok() failures are never ignored and not retried
ok(..., "check 1", ...);
// tryok() failures are ignored except on the last attempt
tryok(..., "check 2", ...);
}
There is also:
* attempt_retry() which marks the current attempt as failed as if
calling tryok(0), and returns true if another attempt can be made.
* attempt_failed() which returns true if an ok() call failed.
---
This is independent from the 'flaky' mechanism which adds some naming
constraints. The loop macro is still called LOOP_ON_FLAKY_TESTS()
despite being unrelated to the flaky mechanism. The attempt_retry()
and attempt_failed() macro names also don't make it obvious that they
are related to tryok().
I think this mechanism is better than the flaky one because a flaky test
can go bad without anyone noticing, whereas if a tryok() starts failing
systematically it will cause a real failure.
The other side of that coin is that, unlike flaky, the tryok()
mechanism does not entirely eliminate the possibility of getting a
failure, it just reduces it; though by adjusting the maximum number of
attempts one can achieve an arbitrarily low failure rate. For instance
if an ok() call fails 10% of the time and one wants a maximum of 1 in
a million failure rate, use LOOP_ON_FLAKY_TESTS(6). The cost is an
increased run time in the worst case.
This also limits the use of this mechanism to tests that have a
reasonably low failure rate to start with (otherwise one has to loop
too many times). Also note that there are cases where looping
essentially reduce the failure rate to zero. For instance
ieframe:webbrowser fails if IE creates a net session while the test is
counting them. But IE only creates the one net session on start up so
trying even one more time should guarantee that the test will succeed.
Other cases like scheduling delays and the creation of network
connections are more probabilistic in nature. Maybe a comment in test.h
should offer some guideline as to the target failure rate.
Eventually this may replace the flaky mechanism but that depends on
how well it works in practice and how practical it is to loop on flaky
tests. It seems to be going well in the few cases I looked at. But I
think this mechanism has value even if the two end up coexisting
indefinitely.
This MR uses the tryok() in some actual tests for illustration and testing purposes. The final MR will probably split most of those off to separate MRs.
--
v4: mmdevapi/tests: Replace flaky with tryok() in the capture tests.
mmdevapi/tests: Replace flaky with tryok() in the render tests.
quartz/tests: Replace flaky() with tryok() to work around scheduling delays.
DEBUG ieframe/tests: tryok() framework testing ground.
ieframe/tests: Work around a network session race condition.
advapi32/tests: Replace the custom loop with tryok() mechanism.
ntdll/tests: Use tryok() to fix a free disk space race with other processes.
https://gitlab.winehq.org/wine/wine/-/merge_requests/3418
It's possible that a state object pointer not in the topology node collection gets passed to
session_get_node_object(). Instead of returning the last node when the object is not found, we
should return a NULL so that the state of the last node is not changed by mistake.
--
https://gitlab.winehq.org/wine/wine/-/merge_requests/3572
The first few patches will introduce temporary leaks or cyclic refs, but that's because we'll handle them properly with the dispex CC, and the last patch should fix this. Other objects' traversal will follow in another MR.
EDIT: This now does more prep work and converts nodes to use the dispex CC, using temporary helpers, without any other object or temporary leaks yet.
--
v4: mshtml: Release the event target during node unlink.
mshtml: Implement node cycle collection using the dispex.
mshtml: Move ccref from the node to the dispex.
mshtml: Rename EventTarget_QI to EventTarget_QI_no_cc.
mshtml: Rename dispex_query_interface to dispex_query_interface_no_cc.
mshtml: Use designated initializers in node vtables.
mshtml: Use designated initializers in dispex and event target vtables.
mshtml: Make all event target vtbls const.
mshtml: Split IUnknown methods for outer windows into separate vtable.
mshtml: Move console to the inner window.
mshtml: Use ASCII strings for dispex object names.
https://gitlab.winehq.org/wine/wine/-/merge_requests/3542
On Wed Apr 12 05:47:11 2023 +0000, Yeshun Ye wrote:
> Yes, I'm fixing a bug of an application, not implementing the set of
> Endpoint Volume API.
> Do I really need to write some tests?
Well, it's important. We can't risk setting the wrong volume and potentially ruining physical audio equipment (and eardrums).
--
https://gitlab.winehq.org/wine/wine/-/merge_requests/2565#note_42399
This adds all of the information used by the spirv backend to declare descriptor
variables. Most of these are added to the internal
vkd3d_shader_scan_descriptor_info1 structure, but patch 5/5 adds a flag to
enum vkd3d_shader_descriptor_info_flag, which is public API.
The ultimate goal here is to declare SPIR-V descriptor variables from the
scanned descriptor information, thereby avoiding the need to synthesize DCL
instructions for frontends that don't have them (specifically sm1, but it may be
that sm6 would benefit from this as well).
That work is visible here:
https://gitlab.winehq.org/zfigura/vkd3d/-/tree/himavant5
--
This is a follow-up to the already-approved 295, which I am submitting now so
that we're not blocked on Alexandre's vacation.
--
https://gitlab.winehq.org/wine/vkd3d/-/merge_requests/304
The header is unused, and the header check fails with:
configure:7860: checking for PCSC/pcsclite.h
configure:7860: gcc -m32 -c -g -O2 conftest.c >&5
In file included from conftest.c:50:
[...]/include/PCSC/pcsclite.h:45:10:
fatal error: wintypes.h: No such file or directory
45 | #include <wintypes.h>
| ^~~~~~~~~~~~
Fixes: d405a688ba6b5042775d733f57d00ba6318e1d0f
--
v2: configure: don't require pcsclite header for winscard
https://gitlab.winehq.org/wine/wine/-/merge_requests/3574
Current code handles omitted deleteCount but assumes it to be zero in that case. Instead an omitted deleteCount means delete everything from `start`.
This prevents Adobe sign-in page from loading.
--
v6: jscript: fix Array.prototype.splice with omitted deleteCount in ES5+ mode
https://gitlab.winehq.org/wine/wine/-/merge_requests/3567
Current code handles omitted deleteCount but assumes it to be zero in that case. Instead an omitted deleteCount means delete everything from `start`.
This prevents Adobe sign-in page from loading.
--
v7: jscript: fix Array.prototype.splice with omitted deleteCount in ES5+ mode
https://gitlab.winehq.org/wine/wine/-/merge_requests/3567
First, we have to distinguish between the "bind count" and the "allocation size"
of variables.
The "allocation size" affects the starting register id for the resource to
be allocated next, while the "bind count" is determined by the last field
actually used. The former may be larger than the latter.
Currently we are calling `hlsl_reg.bind_count` to what should be `hlsl_reg.allocation_size`.
So it is renamed in 2/4.
The proper "bind count" (now computed when needed in 3/4) is important because it is what should appear in the RDEF
table and some resource allocation rules depend on it
For instance, for this shader:
```
texture2D texs[3];
texture2D tex;
float4 main() : sv_target
{
return texs[0].Load(int3(0, 0, 0)) + tex.Load(int3(0, 0, 0));
}
```
the variable "texs" should show a "bind count" of 1, even though its "allocation size" is 3:
```
// Resource Bindings:
//
// Name Type Format Dim HLSL Bind Count
// ------------------------------ ---------- ------- ----------- -------------- ------
// texs texture float4 2d t0 1
// tex texture float4 2d t3 1
```
In particular, as shown in the tests in 1/4, textures go in this order:
1. Textures created from SM1-style samples. Those whose "bind count" is larger than 1, in the order of the tex1D/tex2D/tex3D/texCube instructions that create them.
2. Textures created from SM1-style samples. Those whose "bind count" is equal to 1, in the order of the tex1D/tex2D/tex3D/texCube instructions that create them.
3. Regular textures in order of declaration.
Note that the difference between 1 and 2 is not given by the "allocation size" but the "bind count".
This order is enforced in 4/4.
--
v2: vkd3d-shader/d3dbc: Use the bind count instead of the allocation size in d3dbc.c.
vkd3d-shader/hlsl: Simplify computation of allocation size.
vkd3d-shader/hlsl: Sort synthetic separated samplers first for SM4.
vkd3d-shader/tpf: Put the actual bind count in the RDEF table.
vkd3d-shader/hlsl: Rename hlsl_reg.bind_count to hlsl_reg.allocation_size.
tests: Test texture allocation ordering in complex scenarios.
https://gitlab.winehq.org/wine/vkd3d/-/merge_requests/299
Current code handles omitted deleteCount but assumes it to be zero in that case. Instead an omitted deleteCount means delete everything from `start`.
This prevents Adobe sign-in page from loading.
--
v5: jscript: fix Array.prototype.splice with omitted deleteCount in html mode
https://gitlab.winehq.org/wine/wine/-/merge_requests/3567
Current code handles omitted deleteCount but assumes it to be zero in that case. Instead an omitted deleteCount means delete everything from `start`.
This prevents Adobe sign-in page from loading.
--
v4: jscript: fix Array.prototype.splice with omitted deleteCount in html mode
https://gitlab.winehq.org/wine/wine/-/merge_requests/3567
The header is unused, and the header check fails with:
configure:7860: checking for PCSC/pcsclite.h
configure:7860: gcc -m32 -c -g -O2 conftest.c >&5
In file included from conftest.c:50:
[...]/include/PCSC/pcsclite.h:45:10:
fatal error: wintypes.h: No such file or directory
45 | #include <wintypes.h>
| ^~~~~~~~~~~~
Fixes: d405a688ba6b5042775d733f57d00ba6318e1d0f
--
https://gitlab.winehq.org/wine/wine/-/merge_requests/3574
On Tue Aug 15 14:52:18 2023 +0000, Ake Rehnman wrote:
> ```plaintext
> int test_ntterminatethread_proc_failed;
> DWORD WINAPI test_ntterminatethread_proc( void *arg )
> {
> DWORD status = (UINT_PTR)arg;
> status = pNtTerminateThread(0, status);
> test_ntterminatethread_proc_failed = 1;
> return status;
> }
> /* verifies NtTerminateThread accepts NULL handle */
> static void test_terminate_thread(void)
> {
> HANDLE thread;
> DWORD exitcode;
> NTSTATUS status;
> test_ntterminatethread_proc_failed = 0;
> status = pNtCreateThreadEx( &thread, THREAD_ALL_ACCESS, NULL, GetCurrentProcess(),
> (PRTL_THREAD_START_ROUTINE)test_ntterminatethread_proc,
> (void*)0x1234, 0, 0, 0, 0, NULL );
> ok( status == STATUS_SUCCESS, "Got unexpected status %#lx.\n",
> status );
> WaitForSingleObject(thread, INFINITE);
> GetExitCodeThread(thread, &exitcode);
> ok( exitcode == 0x1234, "NtTerminateThread failed exitcode = %lx\n", (long)exitcode);
> ok( test_ntterminatethread_proc_failed == 0, "NtTerminateThread failed\n");
> }
> ```
> Better?
The reason it was not in the test case is I already tested it in the snippet in the Bugzilla ticket. The test case was more for making sure it did not pop up again.
--
https://gitlab.winehq.org/wine/wine/-/merge_requests/3447#note_42339
On Tue Aug 15 14:30:00 2023 +0000, Alexandre Julliard wrote:
> > If arg == 0x1234 and NtTerminateThread returns to the caller
> GetExitCodeThread status would be some other value than 0x1234 unless
> NtTerminateThread would return 0x1234 to the caller (which it does not).
> It's possible that it sets the exit code without exiting, this is what
> NtTerminateProcess does. It really needs an explicit test.
```plaintext
int test_ntterminatethread_proc_failed;
DWORD WINAPI test_ntterminatethread_proc( void *arg )
{
DWORD status = (UINT_PTR)arg;
status = pNtTerminateThread(0, status);
test_ntterminatethread_proc_failed = 1;
return status;
}
/* verifies NtTerminateThread accepts NULL handle */
static void test_terminate_thread(void)
{
HANDLE thread;
DWORD exitcode;
NTSTATUS status;
test_ntterminatethread_proc_failed = 0;
status = pNtCreateThreadEx( &thread, THREAD_ALL_ACCESS, NULL, GetCurrentProcess(),
(PRTL_THREAD_START_ROUTINE)test_ntterminatethread_proc, (void*)0x1234, 0, 0, 0, 0, NULL );
ok( status == STATUS_SUCCESS, "Got unexpected status %#lx.\n", status );
WaitForSingleObject(thread, INFINITE);
GetExitCodeThread(thread, &exitcode);
ok( exitcode == 0x1234, "NtTerminateThread failed exitcode = %lx\n", (long)exitcode);
ok( test_ntterminatethread_proc_failed == 0, "NtTerminateThread failed\n");
}
```
Better?
--
https://gitlab.winehq.org/wine/wine/-/merge_requests/3447#note_42338
> If arg == 0x1234 and NtTerminateThread returns to the caller GetExitCodeThread status would be some other value than 0x1234 unless NtTerminateThread would return 0x1234 to the caller (which it does not).
It's possible that it sets the exit code without exiting, this is what NtTerminateProcess does. It really needs an explicit test.
--
https://gitlab.winehq.org/wine/wine/-/merge_requests/3447#note_42334
On Tue Aug 15 13:21:04 2023 +0000, Jinoh Kang wrote:
> No, I don't think so.
> How do you determine whether `NtTerminateThread()` actually terminated
> the thread on the spot, or just returned normally to
> `test_ntterminatethread_proc` which *in turn* returned to the system?
> There's nothing between `status = pNtTerminateThread(0, status);` and
> `return status;` that signals that the thread was still alive after the call.
> On the other hand, we *do* test that `NtTerminateProcess(0, 195);`
> returns to the caller without immediately terminating the process. See
> `dlls/kernel32/tests/loader.c` for details.
```
DWORD WINAPI test_ntterminatethread_proc( void *arg )
{
DWORD status = (UINT_PTR)arg;
status = pNtTerminateThread(0, status);
return status;
}
```
If arg == 0x1234 and NtTerminateProcess returns to the caller GetExitCodeThread status would be some other value than 0x1234 unless NtTerminateThread would return 0x1234 to the caller (which it does not).
--
https://gitlab.winehq.org/wine/wine/-/merge_requests/3447#note_42325
Since Yousician's last update, it was throwing an error when initialising audio output. Unfortunately I don't have access to the old version, but they seem to have dropped win<10 support, and are using only IAudioClient3_InitializeSharedAudioStream. They also use IDeviceTopology to get the type of the first output connector.
This is the bare minimum I needed to get it working.
--
v4: mmdevapi: add stub for IDeviceTopology
mmdevapi/tests: add test for IDeviceTopology
mmdevapi: implement IAudioClient3_InitializeSharedAudioStream
mmdevapi/tests: add test for AudioClient3_InitializeSharedAudioStream
https://gitlab.winehq.org/wine/wine/-/merge_requests/3554
On Tue Aug 15 13:21:04 2023 +0000, Ake Rehnman wrote:
> > The most obvious test that I can think off the top of my head is
> whether `NtTerminateThread(NULL, _)` returns or not.
> It is already in the test case for the patch.
No, I don't think so.
How do you determine whether `NtTerminateThread()` actually terminated the thread on the spot, or just returned normally to `test_ntterminatethread_proc` which *in turn* returned to the system? There's nothing between `status = pNtTerminateThread(0, status);` and `return status;` that signals that the thread was still alive after the call.
On the other hand, we *do* test that `NtTerminateProcess(0, 195);` returns to the caller without immediately terminating the process. See `dlls/kernel32/tests/loader.c` for details.
--
https://gitlab.winehq.org/wine/wine/-/merge_requests/3447#note_42320
Gabriel Ivăncescu (@insn) commented about dlls/jscript/array.c:
> }
>
> add_args = argc-2;
> + } else if (argc && ctx->html_mode) {
> + delete_cnt = length-start;
Are you sure this is html mode specific? To confirm, you should move the test to `documentmode.js` and see what happens in every mode, `es5.js` is for ES5+ (IE9+, but we test it in IE11 mode only).
If it turns out to be ES5 for example, you can use ctx->version >= SCRIPTLANGUAGEVERSION_ES5 instead. Otherwise you can keep html mode of course, if it works in all modes the same.
--
https://gitlab.winehq.org/wine/wine/-/merge_requests/3567#note_42308
> Actually there is some logic, and NULL handle has a special meaning in NtTerminateProcess.
Thanks. I forgot to articulate it even as I noticed that peculiarity. That's on me.
> This would need tests to determine if the special meaning also applies to NtTerminateThread.
The most obvious test that I can think off the top of my head is whether `NtTerminateThread(NULL, _)` returns or not. Also perhaps we can copy some applicable tests from `NtTerminateProcess(NULL, _)` as well. What other tests should be done, though?
--
https://gitlab.winehq.org/wine/wine/-/merge_requests/3447#note_42305
After investigation, it looks like the PixelOffsetModeHalf/PixelOffsetModeHighQuality is using floating point numbers, while PixelOffsetModeNone/PixelOffsetModeHighSpeed is using integers to calculate bitmap colours.
After using floating numbers, most tests are passing now.
--
https://gitlab.winehq.org/wine/wine/-/merge_requests/3568
Current code handles omitted deleteCount but assumes it to be zero in that case. Instead an omitted deleteCount means delete everything from `start`.
This prevents Adobe sign-in page from loading.
--
https://gitlab.winehq.org/wine/wine/-/merge_requests/3567
And discard irrelevant parts in select request. We currently store something in CTX_PENDING and ignore it later in select request if we're currently running in wow context.
--
https://gitlab.winehq.org/wine/wine/-/merge_requests/3566
I tried build a real Windows application (mimikatz) and had troubles with some wine headers incompatibility. The patch set improves headers to allow build the foreign application with Wine.
--
v6: include: Add standalone LSA_OBJECT_ATTRIBUTES prototype if ntdef.h is not included.
include: Add initial activeds.h.
include: Add missed PCWCHAR to winnt.h.
include: Include ncrypt.h in wincrypt.h.
include: Add specstrings_strict.h with some defines.
https://gitlab.winehq.org/wine/wine/-/merge_requests/3506