Compare commits

...

37 Commits

Author SHA1 Message Date
Alistair Leslie-Hughes
4f96088b1e Release v10.0-rc1 2024-12-07 09:51:57 +11:00
Alistair Leslie-Hughes
7f8391d22f Rebase against 4161e62e478f61fdcd0365d9bd7b21e3b1a5197b. 2024-12-07 08:55:33 +11:00
Alistair Leslie-Hughes
2f87552459 Updated vkd3d-latest 2024-12-06 09:17:43 +11:00
Alistair Leslie-Hughes
4f83c2f614 Rebase against 13c47c91e2d6fea81f4c0598cf5d2e81e95b0dd2. 2024-12-06 09:04:41 +11:00
Alistair Leslie-Hughes
dc277fed5e Rebase against 11e8662ebbbde9d39301aaf4bbc6f448b4cc4b77. 2024-12-05 09:54:50 +11:00
Alistair Leslie-Hughes
342b3b8162 Updated vkd3d-latest patchset 2024-12-03 09:15:55 +11:00
Alistair Leslie-Hughes
891daebf57 Rebase against 96a94318125332cd7aa80c475b35e38439b7c2b3. 2024-11-29 07:35:05 +11:00
Alistair Leslie-Hughes
7ba8823e57 Release v9.22 2024-11-23 16:12:36 +11:00
Alistair Leslie-Hughes
5a368dddd1 Rebase against 51ccd95c49c2c61ad41960b25a01f834601d70c0. 2024-11-23 16:11:07 +11:00
Alistair Leslie-Hughes
4cd3d8eba4 Rebase against 157105cb6d306f9794f0f3ebaa55d9c891e3be8f. 2024-11-22 11:15:42 +11:00
Alistair Leslie-Hughes
e0593972f0 Updated vkd3d-latest patchset
Includes Release 1.14.
2024-11-22 06:55:20 +11:00
Alistair Leslie-Hughes
e7a74d707b Rebase against f350a8782b29b3890320e48e915d026612657454. 2024-11-21 11:01:10 +11:00
Alistair Leslie-Hughes
8b3f47c1d2 Rebase against 044527c671d87b917e01f39fcf33b596cc2e7878. 2024-11-20 09:58:55 +11:00
Alistair Leslie-Hughes
78f630993b Rebase against 67c1c3c2559cc3b934cae5ae26156dcc6fbd484b. 2024-11-19 09:46:47 +11:00
Alistair Leslie-Hughes
3f86dff407 Rebase against ab40b7fd8686345bf77a27ceb12d4dfbaa753829. 2024-11-15 11:13:11 +11:00
Alistair Leslie-Hughes
65b72cb912 Updated vkd3d-latest patchset 2024-11-14 06:35:51 +11:00
Alistair Leslie-Hughes
32abf9fc97 Rebase against 6303163af0c8e1c245e45fe2efea8f664431d26c. 2024-11-12 09:53:10 +11:00
Alistair Leslie-Hughes
f03d32e381 Release v9.21 2024-11-09 07:59:05 +11:00
Alistair Leslie-Hughes
da7652e29c Updated dmime_segment_getaudiopath patchset
Remove testing tracing.
2024-11-09 07:55:57 +11:00
Elizabeth Figura
1bc2bc0404 Rebase against 24694dabfc53fc850cf035e187a4c15b77d6bc77. 2024-11-07 16:09:50 -06:00
Alistair Leslie-Hughes
e2b1620f07 Updated vkd3d-latest patchset 2024-11-07 12:25:06 +11:00
Alistair Leslie-Hughes
e3d0d19955 Rebase against 6db2812411d45ca4b4d15dea9a00577ea17b508e. 2024-11-07 12:23:36 +11:00
Alistair Leslie-Hughes
d4483ee98c Updated vkd3d-latest patchset 2024-11-05 11:33:35 +11:00
Alistair Leslie-Hughes
0236a37992 Rebase against eeabbe812ffc3ed7c06fc85cd63f0d85bffe207e. 2024-11-05 11:32:58 +11:00
Alistair Leslie-Hughes
0e08b05863 Added dmscript_enum_routine patchset 2024-11-01 19:41:39 +11:00
Alistair Leslie-Hughes
6ae3756a4f Added dmime_segment_getaudiopath patchset 2024-11-01 18:01:22 +11:00
Alistair Leslie-Hughes
8ad449f7b1 Updated vkd3d-latest patchset 2024-11-01 18:00:55 +11:00
Alistair Leslie-Hughes
0855d4defe Updated win32u-NtGdiExtTextOutW-rotation patchset 2024-10-25 07:33:36 +11:00
Alistair Leslie-Hughes
78bd3f0c6d Rebase against 83febc6b55cf9e7f97299e391771b9ad0d1f1ceb. 2024-10-24 09:49:30 +11:00
Alistair Leslie-Hughes
16cfc61df8 Updated vkd3d-latest patchset 2024-10-23 13:51:57 +11:00
Alistair Leslie-Hughes
153172ad27 Rebase against 2bca8cb236b7d4d5f4e0e35d6fcad6a1d8a2c5e3. 2024-10-23 13:49:48 +11:00
Alistair Leslie-Hughes
5a1b9d5093 Release v9.20 2024-10-19 08:10:39 +11:00
Alistair Leslie-Hughes
c1f62cba4d Rebase against 3a6e9365336304b4d7eb4d66aef959f67361cc1f. 2024-10-19 08:03:42 +11:00
Alistair Leslie-Hughes
02792d0328 Added win32u-NtGdiExtTextOutW-rotation patchset 2024-10-18 07:34:05 +11:00
Alistair Leslie-Hughes
44f9ec9761 Updated vkd3d-latest patchset 2024-10-18 07:32:33 +11:00
Alistair Leslie-Hughes
81492f7156 Updated vkd3d-latest patchset 2024-10-15 09:23:52 +11:00
Alistair Leslie-Hughes
683813d151 Drop gdi32-rotation patchset
This was "fixed" upstream. Though the current implementation is causing
multiple regressions with Rounded Rects.
2024-10-15 09:22:31 +11:00
50 changed files with 8855 additions and 17403 deletions

View File

@@ -1,371 +0,0 @@
From 3eb7b781849135fefeece9ca257ca9673b1545fd Mon Sep 17 00:00:00 2001
From: Christian Costa <titan.costa@gmail.com>
Date: Sun, 16 Jul 2017 18:13:31 +0200
Subject: d3dx9_36: Add semi-stub for D3DXOptimizeVertices.
---
dlls/d3dx9_24/d3dx9_24.spec | 2 +-
dlls/d3dx9_25/d3dx9_25.spec | 2 +-
dlls/d3dx9_26/d3dx9_26.spec | 2 +-
dlls/d3dx9_27/d3dx9_27.spec | 2 +-
dlls/d3dx9_28/d3dx9_28.spec | 2 +-
dlls/d3dx9_29/d3dx9_29.spec | 2 +-
dlls/d3dx9_30/d3dx9_30.spec | 2 +-
dlls/d3dx9_31/d3dx9_31.spec | 2 +-
dlls/d3dx9_32/d3dx9_32.spec | 2 +-
dlls/d3dx9_33/d3dx9_33.spec | 2 +-
dlls/d3dx9_34/d3dx9_34.spec | 2 +-
dlls/d3dx9_35/d3dx9_35.spec | 2 +-
dlls/d3dx9_36/d3dx9_36.spec | 2 +-
dlls/d3dx9_36/mesh.c | 27 +++++++++++++++++++++++++++
dlls/d3dx9_36/tests/mesh.c | 22 ++++++++++++++++++++++
dlls/d3dx9_37/d3dx9_37.spec | 2 +-
dlls/d3dx9_38/d3dx9_38.spec | 2 +-
dlls/d3dx9_39/d3dx9_39.spec | 2 +-
dlls/d3dx9_40/d3dx9_40.spec | 2 +-
dlls/d3dx9_41/d3dx9_41.spec | 2 +-
dlls/d3dx9_42/d3dx9_42.spec | 2 +-
dlls/d3dx9_43/d3dx9_43.spec | 2 +-
22 files changed, 69 insertions(+), 20 deletions(-)
diff --git a/dlls/d3dx9_24/d3dx9_24.spec b/dlls/d3dx9_24/d3dx9_24.spec
index 0ca8777efe6..9b52c2bf307 100644
--- a/dlls/d3dx9_24/d3dx9_24.spec
+++ b/dlls/d3dx9_24/d3dx9_24.spec
@@ -226,7 +226,7 @@
@ stdcall D3DXMatrixTranslation(ptr float float float)
@ stdcall D3DXMatrixTranspose(ptr ptr)
@ stdcall D3DXOptimizeFaces(ptr long long long ptr)
-@ stub D3DXOptimizeVertices(ptr long long long ptr)
+@ stdcall D3DXOptimizeVertices(ptr long long long ptr)
@ stdcall D3DXPlaneFromPointNormal(ptr ptr ptr)
@ stdcall D3DXPlaneFromPoints(ptr ptr ptr ptr)
@ stdcall D3DXPlaneIntersectLine(ptr ptr ptr ptr)
diff --git a/dlls/d3dx9_25/d3dx9_25.spec b/dlls/d3dx9_25/d3dx9_25.spec
index a5449810a43..fc75dfd9c04 100644
--- a/dlls/d3dx9_25/d3dx9_25.spec
+++ b/dlls/d3dx9_25/d3dx9_25.spec
@@ -226,7 +226,7 @@
@ stdcall D3DXMatrixTranslation(ptr float float float)
@ stdcall D3DXMatrixTranspose(ptr ptr)
@ stdcall D3DXOptimizeFaces(ptr long long long ptr)
-@ stub D3DXOptimizeVertices(ptr long long long ptr)
+@ stdcall D3DXOptimizeVertices(ptr long long long ptr)
@ stdcall D3DXPlaneFromPointNormal(ptr ptr ptr)
@ stdcall D3DXPlaneFromPoints(ptr ptr ptr ptr)
@ stdcall D3DXPlaneIntersectLine(ptr ptr ptr ptr)
diff --git a/dlls/d3dx9_26/d3dx9_26.spec b/dlls/d3dx9_26/d3dx9_26.spec
index 9e1200442f4..85d9fc5332e 100644
--- a/dlls/d3dx9_26/d3dx9_26.spec
+++ b/dlls/d3dx9_26/d3dx9_26.spec
@@ -230,7 +230,7 @@
@ stdcall D3DXMatrixTranslation(ptr float float float)
@ stdcall D3DXMatrixTranspose(ptr ptr)
@ stdcall D3DXOptimizeFaces(ptr long long long ptr)
-@ stub D3DXOptimizeVertices(ptr long long long ptr)
+@ stdcall D3DXOptimizeVertices(ptr long long long ptr)
@ stdcall D3DXPlaneFromPointNormal(ptr ptr ptr)
@ stdcall D3DXPlaneFromPoints(ptr ptr ptr ptr)
@ stdcall D3DXPlaneIntersectLine(ptr ptr ptr ptr)
diff --git a/dlls/d3dx9_27/d3dx9_27.spec b/dlls/d3dx9_27/d3dx9_27.spec
index 9e1200442f4..85d9fc5332e 100644
--- a/dlls/d3dx9_27/d3dx9_27.spec
+++ b/dlls/d3dx9_27/d3dx9_27.spec
@@ -230,7 +230,7 @@
@ stdcall D3DXMatrixTranslation(ptr float float float)
@ stdcall D3DXMatrixTranspose(ptr ptr)
@ stdcall D3DXOptimizeFaces(ptr long long long ptr)
-@ stub D3DXOptimizeVertices(ptr long long long ptr)
+@ stdcall D3DXOptimizeVertices(ptr long long long ptr)
@ stdcall D3DXPlaneFromPointNormal(ptr ptr ptr)
@ stdcall D3DXPlaneFromPoints(ptr ptr ptr ptr)
@ stdcall D3DXPlaneIntersectLine(ptr ptr ptr ptr)
diff --git a/dlls/d3dx9_28/d3dx9_28.spec b/dlls/d3dx9_28/d3dx9_28.spec
index b316a23baf1..62673ccd7af 100644
--- a/dlls/d3dx9_28/d3dx9_28.spec
+++ b/dlls/d3dx9_28/d3dx9_28.spec
@@ -230,7 +230,7 @@
@ stdcall D3DXMatrixTranslation(ptr float float float)
@ stdcall D3DXMatrixTranspose(ptr ptr)
@ stdcall D3DXOptimizeFaces(ptr long long long ptr)
-@ stub D3DXOptimizeVertices(ptr long long long ptr)
+@ stdcall D3DXOptimizeVertices(ptr long long long ptr)
@ stdcall D3DXPlaneFromPointNormal(ptr ptr ptr)
@ stdcall D3DXPlaneFromPoints(ptr ptr ptr ptr)
@ stdcall D3DXPlaneIntersectLine(ptr ptr ptr ptr)
diff --git a/dlls/d3dx9_29/d3dx9_29.spec b/dlls/d3dx9_29/d3dx9_29.spec
index b316a23baf1..62673ccd7af 100644
--- a/dlls/d3dx9_29/d3dx9_29.spec
+++ b/dlls/d3dx9_29/d3dx9_29.spec
@@ -230,7 +230,7 @@
@ stdcall D3DXMatrixTranslation(ptr float float float)
@ stdcall D3DXMatrixTranspose(ptr ptr)
@ stdcall D3DXOptimizeFaces(ptr long long long ptr)
-@ stub D3DXOptimizeVertices(ptr long long long ptr)
+@ stdcall D3DXOptimizeVertices(ptr long long long ptr)
@ stdcall D3DXPlaneFromPointNormal(ptr ptr ptr)
@ stdcall D3DXPlaneFromPoints(ptr ptr ptr ptr)
@ stdcall D3DXPlaneIntersectLine(ptr ptr ptr ptr)
diff --git a/dlls/d3dx9_30/d3dx9_30.spec b/dlls/d3dx9_30/d3dx9_30.spec
index e00fa547862..2c7575d88fc 100644
--- a/dlls/d3dx9_30/d3dx9_30.spec
+++ b/dlls/d3dx9_30/d3dx9_30.spec
@@ -230,7 +230,7 @@
@ stdcall D3DXMatrixTranslation(ptr float float float)
@ stdcall D3DXMatrixTranspose(ptr ptr)
@ stdcall D3DXOptimizeFaces(ptr long long long ptr)
-@ stub D3DXOptimizeVertices(ptr long long long ptr)
+@ stdcall D3DXOptimizeVertices(ptr long long long ptr)
@ stdcall D3DXPlaneFromPointNormal(ptr ptr ptr)
@ stdcall D3DXPlaneFromPoints(ptr ptr ptr ptr)
@ stdcall D3DXPlaneIntersectLine(ptr ptr ptr ptr)
diff --git a/dlls/d3dx9_31/d3dx9_31.spec b/dlls/d3dx9_31/d3dx9_31.spec
index d308939ef67..a41eb3e9af2 100644
--- a/dlls/d3dx9_31/d3dx9_31.spec
+++ b/dlls/d3dx9_31/d3dx9_31.spec
@@ -227,7 +227,7 @@
@ stdcall D3DXMatrixTranslation(ptr float float float)
@ stdcall D3DXMatrixTranspose(ptr ptr)
@ stdcall D3DXOptimizeFaces(ptr long long long ptr)
-@ stub D3DXOptimizeVertices(ptr long long long ptr)
+@ stdcall D3DXOptimizeVertices(ptr long long long ptr)
@ stdcall D3DXPlaneFromPointNormal(ptr ptr ptr)
@ stdcall D3DXPlaneFromPoints(ptr ptr ptr ptr)
@ stdcall D3DXPlaneIntersectLine(ptr ptr ptr ptr)
diff --git a/dlls/d3dx9_32/d3dx9_32.spec b/dlls/d3dx9_32/d3dx9_32.spec
index c2292dff396..eab56b3c9ee 100644
--- a/dlls/d3dx9_32/d3dx9_32.spec
+++ b/dlls/d3dx9_32/d3dx9_32.spec
@@ -227,7 +227,7 @@
@ stdcall D3DXMatrixTranslation(ptr float float float)
@ stdcall D3DXMatrixTranspose(ptr ptr)
@ stdcall D3DXOptimizeFaces(ptr long long long ptr)
-@ stub D3DXOptimizeVertices(ptr long long long ptr)
+@ stdcall D3DXOptimizeVertices(ptr long long long ptr)
@ stdcall D3DXPlaneFromPointNormal(ptr ptr ptr)
@ stdcall D3DXPlaneFromPoints(ptr ptr ptr ptr)
@ stdcall D3DXPlaneIntersectLine(ptr ptr ptr ptr)
diff --git a/dlls/d3dx9_33/d3dx9_33.spec b/dlls/d3dx9_33/d3dx9_33.spec
index c2292dff396..eab56b3c9ee 100644
--- a/dlls/d3dx9_33/d3dx9_33.spec
+++ b/dlls/d3dx9_33/d3dx9_33.spec
@@ -227,7 +227,7 @@
@ stdcall D3DXMatrixTranslation(ptr float float float)
@ stdcall D3DXMatrixTranspose(ptr ptr)
@ stdcall D3DXOptimizeFaces(ptr long long long ptr)
-@ stub D3DXOptimizeVertices(ptr long long long ptr)
+@ stdcall D3DXOptimizeVertices(ptr long long long ptr)
@ stdcall D3DXPlaneFromPointNormal(ptr ptr ptr)
@ stdcall D3DXPlaneFromPoints(ptr ptr ptr ptr)
@ stdcall D3DXPlaneIntersectLine(ptr ptr ptr ptr)
diff --git a/dlls/d3dx9_34/d3dx9_34.spec b/dlls/d3dx9_34/d3dx9_34.spec
index c2292dff396..eab56b3c9ee 100644
--- a/dlls/d3dx9_34/d3dx9_34.spec
+++ b/dlls/d3dx9_34/d3dx9_34.spec
@@ -227,7 +227,7 @@
@ stdcall D3DXMatrixTranslation(ptr float float float)
@ stdcall D3DXMatrixTranspose(ptr ptr)
@ stdcall D3DXOptimizeFaces(ptr long long long ptr)
-@ stub D3DXOptimizeVertices(ptr long long long ptr)
+@ stdcall D3DXOptimizeVertices(ptr long long long ptr)
@ stdcall D3DXPlaneFromPointNormal(ptr ptr ptr)
@ stdcall D3DXPlaneFromPoints(ptr ptr ptr ptr)
@ stdcall D3DXPlaneIntersectLine(ptr ptr ptr ptr)
diff --git a/dlls/d3dx9_35/d3dx9_35.spec b/dlls/d3dx9_35/d3dx9_35.spec
index c2292dff396..eab56b3c9ee 100644
--- a/dlls/d3dx9_35/d3dx9_35.spec
+++ b/dlls/d3dx9_35/d3dx9_35.spec
@@ -227,7 +227,7 @@
@ stdcall D3DXMatrixTranslation(ptr float float float)
@ stdcall D3DXMatrixTranspose(ptr ptr)
@ stdcall D3DXOptimizeFaces(ptr long long long ptr)
-@ stub D3DXOptimizeVertices(ptr long long long ptr)
+@ stdcall D3DXOptimizeVertices(ptr long long long ptr)
@ stdcall D3DXPlaneFromPointNormal(ptr ptr ptr)
@ stdcall D3DXPlaneFromPoints(ptr ptr ptr ptr)
@ stdcall D3DXPlaneIntersectLine(ptr ptr ptr ptr)
diff --git a/dlls/d3dx9_36/d3dx9_36.spec b/dlls/d3dx9_36/d3dx9_36.spec
index 0fdf4e135e1..6201657d4a5 100644
--- a/dlls/d3dx9_36/d3dx9_36.spec
+++ b/dlls/d3dx9_36/d3dx9_36.spec
@@ -229,7 +229,7 @@
@ stdcall D3DXMatrixTranslation(ptr float float float)
@ stdcall D3DXMatrixTranspose(ptr ptr)
@ stdcall D3DXOptimizeFaces(ptr long long long ptr)
-@ stub D3DXOptimizeVertices(ptr long long long ptr)
+@ stdcall D3DXOptimizeVertices(ptr long long long ptr)
@ stdcall D3DXPlaneFromPointNormal(ptr ptr ptr)
@ stdcall D3DXPlaneFromPoints(ptr ptr ptr ptr)
@ stdcall D3DXPlaneIntersectLine(ptr ptr ptr ptr)
diff --git a/dlls/d3dx9_36/mesh.c b/dlls/d3dx9_36/mesh.c
index 6294ce624fe..12cb7eb7258 100644
--- a/dlls/d3dx9_36/mesh.c
+++ b/dlls/d3dx9_36/mesh.c
@@ -7184,6 +7184,33 @@ cleanup:
return hr;
}
+
+/*************************************************************************
+ * D3DXOptimizeVertices (D3DX9_36.@)
+ */
+HRESULT WINAPI D3DXOptimizeVertices(const void *indices, UINT num_faces,
+ UINT num_vertices, BOOL indices_are_32bit, DWORD *vertex_remap)
+{
+ UINT i;
+
+ FIXME("indices %p, num_faces %u, num_vertices %u, indices_are_32bit %#x, vertex_remap %p semi-stub.\n",
+ indices, num_faces, num_vertices, indices_are_32bit, vertex_remap);
+
+ if (!vertex_remap)
+ {
+ WARN("vertex remap pointer is NULL.\n");
+ return D3DERR_INVALIDCALL;
+ }
+
+ for (i = 0; i < num_vertices; i++)
+ {
+ vertex_remap[i] = i;
+ }
+
+ return D3D_OK;
+}
+
+
/*************************************************************************
* D3DXOptimizeFaces (D3DX9_36.@)
*
diff --git a/dlls/d3dx9_36/tests/mesh.c b/dlls/d3dx9_36/tests/mesh.c
index f437a83cbd8..c5faae520c9 100644
--- a/dlls/d3dx9_36/tests/mesh.c
+++ b/dlls/d3dx9_36/tests/mesh.c
@@ -10403,6 +10403,27 @@ cleanup:
free_test_context(test_context);
}
+static void test_optimize_vertices(void)
+{
+ HRESULT hr;
+ DWORD vertex_remap[3];
+ const DWORD indices[] = {0, 1, 2};
+ const UINT num_faces = 1;
+ const UINT num_vertices = 3;
+
+ hr = D3DXOptimizeVertices(indices, num_faces,
+ num_vertices, FALSE,
+ vertex_remap);
+ ok(hr == D3D_OK, "D3DXOptimizeVertices failed. Got %lx, expected D3D_OK.\n", hr);
+
+ /* vertex_remap must not be NULL */
+ hr = D3DXOptimizeVertices(indices, num_faces,
+ num_vertices, FALSE,
+ NULL);
+ ok(hr == D3DERR_INVALIDCALL, "D3DXOptimizeVertices passed NULL vertex_remap "
+ "pointer. Got %lx, expected D3DERR_INVALIDCALL.\n", hr);
+}
+
static void test_optimize_faces(void)
{
HRESULT hr;
@@ -11291,6 +11312,7 @@ START_TEST(mesh)
test_weld_vertices();
test_clone_mesh();
test_valid_mesh();
+ test_optimize_vertices();
test_optimize_faces();
test_compute_normals();
test_D3DXFrameFind();
diff --git a/dlls/d3dx9_37/d3dx9_37.spec b/dlls/d3dx9_37/d3dx9_37.spec
index 0fdf4e135e1..6201657d4a5 100644
--- a/dlls/d3dx9_37/d3dx9_37.spec
+++ b/dlls/d3dx9_37/d3dx9_37.spec
@@ -229,7 +229,7 @@
@ stdcall D3DXMatrixTranslation(ptr float float float)
@ stdcall D3DXMatrixTranspose(ptr ptr)
@ stdcall D3DXOptimizeFaces(ptr long long long ptr)
-@ stub D3DXOptimizeVertices(ptr long long long ptr)
+@ stdcall D3DXOptimizeVertices(ptr long long long ptr)
@ stdcall D3DXPlaneFromPointNormal(ptr ptr ptr)
@ stdcall D3DXPlaneFromPoints(ptr ptr ptr ptr)
@ stdcall D3DXPlaneIntersectLine(ptr ptr ptr ptr)
diff --git a/dlls/d3dx9_38/d3dx9_38.spec b/dlls/d3dx9_38/d3dx9_38.spec
index 0fdf4e135e1..6201657d4a5 100644
--- a/dlls/d3dx9_38/d3dx9_38.spec
+++ b/dlls/d3dx9_38/d3dx9_38.spec
@@ -229,7 +229,7 @@
@ stdcall D3DXMatrixTranslation(ptr float float float)
@ stdcall D3DXMatrixTranspose(ptr ptr)
@ stdcall D3DXOptimizeFaces(ptr long long long ptr)
-@ stub D3DXOptimizeVertices(ptr long long long ptr)
+@ stdcall D3DXOptimizeVertices(ptr long long long ptr)
@ stdcall D3DXPlaneFromPointNormal(ptr ptr ptr)
@ stdcall D3DXPlaneFromPoints(ptr ptr ptr ptr)
@ stdcall D3DXPlaneIntersectLine(ptr ptr ptr ptr)
diff --git a/dlls/d3dx9_39/d3dx9_39.spec b/dlls/d3dx9_39/d3dx9_39.spec
index 0fdf4e135e1..6201657d4a5 100644
--- a/dlls/d3dx9_39/d3dx9_39.spec
+++ b/dlls/d3dx9_39/d3dx9_39.spec
@@ -229,7 +229,7 @@
@ stdcall D3DXMatrixTranslation(ptr float float float)
@ stdcall D3DXMatrixTranspose(ptr ptr)
@ stdcall D3DXOptimizeFaces(ptr long long long ptr)
-@ stub D3DXOptimizeVertices(ptr long long long ptr)
+@ stdcall D3DXOptimizeVertices(ptr long long long ptr)
@ stdcall D3DXPlaneFromPointNormal(ptr ptr ptr)
@ stdcall D3DXPlaneFromPoints(ptr ptr ptr ptr)
@ stdcall D3DXPlaneIntersectLine(ptr ptr ptr ptr)
diff --git a/dlls/d3dx9_40/d3dx9_40.spec b/dlls/d3dx9_40/d3dx9_40.spec
index 0fdf4e135e1..6201657d4a5 100644
--- a/dlls/d3dx9_40/d3dx9_40.spec
+++ b/dlls/d3dx9_40/d3dx9_40.spec
@@ -229,7 +229,7 @@
@ stdcall D3DXMatrixTranslation(ptr float float float)
@ stdcall D3DXMatrixTranspose(ptr ptr)
@ stdcall D3DXOptimizeFaces(ptr long long long ptr)
-@ stub D3DXOptimizeVertices(ptr long long long ptr)
+@ stdcall D3DXOptimizeVertices(ptr long long long ptr)
@ stdcall D3DXPlaneFromPointNormal(ptr ptr ptr)
@ stdcall D3DXPlaneFromPoints(ptr ptr ptr ptr)
@ stdcall D3DXPlaneIntersectLine(ptr ptr ptr ptr)
diff --git a/dlls/d3dx9_41/d3dx9_41.spec b/dlls/d3dx9_41/d3dx9_41.spec
index 0fdf4e135e1..6201657d4a5 100644
--- a/dlls/d3dx9_41/d3dx9_41.spec
+++ b/dlls/d3dx9_41/d3dx9_41.spec
@@ -229,7 +229,7 @@
@ stdcall D3DXMatrixTranslation(ptr float float float)
@ stdcall D3DXMatrixTranspose(ptr ptr)
@ stdcall D3DXOptimizeFaces(ptr long long long ptr)
-@ stub D3DXOptimizeVertices(ptr long long long ptr)
+@ stdcall D3DXOptimizeVertices(ptr long long long ptr)
@ stdcall D3DXPlaneFromPointNormal(ptr ptr ptr)
@ stdcall D3DXPlaneFromPoints(ptr ptr ptr ptr)
@ stdcall D3DXPlaneIntersectLine(ptr ptr ptr ptr)
diff --git a/dlls/d3dx9_42/d3dx9_42.spec b/dlls/d3dx9_42/d3dx9_42.spec
index 2f2ac5fd619..7cfc439f84b 100644
--- a/dlls/d3dx9_42/d3dx9_42.spec
+++ b/dlls/d3dx9_42/d3dx9_42.spec
@@ -222,7 +222,7 @@
@ stdcall D3DXMatrixTranslation(ptr float float float)
@ stdcall D3DXMatrixTranspose(ptr ptr)
@ stdcall D3DXOptimizeFaces(ptr long long long ptr)
-@ stub D3DXOptimizeVertices(ptr long long long ptr)
+@ stdcall D3DXOptimizeVertices(ptr long long long ptr)
@ stdcall D3DXPlaneFromPointNormal(ptr ptr ptr)
@ stdcall D3DXPlaneFromPoints(ptr ptr ptr ptr)
@ stdcall D3DXPlaneIntersectLine(ptr ptr ptr ptr)
diff --git a/dlls/d3dx9_43/d3dx9_43.spec b/dlls/d3dx9_43/d3dx9_43.spec
index 2f2ac5fd619..7cfc439f84b 100644
--- a/dlls/d3dx9_43/d3dx9_43.spec
+++ b/dlls/d3dx9_43/d3dx9_43.spec
@@ -222,7 +222,7 @@
@ stdcall D3DXMatrixTranslation(ptr float float float)
@ stdcall D3DXMatrixTranspose(ptr ptr)
@ stdcall D3DXOptimizeFaces(ptr long long long ptr)
-@ stub D3DXOptimizeVertices(ptr long long long ptr)
+@ stdcall D3DXOptimizeVertices(ptr long long long ptr)
@ stdcall D3DXPlaneFromPointNormal(ptr ptr ptr)
@ stdcall D3DXPlaneFromPoints(ptr ptr ptr ptr)
@ stdcall D3DXPlaneIntersectLine(ptr ptr ptr ptr)
--
2.14.2

View File

@@ -1 +0,0 @@
Fixes: [47776] Timeshift needs D3DXOptimizeVertices()

View File

@@ -0,0 +1,158 @@
From 79617ce168284934b09313f454e911394ec5eed8 Mon Sep 17 00:00:00 2001
From: Alistair Leslie-Hughes <leslie_alistair@hotmail.com>
Date: Fri, 1 Nov 2024 17:59:51 +1100
Subject: [PATCH] dmime: Semi implement
IDirectMusicSegment::GetAudioPathConfig.
---
dlls/dmime/audiopath.c | 97 +++++++++++++++++++++++-------------------
dlls/dmime/segment.c | 6 +++
2 files changed, 59 insertions(+), 44 deletions(-)
diff --git a/dlls/dmime/audiopath.c b/dlls/dmime/audiopath.c
index 3389f965b8f..501eecf234c 100644
--- a/dlls/dmime/audiopath.c
+++ b/dlls/dmime/audiopath.c
@@ -649,18 +649,21 @@ HRESULT path_config_get_audio_path_params(IUnknown *iface, WAVEFORMATEX *format,
{
struct audio_path_config *This = impl_from_IUnknown(iface);
struct list *first_port_config, *first_pchannel_to_buffer;
- struct audio_path_port_config *port_config;
- struct audio_path_pchannel_to_buffer *pchannel_to_buffer;
+ struct audio_path_port_config *port_config = NULL;
+ struct audio_path_pchannel_to_buffer *pchannel_to_buffer = NULL;
GUID *guids;
first_port_config = list_head(&This->port_config_entries);
- if (list_next(&This->port_config_entries, first_port_config))
- FIXME("Only one port config supported. %p -> %p\n", first_port_config, list_next(&This->port_config_entries, first_port_config));
- port_config = LIST_ENTRY(first_port_config, struct audio_path_port_config, entry);
- first_pchannel_to_buffer = list_head(&port_config->pchannel_to_buffer_entries);
- if (list_next(&port_config->pchannel_to_buffer_entries, first_pchannel_to_buffer))
- FIXME("Only one pchannel to buffer entry supported.\n");
- pchannel_to_buffer = LIST_ENTRY(first_pchannel_to_buffer, struct audio_path_pchannel_to_buffer, entry);
+ if (first_port_config)
+ {
+ if (list_next(&This->port_config_entries, first_port_config))
+ FIXME("Only one port config supported. %p -> %p\n", first_port_config, list_next(&This->port_config_entries, first_port_config));
+ port_config = LIST_ENTRY(first_port_config, struct audio_path_port_config, entry);
+ first_pchannel_to_buffer = list_head(&port_config->pchannel_to_buffer_entries);
+ if (list_next(&port_config->pchannel_to_buffer_entries, first_pchannel_to_buffer))
+ FIXME("Only one pchannel to buffer entry supported.\n");
+ pchannel_to_buffer = LIST_ENTRY(first_pchannel_to_buffer, struct audio_path_pchannel_to_buffer, entry);
+ }
/* Secondary buffer description */
memset(format, 0, sizeof(*format));
@@ -680,50 +683,56 @@ HRESULT path_config_get_audio_path_params(IUnknown *iface, WAVEFORMATEX *format,
desc->lpwfxFormat = format;
desc->guid3DAlgorithm = GUID_NULL;
- guids = pchannel_to_buffer->guids;
- if (pchannel_to_buffer->header.dwBufferCount == 2)
+ if (pchannel_to_buffer)
{
- if ((!IsEqualGUID(&guids[0], &GUID_Buffer_Reverb) && !IsEqualGUID(&guids[0], &GUID_Buffer_Stereo)) ||
- (!IsEqualGUID(&guids[1], &GUID_Buffer_Reverb) && !IsEqualGUID(&guids[1], &GUID_Buffer_Stereo)) ||
- IsEqualGUID(&guids[0], &guids[1]))
- FIXME("Only a stereo plus reverb buffer is supported\n");
- else
+ guids = pchannel_to_buffer->guids;
+ if (pchannel_to_buffer->header.dwBufferCount == 2)
{
- desc->dwFlags |= DSBCAPS_CTRLPAN | DSBCAPS_CTRLFREQUENCY;
- format->nChannels = 2;
- format->nBlockAlign *= 2;
- format->nAvgBytesPerSec *= 2;
+ if ((!IsEqualGUID(&guids[0], &GUID_Buffer_Reverb) && !IsEqualGUID(&guids[0], &GUID_Buffer_Stereo)) ||
+ (!IsEqualGUID(&guids[1], &GUID_Buffer_Reverb) && !IsEqualGUID(&guids[1], &GUID_Buffer_Stereo)) ||
+ IsEqualGUID(&guids[0], &guids[1]))
+ FIXME("Only a stereo plus reverb buffer is supported\n");
+ else
+ {
+ desc->dwFlags |= DSBCAPS_CTRLPAN | DSBCAPS_CTRLFREQUENCY;
+ format->nChannels = 2;
+ format->nBlockAlign *= 2;
+ format->nAvgBytesPerSec *= 2;
+ }
}
- }
- else if (pchannel_to_buffer->header.dwBufferCount == 1)
- {
- if (IsEqualGUID(guids, &GUID_Buffer_Stereo))
+ else if (pchannel_to_buffer->header.dwBufferCount == 1)
{
- desc->dwFlags |= DSBCAPS_CTRLPAN | DSBCAPS_CTRLFREQUENCY;
- format->nChannels = 2;
- format->nBlockAlign *= 2;
- format->nAvgBytesPerSec *= 2;
+ if (IsEqualGUID(guids, &GUID_Buffer_Stereo))
+ {
+ desc->dwFlags |= DSBCAPS_CTRLPAN | DSBCAPS_CTRLFREQUENCY;
+ format->nChannels = 2;
+ format->nBlockAlign *= 2;
+ format->nAvgBytesPerSec *= 2;
+ }
+ else if (IsEqualGUID(guids, &GUID_Buffer_3D_Dry))
+ desc->dwFlags |= DSBCAPS_CTRL3D | DSBCAPS_CTRLFREQUENCY | DSBCAPS_MUTE3DATMAXDISTANCE;
+ else if (IsEqualGUID(guids, &GUID_Buffer_Mono))
+ desc->dwFlags |= DSBCAPS_CTRLPAN | DSBCAPS_CTRLFREQUENCY;
+ else
+ FIXME("Unsupported buffer guid %s\n", debugstr_dmguid(guids));
}
- else if (IsEqualGUID(guids, &GUID_Buffer_3D_Dry))
- desc->dwFlags |= DSBCAPS_CTRL3D | DSBCAPS_CTRLFREQUENCY | DSBCAPS_MUTE3DATMAXDISTANCE;
- else if (IsEqualGUID(guids, &GUID_Buffer_Mono))
- desc->dwFlags |= DSBCAPS_CTRLPAN | DSBCAPS_CTRLFREQUENCY;
else
- FIXME("Unsupported buffer guid %s\n", debugstr_dmguid(guids));
+ FIXME("Multiple buffers not supported\n");
}
- else
- FIXME("Multiple buffers not supported\n");
- *params = port_config->params;
- if (!(params->dwValidParams & DMUS_PORTPARAMS_CHANNELGROUPS))
- {
- params->dwValidParams |= DMUS_PORTPARAMS_CHANNELGROUPS;
- params->dwChannelGroups = (port_config->header.dwPChannelCount + 15) / 16;
- }
- if (!(params->dwValidParams & DMUS_PORTPARAMS_AUDIOCHANNELS))
+ if (port_config)
{
- params->dwValidParams |= DMUS_PORTPARAMS_AUDIOCHANNELS;
- params->dwAudioChannels = format->nChannels;
+ *params = port_config->params;
+ if (!(params->dwValidParams & DMUS_PORTPARAMS_CHANNELGROUPS))
+ {
+ params->dwValidParams |= DMUS_PORTPARAMS_CHANNELGROUPS;
+ params->dwChannelGroups = (port_config->header.dwPChannelCount + 15) / 16;
+ }
+ if (!(params->dwValidParams & DMUS_PORTPARAMS_AUDIOCHANNELS))
+ {
+ params->dwValidParams |= DMUS_PORTPARAMS_AUDIOCHANNELS;
+ params->dwAudioChannels = format->nChannels;
+ }
}
return S_OK;
}
diff --git a/dlls/dmime/segment.c b/dlls/dmime/segment.c
index b96f0e2e401..36860b7c762 100644
--- a/dlls/dmime/segment.c
+++ b/dlls/dmime/segment.c
@@ -516,6 +516,12 @@ static HRESULT WINAPI segment_GetAudioPathConfig(IDirectMusicSegment8 *iface, IU
{
struct segment *This = impl_from_IDirectMusicSegment8(iface);
FIXME("(%p, %p): stub\n", This, ppAudioPathConfig);
+
+ if (!ppAudioPathConfig)
+ return E_POINTER;
+
+ create_dmaudiopath_config(&IID_IUnknown, (void**)ppAudioPathConfig);
+
return S_OK;
}
--
2.45.2

View File

@@ -0,0 +1 @@
Fixes: [56699] dmime: Semi-Implement IDirectMusicSegment8::GetAudioPathConfig

View File

@@ -0,0 +1,27 @@
From 59bed5259de3329ab2332c9c03f99126acdba4a4 Mon Sep 17 00:00:00 2001
From: Alistair Leslie-Hughes <leslie_alistair@hotmail.com>
Date: Fri, 1 Nov 2024 19:39:11 +1100
Subject: [PATCH] dmscript: IDirectMusicScript::EnumRoutine return S_FALSE by
default
https://bugs.winehq.org/show_bug.cgi?id=55982
---
dlls/dmscript/script.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/dlls/dmscript/script.c b/dlls/dmscript/script.c
index 01d4bcd0290..278405a322a 100644
--- a/dlls/dmscript/script.c
+++ b/dlls/dmscript/script.c
@@ -171,7 +171,7 @@ static HRESULT WINAPI IDirectMusicScriptImpl_EnumRoutine(IDirectMusicScript *ifa
{
IDirectMusicScriptImpl *This = impl_from_IDirectMusicScript(iface);
FIXME("(%p, %ld, %p): stub\n", This, dwIndex, pwszName);
- return S_OK;
+ return S_FALSE;
}
static HRESULT WINAPI IDirectMusicScriptImpl_EnumVariable(IDirectMusicScript *iface, DWORD dwIndex,
--
2.45.2

View File

@@ -0,0 +1 @@
Fixes: [55982] dmscript: IDirectMusicScript::EnumRoutine return S_FALSE by default

View File

@@ -1,4 +1,4 @@
From 6dbedd8d7aebe117b013c61f9549848f13619f0e Mon Sep 17 00:00:00 2001
From 6c64a33f908b9fade24fe11d89533a70fdce352f Mon Sep 17 00:00:00 2001
From: Zebediah Figura <z.figura12@gmail.com>
Date: Wed, 13 Jun 2018 10:44:49 -0500
Subject: [PATCH] configure: Check for sys/eventfd.h, ppoll(), and shm_open().
@@ -12,10 +12,10 @@ Although perhaps we shouldn't since the server doesn't do this.
2 files changed, 18 insertions(+), 1 deletion(-)
diff --git a/configure.ac b/configure.ac
index 67775f9cd15..c03d4c3688b 100644
index eb7f8223b51..388ac14dc8a 100644
--- a/configure.ac
+++ b/configure.ac
@@ -407,6 +407,7 @@ AC_CHECK_HEADERS(\
@@ -411,6 +411,7 @@ AC_CHECK_HEADERS(\
sys/cdio.h \
sys/epoll.h \
sys/event.h \
@@ -23,15 +23,15 @@ index 67775f9cd15..c03d4c3688b 100644
sys/extattr.h \
sys/filio.h \
sys/ipc.h \
@@ -2067,6 +2068,7 @@ AC_CHECK_FUNCS(\
@@ -2079,6 +2080,7 @@ AC_CHECK_FUNCS(\
port_create \
posix_fadvise \
posix_fallocate \
+ ppoll \
prctl \
sched_getcpu \
sched_yield \
renameat \
@@ -2087,6 +2089,12 @@ AC_SEARCH_LIBS(clock_gettime, rt,
@@ -2100,6 +2102,12 @@ AC_SEARCH_LIBS(clock_gettime, rt,
test "$ac_res" = "none required" || AC_SUBST(RT_LIBS,"$ac_res")])
LIBS=$ac_save_LIBS
@@ -45,10 +45,10 @@ index 67775f9cd15..c03d4c3688b 100644
AC_LINK_IFELSE([AC_LANG_PROGRAM(
[[#include <sched.h>]], [[sched_setaffinity(0, 0, 0);]])],[wine_cv_have_sched_setaffinity=yes],[wine_cv_have_sched_setaffinity=no]))
diff --git a/include/config.h.in b/include/config.h.in
index 1c3d4c4d62b..e9686e04a2a 100644
index 6033d8674f3..563b63a92df 100644
--- a/include/config.h.in
+++ b/include/config.h.in
@@ -318,6 +318,9 @@
@@ -321,6 +321,9 @@
/* Define to 1 if you have the 'posix_fallocate' function. */
#undef HAVE_POSIX_FALLOCATE
@@ -58,7 +58,7 @@ index 1c3d4c4d62b..e9686e04a2a 100644
/* Define to 1 if you have the 'prctl' function. */
#undef HAVE_PRCTL
@@ -375,7 +378,10 @@
@@ -381,7 +384,10 @@
/* Define to 1 if 'interface_id' is a member of 'sg_io_hdr_t'. */
#undef HAVE_SG_IO_HDR_T_INTERFACE_ID
@@ -70,7 +70,7 @@ index 1c3d4c4d62b..e9686e04a2a 100644
#undef HAVE_SIGINFO_T_SI_FD
/* Define to 1 if you have the 'sigprocmask' function. */
@@ -504,6 +510,9 @@
@@ -510,6 +516,9 @@
/* Define to 1 if you have the <sys/epoll.h> header file. */
#undef HAVE_SYS_EPOLL_H

View File

@@ -1,4 +1,4 @@
From e222dd363cf419eecb0d5c97390b60de15f37951 Mon Sep 17 00:00:00 2001
From 914fe97f7dc20348ec3e1a2e18bcefa9b7cab463 Mon Sep 17 00:00:00 2001
From: Zebediah Figura <z.figura12@gmail.com>
Date: Fri, 8 Jun 2018 18:51:40 -0500
Subject: [PATCH] server: Add an object operation to grab the esync file
@@ -10,7 +10,7 @@ Split off to decrease patch size.
server/atom.c | 1 +
server/change.c | 1 +
server/clipboard.c | 1 +
server/completion.c | 1 +
server/completion.c | 2 ++
server/console.c | 7 +++++++
server/debugger.c | 2 ++
server/device.c | 4 ++++
@@ -25,6 +25,7 @@ Split off to decrease patch size.
server/mapping.c | 3 +++
server/mutex.c | 1 +
server/named_pipe.c | 5 +++++
server/object.c | 2 ++
server/object.h | 2 ++
server/process.c | 3 +++
server/queue.c | 2 ++
@@ -40,13 +41,13 @@ Split off to decrease patch size.
server/token.c | 1 +
server/window.c | 1 +
server/winstation.c | 2 ++
34 files changed, 68 insertions(+)
35 files changed, 71 insertions(+)
diff --git a/server/async.c b/server/async.c
index 9cb251df5ce..337bba8631b 100644
index 749c547af4f..2377c737e98 100644
--- a/server/async.c
+++ b/server/async.c
@@ -77,6 +77,7 @@ static const struct object_ops async_ops =
@@ -78,6 +78,7 @@ static const struct object_ops async_ops =
add_queue, /* add_queue */
remove_queue, /* remove_queue */
async_signaled, /* signaled */
@@ -54,7 +55,7 @@ index 9cb251df5ce..337bba8631b 100644
async_satisfied, /* satisfied */
no_signal, /* signal */
no_get_fd, /* get_fd */
@@ -676,6 +677,7 @@ static const struct object_ops iosb_ops =
@@ -698,6 +699,7 @@ static const struct object_ops iosb_ops =
no_add_queue, /* add_queue */
NULL, /* remove_queue */
NULL, /* signaled */
@@ -75,7 +76,7 @@ index ff0799f5880..d9824de8eac 100644
no_signal, /* signal */
no_get_fd, /* get_fd */
diff --git a/server/change.c b/server/change.c
index 7a806abc017..e080511bb23 100644
index f42ce066340..d0a90a99261 100644
--- a/server/change.c
+++ b/server/change.c
@@ -112,6 +112,7 @@ static const struct object_ops dir_ops =
@@ -87,7 +88,7 @@ index 7a806abc017..e080511bb23 100644
no_signal, /* signal */
dir_get_fd, /* get_fd */
diff --git a/server/clipboard.c b/server/clipboard.c
index 8118a467dd8..8b265f2dcea 100644
index 91f159bc7c9..0df7fd2f18e 100644
--- a/server/clipboard.c
+++ b/server/clipboard.c
@@ -76,6 +76,7 @@ static const struct object_ops clipboard_ops =
@@ -99,10 +100,18 @@ index 8118a467dd8..8b265f2dcea 100644
no_signal, /* signal */
no_get_fd, /* get_fd */
diff --git a/server/completion.c b/server/completion.c
index 6933195e72d..3d4be86a212 100644
index f9e68c523f1..9093132efac 100644
--- a/server/completion.c
+++ b/server/completion.c
@@ -75,6 +75,7 @@ static const struct object_ops completion_ops =
@@ -92,6 +92,7 @@ static const struct object_ops completion_wait_ops =
add_queue, /* add_queue */
remove_queue, /* remove_queue */
completion_wait_signaled, /* signaled */
+ NULL, /* get_esync_fd */
completion_wait_satisfied, /* satisfied */
no_signal, /* signal */
no_get_fd, /* get_fd */
@@ -166,6 +167,7 @@ static const struct object_ops completion_ops =
add_queue, /* add_queue */
remove_queue, /* remove_queue */
completion_signaled, /* signaled */
@@ -171,7 +180,7 @@ index b64283baf4a..1cc9eea6a50 100644
no_signal, /* signal */
console_connection_get_fd, /* get_fd */
diff --git a/server/debugger.c b/server/debugger.c
index 48adb244b09..d85a2000684 100644
index c59a0abea77..ca04d4c71ce 100644
--- a/server/debugger.c
+++ b/server/debugger.c
@@ -86,6 +86,7 @@ static const struct object_ops debug_event_ops =
@@ -227,7 +236,7 @@ index 436dac6bfe9..f730fa81afa 100644
no_signal, /* signal */
device_file_get_fd, /* get_fd */
diff --git a/server/directory.c b/server/directory.c
index 23d7eb0a2b7..bc161b9ab7e 100644
index b37ec969a9e..a6c0e292071 100644
--- a/server/directory.c
+++ b/server/directory.c
@@ -69,6 +69,7 @@ static const struct object_ops object_type_ops =
@@ -279,7 +288,7 @@ index f1b79b1b35e..c727bfdd1ba 100644
no_signal, /* signal */
no_get_fd, /* get_fd */
diff --git a/server/fd.c b/server/fd.c
index 74ad95fd4d1..4ce498ec0ef 100644
index 16328063df6..4ce78db5b33 100644
--- a/server/fd.c
+++ b/server/fd.c
@@ -172,6 +172,7 @@ static const struct object_ops fd_ops =
@@ -315,7 +324,7 @@ index 74ad95fd4d1..4ce498ec0ef 100644
no_signal, /* signal */
no_get_fd, /* get_fd */
diff --git a/server/file.c b/server/file.c
index b4f99ddc93b..1b4efb04bc5 100644
index 2a839968c25..cbef0c63383 100644
--- a/server/file.c
+++ b/server/file.c
@@ -94,6 +94,7 @@ static const struct object_ops file_ops =
@@ -327,7 +336,7 @@ index b4f99ddc93b..1b4efb04bc5 100644
no_signal, /* signal */
file_get_fd, /* get_fd */
diff --git a/server/handle.c b/server/handle.c
index 0595fdb403b..d41c7e86454 100644
index e65831b3b22..e6c5707556f 100644
--- a/server/handle.c
+++ b/server/handle.c
@@ -126,6 +126,7 @@ static const struct object_ops handle_table_ops =
@@ -339,10 +348,10 @@ index 0595fdb403b..d41c7e86454 100644
no_signal, /* signal */
no_get_fd, /* get_fd */
diff --git a/server/hook.c b/server/hook.c
index 5abdf39ad37..da351d6791f 100644
index c2d2823cd61..ab4d0e9dd31 100644
--- a/server/hook.c
+++ b/server/hook.c
@@ -80,6 +80,7 @@ static const struct object_ops hook_table_ops =
@@ -81,6 +81,7 @@ static const struct object_ops hook_table_ops =
no_add_queue, /* add_queue */
NULL, /* remove_queue */
NULL, /* signaled */
@@ -351,10 +360,10 @@ index 5abdf39ad37..da351d6791f 100644
no_signal, /* signal */
no_get_fd, /* get_fd */
diff --git a/server/mailslot.c b/server/mailslot.c
index 2d8697ec9bd..4cf9b73f784 100644
index 61eceec94e2..92fe938d3b9 100644
--- a/server/mailslot.c
+++ b/server/mailslot.c
@@ -74,6 +74,7 @@ static const struct object_ops mailslot_ops =
@@ -81,6 +81,7 @@ static const struct object_ops mailslot_ops =
add_queue, /* add_queue */
remove_queue, /* remove_queue */
default_fd_signaled, /* signaled */
@@ -362,7 +371,7 @@ index 2d8697ec9bd..4cf9b73f784 100644
no_satisfied, /* satisfied */
no_signal, /* signal */
mailslot_get_fd, /* get_fd */
@@ -133,6 +134,7 @@ static const struct object_ops mail_writer_ops =
@@ -142,6 +143,7 @@ static const struct object_ops mail_writer_ops =
no_add_queue, /* add_queue */
NULL, /* remove_queue */
NULL, /* signaled */
@@ -370,7 +379,7 @@ index 2d8697ec9bd..4cf9b73f784 100644
NULL, /* satisfied */
no_signal, /* signal */
mail_writer_get_fd, /* get_fd */
@@ -196,6 +198,7 @@ static const struct object_ops mailslot_device_ops =
@@ -207,6 +209,7 @@ static const struct object_ops mailslot_device_ops =
no_add_queue, /* add_queue */
NULL, /* remove_queue */
NULL, /* signaled */
@@ -378,7 +387,7 @@ index 2d8697ec9bd..4cf9b73f784 100644
no_satisfied, /* satisfied */
no_signal, /* signal */
no_get_fd, /* get_fd */
@@ -226,6 +229,7 @@ static const struct object_ops mailslot_device_file_ops =
@@ -237,6 +240,7 @@ static const struct object_ops mailslot_device_file_ops =
add_queue, /* add_queue */
remove_queue, /* remove_queue */
default_fd_signaled, /* signaled */
@@ -387,7 +396,7 @@ index 2d8697ec9bd..4cf9b73f784 100644
no_signal, /* signal */
mailslot_device_file_get_fd, /* get_fd */
diff --git a/server/mapping.c b/server/mapping.c
index 2d0a0b783e2..1acfb032bfd 100644
index 2bf45780375..b84bb08a77b 100644
--- a/server/mapping.c
+++ b/server/mapping.c
@@ -67,6 +67,7 @@ static const struct object_ops ranges_ops =
@@ -427,7 +436,7 @@ index af0efe72132..4785a830e92 100644
mutex_signal, /* signal */
no_get_fd, /* get_fd */
diff --git a/server/named_pipe.c b/server/named_pipe.c
index f3404a33c3b..f28cb14cb45 100644
index dd8c14b30a9..5880b601d3a 100644
--- a/server/named_pipe.c
+++ b/server/named_pipe.c
@@ -119,6 +119,7 @@ static const struct object_ops named_pipe_ops =
@@ -470,8 +479,28 @@ index f3404a33c3b..f28cb14cb45 100644
no_satisfied, /* satisfied */
no_signal, /* signal */
named_pipe_device_file_get_fd, /* get_fd */
diff --git a/server/object.c b/server/object.c
index b1665fb5372..0a4d1bede06 100644
--- a/server/object.c
+++ b/server/object.c
@@ -108,6 +108,7 @@ static const struct object_ops apc_reserve_ops =
no_add_queue, /* add_queue */
NULL, /* remove_queue */
NULL, /* signaled */
+ NULL, /* get_esync_fd */
no_satisfied, /* satisfied */
no_signal, /* signal */
no_get_fd, /* get_fd */
@@ -132,6 +133,7 @@ static const struct object_ops completion_reserve_ops =
no_add_queue, /* add_queue */
NULL, /* remove_queue */
NULL, /* signaled */
+ NULL, /* get_esync_fd */
no_satisfied, /* satisfied */
no_signal, /* signal */
no_get_fd, /* get_fd */
diff --git a/server/object.h b/server/object.h
index dfdd691601f..711af54b579 100644
index 6222e3352ed..0a65d0e3892 100644
--- a/server/object.h
+++ b/server/object.h
@@ -78,6 +78,8 @@ struct object_ops
@@ -484,7 +513,7 @@ index dfdd691601f..711af54b579 100644
void (*satisfied)(struct object *,struct wait_queue_entry *);
/* signal an object */
diff --git a/server/process.c b/server/process.c
index a0d5ea64d97..777bf7c2fe2 100644
index 49f5c75005f..dc83a089655 100644
--- a/server/process.c
+++ b/server/process.c
@@ -105,6 +105,7 @@ static const struct object_ops process_ops =
@@ -512,10 +541,10 @@ index a0d5ea64d97..777bf7c2fe2 100644
no_signal, /* signal */
no_get_fd, /* get_fd */
diff --git a/server/queue.c b/server/queue.c
index 348fdac3214..2cd8949a252 100644
index 984d466b66e..8a95055db40 100644
--- a/server/queue.c
+++ b/server/queue.c
@@ -174,6 +174,7 @@ static const struct object_ops msg_queue_ops =
@@ -165,6 +165,7 @@ static const struct object_ops msg_queue_ops =
msg_queue_add_queue, /* add_queue */
msg_queue_remove_queue, /* remove_queue */
msg_queue_signaled, /* signaled */
@@ -523,7 +552,7 @@ index 348fdac3214..2cd8949a252 100644
msg_queue_satisfied, /* satisfied */
no_signal, /* signal */
no_get_fd, /* get_fd */
@@ -211,6 +212,7 @@ static const struct object_ops thread_input_ops =
@@ -202,6 +203,7 @@ static const struct object_ops thread_input_ops =
no_add_queue, /* add_queue */
NULL, /* remove_queue */
NULL, /* signaled */
@@ -532,7 +561,7 @@ index 348fdac3214..2cd8949a252 100644
no_signal, /* signal */
no_get_fd, /* get_fd */
diff --git a/server/registry.c b/server/registry.c
index 629d67c832f..d6b39b99b22 100644
index cc9a33fff1d..c19e92c9750 100644
--- a/server/registry.c
+++ b/server/registry.c
@@ -180,6 +180,7 @@ static const struct object_ops key_ops =
@@ -544,7 +573,7 @@ index 629d67c832f..d6b39b99b22 100644
no_signal, /* signal */
no_get_fd, /* get_fd */
diff --git a/server/request.c b/server/request.c
index 7021741c765..ca83fdbd2af 100644
index dabcea68309..832a33917b4 100644
--- a/server/request.c
+++ b/server/request.c
@@ -90,6 +90,7 @@ static const struct object_ops master_socket_ops =
@@ -568,10 +597,10 @@ index 53b42a886df..e3889f24601 100644
semaphore_signal, /* signal */
no_get_fd, /* get_fd */
diff --git a/server/serial.c b/server/serial.c
index d665eb7fa35..11e204e4419 100644
index 209f2e9174e..0d49a996c2a 100644
--- a/server/serial.c
+++ b/server/serial.c
@@ -85,6 +85,7 @@ static const struct object_ops serial_ops =
@@ -91,6 +91,7 @@ static const struct object_ops serial_ops =
add_queue, /* add_queue */
remove_queue, /* remove_queue */
default_fd_signaled, /* signaled */
@@ -592,10 +621,10 @@ index 19b76d44c16..55cd6aa037e 100644
no_signal, /* signal */
no_get_fd, /* get_fd */
diff --git a/server/sock.c b/server/sock.c
index 52175b08987..77b41716cd1 100644
index d2ec882554f..44a4e3b7b15 100644
--- a/server/sock.c
+++ b/server/sock.c
@@ -451,6 +451,7 @@ static const struct object_ops sock_ops =
@@ -471,6 +471,7 @@ static const struct object_ops sock_ops =
add_queue, /* add_queue */
remove_queue, /* remove_queue */
default_fd_signaled, /* signaled */
@@ -603,7 +632,7 @@ index 52175b08987..77b41716cd1 100644
no_satisfied, /* satisfied */
no_signal, /* signal */
sock_get_fd, /* get_fd */
@@ -3481,6 +3482,7 @@ static const struct object_ops ifchange_ops =
@@ -3599,6 +3600,7 @@ static const struct object_ops ifchange_ops =
no_add_queue, /* add_queue */
NULL, /* remove_queue */
NULL, /* signaled */
@@ -611,7 +640,7 @@ index 52175b08987..77b41716cd1 100644
no_satisfied, /* satisfied */
no_signal, /* signal */
ifchange_get_fd, /* get_fd */
@@ -3702,6 +3704,7 @@ static const struct object_ops socket_device_ops =
@@ -3820,6 +3822,7 @@ static const struct object_ops socket_device_ops =
no_add_queue, /* add_queue */
NULL, /* remove_queue */
NULL, /* signaled */
@@ -620,7 +649,7 @@ index 52175b08987..77b41716cd1 100644
no_signal, /* signal */
no_get_fd, /* get_fd */
diff --git a/server/symlink.c b/server/symlink.c
index 27d48e2f994..8cb24b4ff6e 100644
index dd28efd3a75..c7f34412317 100644
--- a/server/symlink.c
+++ b/server/symlink.c
@@ -71,6 +71,7 @@ static const struct object_ops symlink_ops =
@@ -632,7 +661,7 @@ index 27d48e2f994..8cb24b4ff6e 100644
no_signal, /* signal */
no_get_fd, /* get_fd */
diff --git a/server/thread.c b/server/thread.c
index 0d5bdcf21d9..9dc38d4cce9 100644
index 506adfc0a6f..339cdfec1fa 100644
--- a/server/thread.c
+++ b/server/thread.c
@@ -96,6 +96,7 @@ static const struct object_ops thread_apc_ops =
@@ -672,10 +701,10 @@ index 96dc9d00ca1..f59902d5607 100644
no_signal, /* signal */
no_get_fd, /* get_fd */
diff --git a/server/token.c b/server/token.c
index 4df8d2e0c6e..8b4d2f0c1b1 100644
index 48ee1eca8fe..479596bdbfa 100644
--- a/server/token.c
+++ b/server/token.c
@@ -143,6 +143,7 @@ static const struct object_ops token_ops =
@@ -145,6 +145,7 @@ static const struct object_ops token_ops =
no_add_queue, /* add_queue */
NULL, /* remove_queue */
NULL, /* signaled */
@@ -684,7 +713,7 @@ index 4df8d2e0c6e..8b4d2f0c1b1 100644
no_signal, /* signal */
no_get_fd, /* get_fd */
diff --git a/server/window.c b/server/window.c
index 242e93f303a..3aa7ad4ad79 100644
index 412592fbc71..94a70ce890f 100644
--- a/server/window.c
+++ b/server/window.c
@@ -107,6 +107,7 @@ static const struct object_ops window_ops =
@@ -696,7 +725,7 @@ index 242e93f303a..3aa7ad4ad79 100644
no_signal, /* signal */
no_get_fd, /* get_fd */
diff --git a/server/winstation.c b/server/winstation.c
index 5903497d61e..7692fbe3ed2 100644
index e5f4bfec357..50fe34aa9ce 100644
--- a/server/winstation.c
+++ b/server/winstation.c
@@ -76,6 +76,7 @@ static const struct object_ops winstation_ops =
@@ -716,5 +745,5 @@ index 5903497d61e..7692fbe3ed2 100644
no_signal, /* signal */
no_get_fd, /* get_fd */
--
2.42.0
2.45.2

View File

@@ -1,4 +1,4 @@
From a43255ead53a49837e7995ab4de0afa8e05e6334 Mon Sep 17 00:00:00 2001
From ce164f9c292bc93ad50055bdb0a786e8a8770afa Mon Sep 17 00:00:00 2001
From: Zebediah Figura <zfigura@codeweavers.com>
Date: Mon, 6 Jul 2020 15:11:12 -0500
Subject: [PATCH] server: Create eventfd file descriptors for process objects.
@@ -49,7 +49,7 @@ index 00f9e638d83..8522d8a69ae 100644
void esync_init(void);
+int esync_create_fd( int initval, int flags );
diff --git a/server/process.c b/server/process.c
index 031c0fece13..eb073551b57 100644
index 3c5a58b7b03..30555d516c8 100644
--- a/server/process.c
+++ b/server/process.c
@@ -63,6 +63,7 @@
@@ -77,7 +77,7 @@ index 031c0fece13..eb073551b57 100644
no_satisfied, /* satisfied */
no_signal, /* signal */
no_get_fd, /* get_fd */
@@ -688,6 +690,7 @@ struct process *create_process( int fd, struct process *parent, unsigned int fla
@@ -689,6 +691,7 @@ struct process *create_process( int fd, struct process *parent, unsigned int fla
process->rawinput_kbd = NULL;
memset( &process->image_info, 0, sizeof(process->image_info) );
list_init( &process->rawinput_entry );
@@ -85,7 +85,7 @@ index 031c0fece13..eb073551b57 100644
list_init( &process->kernel_object );
list_init( &process->thread_list );
list_init( &process->locks );
@@ -738,6 +741,9 @@ struct process *create_process( int fd, struct process *parent, unsigned int fla
@@ -739,6 +742,9 @@ struct process *create_process( int fd, struct process *parent, unsigned int fla
if (!process->handles || !process->token) goto error;
process->session_id = token_get_session_id( process->token );
@@ -95,7 +95,7 @@ index 031c0fece13..eb073551b57 100644
set_fd_events( process->msg_fd, POLLIN ); /* start listening to events */
return process;
@@ -786,6 +792,7 @@ static void process_destroy( struct object *obj )
@@ -787,6 +793,7 @@ static void process_destroy( struct object *obj )
free( process->rawinput_devices );
free( process->dir_cache );
free( process->image );
@@ -103,7 +103,7 @@ index 031c0fece13..eb073551b57 100644
}
/* dump a process on stdout for debugging purposes */
@@ -803,6 +810,13 @@ static int process_signaled( struct object *obj, struct wait_queue_entry *entry
@@ -804,6 +811,13 @@ static int process_signaled( struct object *obj, struct wait_queue_entry *entry
return !process->running_threads;
}
@@ -118,17 +118,17 @@ index 031c0fece13..eb073551b57 100644
{
access = default_map_access( obj, access );
diff --git a/server/process.h b/server/process.h
index 1e73e9d47dc..bedd8bb4586 100644
index 96814ab7cf8..ec74ba0490a 100644
--- a/server/process.h
+++ b/server/process.h
@@ -86,6 +86,7 @@ struct process
struct list rawinput_entry; /* entry in the rawinput process list */
struct list kernel_object; /* list of kernel object pointers */
pe_image_info_t image_info; /* main exe image info */
struct pe_image_info image_info; /* main exe image info */
+ int esync_fd; /* esync file descriptor (signaled on exit) */
};
/* process functions */
--
2.43.0
2.45.2

View File

@@ -1,4 +1,4 @@
From 7476e7b2e8680352cf2e1de7552ae58e11ff7869 Mon Sep 17 00:00:00 2001
From 0ef3de9bd3b51a1e37c50fd75ceb3db6ea24abd0 Mon Sep 17 00:00:00 2001
From: Zebediah Figura <zfigura@codeweavers.com>
Date: Mon, 6 Jul 2020 15:19:37 -0500
Subject: [PATCH] ntdll, server: Implement waiting on server-bound objects.
@@ -16,14 +16,15 @@ With this patch we break waiting on svcctl.exe.
dlls/ntdll/unix/esync.c | 84 ++++++++++++++++++++++++++++++++++++++---
server/esync.c | 16 ++++++++
server/esync.h | 1 +
server/named_pipe.c | 1 +
server/thread.c | 4 ++
4 files changed, 99 insertions(+), 6 deletions(-)
5 files changed, 100 insertions(+), 6 deletions(-)
diff --git a/dlls/ntdll/unix/esync.c b/dlls/ntdll/unix/esync.c
index 4f993689e0d..6fd195df759 100644
index 65ef70acd36..b0168f5cde5 100644
--- a/dlls/ntdll/unix/esync.c
+++ b/dlls/ntdll/unix/esync.c
@@ -199,6 +199,72 @@ static struct esync *get_cached_object( HANDLE handle )
@@ -193,6 +193,72 @@ static struct esync *get_cached_object( HANDLE handle )
return &esync_list[entry][idx];
}
@@ -96,7 +97,7 @@ index 4f993689e0d..6fd195df759 100644
NTSTATUS esync_close( HANDLE handle )
{
UINT_PTR entry, idx = handle_to_index( handle, &entry );
@@ -278,10 +344,11 @@ NTSTATUS esync_release_semaphore( HANDLE handle, ULONG count, ULONG *prev )
@@ -272,10 +338,11 @@ NTSTATUS esync_release_semaphore( HANDLE handle, ULONG count, ULONG *prev )
struct semaphore *semaphore;
uint64_t count64 = count;
ULONG current;
@@ -109,7 +110,7 @@ index 4f993689e0d..6fd195df759 100644
semaphore = obj->shm;
do
@@ -320,10 +387,11 @@ NTSTATUS esync_set_event( HANDLE handle )
@@ -314,10 +381,11 @@ NTSTATUS esync_set_event( HANDLE handle )
{
static const uint64_t value = 1;
struct esync *obj;
@@ -122,7 +123,7 @@ index 4f993689e0d..6fd195df759 100644
if (write( obj->fd, &value, sizeof(value) ) == -1)
ERR("write: %s\n", strerror(errno));
@@ -335,10 +403,11 @@ NTSTATUS esync_reset_event( HANDLE handle )
@@ -329,10 +397,11 @@ NTSTATUS esync_reset_event( HANDLE handle )
{
uint64_t value;
struct esync *obj;
@@ -135,7 +136,7 @@ index 4f993689e0d..6fd195df759 100644
if (read( obj->fd, &value, sizeof(value) ) == -1 && errno != EWOULDBLOCK && errno != EAGAIN)
ERR("read: %s\n", strerror(errno));
@@ -427,10 +496,13 @@ NTSTATUS esync_wait_objects( DWORD count, const HANDLE *handles, BOOLEAN wait_an
@@ -421,10 +490,13 @@ NTSTATUS esync_wait_objects( DWORD count, const HANDLE *handles, BOOLEAN wait_an
for (i = 0; i < count; i++)
{
@@ -151,7 +152,7 @@ index 4f993689e0d..6fd195df759 100644
}
if (has_esync && has_server)
@@ -483,7 +555,7 @@ NTSTATUS esync_wait_objects( DWORD count, const HANDLE *handles, BOOLEAN wait_an
@@ -477,7 +549,7 @@ NTSTATUS esync_wait_objects( DWORD count, const HANDLE *handles, BOOLEAN wait_an
int64_t value;
ssize_t size;
@@ -161,10 +162,10 @@ index 4f993689e0d..6fd195df759 100644
/* Don't grab the object, just check if it's signaled. */
if (fds[i].revents & POLLIN)
diff --git a/server/esync.c b/server/esync.c
index e18b76bff5b..2b9307267f9 100644
index 44214e5fe02..60e98936455 100644
--- a/server/esync.c
+++ b/server/esync.c
@@ -315,6 +315,22 @@ int esync_create_fd( int initval, int flags )
@@ -313,6 +313,22 @@ int esync_create_fd( int initval, int flags )
#endif
}
@@ -188,19 +189,31 @@ index e18b76bff5b..2b9307267f9 100644
{
struct esync *esync;
diff --git a/server/esync.h b/server/esync.h
index 6a0a367124d..1e12560ddd6 100644
index 8522d8a69ae..1241e6d9f1a 100644
--- a/server/esync.h
+++ b/server/esync.h
@@ -21,3 +21,4 @@
@@ -23,3 +23,4 @@
extern int do_esync(void);
void esync_init(void);
int esync_create_fd( int initval, int flags );
+void esync_wake_up( struct object *obj );
diff --git a/server/named_pipe.c b/server/named_pipe.c
index 68fa8953cca..1535c5188ec 100644
--- a/server/named_pipe.c
+++ b/server/named_pipe.c
@@ -344,6 +344,7 @@ static const struct object_ops named_pipe_dir_ops =
add_queue, /* add_queue */
remove_queue, /* remove_queue */
default_fd_signaled, /* signaled */
+ NULL, /* get_esync_fd */
no_satisfied, /* satisfied */
no_signal, /* signal */
named_pipe_dir_get_fd, /* get_fd */
diff --git a/server/thread.c b/server/thread.c
index 1e6f60182df..0413e889c7d 100644
index 339cdfec1fa..4262b841fca 100644
--- a/server/thread.c
+++ b/server/thread.c
@@ -51,6 +51,7 @@
@@ -50,6 +50,7 @@
#include "request.h"
#include "user.h"
#include "security.h"
@@ -208,7 +221,7 @@ index 1e6f60182df..0413e889c7d 100644
/* thread queues */
@@ -1053,6 +1054,9 @@ void wake_up( struct object *obj, int max )
@@ -1073,6 +1074,9 @@ void wake_up( struct object *obj, int max )
struct list *ptr;
int ret;
@@ -219,5 +232,5 @@ index 1e6f60182df..0413e889c7d 100644
{
struct wait_queue_entry *entry = LIST_ENTRY( ptr, struct wait_queue_entry, entry );
--
2.30.2
2.45.2

View File

@@ -1,4 +1,4 @@
From 622de4743d9585d895bb560b4c8ac6ab01aff23f Mon Sep 17 00:00:00 2001
From 631ec6bff81bb2e3389d0c2030364dea91719bf6 Mon Sep 17 00:00:00 2001
From: Zebediah Figura <zfigura@codeweavers.com>
Date: Mon, 6 Jul 2020 16:52:39 -0500
Subject: [PATCH] ntdll: Implement NtSignalAndWaitForSingleObject().
@@ -10,10 +10,10 @@ Subject: [PATCH] ntdll: Implement NtSignalAndWaitForSingleObject().
3 files changed, 33 insertions(+)
diff --git a/dlls/ntdll/unix/esync.c b/dlls/ntdll/unix/esync.c
index 9e980643a6e..db70e5075d1 100644
index 6d07d8057a1..ca0ffd2b8b1 100644
--- a/dlls/ntdll/unix/esync.c
+++ b/dlls/ntdll/unix/esync.c
@@ -842,6 +842,34 @@ NTSTATUS esync_wait_objects( DWORD count, const HANDLE *handles, BOOLEAN wait_an
@@ -844,6 +844,34 @@ NTSTATUS esync_wait_objects( DWORD count, const HANDLE *handles, BOOLEAN wait_an
return ret;
}
@@ -62,11 +62,11 @@ index 8eaa79a5823..88a6d5c8975 100644
/* We have to synchronize on the fd cache mutex so that our calls to receive_fd
diff --git a/dlls/ntdll/unix/sync.c b/dlls/ntdll/unix/sync.c
index 20391617e40..12ed44f7a8e 100644
index 943ba6c0da9..51fca406a4c 100644
--- a/dlls/ntdll/unix/sync.c
+++ b/dlls/ntdll/unix/sync.c
@@ -1531,6 +1531,9 @@ NTSTATUS WINAPI NtSignalAndWaitForSingleObject( HANDLE signal, HANDLE wait,
select_op_t select_op;
@@ -1636,6 +1636,9 @@ NTSTATUS WINAPI NtSignalAndWaitForSingleObject( HANDLE signal, HANDLE wait,
union select_op select_op;
UINT flags = SELECT_INTERRUPTIBLE;
+ if (do_esync())
@@ -76,5 +76,5 @@ index 20391617e40..12ed44f7a8e 100644
if (alertable) flags |= SELECT_ALERTABLE;
--
2.42.0
2.45.2

View File

@@ -1,119 +0,0 @@
From dc2aaa6a25ebccc30c7903fa68235d5971f8d6b8 Mon Sep 17 00:00:00 2001
From: Daniel Wendt <daniel.wendt@linux.com>
Date: Fri, 15 Nov 2013 12:52:37 +0100
Subject: [PATCH] gdi32: fix for rotated Arc, ArcTo, Chord and Pie drawing
problem
Wine-Bug: http://bugs.winehq.org/show_bug.cgi?id=34579
---
dlls/win32u/dibdrv/graphics.c | 80 +++++++++++++++++++++++++++++++++++
1 file changed, 80 insertions(+)
diff --git a/dlls/win32u/dibdrv/graphics.c b/dlls/win32u/dibdrv/graphics.c
index 410f29e8f19..3a6f8184009 100644
--- a/dlls/win32u/dibdrv/graphics.c
+++ b/dlls/win32u/dibdrv/graphics.c
@@ -310,6 +310,60 @@ static int get_arc_points( int arc_dir, const RECT *rect, POINT start, POINT end
return pos - count;
}
+/*
+ Check if matrix has uniform scale and shear and contains a rotation.
+*/
+static BOOL xform_has_rotate_and_uniform_scale_and_shear( const XFORM *xform )
+{
+ return xform->eM21 != 0 && xform->eM11 == xform->eM22 && -xform->eM21 == xform->eM12;
+}
+
+/*
+ Decompose rotation and translation from matrix xform.
+
+ If parameter rotation_and_translation is != NULL, save rotation and translation into it.
+
+ Note: The current implementation only works on matrixes with uniform scale and shear,
+ which has to be checked by a call to xform_has_rotate_and_uniform_scale_and_shear().
+ Hints how to get unique values for non-uniform matrixes are welcome.
+*/
+static BOOL xform_decompose_rotation_and_translation( XFORM *xform, XFORM *rotation_and_translation )
+{
+ XFORM inverse_matrix_scale;
+ XFORM origin_matrix = *xform;
+ double determinant = 0;
+
+ /* xform = xfrom-transposed * xform */
+ xform->eM11 = sqrt( xform->eM11 * xform->eM11 + xform->eM21 * xform->eM21 );
+ xform->eM22 = sqrt( xform->eM12 * xform->eM12 + xform->eM22 * xform->eM22 );
+ xform->eM12 = 0;
+ xform->eM21 = 0;
+ xform->eDx = 0;
+ xform->eDy = 0;
+
+ if ( rotation_and_translation == NULL )
+ return TRUE;
+
+ if ( xform->eM11 == 0 || xform->eM22 == 0 )
+ return FALSE;
+
+ determinant = xform->eM11 * xform->eM22;
+
+ inverse_matrix_scale.eM11 = xform->eM22 / determinant;
+ inverse_matrix_scale.eM12 = 0;
+ inverse_matrix_scale.eM21 = 0;
+ inverse_matrix_scale.eM22 = xform->eM11 / determinant;
+
+ /* calculate the rotation matrix */
+ rotation_and_translation->eM11 = inverse_matrix_scale.eM11 * origin_matrix.eM11;
+ rotation_and_translation->eM12 = inverse_matrix_scale.eM11 * origin_matrix.eM12;
+ rotation_and_translation->eM21 = inverse_matrix_scale.eM22 * origin_matrix.eM12 * -1;
+ rotation_and_translation->eM22 = inverse_matrix_scale.eM22 * origin_matrix.eM22;
+ rotation_and_translation->eDx = origin_matrix.eDx;
+ rotation_and_translation->eDy = origin_matrix.eDy;
+ return TRUE;
+}
+
/* backend for arc functions; extra_lines is -1 for ArcTo, 0 for Arc, 1 for Chord, 2 for Pie */
static BOOL draw_arc( PHYSDEV dev, INT left, INT top, INT right, INT bottom,
INT start_x, INT start_y, INT end_x, INT end_y, INT extra_lines )
@@ -322,6 +376,22 @@ static BOOL draw_arc( PHYSDEV dev, INT left, INT top, INT right, INT bottom,
BOOL ret = TRUE;
HRGN outline = 0, interior = 0;
+ BOOL exclude_rotation = FALSE;
+ XFORM old;
+ XFORM rotation_and_translation;
+ if (dc->attr->graphics_mode == GM_ADVANCED)
+ {
+ XFORM xf;
+ NtGdiGetTransform( pdev->dev.hdc, 0x203, &old );
+ xf = old;
+ if (xform_has_rotate_and_uniform_scale_and_shear( &xf ) &&
+ xform_decompose_rotation_and_translation( &xf, &rotation_and_translation ))
+ {
+ NtGdiModifyWorldTransform( pdev->dev.hdc, &xf, MWT_SET );
+ exclude_rotation = TRUE;
+ }
+ }
+
if (!get_pen_device_rect( dc, pdev, &rect, left, top, right, bottom )) return TRUE;
width = rect.right - rect.left;
@@ -355,6 +425,16 @@ static BOOL draw_arc( PHYSDEV dev, INT left, INT top, INT right, INT bottom,
points[count].y = rect.top + height / 2;
count++;
}
+
+ if (exclude_rotation == TRUE)
+ {
+ NtGdiModifyWorldTransform( pdev->dev.hdc, &rotation_and_translation, MWT_SET );
+ /* apply rotation and translation to calculated points */
+ NtGdiTransformPoints( dev->hdc, points, points, count, NtGdiLPtoDP );
+ /* restore origin matrix */
+ NtGdiModifyWorldTransform( pdev->dev.hdc, &old, MWT_SET );
+ }
+
if (count < 2)
{
free( points );
--
2.33.0

View File

@@ -1,110 +0,0 @@
From fdc9d34400af31765d20ca7b070e53d7eec710e4 Mon Sep 17 00:00:00 2001
From: Daniel Wendt <daniel.wendt@linux.com>
Date: Tue, 10 Dec 2013 14:55:32 +0100
Subject: [PATCH] gdi32: fix for rotated ellipse
Bug: http://bugs.winehq.org/show_bug.cgi?id=35331
---
dlls/win32u/dibdrv/graphics.c | 63 ++++++++++++++++++++++++-----------
1 file changed, 44 insertions(+), 19 deletions(-)
diff --git a/dlls/win32u/dibdrv/graphics.c b/dlls/win32u/dibdrv/graphics.c
index 21d2eabbc9e..1eeea1d68ea 100644
--- a/dlls/win32u/dibdrv/graphics.c
+++ b/dlls/win32u/dibdrv/graphics.c
@@ -1531,10 +1531,28 @@ BOOL dibdrv_RoundRect( PHYSDEV dev, INT left, INT top, INT right, INT bottom,
DC *dc = get_physdev_dc( dev );
RECT rect;
POINT pt[2], *points;
- int i, end, count;
+ int i, end;
+ ULONG count;
BOOL ret = TRUE;
HRGN outline = 0, interior = 0;
+ BOOL exclude_rotation_translation = FALSE;
+ XFORM old;
+ XFORM rotation_and_translation;
+
+ if (dc->attr->graphics_mode == GM_ADVANCED)
+ {
+ XFORM xf;
+ NtGdiGetTransform( pdev->dev.hdc, 0x203, &old );
+ xf = old;
+ if (xform_has_rotate_and_uniform_scale_and_shear( &xf ) &&
+ xform_decompose_rotation_and_translation( &xf, &rotation_and_translation ))
+ {
+ NtGdiModifyWorldTransform( pdev->dev.hdc, &xf, MWT_SET );
+ exclude_rotation_translation = TRUE;
+ }
+ }
+
if (!get_pen_device_rect( dc, pdev, &rect, left, top, right, bottom )) return TRUE;
pt[0].x = pt[0].y = 0;
@@ -1555,23 +1573,6 @@ BOOL dibdrv_RoundRect( PHYSDEV dev, INT left, INT top, INT right, INT bottom,
return FALSE;
}
- if (pdev->brush.style != BS_NULL &&
- !(interior = NtGdiCreateRoundRectRgn( rect.left, rect.top, rect.right + 1, rect.bottom + 1,
- ellipse_width, ellipse_height )))
- {
- free( points );
- if (outline) NtGdiDeleteObjectApp( outline );
- return FALSE;
- }
-
- /* if not using a region, paint the interior first so the outline can overlap it */
- if (interior && !outline)
- {
- ret = brush_region( pdev, interior );
- NtGdiDeleteObjectApp( interior );
- interior = 0;
- }
-
count = ellipse_first_quadrant( ellipse_width, ellipse_height, points );
if (dc->attr->arc_direction == AD_CLOCKWISE)
@@ -1615,13 +1616,37 @@ BOOL dibdrv_RoundRect( PHYSDEV dev, INT left, INT top, INT right, INT bottom,
}
count = end + 1;
+ if (exclude_rotation_translation == TRUE)
+ {
+ NtGdiModifyWorldTransform( pdev->dev.hdc, &rotation_and_translation, MWT_SET );
+ /* apply rotation and translation to calculated points */
+ NtGdiTransformPoints( dev->hdc, points, points, count, NtGdiLPtoDP );
+ /* restore origin matrix */
+ NtGdiModifyWorldTransform( pdev->dev.hdc, &old, MWT_SET );
+ }
+
+ if (pdev->brush.style != BS_NULL &&
+ !(interior = ULongToHandle(NtGdiPolyPolyDraw( ULongToHandle(ALTERNATE), points, &count, 1, NtGdiPolyPolygonRgn ))))
+ {
+ free( points );
+ if (outline) NtGdiDeleteObjectApp( outline );
+ return FALSE;
+ }
+
+ /* if not using a region, paint the interior first so the outline can overlap it */
+ if (interior && !outline)
+ {
+ ret = brush_region( pdev, interior );
+ NtGdiDeleteObjectApp( interior );
+ interior = 0;
+ }
+
reset_dash_origin( pdev );
pdev->pen_lines( pdev, count, points, TRUE, outline );
add_pen_lines_bounds( pdev, count, points, outline );
if (interior)
{
- NtGdiCombineRgn( interior, interior, outline, RGN_DIFF );
ret = brush_region( pdev, interior );
NtGdiDeleteObjectApp( interior );
}
--
2.43.0

View File

@@ -1,3 +0,0 @@
Fixes: [34579] gdi32: fix for rotated Arc, ArcTo, Chord and Pie drawing problem
Fixes: [35331] gdi32: fix for rotated ellipse
Disabled: True

View File

@@ -1,211 +0,0 @@
From d1f5c52e07bce357d3b471e839db2a6f7a72fa86 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Michael=20M=C3=BCller?= <michael@fds-team.de>
Date: Mon, 3 Apr 2017 05:30:27 +0200
Subject: [PATCH] ntdll: Implement HashLinks field in LDR module data.
---
dlls/kernel32/tests/loader.c | 75 ++++++++++++++++++++++++++++++++++++
dlls/ntdll/loader.c | 42 ++++++++++++++++++++
2 files changed, 117 insertions(+)
diff --git a/dlls/kernel32/tests/loader.c b/dlls/kernel32/tests/loader.c
index 9b0f8f6bff2..747dfb0afa6 100644
--- a/dlls/kernel32/tests/loader.c
+++ b/dlls/kernel32/tests/loader.c
@@ -28,6 +28,7 @@
#include "winbase.h"
#include "winternl.h"
#include "winnls.h"
+#include "winuser.h"
#include "wine/test.h"
#include "delayloadhandler.h"
@@ -4651,6 +4652,79 @@ static void test_Wow64Transition(void)
debugstr_wn(name->SectionFileName.Buffer, name->SectionFileName.Length / sizeof(WCHAR)));
}
+static inline WCHAR toupperW(WCHAR c)
+{
+ WCHAR tmp = c;
+ CharUpperBuffW(&tmp, 1);
+ return tmp;
+}
+
+static ULONG hash_basename(const WCHAR *basename)
+{
+ WORD version = MAKEWORD(NtCurrentTeb()->Peb->OSMinorVersion,
+ NtCurrentTeb()->Peb->OSMajorVersion);
+ ULONG hash = 0;
+
+ if (version >= 0x0602)
+ {
+ for (; *basename; basename++)
+ hash = hash * 65599 + toupperW(*basename);
+ }
+ else if (version == 0x0601)
+ {
+ for (; *basename; basename++)
+ hash = hash + 65599 * toupperW(*basename);
+ }
+ else
+ hash = toupperW(basename[0]) - 'A';
+
+ return hash & 31;
+}
+
+static void test_HashLinks(void)
+{
+ static WCHAR ntdllW[] = {'n','t','d','l','l','.','d','l','l',0};
+ static WCHAR kernel32W[] = {'k','e','r','n','e','l','3','2','.','d','l','l',0};
+
+ LIST_ENTRY *hash_map, *entry, *mark;
+ LDR_DATA_TABLE_ENTRY *module;
+ BOOL found;
+
+ entry = &NtCurrentTeb()->Peb->LdrData->InLoadOrderModuleList;
+ entry = entry->Flink;
+
+ module = CONTAINING_RECORD(entry, LDR_DATA_TABLE_ENTRY, InLoadOrderLinks);
+ entry = module->HashLinks.Blink;
+
+ hash_map = entry - hash_basename(module->BaseDllName.Buffer);
+
+ mark = &hash_map[hash_basename(ntdllW)];
+ found = FALSE;
+ for (entry = mark->Flink; entry != mark; entry = entry->Flink)
+ {
+ module = CONTAINING_RECORD(entry, LDR_DATA_TABLE_ENTRY, HashLinks);
+ if (!lstrcmpiW(module->BaseDllName.Buffer, ntdllW))
+ {
+ found = TRUE;
+ break;
+ }
+ }
+ ok(found, "Could not find ntdll\n");
+
+ mark = &hash_map[hash_basename(kernel32W)];
+ found = FALSE;
+ for (entry = mark->Flink; entry != mark; entry = entry->Flink)
+ {
+ module = CONTAINING_RECORD(entry, LDR_DATA_TABLE_ENTRY, HashLinks);
+ if (!lstrcmpiW(module->BaseDllName.Buffer, kernel32W))
+ {
+ found = TRUE;
+ break;
+ }
+ }
+ ok(found, "Could not find kernel32\n");
+}
+
START_TEST(loader)
{
int argc;
@@ -4734,6 +4808,7 @@ START_TEST(loader)
test_InMemoryOrderModuleList();
test_LoadPackagedLibrary();
test_wow64_redirection();
+ test_HashLinks();
test_dll_file( "ntdll.dll" );
test_dll_file( "kernel32.dll" );
test_dll_file( "advapi32.dll" );
diff --git a/dlls/ntdll/loader.c b/dlls/ntdll/loader.c
index 0ed37ad390c..94610a82a65 100644
--- a/dlls/ntdll/loader.c
+++ b/dlls/ntdll/loader.c
@@ -128,6 +128,9 @@ struct file_id
BYTE ObjectId[16];
};
+#define HASH_MAP_SIZE 32
+static LIST_ENTRY hash_table[HASH_MAP_SIZE];
+
/* internal representation of loaded modules */
typedef struct _wine_modref
{
@@ -603,6 +606,33 @@ static int base_address_compare( const void *key, const RTL_BALANCED_NODE *entry
return 0;
}
+/*************************************************************************
+ * hash_basename
+ *
+ * Calculates the bucket index of a dll using the basename.
+ */
+static ULONG hash_basename(const WCHAR *basename)
+{
+ WORD version = MAKEWORD(NtCurrentTeb()->Peb->OSMinorVersion,
+ NtCurrentTeb()->Peb->OSMajorVersion);
+ ULONG hash = 0;
+
+ if (version >= 0x0602)
+ {
+ for (; *basename; basename++)
+ hash = hash * 65599 + towupper(*basename);
+ }
+ else if (version == 0x0601)
+ {
+ for (; *basename; basename++)
+ hash = hash + 65599 * towupper(*basename);
+ }
+ else
+ hash = towupper(basename[0]) - 'A';
+
+ return hash & (HASH_MAP_SIZE-1);
+}
+
/*************************************************************************
* get_modref
*
@@ -1599,9 +1629,14 @@ static WINE_MODREF *alloc_module( HMODULE hModule, const UNICODE_STRING *nt_name
&wm->ldr.InLoadOrderLinks);
InsertTailList(&NtCurrentTeb()->Peb->LdrData->InMemoryOrderModuleList,
&wm->ldr.InMemoryOrderLinks);
+ InsertTailList(&hash_table[hash_basename(wm->ldr.BaseDllName.Buffer)],
+ &wm->ldr.HashLinks);
if (rtl_rb_tree_put( &base_address_index_tree, wm->ldr.DllBase, &wm->ldr.BaseAddressIndexNode, base_address_compare ))
ERR( "rtl_rb_tree_put failed.\n" );
+
/* wait until init is called for inserting into InInitializationOrderModuleList */
+ wm->ldr.InInitializationOrderLinks.Flink = NULL;
+ wm->ldr.InInitializationOrderLinks.Blink = NULL;
if (!(nt->OptionalHeader.DllCharacteristics & IMAGE_DLLCHARACTERISTICS_NX_COMPAT))
{
@@ -2299,6 +2334,7 @@ static NTSTATUS build_module( LPCWSTR load_path, const UNICODE_STRING *nt_name,
/* the module has only be inserted in the load & memory order lists */
RemoveEntryList(&wm->ldr.InLoadOrderLinks);
RemoveEntryList(&wm->ldr.InMemoryOrderLinks);
+ RemoveEntryList(&wm->ldr.HashLinks);
RtlRbRemoveNode( &base_address_index_tree, &wm->ldr.BaseAddressIndexNode );
/* FIXME: there are several more dangling references
@@ -3963,6 +3999,7 @@ static void free_modref( WINE_MODREF *wm )
RemoveEntryList(&wm->ldr.InLoadOrderLinks);
RemoveEntryList(&wm->ldr.InMemoryOrderLinks);
+ RemoveEntryList(&wm->ldr.HashLinks);
RtlRbRemoveNode( &base_address_index_tree, &wm->ldr.BaseAddressIndexNode );
if (wm->ldr.InInitializationOrderLinks.Flink)
RemoveEntryList(&wm->ldr.InInitializationOrderLinks);
@@ -4384,6 +4421,7 @@ void loader_init( CONTEXT *context, void **entry )
ANSI_STRING ctrl_routine = RTL_CONSTANT_STRING( "CtrlRoutine" );
WINE_MODREF *kernel32;
PEB *peb = NtCurrentTeb()->Peb;
+ unsigned int i;
peb->LdrData = &ldr;
peb->FastPebLock = &peb_lock;
@@ -4402,6 +4440,10 @@ void loader_init( CONTEXT *context, void **entry )
if (!(tls_dirs = RtlAllocateHeap( GetProcessHeap(), HEAP_ZERO_MEMORY, tls_module_count * sizeof(*tls_dirs) )))
NtTerminateProcess( GetCurrentProcess(), STATUS_NO_MEMORY );
+ /* initialize hash table */
+ for (i = 0; i < HASH_MAP_SIZE; i++)
+ InitializeListHead( &hash_table[i] );
+
init_user_process_params();
load_global_options();
version_init();
--
2.45.2

View File

@@ -1,34 +0,0 @@
From ddd05cd2289136f417a8de210aef68a076da8399 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Michael=20M=C3=BCller?= <michael@fds-team.de>
Date: Mon, 3 Apr 2017 05:56:19 +0200
Subject: [PATCH] ntdll: Use HashLinks when searching for a dll using the
basename.
---
dlls/ntdll/loader.c | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/dlls/ntdll/loader.c b/dlls/ntdll/loader.c
index 3e275e8c409..7f4aa8eba06 100644
--- a/dlls/ntdll/loader.c
+++ b/dlls/ntdll/loader.c
@@ -543,13 +543,13 @@ static WINE_MODREF *find_basename_module( LPCWSTR name )
if (cached_modref && RtlEqualUnicodeString( &name_str, &cached_modref->ldr.BaseDllName, TRUE ))
return cached_modref;
- mark = &NtCurrentTeb()->Peb->LdrData->InLoadOrderModuleList;
+ mark = &hash_table[hash_basename(name)];
for (entry = mark->Flink; entry != mark; entry = entry->Flink)
{
- WINE_MODREF *mod = CONTAINING_RECORD(entry, WINE_MODREF, ldr.InLoadOrderLinks);
+ WINE_MODREF *mod = CONTAINING_RECORD(entry, WINE_MODREF, ldr.HashLinks);
if (RtlEqualUnicodeString( &name_str, &mod->ldr.BaseDllName, TRUE ) && !mod->system)
{
- cached_modref = CONTAINING_RECORD(mod, WINE_MODREF, ldr);
+ cached_modref = CONTAINING_RECORD(&mod->ldr, WINE_MODREF, ldr);
return cached_modref;
}
}
--
2.35.1

View File

@@ -1 +0,0 @@
Fixes: Implement and use hash links when looking up LDR module

View File

@@ -1,4 +1,4 @@
From 43ca4e4a3c633d405b3d282badb028c4250f942d Mon Sep 17 00:00:00 2001
From e93243e7863c239a1e4b2d91cb12dcd2cb373b36 Mon Sep 17 00:00:00 2001
From: Sebastian Lackner <sebastian@fds-team.de>
Date: Sat, 30 May 2015 02:23:15 +0200
Subject: [PATCH] ntdll: Add support for hiding wine version information from
@@ -10,10 +10,10 @@ Subject: [PATCH] ntdll: Add support for hiding wine version information from
2 files changed, 103 insertions(+), 1 deletion(-)
diff --git a/dlls/ntdll/loader.c b/dlls/ntdll/loader.c
index fbad84d2c36..5afeb0f63b0 100644
index 9dcb475c148..9e61c38d773 100644
--- a/dlls/ntdll/loader.c
+++ b/dlls/ntdll/loader.c
@@ -87,6 +87,9 @@ const WCHAR system_dir[] = L"C:\\windows\\system32\\";
@@ -88,6 +88,9 @@ const WCHAR system_dir[] = L"C:\\windows\\system32\\";
/* system search path */
static const WCHAR system_path[] = L"C:\\windows\\system32;C:\\windows\\system;C:\\windows";
@@ -23,7 +23,7 @@ index fbad84d2c36..5afeb0f63b0 100644
static BOOL is_prefix_bootstrap; /* are we bootstrapping the prefix? */
static BOOL imports_fixup_done = FALSE; /* set once the imports have been fixed up, before attaching them */
static BOOL process_detaching = FALSE; /* set on process detach to avoid deadlocks with thread detach */
@@ -106,6 +109,8 @@ struct dll_dir_entry
@@ -107,6 +110,8 @@ struct dll_dir_entry
static struct list dll_dir_list = LIST_INIT( dll_dir_list ); /* extra dirs from LdrAddDllDirectory */
@@ -32,7 +32,7 @@ index fbad84d2c36..5afeb0f63b0 100644
struct ldr_notification
{
struct list entry;
@@ -2030,6 +2035,96 @@ NTSTATUS WINAPI LdrUnlockLoaderLock( ULONG flags, ULONG_PTR magic )
@@ -2022,6 +2027,96 @@ NTSTATUS WINAPI LdrUnlockLoaderLock( ULONG flags, ULONG_PTR magic )
}
@@ -129,7 +129,7 @@ index fbad84d2c36..5afeb0f63b0 100644
/******************************************************************
* LdrGetProcedureAddress (NTDLL.@)
*/
@@ -2050,7 +2145,7 @@ NTSTATUS WINAPI LdrGetProcedureAddress(HMODULE module, const ANSI_STRING *name,
@@ -2042,7 +2137,7 @@ NTSTATUS WINAPI LdrGetProcedureAddress(HMODULE module, const ANSI_STRING *name,
{
void *proc = name ? find_named_export( module, exports, exp_size, name->Buffer, -1, NULL )
: find_ordinal_export( module, exports, exp_size, ord - exports->Base, NULL );
@@ -138,7 +138,7 @@ index fbad84d2c36..5afeb0f63b0 100644
{
*address = proc;
ret = STATUS_SUCCESS;
@@ -2311,6 +2406,8 @@ static void build_ntdll_module(void)
@@ -2304,6 +2399,8 @@ static void build_ntdll_module(void)
wm->ldr.Flags &= ~LDR_DONT_RESOLVE_REFS;
node_ntdll = wm->ldr.DdagNode;
if (TRACE_ON(relay)) RELAY_SetupDLL( module );
@@ -148,12 +148,12 @@ index fbad84d2c36..5afeb0f63b0 100644
diff --git a/dlls/ntdll/ntdll_misc.h b/dlls/ntdll/ntdll_misc.h
index cffe27d847c..d3c4a9cae68 100644
index fb5fb311646..a342cbf7d26 100644
--- a/dlls/ntdll/ntdll_misc.h
+++ b/dlls/ntdll/ntdll_misc.h
@@ -145,6 +145,11 @@ static inline TEB64 *NtCurrentTeb64(void) { return NULL; }
static inline TEB64 *NtCurrentTeb64(void) { return (TEB64 *)NtCurrentTeb()->GdiBatchCount; }
#endif
@@ -117,6 +117,11 @@ static inline void *get_rva( HMODULE module, DWORD va )
return (void *)((char *)module + va);
}
+/* version */
+extern const char * CDECL wine_get_version(void);
@@ -164,5 +164,5 @@ index cffe27d847c..d3c4a9cae68 100644
static inline void ascii_to_unicode( WCHAR *dst, const char *src, size_t len )
{
--
2.43.0
2.45.2

View File

@@ -1,4 +1,4 @@
From bdbc1c90697424373a5248cf6c2bda589785bd37 Mon Sep 17 00:00:00 2001
From 7b9165576a8ba0e317c280c9bedd2137fb745149 Mon Sep 17 00:00:00 2001
From: "Erich E. Hoover" <erich.e.hoover@gmail.com>
Date: Thu, 16 Jan 2014 20:56:49 -0700
Subject: [PATCH] ntdll: Add support for creating reparse points.
@@ -13,12 +13,12 @@ Signed-off-by: Erich E. Hoover <erich.e.hoover@gmail.com>
5 files changed, 451 insertions(+), 19 deletions(-)
diff --git a/configure.ac b/configure.ac
index d380c66ff40..4314be5553c 100644
index 0368b661e61..eb7f8223b51 100644
--- a/configure.ac
+++ b/configure.ac
@@ -2078,6 +2078,8 @@ AC_CHECK_FUNCS(\
posix_fallocate \
@@ -2082,6 +2082,8 @@ AC_CHECK_FUNCS(\
prctl \
sched_getcpu \
sched_yield \
+ renameat \
+ renameat2 \
@@ -39,7 +39,7 @@ index 37bd6c86e31..f9a15d28ed2 100644
EXTRADLLFLAGS = -nodefaultlibs
i386_EXTRADLLFLAGS = -Wl,--image-base,0x7bc00000
diff --git a/dlls/ntdll/tests/file.c b/dlls/ntdll/tests/file.c
index 7d3618a3804..148b6058cee 100644
index 02bdf67796d..63b5ebcab54 100644
--- a/dlls/ntdll/tests/file.c
+++ b/dlls/ntdll/tests/file.c
@@ -38,6 +38,7 @@
@@ -50,7 +50,7 @@ index 7d3618a3804..148b6058cee 100644
#ifndef IO_COMPLETION_ALL_ACCESS
#define IO_COMPLETION_ALL_ACCESS 0x001F0003
@@ -5863,32 +5864,154 @@ static void test_mailslot_name(void)
@@ -5952,32 +5953,154 @@ static void test_mailslot_name(void)
CloseHandle( device );
}
@@ -221,8 +221,8 @@ index 7d3618a3804..148b6058cee 100644
+ RemoveDirectoryW(path);
}
START_TEST(file)
@@ -5969,6 +6092,6 @@ START_TEST(file)
static void test_set_io_completion_ex(void)
@@ -6117,6 +6240,6 @@ START_TEST(file)
test_ioctl();
test_query_ea();
test_flush_buffers_file();
@@ -231,7 +231,7 @@ index 7d3618a3804..148b6058cee 100644
+ test_mailslot_name();
}
diff --git a/dlls/ntdll/unix/file.c b/dlls/ntdll/unix/file.c
index ca95dd347eb..ac4de149455 100644
index 8bc69557057..00ac7377dd4 100644
--- a/dlls/ntdll/unix/file.c
+++ b/dlls/ntdll/unix/file.c
@@ -36,6 +36,8 @@
@@ -243,7 +243,7 @@ index ca95dd347eb..ac4de149455 100644
#include <limits.h>
#include <unistd.h>
#ifdef HAVE_MNTENT_H
@@ -124,6 +126,7 @@
@@ -121,6 +123,7 @@
#include "wine/list.h"
#include "wine/debug.h"
#include "unix_private.h"
@@ -251,7 +251,7 @@ index ca95dd347eb..ac4de149455 100644
WINE_DEFAULT_DEBUG_CHANNEL(file);
WINE_DECLARE_DEBUG_CHANNEL(winediag);
@@ -135,6 +138,12 @@ WINE_DECLARE_DEBUG_CHANNEL(winediag);
@@ -132,6 +135,12 @@ WINE_DECLARE_DEBUG_CHANNEL(winediag);
#undef EXT2_IOC_GETFLAGS
#undef EXT4_CASEFOLD_FL
@@ -264,7 +264,7 @@ index ca95dd347eb..ac4de149455 100644
#ifdef linux
/* We want the real kernel dirent structure, not the libc one */
@@ -246,6 +255,95 @@ static const BOOL is_case_sensitive = FALSE;
@@ -243,6 +252,95 @@ static const BOOL is_case_sensitive = FALSE;
static pthread_mutex_t dir_mutex = PTHREAD_MUTEX_INITIALIZER;
static pthread_mutex_t mnt_mutex = PTHREAD_MUTEX_INITIALIZER;
@@ -360,7 +360,7 @@ index ca95dd347eb..ac4de149455 100644
/* check if a given Unicode char is OK in a DOS short name */
static inline BOOL is_invalid_dos_char( WCHAR ch )
{
@@ -1644,6 +1742,28 @@ static int parse_samba_dos_attrib_data( char *data, int len )
@@ -1641,6 +1739,28 @@ static int parse_samba_dos_attrib_data( char *data, int len )
}
@@ -389,7 +389,7 @@ index ca95dd347eb..ac4de149455 100644
static BOOL fd_is_mount_point( int fd, const struct stat *st )
{
struct stat parent;
@@ -3418,6 +3538,181 @@ done:
@@ -3416,6 +3536,181 @@ done:
}
@@ -571,7 +571,7 @@ index ca95dd347eb..ac4de149455 100644
/******************************************************************************
* lookup_unix_name
*
@@ -6249,6 +6544,13 @@ NTSTATUS WINAPI NtFsControlFile( HANDLE handle, HANDLE event, PIO_APC_ROUTINE ap
@@ -6246,6 +6541,13 @@ NTSTATUS WINAPI NtFsControlFile( HANDLE handle, HANDLE event, PIO_APC_ROUTINE ap
break;
}

View File

@@ -1,4 +1,4 @@
From c2236d2048faf1e01da3130fdb81688da6829d4a Mon Sep 17 00:00:00 2001
From 742f9b17c321b671e6b7bcd3bc7772e3ef66729d Mon Sep 17 00:00:00 2001
From: "Erich E. Hoover" <erich.e.hoover@gmail.com>
Date: Thu, 16 Jan 2014 21:02:11 -0700
Subject: [PATCH] server: Implement FILE_OPEN_REPARSE_POINT option.
@@ -10,7 +10,7 @@ Signed-off-by: Erich E. Hoover <erich.e.hoover@gmail.com>
2 files changed, 142 insertions(+), 7 deletions(-)
diff --git a/dlls/kernelbase/file.c b/dlls/kernelbase/file.c
index 1f13511fa7b..1c41e0011f3 100644
index 249f476eb7e..2ea3d81a264 100644
--- a/dlls/kernelbase/file.c
+++ b/dlls/kernelbase/file.c
@@ -769,6 +769,8 @@ static UINT get_nt_file_options( DWORD attributes )
@@ -23,7 +23,7 @@ index 1f13511fa7b..1c41e0011f3 100644
}
diff --git a/server/fd.c b/server/fd.c
index 04688c5eb0d..94b8bd088ed 100644
index c82ed49034e..cd4b35915d4 100644
--- a/server/fd.c
+++ b/server/fd.c
@@ -32,6 +32,7 @@
@@ -201,16 +201,7 @@ index 04688c5eb0d..94b8bd088ed 100644
if ((fd->unix_fd = open( name, rw_mode | (flags & ~O_TRUNC), *mode )) == -1)
{
/* if we tried to open a directory for write access, retry read-only */
@@ -1945,7 +2066,7 @@ struct fd *open_fd( struct fd *root, const char *name, struct unicode_str nt_nam
fd->unix_name = NULL;
if ((path = dup_fd_name( root, name )))
{
- fd->unix_name = realpath( path, NULL );
+ fd->unix_name = normalize_path( path, flags );
free( path );
}
@@ -1956,10 +2077,11 @@ struct fd *open_fd( struct fd *root, const char *name, struct unicode_str nt_nam
@@ -1947,10 +2068,11 @@ struct fd *open_fd( struct fd *root, const char *name, struct unicode_str nt_nam
*mode = st.st_mode;
/* only bother with an inode for normal files and directories */
@@ -223,7 +214,16 @@ index 04688c5eb0d..94b8bd088ed 100644
if (!inode)
{
@@ -1974,13 +2096,17 @@ struct fd *open_fd( struct fd *root, const char *name, struct unicode_str nt_nam
@@ -1962,7 +2084,7 @@ struct fd *open_fd( struct fd *root, const char *name, struct unicode_str nt_nam
if ((path = dup_fd_name( root, name )))
{
- fd->unix_name = realpath( path, NULL );
+ fd->unix_name = normalize_path( path, flags );
free( path );
}
@@ -1975,13 +2097,17 @@ struct fd *open_fd( struct fd *root, const char *name, struct unicode_str nt_nam
list_add_head( &inode->open, &fd->inode_entry );
closed_fd = NULL;
@@ -243,7 +243,7 @@ index 04688c5eb0d..94b8bd088ed 100644
{
set_error( STATUS_FILE_IS_A_DIRECTORY );
goto error;
@@ -2427,6 +2553,7 @@ static struct fd *get_handle_fd_obj( struct process *process, obj_handle_t handl
@@ -2428,6 +2554,7 @@ static struct fd *get_handle_fd_obj( struct process *process, obj_handle_t handl
static int is_dir_empty( int fd )
{
@@ -251,7 +251,7 @@ index 04688c5eb0d..94b8bd088ed 100644
DIR *dir;
int empty;
struct dirent *de;
@@ -2434,8 +2561,13 @@ static int is_dir_empty( int fd )
@@ -2435,8 +2562,13 @@ static int is_dir_empty( int fd )
if ((fd = dup( fd )) == -1)
return -1;
@@ -266,7 +266,7 @@ index 04688c5eb0d..94b8bd088ed 100644
close( fd );
return -1;
}
@@ -2447,6 +2579,7 @@ static int is_dir_empty( int fd )
@@ -2448,6 +2580,7 @@ static int is_dir_empty( int fd )
empty = 0;
}
closedir( dir );
@@ -274,7 +274,7 @@ index 04688c5eb0d..94b8bd088ed 100644
return empty;
}
@@ -2485,7 +2618,7 @@ static void set_fd_disposition( struct fd *fd, unsigned int flags )
@@ -2486,7 +2619,7 @@ static void set_fd_disposition( struct fd *fd, unsigned int flags )
file_set_error();
return;
}

Some files were not shown because too many files have changed in this diff Show More