Compare commits
1547 commits
wine-9.0-r
...
master
Author | SHA1 | Date | |
---|---|---|---|
|
4f8958eb56 | ||
|
66bec19434 | ||
|
4d8ee6bb18 | ||
|
896b4f05ea | ||
|
7cd0f395ca | ||
|
f38a32e64c | ||
|
51b675ef7f | ||
|
43ce2bf5da | ||
|
aa2aa2033c | ||
|
593dcb1b5c | ||
|
43fb0ecd07 | ||
|
7f60584a90 | ||
|
b868d82391 | ||
|
29c0826e6d | ||
|
8568848ba8 | ||
|
87ebccc37d | ||
|
5a8bb41cad | ||
|
c9b72d2d2f | ||
|
437eb42ad2 | ||
|
b9d2885148 | ||
|
6f6ef6cd04 | ||
|
48d68e0c50 | ||
|
8bac669056 | ||
|
2d801c46c7 | ||
|
a2c20d0e93 | ||
|
6ea3bc56ec | ||
|
9b4e3718ed | ||
|
4e04b2d528 | ||
|
d7cf25dcd4 | ||
|
3668a46675 | ||
|
850660ada0 | ||
|
36a4e5c9bb | ||
|
69b049d1b6 | ||
|
a875c18552 | ||
|
c7da2450c9 | ||
|
5db24dbb32 | ||
|
e4e0ce2bc6 | ||
|
1194995050 | ||
|
c635a25f21 | ||
|
fecfb44240 | ||
|
00a0c97879 | ||
|
c6e328c2d0 | ||
|
2546468b4c | ||
|
dd68561c4a | ||
|
53bb4117ac | ||
|
7ff6c6316e | ||
|
e01cb2b915 | ||
|
351d36b0da | ||
|
ac49899e32 | ||
|
f2f453c454 | ||
|
617b29c402 | ||
|
abcbd85b7c | ||
|
d86627a27a | ||
|
7a529fc94f | ||
|
60059bf744 | ||
|
8f58b9e1e1 | ||
|
35cb600c43 | ||
|
5e1da85068 | ||
|
69849bd2ee | ||
|
4573910acc | ||
|
dc9229e6fa | ||
|
3686a04cdd | ||
|
3f5d18b3b6 | ||
|
eb38f7418a | ||
|
47e4907c0d | ||
|
568e90ad11 | ||
|
054a95a817 | ||
|
8b7ac24752 | ||
|
9d95bd5f4b | ||
|
6fe8e64c1a | ||
|
aa8487a4b3 | ||
|
9492a10f44 | ||
|
2e088045b5 | ||
|
4e81f66127 | ||
|
5a7ff3b45c | ||
|
b9eb9a7453 | ||
|
2799c95dd2 | ||
|
ce2ae79f9d | ||
|
1304bf7fb9 | ||
|
d950e1b61f | ||
|
ef58b8c770 | ||
|
37d71415ed | ||
|
58c680bace | ||
|
4e13c72f70 | ||
|
ddff863355 | ||
|
bb47eb9f72 | ||
|
29c73ee173 | ||
|
3dea242677 | ||
|
a9d77d0989 | ||
|
25e0a25807 | ||
|
6bc2c09232 | ||
|
a10da8a42a | ||
|
7ae23ad775 | ||
|
cf08bbaa0f | ||
|
24e9fcac08 | ||
|
47f94fcf5f | ||
|
8dec8cc96c | ||
|
de89f77727 | ||
|
283d4bab22 | ||
|
2bcc87b303 | ||
|
b1cca5b52a | ||
|
d304e58789 | ||
|
c5f0039223 | ||
|
1f589f6304 | ||
|
da2c20a2e6 | ||
|
624e87a725 | ||
|
df97793045 | ||
|
967f3a5074 | ||
|
5ce5dc1f1e | ||
|
7c5b9304a6 | ||
|
81e8513ef2 | ||
|
2745228b14 | ||
|
e1606d698f | ||
|
19b7f33a6e | ||
|
91f3d8b0be | ||
|
0b0259c476 | ||
|
26876b4a6e | ||
|
c11f9a8bc9 | ||
|
a75dde2c1f | ||
|
9ee2adba14 | ||
|
28873ce8c4 | ||
|
1ddaa1d385 | ||
|
737e4411d9 | ||
|
be62646098 | ||
|
a71223eed9 | ||
|
84d5614b11 | ||
|
117fefa274 | ||
|
567b31d7f3 | ||
|
d91f16a24a | ||
|
b053e924e8 | ||
|
a84517418e | ||
|
8405fe85d4 | ||
|
994021da99 | ||
|
1604d8a202 | ||
|
f1dca8914c | ||
|
5d8e8804d4 | ||
|
a63af560dd | ||
|
d0e37372cf | ||
|
c38df594f5 | ||
|
3b12583db0 | ||
|
6ce8a31b0b | ||
|
67153fa0c3 | ||
|
4b0b489f6f | ||
|
a7ad588ec5 | ||
|
70d11a59c6 | ||
|
97e584b695 | ||
|
2e46d81c64 | ||
|
8a65cdd13d | ||
|
5d91ab65fa | ||
|
b13477deb4 | ||
|
cc62cdc1fd | ||
|
98bd248778 | ||
|
cdc842f60d | ||
|
d7aaf51459 | ||
|
753875e80b | ||
|
d09501691e | ||
|
d2c0efe163 | ||
|
e317eafe8f | ||
|
f67b4f6bf4 | ||
|
552cec9477 | ||
|
1e053810f3 | ||
|
a4fb357c89 | ||
|
689868cd50 | ||
|
45d4aa9f60 | ||
|
9ee0720d98 | ||
|
3593ce002f | ||
|
2734b266de | ||
|
0bffa32226 | ||
|
85d029e3b0 | ||
|
1bc7db2e7d | ||
|
a1d0e21b0a | ||
|
f59947bc10 | ||
|
5426e597bb | ||
|
520b7c6d83 | ||
|
c6fa51a949 | ||
|
ae70b66dce | ||
|
7c7e55892e | ||
|
8ae8063743 | ||
|
a4ef56e1d9 | ||
|
0b472874af | ||
|
290dd95dd4 | ||
|
423ba9cb23 | ||
|
9f3f61283d | ||
|
a78cea20d1 | ||
|
25ffa32beb | ||
|
3719aed1f9 | ||
|
86557b9e0b | ||
|
525ef1bf77 | ||
|
668c959f5a | ||
|
442ef40665 | ||
|
4c40aeb90b | ||
|
e428afe4ae | ||
|
69f8118883 | ||
|
2fd582e165 | ||
|
fa7c837f91 | ||
|
de265dfa0b | ||
|
8b41c2cfdd | ||
|
ebfe2653ea | ||
|
d48e250835 | ||
|
eac5ad2a26 | ||
|
899abeafe4 | ||
|
a712d7ec87 | ||
|
fe0c129e0b | ||
|
b1d7c03514 | ||
|
75a5263c60 | ||
|
7598556b64 | ||
|
4fdb45f23f | ||
|
b4a5775ffb | ||
|
19627b13e4 | ||
|
1bb011f815 | ||
|
2c22295233 | ||
|
d70dd61030 | ||
|
5cf558935d | ||
|
9e639ff1f6 | ||
|
b37d3f232b | ||
|
4da091eddd | ||
|
fc97535ccb | ||
|
76abdf3403 | ||
|
5a34601606 | ||
|
aa385765a1 | ||
|
578d104cf6 | ||
|
c94c464920 | ||
|
d0c996b2b4 | ||
|
66ea15f13a | ||
|
08cafe23d5 | ||
|
6413303e60 | ||
|
30140b7d7e | ||
|
bd5ab1c6cd | ||
|
552cc456d1 | ||
|
4d56a33ab0 | ||
|
9d3e458c55 | ||
|
e63da6ea68 | ||
|
7a25bd885e | ||
|
819d8692c6 | ||
|
6b9c1682b1 | ||
|
aabf6334f3 | ||
|
ca95533e8a | ||
|
8dd24ad2a4 | ||
|
d307cfede9 | ||
|
4319ada736 | ||
|
e497f0e88d | ||
|
2692cd8b04 | ||
|
498b632899 | ||
|
b16b366327 | ||
|
f166b298ec | ||
|
47be32f3d1 | ||
|
d6ac41a9f4 | ||
|
793e4640e4 | ||
|
6505403e58 | ||
|
1600f2e6bd | ||
|
72fd6e9251 | ||
|
08f46b8de0 | ||
|
98b7095a21 | ||
|
ce41edab3f | ||
|
e368515eef | ||
|
d282208ac3 | ||
|
a4ad64dda3 | ||
|
65864f92f2 | ||
|
c814cf0d35 | ||
|
81ed2e5465 | ||
|
04981ad759 | ||
|
aaeb221f52 | ||
|
bda48ed85e | ||
|
3b39027655 | ||
|
5ef47e916a | ||
|
5bde3f4c97 | ||
|
8b3944e134 | ||
|
9115dc0aba | ||
|
95b0e65b07 | ||
|
90ee219c44 | ||
|
c4ab638083 | ||
|
63ff75cf12 | ||
|
8d933bf187 | ||
|
2f094cbfe6 | ||
|
a5a0bc10f9 | ||
|
e91243a94e | ||
|
866cb1ca63 | ||
|
30e5111dd5 | ||
|
2c325f8bd3 | ||
|
fcce392066 | ||
|
ee3b9be8e2 | ||
|
fedcd4bb0e | ||
|
3944b36b98 | ||
|
898892d5f0 | ||
|
14743b0ffb | ||
|
7f10145a91 | ||
|
f799bf025b | ||
|
56193155a0 | ||
|
da22ef6c0d | ||
|
b59619d2e4 | ||
|
b4e4921cb6 | ||
|
d77d36b1f4 | ||
|
e6a8fc2448 | ||
|
caf9585c3c | ||
|
3bcd6f1aab | ||
|
737e9d7ffc | ||
|
866907ee3d | ||
|
180bd1044b | ||
|
92d20c1120 | ||
|
3036dddca4 | ||
|
97f07ae211 | ||
|
f6a1844dbe | ||
|
6e619d98a3 | ||
|
8e77d28165 | ||
|
a81bcbe0a9 | ||
|
fc18e54e63 | ||
|
c1f5f98f79 | ||
|
148db6a6c5 | ||
|
4edfe426e4 | ||
|
50a1c5bc92 | ||
|
0d616f9eb0 | ||
|
504d0caae5 | ||
|
3316f59041 | ||
|
9620340b6b | ||
|
abac4b879e | ||
|
5f76872e17 | ||
|
065cbb460b | ||
|
ac32f0a81d | ||
|
3042c7100c | ||
|
929732034c | ||
|
00a541d6a0 | ||
|
7299d3728a | ||
|
8c1f96f7ab | ||
|
c47d6ef1f7 | ||
|
7b5267cf63 | ||
|
83949ee269 | ||
|
174bb7776d | ||
|
e2b1de523e | ||
|
1482e2f960 | ||
|
7c7702f91d | ||
|
2c8d4f5abd | ||
|
e42afe7daf | ||
|
f42316c86d | ||
|
74d1dbb95a | ||
|
5286ed3b0a | ||
|
ffade87df1 | ||
|
99aee076e5 | ||
|
fd865a8386 | ||
|
66f940a2ec | ||
|
084c8cc9c0 | ||
|
354ddcb382 | ||
|
bbdc50c532 | ||
|
39bd338a62 | ||
|
91207991f2 | ||
|
8b7d1a65d0 | ||
|
4ec559743d | ||
|
a9b3fdd3ae | ||
|
40afa8d937 | ||
|
a44681e19b | ||
|
d01ae1512f | ||
|
e21244f7a3 | ||
|
4860fbe7b5 | ||
|
5851ba8686 | ||
|
3af1e7df21 | ||
|
a5b8e68422 | ||
|
81111326ff | ||
|
b527b232cf | ||
|
befd7abe10 | ||
|
af2c686628 | ||
|
f2e6fc695a | ||
|
94f5cd1d30 | ||
|
d71fb7229f | ||
|
834a88fc3f | ||
|
38fb2f41ad | ||
|
2bf209bb4f | ||
|
3418bf6ccd | ||
|
6184f74ef5 | ||
|
3938478aab | ||
|
37ded7380e | ||
|
f127448d00 | ||
|
6d8b4e661f | ||
|
2ab736e292 | ||
|
47e9980bb1 | ||
|
14f69583aa | ||
|
1719aef8cb | ||
|
28c52d4ac3 | ||
|
818d9a1210 | ||
|
d47b13c45a | ||
|
c51c257b06 | ||
|
d538432d79 | ||
|
1d168222fd | ||
|
5c26513278 | ||
|
4a026f4230 | ||
|
fd5b56b96d | ||
|
8dc2cc24d7 | ||
|
e92ba2de43 | ||
|
897bcd5d5c | ||
|
95a91bd816 | ||
|
3103adb6a6 | ||
|
4860be4747 | ||
|
934cfb86b5 | ||
|
d30dafa14d | ||
|
84cb31556a | ||
|
5152e73779 | ||
|
3fd83279c0 | ||
|
8857df969c | ||
|
ec66697005 | ||
|
b1a61e74a3 | ||
|
a0c390de8d | ||
|
ec44170322 | ||
|
a1381fbedb | ||
|
7ff4e5672d | ||
|
20b50c0096 | ||
|
b5cd4c471a | ||
|
d094bde414 | ||
|
6ab88cafaa | ||
|
61f9f5a05f | ||
|
51a0aaeff4 | ||
|
1496ce1614 | ||
|
ec2db2ff75 | ||
|
a30a617212 | ||
|
73a6f764d0 | ||
|
eef4a25d0c | ||
|
0d8bdf392f | ||
|
c8d2955cdc | ||
|
c67726b3d0 | ||
|
788ba75432 | ||
|
955ddc6ea6 | ||
|
c179b269ab | ||
|
e5afb283cf | ||
|
a415874f59 | ||
|
0c35d5cc29 | ||
|
a277ab8e42 | ||
|
1c95001f8f | ||
|
27b22fedde | ||
|
1edd53f00f | ||
|
e1d624a06f | ||
|
8ec8a7f11c | ||
|
7a156cbd7f | ||
|
542e11fcd9 | ||
|
83476e3d4a | ||
|
4f80a599b6 | ||
|
d6d22677da | ||
|
0e3dba2a7a | ||
|
d05b7c8e19 | ||
|
28b94c4d42 | ||
|
5ff94358a0 | ||
|
1df0e34293 | ||
|
24ad74ee26 | ||
|
40b65e28a7 | ||
|
d8b8ac85eb | ||
|
5b833c83be | ||
|
4bba16fd18 | ||
|
aed0c822f1 | ||
|
075a0e2623 | ||
|
e8f7660c75 | ||
|
e7ccb1480a | ||
|
825ec8c597 | ||
|
d47220a23c | ||
|
e5d995d826 | ||
|
ea522c6135 | ||
|
aaaac72fdb | ||
|
c0d0468da9 | ||
|
0f1322d2df | ||
|
e7ff2688c8 | ||
|
ff0cd457b4 | ||
|
732ed62819 | ||
|
f8ddba3ad0 | ||
|
4f02c8ba2d | ||
|
0344f3aa85 | ||
|
b6128bbb51 | ||
|
e614610aaf | ||
|
6b8b35f950 | ||
|
3909a93bc2 | ||
|
eaed90d9b4 | ||
|
20a09a3071 | ||
|
ab5d9bb67b | ||
|
8fcc3c4efe | ||
|
910bd392f6 | ||
|
5bb80251b1 | ||
|
ec2e266c76 | ||
|
e6ce5d5df7 | ||
|
daea0b9b57 | ||
|
5eb46419b4 | ||
|
0a9ad614e6 | ||
|
37bb8c14e0 | ||
|
91e5d21cdf | ||
|
2fc073591b | ||
|
6fa1458378 | ||
|
c3840b6c49 | ||
|
115d690731 | ||
|
1c03b29f7b | ||
|
e65679f455 | ||
|
8f2586cfb5 | ||
|
aa78b46e9c | ||
|
c9ffab4602 | ||
|
61d1c18957 | ||
|
48f8db6c30 | ||
|
13f908b9b5 | ||
|
bb5f0e122f | ||
|
66baee8b99 | ||
|
ad921b3c56 | ||
|
f824a72c7f | ||
|
feee77f84d | ||
|
f014745676 | ||
|
ec099b8ea3 | ||
|
a9428fe390 | ||
|
5f890e3ce9 | ||
|
d6285af1fc | ||
|
8d8c10fe92 | ||
|
5c98412929 | ||
|
6f55a13169 | ||
|
c1b8db0c28 | ||
|
1648569fad | ||
|
0ca1350a03 | ||
|
a56b018713 | ||
|
2abbee9540 | ||
|
058bfeed1d | ||
|
d2045611b6 | ||
|
8dc5242e29 | ||
|
26136fda8d | ||
|
6d2a900487 | ||
|
eb06945b5b | ||
|
2c9f67938f | ||
|
af7f11bb2a | ||
|
5744ef64a4 | ||
|
c4b38894cd | ||
|
48bcf74678 | ||
|
35f5997075 | ||
|
0bc47920d3 | ||
|
08219c02b3 | ||
|
366398cc53 | ||
|
b381f9d095 | ||
|
8cc22a60c3 | ||
|
ec6879b78e | ||
|
90f31fbd0a | ||
|
43220a6063 | ||
|
7c384f361a | ||
|
bf800b5e76 | ||
|
7865026f53 | ||
|
f3bab6c5b7 | ||
|
c5f9d9188a | ||
|
4a227c62a5 | ||
|
d7bbe884ef | ||
|
9725a2286a | ||
|
674efeb1f7 | ||
|
0c35e9adce | ||
|
42cebcca3c | ||
|
a9671befc1 | ||
|
40bda46795 | ||
|
077252f13b | ||
|
0fb7c99c33 | ||
|
93bc97e54f | ||
|
55f71fd846 | ||
|
3ca8204837 | ||
|
02b68a0ac1 | ||
|
6e1e52cbc3 | ||
|
e02b3379eb | ||
|
a7d3d574c0 | ||
|
7c387c0b0e | ||
|
cfab11e16a | ||
|
f0fc4a0d89 | ||
|
1b1f216278 | ||
|
6a3f067eca | ||
|
9e79b9ffd9 | ||
|
440edde5e1 | ||
|
ea4b9bafb2 | ||
|
d6c9ac94d2 | ||
|
48cb5297e7 | ||
|
ba3799527c | ||
|
7325dd4a5a | ||
|
f9dd0fca4c | ||
|
577c327a44 | ||
|
f35e2d513d | ||
|
462b27d87f | ||
|
ca5984059c | ||
|
9ac8d63e22 | ||
|
630d79439c | ||
|
a3adb19bef | ||
|
e3e628247d | ||
|
0dd1502f57 | ||
|
77f4d2207a | ||
|
6f122f48d3 | ||
|
684d51cebb | ||
|
2b25f51e0d | ||
|
f3d3b86668 | ||
|
f4a91bcb8a | ||
|
e5085327ff | ||
|
1d3b312f22 | ||
|
ce2457d5a9 | ||
|
c064fdeb8d | ||
|
ee5828da6a | ||
|
b466a40ffb | ||
|
497992c4ea | ||
|
1999e4f3f5 | ||
|
d8e0c8adea | ||
|
64914849ac | ||
|
84e4620706 | ||
|
7995f3813c | ||
|
f380e34a5e | ||
|
2dcc8ec08d | ||
|
8c5b08d81c | ||
|
beececd101 | ||
|
820b5ff0d1 | ||
|
9d9c3960ef | ||
|
c2ee8627ff | ||
|
227408c4fc | ||
|
e564b0d775 | ||
|
c67053bcce | ||
|
64b2e44697 | ||
|
b0a7439b30 | ||
|
18543523e8 | ||
|
8605708e02 | ||
|
3282eda525 | ||
|
8739aef4ff | ||
|
35ef1be8ef | ||
|
9c5df8004d | ||
|
0698f732af | ||
|
97259a3049 | ||
|
7a66313cfb | ||
|
57c2c41d75 | ||
|
74ff9f2371 | ||
|
34a8478da8 | ||
|
54980a7868 | ||
|
277acf61d0 | ||
|
6cbe072c37 | ||
|
61983465aa | ||
|
d6f13d8e0c | ||
|
da84d77353 | ||
|
29f73d6669 | ||
|
05347b9703 | ||
|
aebcb1a996 | ||
|
09c6f48b12 | ||
|
8e0a00db04 | ||
|
72c228a3ab | ||
|
1ee1f2e9d7 | ||
|
ebaa47dcee | ||
|
3de0f99d4e | ||
|
9478e1f74c | ||
|
6a153ac33e | ||
|
31e3c4316d | ||
|
9591a36ee8 | ||
|
c43b1ecbc3 | ||
|
f7303cf7b6 | ||
|
496eed7aaf | ||
|
a1d63d109d | ||
|
c77261dd5c | ||
|
d287548c77 | ||
|
c2a4f3810b | ||
|
e1e0db6ebe | ||
|
ea552a6f39 | ||
|
4b9e76914a | ||
|
c34159db39 | ||
|
f5ba517323 | ||
|
c837cb3e77 | ||
|
ed8b7b5e2a | ||
|
a02d35d386 | ||
|
bca7038692 | ||
|
beec1b57fb | ||
|
efd3d31082 | ||
|
ba1e2d5dda | ||
|
631a43c577 | ||
|
8e26b7e007 | ||
|
58e68a1b8a | ||
|
89336772f8 | ||
|
259b92d13e | ||
|
4e25c07689 | ||
|
8351a45cb2 | ||
|
c77d2e8a97 | ||
|
f541d947bb | ||
|
21bdc585f3 | ||
|
9ccfac44d5 | ||
|
cbcf609108 | ||
|
d96754213c | ||
|
777a9d0f51 | ||
|
667eca5c0c | ||
|
1662fa9ab1 | ||
|
fe4f138292 | ||
|
a542400d15 | ||
|
2a5acd3dda | ||
|
ef6e9a6bb4 | ||
|
3d6c33f450 | ||
|
0e0ee3e21b | ||
|
3153441f14 | ||
|
3db38ea7f4 | ||
|
6ec977aa00 | ||
|
b9a2ff2558 | ||
|
131918e4c2 | ||
|
f4a3f573c2 | ||
|
03e3bd947f | ||
|
0d51cce2fb | ||
|
4cc9ee7e67 | ||
|
d2df3c2c21 | ||
|
635e0566a3 | ||
|
fbd6b2583d | ||
|
ee06925319 | ||
|
9897719562 | ||
|
2aee2990c0 | ||
|
0abbb467af | ||
|
79b9b60914 | ||
|
0c59e8622b | ||
|
f7c665fd6e | ||
|
c37fea89e6 | ||
|
0d0d37bbea | ||
|
f2c92c68a2 | ||
|
8a8d1dedcf | ||
|
1b32ac45f8 | ||
|
9015eebf87 | ||
|
ce6e298a68 | ||
|
74bf784b29 | ||
|
c55f5d87db | ||
|
4e49c37028 | ||
|
fae3b7a90f | ||
|
27e70ba8ec | ||
|
7c2f6be10e | ||
|
2e6651cb36 | ||
|
af64a8bb5c | ||
|
0c0d181551 | ||
|
71a2e64aee | ||
|
23218818ac | ||
|
232b18d820 | ||
|
7a92a33b27 | ||
|
2778e45421 | ||
|
654c03d131 | ||
|
18b0473fe9 | ||
|
9f555cde20 | ||
|
852e2ffc13 | ||
|
f7bff8802f | ||
|
8a98408056 | ||
|
64ced5a345 | ||
|
73685eb080 | ||
|
5613917974 | ||
|
8710a1cb0a | ||
|
813b35c9d1 | ||
|
c65ac223a0 | ||
|
2e9a57a0b8 | ||
|
d0eea21735 | ||
|
b541b9661a | ||
|
9a1362695b | ||
|
0d969b1764 | ||
|
8ba1b27f23 | ||
|
e24cf32f81 | ||
|
437d304c72 | ||
|
ae584ac620 | ||
|
e1b21bf1e9 | ||
|
9a591bf4fe | ||
|
39e5926760 | ||
|
6fda28d030 | ||
|
c63a990091 | ||
|
8268d4e017 | ||
|
a485f6b4a3 | ||
|
2497a53484 | ||
|
8bd411da0a | ||
|
61564202b5 | ||
|
2e63272f2f | ||
|
9c1bc32fe9 | ||
|
a3686eeb5e | ||
|
76326ed369 | ||
|
f7788fc7e7 | ||
|
db391c37a9 | ||
|
e4ff578bcc | ||
|
e628eb2c6f | ||
|
340a4b05b5 | ||
|
6ec9f446eb | ||
|
f0ab43fea2 | ||
|
fbe99509d6 | ||
|
af4838321e | ||
|
fe4f7632a7 | ||
|
fb5302c29b | ||
|
188d880493 | ||
|
386dbe1059 | ||
|
9a614fefaf | ||
|
088da327b5 | ||
|
0f7ef9f47a | ||
|
8faac9b94a | ||
|
6c1c917750 | ||
|
f0584966c2 | ||
|
ec5e33cad6 | ||
|
510fc64140 | ||
|
552bc893e1 | ||
|
dee3be21a3 | ||
|
c72f0ec0f0 | ||
|
9d044669f3 | ||
|
dd083a6195 | ||
|
58087358d1 | ||
|
62aec0318b | ||
|
0f8b59a245 | ||
|
4bbfd83898 | ||
|
5243f2e82c | ||
|
afac7d7e3f | ||
|
164520f593 | ||
|
9149c7e999 | ||
|
6ba603a03c | ||
|
431a483edc | ||
|
5e3cc88326 | ||
|
7c7b2e8e7e | ||
|
b3ec5bc7ea | ||
|
89e3be4ee9 | ||
|
1e34842799 | ||
|
1b0d8428df | ||
|
152580cefe | ||
|
f5e7abb428 | ||
|
4f61a8a1ab | ||
|
08803bd136 | ||
|
6a6263c8bd | ||
|
588db48be5 | ||
|
65109c725d | ||
|
989988a5ae | ||
|
063a377df4 | ||
|
d1eed1c702 | ||
|
6fd349c6e0 | ||
|
d9c4f506fd | ||
|
f27e4a4a29 | ||
|
e7364e2165 | ||
|
6599f2ff90 | ||
|
a6d77cfd06 | ||
|
5bf6af0c39 | ||
|
71f5bce785 | ||
|
86d82c7334 | ||
|
bb872831de | ||
|
923f1d1b10 | ||
|
c83f86bef5 | ||
|
32e56bd029 | ||
|
5a4d3bad17 | ||
|
6eab84685e | ||
|
8314812354 | ||
|
b049dad6fd | ||
|
a5ce5d637f | ||
|
62027a9c4d | ||
|
9aa7f27d82 | ||
|
b16110f17b | ||
|
7e0177e1e4 | ||
|
839fb09bf0 | ||
|
7914be3ca5 | ||
|
da62790584 | ||
|
f1454777a8 | ||
|
72b7866950 | ||
|
b15d0120cf | ||
|
041167b20a | ||
|
73a8c06804 | ||
|
1e5cc509a7 | ||
|
3881edf6f3 | ||
|
fa42210c49 | ||
|
6e9d214096 | ||
|
90103fa07e | ||
|
7c6a50cc46 | ||
|
1a4163b686 | ||
|
75fa35ad7f | ||
|
c20fc715e2 | ||
|
8946e6df7e | ||
|
dd6e8198e0 | ||
|
cbb343567a | ||
|
dfe2b717a6 | ||
|
7ae488a2bb | ||
|
1e0728c5d4 | ||
|
af4ef5fa02 | ||
|
14a290e77d | ||
|
f4ac9b35c2 | ||
|
931c1a6887 | ||
|
41d7baa013 | ||
|
9cc5ed1802 | ||
|
18bdd435f1 | ||
|
4e74e9dfa9 | ||
|
ee620f0277 | ||
|
a9c9d49a12 | ||
|
e8a2f816f0 | ||
|
3b59be59ae | ||
|
fabf45a9d8 | ||
|
17b9c45311 | ||
|
dfb1665b5f | ||
|
b64cc15d61 | ||
|
9880e29d69 | ||
|
c8a98e03c8 | ||
|
5efab11752 | ||
|
a97a4af0dd | ||
|
95e12689e6 | ||
|
c65d0a0770 | ||
|
139d624787 | ||
|
67bea281cc | ||
|
0efd48113e | ||
|
bbf222ca72 | ||
|
fac555fe68 | ||
|
707685642c | ||
|
9ea0a1072d | ||
|
7dcdfd7bf2 | ||
|
f54acf3de0 | ||
|
9119e3102b | ||
|
8a71a4a304 | ||
|
223292da02 | ||
|
800b5e44fc | ||
|
10db5b67b8 | ||
|
842461979c | ||
|
fddea5da01 | ||
|
231670e899 | ||
|
c62ca5fced | ||
|
e75d1b38b5 | ||
|
4d1ad4f975 | ||
|
55e4aa7a31 | ||
|
b74e1a570b | ||
|
2601a8a2f1 | ||
|
1abebca6dc | ||
|
a271fc9e19 | ||
|
7c4ca6ff74 | ||
|
17f94ab563 | ||
|
bbe1c7532a | ||
|
fb64ea8675 | ||
|
3f421410c1 | ||
|
3c9ede8abc | ||
|
1bc06138f4 | ||
|
f5ed0de392 | ||
|
6ee0583546 | ||
|
499c6be734 | ||
|
73f0bbc731 | ||
|
b8c75f3d2a | ||
|
1eb8f41e54 | ||
|
dee10199cc | ||
|
52f34cf976 | ||
|
455086e295 | ||
|
d93275c6ca | ||
|
4434c17c94 | ||
|
cb2013e7b4 | ||
|
3b85ab31a9 | ||
|
8602a1c24e | ||
|
a5a253820f | ||
|
d88f92eb4e | ||
|
683710fbc7 | ||
|
a05b67b7e5 | ||
|
0ed830eac5 | ||
|
8db5dec9d2 | ||
|
677107956f | ||
|
998111eca1 | ||
|
a38e05636d | ||
|
1bab7ea25e | ||
|
fb2ebbbb40 | ||
|
cd2570c28d | ||
|
ca97cb8700 | ||
|
2990a4f8c3 | ||
|
6e8d450804 | ||
|
6f2a0c412f | ||
|
261d7c3de4 | ||
|
59a7ee1a2c | ||
|
001d1a4319 | ||
|
b6c1760727 | ||
|
23f360b1db | ||
|
df9b41afcb | ||
|
a3ef7d7487 | ||
|
9809102897 | ||
|
f0b32fa541 | ||
|
834558245b | ||
|
5ffed8830c | ||
|
d34cbe61db | ||
|
f74f8b9ef3 | ||
|
5ca8e4b00d | ||
|
37aabda67e | ||
|
80a92c07f5 | ||
|
13d48ed315 | ||
|
ca29c3a422 | ||
|
a4ac824fe5 | ||
|
fc0c738f9d | ||
|
dc800b56b6 | ||
|
6ff5c3b500 | ||
|
8f278f89df | ||
|
0b3d3ad2b7 | ||
|
ab69f71912 | ||
|
02ebacca0c | ||
|
215a8e68d3 | ||
|
b9a985a677 | ||
|
0b441c4c8f | ||
|
e8f4909ac3 | ||
|
267a5658fb | ||
|
ceea01b165 | ||
|
ba4681e776 | ||
|
d68a9d1213 | ||
|
1454ffe7dd | ||
|
b549ae11fb | ||
|
bc62314811 | ||
|
8293074558 | ||
|
6360992dea | ||
|
e00270a8b2 | ||
|
aa2bd097d6 | ||
|
556e3349ab | ||
|
00f04ef3ce | ||
|
88c0f72bbf | ||
|
52b9f8a9fa | ||
|
233074ded0 | ||
|
35bea75647 | ||
|
4121a29b50 | ||
|
eba8b54870 | ||
|
c418771a43 | ||
|
d7edf3e651 | ||
|
1d479df4e8 | ||
|
666a472f06 | ||
|
17d8cb24d4 | ||
|
40b5e767d4 | ||
|
132da0e0ee | ||
|
5fe477767a | ||
|
1a53e28cc8 | ||
|
c17b0d6a3f | ||
|
df8d907fb4 | ||
|
de492f9a34 | ||
|
165830c317 | ||
|
51e99345de | ||
|
b7867059ce | ||
|
1a757a0146 | ||
|
b341688dbd | ||
|
e9e8ab1392 | ||
|
39d8b25938 | ||
|
b5c57b9a62 | ||
|
5e7a8f4db0 | ||
|
26498d93cf | ||
|
ca6f3a7af8 | ||
|
c45bedbf23 | ||
|
4e54087fab | ||
|
92f9c58e6d | ||
|
13b0f22cf9 | ||
|
7e2f44210b | ||
|
525835897b | ||
|
3bd1d1c60d | ||
|
87e5bdaa4a | ||
|
1664ad7d50 | ||
|
2eb8950392 | ||
|
9a0e244d51 | ||
|
8cb68e43de | ||
|
97d4c7fe3f | ||
|
51b6a0fe12 | ||
|
48440d2446 | ||
|
26e3d2eced | ||
|
c8bf3ba2da | ||
|
f86cca3897 | ||
|
c62ca2e1aa | ||
|
3c64448037 | ||
|
b37a16c7f3 | ||
|
f5daee4a2f | ||
|
5122f6ad9f | ||
|
cf7c48e036 | ||
|
1456b31eec | ||
|
de988eeea0 | ||
|
8c703f3e2f | ||
|
e05c6c8211 | ||
|
bd703632fd | ||
|
ce4636e510 | ||
|
f67279c57f | ||
|
332d48364f | ||
|
4efbcae5e8 | ||
|
0edcc9b1d6 | ||
|
36d6fe591b | ||
|
ef2830b620 | ||
|
dfaa45069e | ||
|
425c270d27 | ||
|
ed92095f28 | ||
|
c129595381 | ||
|
0d37cc1d06 | ||
|
4022fb9ba3 | ||
|
818b577727 | ||
|
b41566fb31 | ||
|
6b853a9354 | ||
|
9c82ce962b | ||
|
c1223d0be0 | ||
|
8173d3b0ab | ||
|
a00b30bfbf | ||
|
06482e324c | ||
|
fa145fd517 | ||
|
05a0da8ab9 | ||
|
ea890c4733 | ||
|
db03d2be88 | ||
|
16dafed08b | ||
|
3985b7c599 | ||
|
5da459f1f2 | ||
|
d66fe6206d | ||
|
988253a69b | ||
|
de5a07b20b | ||
|
37d909e007 | ||
|
4ed7bb35ed | ||
|
b5a252bcec | ||
|
4171fdf4d7 | ||
|
604bc7ccf9 | ||
|
5a12be3a9a | ||
|
4141a14443 | ||
|
9088506029 | ||
|
124ea59b8d | ||
|
c0bffa823d | ||
|
626b2f1898 | ||
|
1c7e1f1fc6 | ||
|
d68a0e650a | ||
|
da9210e038 | ||
|
23f98e9663 | ||
|
13b2755d4d | ||
|
3c19b29ce6 | ||
|
681d34d784 | ||
|
330d8cd998 | ||
|
ae0e5ee901 | ||
|
497e9d617e | ||
|
266ac9a809 | ||
|
69d4be9ff0 | ||
|
b9e4680dea | ||
|
22214ec357 | ||
|
7c7544aba1 | ||
|
e25b1ab7e9 | ||
|
bbce5d014d | ||
|
d6dc917232 | ||
|
2b01a64ff2 | ||
|
afacbe53ba | ||
|
7ab46f03b1 | ||
|
9eb644fa13 | ||
|
6979a9f059 | ||
|
98b8ab9b88 | ||
|
62955f2229 | ||
|
4f349d442a | ||
|
f39156ee6a | ||
|
ec759079a5 | ||
|
6dae92cfb9 | ||
|
e891073c9e | ||
|
0b4ad32c16 | ||
|
4a30ab299a | ||
|
7181ef4052 | ||
|
303717f45f | ||
|
e3c61ba74c | ||
|
e25d23d5dc | ||
|
5d7bf639e8 | ||
|
bd2b89806a | ||
|
a4d2e62a2f | ||
|
9e8a8b5246 | ||
|
da6e707850 | ||
|
aac0998262 | ||
|
294efcdf44 | ||
|
c3918f2a82 | ||
|
68ab4c4849 | ||
|
36fa4da337 | ||
|
9bca18e796 | ||
|
767fc14ef7 | ||
|
34128f1ae7 | ||
|
27003f8329 | ||
|
f8ee879002 | ||
|
50bfe00968 | ||
|
9c136a470c | ||
|
53faf7bda8 | ||
|
1cbff7c8d6 | ||
|
2f88259a44 | ||
|
f5c00e3870 | ||
|
d292c7ec74 | ||
|
b1ab51b508 | ||
|
a97b3f640c | ||
|
3825af6041 | ||
|
d352b852a9 | ||
|
4a16bcf9ab | ||
|
70469abc05 | ||
|
19eba8d991 | ||
|
844d4cd206 | ||
|
982c2ede7a | ||
|
62536d1645 | ||
|
53f81aa1dd | ||
|
e607da943a | ||
|
d8a075dc91 | ||
|
8b04d34583 | ||
|
8fe95d29d3 | ||
|
202e0b2953 | ||
|
9b8409fce4 | ||
|
e3af07501a | ||
|
2bbc4e17a5 | ||
|
b8326ad4de | ||
|
2e89cb4040 | ||
|
e935c242c3 | ||
|
b4fa0147e3 | ||
|
452b59bb4f | ||
|
8c91e484cb | ||
|
2de6cd5dc5 | ||
|
85e2072243 | ||
|
7c0ddacd3e | ||
|
beb75c50b0 | ||
|
69b6a92978 | ||
|
2a56d4e6e9 | ||
|
a24039ad09 | ||
|
e3431a02e1 | ||
|
94a7b32a55 | ||
|
ee1e15ac9d | ||
|
3b61019b8c | ||
|
ac36348179 | ||
|
02921e4900 | ||
|
268f3adce9 | ||
|
a128ad5c5b | ||
|
5a26d87bab | ||
|
87a21586a8 | ||
|
08f4705e44 | ||
|
d0e02b67eb | ||
|
982e323070 | ||
|
008f64557d | ||
|
91d60983ac | ||
|
e450bf42ab | ||
|
9373ec4c3c | ||
|
384d5bfde9 | ||
|
62000c28c9 | ||
|
a0624a7e18 | ||
|
370a339055 | ||
|
24c3ce6f81 | ||
|
6aca31f1a1 | ||
|
2d88c57716 | ||
|
d95d113230 | ||
|
2a185126ca | ||
|
0dab1ffdf9 | ||
|
56b1f80210 | ||
|
6e49ff99eb | ||
|
fdd9e257e2 | ||
|
779ba03bcd | ||
|
852c4d0a8a | ||
|
75b9c221b2 | ||
|
0db8c0184e | ||
|
1580c1133a | ||
|
9164cf8fd9 | ||
|
ccc3568567 | ||
|
a430702b41 | ||
|
90fb47489e | ||
|
ba6a6d5781 | ||
|
d1836e226c | ||
|
f704b80a26 | ||
|
658a0665d4 | ||
|
b87bd5e9b0 | ||
|
fe1f3e277d | ||
|
8169c4d040 | ||
|
7d1cfb9e01 | ||
|
1bdf94a409 | ||
|
b2441ad699 | ||
|
7aef55a996 | ||
|
2e9da0ba24 | ||
|
e5becbf6a8 | ||
|
c963c4141a | ||
|
34232874ad | ||
|
d219903c61 | ||
|
df70800b12 | ||
|
36597df656 | ||
|
dc15413585 | ||
|
775812ab11 | ||
|
5efd4b64f6 | ||
|
0ef730529a | ||
|
a586fd080d | ||
|
4d2d6666db | ||
|
68f8b53d69 | ||
|
c65703eac7 | ||
|
42c96b9c8f | ||
|
54217dab6d | ||
|
7663be90ff | ||
|
52a4d9e321 | ||
|
71201815bc | ||
|
c5e16d2090 | ||
|
3724385c86 | ||
|
11128e236f | ||
|
adf5f5fd30 | ||
|
32f5efcdb2 | ||
|
35c1cc6c81 | ||
|
81e9ae96f1 | ||
|
bd2a2c25f5 | ||
|
fd2534422b | ||
|
5529b00a44 | ||
|
ebb5bd64a0 | ||
|
1e79217fb0 | ||
|
6d8489a0bb | ||
|
eb5993a7c6 | ||
|
e5aafd9eed | ||
|
12141ad6c5 | ||
|
6361a20c52 | ||
|
b7f06a4a19 | ||
|
c2d683488e | ||
|
054678aad0 | ||
|
b5359b7da0 | ||
|
4fb14b5656 | ||
|
26e383c8df | ||
|
d6a6e1f186 | ||
|
91d7b084ba | ||
|
2765825c9e | ||
|
df0726e359 | ||
|
6d0fcf64d2 | ||
|
7a5e92124f | ||
|
014f020e34 | ||
|
6ba584d1e0 | ||
|
07d522426a | ||
|
2b3b900490 | ||
|
ab28825ace | ||
|
976e715b86 | ||
|
4e9838fbc2 | ||
|
57b8d4c019 | ||
|
e772113071 | ||
|
46c5c2d41a | ||
|
0d9e6adada | ||
|
faa342a2f1 | ||
|
08bfeeeb0d | ||
|
f522c58ce6 | ||
|
961e01e517 | ||
|
e2b637c8dc | ||
|
3dce01a204 | ||
|
dcfba0a2aa | ||
|
c98d0eaac8 | ||
|
fe880597a1 | ||
|
d81c4ce1ba | ||
|
7bd070ae86 | ||
|
9dc1ddf801 | ||
|
63562c05f6 | ||
|
96b823c2d4 | ||
|
6c44228c1f | ||
|
1571c12129 | ||
|
5113e55139 | ||
|
6085ab8822 | ||
|
1414adfa46 | ||
|
9b02ac6d42 | ||
|
f6b66e4f87 | ||
|
4f95ad1ad1 | ||
|
aaf34e3f7e | ||
|
abee0d4502 | ||
|
e2f2f680d4 | ||
|
3e79b8d6eb | ||
|
e2dffb8eb0 | ||
|
1d0551ca49 | ||
|
7231d4586d | ||
|
28a829a1da | ||
|
0b19f8b2ff | ||
|
35ac0e7ac0 | ||
|
dd44e2e6d6 | ||
|
a9cc6f0218 | ||
|
176fa9ad27 | ||
|
d451842d16 | ||
|
d5cfbf5da4 | ||
|
ee74d202cd | ||
|
a823177ccb | ||
|
0d137ddb72 | ||
|
64009b9c9f | ||
|
bc45b43a49 | ||
|
39c7950aae | ||
|
f55db65292 | ||
|
cba29adf06 | ||
|
87761a8a92 | ||
|
46ab4f0ce7 | ||
|
72c4adc036 | ||
|
8536af685a | ||
|
c3ee5751d5 | ||
|
d9c4b56e71 | ||
|
5de5ae4eb1 | ||
|
78c2b7dfe2 | ||
|
47aebf67a5 | ||
|
7344a124d7 | ||
|
d89037a826 | ||
|
3031f15784 | ||
|
c7c8624250 | ||
|
d46021bab9 | ||
|
1671031143 | ||
|
9b32b18b08 | ||
|
69870ee88b | ||
|
a634c30f00 | ||
|
1939bfff9f | ||
|
96346d24c1 | ||
|
aa648beec8 | ||
|
2155817a36 | ||
|
681d201462 | ||
|
f24b20f01e | ||
|
51b9d8ae65 | ||
|
8daf207bf7 | ||
|
e9a52308bb | ||
|
289dfacfd4 | ||
|
a300815c0f | ||
|
12e8d3bd48 | ||
|
c0598baa87 | ||
|
1d917529f1 | ||
|
b6199254be | ||
|
f51b4d014e | ||
|
c3ef1a6c67 | ||
|
b89d9f3145 | ||
|
663bce9de9 | ||
|
1144efbc47 | ||
|
032834fd6c | ||
|
2021959538 | ||
|
504d1a45e0 | ||
|
1474f5cc47 | ||
|
9e094def75 | ||
|
f201a609a0 | ||
|
21bbd34d35 | ||
|
7aa982f88b | ||
|
4b5b478de9 | ||
|
b26d127897 | ||
|
621bcd0db2 | ||
|
d06192afe9 | ||
|
a5d73ae427 | ||
|
5cd3861438 | ||
|
be44253c94 | ||
|
643538a836 | ||
|
bcda5979be | ||
|
05a1062f95 | ||
|
54c7df15bb | ||
|
499fa1d907 | ||
|
b62d7e7a66 | ||
|
72dc82c033 | ||
|
755f6a0a2b | ||
|
4f8939e1d9 | ||
|
a1129ed23b | ||
|
aea7918433 | ||
|
39304daf4d | ||
|
c086a7eb31 | ||
|
816c35e0ee | ||
|
ff88ec624c | ||
|
fca71b6ef8 | ||
|
4240c8180e | ||
|
0ceb41a5fd | ||
|
47349f3422 | ||
|
c6974c6b46 | ||
|
f067283f9b | ||
|
dfbbfd6f24 | ||
|
7f41d5059e | ||
|
0d95ae4252 | ||
|
3ef933c08f | ||
|
4becbefe5d | ||
|
b82faa2697 | ||
|
3bfccbc7e4 | ||
|
a9193a200f | ||
|
2c8b60af43 | ||
|
3f9de12980 | ||
|
a9e42169ca | ||
|
ee106102c5 | ||
|
33793446c4 | ||
|
a60747c755 | ||
|
cdf7b1bb77 | ||
|
85e351abaf | ||
|
386e9fef2b | ||
|
f110dc58ba | ||
|
a676f094f6 | ||
|
3c9e57d57f | ||
|
98e14329dd | ||
|
3fbdd41297 | ||
|
015434d24c | ||
|
b07ce09982 | ||
|
702aeb3acb | ||
|
6164432aa7 | ||
|
2b323dbad7 | ||
|
2586ddc5dc | ||
|
7a941fd59a | ||
|
53724c2eb6 | ||
|
b12078d928 | ||
|
bc56fc1b87 | ||
|
aa92cabd67 | ||
|
4885bdda95 | ||
|
c43d3964e3 | ||
|
08a422bf17 | ||
|
173ed7e61b | ||
|
13d8571b08 | ||
|
814d2c176d | ||
|
ef31616393 | ||
|
1932c3a251 | ||
|
746de31897 | ||
|
f341b8003c | ||
|
2d6fa95217 | ||
|
5f313c0fdb | ||
|
59820f0efb | ||
|
0f6a66e919 | ||
|
edf0635ed4 | ||
|
fad3e416f8 | ||
|
1f8bba0f74 | ||
|
16d2f3c8a7 | ||
|
ba664e108e | ||
|
a1adaaca27 | ||
|
7565d61403 | ||
|
760bcdcb4e | ||
|
d91eab24d2 | ||
|
20b4cdde55 | ||
|
d40a0d8a1d | ||
|
564b796e36 | ||
|
e89bedb70b | ||
|
92e2626e9d | ||
|
7ea0a3609c | ||
|
fe7e7c62ee | ||
|
4afca1787f | ||
|
b0de71f214 | ||
|
e031a0d0da | ||
|
407bfcf985 | ||
|
51e1f5e43d | ||
|
e63a998420 | ||
|
0c2cdfffd9 | ||
|
31f340edfd | ||
|
1fc50847e0 | ||
|
ed18b66ceb | ||
|
83bcb752a2 | ||
|
0459802ac1 | ||
|
1d53204ebf | ||
|
edb38d15c5 | ||
|
a8f5b292c3 | ||
|
73647adaef | ||
|
416fc8067b | ||
|
ee51d536f0 | ||
|
5f7094ffd4 | ||
|
28b75e9f1d | ||
|
0601b4eef2 | ||
|
998003bda1 | ||
|
a02acadc44 | ||
|
85dac24e64 | ||
|
d6204ccd54 | ||
|
b712d6c846 | ||
|
48ecde18e0 | ||
|
585e9d4985 | ||
|
0ab411a047 | ||
|
edc41d6db5 | ||
|
8e82b56a7e | ||
|
fd1153552d | ||
|
3d4ee138ec | ||
|
2d9f5bea79 | ||
|
a6b58a2c1f | ||
|
ff1642f32c | ||
|
3481d165d1 | ||
|
bed2495e50 | ||
|
52a0e36aee | ||
|
44aa651dc5 | ||
|
d0a317e98a | ||
|
60843dbb3e | ||
|
866f17c147 | ||
|
928d73d4ef | ||
|
98b053a5b8 | ||
|
059b3ac77f | ||
|
8eefd729ec | ||
|
45ea10c71f | ||
|
beefff0002 | ||
|
7a9fba29d6 | ||
|
4054795ff1 | ||
|
75a774f90a | ||
|
d9b5bf9a71 | ||
|
1b75341346 | ||
|
67f2da2a8d | ||
|
20e3b7b859 | ||
|
7e30b44367 | ||
|
dcd8551142 | ||
|
7748c76e35 | ||
|
de3bc7d511 | ||
|
9fa27defd7 | ||
|
835f99bdce | ||
|
7ba9dea999 | ||
|
3995ff240a | ||
|
d56fc6d318 | ||
|
532418b091 | ||
|
2ce7cee4fc | ||
|
56a666d563 | ||
|
1f01dd1230 | ||
|
a79db19fdc | ||
|
0900d919e2 | ||
|
def5e1a61d | ||
|
f377723773 | ||
|
68325b3858 | ||
|
e7ded5ddc1 | ||
|
a0669a2761 | ||
|
b12c1eaea6 | ||
|
eed778467a | ||
|
790133e950 | ||
|
62cb2bcdc3 | ||
|
158e9e7636 | ||
|
a2f98478c3 | ||
|
24bc422c7d | ||
|
c6d45b3143 | ||
|
8d628b1254 | ||
|
1d81a5cb4c | ||
|
06bfde3bff | ||
|
91a29134ff | ||
|
46030d41fd | ||
|
eca7de021b | ||
|
6b4eae4088 | ||
|
2c14e0777a | ||
|
857ce7eeb5 |
1355 changed files with 120020 additions and 59694 deletions
3
.mailmap
3
.mailmap
|
@ -18,7 +18,7 @@ Charles Davis <cdavis@codeweavers.com>
|
|||
Charles Davis <cdavis5x@gmail.com>
|
||||
Christopher Gautier <krys@via.ecp.fr>
|
||||
David A. Cuthbert <dacut@ece.cmu.edu>
|
||||
David Heidelberger <david@ixit.cz>
|
||||
David Heidelberg <david@ixit.cz>
|
||||
Dennis Björklund <db@zigo.dhs.org>
|
||||
Dennis Björklund <dennisb@cs.chalmers.se>
|
||||
Dimitrie O. Paun <dimi@bigfoot.com>
|
||||
|
@ -30,6 +30,7 @@ Erich Hoover <erich.e.hoover@wine-staging.com>
|
|||
Erwin Wolff <erwinwolffnl@microformatica.com>
|
||||
Esme Povirk <vincent@codeweavers.com>
|
||||
Evgeny Putin <evcalipt@etersoft.ru>
|
||||
Fan WenJie <fanwj@mail.ustc.edu.cn>
|
||||
Fatih Aşıcı <fasici@linux-sevenler.org>
|
||||
Fernando Martins <fernando@cmartins.nl>
|
||||
François Gouget <fgouget@codeweavers.com>
|
||||
|
|
142
ANNOUNCE
142
ANNOUNCE
|
@ -1,142 +0,0 @@
|
|||
The Wine development release 9.0-rc3 is now available.
|
||||
|
||||
What's new in this release:
|
||||
- Bug fixes only, we are in code freeze.
|
||||
|
||||
The source is available at:
|
||||
|
||||
https://dl.winehq.org/wine/source/9.0/wine-9.0-rc3.tar.xz
|
||||
|
||||
Binary packages for various distributions will be available from:
|
||||
|
||||
https://www.winehq.org/download
|
||||
|
||||
You will find documentation on https://www.winehq.org/documentation
|
||||
|
||||
You can also get the current source directly from the git
|
||||
repository. Check https://www.winehq.org/git for details.
|
||||
|
||||
Wine is available thanks to the work of many people. See the file
|
||||
AUTHORS in the distribution for the complete list.
|
||||
|
||||
----------------------------------------------------------------
|
||||
|
||||
Bugs fixed in 9.0-rc3 (total 35):
|
||||
|
||||
- #51314 vulkan-1:vulkan crashes on Windows with recent Radeon drivers
|
||||
- #51478 dinput:device8 breaks user32:input's test_keyboard_layout_name() in some locales ()
|
||||
- #52971 HardWest 2 (playtest) is broken with OpenGL/Vulkan backend
|
||||
- #53166 Star Wars : Fallen Order crashes at launch
|
||||
- #53726 Silent Hill 4: The Room low res videos are not played (needs CLSID_CMpegVideoCodec)
|
||||
- #54381 tightvnc viewer crashes on connection
|
||||
- #54878 WinSCP 5.21.1.12643 doesn't list files when Windows version is set to 10
|
||||
- #55005 Program Treecomp - some widgets are not drawn
|
||||
- #55061 Starcraft Remastered: blurry graphics / low resolution
|
||||
- #55161 IrfanView full screen mode creates an unneeded and uncalled for permanent overlaying panel
|
||||
- #55288 advapi32:registry & ntdll:reg - The 32-bit test_redirection() fails if run after the 64 WineTest
|
||||
- #55306 Cannot double click in the server browser in Worms Armageddon
|
||||
- #55327 user32:input - test_ActivateKeyboardLayout() fails on Windows 7 for the Spanish locale
|
||||
- #55328 user32:input - test_keyboard_layout_name() fails on Windows 7 for the Spanish locale
|
||||
- #55394 comctl32:listbox - test_LBS_NODATA() fails in Wine for the Hindi locale
|
||||
- #55439 RPG Maker game crashes
|
||||
- #55446 Using C run-time for unicode strings comparison breaks case insensitive LB_FINDSTRING
|
||||
- #55578 kernel32:loader - test_section_access() sometimes fails on Windows 8
|
||||
- #55582 Civilization 2 crashes when setting up new game
|
||||
- #55655 user32:dialog - test_IsDialogMessageA_proc() fails in the Hindi locale on Wine
|
||||
- #55667 kernel32:file - test_MapFile() fails on macOS
|
||||
- #55773 Railroad Tycoon 2 Platinum (Steam, GOG) crashes when changing to 800X600 resolution
|
||||
- #55903 Falcon BMS 4.37u3: game randomly fails to load 3D models
|
||||
- #55942 Crazy Chicken Approaching - Nebula Assertion and Visual C++ Runtime Library Errors
|
||||
- #55962 Program that mixes 32-bit and 64-bit typelibs fails to find a referenced typelib
|
||||
- #55967 app regression; SWATH stops working at all as of 8.18
|
||||
- #56001 Some shortcut keys don't work with winewayland when focus is lost and restored
|
||||
- #56015 SysTray doesn't work for (and crashes) WiseReminder
|
||||
- #56022 Wine 9.0-rc1 wayland: Cursor does not move on some surfaces
|
||||
- #56026 Wine 9.0-rc1 Wayland: Mouse buttons 3-6 do not work
|
||||
- #56033 winewayland.drv: Alt-shift to change the input language appears like Shift is pressed all the time
|
||||
- #56039 winecfg does no longer run after export WINEARCH=win32
|
||||
- #56046 Pegasus Mail 4.80 regression: Pointer does not change
|
||||
- #56048 winedbg --auto: shows incomplete modules list
|
||||
- #56053 Regression on fallout 3 in the new wow64 mode
|
||||
|
||||
----------------------------------------------------------------
|
||||
|
||||
Changes since 9.0-rc2:
|
||||
|
||||
Akihiro Sagawa (1):
|
||||
po: Update Japanese translation.
|
||||
|
||||
Alex Henrie (2):
|
||||
po: Update Catalan translation.
|
||||
comctl32/listview: Ignore the lParam to WM_PRINTCLIENT and add tests.
|
||||
|
||||
Alexandre Julliard (5):
|
||||
wow64: Initialize the syscall dispatcher in the 32-bit TEB.
|
||||
user32: Fix string comparison for listbox inexact matches.
|
||||
ntdll: Add a more explicit failure for 32-bit prefix in wow64 mode.
|
||||
winecfg: Support all Windows versions also in 64-bit mode.
|
||||
comctl32: Fix string comparison for listbox inexact matches.
|
||||
|
||||
Alistair Leslie-Hughes (1):
|
||||
msdasql/tests: Add missing carriage returns.
|
||||
|
||||
Bernhard Übelacker (1):
|
||||
winedbg: Retrieve module architecture before sorting.
|
||||
|
||||
Brendan McGrath (1):
|
||||
server: Always release internal hardware messages.
|
||||
|
||||
Eric Pouech (7):
|
||||
riched20: Don't crash when no OLE obj is present.
|
||||
riched20: Don't write past end of buffer.
|
||||
dbghelp/tests: Extend tests for module loading.
|
||||
dbghelp: Fix some tests for SymLoadModule*().
|
||||
winmm: Fill in pIOProc field in MMIOINFO.
|
||||
dbghelp/tests: Wait for child window to be up before testing.
|
||||
winedbg: Fix main module detection in 'info share' command.
|
||||
|
||||
Fabian Maurer (1):
|
||||
wineps: Don't leak memory in error case (Coverity).
|
||||
|
||||
Georg Lehmann (1):
|
||||
vulkan-1/tests: Enable feature in private data test.
|
||||
|
||||
Huw D. M. Davies (2):
|
||||
dnsapi: Update the array ptr in the insufficient buffer case.
|
||||
dnsapi: Free the buffer in the early return paths.
|
||||
|
||||
Jacek Caban (1):
|
||||
win32u: Use 32-bit window extra size on wow64.
|
||||
|
||||
Nikolay Sivov (1):
|
||||
oleaut32/typelib: Add a missing break (Coverity).
|
||||
|
||||
Paul Gofman (3):
|
||||
ntdll: Use position independent syscall thunk for NtQueryInformationProcess on i386.
|
||||
include: Fix boolean return value definition in IIterator<T> methods.
|
||||
dxdiagn: Check ICreateDevEnum_CreateClassEnumerator result for S_OK.
|
||||
|
||||
Rémi Bernon (16):
|
||||
user32/tests: Dynamically resize the keyboard layout preload list.
|
||||
user32/tests: Skip some keyboard layout tests on broken VMs.
|
||||
dinput/tests: Avoid calling UnloadKeyboardLayout.
|
||||
user32/tests: Avoid calling UnloadKeyboardLayout.
|
||||
server: Always queue mouse messages delivered to another window.
|
||||
server: Ignore the capture window wrt desktop cursor changes.
|
||||
imm32/tests: Fix HKL comparison when cleaning up preload list.
|
||||
wined3d: Add more padding to resource memory allocations.
|
||||
wined3d: Store the resource heap memory pointer separately.
|
||||
server: Introduce a new get_desktop_cursor_thread_input helper.
|
||||
server: Change desktop cursor only when inside the thread's windows.
|
||||
dmime/tests: Check reference time and allow 0.5 tick difference.
|
||||
dmime/tests: Allow small time variation in test_performance_time.
|
||||
dmime/tests: Allow small time variation in test_segment_state.
|
||||
dmime/tests: Add optional notification sequence on segment stop.
|
||||
dmime/tests: Remove some unnecessary and spuriously failing waits.
|
||||
|
||||
Zebediah Figura (1):
|
||||
qcap/audiorecord: Do not leak the sample when pausing or stopping.
|
||||
|
||||
Zhiyi Zhang (2):
|
||||
user32/tests: Add more display DC tests.
|
||||
win32u: Create a real bitmap object for display DCs.
|
390
ANNOUNCE.md
Normal file
390
ANNOUNCE.md
Normal file
|
@ -0,0 +1,390 @@
|
|||
The Wine development release 9.5 is now available.
|
||||
|
||||
What's new in this release:
|
||||
- Initial SLTG-format typelib support in widl.
|
||||
- Exception handling on ARM64EC.
|
||||
- Improvements to Minidump support.
|
||||
- Various bug fixes.
|
||||
|
||||
The source is available at <https://dl.winehq.org/wine/source/9.x/wine-9.5.tar.xz>
|
||||
|
||||
Binary packages for various distributions will be available
|
||||
from <https://www.winehq.org/download>
|
||||
|
||||
You will find documentation on <https://www.winehq.org/documentation>
|
||||
|
||||
Wine is available thanks to the work of many people.
|
||||
See the file [AUTHORS][1] for the complete list.
|
||||
|
||||
[1]: https://gitlab.winehq.org/wine/wine/-/raw/wine-9.5/AUTHORS
|
||||
|
||||
----------------------------------------------------------------
|
||||
|
||||
### Bugs fixed in 9.5 (total 27):
|
||||
|
||||
- #25207 SHFileOperation does not create new directory on FO_MOVE
|
||||
- #29523 CDBurnerXP hangs on right-clicking empty space in the file browser
|
||||
- #40613 Multiple applications require UAC implementation to run installer/app as a normal user instead of administrator (WhatsApp Desktop, Smartflix, Squirrel Installers, OneDrive)
|
||||
- #44514 Elder Scrolls Online (Dragon Bones update) requires more than 32 samplers in pixel shaders with D3D11 renderer
|
||||
- #45862 Multiple applications need MFCreateSinkWriterFromURL() implementation (Overwatch highlights, RadiAnt DICOM Viewer, Grand Theft Auto V Rockstar Editor)
|
||||
- #48085 Wine error trying to install Mono after a version update
|
||||
- #51957 Program started via HKLM\Software\Microsoft\Windows\CurrentVersion\App Paths should also be started if extension ".exe" is missing
|
||||
- #52352 YI Home installer crashes on unimplemented urlmon.dll.414
|
||||
- #52622 windows-rs 'lib' test crashes on unimplemented function d3dcompiler_47.dll.D3DCreateLinker
|
||||
- #53613 Visual novel RE:D Cherish! logo video and opening movie does not play
|
||||
- #53635 Alune Klient 14.03.2022 crashes on unimplemented function urlmon.dll.414
|
||||
- #54155 WeCom (aka WeChat Work) 4.x failed to launch.
|
||||
- #55421 Fallout Tactics launcher has graphics glitches
|
||||
- #55876 Acrom Controller Updater broken due to oleaut32 install
|
||||
- #56318 Totem Arts Launcher.exe does not open
|
||||
- #56367 Tomb Raider 3 GOG crashes at start
|
||||
- #56379 d2d1 unable to build
|
||||
- #56380 Rocket League crashes with Wine 9.3 after BakkesMod (trainer app) injects into the game
|
||||
- #56400 SSPI authentication does not work when connecting to sql server
|
||||
- #56406 wineserver crashes in set_input_desktop()
|
||||
- #56411 Failure to build wine 9.4 due to EGL 64-bit development files not found
|
||||
- #56433 QQ8.9.6 Installer crashes at very beginning due to a change in server/process.c
|
||||
- #56434 WScript.Network does not implement UserName, ComputerName, and UserDomain properties
|
||||
- #56435 capture mouse dont work in virtual desktop (work on wine 9.3)
|
||||
- #56445 d3d1-9 applications run out of memory after f6a1844dbe (ArmA: Cold War Assault, Final Fantasy XI Online, Far Cry 3)
|
||||
- #56450 Non-input USB HID devices stopped working in 9.1
|
||||
- #56458 ntdll tests skipped on win7 & win8: missing entry point kernel32.RtlPcToFileHeader
|
||||
|
||||
### Changes since 9.4:
|
||||
```
|
||||
Akihiro Sagawa (2):
|
||||
dsound/tests: Add tests for implicit MTA creation in IDirectSound::Initialize().
|
||||
dsound: Initialize MTA in IDirectSound::Initialize().
|
||||
|
||||
Alexandre Julliard (42):
|
||||
configure: Check the correct variable for the Wayland EGL library.
|
||||
ntdll: Implement RtlRestoreContext on ARM64EC.
|
||||
ntdll: Implement RtlWalkFrameChain on x86-64.
|
||||
ntdll: Implement RtlWalkFrameChain on i386.
|
||||
ntdll: Implement RtlWalkFrameChain on ARM.
|
||||
ntdll: Implement RtlWalkFrameChain on ARM64.
|
||||
ntdll: Implement RtlWalkFrameChain on ARM64EC.
|
||||
ntdll: Export RtlVirtualUnwind2 and RtlWalkFrameChain.
|
||||
ntdll: Share RtlCaptureStackBackTrace implementation across platforms.
|
||||
secur32/tests: Update count for new winehq.org certificate.
|
||||
ws2_32/tests: Fix a couple of failures on Windows.
|
||||
include: Define setjmpex prototype even when it's a builtin.
|
||||
ntdll/tests: Directly link to setjmp().
|
||||
ntdll/tests: Fix a backtrace test failure on Windows ARM64.
|
||||
ntdll: Add test for non-volatile regs in consolidated unwinds.
|
||||
ntdll: Port the RtlRestoreContext test to ARM64.
|
||||
ntdll: Port the RtlRestoreContext test to ARM.
|
||||
ntdll: Implement RtlUnwindEx on ARM64EC.
|
||||
ntdll: Move __C_specific_handler implementation to unwind.c.
|
||||
ntdll: Implement __C_specific_handler on ARM64EC.
|
||||
ntdll: Always use SEH support on ARM64.
|
||||
ntdll/tests: Skip segment register tests on ARM64EC.
|
||||
ntdll/tests: Fix debug register tests on ARM64EC.
|
||||
ntdll/tests: Fix a few more test failures on ARM64EC.
|
||||
ntdll: Implement RtlGetCallersAddress.
|
||||
kernelbase: Remove no longer needed DllMainCRTStartup function.
|
||||
include: Add some new error codes.
|
||||
include: Add some new status codes.
|
||||
ntdll: Add mappings for more status codes.
|
||||
jscript: Use the correct facility for JScript errors.
|
||||
netprofm: Use the correct symbols for error codes.
|
||||
msvcrt: Use floating point comparison builtins also in MSVC mode.
|
||||
ntdll/tests: Fix exception address checks in child process on ARM64EC.
|
||||
ntdll/tests: Update the KiUserExceptionDispatcher test for ARM64EC.
|
||||
configure: Don't build wow64 support in non-PE builds.
|
||||
wow64: Use a .seh handler in raise_exception().
|
||||
wow64: Always use a .seh handler in cpu_simulate().
|
||||
wow64: Access the BTCpuSimulate backend function pointer directly.
|
||||
wow64: Use a .seh handler for system calls.
|
||||
wow64cpu: Save non-volatile registers before switching to 32-bit code.
|
||||
wow64: Use setjmp/longjmp from ntdll.
|
||||
server: Add a helper to trace uint64 arrays.
|
||||
|
||||
Alexandros Frantzis (5):
|
||||
winewayland.drv: Implement wglCreateContextAttribsARB.
|
||||
winewayland.drv: Implement wglShareLists.
|
||||
winewayland.drv: Implement wgl(Get)SwapIntervalEXT.
|
||||
win32u: Cancel auto-repeat only if the repeat key is released.
|
||||
win32u: Cancel previous key auto-repeat when starting a new one.
|
||||
|
||||
Andrew Nguyen (3):
|
||||
ddraw: Reserve extra space in the reference device description buffer.
|
||||
oleaut32: Bump version resource to Windows 10.
|
||||
ddraw: Release only valid texture parents on ddraw_texture_init failure.
|
||||
|
||||
Andrew Wesie (1):
|
||||
wined3d: Use bindless textures for GLSL shaders if possible.
|
||||
|
||||
Brendan McGrath (5):
|
||||
comdlg32: Use values from DeviceCapabilities in combobox.
|
||||
comdlg32: Add resolutions to PRINTDLG_ChangePrinterW.
|
||||
comdlg32: Populate printer name on the print dialogs.
|
||||
comdlg32: Use ANSI functions in ANSI WMCommandA.
|
||||
comdlg32: Don't treat cmb1 as the printer list unless in PRINT_SETUP.
|
||||
|
||||
Brendan Shanks (6):
|
||||
ntdll: Remove support for msg_accrights FD passing.
|
||||
server: Remove support for msg_accrights FD passing.
|
||||
mountmgr: Replace sprintf with snprintf to avoid deprecation warnings on macOS.
|
||||
mountmgr: Replace some malloc/sprintf/strcpy calls with asprintf.
|
||||
opengl32: Replace sprintf with snprintf/asprintf to avoid deprecation warnings on macOS.
|
||||
secur32: Replace sprintf with snprintf to avoid deprecation warnings on macOS.
|
||||
|
||||
Daniel Lehman (2):
|
||||
oleaut32/tests: Add tests for GetSizeMax after dirty flag cleared.
|
||||
oleaut32: Return success from GetSizeMax if not dirty.
|
||||
|
||||
David Gow (1):
|
||||
evr/dshow: Support NV12 in evr_render.
|
||||
|
||||
David Heidelberg (2):
|
||||
d3d9/tests: Replace LPDWORD cast with float_to_int function.
|
||||
mailmap: Add a mailmap entry for myself with the proper name.
|
||||
|
||||
Dmitry Timoshkov (6):
|
||||
d2d1: Make some strings const.
|
||||
wineps.drv: Return default resolution if PPD doesn't provide the list of supported resolutions.
|
||||
kerberos: Allocate memory for the output token if requested.
|
||||
comctl32/tests: Add more tests for IImageList2 interface.
|
||||
comctl32: Implement IImageList2::Initialize().
|
||||
widl: Add initial implementation of SLTG typelib generator.
|
||||
|
||||
Eric Pouech (18):
|
||||
include: Update minidumpapiset.h.
|
||||
dbghelp/tests: Add tests for minidumps.
|
||||
dbghelp/tests: Add tests about generated memory chunks.
|
||||
dbghelp/tests: Add tests about minidump's callback.
|
||||
dbghelp/tests: Test exception information in minidump.
|
||||
dbghelp/tests: Add tests for function table lookup.
|
||||
dbghelp: Use an intermediate buffer in SymFunctionTableAccess (x86_64).
|
||||
dbghelp: Don't write minidump from running thread.
|
||||
dbghelp: Simplify thread info generation in minidump.
|
||||
dbghelp: Add support for V2 unwind info (x86_64).
|
||||
winedbg: Fallback to PE image when reading memory (minidump).
|
||||
winedbg: Reload module without virtual flag.
|
||||
dbghelp: No longer embed unwind information in minidump (x86_64).
|
||||
winedbg: Add ability to set executable name.
|
||||
winedbg: Extend 'attach' command to load minidump files.
|
||||
winedbg: Flush expr buffer upon internal exception.
|
||||
winedbg: Update the CPU information displayed when reloading a minidump.
|
||||
winedbg: Don't reload a minidump for a different machine.
|
||||
|
||||
Esme Povirk (7):
|
||||
user32/tests: Accept HCBT_ACTIVATE in TrackPopupMenu.
|
||||
gdiplus: Check bounding box in GdipIsVisibleRegionPoint.
|
||||
user32/tests: Add another missing message for TrackPopupMenu.
|
||||
gdiplus/tests: Region bounds aren't rounded.
|
||||
gdiplus: Calculate region bounding box without generating HRGN.
|
||||
user32/tests: Accept WM_ACTIVATE in TrackPopupMenu.
|
||||
user32/tests: Further updates for win11 TrackPopupMenu failures.
|
||||
|
||||
Gabriel Ivăncescu (1):
|
||||
shell32: Construct the proper path target for UnixFolder.
|
||||
|
||||
Giovanni Mascellani (1):
|
||||
d2d1: Compile the pixel shader with D3DCompile().
|
||||
|
||||
Hans Leidekker (3):
|
||||
dnsapi/tests: Skip tests if no CNAME records are returned.
|
||||
ntdll/tests: Fix a test failure.
|
||||
ntdll/tests: Load NtMakeTemporaryObject() dynamically.
|
||||
|
||||
Henri Verbeet (1):
|
||||
wined3d: Do not check the input signature element count for sm4+ shaders in shader_spirv_compile_arguments_init().
|
||||
|
||||
Jacek Caban (2):
|
||||
configure: Don't explicitly enable -Wenum-conversion on Clang.
|
||||
widl: Always close parsed input file.
|
||||
|
||||
Jinoh Kang (10):
|
||||
tools/gitlab: Run make_specfiles before building.
|
||||
ntdll/tests: Add tests for OBJ_PERMANENT object attribute.
|
||||
ntdll/tests: Add tests for NtMakeTemporaryObject.
|
||||
server: Generalize server request make_temporary to set_object_permanence.
|
||||
ntdll: Implement NtMakePermanentObject.
|
||||
ntdll/tests: Don't import kernel32.RtlPcToFileHeader.
|
||||
Revert "ntdll/tests: Load NtMakeTemporaryObject() dynamically."
|
||||
server: Check for DELETE access in NtMakeTemporaryObject().
|
||||
kernelbase: Open object with DELETE access for NtMakeTemporaryObject().
|
||||
gitlab: Output collapsible section markers in test stage script.
|
||||
|
||||
Kyrylo Babikov (1):
|
||||
dbghelp: Fix PDB processing using the FPO stream instead of FPOEXT.
|
||||
|
||||
Louis Lenders (1):
|
||||
shell32: Try appending .exe when looking up an App Paths key.
|
||||
|
||||
Marcus Meissner (1):
|
||||
ntdll/tests: Fix size passed to GetModuleFileNameW.
|
||||
|
||||
Mark Jansen (1):
|
||||
kernel32/tests: Add tests for job object accounting.
|
||||
|
||||
Nikolay Sivov (16):
|
||||
include: Add ID2D1Factory7 definition.
|
||||
include: Add ID2D1DeviceContext6 definition.
|
||||
d3dcompiler: Set correct compilation target for effects profiles.
|
||||
d3dcompiler: Wrap fx_4_x output in a dxbc container.
|
||||
d3d10/tests: Add a small effect compilation test.
|
||||
wshom/network: Use TRACE() for implemented method.
|
||||
wshom/network: Implement GetTypeInfo().
|
||||
wshom/network: Implement ComputerName() property.
|
||||
wshom/network: Check pointer argument in get_UserName().
|
||||
d3dx10/tests: Remove todo's from now passing tests.
|
||||
d3d10_1/tests: Remove todo from now passing test.
|
||||
wshom/network: Implement UserDomain property.
|
||||
msxml6/tests: Add some tests for MXWriter60.
|
||||
msxml/tests: Move some of the validation tests to their modules.
|
||||
msxml/tests: Move version-specific schema tests to corresponding modules.
|
||||
include: Remove XMLSchemaCache60 from msxml2.idl.
|
||||
|
||||
Noah Berner (1):
|
||||
advapi32/tests: Add todo_wine to tests that are currently failing.
|
||||
|
||||
Paul Gofman (11):
|
||||
imm32: Set lengths to 0 for NULL strings in ImmSetCompositionString().
|
||||
cryptowinrt: Force debug info in critical sections.
|
||||
diasymreader: Force debug info in critical sections.
|
||||
dsdmo: Force debug info in critical sections.
|
||||
qasf: Force debug info in critical sections.
|
||||
services: Force debug info in critical sections.
|
||||
explorer: Force debug info in critical sections.
|
||||
ntdll: Only allocate debug info in critical sections with RTL_CRITICAL_SECTION_FLAG_FORCE_DEBUG_INFO.
|
||||
server: Ignore some ICMP-originated socket errors for connectionless sockets.
|
||||
strmbase: Fallback to InitializeCriticalSection() if RTL_CRITICAL_SECTION_FLAG_FORCE_DEBUG_INFO is unsupported.
|
||||
ntdll: Don't use debug info presence to detect critical section global status.
|
||||
|
||||
Pavel Ondračka (1):
|
||||
d3d9/tests: Define enums outside of struct.
|
||||
|
||||
Piotr Caban (6):
|
||||
ntdll: Workaround sendmsg bug on macOS.
|
||||
winedump: Fix REG_DWORD dumping with no data.
|
||||
advapi32/tests: Merge RegLoadKey and RegUnLoadKey tests.
|
||||
advapi32/tests: Remove all files created by RegLoadKey tests.
|
||||
advapi32/tests: Test if modifications are saved in RegUnLoadKey.
|
||||
advapi32/tests: Remove all files created by RegLoadAppKey tests.
|
||||
|
||||
Robin Kertels (1):
|
||||
d3d9/tests: Skip desktop window tests if device creation fails.
|
||||
|
||||
Rémi Bernon (74):
|
||||
win32u: Move D3DKMT functions to a new d3dkmt.c source.
|
||||
win32u: Move D3DKMT VidPn* functions out of winex11.
|
||||
win32u: Add an adapter struct to the device manager context.
|
||||
win32u: Split writing monitor to registry to a separate helper.
|
||||
win32u: Get rid of the monitor display_device.
|
||||
win32u: Get rid of the monitor state_flags.
|
||||
win32u: Get rid of the adapter display_device.
|
||||
win32u: Get rid of the monitor flags.
|
||||
win32u: Enumerate monitors from their device keys.
|
||||
mfreadwrite/reader: Handle MF_E_TRANSFORM_STREAM_CHANGE results.
|
||||
win32u: Fix incorrect ascii key name in get_config_key.
|
||||
winevulkan: Use an rb_tree and allocate entries for handle mappings.
|
||||
winevulkan: Use a single allocation for device and queues.
|
||||
winevulkan: Pass VkDeviceQueueCreateInfo to wine_vk_device_init_queues.
|
||||
winevulkan: Rename wine_vk_physical_device_alloc parameters and variables.
|
||||
winevulkan: Use a single allocation for instance and physical devices.
|
||||
winevulkan: Get rid of the wine_vk_device_free helper.
|
||||
winevulkan: Simplify wine_vk_instance_free helper.
|
||||
winevulkan: Add handle mappings on creation success only.
|
||||
winevulkan: Get rid of the wine_vk_instance_free helper.
|
||||
mfplat/tests: Test each VIDEOINFOHEADER field conversion separately.
|
||||
mfplat/mediatype: Implement implicit MFInitMediaTypeFromVideoInfoHeader subtype.
|
||||
mfplat/mediatype: Implement MFInitMediaTypeFromVideoInfoHeader2.
|
||||
mfplat/tests: Add tests for MFInitMediaTypeFromVideoInfoHeader2.
|
||||
mfplat/mediatype: Implement MFInitAMMediaTypeFromMFMediaType for FORMAT_VideoInfo2.
|
||||
mfplat/tests: Test aperture to VIDEOINFOHEADER fields mapping.
|
||||
mfplat/mediatype: Support FORMAT_VideoInfo2 in MFInitMediaTypeFromAMMediaType.
|
||||
mfplat/mediatype: Set MF_MT_SAMPLE_SIZE from bmiHeader.biSizeImage.
|
||||
mfplat/mediatype: Map rcSource to MF_MT_(PAN_SCAN|MINIMUM_DISPLAY)_APERTURE.
|
||||
mfplat/mediatype: Set rcSource and rcTarget if stride differs from width.
|
||||
mfplat/tests: Add more MFAverageTimePerFrameToFrameRate tests.
|
||||
mfplat: Support flexible frame time in MFAverageTimePerFrameToFrameRate.
|
||||
mfplat/mediatype: Implement MF_MT_FRAME_RATE from VIDEOINFOHEADER2.
|
||||
mfplat/mediatype: Implement VIDEOINFOHEADER2 dwControlFlags conversion.
|
||||
mfplat/mediatype: Implement some VIDEOINFOHEADER2 dwInterlaceFlags conversion.
|
||||
mfplat/tests: Test that aperture is dropped with VIDEOINFOHEADER2.
|
||||
mfplat/tests: Test that MFCreateMFVideoFormatFromMFMediaType appends user data.
|
||||
mfplat/mediatype: Append user data in MFCreateMFVideoFormatFromMFMediaType.
|
||||
mfplat/tests: Check the conditions for the MFVideoFlag_BottomUpLinearRep flags.
|
||||
mfplat/mediatype: Stub MFInitMediaTypeFromMFVideoFormat.
|
||||
mfplat/tests: Add tests for MFInitMediaTypeFromMFVideoFormat.
|
||||
mfplat/mediatype: Implement MFInitMediaTypeFromMFVideoFormat.
|
||||
winebus: Add HID usages in the device descriptor when possible.
|
||||
winebus: Read hidraw device usages from their report descriptors.
|
||||
winebus: Prefer hidraw for everything that is not a game controller.
|
||||
winebus: Remove devices that are ignored wrt hidraw preferences.
|
||||
winevulkan: Allow only one vulkan surface at a time for an HWND.
|
||||
win32u: Avoid a crash when cleaning up a monitor without an adapter.
|
||||
winegstreamer: Release sink caps in the error path.
|
||||
winegstreamer: Append an optional parser before decoders.
|
||||
mfplat/tests: Add some broken results for Win7.
|
||||
mfplat/tests: Test initializing mediatype from AAC WAVEFORMATEXTENSIBLE.
|
||||
mfplat/tests: Check how AAC attributes are copied from user data.
|
||||
mfplat/mediatype: Check format pointers and sizes in MFInitMediaTypeFromAMMediaType.
|
||||
mfplat/mediatype: Support audio major type in MFInitMediaTypeFromAMMediaType.
|
||||
mfplat/mediatype: Force WAVEFORMATEXTENSIBLE in MFCreateWaveFormatExFromMFMediaType in some cases.
|
||||
mfplat/mediatype: Implement MFCreateMediaTypeFromRepresentation.
|
||||
mfplat/mediatype: Use MFCreateWaveFormatExFromMFMediaType in init_am_media_type_audio_format.
|
||||
ntoskrnl.exe: Open symbolic link with DELETE before making them temporary.
|
||||
server: Avoid removing thread twice from its desktop thread list.
|
||||
winex11: Accept key and mouse events with QS_RAWINPUT.
|
||||
server: Send WM_WINE_CLIPCURSOR message only when necessary.
|
||||
server: Send WM_WINE_SETCURSOR message only when necessary.
|
||||
win32u: Use a structure to pass peek_message arguments.
|
||||
server: Check for internal hardware messages before others.
|
||||
server: Process internal messages when checking queue status.
|
||||
user32/tests: Add missing winetest_pop_context.
|
||||
user32/tests: Add some LoadKeyboardLayoutEx tests.
|
||||
winemac: Use SONAME_LIBVULKAN as an alias for MoltenVK.
|
||||
win32u: Move vulkan loading and init guard out of the drivers.
|
||||
win32u: Move vkGet(Instance|Device)ProcAddr out the drivers.
|
||||
winevulkan: Stop generating the wine/vulkan_driver.h header.
|
||||
win32u: Move vkGet(Device|Instance)ProcAddr helpers inline.
|
||||
mfplat: Append MFVIDEOFORMAT user data after the structure padding.
|
||||
|
||||
Santino Mazza (2):
|
||||
mf/test: Check the topologies id's in topo loader.
|
||||
mf/topoloader: Preserve input topology id.
|
||||
|
||||
Vijay Kiran Kamuju (4):
|
||||
include: Add Windows.UI.ViewManagement.UIViewSettings definitions.
|
||||
urlmon: Add stub for ordinal 414.
|
||||
d3dcompiler: Add D3DCreateLinker stub.
|
||||
user32: Add LoadKeyboardLayoutEx stub.
|
||||
|
||||
Yuxuan Shui (8):
|
||||
shell32/tests: Check FindExecutable is looking in the correct current directory.
|
||||
shell32/tests: Check ShellExecute is looking in the correct current directory.
|
||||
shell32: PathResolve(file, NULL, ...) should not look in the current directory.
|
||||
shell32: Make sure PathResolve can find files in the current directory.
|
||||
shell32: PathResolve should be able to find files that already have extensions.
|
||||
shell32: PathResolve should remove trailing dot.
|
||||
shell32: Fix FindExecutable search path.
|
||||
shell32: Rely solely on SHELL_FindExecutable for ShellExecute.
|
||||
|
||||
Zebediah Figura (12):
|
||||
ntdll: Assign a primary token in elevate_token().
|
||||
d3d9/tests: Remove a no longer accurate comment.
|
||||
d3d11/tests: Add a test for using a large number of SRV resources.
|
||||
wined3d: Rename the shader_select_compute method to shader_apply_compute_state.
|
||||
wined3d: Move checking shader_update_mask to shader_glsl_apply_compute_state().
|
||||
shell32/tests: Remove obsolete workarounds from test_move().
|
||||
quartz: Implement SetVideoClippingWindow() and PresentImage() in the VMR7 presenter.
|
||||
quartz: Reimplement the VMR7 using the VMR7 presenter.
|
||||
quartz: Implement IVMRSurfaceAllocatorNotify::AdviseSurfaceAllocator().
|
||||
quartz: Return S_OK from IVMRSurfaceAllocator_PrepareSurface().
|
||||
quartz/tests: Add some tests for VMR7 renderless mode.
|
||||
wined3d: Avoid leaking string buffers in shader_glsl_load_bindless_samplers().
|
||||
|
||||
Zhenbo Li (1):
|
||||
shell32: Create nonexistent destination directories in FO_MOVE.
|
||||
|
||||
Zhiyi Zhang (5):
|
||||
mfreadwrite: Fix a memory leak (Coverity).
|
||||
win32u: Support HiDPI for the non-client close button in WS_EX_TOOLWINDOW windows.
|
||||
win32u: Fix a possible condition that makes EnumDisplayMonitors() not reporting any monitors.
|
||||
win32u: Don't enumerate mirrored monitor clones for GetSystemMetrics(SM_CMONITORS).
|
||||
win32u: Don't enumerate mirrored monitor clones when unnecessary.
|
||||
```
|
18
AUTHORS
18
AUTHORS
|
@ -360,6 +360,7 @@ Dan Hipschman
|
|||
Daniel Ansorregui
|
||||
Daniel Beitler
|
||||
Daniel Gudbjartsson
|
||||
Daniel Hill
|
||||
Daniel Jelinski
|
||||
Daniel Lehman
|
||||
Daniel Lund
|
||||
|
@ -404,7 +405,7 @@ David Gow
|
|||
David Grant
|
||||
David Hammerton
|
||||
David Hedberg
|
||||
David Heidelberger
|
||||
David Heidelberg
|
||||
David Hemmo
|
||||
David Howells
|
||||
David Kahurani
|
||||
|
@ -431,6 +432,7 @@ David Welch
|
|||
David White
|
||||
David Woodhouse
|
||||
Davin McCall
|
||||
Dāvis Mosāns
|
||||
Dean M Greer
|
||||
Denil Verghese
|
||||
Denis Baranov
|
||||
|
@ -539,6 +541,7 @@ Fatih Aşıcı
|
|||
Federico Schwindt
|
||||
Felix Hädicke
|
||||
Felix Janda
|
||||
Felix Münchhalfen
|
||||
Felix Nawothnig
|
||||
Ferenc Wagner
|
||||
Fergal Daly
|
||||
|
@ -573,6 +576,7 @@ Freddie Tilley
|
|||
Frederic Boulanger
|
||||
Frédéric Delanoy
|
||||
Frédéric Fauberteau
|
||||
Gabriel Brand
|
||||
Gabriel Buades Rubio
|
||||
Gabriele Giorgetti
|
||||
Gabriele Moabiti
|
||||
|
@ -587,6 +591,7 @@ Gavriel State
|
|||
Gediminas Jakutis
|
||||
Geoff Clare
|
||||
Geoffrey Hausheer
|
||||
Geoffrey McRae
|
||||
Geoff Thorpe
|
||||
Georg Beyerle
|
||||
George Gov
|
||||
|
@ -969,6 +974,7 @@ Karl Lessard
|
|||
Karl Relton
|
||||
Karol Herbst
|
||||
Karsten Elfenbein
|
||||
Kartavya Vashishtha
|
||||
Kasper Sandberg
|
||||
Katarzyna Caban
|
||||
K.B.Dharun Krishna
|
||||
|
@ -1030,12 +1036,14 @@ Kristian Nielsen
|
|||
Kristján Gerhardsson
|
||||
Kristofer Henriksson
|
||||
Kristoffer Gleditsch
|
||||
Krzysztof Bogacki
|
||||
Krzysztof Foltman
|
||||
Krzysztof Kotlenga
|
||||
Krzysztof Nowicki
|
||||
Kurt Kartaltepe
|
||||
Kusanagi Kouichi
|
||||
Kyle Luna
|
||||
Kyrylo Babikov
|
||||
Lance Jackson
|
||||
Lars-Ake Fredlund
|
||||
Lars Heete
|
||||
|
@ -1289,6 +1297,7 @@ Nerijus Baliunas
|
|||
Nguyễn Chính Hữu
|
||||
Nicholas Fraser
|
||||
Nicholas Niro
|
||||
Nicholas Tay
|
||||
Nick Bowler
|
||||
Nick Burns
|
||||
Nick Fox
|
||||
|
@ -1304,6 +1313,7 @@ Niels Kristian Bech Jensen
|
|||
Nigel Liang
|
||||
Nikita Morozkin
|
||||
Nikita V. Youshchenko
|
||||
Nikola Kuburović
|
||||
Nikola Pavlica
|
||||
Nikolas Zimmermann
|
||||
Nikolay Bogoychev
|
||||
|
@ -1311,6 +1321,7 @@ Nikolay Sivov
|
|||
Nikolay Stefanov
|
||||
Nils Kuhnhenn
|
||||
Nix N. Nix
|
||||
Noah Berner
|
||||
Noel Borthwick
|
||||
Noomen Hamza
|
||||
Norman Stevens
|
||||
|
@ -1378,6 +1389,7 @@ Paul van Schayck
|
|||
Paul Vriens
|
||||
Pavel Borecki
|
||||
Pavel Kankovsky
|
||||
Pavel Ondračka
|
||||
Pavel Roskin
|
||||
Pavel Semerad
|
||||
Pavel Troller
|
||||
|
@ -1474,6 +1486,7 @@ Ralf S. Engelschall
|
|||
Ramon Garcia
|
||||
Randy Weems
|
||||
Raphael Junqueira
|
||||
Rastislav Stanik
|
||||
Raul Dias
|
||||
Raul Fernandes
|
||||
Raul Metsma
|
||||
|
@ -1560,6 +1573,7 @@ Rudolf Mayerhofer
|
|||
Ruei-Yuan Lu
|
||||
Ruslan Kabatsayev
|
||||
Russ Andersson
|
||||
Russell Greene
|
||||
Rustam Chernotkach
|
||||
Ryan Cumming
|
||||
Ryan Hendrickson
|
||||
|
@ -1778,6 +1792,7 @@ Valery Kartel
|
|||
Vasily I. Volchenko
|
||||
Vasudev Mulchandani
|
||||
Vedran Rodic
|
||||
Vibhav Pant
|
||||
Vicki Pfau
|
||||
Victor Chiletto
|
||||
Victor Hermann Chiletto
|
||||
|
@ -1888,4 +1903,5 @@ Zixing Liu
|
|||
Zoltan Kovacs
|
||||
Zoltan Nagy
|
||||
Zoran Dzelajlija
|
||||
Zsolt Vadasz
|
||||
Zygo Blaxell
|
||||
|
|
2
LICENSE
2
LICENSE
|
@ -1,4 +1,4 @@
|
|||
Copyright (c) 1993-2023 the Wine project authors (see the file AUTHORS
|
||||
Copyright (c) 1993-2024 the Wine project authors (see the file AUTHORS
|
||||
for a complete list)
|
||||
|
||||
Wine is free software; you can redistribute it and/or modify it under
|
||||
|
|
|
@ -169,6 +169,7 @@ P: Aric Stewart <aric@codeweavers.com>
|
|||
F: dlls/hid/
|
||||
F: dlls/hidclass.sys/
|
||||
F: dlls/hidparse.sys/
|
||||
F: dlls/mouhid.sys/
|
||||
F: dlls/winehid.sys/
|
||||
|
||||
HTTP server
|
||||
|
@ -217,7 +218,6 @@ P: Zebediah Figura <z.figura12@gmail.com>
|
|||
F: dlls/mf/tests/transform.c
|
||||
F: dlls/winegstreamer/aac_decoder.c
|
||||
F: dlls/winegstreamer/color_convert.c
|
||||
F: dlls/winegstreamer/h264_decoder.c
|
||||
F: dlls/winegstreamer/media_source.c
|
||||
F: dlls/winegstreamer/mfplat.c
|
||||
F: dlls/winegstreamer/resampler.c
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
1. INTRODUCTION
|
||||
## INTRODUCTION
|
||||
|
||||
Wine is a program which allows running Microsoft Windows programs
|
||||
(including DOS, Windows 3.x, Win32, and Win64 executables) on Unix.
|
||||
|
@ -11,76 +11,79 @@ Wine is free software, released under the GNU LGPL; see the file
|
|||
LICENSE for the details.
|
||||
|
||||
|
||||
2. QUICK START
|
||||
## QUICK START
|
||||
|
||||
From the top-level directory of the Wine source (which contains this file),
|
||||
run:
|
||||
|
||||
```
|
||||
./configure
|
||||
make
|
||||
```
|
||||
|
||||
Then either install Wine:
|
||||
|
||||
```
|
||||
make install
|
||||
```
|
||||
|
||||
Or run Wine directly from the build directory:
|
||||
|
||||
```
|
||||
./wine notepad
|
||||
```
|
||||
|
||||
Run programs as "wine program". For more information and problem
|
||||
Run programs as `wine program`. For more information and problem
|
||||
resolution, read the rest of this file, the Wine man page, and
|
||||
especially the wealth of information found at https://www.winehq.org.
|
||||
|
||||
|
||||
3. REQUIREMENTS
|
||||
## REQUIREMENTS
|
||||
|
||||
To compile and run Wine, you must have one of the following:
|
||||
|
||||
Linux version 2.0.36 or later
|
||||
FreeBSD 12.4 or later
|
||||
Solaris x86 9 or later
|
||||
NetBSD-current
|
||||
Mac OS X 10.8 or later
|
||||
- Linux version 2.6.22 or later
|
||||
- FreeBSD 12.4 or later
|
||||
- Solaris x86 9 or later
|
||||
- NetBSD-current
|
||||
- Mac OS X 10.8 or later
|
||||
|
||||
As Wine requires kernel-level thread support to run, only the operating
|
||||
systems mentioned above are supported. Other operating systems which
|
||||
support kernel threads may be supported in the future.
|
||||
|
||||
FreeBSD info:
|
||||
**FreeBSD info**:
|
||||
See https://wiki.freebsd.org/Wine for more information.
|
||||
|
||||
Solaris info:
|
||||
**Solaris info**:
|
||||
You will most likely need to build Wine with the GNU toolchain
|
||||
(gcc, gas, etc.). Warning : installing gas does *not* ensure that it
|
||||
will be used by gcc. Recompiling gcc after installing gas or
|
||||
symlinking cc, as and ld to the gnu tools is said to be necessary.
|
||||
|
||||
NetBSD info:
|
||||
**NetBSD info**:
|
||||
Make sure you have the USER_LDT, SYSVSHM, SYSVSEM, and SYSVMSG options
|
||||
turned on in your kernel.
|
||||
|
||||
Mac OS X info:
|
||||
**Mac OS X info**:
|
||||
You need Xcode/Xcode Command Line Tools or Apple cctools. The
|
||||
minimum requirements for compiling Wine are clang 3.8 with the
|
||||
MacOSX10.10.sdk and mingw-w64 v8. The MacOSX10.14.sdk and later can
|
||||
only build wine64.
|
||||
|
||||
|
||||
Supported file systems:
|
||||
**Supported file systems**:
|
||||
Wine should run on most file systems. A few compatibility problems
|
||||
have also been reported using files accessed through Samba. Also,
|
||||
NTFS does not provide all the file system features needed by some
|
||||
applications. Using a native Unix file system is recommended.
|
||||
|
||||
Basic requirements:
|
||||
**Basic requirements**:
|
||||
You need to have the X11 development include files installed
|
||||
(called xorg-dev in Debian and libX11-devel in Red Hat).
|
||||
|
||||
Of course you also need "make" (most likely GNU make).
|
||||
|
||||
Of course you also need make (most likely GNU make).
|
||||
You also need flex version 2.5.33 or later and bison.
|
||||
|
||||
Optional support libraries:
|
||||
**Optional support libraries**:
|
||||
Configure will display notices when optional libraries are not found
|
||||
on your system. See https://wiki.winehq.org/Recommended_Packages for
|
||||
hints about the packages you should install. On 64-bit platforms,
|
||||
|
@ -88,80 +91,80 @@ Optional support libraries:
|
|||
libraries.
|
||||
|
||||
|
||||
4. COMPILATION
|
||||
## COMPILATION
|
||||
|
||||
To build Wine, do:
|
||||
|
||||
```
|
||||
./configure
|
||||
make
|
||||
```
|
||||
|
||||
This will build the program "wine" and numerous support libraries/binaries.
|
||||
The program "wine" will load and run Windows executables.
|
||||
The library "libwine" ("Winelib") can be used to compile and link
|
||||
Windows source code under Unix.
|
||||
|
||||
To see compile configuration options, do ./configure --help.
|
||||
To see compile configuration options, do `./configure --help`.
|
||||
|
||||
For more information, see https://wiki.winehq.org/Building_Wine
|
||||
|
||||
|
||||
5. SETUP
|
||||
## SETUP
|
||||
|
||||
Once Wine has been built correctly, you can do "make install"; this
|
||||
Once Wine has been built correctly, you can do `make install`; this
|
||||
will install the wine executable and libraries, the Wine man page, and
|
||||
other needed files.
|
||||
|
||||
Don't forget to uninstall any conflicting previous Wine installation
|
||||
first. Try either "dpkg -r wine" or "rpm -e wine" or "make uninstall"
|
||||
first. Try either `dpkg -r wine` or `rpm -e wine` or `make uninstall`
|
||||
before installing.
|
||||
|
||||
Once installed, you can run the "winecfg" configuration tool. See the
|
||||
Once installed, you can run the `winecfg` configuration tool. See the
|
||||
Support area at https://www.winehq.org/ for configuration hints.
|
||||
|
||||
|
||||
6. RUNNING PROGRAMS
|
||||
## RUNNING PROGRAMS
|
||||
|
||||
When invoking Wine, you may specify the entire path to the executable,
|
||||
or a filename only.
|
||||
|
||||
For example: to run Notepad:
|
||||
For example, to run Notepad:
|
||||
|
||||
wine notepad (using the search Path as specified in
|
||||
wine notepad.exe the registry to locate the file)
|
||||
```
|
||||
wine notepad (using the search Path as specified in
|
||||
wine notepad.exe the registry to locate the file)
|
||||
|
||||
wine c:\\windows\\notepad.exe (using DOS filename syntax)
|
||||
wine c:\\windows\\notepad.exe (using DOS filename syntax)
|
||||
|
||||
wine ~/.wine/drive_c/windows/notepad.exe (using Unix filename syntax)
|
||||
wine ~/.wine/drive_c/windows/notepad.exe (using Unix filename syntax)
|
||||
|
||||
wine notepad.exe readme.txt (calling program with parameters)
|
||||
wine notepad.exe readme.txt (calling program with parameters)
|
||||
```
|
||||
|
||||
Wine is not perfect, so some programs may crash. If that happens you
|
||||
will get a crash log that you should attach to your report when filing
|
||||
a bug.
|
||||
|
||||
|
||||
7. GETTING MORE INFORMATION
|
||||
## GETTING MORE INFORMATION
|
||||
|
||||
WWW: A great deal of information about Wine is available from WineHQ at
|
||||
- **WWW**: A great deal of information about Wine is available from WineHQ at
|
||||
https://www.winehq.org/ : various Wine Guides, application database,
|
||||
bug tracking. This is probably the best starting point.
|
||||
|
||||
FAQ: The Wine FAQ is located at https://www.winehq.org/FAQ
|
||||
- **FAQ**: The Wine FAQ is located at https://www.winehq.org/FAQ
|
||||
|
||||
Wiki: The Wine Wiki is located at https://wiki.winehq.org
|
||||
- **Wiki**: The Wine Wiki is located at https://wiki.winehq.org
|
||||
|
||||
Gitlab: Wine development is hosted at https://gitlab.winehq.org
|
||||
- **Gitlab**: Wine development is hosted at https://gitlab.winehq.org
|
||||
|
||||
Mailing lists:
|
||||
- **Mailing lists**:
|
||||
There are several mailing lists for Wine users and developers;
|
||||
see https://www.winehq.org/forums for more information.
|
||||
|
||||
Bugs: Report bugs to Wine Bugzilla at https://bugs.winehq.org
|
||||
- **Bugs**: Report bugs to Wine Bugzilla at https://bugs.winehq.org
|
||||
Please search the bugzilla database to check whether your
|
||||
problem is already known or fixed before posting a bug report.
|
||||
|
||||
IRC: Online help is available at channel #WineHQ on irc.libera.chat.
|
||||
|
||||
--
|
||||
Alexandre Julliard
|
||||
julliard@winehq.org
|
||||
- **IRC**: Online help is available at channel `#WineHQ` on irc.libera.chat.
|
2
VERSION
2
VERSION
|
@ -1 +1 @@
|
|||
Wine version 9.0-rc3
|
||||
Wine version 9.5
|
||||
|
|
495
configure
vendored
495
configure
vendored
|
@ -1,6 +1,6 @@
|
|||
#! /bin/sh
|
||||
# Guess values for system-dependent variables and create Makefiles.
|
||||
# Generated by GNU Autoconf 2.71 for Wine 9.0-rc3.
|
||||
# Generated by GNU Autoconf 2.71 for Wine 9.5.
|
||||
#
|
||||
# Report bugs to <wine-devel@winehq.org>.
|
||||
#
|
||||
|
@ -611,8 +611,8 @@ MAKEFLAGS=
|
|||
# Identity of this package.
|
||||
PACKAGE_NAME='Wine'
|
||||
PACKAGE_TARNAME='wine'
|
||||
PACKAGE_VERSION='9.0-rc3'
|
||||
PACKAGE_STRING='Wine 9.0-rc3'
|
||||
PACKAGE_VERSION='9.5'
|
||||
PACKAGE_STRING='Wine 9.5'
|
||||
PACKAGE_BUGREPORT='wine-devel@winehq.org'
|
||||
PACKAGE_URL='https://www.winehq.org'
|
||||
|
||||
|
@ -702,6 +702,10 @@ INOTIFY_LIBS
|
|||
INOTIFY_CFLAGS
|
||||
PCSCLITE_LIBS
|
||||
PCAP_LIBS
|
||||
WAYLAND_EGL_LIBS
|
||||
WAYLAND_EGL_CFLAGS
|
||||
EGL_LIBS
|
||||
EGL_CFLAGS
|
||||
XKBREGISTRY_LIBS
|
||||
XKBREGISTRY_CFLAGS
|
||||
XKBCOMMON_LIBS
|
||||
|
@ -929,7 +933,6 @@ with_capi
|
|||
with_coreaudio
|
||||
with_cups
|
||||
with_dbus
|
||||
with_float_abi
|
||||
with_fontconfig
|
||||
with_freetype
|
||||
with_gettext
|
||||
|
@ -1233,6 +1236,7 @@ enable_midimap
|
|||
enable_mlang
|
||||
enable_mmcndmgr
|
||||
enable_mmdevapi
|
||||
enable_mouhid_sys
|
||||
enable_mountmgr_sys
|
||||
enable_mp3dmod
|
||||
enable_mpr
|
||||
|
@ -1493,6 +1497,7 @@ enable_windows_media
|
|||
enable_windows_networking_hostname
|
||||
enable_windows_networking
|
||||
enable_windows_perception_stub
|
||||
enable_windows_security_authentication_onlineid
|
||||
enable_windows_security_credentials_ui_userconsentverifier
|
||||
enable_windows_storage_applicationdata
|
||||
enable_windows_system_profile_systemmanufacturers
|
||||
|
@ -1802,6 +1807,10 @@ XKBCOMMON_CFLAGS
|
|||
XKBCOMMON_LIBS
|
||||
XKBREGISTRY_CFLAGS
|
||||
XKBREGISTRY_LIBS
|
||||
EGL_CFLAGS
|
||||
EGL_LIBS
|
||||
WAYLAND_EGL_CFLAGS
|
||||
WAYLAND_EGL_LIBS
|
||||
INOTIFY_CFLAGS
|
||||
INOTIFY_LIBS
|
||||
DBUS_CFLAGS
|
||||
|
@ -2388,7 +2397,7 @@ if test "$ac_init_help" = "long"; then
|
|||
# Omit some internal or obsolete options to make the list less imposing.
|
||||
# This message is too long to be a string in the A/UX 3.1 sh.
|
||||
cat <<_ACEOF
|
||||
\`configure' configures Wine 9.0-rc3 to adapt to many kinds of systems.
|
||||
\`configure' configures Wine 9.5 to adapt to many kinds of systems.
|
||||
|
||||
Usage: $0 [OPTION]... [VAR=VALUE]...
|
||||
|
||||
|
@ -2458,7 +2467,7 @@ fi
|
|||
|
||||
if test -n "$ac_init_help"; then
|
||||
case $ac_init_help in
|
||||
short | recursive ) echo "Configuration of Wine 9.0-rc3:";;
|
||||
short | recursive ) echo "Configuration of Wine 9.5:";;
|
||||
esac
|
||||
cat <<\_ACEOF
|
||||
|
||||
|
@ -2487,7 +2496,6 @@ Optional Packages:
|
|||
--without-coreaudio do not use the CoreAudio sound support
|
||||
--without-cups do not use CUPS
|
||||
--without-dbus do not use DBus (dynamic device support)
|
||||
--with-float-abi=abi specify the ABI (soft|softfp|hard) for ARM platforms
|
||||
--without-fontconfig do not use fontconfig
|
||||
--without-freetype do not use the FreeType library
|
||||
--without-gettext do not use gettext
|
||||
|
@ -2629,6 +2637,12 @@ Some influential environment variables:
|
|||
C compiler flags for xkbregistry, overriding pkg-config
|
||||
XKBREGISTRY_LIBS
|
||||
Linker flags for xkbregistry, overriding pkg-config
|
||||
EGL_CFLAGS C compiler flags for egl, overriding pkg-config
|
||||
EGL_LIBS Linker flags for egl, overriding pkg-config
|
||||
WAYLAND_EGL_CFLAGS
|
||||
C compiler flags for wayland-egl, overriding pkg-config
|
||||
WAYLAND_EGL_LIBS
|
||||
Linker flags for wayland-egl, overriding pkg-config
|
||||
INOTIFY_CFLAGS
|
||||
C compiler flags for libinotify, overriding pkg-config
|
||||
INOTIFY_LIBS
|
||||
|
@ -2756,7 +2770,7 @@ fi
|
|||
test -n "$ac_init_help" && exit $ac_status
|
||||
if $ac_init_version; then
|
||||
cat <<\_ACEOF
|
||||
Wine configure 9.0-rc3
|
||||
Wine configure 9.5
|
||||
generated by GNU Autoconf 2.71
|
||||
|
||||
Copyright (C) 2021 Free Software Foundation, Inc.
|
||||
|
@ -3207,7 +3221,7 @@ cat >config.log <<_ACEOF
|
|||
This file contains any messages produced by compilers while
|
||||
running configure, to aid debugging if configure makes a mistake.
|
||||
|
||||
It was created by Wine $as_me 9.0-rc3, which was
|
||||
It was created by Wine $as_me 9.5, which was
|
||||
generated by GNU Autoconf 2.71. Invocation command line was
|
||||
|
||||
$ $0$ac_configure_args_raw
|
||||
|
@ -4271,13 +4285,6 @@ then :
|
|||
fi
|
||||
|
||||
|
||||
# Check whether --with-float-abi was given.
|
||||
if test ${with_float_abi+y}
|
||||
then :
|
||||
withval=$with_float_abi;
|
||||
fi
|
||||
|
||||
|
||||
# Check whether --with-fontconfig was given.
|
||||
if test ${with_fontconfig+y}
|
||||
then :
|
||||
|
@ -6322,7 +6329,6 @@ printf "%s\n" "$wine_cv_cc_m32" >&6; }
|
|||
TARGETFLAGS="$TARGETFLAGS -m32"
|
||||
PKG_CONFIG_LIBDIR=${PKG_CONFIG_LIBDIR:-/usr/lib/i386-linux-gnu/pkgconfig:/usr/lib32/pkgconfig:/usr/lib/pkgconfig}
|
||||
export PKG_CONFIG_LIBDIR
|
||||
with_unwind=${with_unwind:-no}
|
||||
else
|
||||
CC="$CC -m64"
|
||||
CXX="$CXX -m64"
|
||||
|
@ -6363,24 +6369,11 @@ printf "%s\n" "$wine_cv_thumb2" >&6; }
|
|||
if test x"$wine_cv_thumb2" = xyes
|
||||
then
|
||||
CFLAGS="$CFLAGS -mthumb"
|
||||
TARGETFLAGS="$TARGETFLAGS -mthumb"
|
||||
else
|
||||
CFLAGS="$CFLAGS -marm"
|
||||
TARGETFLAGS="$TARGETFLAGS -marm"
|
||||
fi
|
||||
case $with_float_abi in
|
||||
soft|softfp|hard)
|
||||
float_abi=$with_float_abi ;;
|
||||
*)
|
||||
case $host_os in
|
||||
*eabihf)
|
||||
float_abi=hard ;;
|
||||
*)
|
||||
float_abi=softfp
|
||||
saved_CFLAGS=$CFLAGS
|
||||
CFLAGS="$CFLAGS -mfloat-abi=$float_abi"
|
||||
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $CC supports -mfloat-abi=$float_abi" >&5
|
||||
printf %s "checking whether $CC supports -mfloat-abi=$float_abi... " >&6; }
|
||||
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $CC supports floating point instructions" >&5
|
||||
printf %s "checking whether $CC supports floating point instructions... " >&6; }
|
||||
if test ${wine_cv_float_abi+y}
|
||||
then :
|
||||
printf %s "(cached) " >&6
|
||||
|
@ -6407,41 +6400,10 @@ rm -f core conftest.err conftest.$ac_objext conftest.beam \
|
|||
fi
|
||||
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $wine_cv_float_abi" >&5
|
||||
printf "%s\n" "$wine_cv_float_abi" >&6; }
|
||||
if test $wine_cv_float_abi = no
|
||||
then
|
||||
float_abi=soft
|
||||
as_fn_append wine_warnings "|Floating point is not supported for this target. The resulting build won't be compatible with Windows ARM binaries."
|
||||
fi
|
||||
CFLAGS=$saved_CFLAGS
|
||||
esac
|
||||
;;
|
||||
esac
|
||||
CFLAGS="$CFLAGS -mfloat-abi=$float_abi"
|
||||
TARGETFLAGS="$TARGETFLAGS -mfloat-abi=$float_abi"
|
||||
;;
|
||||
i[3456789]86*)
|
||||
with_unwind=${with_unwind:-no}
|
||||
test $wine_cv_float_abi != no || as_fn_error $? "The ARM target needs to support floating point instructions." "$LINENO" 5
|
||||
;;
|
||||
esac
|
||||
|
||||
enable_win16=${enable_win16:-i386}
|
||||
enable_win64=${enable_win64:-no}
|
||||
enable_wow64=${enable_wow64:-aarch64,x86_64}
|
||||
enable_wow64win=${enable_wow64win:-aarch64,x86_64}
|
||||
enable_wow64cpu=${enable_wow64cpu:-x86_64}
|
||||
enable_vcruntime140_1=${enable_vcruntime140_1:-x86_64,arm64ec}
|
||||
|
||||
enable_cmd=${enable_cmd:-yes}
|
||||
enable_dllhost=${enable_dllhost:-yes}
|
||||
enable_dpnsvr=${enable_dpnsvr:-i386,x86_64,arm64ec}
|
||||
enable_dxdiag=${enable_dxdiag:-yes}
|
||||
enable_msiexec=${enable_msiexec:-yes}
|
||||
enable_netsh=${enable_netsh:-yes}
|
||||
enable_regsvr32=${enable_regsvr32:-yes}
|
||||
enable_rundll32=${enable_rundll32:-yes}
|
||||
|
||||
enable_winetest=${enable_winetest:-$enable_tests}
|
||||
|
||||
if test "x$enable_win64" = "xyes"
|
||||
then
|
||||
test -z "$with_wine64" || as_fn_error $? "--enable-win64 and --with-wine64 are mutually exclusive.
|
||||
|
@ -7865,6 +7827,9 @@ rm -rf conftest*
|
|||
fi
|
||||
fi
|
||||
|
||||
test "$ac_cv_sys_file_offset_bits" = 64 &&
|
||||
printf "%s\n" "#define _TIME_BITS 64" >>confdefs.h
|
||||
|
||||
|
||||
ac_header= ac_cache=
|
||||
for ac_item in $ac_header_c_list
|
||||
|
@ -10109,9 +10074,6 @@ fi
|
|||
|
||||
printf "%s\n" "#define _GNU_SOURCE 1" >>confdefs.h
|
||||
|
||||
test "$ac_cv_sys_file_offset_bits" = 64 &&
|
||||
printf "%s\n" "#define _TIME_BITS 64" >>confdefs.h
|
||||
|
||||
if test $HOST_ARCH = i386
|
||||
then
|
||||
DLLFLAGS="$DLLFLAGS -fno-PIC"
|
||||
|
@ -10344,6 +10306,10 @@ else $as_nop
|
|||
fi
|
||||
fi
|
||||
|
||||
saved_CC=$CC
|
||||
saved_CFLAGS=$CFLAGS
|
||||
saved_LDFLAGS=$LDFLAGS
|
||||
|
||||
for wine_arch in $cross_archs
|
||||
do
|
||||
case "x$with_mingw" in
|
||||
|
@ -10607,10 +10573,6 @@ test -n "$x86_64_CC" || x86_64_CC="false"
|
|||
esac
|
||||
fi
|
||||
|
||||
saved_CC=$CC
|
||||
saved_CFLAGS=$CFLAGS
|
||||
saved_LDFLAGS=$LDFLAGS
|
||||
|
||||
CFLAGS=${CROSSCFLAGS:-"-g -O2"}
|
||||
LDFLAGS=$CROSSLDFLAGS
|
||||
eval CC=\$${wine_arch}_CC
|
||||
|
@ -10661,6 +10623,8 @@ then :
|
|||
while test $# -ge 1
|
||||
do
|
||||
case "$1" in
|
||||
*/*-gcc) target=`expr "$1" : '.*/\(.*\)-gcc'` ;;
|
||||
*/*-clang) target=`expr "$1" : '.*/\(.*\)-clang'` ;;
|
||||
*-gcc) target=`expr "$1" : '\(.*\)-gcc'` ;;
|
||||
*-clang) target=`expr "$1" : '\(.*\)-clang'` ;;
|
||||
esac
|
||||
|
@ -10769,12 +10733,9 @@ fi
|
|||
then
|
||||
if test ${enable_archs+y}
|
||||
then :
|
||||
as_fn_error $? "MinGW $wine_arch compiler not found.
|
||||
as_fn_error $? "$wine_arch PE cross-compiler not found.
|
||||
This is an error since --enable-archs=$wine_arch was requested." "$LINENO" 5
|
||||
fi
|
||||
CC=$saved_CC
|
||||
CFLAGS=$saved_CFLAGS
|
||||
LDFLAGS=$saved_LDFLAGS
|
||||
continue
|
||||
fi
|
||||
|
||||
|
@ -10818,12 +10779,9 @@ fi
|
|||
printf "%s\n" "none needed" >&6; } ;;
|
||||
xno) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5
|
||||
printf "%s\n" "unsupported" >&6; }
|
||||
CC=$saved_CC
|
||||
CFLAGS=$saved_CFLAGS
|
||||
LDFLAGS=$saved_LDFLAGS
|
||||
if test ${enable_archs+y}
|
||||
then :
|
||||
as_fn_error $? "MinGW $wine_arch compiler supporting C99 not found.
|
||||
as_fn_error $? "$wine_arch PE cross-compiler supporting C99 not found.
|
||||
This is an error since --enable-archs=$wine_arch was requested." "$LINENO" 5
|
||||
fi
|
||||
continue
|
||||
|
@ -10875,7 +10833,7 @@ then :
|
|||
else $as_nop
|
||||
if test ${enable_archs+y}
|
||||
then :
|
||||
as_fn_error $? "The $wine_arch cross-compiler doesn't support SEH directives.
|
||||
as_fn_error $? "The $wine_arch PE cross-compiler doesn't support SEH directives.
|
||||
This is an error since --enable-archs=$wine_arch was requested." "$LINENO" 5
|
||||
fi
|
||||
continue
|
||||
|
@ -11529,7 +11487,41 @@ if eval test \"x\$"$as_ac_var"\" = x"yes"
|
|||
then :
|
||||
as_fn_append ${wine_arch}_EXTRACFLAGS " -Wabsolute-value"
|
||||
fi }
|
||||
{ as_ac_var=`printf "%s\n" "ac_cv_${wine_arch}_cflags_-Wenum-conversion" | $as_tr_sh`
|
||||
{ as_ac_var=`printf "%s\n" "ac_cv_${wine_arch}_cflags_-Wenum-enum-conversion" | $as_tr_sh`
|
||||
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $CC supports -Wenum-enum-conversion" >&5
|
||||
printf %s "checking whether $CC supports -Wenum-enum-conversion... " >&6; }
|
||||
if eval test \${$as_ac_var+y}
|
||||
then :
|
||||
printf %s "(cached) " >&6
|
||||
else $as_nop
|
||||
ac_wine_try_cflags_saved=$CFLAGS
|
||||
ac_wine_try_cflags_saved_exeext=$ac_exeext
|
||||
CFLAGS="$CFLAGS -nostdlib -nodefaultlibs -Wenum-enum-conversion"
|
||||
ac_exeext=".exe"
|
||||
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
|
||||
/* end confdefs.h. */
|
||||
void *__os_arm64x_dispatch_ret = 0;
|
||||
int __cdecl mainCRTStartup(void) { return 0; }
|
||||
_ACEOF
|
||||
if ac_fn_c_try_link "$LINENO"
|
||||
then :
|
||||
eval "$as_ac_var=yes"
|
||||
else $as_nop
|
||||
eval "$as_ac_var=no"
|
||||
fi
|
||||
rm -f core conftest.err conftest.$ac_objext conftest.beam \
|
||||
conftest$ac_exeext conftest.$ac_ext
|
||||
CFLAGS=$ac_wine_try_cflags_saved
|
||||
ac_exeext=$ac_wine_try_cflags_saved_exeext
|
||||
fi
|
||||
eval ac_res=\$$as_ac_var
|
||||
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
|
||||
printf "%s\n" "$ac_res" >&6; }
|
||||
if eval test \"x\$"$as_ac_var"\" = x"yes"
|
||||
then :
|
||||
:
|
||||
else $as_nop
|
||||
{ as_ac_var=`printf "%s\n" "ac_cv_${wine_arch}_cflags_-Wenum-conversion" | $as_tr_sh`
|
||||
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $CC supports -Wenum-conversion" >&5
|
||||
printf %s "checking whether $CC supports -Wenum-conversion... " >&6; }
|
||||
if eval test \${$as_ac_var+y}
|
||||
|
@ -11563,6 +11555,42 @@ if eval test \"x\$"$as_ac_var"\" = x"yes"
|
|||
then :
|
||||
as_fn_append ${wine_arch}_EXTRACFLAGS " -Wenum-conversion"
|
||||
fi }
|
||||
fi }
|
||||
|
||||
{ as_ac_var=`printf "%s\n" "ac_cv_${wine_arch}_cflags_-flarge-source-files -Wmisleading-indentation" | $as_tr_sh`
|
||||
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $CC supports -flarge-source-files -Wmisleading-indentation" >&5
|
||||
printf %s "checking whether $CC supports -flarge-source-files -Wmisleading-indentation... " >&6; }
|
||||
if eval test \${$as_ac_var+y}
|
||||
then :
|
||||
printf %s "(cached) " >&6
|
||||
else $as_nop
|
||||
ac_wine_try_cflags_saved=$CFLAGS
|
||||
ac_wine_try_cflags_saved_exeext=$ac_exeext
|
||||
CFLAGS="$CFLAGS -nostdlib -nodefaultlibs -flarge-source-files -Wmisleading-indentation"
|
||||
ac_exeext=".exe"
|
||||
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
|
||||
/* end confdefs.h. */
|
||||
void *__os_arm64x_dispatch_ret = 0;
|
||||
int __cdecl mainCRTStartup(void) { return 0; }
|
||||
_ACEOF
|
||||
if ac_fn_c_try_link "$LINENO"
|
||||
then :
|
||||
eval "$as_ac_var=yes"
|
||||
else $as_nop
|
||||
eval "$as_ac_var=no"
|
||||
fi
|
||||
rm -f core conftest.err conftest.$ac_objext conftest.beam \
|
||||
conftest$ac_exeext conftest.$ac_ext
|
||||
CFLAGS=$ac_wine_try_cflags_saved
|
||||
ac_exeext=$ac_wine_try_cflags_saved_exeext
|
||||
fi
|
||||
eval ac_res=\$$as_ac_var
|
||||
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
|
||||
printf "%s\n" "$ac_res" >&6; }
|
||||
if eval test \"x\$"$as_ac_var"\" = x"yes"
|
||||
then :
|
||||
as_fn_append ${wine_arch}_EXTRACFLAGS " -Wno-misleading-indentation"
|
||||
fi }
|
||||
|
||||
case $wine_arch in
|
||||
i386) { as_ac_var=`printf "%s\n" "ac_cv_${wine_arch}_cflags_-fno-omit-frame-pointer" | $as_tr_sh`
|
||||
|
@ -11968,16 +11996,17 @@ then :
|
|||
as_fn_append ${wine_arch}_LDFLAGS " -Wl,--build-id"
|
||||
fi }
|
||||
|
||||
CC=$saved_CC
|
||||
CFLAGS=$saved_CFLAGS
|
||||
LDFLAGS=$saved_LDFLAGS
|
||||
done
|
||||
|
||||
if test $HOST_ARCH = aarch64
|
||||
then
|
||||
test "x$PE_ARCHS" != x || as_fn_error $? "PE cross-compilation is required for ARM64, please install clang/llvm-dlltool/lld, or llvm-mingw." "$LINENO" 5
|
||||
DLLEXT=""
|
||||
fi
|
||||
CC=$saved_CC
|
||||
CFLAGS=$saved_CFLAGS
|
||||
LDFLAGS=$saved_LDFLAGS
|
||||
|
||||
case $HOST_ARCH in
|
||||
arm|aarch64)
|
||||
test "x$PE_ARCHS" != x || as_fn_error $? "PE cross-compilation is required for $HOST_ARCH, please install clang/llvm-dlltool/lld, or llvm-mingw." "$LINENO" 5
|
||||
DLLEXT="" ;;
|
||||
esac
|
||||
|
||||
|
||||
if test "x$with_system_dllpath" != "x" -a -n "$PE_ARCHS"
|
||||
|
@ -13293,8 +13322,8 @@ then :
|
|||
else $as_nop
|
||||
:
|
||||
fi
|
||||
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for vkd3d_shader_serialize_dxbc in MinGW -lvkd3d-shader" >&5
|
||||
printf %s "checking for vkd3d_shader_serialize_dxbc in MinGW -lvkd3d-shader... " >&6; }
|
||||
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for vkd3d_shader_build_varying_map in MinGW -lvkd3d-shader" >&5
|
||||
printf %s "checking for vkd3d_shader_build_varying_map in MinGW -lvkd3d-shader... " >&6; }
|
||||
if test ${ac_cv_mingw_lib_vkd3d_shader+y}
|
||||
then :
|
||||
printf %s "(cached) " >&6
|
||||
|
@ -13311,11 +13340,11 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
|
|||
/* Override any GCC internal prototype to avoid an error.
|
||||
Use char because int might match the return type of a GCC
|
||||
builtin and then its argument prototype would still apply. */
|
||||
char vkd3d_shader_serialize_dxbc ();
|
||||
char vkd3d_shader_build_varying_map ();
|
||||
int
|
||||
main (void)
|
||||
{
|
||||
return vkd3d_shader_serialize_dxbc ();
|
||||
return vkd3d_shader_build_varying_map ();
|
||||
;
|
||||
return 0;
|
||||
}
|
||||
|
@ -13577,7 +13606,7 @@ then :
|
|||
MPG123_PE_LIBS=mpg123
|
||||
if ${MPG123_PE_CFLAGS:+false} :
|
||||
then :
|
||||
MPG123_PE_CFLAGS="-I\$(top_srcdir)/libs/mpg123/src/libmpg123"
|
||||
MPG123_PE_CFLAGS="-I\$(top_srcdir)/libs/mpg123/src/include"
|
||||
else $as_nop
|
||||
enable_mpg123=no
|
||||
fi
|
||||
|
@ -16174,6 +16203,188 @@ fi
|
|||
|
||||
CPPFLAGS=$ac_save_CPPFLAGS
|
||||
|
||||
if test "x$with_opengl" != "xno"
|
||||
then
|
||||
rm -f conftest.err
|
||||
if ${EGL_CFLAGS:+false} :
|
||||
then :
|
||||
if test ${PKG_CONFIG+y}
|
||||
then :
|
||||
EGL_CFLAGS=`$PKG_CONFIG --cflags egl 2>conftest.err`
|
||||
fi
|
||||
fi
|
||||
|
||||
if ${EGL_LIBS:+false} :
|
||||
then :
|
||||
if test ${PKG_CONFIG+y}
|
||||
then :
|
||||
EGL_LIBS=`$PKG_CONFIG --libs egl 2>/dev/null`
|
||||
fi
|
||||
fi
|
||||
|
||||
EGL_LIBS=${EGL_LIBS:-"-lEGL"}
|
||||
printf "%s\n" "$as_me:${as_lineno-$LINENO}: egl cflags: $EGL_CFLAGS" >&5
|
||||
printf "%s\n" "$as_me:${as_lineno-$LINENO}: egl libs: $EGL_LIBS" >&5
|
||||
if test -s conftest.err; then
|
||||
printf %s "$as_me:${as_lineno-$LINENO}: egl errors: " >&5
|
||||
cat conftest.err >&5
|
||||
fi
|
||||
rm -f conftest.err
|
||||
ac_save_CPPFLAGS=$CPPFLAGS
|
||||
CPPFLAGS="$CPPFLAGS $EGL_CFLAGS"
|
||||
ac_fn_c_check_header_compile "$LINENO" "EGL/egl.h" "ac_cv_header_EGL_egl_h" "$ac_includes_default"
|
||||
if test "x$ac_cv_header_EGL_egl_h" = xyes
|
||||
then :
|
||||
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for -lEGL" >&5
|
||||
printf %s "checking for -lEGL... " >&6; }
|
||||
if test ${ac_cv_lib_soname_EGL+y}
|
||||
then :
|
||||
printf %s "(cached) " >&6
|
||||
else $as_nop
|
||||
ac_check_soname_save_LIBS=$LIBS
|
||||
LIBS="-lEGL $EGL_LIBS $LIBS"
|
||||
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
|
||||
/* end confdefs.h. */
|
||||
|
||||
/* Override any GCC internal prototype to avoid an error.
|
||||
Use char because int might match the return type of a GCC
|
||||
builtin and then its argument prototype would still apply. */
|
||||
char eglGetProcAddress ();
|
||||
int
|
||||
main (void)
|
||||
{
|
||||
return eglGetProcAddress ();
|
||||
;
|
||||
return 0;
|
||||
}
|
||||
_ACEOF
|
||||
if ac_fn_c_try_link "$LINENO"
|
||||
then :
|
||||
case "$LIBEXT" in
|
||||
dll) ac_cv_lib_soname_EGL=`$ac_cv_path_LDD conftest.exe | grep "EGL" | sed -e "s/dll.*/dll/"';2,$d'` ;;
|
||||
dylib) ac_cv_lib_soname_EGL=`$OTOOL -L conftest$ac_exeext | grep "libEGL\\.[0-9A-Za-z.]*dylib" | sed -e "s/^.*\/\(libEGL\.[0-9A-Za-z.]*dylib\).*$/\1/"';2,$d'` ;;
|
||||
*) ac_cv_lib_soname_EGL=`$READELF -d conftest$ac_exeext | grep "NEEDED.*libEGL\\.$LIBEXT" | sed -e "s/^.*\\[\\(libEGL\\.$LIBEXT[^ ]*\\)\\].*$/\1/"';2,$d'`
|
||||
if ${ac_cv_lib_soname_EGL:+false} :
|
||||
then :
|
||||
ac_cv_lib_soname_EGL=`$LDD conftest$ac_exeext | grep "libEGL\\.$LIBEXT" | sed -e "s/^.*\(libEGL\.$LIBEXT[^ ]*\).*$/\1/"';2,$d'`
|
||||
fi ;;
|
||||
esac
|
||||
else $as_nop
|
||||
ac_cv_lib_soname_EGL=
|
||||
fi
|
||||
rm -f core conftest.err conftest.$ac_objext conftest.beam \
|
||||
conftest$ac_exeext conftest.$ac_ext
|
||||
LIBS=$ac_check_soname_save_LIBS
|
||||
fi
|
||||
if ${ac_cv_lib_soname_EGL:+false} :
|
||||
then :
|
||||
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: not found" >&5
|
||||
printf "%s\n" "not found" >&6; }
|
||||
|
||||
else $as_nop
|
||||
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_soname_EGL" >&5
|
||||
printf "%s\n" "$ac_cv_lib_soname_EGL" >&6; }
|
||||
|
||||
printf "%s\n" "#define SONAME_LIBEGL \"$ac_cv_lib_soname_EGL\"" >>confdefs.h
|
||||
|
||||
|
||||
fi
|
||||
fi
|
||||
|
||||
CPPFLAGS=$ac_save_CPPFLAGS
|
||||
|
||||
rm -f conftest.err
|
||||
if ${WAYLAND_EGL_CFLAGS:+false} :
|
||||
then :
|
||||
if test ${PKG_CONFIG+y}
|
||||
then :
|
||||
WAYLAND_EGL_CFLAGS=`$PKG_CONFIG --cflags wayland-egl 2>conftest.err`
|
||||
fi
|
||||
fi
|
||||
|
||||
if ${WAYLAND_EGL_LIBS:+false} :
|
||||
then :
|
||||
if test ${PKG_CONFIG+y}
|
||||
then :
|
||||
WAYLAND_EGL_LIBS=`$PKG_CONFIG --libs wayland-egl 2>/dev/null`
|
||||
fi
|
||||
fi
|
||||
|
||||
|
||||
printf "%s\n" "$as_me:${as_lineno-$LINENO}: wayland-egl cflags: $WAYLAND_EGL_CFLAGS" >&5
|
||||
printf "%s\n" "$as_me:${as_lineno-$LINENO}: wayland-egl libs: $WAYLAND_EGL_LIBS" >&5
|
||||
if test -s conftest.err; then
|
||||
printf %s "$as_me:${as_lineno-$LINENO}: wayland-egl errors: " >&5
|
||||
cat conftest.err >&5
|
||||
fi
|
||||
rm -f conftest.err
|
||||
ac_save_CPPFLAGS=$CPPFLAGS
|
||||
CPPFLAGS="$CPPFLAGS $WAYLAND_EGL_CFLAGS"
|
||||
ac_fn_c_check_header_compile "$LINENO" "wayland-egl.h" "ac_cv_header_wayland_egl_h" "$ac_includes_default"
|
||||
if test "x$ac_cv_header_wayland_egl_h" = xyes
|
||||
then :
|
||||
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for wl_egl_window_create in -lwayland-egl" >&5
|
||||
printf %s "checking for wl_egl_window_create in -lwayland-egl... " >&6; }
|
||||
if test ${ac_cv_lib_wayland_egl_wl_egl_window_create+y}
|
||||
then :
|
||||
printf %s "(cached) " >&6
|
||||
else $as_nop
|
||||
ac_check_lib_save_LIBS=$LIBS
|
||||
LIBS="-lwayland-egl $WAYLAND_EGL_LIBS $LIBS"
|
||||
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
|
||||
/* end confdefs.h. */
|
||||
|
||||
/* Override any GCC internal prototype to avoid an error.
|
||||
Use char because int might match the return type of a GCC
|
||||
builtin and then its argument prototype would still apply. */
|
||||
char wl_egl_window_create ();
|
||||
int
|
||||
main (void)
|
||||
{
|
||||
return wl_egl_window_create ();
|
||||
;
|
||||
return 0;
|
||||
}
|
||||
_ACEOF
|
||||
if ac_fn_c_try_link "$LINENO"
|
||||
then :
|
||||
ac_cv_lib_wayland_egl_wl_egl_window_create=yes
|
||||
else $as_nop
|
||||
ac_cv_lib_wayland_egl_wl_egl_window_create=no
|
||||
fi
|
||||
rm -f core conftest.err conftest.$ac_objext conftest.beam \
|
||||
conftest$ac_exeext conftest.$ac_ext
|
||||
LIBS=$ac_check_lib_save_LIBS
|
||||
fi
|
||||
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_wayland_egl_wl_egl_window_create" >&5
|
||||
printf "%s\n" "$ac_cv_lib_wayland_egl_wl_egl_window_create" >&6; }
|
||||
if test "x$ac_cv_lib_wayland_egl_wl_egl_window_create" = xyes
|
||||
then :
|
||||
|
||||
printf "%s\n" "#define HAVE_LIBWAYLAND_EGL 1" >>confdefs.h
|
||||
|
||||
else $as_nop
|
||||
WAYLAND_EGL_LIBS=""
|
||||
fi
|
||||
|
||||
fi
|
||||
|
||||
CPPFLAGS=$ac_save_CPPFLAGS
|
||||
|
||||
if test "x$with_wayland" != "x"
|
||||
then
|
||||
if test -z "$ac_cv_lib_soname_EGL" -o "$ac_cv_lib_wayland_egl_wl_egl_window_create" != yes
|
||||
then :
|
||||
case "x$with_opengl" in
|
||||
x) as_fn_append wine_notices "|EGL ${notice_platform}development files not found, the Wayland driver won't support OpenGL" ;;
|
||||
xno) ;;
|
||||
*) as_fn_error $? "EGL ${notice_platform}development files not found, the Wayland driver won't support OpenGL
|
||||
This is an error since --with-opengl was requested." "$LINENO" 5 ;;
|
||||
esac
|
||||
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
if test -z "$WAYLAND_CLIENT_LIBS" -o -z "$WAYLAND_SCANNER" -o -z "$XKBCOMMON_LIBS" -o -z "$XKBREGISTRY_LIBS" -o "$ac_cv_header_linux_input_h" = "no"
|
||||
then :
|
||||
|
@ -17862,8 +18073,10 @@ esac
|
|||
|
||||
fi
|
||||
|
||||
if test "x$with_unwind" != xno
|
||||
if test $HOST_ARCH = x86_64
|
||||
then
|
||||
if test "x$with_unwind" != xno
|
||||
then
|
||||
rm -f conftest.err
|
||||
if ${UNWIND_CFLAGS:+false} :
|
||||
then :
|
||||
|
@ -17965,9 +18178,9 @@ printf "%s\n" "#define HAVE_LIBUNWIND 1" >>confdefs.h
|
|||
fi
|
||||
CPPFLAGS=$ac_save_CPPFLAGS
|
||||
|
||||
fi
|
||||
case $host in
|
||||
aarch64*|*-darwin*)
|
||||
fi
|
||||
case $host in
|
||||
*-darwin*)
|
||||
if test "x$wine_cv_have_unw_step$wine_cv_have_libunwind_unw_step" = xnono
|
||||
then :
|
||||
case "x$with_unwind" in
|
||||
|
@ -17978,7 +18191,8 @@ This is an error since --with-unwind was requested." "$LINENO" 5 ;;
|
|||
esac
|
||||
|
||||
fi ;;
|
||||
esac
|
||||
esac
|
||||
fi
|
||||
|
||||
if test "x$with_sdl" != "xno"
|
||||
then
|
||||
|
@ -18953,6 +19167,7 @@ printf "%s\n" "$ac_cv_lib_soname_MoltenVK" >&6; }
|
|||
|
||||
printf "%s\n" "#define SONAME_LIBMOLTENVK \"$ac_cv_lib_soname_MoltenVK\"" >>confdefs.h
|
||||
|
||||
printf "%s\n" "#define SONAME_LIBVULKAN \"$ac_cv_lib_soname_MoltenVK\"" >>confdefs.h
|
||||
|
||||
fi
|
||||
fi
|
||||
|
@ -19507,6 +19722,35 @@ then :
|
|||
EXTRACFLAGS="$EXTRACFLAGS -Wwrite-strings"
|
||||
fi
|
||||
|
||||
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the compiler supports -flarge-source-files -Wmisleading-indentation" >&5
|
||||
printf %s "checking whether the compiler supports -flarge-source-files -Wmisleading-indentation... " >&6; }
|
||||
if test ${ac_cv_cflags__flarge_source_files__Wmisleading_indentation+y}
|
||||
then :
|
||||
printf %s "(cached) " >&6
|
||||
else $as_nop
|
||||
ac_wine_try_cflags_saved=$CFLAGS
|
||||
CFLAGS="$CFLAGS -flarge-source-files -Wmisleading-indentation"
|
||||
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
|
||||
/* end confdefs.h. */
|
||||
int main(int argc, char **argv) { return 0; }
|
||||
_ACEOF
|
||||
if ac_fn_c_try_link "$LINENO"
|
||||
then :
|
||||
ac_cv_cflags__flarge_source_files__Wmisleading_indentation=yes
|
||||
else $as_nop
|
||||
ac_cv_cflags__flarge_source_files__Wmisleading_indentation=no
|
||||
fi
|
||||
rm -f core conftest.err conftest.$ac_objext conftest.beam \
|
||||
conftest$ac_exeext conftest.$ac_ext
|
||||
CFLAGS=$ac_wine_try_cflags_saved
|
||||
fi
|
||||
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cflags__flarge_source_files__Wmisleading_indentation" >&5
|
||||
printf "%s\n" "$ac_cv_cflags__flarge_source_files__Wmisleading_indentation" >&6; }
|
||||
if test "x$ac_cv_cflags__flarge_source_files__Wmisleading_indentation" = xyes
|
||||
then :
|
||||
EXTRACFLAGS="$EXTRACFLAGS -Wno-misleading-indentation"
|
||||
fi
|
||||
|
||||
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the compiler supports -Wpointer-arith" >&5
|
||||
printf %s "checking whether the compiler supports -Wpointer-arith... " >&6; }
|
||||
if test ${ac_cv_cflags__Wpointer_arith+y}
|
||||
|
@ -20788,19 +21032,6 @@ printf "%s\n" "#define HAVE_LINUX_GETHOSTBYNAME_R_6 1" >>confdefs.h
|
|||
|
||||
fi
|
||||
|
||||
ac_fn_c_check_member "$LINENO" "struct msghdr" "msg_accrights" "ac_cv_member_struct_msghdr_msg_accrights" "#include <sys/types.h>
|
||||
#include <sys/socket.h>
|
||||
#ifdef HAVE_SYS_UN_H
|
||||
# include <sys/un.h>
|
||||
#endif
|
||||
"
|
||||
if test "x$ac_cv_member_struct_msghdr_msg_accrights" = xyes
|
||||
then :
|
||||
|
||||
printf "%s\n" "#define HAVE_STRUCT_MSGHDR_MSG_ACCRIGHTS 1" >>confdefs.h
|
||||
|
||||
|
||||
fi
|
||||
ac_fn_c_check_member "$LINENO" "struct sockaddr_un" "sun_len" "ac_cv_member_struct_sockaddr_un_sun_len" "#include <sys/types.h>
|
||||
#include <sys/socket.h>
|
||||
#ifdef HAVE_SYS_UN_H
|
||||
|
@ -21558,6 +21789,32 @@ fi ;;
|
|||
esac
|
||||
|
||||
|
||||
enable_win16=${enable_win16:-i386}
|
||||
enable_vcruntime140_1=${enable_vcruntime140_1:-x86_64,arm64ec}
|
||||
|
||||
if test -n "$PE_ARCHS"
|
||||
then
|
||||
enable_wow64=${enable_wow64:-aarch64,x86_64}
|
||||
enable_wow64win=${enable_wow64win:-aarch64,x86_64}
|
||||
enable_wow64cpu=${enable_wow64cpu:-x86_64}
|
||||
else
|
||||
enable_wow64=${enable_wow64:-no}
|
||||
enable_wow64win=${enable_wow64win:-no}
|
||||
enable_wow64cpu=${enable_wow64cpu:-no}
|
||||
fi
|
||||
|
||||
enable_cmd=${enable_cmd:-yes}
|
||||
enable_dllhost=${enable_dllhost:-yes}
|
||||
enable_dpnsvr=${enable_dpnsvr:-i386,x86_64,arm64ec}
|
||||
enable_dxdiag=${enable_dxdiag:-yes}
|
||||
enable_msiexec=${enable_msiexec:-yes}
|
||||
enable_netsh=${enable_netsh:-yes}
|
||||
enable_regsvr32=${enable_regsvr32:-yes}
|
||||
enable_rundll32=${enable_rundll32:-yes}
|
||||
|
||||
enable_winetest=${enable_winetest:-$enable_tests}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
@ -21867,6 +22124,7 @@ wine_fn_config_makefile dlls/gdiplus/tests enable_tests
|
|||
wine_fn_config_makefile dlls/geolocation enable_geolocation
|
||||
wine_fn_config_makefile dlls/geolocation/tests enable_tests
|
||||
wine_fn_config_makefile dlls/glu32 enable_glu32
|
||||
wine_fn_config_makefile dlls/glu32/tests enable_tests
|
||||
wine_fn_config_makefile dlls/gphoto2.ds enable_gphoto2_ds
|
||||
wine_fn_config_makefile dlls/gpkcsp enable_gpkcsp
|
||||
wine_fn_config_makefile dlls/graphicscapture enable_graphicscapture
|
||||
|
@ -21978,6 +22236,7 @@ wine_fn_config_makefile dlls/mmdevapi/tests enable_tests
|
|||
wine_fn_config_makefile dlls/mmdevldr.vxd enable_win16
|
||||
wine_fn_config_makefile dlls/mmsystem.dll16 enable_win16
|
||||
wine_fn_config_makefile dlls/monodebg.vxd enable_win16
|
||||
wine_fn_config_makefile dlls/mouhid.sys enable_mouhid_sys
|
||||
wine_fn_config_makefile dlls/mountmgr.sys enable_mountmgr_sys
|
||||
wine_fn_config_makefile dlls/mouse.drv16 enable_win16
|
||||
wine_fn_config_makefile dlls/mp3dmod enable_mp3dmod
|
||||
|
@ -22059,6 +22318,7 @@ wine_fn_config_makefile dlls/msvcp140/tests enable_tests
|
|||
wine_fn_config_makefile dlls/msvcp140_1 enable_msvcp140_1
|
||||
wine_fn_config_makefile dlls/msvcp140_1/tests enable_tests
|
||||
wine_fn_config_makefile dlls/msvcp140_2 enable_msvcp140_2
|
||||
wine_fn_config_makefile dlls/msvcp140_2/tests enable_tests
|
||||
wine_fn_config_makefile dlls/msvcp140_atomic_wait enable_msvcp140_atomic_wait
|
||||
wine_fn_config_makefile dlls/msvcp140_atomic_wait/tests enable_tests
|
||||
wine_fn_config_makefile dlls/msvcp140_codecvt_ids enable_msvcp140_codecvt_ids
|
||||
|
@ -22407,6 +22667,8 @@ wine_fn_config_makefile dlls/windows.networking.hostname/tests enable_tests
|
|||
wine_fn_config_makefile dlls/windows.networking enable_windows_networking
|
||||
wine_fn_config_makefile dlls/windows.perception.stub enable_windows_perception_stub
|
||||
wine_fn_config_makefile dlls/windows.perception.stub/tests enable_tests
|
||||
wine_fn_config_makefile dlls/windows.security.authentication.onlineid enable_windows_security_authentication_onlineid
|
||||
wine_fn_config_makefile dlls/windows.security.authentication.onlineid/tests enable_tests
|
||||
wine_fn_config_makefile dlls/windows.security.credentials.ui.userconsentverifier enable_windows_security_credentials_ui_userconsentverifier
|
||||
wine_fn_config_makefile dlls/windows.security.credentials.ui.userconsentverifier/tests enable_tests
|
||||
wine_fn_config_makefile dlls/windows.storage.applicationdata enable_windows_storage_applicationdata
|
||||
|
@ -22440,6 +22702,7 @@ wine_fn_config_makefile dlls/winex11.drv enable_winex11_drv
|
|||
wine_fn_config_makefile dlls/winexinput.sys enable_winexinput_sys
|
||||
wine_fn_config_makefile dlls/wing.dll16 enable_win16
|
||||
wine_fn_config_makefile dlls/wing32 enable_wing32
|
||||
wine_fn_config_makefile dlls/wing32/tests enable_tests
|
||||
wine_fn_config_makefile dlls/winhttp enable_winhttp
|
||||
wine_fn_config_makefile dlls/winhttp/tests enable_tests
|
||||
wine_fn_config_makefile dlls/wininet enable_wininet
|
||||
|
@ -23361,7 +23624,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
|
|||
# report actual input values of CONFIG_FILES etc. instead of their
|
||||
# values after options handling.
|
||||
ac_log="
|
||||
This file was extended by Wine $as_me 9.0-rc3, which was
|
||||
This file was extended by Wine $as_me 9.5, which was
|
||||
generated by GNU Autoconf 2.71. Invocation command line was
|
||||
|
||||
CONFIG_FILES = $CONFIG_FILES
|
||||
|
@ -23425,7 +23688,7 @@ ac_cs_config_escaped=`printf "%s\n" "$ac_cs_config" | sed "s/^ //; s/'/'\\\\\\\\
|
|||
cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
|
||||
ac_cs_config='$ac_cs_config_escaped'
|
||||
ac_cs_version="\\
|
||||
Wine config.status 9.0-rc3
|
||||
Wine config.status 9.5
|
||||
configured by $0, generated by GNU Autoconf 2.71,
|
||||
with options \\"\$ac_cs_config\\"
|
||||
|
||||
|
@ -23766,6 +24029,10 @@ XKBCOMMON_CFLAGS = $XKBCOMMON_CFLAGS
|
|||
XKBCOMMON_LIBS = $XKBCOMMON_LIBS
|
||||
XKBREGISTRY_CFLAGS = $XKBREGISTRY_CFLAGS
|
||||
XKBREGISTRY_LIBS = $XKBREGISTRY_LIBS
|
||||
EGL_CFLAGS = $EGL_CFLAGS
|
||||
EGL_LIBS = $EGL_LIBS
|
||||
WAYLAND_EGL_CFLAGS = $WAYLAND_EGL_CFLAGS
|
||||
WAYLAND_EGL_LIBS = $WAYLAND_EGL_LIBS
|
||||
PCAP_LIBS = $PCAP_LIBS
|
||||
PCSCLITE_LIBS = $PCSCLITE_LIBS
|
||||
INOTIFY_CFLAGS = $INOTIFY_CFLAGS
|
||||
|
|
175
configure.ac
175
configure.ac
|
@ -29,7 +29,6 @@ AC_ARG_WITH(capi, AS_HELP_STRING([--without-capi],[do not use CAPI (ISDN su
|
|||
AC_ARG_WITH(coreaudio, AS_HELP_STRING([--without-coreaudio],[do not use the CoreAudio sound support]))
|
||||
AC_ARG_WITH(cups, AS_HELP_STRING([--without-cups],[do not use CUPS]))
|
||||
AC_ARG_WITH(dbus, AS_HELP_STRING([--without-dbus],[do not use DBus (dynamic device support)]))
|
||||
AC_ARG_WITH(float-abi, AS_HELP_STRING([--with-float-abi=abi],[specify the ABI (soft|softfp|hard) for ARM platforms]))
|
||||
AC_ARG_WITH(fontconfig,AS_HELP_STRING([--without-fontconfig],[do not use fontconfig]))
|
||||
AC_ARG_WITH(freetype, AS_HELP_STRING([--without-freetype],[do not use the FreeType library]))
|
||||
AC_ARG_WITH(gettext, AS_HELP_STRING([--without-gettext],[do not use gettext]))
|
||||
|
@ -131,7 +130,6 @@ case $host in
|
|||
TARGETFLAGS="$TARGETFLAGS -m32"
|
||||
PKG_CONFIG_LIBDIR=${PKG_CONFIG_LIBDIR:-/usr/lib/i386-linux-gnu/pkgconfig:/usr/lib32/pkgconfig:/usr/lib/pkgconfig}
|
||||
export PKG_CONFIG_LIBDIR
|
||||
with_unwind=${with_unwind:-no}
|
||||
else
|
||||
CC="$CC -m64"
|
||||
CXX="$CXX -m64"
|
||||
|
@ -147,61 +145,15 @@ case $host in
|
|||
if test x"$wine_cv_thumb2" = xyes
|
||||
then
|
||||
CFLAGS="$CFLAGS -mthumb"
|
||||
TARGETFLAGS="$TARGETFLAGS -mthumb"
|
||||
else
|
||||
CFLAGS="$CFLAGS -marm"
|
||||
TARGETFLAGS="$TARGETFLAGS -marm"
|
||||
fi
|
||||
case $with_float_abi in
|
||||
soft|softfp|hard)
|
||||
float_abi=$with_float_abi ;;
|
||||
*)
|
||||
case $host_os in
|
||||
*eabihf)
|
||||
float_abi=hard ;;
|
||||
*)
|
||||
float_abi=softfp
|
||||
saved_CFLAGS=$CFLAGS
|
||||
CFLAGS="$CFLAGS -mfloat-abi=$float_abi"
|
||||
AC_CACHE_CHECK([whether $CC supports -mfloat-abi=$float_abi],wine_cv_float_abi,
|
||||
[WINE_TRY_ASM_LINK(["vmrs r2,fpscr"],,,[wine_cv_float_abi=yes],[wine_cv_float_abi=no])])
|
||||
if test $wine_cv_float_abi = no
|
||||
then
|
||||
float_abi=soft
|
||||
WINE_WARNING([Floating point is not supported for this target. The resulting build won't be compatible with Windows ARM binaries.])
|
||||
fi
|
||||
CFLAGS=$saved_CFLAGS
|
||||
esac
|
||||
;;
|
||||
esac
|
||||
CFLAGS="$CFLAGS -mfloat-abi=$float_abi"
|
||||
TARGETFLAGS="$TARGETFLAGS -mfloat-abi=$float_abi"
|
||||
;;
|
||||
i[[3456789]]86*)
|
||||
with_unwind=${with_unwind:-no}
|
||||
AC_CACHE_CHECK([whether $CC supports floating point instructions],wine_cv_float_abi,
|
||||
[WINE_TRY_ASM_LINK(["vmrs r2,fpscr"],,,[wine_cv_float_abi=yes],[wine_cv_float_abi=no])])
|
||||
test $wine_cv_float_abi != no || AC_MSG_ERROR([The ARM target needs to support floating point instructions.])
|
||||
;;
|
||||
esac
|
||||
|
||||
enable_win16=${enable_win16:-i386}
|
||||
enable_win64=${enable_win64:-no}
|
||||
enable_wow64=${enable_wow64:-aarch64,x86_64}
|
||||
enable_wow64win=${enable_wow64win:-aarch64,x86_64}
|
||||
enable_wow64cpu=${enable_wow64cpu:-x86_64}
|
||||
enable_vcruntime140_1=${enable_vcruntime140_1:-x86_64,arm64ec}
|
||||
|
||||
dnl Explicitly enable some programs for arm64ec
|
||||
enable_cmd=${enable_cmd:-yes}
|
||||
enable_dllhost=${enable_dllhost:-yes}
|
||||
enable_dpnsvr=${enable_dpnsvr:-i386,x86_64,arm64ec}
|
||||
enable_dxdiag=${enable_dxdiag:-yes}
|
||||
enable_msiexec=${enable_msiexec:-yes}
|
||||
enable_netsh=${enable_netsh:-yes}
|
||||
enable_regsvr32=${enable_regsvr32:-yes}
|
||||
enable_rundll32=${enable_rundll32:-yes}
|
||||
|
||||
dnl Disable winetest too if tests are disabled
|
||||
enable_winetest=${enable_winetest:-$enable_tests}
|
||||
|
||||
dnl Some special cases for the 64-bit build
|
||||
if test "x$enable_win64" = "xyes"
|
||||
then
|
||||
|
@ -408,6 +360,7 @@ AC_SUBST(OPENGL_LIBS,"")
|
|||
dnl **** Check for header files ****
|
||||
|
||||
AC_SYS_LARGEFILE()
|
||||
m4_ifdef([AC_SYS_YEAR2038],[AC_SYS_YEAR2038()],[test "$ac_cv_sys_file_offset_bits" = 64 && AC_DEFINE(_TIME_BITS,64,[Define to 64 to enable 64-bit time_t])])
|
||||
|
||||
AC_CHECK_HEADERS(\
|
||||
CL/cl.h \
|
||||
|
@ -758,7 +711,6 @@ case $host_os in
|
|||
|
||||
*)
|
||||
AC_DEFINE(_GNU_SOURCE,1,[Define to 1 to enable GNU extensions on Linux])
|
||||
test "$ac_cv_sys_file_offset_bits" = 64 && AC_DEFINE(_TIME_BITS,64,[Define to 64 to enable 64-bit time_t on Linux])
|
||||
if test $HOST_ARCH = i386
|
||||
then
|
||||
DLLFLAGS="$DLLFLAGS -fno-PIC"
|
||||
|
@ -837,6 +789,10 @@ AS_VAR_SET_IF([enable_archs],
|
|||
test $HOST_ARCH = unknown || cross_archs=$HOST_ARCH
|
||||
fi])
|
||||
|
||||
saved_CC=$CC
|
||||
saved_CFLAGS=$CFLAGS
|
||||
saved_LDFLAGS=$LDFLAGS
|
||||
|
||||
for wine_arch in $cross_archs
|
||||
do
|
||||
case "x$with_mingw" in
|
||||
|
@ -863,10 +819,6 @@ do
|
|||
;;
|
||||
esac])
|
||||
|
||||
saved_CC=$CC
|
||||
saved_CFLAGS=$CFLAGS
|
||||
saved_LDFLAGS=$LDFLAGS
|
||||
|
||||
CFLAGS=${CROSSCFLAGS:-"-g -O2"}
|
||||
LDFLAGS=$CROSSLDFLAGS
|
||||
AS_VAR_COPY([CC],[${wine_arch}_CC])
|
||||
|
@ -886,6 +838,8 @@ do
|
|||
while test $# -ge 1
|
||||
do
|
||||
case "$1" in
|
||||
*/*-gcc) target=`expr "$1" : '.*/\(.*\)-gcc'` ;;
|
||||
*/*-clang) target=`expr "$1" : '.*/\(.*\)-clang'` ;;
|
||||
*-gcc) target=`expr "$1" : '\(.*\)-gcc'` ;;
|
||||
*-clang) target=`expr "$1" : '\(.*\)-clang'` ;;
|
||||
esac
|
||||
|
@ -926,11 +880,8 @@ do
|
|||
if test -z "$target"
|
||||
then
|
||||
AS_VAR_SET_IF([enable_archs],
|
||||
[AC_MSG_ERROR([MinGW $wine_arch compiler not found.
|
||||
[AC_MSG_ERROR([$wine_arch PE cross-compiler not found.
|
||||
This is an error since --enable-archs=$wine_arch was requested.])])
|
||||
CC=$saved_CC
|
||||
CFLAGS=$saved_CFLAGS
|
||||
LDFLAGS=$saved_LDFLAGS
|
||||
continue
|
||||
fi
|
||||
|
||||
|
@ -952,11 +903,8 @@ This is an error since --enable-archs=$wine_arch was requested.])])
|
|||
case "x$res" in
|
||||
x) AC_MSG_RESULT([none needed]) ;;
|
||||
xno) AC_MSG_RESULT([unsupported])
|
||||
CC=$saved_CC
|
||||
CFLAGS=$saved_CFLAGS
|
||||
LDFLAGS=$saved_LDFLAGS
|
||||
AS_VAR_SET_IF([enable_archs],
|
||||
[AC_MSG_ERROR([MinGW $wine_arch compiler supporting C99 not found.
|
||||
[AC_MSG_ERROR([$wine_arch PE cross-compiler supporting C99 not found.
|
||||
This is an error since --enable-archs=$wine_arch was requested.])])
|
||||
continue
|
||||
;;
|
||||
|
@ -973,7 +921,7 @@ This is an error since --enable-archs=$wine_arch was requested.])])
|
|||
AS_VAR_POPDEF([wine_cv_seh_support])
|
||||
AS_VAR_IF([res],[yes],[],
|
||||
[AS_VAR_SET_IF([enable_archs],
|
||||
[AC_MSG_ERROR([The $wine_arch cross-compiler doesn't support SEH directives.
|
||||
[AC_MSG_ERROR([The $wine_arch PE cross-compiler doesn't support SEH directives.
|
||||
This is an error since --enable-archs=$wine_arch was requested.])])
|
||||
continue])])
|
||||
|
||||
|
@ -998,7 +946,10 @@ This is an error since --enable-archs=$wine_arch was requested.])])
|
|||
WINE_TRY_PE_CFLAGS([-Wpointer-arith])
|
||||
WINE_TRY_PE_CFLAGS([-Wlogical-op])
|
||||
WINE_TRY_PE_CFLAGS([-Wabsolute-value])
|
||||
WINE_TRY_PE_CFLAGS([-Wenum-conversion])
|
||||
WINE_TRY_PE_CFLAGS([-Wenum-enum-conversion],[:],WINE_TRY_PE_CFLAGS([-Wenum-conversion]))
|
||||
|
||||
dnl GCC can't handle large files when -Wmisleading-indentation is enabled (https://gcc.gnu.org/bugzilla/show_bug.cgi?id=89549)
|
||||
WINE_TRY_PE_CFLAGS([-flarge-source-files -Wmisleading-indentation],[AS_VAR_APPEND(${wine_arch}_EXTRACFLAGS,[" -Wno-misleading-indentation"])])
|
||||
|
||||
case $wine_arch in
|
||||
i386) WINE_TRY_PE_CFLAGS([-fno-omit-frame-pointer])
|
||||
|
@ -1044,16 +995,17 @@ This is an error since --enable-archs=$wine_arch was requested.])])
|
|||
[AS_VAR_APPEND([${wine_arch}_CFLAGS],[" -Wl,--build-id"])
|
||||
AS_VAR_APPEND([${wine_arch}_LDFLAGS],[" -Wl,--build-id"])])
|
||||
|
||||
CC=$saved_CC
|
||||
CFLAGS=$saved_CFLAGS
|
||||
LDFLAGS=$saved_LDFLAGS
|
||||
done
|
||||
|
||||
if test $HOST_ARCH = aarch64
|
||||
then
|
||||
test "x$PE_ARCHS" != x || AC_MSG_ERROR([PE cross-compilation is required for ARM64, please install clang/llvm-dlltool/lld, or llvm-mingw.])
|
||||
DLLEXT=""
|
||||
fi
|
||||
CC=$saved_CC
|
||||
CFLAGS=$saved_CFLAGS
|
||||
LDFLAGS=$saved_LDFLAGS
|
||||
|
||||
case $HOST_ARCH in
|
||||
arm|aarch64)
|
||||
test "x$PE_ARCHS" != x || AC_MSG_ERROR([PE cross-compilation is required for $HOST_ARCH, please install clang/llvm-dlltool/lld, or llvm-mingw.])
|
||||
DLLEXT="" ;;
|
||||
esac
|
||||
|
||||
dnl **** External libraries ****
|
||||
|
||||
|
@ -1161,7 +1113,7 @@ then
|
|||
if test "$ac_cv_mingw_header_vkd3d_h" = "yes" -a "$ac_cv_mingw_header_vkd3d_shader_h" = "yes"
|
||||
then
|
||||
WINE_CHECK_MINGW_LIB(vkd3d,vkd3d_set_log_callback,[:],[:],[$VKD3D_PE_LIBS])
|
||||
WINE_CHECK_MINGW_LIB(vkd3d-shader,vkd3d_shader_serialize_dxbc,[:],[:],[$VKD3D_PE_LIBS])
|
||||
WINE_CHECK_MINGW_LIB(vkd3d-shader,vkd3d_shader_build_varying_map,[:],[:],[$VKD3D_PE_LIBS])
|
||||
if test "$ac_cv_mingw_lib_vkd3d" = "no" -o "$ac_cv_mingw_lib_vkd3d_shader" = "no"
|
||||
then
|
||||
VKD3D_PE_CFLAGS=""
|
||||
|
@ -1193,7 +1145,7 @@ WINE_EXTLIB_FLAGS(JPEG, jpeg, jpeg, "-I\$(top_srcdir)/libs/jpeg")
|
|||
WINE_EXTLIB_FLAGS(JXR, jxr, jxr, "-I\$(top_srcdir)/libs/jxr/jxrgluelib -I\$(top_srcdir)/libs/jxr/image/sys")
|
||||
WINE_EXTLIB_FLAGS(LCMS2, lcms2, lcms2, "-I\$(top_srcdir)/libs/lcms2/include")
|
||||
WINE_EXTLIB_FLAGS(LDAP, ldap, ldap, "-I\$(top_srcdir)/libs/ldap/include")
|
||||
WINE_EXTLIB_FLAGS(MPG123, mpg123, mpg123, "-I\$(top_srcdir)/libs/mpg123/src/libmpg123")
|
||||
WINE_EXTLIB_FLAGS(MPG123, mpg123, mpg123, "-I\$(top_srcdir)/libs/mpg123/src/include")
|
||||
WINE_EXTLIB_FLAGS(MUSL, musl, musl)
|
||||
WINE_EXTLIB_FLAGS(PNG, png, "png \$(ZLIB_PE_LIBS)", "-I\$(top_srcdir)/libs/png")
|
||||
WINE_EXTLIB_FLAGS(TIFF, tiff, "tiff \$(ZLIB_PE_LIBS)", "-I\$(top_srcdir)/libs/tiff/libtiff")
|
||||
|
@ -1408,6 +1360,22 @@ then
|
|||
WINE_PACKAGE_FLAGS(XKBREGISTRY,[xkbregistry],,,,
|
||||
[AC_CHECK_HEADERS([xkbcommon/xkbregistry.h])
|
||||
AC_CHECK_LIB(xkbregistry,rxkb_context_new,[:],[XKBREGISTRY_LIBS=""],[$XKBREGISTRY_LIBS])])
|
||||
if test "x$with_opengl" != "xno"
|
||||
then
|
||||
WINE_PACKAGE_FLAGS(EGL,[egl],[-lEGL],,,
|
||||
[AC_CHECK_HEADER([EGL/egl.h],
|
||||
[WINE_CHECK_SONAME(EGL,eglGetProcAddress,,,[$EGL_LIBS])])])
|
||||
WINE_PACKAGE_FLAGS(WAYLAND_EGL,[wayland-egl],,,,
|
||||
[AC_CHECK_HEADER([wayland-egl.h],
|
||||
[AC_CHECK_LIB(wayland-egl,wl_egl_window_create,
|
||||
[AC_DEFINE(HAVE_LIBWAYLAND_EGL, 1, [Define if we have the wayland-egl development environment])],
|
||||
[WAYLAND_EGL_LIBS=""],[$WAYLAND_EGL_LIBS])])])
|
||||
if test "x$with_wayland" != "x"
|
||||
then
|
||||
WINE_NOTICE_WITH(opengl, [test -z "$ac_cv_lib_soname_EGL" -o "$ac_cv_lib_wayland_egl_wl_egl_window_create" != yes],
|
||||
[EGL ${notice_platform}development files not found, the Wayland driver won't support OpenGL])
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
WINE_NOTICE_WITH(wayland, [test -z "$WAYLAND_CLIENT_LIBS" -o -z "$WAYLAND_SCANNER" -o -z "$XKBCOMMON_LIBS" -o -z "$XKBREGISTRY_LIBS" -o "$ac_cv_header_linux_input_h" = "no"],
|
||||
[Wayland ${notice_platform}development files not found, the Wayland driver won't be supported.],
|
||||
|
@ -1698,8 +1666,10 @@ WINE_NOTICE_WITH(udev,[test "x$UDEV_LIBS" = "x"],
|
|||
[libudev ${notice_platform}development files not found, plug and play won't be supported.])
|
||||
|
||||
dnl **** Check for libunwind ****
|
||||
if test "x$with_unwind" != xno
|
||||
if test $HOST_ARCH = x86_64
|
||||
then
|
||||
if test "x$with_unwind" != xno
|
||||
then
|
||||
WINE_PACKAGE_FLAGS(UNWIND,[libunwind],[-lunwind],,,
|
||||
[AC_CACHE_CHECK([for unw_step],wine_cv_have_unw_step,
|
||||
[AC_LINK_IFELSE([AC_LANG_PROGRAM([[#define UNW_LOCAL_ONLY
|
||||
|
@ -1725,12 +1695,13 @@ then
|
|||
then
|
||||
AC_DEFINE(HAVE_LIBUNWIND,1,[Define to 1 if you have the `unwind' library (-lunwind).])
|
||||
fi])
|
||||
fi
|
||||
case $host in
|
||||
aarch64*|*-darwin*)
|
||||
fi
|
||||
case $host in
|
||||
*-darwin*)
|
||||
WINE_NOTICE_WITH(unwind,[test "x$wine_cv_have_unw_step$wine_cv_have_libunwind_unw_step" = xnono],
|
||||
[libunwind ${notice_platform}development files not found, stack unwinding won't work.]) ;;
|
||||
esac
|
||||
esac
|
||||
fi
|
||||
|
||||
dnl **** Check for libSDL2 ****
|
||||
if test "x$with_sdl" != "xno"
|
||||
|
@ -1856,7 +1827,7 @@ then
|
|||
WINE_CHECK_SONAME(vulkan, vkGetInstanceProcAddr)
|
||||
if test "x$ac_cv_lib_soname_vulkan" = "x"
|
||||
then
|
||||
WINE_CHECK_SONAME(MoltenVK, vkGetInstanceProcAddr)
|
||||
WINE_CHECK_SONAME(MoltenVK, vkGetInstanceProcAddr, [AC_DEFINE_UNQUOTED(SONAME_LIBVULKAN,["$ac_cv_lib_soname_MoltenVK"])])
|
||||
fi
|
||||
fi
|
||||
WINE_NOTICE_WITH(vulkan,[test "x$ac_cv_lib_soname_vulkan" = "x" -a "x$ac_cv_lib_soname_MoltenVK" = "x"],
|
||||
|
@ -1891,6 +1862,9 @@ then
|
|||
WINE_TRY_CFLAGS([-Wvla])
|
||||
WINE_TRY_CFLAGS([-Wwrite-strings])
|
||||
|
||||
dnl GCC can't handle large files when -Wmisleading-indentation is enabled (https://gcc.gnu.org/bugzilla/show_bug.cgi?id=89549)
|
||||
WINE_TRY_CFLAGS([-flarge-source-files -Wmisleading-indentation],[EXTRACFLAGS="$EXTRACFLAGS -Wno-misleading-indentation"])
|
||||
|
||||
dnl Check for noisy string.h
|
||||
WINE_TRY_CFLAGS([-Wpointer-arith],
|
||||
[saved_string_h_CFLAGS=$CFLAGS
|
||||
|
@ -2169,7 +2143,7 @@ AC_CACHE_CHECK([whether we can use re-entrant gethostbyname_r Linux style],
|
|||
fi
|
||||
|
||||
dnl Check for socket structure members
|
||||
AC_CHECK_MEMBERS([struct msghdr.msg_accrights, struct sockaddr_un.sun_len],,,
|
||||
AC_CHECK_MEMBERS([struct sockaddr_un.sun_len],,,
|
||||
[#include <sys/types.h>
|
||||
#include <sys/socket.h>
|
||||
#ifdef HAVE_SYS_UN_H
|
||||
|
@ -2377,6 +2351,35 @@ case $host_vendor in
|
|||
*sun*) WINE_CHECK_DEFINE([__sun__]) ;;
|
||||
esac
|
||||
|
||||
dnl *** Check for modules to disable by default
|
||||
|
||||
enable_win16=${enable_win16:-i386}
|
||||
enable_vcruntime140_1=${enable_vcruntime140_1:-x86_64,arm64ec}
|
||||
|
||||
if test -n "$PE_ARCHS"
|
||||
then
|
||||
enable_wow64=${enable_wow64:-aarch64,x86_64}
|
||||
enable_wow64win=${enable_wow64win:-aarch64,x86_64}
|
||||
enable_wow64cpu=${enable_wow64cpu:-x86_64}
|
||||
else
|
||||
enable_wow64=${enable_wow64:-no}
|
||||
enable_wow64win=${enable_wow64win:-no}
|
||||
enable_wow64cpu=${enable_wow64cpu:-no}
|
||||
fi
|
||||
|
||||
dnl Explicitly enable some programs for arm64ec
|
||||
enable_cmd=${enable_cmd:-yes}
|
||||
enable_dllhost=${enable_dllhost:-yes}
|
||||
enable_dpnsvr=${enable_dpnsvr:-i386,x86_64,arm64ec}
|
||||
enable_dxdiag=${enable_dxdiag:-yes}
|
||||
enable_msiexec=${enable_msiexec:-yes}
|
||||
enable_netsh=${enable_netsh:-yes}
|
||||
enable_regsvr32=${enable_regsvr32:-yes}
|
||||
enable_rundll32=${enable_rundll32:-yes}
|
||||
|
||||
dnl Disable winetest too if tests are disabled
|
||||
enable_winetest=${enable_winetest:-$enable_tests}
|
||||
|
||||
dnl **** Generate output files ****
|
||||
|
||||
AH_TOP([#ifndef __WINE_CONFIG_H
|
||||
|
@ -2684,6 +2687,7 @@ WINE_CONFIG_MAKEFILE(dlls/gdiplus/tests)
|
|||
WINE_CONFIG_MAKEFILE(dlls/geolocation)
|
||||
WINE_CONFIG_MAKEFILE(dlls/geolocation/tests)
|
||||
WINE_CONFIG_MAKEFILE(dlls/glu32)
|
||||
WINE_CONFIG_MAKEFILE(dlls/glu32/tests)
|
||||
WINE_CONFIG_MAKEFILE(dlls/gphoto2.ds)
|
||||
WINE_CONFIG_MAKEFILE(dlls/gpkcsp)
|
||||
WINE_CONFIG_MAKEFILE(dlls/graphicscapture)
|
||||
|
@ -2795,6 +2799,7 @@ WINE_CONFIG_MAKEFILE(dlls/mmdevapi/tests)
|
|||
WINE_CONFIG_MAKEFILE(dlls/mmdevldr.vxd,enable_win16)
|
||||
WINE_CONFIG_MAKEFILE(dlls/mmsystem.dll16,enable_win16)
|
||||
WINE_CONFIG_MAKEFILE(dlls/monodebg.vxd,enable_win16)
|
||||
WINE_CONFIG_MAKEFILE(dlls/mouhid.sys)
|
||||
WINE_CONFIG_MAKEFILE(dlls/mountmgr.sys)
|
||||
WINE_CONFIG_MAKEFILE(dlls/mouse.drv16,enable_win16)
|
||||
WINE_CONFIG_MAKEFILE(dlls/mp3dmod)
|
||||
|
@ -2876,6 +2881,7 @@ WINE_CONFIG_MAKEFILE(dlls/msvcp140/tests)
|
|||
WINE_CONFIG_MAKEFILE(dlls/msvcp140_1)
|
||||
WINE_CONFIG_MAKEFILE(dlls/msvcp140_1/tests)
|
||||
WINE_CONFIG_MAKEFILE(dlls/msvcp140_2)
|
||||
WINE_CONFIG_MAKEFILE(dlls/msvcp140_2/tests)
|
||||
WINE_CONFIG_MAKEFILE(dlls/msvcp140_atomic_wait)
|
||||
WINE_CONFIG_MAKEFILE(dlls/msvcp140_atomic_wait/tests)
|
||||
WINE_CONFIG_MAKEFILE(dlls/msvcp140_codecvt_ids)
|
||||
|
@ -3224,6 +3230,8 @@ WINE_CONFIG_MAKEFILE(dlls/windows.networking.hostname/tests)
|
|||
WINE_CONFIG_MAKEFILE(dlls/windows.networking)
|
||||
WINE_CONFIG_MAKEFILE(dlls/windows.perception.stub)
|
||||
WINE_CONFIG_MAKEFILE(dlls/windows.perception.stub/tests)
|
||||
WINE_CONFIG_MAKEFILE(dlls/windows.security.authentication.onlineid)
|
||||
WINE_CONFIG_MAKEFILE(dlls/windows.security.authentication.onlineid/tests)
|
||||
WINE_CONFIG_MAKEFILE(dlls/windows.security.credentials.ui.userconsentverifier)
|
||||
WINE_CONFIG_MAKEFILE(dlls/windows.security.credentials.ui.userconsentverifier/tests)
|
||||
WINE_CONFIG_MAKEFILE(dlls/windows.storage.applicationdata)
|
||||
|
@ -3257,6 +3265,7 @@ WINE_CONFIG_MAKEFILE(dlls/winex11.drv)
|
|||
WINE_CONFIG_MAKEFILE(dlls/winexinput.sys)
|
||||
WINE_CONFIG_MAKEFILE(dlls/wing.dll16,enable_win16)
|
||||
WINE_CONFIG_MAKEFILE(dlls/wing32)
|
||||
WINE_CONFIG_MAKEFILE(dlls/wing32/tests)
|
||||
WINE_CONFIG_MAKEFILE(dlls/winhttp)
|
||||
WINE_CONFIG_MAKEFILE(dlls/winhttp/tests)
|
||||
WINE_CONFIG_MAKEFILE(dlls/wininet)
|
||||
|
|
|
@ -27,4 +27,4 @@
|
|||
threading(both),
|
||||
uuid(b8da6310-e19b-11d0-933c-00a0c90dcaa9) /* IActiveScriptStats */
|
||||
]
|
||||
coclass PSFactoryBuffer { interface IFactoryBuffer; }
|
||||
coclass PSFactoryBuffer { interface IPSFactoryBuffer; }
|
||||
|
|
|
@ -27,4 +27,4 @@
|
|||
threading(both),
|
||||
uuid(b8da6310-e19b-11d0-933c-00a0c90dcaa9) /* IActiveScriptStats */
|
||||
]
|
||||
coclass PSFactoryBuffer { interface IFactoryBuffer; }
|
||||
coclass PSFactoryBuffer { interface IPSFactoryBuffer; }
|
||||
|
|
|
@ -27,4 +27,4 @@
|
|||
threading(both),
|
||||
uuid(b8da6310-e19b-11d0-933c-00a0c90dcaa9) /* IActiveScriptStats */
|
||||
]
|
||||
coclass PSFactoryBuffer { interface IFactoryBuffer; }
|
||||
coclass PSFactoryBuffer { interface IPSFactoryBuffer; }
|
||||
|
|
|
@ -27,4 +27,4 @@
|
|||
threading(both),
|
||||
uuid(b8da6310-e19b-11d0-933c-00a0c90dcaa9) /* IActiveScriptStats */
|
||||
]
|
||||
coclass PSFactoryBuffer { interface IFactoryBuffer; }
|
||||
coclass PSFactoryBuffer { interface IPSFactoryBuffer; }
|
||||
|
|
|
@ -27,4 +27,4 @@
|
|||
threading(both),
|
||||
uuid(b8da6310-e19b-11d0-933c-00a0c90dcaa9) /* IActiveScriptStats */
|
||||
]
|
||||
coclass PSFactoryBuffer { interface IFactoryBuffer; }
|
||||
coclass PSFactoryBuffer { interface IPSFactoryBuffer; }
|
||||
|
|
|
@ -27,4 +27,4 @@
|
|||
threading(both),
|
||||
uuid(b8da6310-e19b-11d0-933c-00a0c90dcaa9) /* IActiveScriptStats */
|
||||
]
|
||||
coclass PSFactoryBuffer { interface IFactoryBuffer; }
|
||||
coclass PSFactoryBuffer { interface IPSFactoryBuffer; }
|
||||
|
|
|
@ -27,4 +27,4 @@
|
|||
threading(both),
|
||||
uuid(b8da6310-e19b-11d0-933c-00a0c90dcaa9) /* IActiveScriptStats */
|
||||
]
|
||||
coclass PSFactoryBuffer { interface IFactoryBuffer; }
|
||||
coclass PSFactoryBuffer { interface IPSFactoryBuffer; }
|
||||
|
|
|
@ -27,4 +27,4 @@
|
|||
threading(both),
|
||||
uuid(b8da6310-e19b-11d0-933c-00a0c90dcaa9) /* IActiveScriptStats */
|
||||
]
|
||||
coclass PSFactoryBuffer { interface IFactoryBuffer; }
|
||||
coclass PSFactoryBuffer { interface IPSFactoryBuffer; }
|
||||
|
|
|
@ -7,4 +7,4 @@
|
|||
threading(both),
|
||||
uuid(b8da6310-e19b-11d0-933c-00a0c90dcaa9) /* IActiveScriptStats */
|
||||
]
|
||||
coclass PSFactoryBuffer { interface IFactoryBuffer; }
|
||||
coclass PSFactoryBuffer { interface IPSFactoryBuffer; }
|
||||
|
|
|
@ -27,4 +27,4 @@
|
|||
threading(both),
|
||||
uuid(b8da6310-e19b-11d0-933c-00a0c90dcaa9) /* IActiveScriptStats */
|
||||
]
|
||||
coclass PSFactoryBuffer { interface IFactoryBuffer; }
|
||||
coclass PSFactoryBuffer { interface IPSFactoryBuffer; }
|
||||
|
|
|
@ -27,4 +27,4 @@
|
|||
threading(both),
|
||||
uuid(b8da6310-e19b-11d0-933c-00a0c90dcaa9) /* IActiveScriptStats */
|
||||
]
|
||||
coclass PSFactoryBuffer { interface IFactoryBuffer; }
|
||||
coclass PSFactoryBuffer { interface IPSFactoryBuffer; }
|
||||
|
|
|
@ -27,4 +27,4 @@
|
|||
threading(both),
|
||||
uuid(b8da6310-e19b-11d0-933c-00a0c90dcaa9) /* IActiveScriptStats */
|
||||
]
|
||||
coclass PSFactoryBuffer { interface IFactoryBuffer; }
|
||||
coclass PSFactoryBuffer { interface IPSFactoryBuffer; }
|
||||
|
|
|
@ -824,7 +824,7 @@
|
|||
# @ stub TreeResetNamedSecurityInfoA
|
||||
@ stdcall TreeResetNamedSecurityInfoW(wstr long long ptr ptr ptr ptr long ptr long ptr)
|
||||
# @ stub TreeSetNamedSecurityInfoA
|
||||
# @ stub TreeSetNamedSecurityInfoW
|
||||
@ stdcall TreeSetNamedSecurityInfoW(wstr long long ptr ptr ptr ptr long ptr long ptr)
|
||||
# @ stub TrusteeAccessToObjectA
|
||||
# @ stub TrusteeAccessToObjectW
|
||||
# @ stub UninstallApplication
|
||||
|
|
|
@ -70,6 +70,9 @@ LSTATUS WINAPI RegOverridePredefKey( HKEY hkey, HKEY override )
|
|||
*/
|
||||
LSTATUS WINAPI RegCreateKeyW( HKEY hkey, LPCWSTR lpSubKey, PHKEY phkResult )
|
||||
{
|
||||
if (!phkResult)
|
||||
return ERROR_INVALID_PARAMETER;
|
||||
|
||||
return RegCreateKeyExW( hkey, lpSubKey, 0, NULL, REG_OPTION_NON_VOLATILE,
|
||||
MAXIMUM_ALLOWED, NULL, phkResult, NULL );
|
||||
}
|
||||
|
@ -82,6 +85,9 @@ LSTATUS WINAPI RegCreateKeyW( HKEY hkey, LPCWSTR lpSubKey, PHKEY phkResult )
|
|||
*/
|
||||
LSTATUS WINAPI RegCreateKeyA( HKEY hkey, LPCSTR lpSubKey, PHKEY phkResult )
|
||||
{
|
||||
if (!phkResult)
|
||||
return ERROR_INVALID_PARAMETER;
|
||||
|
||||
return RegCreateKeyExA( hkey, lpSubKey, 0, NULL, REG_OPTION_NON_VOLATILE,
|
||||
MAXIMUM_ALLOWED, NULL, phkResult, NULL );
|
||||
}
|
||||
|
|
|
@ -3101,6 +3101,19 @@ BOOL WINAPI SaferCloseLevel(SAFER_LEVEL_HANDLE handle)
|
|||
return TRUE;
|
||||
}
|
||||
|
||||
/******************************************************************************
|
||||
* TreeSetNamedSecurityInfoW [ADVAPI32.@]
|
||||
*/
|
||||
DWORD WINAPI TreeSetNamedSecurityInfoW(WCHAR *name, SE_OBJECT_TYPE type, SECURITY_INFORMATION info,
|
||||
SID *owner, SID *group, ACL *dacl, ACL *sacl, DWORD action,
|
||||
FN_PROGRESS progress, PROG_INVOKE_SETTING pis, void *args)
|
||||
{
|
||||
FIXME("(%s, %d, %lu, %p, %p, %p, %p, %lu, %p, %d, %p) stub\n",
|
||||
debugstr_w(name), type, info, owner, group, dacl, sacl, action, progress, pis, args);
|
||||
|
||||
return ERROR_CALL_NOT_IMPLEMENTED;
|
||||
}
|
||||
|
||||
/******************************************************************************
|
||||
* TreeResetNamedSecurityInfoW [ADVAPI32.@]
|
||||
*/
|
||||
|
|
|
@ -1260,10 +1260,10 @@ static void test_container_sd(void)
|
|||
ok(err == ERROR_INSUFFICIENT_BUFFER || broken(err == ERROR_INVALID_PARAMETER), "got %lu\n", err);
|
||||
ok(len, "expected len > 0\n");
|
||||
|
||||
sd = HeapAlloc(GetProcessHeap(), 0, len);
|
||||
sd = malloc(len);
|
||||
ret = CryptGetProvParam(prov, PP_KEYSET_SEC_DESCR, (BYTE *)sd, &len, OWNER_SECURITY_INFORMATION);
|
||||
ok(ret, "got %lu\n", GetLastError());
|
||||
HeapFree(GetProcessHeap(), 0, sd);
|
||||
free(sd);
|
||||
|
||||
ret = CryptReleaseContext(prov, 0);
|
||||
ok(ret, "got %lu\n", GetLastError());
|
||||
|
|
|
@ -445,14 +445,14 @@ static void test_read(void)
|
|||
todo_wine
|
||||
ok(GetLastError() == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %ld\n", GetLastError());
|
||||
|
||||
buf = HeapAlloc(GetProcessHeap(), 0, sizeof(EVENTLOGRECORD));
|
||||
buf = malloc(sizeof(EVENTLOGRECORD));
|
||||
SetLastError(0xdeadbeef);
|
||||
ret = ReadEventLogA(NULL, EVENTLOG_SEQUENTIAL_READ | EVENTLOG_FORWARDS_READ,
|
||||
0, buf, sizeof(EVENTLOGRECORD), &read, &needed);
|
||||
ok(!ret, "Expected failure\n");
|
||||
todo_wine
|
||||
ok(GetLastError() == ERROR_INVALID_HANDLE, "Expected ERROR_INVALID_HANDLE, got %ld\n", GetLastError());
|
||||
HeapFree(GetProcessHeap(), 0, buf);
|
||||
free(buf);
|
||||
|
||||
handle = OpenEventLogA(NULL, "Application");
|
||||
if (!handle && (GetLastError() == ERROR_ACCESS_DENIED || GetLastError() == RPC_S_SERVER_UNAVAILABLE))
|
||||
|
@ -463,7 +463,7 @@ static void test_read(void)
|
|||
ok(handle != NULL, "OpenEventLogA(Application) failed : %ld\n", GetLastError());
|
||||
|
||||
/* Show that we need the proper dwFlags with a (for the rest) proper call */
|
||||
buf = HeapAlloc(GetProcessHeap(), 0, sizeof(EVENTLOGRECORD));
|
||||
buf = malloc(sizeof(EVENTLOGRECORD));
|
||||
|
||||
SetLastError(0xdeadbeef);
|
||||
ret = ReadEventLogA(handle, 0, 0, buf, sizeof(EVENTLOGRECORD), &read, &needed);
|
||||
|
@ -504,7 +504,7 @@ static void test_read(void)
|
|||
todo_wine
|
||||
ok(GetLastError() == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %ld\n", GetLastError());
|
||||
|
||||
HeapFree(GetProcessHeap(), 0, buf);
|
||||
free(buf);
|
||||
|
||||
/* First check if there are any records (in practice only on Wine: FIXME) */
|
||||
count = 0;
|
||||
|
@ -517,7 +517,7 @@ static void test_read(void)
|
|||
}
|
||||
|
||||
/* Get the buffer size for the first record */
|
||||
buf = HeapAlloc(GetProcessHeap(), 0, sizeof(EVENTLOGRECORD));
|
||||
buf = malloc(sizeof(EVENTLOGRECORD));
|
||||
read = needed = 0xdeadbeef;
|
||||
SetLastError(0xdeadbeef);
|
||||
ret = ReadEventLogA(handle, EVENTLOG_SEQUENTIAL_READ | EVENTLOG_FORWARDS_READ,
|
||||
|
@ -529,7 +529,7 @@ static void test_read(void)
|
|||
|
||||
/* Read the first record */
|
||||
toread = needed;
|
||||
buf = HeapReAlloc(GetProcessHeap(), 0, buf, toread);
|
||||
buf = realloc(buf, toread);
|
||||
read = needed = 0xdeadbeef;
|
||||
SetLastError(0xdeadbeef);
|
||||
ret = ReadEventLogA(handle, EVENTLOG_SEQUENTIAL_READ | EVENTLOG_FORWARDS_READ, 0, buf, toread, &read, &needed);
|
||||
|
@ -538,7 +538,7 @@ static void test_read(void)
|
|||
broken(read < toread), /* NT4 wants a buffer size way bigger than just 1 record */
|
||||
"Expected the requested size to be read\n");
|
||||
ok(needed == 0, "Expected no extra bytes to be read\n");
|
||||
HeapFree(GetProcessHeap(), 0, buf);
|
||||
free(buf);
|
||||
|
||||
CloseEventLog(handle);
|
||||
}
|
||||
|
@ -785,7 +785,7 @@ static void test_readwrite(void)
|
|||
if (pCreateWellKnownSid)
|
||||
{
|
||||
sidsize = SECURITY_MAX_SID_SIZE;
|
||||
user = HeapAlloc(GetProcessHeap(), 0, sidsize);
|
||||
user = malloc(sidsize);
|
||||
SetLastError(0xdeadbeef);
|
||||
pCreateWellKnownSid(WinInteractiveSid, NULL, user, &sidsize);
|
||||
sidavailable = TRUE;
|
||||
|
@ -846,12 +846,12 @@ static void test_readwrite(void)
|
|||
ok(ret, "Expected success : %ld\n", GetLastError());
|
||||
|
||||
/* Needed to catch earlier Vista (with no ServicePack for example) */
|
||||
buf = HeapAlloc(GetProcessHeap(), 0, sizeof(EVENTLOGRECORD));
|
||||
buf = malloc(sizeof(EVENTLOGRECORD));
|
||||
if (!(ret = ReadEventLogA(handle, EVENTLOG_SEQUENTIAL_READ | EVENTLOG_FORWARDS_READ,
|
||||
0, buf, sizeof(EVENTLOGRECORD), &read, &needed)) &&
|
||||
GetLastError() == ERROR_INSUFFICIENT_BUFFER)
|
||||
{
|
||||
buf = HeapReAlloc(GetProcessHeap(), 0, buf, needed);
|
||||
buf = realloc(buf, needed);
|
||||
ret = ReadEventLogA(handle, EVENTLOG_SEQUENTIAL_READ | EVENTLOG_FORWARDS_READ,
|
||||
0, buf, needed, &read, &needed);
|
||||
}
|
||||
|
@ -865,7 +865,7 @@ static void test_readwrite(void)
|
|||
if (record->EventType == EVENTLOG_SUCCESS)
|
||||
on_vista = TRUE;
|
||||
}
|
||||
HeapFree(GetProcessHeap(), 0, buf);
|
||||
free(buf);
|
||||
}
|
||||
|
||||
/* This will clear the eventlog. The record numbering for new
|
||||
|
@ -949,13 +949,13 @@ static void test_readwrite(void)
|
|||
size = 0;
|
||||
SetLastError(0xdeadbeef);
|
||||
pGetComputerNameExA(ComputerNameDnsFullyQualified, NULL, &size);
|
||||
localcomputer = HeapAlloc(GetProcessHeap(), 0, size);
|
||||
localcomputer = malloc(size);
|
||||
pGetComputerNameExA(ComputerNameDnsFullyQualified, localcomputer, &size);
|
||||
}
|
||||
else
|
||||
{
|
||||
size = MAX_COMPUTERNAME_LENGTH + 1;
|
||||
localcomputer = HeapAlloc(GetProcessHeap(), 0, size);
|
||||
localcomputer = malloc(size);
|
||||
GetComputerNameA(localcomputer, &size);
|
||||
}
|
||||
|
||||
|
@ -964,7 +964,7 @@ static void test_readwrite(void)
|
|||
ok(handle != NULL, "OpenEventLogA(%s) failed : %ld\n", eventlogname, GetLastError());
|
||||
i = 0;
|
||||
size = sizeof(EVENTLOGRECORD) + 128;
|
||||
buf = HeapAlloc(GetProcessHeap(), 0, size);
|
||||
buf = malloc(size);
|
||||
for (;;)
|
||||
{
|
||||
DWORD read, needed;
|
||||
|
@ -989,9 +989,9 @@ static void test_readwrite(void)
|
|||
|
||||
if (needed > size)
|
||||
{
|
||||
HeapFree(GetProcessHeap(), 0, buf);
|
||||
free(buf);
|
||||
size = needed;
|
||||
buf = HeapAlloc(GetProcessHeap(), 0, size);
|
||||
buf = malloc(size);
|
||||
}
|
||||
ret = ReadEventLogA(handle, EVENTLOG_SEQUENTIAL_READ | EVENTLOG_FORWARDS_READ,
|
||||
0, buf, needed, &read, &needed);
|
||||
|
@ -1069,7 +1069,7 @@ static void test_readwrite(void)
|
|||
winetest_pop_context();
|
||||
i++;
|
||||
}
|
||||
HeapFree(GetProcessHeap(), 0, buf);
|
||||
free(buf);
|
||||
CloseEventLog(handle);
|
||||
|
||||
/* Test clearing a real eventlog */
|
||||
|
@ -1088,8 +1088,8 @@ static void test_readwrite(void)
|
|||
CloseEventLog(handle);
|
||||
|
||||
cleanup:
|
||||
HeapFree(GetProcessHeap(), 0, localcomputer);
|
||||
HeapFree(GetProcessHeap(), 0, user);
|
||||
free(localcomputer);
|
||||
free(user);
|
||||
}
|
||||
|
||||
/* Before Vista:
|
||||
|
@ -1240,7 +1240,7 @@ static void test_start_trace(void)
|
|||
LONG ret;
|
||||
|
||||
buffersize = sizeof(EVENT_TRACE_PROPERTIES) + sizeof(sessionname) + sizeof(filepath);
|
||||
properties = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, buffersize);
|
||||
properties = calloc(1, buffersize);
|
||||
properties->Wnode.BufferSize = buffersize;
|
||||
properties->Wnode.Flags = WNODE_FLAG_TRACED_GUID;
|
||||
properties->LogFileMode = EVENT_TRACE_FILE_MODE_NONE;
|
||||
|
@ -1317,25 +1317,27 @@ static void test_start_trace(void)
|
|||
/* clean up */
|
||||
ControlTraceA(handle, sessionname, properties, EVENT_TRACE_CONTROL_STOP);
|
||||
done:
|
||||
HeapFree(GetProcessHeap(), 0, properties);
|
||||
free(properties);
|
||||
DeleteFileA(filepath);
|
||||
}
|
||||
|
||||
static BOOL read_record(HANDLE handle, DWORD flags, DWORD offset, EVENTLOGRECORD **record, DWORD *size)
|
||||
{
|
||||
DWORD read;
|
||||
DWORD read, needed;
|
||||
BOOL ret;
|
||||
|
||||
SetLastError(0xdeadbeef);
|
||||
memset(*record, 0, *size);
|
||||
if (!(ret = ReadEventLogW(handle, flags, offset, *record, *size, &read, size)) &&
|
||||
needed = 0;
|
||||
if (!(ret = ReadEventLogW(handle, flags, offset, *record, *size, &read, &needed)) &&
|
||||
GetLastError() == ERROR_INSUFFICIENT_BUFFER)
|
||||
{
|
||||
free(*record);
|
||||
*record = malloc(*size);
|
||||
*record = malloc(needed);
|
||||
SetLastError(0xdeadbeef);
|
||||
memset(*record, 0, *size);
|
||||
ret = ReadEventLogW(handle, flags, offset, *record, *size, &read, size);
|
||||
memset(*record, 0, needed);
|
||||
*size = needed;
|
||||
ret = ReadEventLogW(handle, flags, offset, *record, *size, &read, &needed);
|
||||
}
|
||||
|
||||
return ret;
|
||||
|
@ -1345,8 +1347,8 @@ static void test_eventlog_start(void)
|
|||
{
|
||||
BOOL ret, found;
|
||||
HANDLE handle, handle2;
|
||||
EVENTLOGRECORD *record;
|
||||
DWORD size, count, read, needed;
|
||||
EVENTLOGRECORD *record, *record2;
|
||||
DWORD size, size2, count, count2, read, needed;
|
||||
WCHAR *sourcename, *computername, *localcomputer;
|
||||
char *sourcenameA, *computernameA, *localcomputerA;
|
||||
|
||||
|
@ -1545,6 +1547,14 @@ static void test_eventlog_start(void)
|
|||
todo_wine
|
||||
ok(GetLastError() == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %ld\n", GetLastError());
|
||||
|
||||
count = 0xdeadbeef;
|
||||
ret = GetNumberOfEventLogRecords(handle, &count);
|
||||
ok(ret, "Expected success : %ld\n", GetLastError());
|
||||
ret = read_record(handle, EVENTLOG_SEEK_READ | EVENTLOG_FORWARDS_READ, count + 1, &record, &size);
|
||||
ok(!ret, "Expected failure\n");
|
||||
todo_wine
|
||||
ok(GetLastError() == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %ld\n", GetLastError());
|
||||
|
||||
todo_wine {
|
||||
ret = read_record(handle, EVENTLOG_SEEK_READ | EVENTLOG_FORWARDS_READ, 2, &record, &size);
|
||||
ok(ret, "Expected success : %ld\n", GetLastError());
|
||||
|
@ -1560,7 +1570,8 @@ static void test_eventlog_start(void)
|
|||
/* change how */
|
||||
ret = read_record(handle, EVENTLOG_SEQUENTIAL_READ | EVENTLOG_FORWARDS_READ, 100, &record, &size);
|
||||
ok(ret, "Expected success : %ld\n", GetLastError());
|
||||
ok(record->RecordNumber == 4, "Expected 4, got %lu\n", record->RecordNumber);
|
||||
ok(record->RecordNumber == 4 || broken(record->RecordNumber == 5) /* some win10 22h2 */,
|
||||
"Expected 4, got %lu\n", record->RecordNumber);
|
||||
/* change direction */
|
||||
ret = read_record(handle, EVENTLOG_SEEK_READ | EVENTLOG_BACKWARDS_READ, 10, &record, &size);
|
||||
ok(ret, "Expected success : %ld\n", GetLastError());
|
||||
|
@ -1591,7 +1602,8 @@ static void test_eventlog_start(void)
|
|||
/* change how */
|
||||
ret = read_record(handle, EVENTLOG_SEQUENTIAL_READ | EVENTLOG_BACKWARDS_READ, 100, &record, &size);
|
||||
ok(ret, "Expected success : %ld\n", GetLastError());
|
||||
ok(record->RecordNumber == 3, "Expected 3, got %lu\n", record->RecordNumber);
|
||||
ok(record->RecordNumber == 3 || broken(record->RecordNumber == 2) /* some win10 22h2 */,
|
||||
"Expected 3, got %lu\n", record->RecordNumber);
|
||||
/* change direction */
|
||||
ret = read_record(handle, EVENTLOG_SEEK_READ | EVENTLOG_FORWARDS_READ, 10, &record, &size);
|
||||
ok(ret, "Expected success : %ld\n", GetLastError());
|
||||
|
@ -1599,6 +1611,44 @@ static void test_eventlog_start(void)
|
|||
}
|
||||
CloseEventLog(handle);
|
||||
|
||||
/* reading same log with different handles */
|
||||
handle = OpenEventLogW(0, L"System");
|
||||
handle2 = OpenEventLogW(0, L"SYSTEM");
|
||||
todo_wine {
|
||||
ret = read_record(handle, EVENTLOG_SEQUENTIAL_READ | EVENTLOG_FORWARDS_READ, 0, &record, &size);
|
||||
ok(ret, "Expected success : %ld\n", GetLastError());
|
||||
ok(record->RecordNumber == 1, "Expected 1, got %lu\n", record->RecordNumber);
|
||||
ret = read_record(handle2, EVENTLOG_SEQUENTIAL_READ | EVENTLOG_FORWARDS_READ, 0, &record, &size);
|
||||
ok(ret, "Expected success : %ld\n", GetLastError());
|
||||
ok(record->RecordNumber == 1, "Expected 1, got %lu\n", record->RecordNumber);
|
||||
}
|
||||
CloseEventLog(handle2);
|
||||
CloseEventLog(handle);
|
||||
|
||||
/* using source name */
|
||||
size2 = size;
|
||||
record2 = malloc(size2);
|
||||
handle = OpenEventLogW(0, L"System");
|
||||
handle2 = OpenEventLogW(0, L"EventLog");
|
||||
todo_wine {
|
||||
ret = read_record(handle, EVENTLOG_SEQUENTIAL_READ | EVENTLOG_FORWARDS_READ, 0, &record, &size);
|
||||
ok(ret, "Expected success : %ld\n", GetLastError());
|
||||
ret = read_record(handle2, EVENTLOG_SEQUENTIAL_READ | EVENTLOG_FORWARDS_READ, 0, &record2, &size2);
|
||||
ok(ret, "Expected success : %ld\n", GetLastError());
|
||||
}
|
||||
ok(size == size2, "Expected %lu, got %lu\n", size, size2);
|
||||
ok(!memcmp(record, record2, min(size, size2)), "Records miscompare\n");
|
||||
count = 0xdeadbeef;
|
||||
count2 = 0xdeadbeef;
|
||||
ret = GetNumberOfEventLogRecords(handle, &count);
|
||||
ok(ret, "Expected success : %ld\n", GetLastError());
|
||||
ret = GetNumberOfEventLogRecords(handle2, &count2);
|
||||
ok(ret, "Expected success : %ld\n", GetLastError());
|
||||
ok(count == count2, "Expected %lu, got %lu\n", count, count2);
|
||||
CloseEventLog(handle2);
|
||||
CloseEventLog(handle);
|
||||
|
||||
free(record2);
|
||||
free(record);
|
||||
}
|
||||
|
||||
|
|
|
@ -243,15 +243,15 @@ static void test_LsaLookupNames2(void)
|
|||
return;
|
||||
}
|
||||
|
||||
name[0].Buffer = HeapAlloc(GetProcessHeap(), 0, sizeof(n1));
|
||||
name[0].Buffer = malloc(sizeof(n1));
|
||||
name[0].Length = name[0].MaximumLength = sizeof(n1);
|
||||
memcpy(name[0].Buffer, n1, sizeof(n1));
|
||||
|
||||
name[1].Buffer = HeapAlloc(GetProcessHeap(), 0, sizeof(n1));
|
||||
name[1].Buffer = malloc(sizeof(n1));
|
||||
name[1].Length = name[1].MaximumLength = sizeof(n1) - sizeof(WCHAR);
|
||||
memcpy(name[1].Buffer, n1, sizeof(n1) - sizeof(WCHAR));
|
||||
|
||||
name[2].Buffer = HeapAlloc(GetProcessHeap(), 0, sizeof(n2));
|
||||
name[2].Buffer = malloc(sizeof(n2));
|
||||
name[2].Length = name[2].MaximumLength = sizeof(n2);
|
||||
memcpy(name[2].Buffer, n2, sizeof(n2));
|
||||
|
||||
|
@ -307,9 +307,9 @@ static void test_LsaLookupNames2(void)
|
|||
LsaFreeMemory(sids);
|
||||
LsaFreeMemory(domains);
|
||||
|
||||
HeapFree(GetProcessHeap(), 0, name[0].Buffer);
|
||||
HeapFree(GetProcessHeap(), 0, name[1].Buffer);
|
||||
HeapFree(GetProcessHeap(), 0, name[2].Buffer);
|
||||
free(name[0].Buffer);
|
||||
free(name[1].Buffer);
|
||||
free(name[2].Buffer);
|
||||
|
||||
status = LsaClose(handle);
|
||||
ok(status == STATUS_SUCCESS, "LsaClose() failed, returned 0x%08lx\n", status);
|
||||
|
|
|
@ -64,6 +64,17 @@ static DWORD (WINAPI *pEnumDynamicTimeZoneInformation)(const DWORD,
|
|||
static BOOL limited_user;
|
||||
static const BOOL is_64bit = sizeof(void *) > sizeof(int);
|
||||
|
||||
static BOOL has_wow64(void)
|
||||
{
|
||||
if (!is_64bit)
|
||||
{
|
||||
BOOL is_wow64;
|
||||
if (!pIsWow64Process || !pIsWow64Process( GetCurrentProcess(), &is_wow64 ) || !is_wow64)
|
||||
return FALSE;
|
||||
}
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
static const char *dbgstr_SYSTEMTIME(const SYSTEMTIME *st)
|
||||
{
|
||||
return wine_dbg_sprintf("%02d-%02d-%04d %02d:%02d:%02d.%03d",
|
||||
|
@ -184,7 +195,7 @@ static void _test_hkey_main_Value_A(int line, LPCSTR name, LPCSTR string,
|
|||
lok(type == REG_SZ, "RegQueryValueExA/1 returned type %ld\n", type);
|
||||
lok(cbData == full_byte_len, "cbData=%ld instead of %ld or %ld\n", cbData, full_byte_len, str_byte_len);
|
||||
|
||||
value = HeapAlloc(GetProcessHeap(), 0, cbData+1);
|
||||
value = malloc(cbData+1);
|
||||
memset(value, 0xbd, cbData+1);
|
||||
type=0xdeadbeef;
|
||||
ret = RegQueryValueExA(hkey_main, name, NULL, &type, value, &cbData);
|
||||
|
@ -202,7 +213,7 @@ static void _test_hkey_main_Value_A(int line, LPCSTR name, LPCSTR string,
|
|||
debugstr_an(string, full_byte_len), full_byte_len);
|
||||
lok(*(value+cbData) == 0xbd, "RegQueryValueExA/2 overflowed at offset %lu: %02x != bd\n", cbData, *(value+cbData));
|
||||
}
|
||||
HeapFree(GetProcessHeap(), 0, value);
|
||||
free(value);
|
||||
}
|
||||
|
||||
#define test_hkey_main_Value_W(name, string, full_byte_len) _test_hkey_main_Value_W(__LINE__, name, string, full_byte_len)
|
||||
|
@ -232,7 +243,7 @@ static void _test_hkey_main_Value_W(int line, LPCWSTR name, LPCWSTR string,
|
|||
"cbData=%ld instead of %ld\n", cbData, full_byte_len);
|
||||
|
||||
/* Give enough space to overflow by one WCHAR */
|
||||
value = HeapAlloc(GetProcessHeap(), 0, cbData+2);
|
||||
value = malloc(cbData+2);
|
||||
memset(value, 0xbd, cbData+2);
|
||||
type=0xdeadbeef;
|
||||
ret = RegQueryValueExW(hkey_main, name, NULL, &type, value, &cbData);
|
||||
|
@ -247,7 +258,7 @@ static void _test_hkey_main_Value_W(int line, LPCWSTR name, LPCWSTR string,
|
|||
/* This implies that when cbData == 0, RegQueryValueExW() should not modify the buffer */
|
||||
lok(*(value+cbData) == 0xbd, "RegQueryValueExW/2 overflowed at %lu: %02x != bd\n", cbData, *(value+cbData));
|
||||
lok(*(value+cbData+1) == 0xbd, "RegQueryValueExW/2 overflowed at %lu+1: %02x != bd\n", cbData, *(value+cbData+1));
|
||||
HeapFree(GetProcessHeap(), 0, value);
|
||||
free(value);
|
||||
}
|
||||
|
||||
static void test_set_value(void)
|
||||
|
@ -1207,7 +1218,7 @@ static void test_reg_open_key(void)
|
|||
ok(ret == ERROR_SUCCESS,
|
||||
"Expected SetEntriesInAclA to return ERROR_SUCCESS, got %lu, last error %lu\n", ret, GetLastError());
|
||||
|
||||
sd = HeapAlloc(GetProcessHeap(), 0, SECURITY_DESCRIPTOR_MIN_LENGTH);
|
||||
sd = malloc(SECURITY_DESCRIPTOR_MIN_LENGTH);
|
||||
bRet = InitializeSecurityDescriptor(sd, SECURITY_DESCRIPTOR_REVISION);
|
||||
ok(bRet == TRUE,
|
||||
"Expected InitializeSecurityDescriptor to return TRUE, got %d, last error %lu\n", bRet, GetLastError());
|
||||
|
@ -1245,7 +1256,7 @@ static void test_reg_open_key(void)
|
|||
RegCloseKey(hkResult);
|
||||
}
|
||||
|
||||
HeapFree(GetProcessHeap(), 0, sd);
|
||||
free(sd);
|
||||
LocalFree(key_acl);
|
||||
FreeSid(world_sid);
|
||||
RegDeleteKeyA(hkRoot64, "");
|
||||
|
@ -1268,6 +1279,19 @@ static void test_reg_create_key(void)
|
|||
PACL key_acl;
|
||||
SECURITY_DESCRIPTOR *sd;
|
||||
|
||||
/* NULL return key check */
|
||||
ret = RegCreateKeyA(hkey_main, "Subkey1", NULL);
|
||||
ok(ret == ERROR_INVALID_PARAMETER, "Got unexpected ret %ld.\n", ret);
|
||||
|
||||
ret = RegCreateKeyW(hkey_main, L"Subkey1", NULL);
|
||||
ok(ret == ERROR_INVALID_PARAMETER, "Got unexpected ret %ld.\n", ret);
|
||||
|
||||
ret = RegCreateKeyExA(hkey_main, "Subkey1", 0, NULL, 0, KEY_NOTIFY, NULL, NULL, NULL);
|
||||
ok(ret == ERROR_BADKEY, "Got unexpected ret %ld.\n", ret);
|
||||
|
||||
ret = RegCreateKeyExW(hkey_main, L"Subkey1", 0, NULL, 0, KEY_NOTIFY, NULL, NULL, NULL);
|
||||
ok(ret == ERROR_BADKEY, "Got unexpected ret %ld.\n", ret);
|
||||
|
||||
ret = RegCreateKeyExA(hkey_main, "Subkey1", 0, NULL, 0, KEY_NOTIFY, NULL, &hkey1, NULL);
|
||||
ok(!ret, "RegCreateKeyExA failed with error %ld\n", ret);
|
||||
/* should succeed: all versions of Windows ignore the access rights
|
||||
|
@ -1327,9 +1351,9 @@ static void test_reg_create_key(void)
|
|||
* the registry access check is performed correctly. Redirection isn't
|
||||
* being tested, so the tests don't care about whether the process is
|
||||
* running under WOW64. */
|
||||
if (!pIsWow64Process)
|
||||
if (!has_wow64())
|
||||
{
|
||||
win_skip("WOW64 flags are not recognized\n");
|
||||
skip("WOW64 flags are not recognized\n");
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -1369,7 +1393,7 @@ static void test_reg_create_key(void)
|
|||
ok(dwRet == ERROR_SUCCESS,
|
||||
"Expected SetEntriesInAclA to return ERROR_SUCCESS, got %lu, last error %lu\n", dwRet, GetLastError());
|
||||
|
||||
sd = HeapAlloc(GetProcessHeap(), 0, SECURITY_DESCRIPTOR_MIN_LENGTH);
|
||||
sd = malloc(SECURITY_DESCRIPTOR_MIN_LENGTH);
|
||||
bRet = InitializeSecurityDescriptor(sd, SECURITY_DESCRIPTOR_REVISION);
|
||||
ok(bRet == TRUE,
|
||||
"Expected InitializeSecurityDescriptor to return TRUE, got %d, last error %lu\n", bRet, GetLastError());
|
||||
|
@ -1407,7 +1431,7 @@ static void test_reg_create_key(void)
|
|||
RegCloseKey(hkey1);
|
||||
}
|
||||
|
||||
HeapFree(GetProcessHeap(), 0, sd);
|
||||
free(sd);
|
||||
LocalFree(key_acl);
|
||||
FreeSid(world_sid);
|
||||
RegDeleteKeyA(hkRoot64, "");
|
||||
|
@ -1518,62 +1542,68 @@ static BOOL set_privileges(LPCSTR privilege, BOOL set)
|
|||
return TRUE;
|
||||
}
|
||||
|
||||
static void test_reg_save_key(void)
|
||||
static void delete_dir(const char *path)
|
||||
{
|
||||
DWORD ret;
|
||||
char file[2 * MAX_PATH], *p;
|
||||
WIN32_FIND_DATAA fd;
|
||||
HANDLE hfind;
|
||||
BOOL r;
|
||||
|
||||
if (!set_privileges(SE_BACKUP_NAME, TRUE) ||
|
||||
!set_privileges(SE_RESTORE_NAME, FALSE))
|
||||
strcpy(file, path);
|
||||
p = file + strlen(file);
|
||||
p[0] = '\\';
|
||||
p[1] = '*';
|
||||
p[2] = 0;
|
||||
hfind = FindFirstFileA(file, &fd);
|
||||
if (hfind != INVALID_HANDLE_VALUE)
|
||||
{
|
||||
win_skip("Failed to set SE_BACKUP_NAME privileges, skipping tests\n");
|
||||
return;
|
||||
do
|
||||
{
|
||||
if (!strcmp(fd.cFileName, ".") || !strcmp(fd.cFileName, ".."))
|
||||
continue;
|
||||
|
||||
strcpy(p + 1, fd.cFileName);
|
||||
r = DeleteFileA(file);
|
||||
ok(r, "DeleteFile failed on %s: %ld\n", debugstr_a(file), GetLastError());
|
||||
} while(FindNextFileA(hfind, &fd));
|
||||
FindClose(hfind);
|
||||
}
|
||||
|
||||
ret = RegSaveKeyA(hkey_main, "saved_key", NULL);
|
||||
ok(ret == ERROR_SUCCESS, "expected ERROR_SUCCESS, got %ld\n", ret);
|
||||
|
||||
set_privileges(SE_BACKUP_NAME, FALSE);
|
||||
r = RemoveDirectoryA(path);
|
||||
ok(r, "RemoveDirectory failed: %ld\n", GetLastError());
|
||||
}
|
||||
|
||||
static void test_reg_load_key(void)
|
||||
{
|
||||
DWORD ret;
|
||||
HKEY hkHandle;
|
||||
|
||||
if (!set_privileges(SE_RESTORE_NAME, TRUE) ||
|
||||
!set_privileges(SE_BACKUP_NAME, FALSE))
|
||||
{
|
||||
win_skip("Failed to set SE_RESTORE_NAME privileges, skipping tests\n");
|
||||
return;
|
||||
}
|
||||
|
||||
ret = RegLoadKeyA(HKEY_LOCAL_MACHINE, "Test", "saved_key");
|
||||
ok(ret == ERROR_SUCCESS, "expected ERROR_SUCCESS, got %ld\n", ret);
|
||||
|
||||
set_privileges(SE_RESTORE_NAME, FALSE);
|
||||
|
||||
ret = RegOpenKeyA(HKEY_LOCAL_MACHINE, "Test", &hkHandle);
|
||||
ok(ret == ERROR_SUCCESS, "expected ERROR_SUCCESS, got %ld\n", ret);
|
||||
|
||||
RegCloseKey(hkHandle);
|
||||
}
|
||||
|
||||
static void test_reg_unload_key(void)
|
||||
{
|
||||
char saved_key[2 * MAX_PATH], buf[16], *p;
|
||||
UNICODE_STRING key_name;
|
||||
OBJECT_ATTRIBUTES attr;
|
||||
NTSTATUS status;
|
||||
DWORD ret;
|
||||
DWORD ret, size;
|
||||
HKEY key;
|
||||
|
||||
if (!set_privileges(SE_RESTORE_NAME, TRUE) ||
|
||||
!set_privileges(SE_BACKUP_NAME, FALSE))
|
||||
!set_privileges(SE_BACKUP_NAME, TRUE))
|
||||
{
|
||||
win_skip("Failed to set SE_RESTORE_NAME privileges, skipping tests\n");
|
||||
return;
|
||||
}
|
||||
|
||||
ret = RegOpenKeyExA(HKEY_LOCAL_MACHINE, "Test", 0, KEY_READ, &key);
|
||||
GetTempPathA(MAX_PATH, saved_key);
|
||||
strcat(saved_key, "\\wine_reg_test");
|
||||
CreateDirectoryA(saved_key, NULL);
|
||||
strcat(saved_key, "\\saved_key");
|
||||
|
||||
ret = RegSaveKeyA(hkey_main, saved_key, NULL);
|
||||
ok(ret == ERROR_SUCCESS, "expected ERROR_SUCCESS, got %ld\n", ret);
|
||||
|
||||
ret = RegLoadKeyA(HKEY_LOCAL_MACHINE, "Test", saved_key);
|
||||
ok(ret == ERROR_SUCCESS, "expected ERROR_SUCCESS, got %ld\n", ret);
|
||||
|
||||
ret = RegOpenKeyA(HKEY_LOCAL_MACHINE, "Test", &key);
|
||||
ok(ret == ERROR_SUCCESS, "expected ERROR_SUCCESS, got %ld\n", ret);
|
||||
|
||||
ret = RegSetValueExA(key, "test", 0, REG_SZ, (BYTE *)"value", 6);
|
||||
ok(ret == ERROR_SUCCESS, "expected ERROR_SUCCESS, got %ld\n", ret);
|
||||
|
||||
/* try to unload though the key handle is live */
|
||||
|
@ -1587,10 +1617,41 @@ static void test_reg_unload_key(void)
|
|||
ret = RegUnLoadKeyA(HKEY_LOCAL_MACHINE, "Test");
|
||||
ok(ret == ERROR_SUCCESS, "expected ERROR_SUCCESS, got %ld\n", ret);
|
||||
|
||||
set_privileges(SE_RESTORE_NAME, FALSE);
|
||||
/* check if modifications are saved */
|
||||
ret = RegLoadKeyA(HKEY_LOCAL_MACHINE, "Test", saved_key);
|
||||
ok(ret == ERROR_SUCCESS, "expected ERROR_SUCCESS, got %ld\n", ret);
|
||||
|
||||
DeleteFileA("saved_key");
|
||||
DeleteFileA("saved_key.LOG");
|
||||
ret = RegOpenKeyA(HKEY_LOCAL_MACHINE, "Test", &key);
|
||||
ok(ret == ERROR_SUCCESS, "expected ERROR_SUCCESS, got %ld\n", ret);
|
||||
|
||||
size = sizeof(buf);
|
||||
ret = RegGetValueA(key, NULL, "test", RRF_RT_REG_SZ, NULL, buf, &size);
|
||||
todo_wine ok(ret == ERROR_SUCCESS, "expected ERROR_SUCCESS, got %ld\n", ret);
|
||||
if (ret == ERROR_SUCCESS)
|
||||
{
|
||||
ok(size == 6, "size = %ld\n", size);
|
||||
ok(!strcmp(buf, "value"), "buf = %s\n", buf);
|
||||
}
|
||||
|
||||
RegCloseKey(key);
|
||||
|
||||
ret = RegUnLoadKeyA(HKEY_LOCAL_MACHINE, "Test");
|
||||
ok(ret == ERROR_SUCCESS, "expected ERROR_SUCCESS, got %ld\n", ret);
|
||||
|
||||
pRtlInitUnicodeString(&key_name, L"\\REGISTRY\\User\\.Default");
|
||||
InitializeObjectAttributes(&attr, &key_name, OBJ_CASE_INSENSITIVE, NULL, NULL);
|
||||
status = pNtUnloadKey(&attr);
|
||||
ok(status == STATUS_ACCESS_DENIED, "expected STATUS_ACCESS_DENIED, got %08lx\n", status);
|
||||
|
||||
ret = RegUnLoadKeyA(HKEY_USERS, ".Default");
|
||||
ok(ret == ERROR_ACCESS_DENIED, "expected ERROR_ACCESS_DENIED, got %ld\n", ret);
|
||||
|
||||
set_privileges(SE_RESTORE_NAME, FALSE);
|
||||
set_privileges(SE_BACKUP_NAME, FALSE);
|
||||
|
||||
p = strrchr(saved_key, '\\');
|
||||
*p = 0;
|
||||
delete_dir(saved_key);
|
||||
}
|
||||
|
||||
/* Helper function to wait for a file blocked by the registry to be available */
|
||||
|
@ -1612,31 +1673,26 @@ static void wait_file_available(char *path)
|
|||
static void test_reg_load_app_key(void)
|
||||
{
|
||||
DWORD ret, size;
|
||||
char temppath[MAX_PATH], hivefilepath[MAX_PATH];
|
||||
char hivefilepath[2 * MAX_PATH], *p;
|
||||
const BYTE test_data[] = "Hello World";
|
||||
BYTE output[sizeof(test_data)];
|
||||
HKEY appkey = NULL;
|
||||
|
||||
GetTempPathA(sizeof(temppath), temppath);
|
||||
GetTempFileNameA(temppath, "key", 0, hivefilepath);
|
||||
DeleteFileA(hivefilepath);
|
||||
|
||||
if (!set_privileges(SE_BACKUP_NAME, TRUE) ||
|
||||
!set_privileges(SE_RESTORE_NAME, FALSE))
|
||||
if (!set_privileges(SE_BACKUP_NAME, TRUE))
|
||||
{
|
||||
win_skip("Failed to set SE_BACKUP_NAME privileges, skipping tests\n");
|
||||
return;
|
||||
}
|
||||
|
||||
GetTempPathA(MAX_PATH, hivefilepath);
|
||||
strcat(hivefilepath, "\\wine_reg_test");
|
||||
CreateDirectoryA(hivefilepath, NULL);
|
||||
strcat(hivefilepath, "\\saved_key");
|
||||
|
||||
ret = RegSaveKeyA(hkey_main, hivefilepath, NULL);
|
||||
if (ret != ERROR_SUCCESS)
|
||||
{
|
||||
win_skip("Failed to save test key 0x%lx\n", ret);
|
||||
return;
|
||||
}
|
||||
ok(ret == ERROR_SUCCESS, "expected ERROR_SUCCESS, got %ld\n", ret);
|
||||
|
||||
set_privileges(SE_BACKUP_NAME, FALSE);
|
||||
set_privileges(SE_RESTORE_NAME, FALSE);
|
||||
|
||||
/* Test simple key load */
|
||||
/* Check if the changes are saved */
|
||||
|
@ -1665,8 +1721,10 @@ static void test_reg_load_app_key(void)
|
|||
RegCloseKey(appkey);
|
||||
|
||||
wait_file_available(hivefilepath);
|
||||
ret = DeleteFileA(hivefilepath);
|
||||
ok(ret, "couldn't delete hive file %ld\n", GetLastError());
|
||||
|
||||
p = strrchr(hivefilepath, '\\');
|
||||
*p = 0;
|
||||
delete_dir(hivefilepath);
|
||||
}
|
||||
|
||||
/* tests that show that RegConnectRegistry and
|
||||
|
@ -2406,7 +2464,7 @@ static void test_symlinks(void)
|
|||
pRtlFormatCurrentUserKeyPath( &target_str );
|
||||
|
||||
target_len = target_str.Length + sizeof(targetW);
|
||||
target = HeapAlloc( GetProcessHeap(), 0, target_len );
|
||||
target = malloc( target_len );
|
||||
memcpy( target, target_str.Buffer, target_str.Length );
|
||||
memcpy( target + target_str.Length/sizeof(WCHAR), targetW, sizeof(targetW) );
|
||||
|
||||
|
@ -2511,7 +2569,7 @@ static void test_symlinks(void)
|
|||
ok( !status, "NtDeleteKey failed: 0x%08lx\n", status );
|
||||
RegCloseKey( link );
|
||||
|
||||
HeapFree( GetProcessHeap(), 0, target );
|
||||
free( target );
|
||||
pRtlFreeUnicodeString( &target_str );
|
||||
}
|
||||
|
||||
|
@ -2575,14 +2633,10 @@ static void test_redirection(void)
|
|||
HKEY key, key32, key64, root, root32, root64;
|
||||
DWORD subkeys, subkeys32, subkeys64;
|
||||
|
||||
if (ptr_size != 64)
|
||||
if (!has_wow64())
|
||||
{
|
||||
BOOL is_wow64;
|
||||
if (!pIsWow64Process || !pIsWow64Process( GetCurrentProcess(), &is_wow64 ) || !is_wow64)
|
||||
{
|
||||
skip( "Not on Wow64, no redirection\n" );
|
||||
return;
|
||||
}
|
||||
skip( "Not on Wow64, no redirection\n" );
|
||||
return;
|
||||
}
|
||||
|
||||
if (limited_user)
|
||||
|
@ -2763,6 +2817,28 @@ static void test_redirection(void)
|
|||
RegCloseKey( root32 );
|
||||
RegCloseKey( root64 );
|
||||
|
||||
err = RegCreateKeyExW( HKEY_LOCAL_MACHINE, L"Software\\WOW6432Node\\test1\\test2", 0, NULL, 0,
|
||||
KEY_WRITE | KEY_WOW64_32KEY, NULL, &key, NULL );
|
||||
ok(!err, "got %#lx.\n", err);
|
||||
RegCloseKey(key);
|
||||
|
||||
err = RegCreateKeyExW( HKEY_LOCAL_MACHINE, L"Software\\test1\\test2", 0, NULL, 0, KEY_WRITE | KEY_WOW64_32KEY,
|
||||
NULL, &key, NULL );
|
||||
ok(!err, "got %#lx.\n", err);
|
||||
RegCloseKey(key);
|
||||
|
||||
err = RegOpenKeyExW( HKEY_LOCAL_MACHINE, L"Software\\test1\\test2", 0, KEY_WRITE | KEY_WOW64_32KEY, &key );
|
||||
ok(!err, "got %#lx.\n", err);
|
||||
RegCloseKey(key);
|
||||
|
||||
if (pRegDeleteTreeA)
|
||||
{
|
||||
err = pRegDeleteTreeA(HKEY_LOCAL_MACHINE, "Software\\WOW6432Node\\test1");
|
||||
ok(!err, "got %#lx.\n", err);
|
||||
err = pRegDeleteTreeA(HKEY_LOCAL_MACHINE, "Software\\test1");
|
||||
ok(err == ERROR_FILE_NOT_FOUND, "got %#lx.\n", err);
|
||||
}
|
||||
|
||||
/* Software\Classes is shared/reflected so behavior is different */
|
||||
|
||||
err = RegCreateKeyExA( HKEY_LOCAL_MACHINE, "Software\\Classes\\Wine",
|
||||
|
@ -4936,9 +5012,7 @@ START_TEST(registry)
|
|||
test_classesroot();
|
||||
test_classesroot_enum();
|
||||
test_classesroot_mask();
|
||||
test_reg_save_key();
|
||||
test_reg_load_key();
|
||||
test_reg_unload_key();
|
||||
test_reg_load_app_key();
|
||||
test_reg_copy_tree();
|
||||
test_reg_delete_tree();
|
||||
|
|
File diff suppressed because it is too large
Load diff
|
@ -1000,14 +1000,14 @@ static void test_query_svc(void)
|
|||
}
|
||||
|
||||
/* Pass a correct buffer and buffersize but a NULL handle */
|
||||
statusproc = HeapAlloc(GetProcessHeap(), 0, sizeof(SERVICE_STATUS_PROCESS));
|
||||
statusproc = malloc(sizeof(SERVICE_STATUS_PROCESS));
|
||||
bufsize = needed;
|
||||
SetLastError(0xdeadbeef);
|
||||
ret = pQueryServiceStatusEx(NULL, SC_STATUS_PROCESS_INFO, (BYTE*)statusproc, bufsize, &needed);
|
||||
ok(!ret, "Expected failure\n");
|
||||
ok(GetLastError() == ERROR_INVALID_HANDLE,
|
||||
"Expected ERROR_INVALID_HANDLE, got %ld\n", GetLastError());
|
||||
HeapFree(GetProcessHeap(), 0, statusproc);
|
||||
free(statusproc);
|
||||
|
||||
/* Correct handle and info level */
|
||||
SetLastError(0xdeadbeef);
|
||||
|
@ -1023,21 +1023,21 @@ static void test_query_svc(void)
|
|||
}
|
||||
|
||||
/* All parameters are OK but we don't have enough rights */
|
||||
statusproc = HeapAlloc(GetProcessHeap(), 0, sizeof(SERVICE_STATUS_PROCESS));
|
||||
statusproc = malloc(sizeof(SERVICE_STATUS_PROCESS));
|
||||
bufsize = sizeof(SERVICE_STATUS_PROCESS);
|
||||
SetLastError(0xdeadbeef);
|
||||
ret = pQueryServiceStatusEx(svc_handle, SC_STATUS_PROCESS_INFO, (BYTE*)statusproc, bufsize, &needed);
|
||||
ok(!ret, "Expected failure\n");
|
||||
ok(GetLastError() == ERROR_ACCESS_DENIED,
|
||||
"Expected ERROR_ACCESS_DENIED, got %ld\n", GetLastError());
|
||||
HeapFree(GetProcessHeap(), 0, statusproc);
|
||||
free(statusproc);
|
||||
|
||||
/* Open the service with just enough rights. */
|
||||
CloseServiceHandle(svc_handle);
|
||||
svc_handle = OpenServiceA(scm_handle, spooler, SERVICE_QUERY_STATUS);
|
||||
|
||||
/* Everything should be fine now. */
|
||||
statusproc = HeapAlloc(GetProcessHeap(), 0, sizeof(SERVICE_STATUS_PROCESS));
|
||||
statusproc = malloc(sizeof(SERVICE_STATUS_PROCESS));
|
||||
bufsize = sizeof(SERVICE_STATUS_PROCESS);
|
||||
SetLastError(0xdeadbeef);
|
||||
ret = pQueryServiceStatusEx(svc_handle, SC_STATUS_PROCESS_INFO, (BYTE*)statusproc, bufsize, &needed);
|
||||
|
@ -1056,7 +1056,7 @@ static void test_query_svc(void)
|
|||
ok(broken(GetLastError() == ERROR_INVALID_PARAMETER) /* NT4 */ ||
|
||||
GetLastError() == ERROR_INVALID_ADDRESS, "got %ld\n", GetLastError());
|
||||
|
||||
HeapFree(GetProcessHeap(), 0, statusproc);
|
||||
free(statusproc);
|
||||
|
||||
CloseServiceHandle(svc_handle);
|
||||
CloseServiceHandle(scm_handle);
|
||||
|
@ -1274,14 +1274,14 @@ static BOOL test_enum_svc(int attempt)
|
|||
tempneeded = needed;
|
||||
|
||||
/* Allocate the correct needed bytes */
|
||||
services = HeapAlloc(GetProcessHeap(), 0, needed);
|
||||
services = malloc(needed);
|
||||
bufsize = needed;
|
||||
needed = 0xdeadbeef;
|
||||
returned = 0xdeadbeef;
|
||||
SetLastError(0xdeadbeef);
|
||||
ret = EnumServicesStatusW(scm_handle, SERVICE_WIN32, SERVICE_STATE_ALL,
|
||||
services, bufsize, &needed, &returned, NULL);
|
||||
HeapFree(GetProcessHeap(), 0, services);
|
||||
free(services);
|
||||
if (!ret && GetLastError() == ERROR_MORE_DATA && attempt)
|
||||
goto retry; /* service start race condition */
|
||||
ok(ret, "Expected success, got error %lu\n", GetLastError());
|
||||
|
@ -1291,14 +1291,14 @@ static BOOL test_enum_svc(int attempt)
|
|||
/* Store the number of returned services */
|
||||
tempreturned = returned;
|
||||
|
||||
servicesA = HeapAlloc(GetProcessHeap(), 0, neededA);
|
||||
servicesA = malloc(neededA);
|
||||
bufsize = neededA;
|
||||
neededA = 0xdeadbeef;
|
||||
returnedA = 0xdeadbeef;
|
||||
SetLastError(0xdeadbeef);
|
||||
ret = EnumServicesStatusA(scm_handle, SERVICE_WIN32, SERVICE_STATE_ALL,
|
||||
servicesA, bufsize, &neededA, &returnedA, NULL);
|
||||
HeapFree(GetProcessHeap(), 0, servicesA);
|
||||
free(servicesA);
|
||||
if (!ret && GetLastError() == ERROR_MORE_DATA && attempt)
|
||||
goto retry; /* service start race condition */
|
||||
if (!ret && GetLastError() == ERROR_NOT_ENOUGH_MEMORY && GetACP() == CP_UTF8)
|
||||
|
@ -1314,7 +1314,7 @@ static BOOL test_enum_svc(int attempt)
|
|||
* More than one service will be missing because of the space needed for
|
||||
* the strings.
|
||||
*/
|
||||
services = HeapAlloc(GetProcessHeap(), 0, tempneeded);
|
||||
services = malloc(tempneeded);
|
||||
bufsize = (tempreturned - 1) * sizeof(ENUM_SERVICE_STATUSW);
|
||||
needed = 0xdeadbeef;
|
||||
returned = 0xdeadbeef;
|
||||
|
@ -1323,7 +1323,7 @@ static BOOL test_enum_svc(int attempt)
|
|||
services, bufsize, &needed, &returned, NULL);
|
||||
if (ret && needed == 0 && attempt)
|
||||
{
|
||||
HeapFree(GetProcessHeap(), 0, services);
|
||||
free(services);
|
||||
goto retry; /* service stop race condition */
|
||||
}
|
||||
ok(!ret, "Expected failure\n");
|
||||
|
@ -1346,7 +1346,7 @@ static BOOL test_enum_svc(int attempt)
|
|||
services, bufsize, &needed, &returned, &resume);
|
||||
if (ret && needed == 0 && attempt)
|
||||
{
|
||||
HeapFree(GetProcessHeap(), 0, services);
|
||||
free(services);
|
||||
goto retry; /* service stop race condition */
|
||||
}
|
||||
ok(!ret, "Expected failure\n");
|
||||
|
@ -1365,7 +1365,7 @@ static BOOL test_enum_svc(int attempt)
|
|||
SetLastError(0xdeadbeef);
|
||||
ret = EnumServicesStatusW(scm_handle, SERVICE_WIN32, SERVICE_STATE_ALL,
|
||||
services, bufsize, &needed, &returned, &resume);
|
||||
HeapFree(GetProcessHeap(), 0, services);
|
||||
free(services);
|
||||
if (!ret && GetLastError() == ERROR_MORE_DATA && attempt)
|
||||
goto retry; /* service start race condition */
|
||||
ok(ret, "Expected success, got error %lu\n", GetLastError());
|
||||
|
@ -1390,10 +1390,10 @@ static BOOL test_enum_svc(int attempt)
|
|||
/* Get the number of active win32 services */
|
||||
EnumServicesStatusW(scm_handle, SERVICE_WIN32, SERVICE_ACTIVE, NULL, 0,
|
||||
&needed, &returned, NULL);
|
||||
services = HeapAlloc(GetProcessHeap(), 0, needed);
|
||||
services = malloc(needed);
|
||||
ret = EnumServicesStatusW(scm_handle, SERVICE_WIN32, SERVICE_ACTIVE,
|
||||
services, needed, &needed, &returned, NULL);
|
||||
HeapFree(GetProcessHeap(), 0, services);
|
||||
free(services);
|
||||
if (!ret && GetLastError() == ERROR_MORE_DATA && attempt)
|
||||
goto retry; /* service start race condition */
|
||||
|
||||
|
@ -1402,10 +1402,10 @@ static BOOL test_enum_svc(int attempt)
|
|||
/* Get the number of inactive win32 services */
|
||||
EnumServicesStatusW(scm_handle, SERVICE_WIN32, SERVICE_INACTIVE, NULL, 0,
|
||||
&needed, &returned, NULL);
|
||||
services = HeapAlloc(GetProcessHeap(), 0, needed);
|
||||
services = malloc(needed);
|
||||
ret = EnumServicesStatusW(scm_handle, SERVICE_WIN32, SERVICE_INACTIVE,
|
||||
services, needed, &needed, &returned, NULL);
|
||||
HeapFree(GetProcessHeap(), 0, services);
|
||||
free(services);
|
||||
if (!ret && GetLastError() == ERROR_MORE_DATA && attempt)
|
||||
goto retry; /* service start race condition */
|
||||
|
||||
|
@ -1414,10 +1414,10 @@ static BOOL test_enum_svc(int attempt)
|
|||
/* Get the number of win32 services */
|
||||
EnumServicesStatusW(scm_handle, SERVICE_WIN32, SERVICE_STATE_ALL, NULL, 0,
|
||||
&needed, &returned, NULL);
|
||||
services = HeapAlloc(GetProcessHeap(), 0, needed);
|
||||
services = malloc(needed);
|
||||
ret = EnumServicesStatusW(scm_handle, SERVICE_WIN32, SERVICE_STATE_ALL,
|
||||
services, needed, &needed, &returned, NULL);
|
||||
HeapFree(GetProcessHeap(), 0, services);
|
||||
free(services);
|
||||
if (!ret && GetLastError() == ERROR_MORE_DATA && attempt)
|
||||
goto retry; /* service start race condition */
|
||||
|
||||
|
@ -1435,7 +1435,7 @@ static BOOL test_enum_svc(int attempt)
|
|||
*/
|
||||
EnumServicesStatusW(scm_handle, SERVICE_DRIVER | SERVICE_WIN32, SERVICE_STATE_ALL,
|
||||
NULL, 0, &needed, &returned, NULL);
|
||||
services = HeapAlloc(GetProcessHeap(), 0, needed);
|
||||
services = malloc(needed);
|
||||
ret = EnumServicesStatusW(scm_handle, SERVICE_DRIVER | SERVICE_WIN32, SERVICE_STATE_ALL,
|
||||
services, needed, &needed, &returned, NULL);
|
||||
if (!ret && GetLastError() == ERROR_MORE_DATA && attempt)
|
||||
|
@ -1482,7 +1482,7 @@ static BOOL test_enum_svc(int attempt)
|
|||
}
|
||||
}
|
||||
}
|
||||
HeapFree(GetProcessHeap(), 0, services);
|
||||
free(services);
|
||||
|
||||
if ((servicecountactive || servicecountinactive) && attempt)
|
||||
goto retry; /* service start|stop race condition */
|
||||
|
@ -1695,11 +1695,11 @@ static BOOL test_enum_svc_ex(int attempt)
|
|||
/* Show the Ex call returns the same service count as the regular enum */
|
||||
EnumServicesStatusW(scm_handle, SERVICE_WIN32, SERVICE_STATE_ALL,
|
||||
NULL, 0, &needed, &returned, NULL);
|
||||
services = HeapAlloc(GetProcessHeap(), 0, needed);
|
||||
services = malloc(needed);
|
||||
returned = 0xdeadbeef;
|
||||
ret = EnumServicesStatusW(scm_handle, SERVICE_WIN32, SERVICE_STATE_ALL,
|
||||
services, needed, &needed, &returned, NULL);
|
||||
HeapFree(GetProcessHeap(), 0, services);
|
||||
free(services);
|
||||
if (!ret && GetLastError() == ERROR_MORE_DATA && attempt)
|
||||
goto retry; /* service start race condition */
|
||||
ok(ret, "Expected success, got error %lu\n", GetLastError());
|
||||
|
@ -1710,14 +1710,14 @@ static BOOL test_enum_svc_ex(int attempt)
|
|||
tempreturned = returned;
|
||||
|
||||
/* Allocate the correct needed bytes */
|
||||
exservices = HeapAlloc(GetProcessHeap(), 0, tempneeded);
|
||||
exservices = malloc(tempneeded);
|
||||
bufsize = tempneeded;
|
||||
needed = 0xdeadbeef;
|
||||
returned = 0xdeadbeef;
|
||||
SetLastError(0xdeadbeef);
|
||||
ret = pEnumServicesStatusExW(scm_handle, 0, SERVICE_WIN32, SERVICE_STATE_ALL,
|
||||
(BYTE*)exservices, bufsize, &needed, &returned, NULL, NULL);
|
||||
HeapFree(GetProcessHeap(), 0, exservices);
|
||||
free(exservices);
|
||||
if (!ret && GetLastError() == ERROR_MORE_DATA && attempt)
|
||||
goto retry; /* service start race condition */
|
||||
ok(ret, "Expected success, got error %lu\n", GetLastError());
|
||||
|
@ -1731,7 +1731,7 @@ static BOOL test_enum_svc_ex(int attempt)
|
|||
* More than one service will be missing because of the space needed for
|
||||
* the strings.
|
||||
*/
|
||||
exservices = HeapAlloc(GetProcessHeap(), 0, tempneeded);
|
||||
exservices = malloc(tempneeded);
|
||||
bufsize = (tempreturned - 1) * sizeof(ENUM_SERVICE_STATUSW);
|
||||
needed = 0xdeadbeef;
|
||||
returned = 0xdeadbeef;
|
||||
|
@ -1740,7 +1740,7 @@ static BOOL test_enum_svc_ex(int attempt)
|
|||
(BYTE*)exservices, bufsize, &needed, &returned, NULL, NULL);
|
||||
if (ret && needed == 0 && attempt)
|
||||
{
|
||||
HeapFree(GetProcessHeap(), 0, exservices);
|
||||
free(exservices);
|
||||
goto retry; /* service stop race condition */
|
||||
}
|
||||
ok(!ret, "Expected failure\n");
|
||||
|
@ -1763,7 +1763,7 @@ static BOOL test_enum_svc_ex(int attempt)
|
|||
(BYTE*)exservices, bufsize, &needed, &returned, &resume, NULL);
|
||||
if (ret && needed == 0 && attempt)
|
||||
{
|
||||
HeapFree(GetProcessHeap(), 0, exservices);
|
||||
free(exservices);
|
||||
goto retry; /* service stop race condition */
|
||||
}
|
||||
ok(!ret, "Expected failure\n");
|
||||
|
@ -1782,7 +1782,7 @@ static BOOL test_enum_svc_ex(int attempt)
|
|||
SetLastError(0xdeadbeef);
|
||||
ret = pEnumServicesStatusExW(scm_handle, 0, SERVICE_WIN32, SERVICE_STATE_ALL,
|
||||
(BYTE*)exservices, bufsize, &needed, &returned, &resume, NULL);
|
||||
HeapFree(GetProcessHeap(), 0, exservices);
|
||||
free(exservices);
|
||||
if (!ret && GetLastError() == ERROR_MORE_DATA && attempt)
|
||||
goto retry; /* service start race condition */
|
||||
ok(ret, "Expected success, got error %lu\n", GetLastError());
|
||||
|
@ -1795,10 +1795,10 @@ static BOOL test_enum_svc_ex(int attempt)
|
|||
/* Get the number of active win32 services */
|
||||
pEnumServicesStatusExW(scm_handle, 0, SERVICE_WIN32, SERVICE_ACTIVE,
|
||||
NULL, 0, &needed, &returned, NULL, NULL);
|
||||
exservices = HeapAlloc(GetProcessHeap(), 0, needed);
|
||||
exservices = malloc(needed);
|
||||
ret = pEnumServicesStatusExW(scm_handle, 0, SERVICE_WIN32, SERVICE_ACTIVE,
|
||||
(BYTE*)exservices, needed, &needed, &returned, NULL, NULL);
|
||||
HeapFree(GetProcessHeap(), 0, exservices);
|
||||
free(exservices);
|
||||
if (!ret && GetLastError() == ERROR_MORE_DATA && attempt)
|
||||
goto retry; /* service start race condition */
|
||||
|
||||
|
@ -1807,10 +1807,10 @@ static BOOL test_enum_svc_ex(int attempt)
|
|||
/* Get the number of inactive win32 services */
|
||||
pEnumServicesStatusExW(scm_handle, 0, SERVICE_WIN32, SERVICE_INACTIVE,
|
||||
NULL, 0, &needed, &returned, NULL, NULL);
|
||||
exservices = HeapAlloc(GetProcessHeap(), 0, needed);
|
||||
exservices = malloc(needed);
|
||||
ret = pEnumServicesStatusExW(scm_handle, 0, SERVICE_WIN32, SERVICE_INACTIVE,
|
||||
(BYTE*)exservices, needed, &needed, &returned, NULL, NULL);
|
||||
HeapFree(GetProcessHeap(), 0, exservices);
|
||||
free(exservices);
|
||||
if (!ret && GetLastError() == ERROR_MORE_DATA && attempt)
|
||||
goto retry; /* service start race condition */
|
||||
|
||||
|
@ -1819,10 +1819,10 @@ static BOOL test_enum_svc_ex(int attempt)
|
|||
/* Get the number of win32 services */
|
||||
pEnumServicesStatusExW(scm_handle, 0, SERVICE_WIN32, SERVICE_STATE_ALL,
|
||||
NULL, 0, &needed, &returned, NULL, NULL);
|
||||
exservices = HeapAlloc(GetProcessHeap(), 0, needed);
|
||||
exservices = malloc(needed);
|
||||
ret = pEnumServicesStatusExW(scm_handle, 0, SERVICE_WIN32, SERVICE_STATE_ALL,
|
||||
(BYTE*)exservices, needed, &needed, &returned, NULL, NULL);
|
||||
HeapFree(GetProcessHeap(), 0, exservices);
|
||||
free(exservices);
|
||||
if (!ret && GetLastError() == ERROR_MORE_DATA && attempt)
|
||||
goto retry; /* service start race condition */
|
||||
|
||||
|
@ -1837,7 +1837,7 @@ static BOOL test_enum_svc_ex(int attempt)
|
|||
ret = pEnumServicesStatusExW(scm_handle, 0, SERVICE_WIN32 | SERVICE_DRIVER,
|
||||
SERVICE_STATE_ALL, NULL, 0, &needed, &returned, NULL, NULL);
|
||||
ok(!ret, "Expected failure\n");
|
||||
exservices = HeapAlloc(GetProcessHeap(), 0, needed);
|
||||
exservices = malloc(needed);
|
||||
ret = pEnumServicesStatusExW(scm_handle, 0, SERVICE_WIN32 | SERVICE_DRIVER,
|
||||
SERVICE_STATE_ALL, (BYTE*)exservices, needed, &needed, &returned, NULL, NULL);
|
||||
if (!ret && GetLastError() == ERROR_MORE_DATA && attempt)
|
||||
|
@ -1908,7 +1908,7 @@ static BOOL test_enum_svc_ex(int attempt)
|
|||
}
|
||||
}
|
||||
}
|
||||
HeapFree(GetProcessHeap(), 0, exservices);
|
||||
free(exservices);
|
||||
|
||||
if ((servicecountactive || servicecountinactive) && attempt)
|
||||
goto retry; /* service start|stop race condition */
|
||||
|
@ -2154,7 +2154,7 @@ static void test_sequence(void)
|
|||
ok(!ret, "Expected failure\n");
|
||||
ok(GetLastError() == ERROR_INSUFFICIENT_BUFFER, "Expected ERROR_INSUFFICIENT_BUFFER, got %ld\n", GetLastError());
|
||||
|
||||
config = HeapAlloc(GetProcessHeap(), 0, needed);
|
||||
config = malloc(needed);
|
||||
given = needed;
|
||||
SetLastError(0xdeadbeef);
|
||||
ret = QueryServiceConfigA(svc_handle, config, given, &needed);
|
||||
|
@ -2182,7 +2182,7 @@ static void test_sequence(void)
|
|||
ok(ret, "ChangeServiceConfig failed (err=%ld)\n", GetLastError());
|
||||
|
||||
QueryServiceConfigA(svc_handle, NULL, 0, &needed);
|
||||
config = HeapReAlloc(GetProcessHeap(), 0, config, needed);
|
||||
config = realloc(config, needed);
|
||||
ok(QueryServiceConfigA(svc_handle, config, needed, &needed), "QueryServiceConfig failed\n");
|
||||
ok(config->lpBinaryPathName && config->lpLoadOrderGroup && config->lpDependencies && config->lpServiceStartName &&
|
||||
config->lpDisplayName, "Expected all string struct members to be non-NULL\n");
|
||||
|
@ -2201,7 +2201,7 @@ static void test_sequence(void)
|
|||
ok(ret, "Expected success, got error %lu\n", GetLastError());
|
||||
CloseServiceHandle(svc_handle);
|
||||
CloseServiceHandle(scm_handle);
|
||||
HeapFree(GetProcessHeap(), 0, config);
|
||||
free(config);
|
||||
}
|
||||
|
||||
static void test_queryconfig2(void)
|
||||
|
@ -2890,7 +2890,7 @@ static void test_EventLog(void)
|
|||
ok(!ret, "QueryServiceConfig should fail\n");
|
||||
ok(GetLastError() == ERROR_INSUFFICIENT_BUFFER, "got %lu\n", GetLastError());
|
||||
|
||||
config = HeapAlloc(GetProcessHeap(), 0, size);
|
||||
config = malloc(size);
|
||||
ret = QueryServiceConfigA(svc_handle, config, size, &size);
|
||||
ok(ret, "QueryServiceConfig error %lu\n", GetLastError());
|
||||
|
||||
|
@ -2912,7 +2912,7 @@ static void test_EventLog(void)
|
|||
!strcmp(config->lpDisplayName, "Event Log") /* XP */ ||
|
||||
!strcmp(config->lpDisplayName, "Windows Event Log") /* Vista+ */, "got %s\n", config->lpDisplayName);
|
||||
|
||||
HeapFree(GetProcessHeap(), 0, config);
|
||||
free(config);
|
||||
|
||||
memset(&status, 0, sizeof(status));
|
||||
size = sizeof(status);
|
||||
|
|
|
@ -254,6 +254,8 @@ static ULONG WINAPI filter_Release(IMediaStreamFilter *iface)
|
|||
free(filter->streams);
|
||||
if (filter->clock)
|
||||
IReferenceClock_Release(filter->clock);
|
||||
if (filter->cs.DebugInfo)
|
||||
filter->cs.DebugInfo->Spare[0] = 0;
|
||||
DeleteCriticalSection(&filter->cs);
|
||||
free(filter);
|
||||
}
|
||||
|
@ -1100,7 +1102,7 @@ HRESULT filter_create(IUnknown *outer, void **out)
|
|||
object->refcount = 1;
|
||||
list_init(&object->free_events);
|
||||
list_init(&object->used_events);
|
||||
InitializeCriticalSection(&object->cs);
|
||||
InitializeCriticalSectionEx(&object->cs, 0, RTL_CRITICAL_SECTION_FLAG_FORCE_DEBUG_INFO);
|
||||
object->cs.DebugInfo->Spare[0] = (DWORD_PTR)(__FILE__ ": MediaStreamFilter.cs");
|
||||
|
||||
TRACE("Created media stream filter %p.\n", object);
|
||||
|
|
|
@ -56,10 +56,10 @@ WINE_DEFAULT_DEBUG_CHANNEL(appwizcpl);
|
|||
#define GECKO_SHA "???"
|
||||
#endif
|
||||
|
||||
#define MONO_VERSION "8.1.0"
|
||||
#define MONO_VERSION "9.0.0"
|
||||
#if defined(__i386__) || defined(__x86_64__)
|
||||
#define MONO_ARCH "x86"
|
||||
#define MONO_SHA "0ed3ec533aef79b2f312155931cf7b1080009ac0c5b4c2bcfeb678ac948e0810"
|
||||
#define MONO_SHA "79f6c43100675566c112f4199b9ea7b944d338164b34bd91fa11b0b0a414e1c4"
|
||||
#else
|
||||
#define MONO_ARCH ""
|
||||
#define MONO_SHA "???"
|
||||
|
@ -108,8 +108,7 @@ static LPWSTR url = NULL;
|
|||
static IBinding *dwl_binding;
|
||||
static WCHAR *msi_file;
|
||||
|
||||
extern const char * CDECL wine_get_version(void);
|
||||
|
||||
static const char * (CDECL *p_wine_get_version)(void);
|
||||
static WCHAR * (CDECL *p_wine_get_dos_file_name)(const char*);
|
||||
|
||||
static BOOL sha_check(const WCHAR *file_name)
|
||||
|
@ -610,7 +609,7 @@ static void append_url_params( WCHAR *url )
|
|||
len += MultiByteToWideChar(CP_ACP, 0, addon->version, -1, url+len, size/sizeof(WCHAR)-len)-1;
|
||||
lstrcpyW(url+len, L"&winev=");
|
||||
len += lstrlenW(L"&winev=");
|
||||
MultiByteToWideChar(CP_ACP, 0, wine_get_version(), -1, url+len, size/sizeof(WCHAR)-len);
|
||||
MultiByteToWideChar(CP_ACP, 0, p_wine_get_version() ? p_wine_get_version() : 0, -1, url+len, size/sizeof(WCHAR)-len);
|
||||
}
|
||||
|
||||
static LPWSTR get_url(void)
|
||||
|
@ -751,6 +750,7 @@ BOOL install_addon(addon_t addon_type)
|
|||
addon = addons_info+addon_type;
|
||||
|
||||
p_wine_get_dos_file_name = (void *)GetProcAddress(GetModuleHandleW(L"kernel32.dll"), "wine_get_dos_file_name");
|
||||
p_wine_get_version = (void *)GetProcAddress(GetModuleHandleW(L"ntdll.dll"), "wine_get_version");
|
||||
|
||||
/*
|
||||
* Try to find addon .msi file in following order:
|
||||
|
|
|
@ -122,7 +122,7 @@ coclass WAVFile { interface IAVIFile; }
|
|||
threading(both),
|
||||
uuid(0002000d-0000-0000-c000-000000000046)
|
||||
]
|
||||
coclass PSFactoryBuffer { interface IFactoryBuffer; }
|
||||
coclass PSFactoryBuffer { interface IPSFactoryBuffer; }
|
||||
|
||||
[
|
||||
helpstring("ACM Compressed Audio Stream"),
|
||||
|
|
|
@ -254,6 +254,8 @@ static LPVOID WINAPI IGetFrame_fnGetFrame(IGetFrame *iface, LONG lPos)
|
|||
} /* for (lNext < lPos) */
|
||||
} /* if (This->lCurrentFrame != lPos) */
|
||||
|
||||
This->lCurrentFrame = lPos;
|
||||
|
||||
return (This->hic == NULL ? This->lpInFormat : This->lpOutFormat);
|
||||
}
|
||||
|
||||
|
|
|
@ -175,6 +175,7 @@ struct key_symmetric
|
|||
};
|
||||
|
||||
#define KEY_FLAG_LEGACY_DSA_V2 0x00000001
|
||||
#define KEY_FLAG_FINALIZED 0x00000002
|
||||
|
||||
struct key_asymmetric
|
||||
{
|
||||
|
@ -183,11 +184,12 @@ struct key_asymmetric
|
|||
DSSSEED dss_seed;
|
||||
};
|
||||
|
||||
#define PRIVATE_DATA_SIZE 3
|
||||
struct key
|
||||
{
|
||||
struct object hdr;
|
||||
enum alg_id alg_id;
|
||||
UINT64 private[2]; /* private data for backend */
|
||||
UINT64 private[PRIVATE_DATA_SIZE]; /* private data for backend */
|
||||
union
|
||||
{
|
||||
struct key_symmetric s;
|
||||
|
@ -239,19 +241,23 @@ struct key_asymmetric_decrypt_params
|
|||
struct key *key;
|
||||
UCHAR *input;
|
||||
unsigned input_len;
|
||||
void *padding;
|
||||
UCHAR *output;
|
||||
ULONG output_len;
|
||||
ULONG *ret_len;
|
||||
ULONG flags;
|
||||
};
|
||||
|
||||
struct key_asymmetric_encrypt_params
|
||||
{
|
||||
struct key *key;
|
||||
UCHAR *input;
|
||||
unsigned input_len;
|
||||
unsigned input_len;
|
||||
void *padding;
|
||||
UCHAR *output;
|
||||
ULONG output_len;
|
||||
ULONG output_len;
|
||||
ULONG *ret_len;
|
||||
ULONG flags;
|
||||
};
|
||||
|
||||
struct key_asymmetric_duplicate_params
|
||||
|
@ -283,8 +289,10 @@ struct key_asymmetric_verify_params
|
|||
unsigned flags;
|
||||
};
|
||||
|
||||
#define KEY_EXPORT_FLAG_PUBLIC 0x00000001
|
||||
#define KEY_EXPORT_FLAG_RSA_FULL 0x00000002
|
||||
#define KEY_EXPORT_FLAG_PUBLIC 0x00000001
|
||||
#define KEY_EXPORT_FLAG_RSA_FULL 0x00000002
|
||||
#define KEY_EXPORT_FLAG_DH_PARAMETERS 0x00000004
|
||||
|
||||
struct key_asymmetric_export_params
|
||||
{
|
||||
struct key *key;
|
||||
|
@ -294,7 +302,9 @@ struct key_asymmetric_export_params
|
|||
ULONG *ret_len;
|
||||
};
|
||||
|
||||
#define KEY_IMPORT_FLAG_PUBLIC 0x00000001
|
||||
#define KEY_IMPORT_FLAG_PUBLIC 0x00000001
|
||||
#define KEY_IMPORT_FLAG_DH_PARAMETERS 0x00000002
|
||||
|
||||
struct key_asymmetric_import_params
|
||||
{
|
||||
struct key *key;
|
||||
|
|
|
@ -272,7 +272,7 @@ static struct object *get_object( BCRYPT_HANDLE handle, ULONG magic )
|
|||
}
|
||||
|
||||
idx = (ULONG_PTR)handle >> 4;
|
||||
if (idx > ARRAY_SIZE(pseudo_algorithms) || !pseudo_algorithms[idx].hdr.magic)
|
||||
if (idx >= ARRAY_SIZE(pseudo_algorithms) || !pseudo_algorithms[idx].hdr.magic)
|
||||
{
|
||||
FIXME( "pseudo-handle %p not supported\n", handle );
|
||||
return NULL;
|
||||
|
@ -732,7 +732,7 @@ static NTSTATUS get_rsa_property( enum chain_mode mode, const WCHAR *prop, UCHAR
|
|||
{
|
||||
*ret_size = sizeof(ULONG);
|
||||
if (size < sizeof(ULONG)) return STATUS_BUFFER_TOO_SMALL;
|
||||
if (buf) *(ULONG *)buf = BCRYPT_SUPPORTED_PAD_PKCS1_SIG;
|
||||
if (buf) *(ULONG *)buf = BCRYPT_SUPPORTED_PAD_PKCS1_SIG | BCRYPT_SUPPORTED_PAD_OAEP;
|
||||
return STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
|
@ -887,6 +887,22 @@ static NTSTATUS set_key_property( struct key *key, const WCHAR *prop, UCHAR *val
|
|||
key->u.a.bitlen = *(DWORD*)value;
|
||||
return STATUS_SUCCESS;
|
||||
}
|
||||
else if (!wcscmp( prop, BCRYPT_DH_PARAMETERS ))
|
||||
{
|
||||
BCRYPT_DH_PARAMETER_HEADER *hdr = (BCRYPT_DH_PARAMETER_HEADER *)value;
|
||||
struct key_asymmetric_import_params params;
|
||||
|
||||
if (key->u.a.flags & KEY_FLAG_FINALIZED) return STATUS_INVALID_HANDLE;
|
||||
if (key->alg_id != ALG_ID_DH || size < sizeof(*hdr) || hdr->cbLength != size ||
|
||||
hdr->dwMagic != BCRYPT_DH_PARAMETERS_MAGIC || hdr->cbKeyLength != key->u.a.bitlen / 8)
|
||||
return STATUS_INVALID_PARAMETER;
|
||||
|
||||
params.key = key;
|
||||
params.flags = KEY_IMPORT_FLAG_DH_PARAMETERS;
|
||||
params.buf = value;
|
||||
params.len = size;
|
||||
return UNIX_CALL( key_asymmetric_import, ¶ms );
|
||||
}
|
||||
|
||||
FIXME( "unsupported key property %s\n", debugstr_w(prop) );
|
||||
return STATUS_NOT_IMPLEMENTED;
|
||||
|
@ -902,6 +918,21 @@ static NTSTATUS get_hash_property( const struct hash *hash, const WCHAR *prop, U
|
|||
return status;
|
||||
}
|
||||
|
||||
static NTSTATUS get_dh_property( const struct key *key, const WCHAR *prop, UCHAR *buf, ULONG size, ULONG *ret_size )
|
||||
{
|
||||
struct key_asymmetric_export_params params;
|
||||
|
||||
if (wcscmp( prop, BCRYPT_DH_PARAMETERS )) return STATUS_NOT_SUPPORTED;
|
||||
if (!(key->u.a.flags & KEY_FLAG_FINALIZED)) return STATUS_INVALID_HANDLE;
|
||||
|
||||
params.key = (struct key *)key;
|
||||
params.flags = KEY_EXPORT_FLAG_DH_PARAMETERS;
|
||||
params.buf = buf;
|
||||
params.len = size;
|
||||
params.ret_len = ret_size;
|
||||
return UNIX_CALL( key_asymmetric_export, ¶ms );
|
||||
}
|
||||
|
||||
static NTSTATUS get_key_property( const struct key *key, const WCHAR *prop, UCHAR *buf, ULONG size, ULONG *ret_size )
|
||||
{
|
||||
if (!wcscmp( prop, BCRYPT_KEY_STRENGTH ))
|
||||
|
@ -925,6 +956,9 @@ static NTSTATUS get_key_property( const struct key *key, const WCHAR *prop, UCHA
|
|||
if (!wcscmp( prop, BCRYPT_AUTH_TAG_LENGTH )) return STATUS_NOT_SUPPORTED;
|
||||
return get_aes_property( key->u.s.mode, prop, buf, size, ret_size );
|
||||
|
||||
case ALG_ID_DH:
|
||||
return get_dh_property( key, prop, buf, size, ret_size );
|
||||
|
||||
default:
|
||||
FIXME( "unsupported algorithm %u\n", key->alg_id );
|
||||
return STATUS_NOT_IMPLEMENTED;
|
||||
|
@ -1176,6 +1210,8 @@ static NTSTATUS key_asymmetric_create( enum alg_id alg_id, ULONG bitlen, struct
|
|||
return STATUS_NOT_IMPLEMENTED;
|
||||
}
|
||||
|
||||
if (alg_id == ALG_ID_DH && bitlen < 512) return STATUS_INVALID_PARAMETER;
|
||||
|
||||
if (!(key = calloc( 1, sizeof(*key) ))) return STATUS_NO_MEMORY;
|
||||
key->hdr.magic = MAGIC_KEY;
|
||||
key->alg_id = alg_id;
|
||||
|
@ -1703,9 +1739,6 @@ static NTSTATUS key_import_pair( struct algorithm *alg, const WCHAR *type, BCRYP
|
|||
key_destroy( key );
|
||||
return status;
|
||||
}
|
||||
|
||||
*ret_key = key;
|
||||
return STATUS_SUCCESS;
|
||||
}
|
||||
else if (!wcscmp( type, BCRYPT_ECCPRIVATE_BLOB ))
|
||||
{
|
||||
|
@ -1750,9 +1783,6 @@ static NTSTATUS key_import_pair( struct algorithm *alg, const WCHAR *type, BCRYP
|
|||
key_destroy( key );
|
||||
return status;
|
||||
}
|
||||
|
||||
*ret_key = key;
|
||||
return STATUS_SUCCESS;
|
||||
}
|
||||
else if (!wcscmp( type, BCRYPT_RSAPUBLIC_BLOB ))
|
||||
{
|
||||
|
@ -1775,9 +1805,6 @@ static NTSTATUS key_import_pair( struct algorithm *alg, const WCHAR *type, BCRYP
|
|||
key_destroy( key );
|
||||
return status;
|
||||
}
|
||||
|
||||
*ret_key = key;
|
||||
return STATUS_SUCCESS;
|
||||
}
|
||||
else if (!wcscmp( type, BCRYPT_RSAPRIVATE_BLOB ) || !wcscmp( type, BCRYPT_RSAFULLPRIVATE_BLOB ))
|
||||
{
|
||||
|
@ -1797,9 +1824,6 @@ static NTSTATUS key_import_pair( struct algorithm *alg, const WCHAR *type, BCRYP
|
|||
key_destroy( key );
|
||||
return status;
|
||||
}
|
||||
|
||||
*ret_key = key;
|
||||
return STATUS_SUCCESS;
|
||||
}
|
||||
else if (!wcscmp( type, LEGACY_RSAPRIVATE_BLOB ))
|
||||
{
|
||||
|
@ -1832,9 +1856,6 @@ static NTSTATUS key_import_pair( struct algorithm *alg, const WCHAR *type, BCRYP
|
|||
key_destroy( key );
|
||||
return status;
|
||||
}
|
||||
|
||||
*ret_key = key;
|
||||
return STATUS_SUCCESS;
|
||||
}
|
||||
else if (!wcscmp( type, LEGACY_DSA_V2_PRIVATE_BLOB ))
|
||||
{
|
||||
|
@ -1872,9 +1893,6 @@ static NTSTATUS key_import_pair( struct algorithm *alg, const WCHAR *type, BCRYP
|
|||
key_destroy( key );
|
||||
return status;
|
||||
}
|
||||
|
||||
*ret_key = key;
|
||||
return STATUS_SUCCESS;
|
||||
}
|
||||
else if (!wcscmp( type, LEGACY_DSA_V2_PUBLIC_BLOB )) /* not supported on native */
|
||||
{
|
||||
|
@ -1908,15 +1926,12 @@ static NTSTATUS key_import_pair( struct algorithm *alg, const WCHAR *type, BCRYP
|
|||
key_destroy( key );
|
||||
return status;
|
||||
}
|
||||
|
||||
*ret_key = key;
|
||||
return STATUS_SUCCESS;
|
||||
}
|
||||
else if (!wcscmp( type, BCRYPT_DH_PRIVATE_BLOB ))
|
||||
{
|
||||
BCRYPT_DH_KEY_BLOB *dh_blob = (BCRYPT_DH_KEY_BLOB *)input;
|
||||
|
||||
if (input_len < sizeof(*dh_blob)) return STATUS_INVALID_PARAMETER;
|
||||
if (input_len != sizeof(*dh_blob) + dh_blob->cbKey * 4) return STATUS_INVALID_PARAMETER;
|
||||
if (alg->id != ALG_ID_DH || dh_blob->dwMagic != BCRYPT_DH_PRIVATE_MAGIC)
|
||||
return STATUS_NOT_SUPPORTED;
|
||||
|
||||
|
@ -1930,15 +1945,12 @@ static NTSTATUS key_import_pair( struct algorithm *alg, const WCHAR *type, BCRYP
|
|||
key_destroy( key );
|
||||
return status;
|
||||
}
|
||||
|
||||
*ret_key = key;
|
||||
return STATUS_SUCCESS;
|
||||
}
|
||||
else if (!wcscmp( type, BCRYPT_DH_PUBLIC_BLOB ))
|
||||
{
|
||||
BCRYPT_DH_KEY_BLOB *dh_blob = (BCRYPT_DH_KEY_BLOB *)input;
|
||||
|
||||
if (input_len < sizeof(*dh_blob)) return STATUS_INVALID_PARAMETER;
|
||||
if (input_len != sizeof(*dh_blob) + dh_blob->cbKey * 3) return STATUS_INVALID_PARAMETER;
|
||||
if (alg->id != ALG_ID_DH || dh_blob->dwMagic != BCRYPT_DH_PUBLIC_MAGIC)
|
||||
return STATUS_NOT_SUPPORTED;
|
||||
|
||||
|
@ -1952,13 +1964,19 @@ static NTSTATUS key_import_pair( struct algorithm *alg, const WCHAR *type, BCRYP
|
|||
key_destroy( key );
|
||||
return status;
|
||||
}
|
||||
|
||||
*ret_key = key;
|
||||
return STATUS_SUCCESS;
|
||||
}
|
||||
else
|
||||
{
|
||||
FIXME( "unsupported key type %s\n", debugstr_w(type) );
|
||||
return STATUS_NOT_SUPPORTED;
|
||||
}
|
||||
|
||||
FIXME( "unsupported key type %s\n", debugstr_w(type) );
|
||||
return STATUS_NOT_SUPPORTED;
|
||||
if (!status)
|
||||
{
|
||||
key->u.a.flags |= KEY_FLAG_FINALIZED;
|
||||
*ret_key = key;
|
||||
}
|
||||
return status;
|
||||
}
|
||||
|
||||
NTSTATUS WINAPI BCryptGenerateSymmetricKey( BCRYPT_ALG_HANDLE handle, BCRYPT_KEY_HANDLE *ret_handle,
|
||||
|
@ -1999,11 +2017,14 @@ NTSTATUS WINAPI BCryptGenerateKeyPair( BCRYPT_ALG_HANDLE handle, BCRYPT_KEY_HAND
|
|||
NTSTATUS WINAPI BCryptFinalizeKeyPair( BCRYPT_KEY_HANDLE handle, ULONG flags )
|
||||
{
|
||||
struct key *key = get_key_object( handle );
|
||||
NTSTATUS ret;
|
||||
|
||||
TRACE( "%p, %#lx\n", key, flags );
|
||||
|
||||
if (!key) return STATUS_INVALID_HANDLE;
|
||||
return UNIX_CALL( key_asymmetric_generate, key );
|
||||
if (!key || key->u.a.flags & KEY_FLAG_FINALIZED) return STATUS_INVALID_HANDLE;
|
||||
|
||||
if (!(ret = UNIX_CALL( key_asymmetric_generate, key ))) key->u.a.flags |= KEY_FLAG_FINALIZED;
|
||||
return ret;
|
||||
}
|
||||
|
||||
NTSTATUS WINAPI BCryptImportKey( BCRYPT_ALG_HANDLE handle, BCRYPT_KEY_HANDLE decrypt_key, const WCHAR *type,
|
||||
|
@ -2233,7 +2254,7 @@ NTSTATUS WINAPI BCryptEncrypt( BCRYPT_KEY_HANDLE handle, UCHAR *input, ULONG inp
|
|||
}
|
||||
else
|
||||
{
|
||||
if (flags & BCRYPT_PAD_NONE || flags & BCRYPT_PAD_OAEP)
|
||||
if (flags & BCRYPT_PAD_NONE)
|
||||
{
|
||||
FIXME( "flags %#lx not implemented\n", flags );
|
||||
return STATUS_NOT_IMPLEMENTED;
|
||||
|
@ -2242,10 +2263,12 @@ NTSTATUS WINAPI BCryptEncrypt( BCRYPT_KEY_HANDLE handle, UCHAR *input, ULONG inp
|
|||
|
||||
asymmetric_params.input = input;
|
||||
asymmetric_params.input_len = input_len;
|
||||
asymmetric_params.padding = padding;
|
||||
asymmetric_params.key = key;
|
||||
asymmetric_params.output = output;
|
||||
asymmetric_params.output_len = output_len;
|
||||
asymmetric_params.ret_len = ret_len;
|
||||
asymmetric_params.flags = flags;
|
||||
ret = UNIX_CALL(key_asymmetric_encrypt, &asymmetric_params);
|
||||
}
|
||||
|
||||
|
@ -2278,7 +2301,7 @@ NTSTATUS WINAPI BCryptDecrypt( BCRYPT_KEY_HANDLE handle, UCHAR *input, ULONG inp
|
|||
}
|
||||
else
|
||||
{
|
||||
if (flags & BCRYPT_PAD_NONE || flags & BCRYPT_PAD_OAEP)
|
||||
if (flags & BCRYPT_PAD_NONE)
|
||||
{
|
||||
FIXME( "flags %#lx not implemented\n", flags );
|
||||
return STATUS_NOT_IMPLEMENTED;
|
||||
|
@ -2288,9 +2311,11 @@ NTSTATUS WINAPI BCryptDecrypt( BCRYPT_KEY_HANDLE handle, UCHAR *input, ULONG inp
|
|||
params.key = key;
|
||||
params.input = input;
|
||||
params.input_len = input_len;
|
||||
params.padding = padding;
|
||||
params.output = output;
|
||||
params.output_len = output_len;
|
||||
params.ret_len = ret_len;
|
||||
params.flags = flags;
|
||||
ret = UNIX_CALL(key_asymmetric_decrypt, ¶ms);
|
||||
}
|
||||
|
||||
|
|
|
@ -79,13 +79,18 @@ typedef enum
|
|||
typedef struct gnutls_x509_spki_st *gnutls_x509_spki_t;
|
||||
#endif
|
||||
|
||||
#if GUTLS_VERSION_MAJOR < 3 || (GNUTLS_VERSION_MAJOR == 3 && GNUTLS_VERSION_MINOR < 8)
|
||||
#define GNUTLS_KEYGEN_DH 4
|
||||
#endif
|
||||
|
||||
union key_data
|
||||
{
|
||||
gnutls_cipher_hd_t cipher;
|
||||
struct
|
||||
{
|
||||
gnutls_privkey_t privkey;
|
||||
gnutls_pubkey_t pubkey;
|
||||
gnutls_privkey_t privkey;
|
||||
gnutls_pubkey_t pubkey;
|
||||
gnutls_dh_params_t dh_params;
|
||||
} a;
|
||||
};
|
||||
C_ASSERT( sizeof(union key_data) <= sizeof(((struct key *)0)->private) );
|
||||
|
@ -131,11 +136,14 @@ static int (*pgnutls_privkey_export_rsa_raw)(gnutls_privkey_t, gnutls_datum_t *,
|
|||
gnutls_datum_t *);
|
||||
static int (*pgnutls_privkey_export_dsa_raw)(gnutls_privkey_t, gnutls_datum_t *, gnutls_datum_t *, gnutls_datum_t *,
|
||||
gnutls_datum_t *, gnutls_datum_t *);
|
||||
static int (*pgnutls_privkey_generate)(gnutls_privkey_t, gnutls_pk_algorithm_t, unsigned int, unsigned int);
|
||||
static int (*pgnutls_privkey_import_rsa_raw)(gnutls_privkey_t, const gnutls_datum_t *, const gnutls_datum_t *,
|
||||
const gnutls_datum_t *, const gnutls_datum_t *, const gnutls_datum_t *,
|
||||
const gnutls_datum_t *, const gnutls_datum_t *, const gnutls_datum_t *);
|
||||
|
||||
/* Not present in gnutls version < 3.5.0 */
|
||||
static int (*pgnutls_privkey_generate2)(gnutls_privkey_t, gnutls_pk_algorithm_t, unsigned int, unsigned int,
|
||||
const gnutls_keygen_data_st *, unsigned);
|
||||
|
||||
/* Not present in gnutls version < 3.6.0 */
|
||||
static int (*pgnutls_decode_rs_value)(const gnutls_datum_t *, gnutls_datum_t *, gnutls_datum_t *);
|
||||
static int (*pgnutls_x509_spki_init)(gnutls_x509_spki_t *);
|
||||
|
@ -154,6 +162,9 @@ static int (*pgnutls_privkey_import_dh_raw)(gnutls_privkey_t, const gnutls_dh_pa
|
|||
const gnutls_datum_t *);
|
||||
static int (*pgnutls_pubkey_import_dh_raw)(gnutls_pubkey_t, const gnutls_dh_params_t, const gnutls_datum_t *);
|
||||
|
||||
/* Not present in gnutls version < 3.8.4 */
|
||||
static int (*pgnutls_x509_spki_set_rsa_oaep_params)(gnutls_x509_spki_t, gnutls_digest_algorithm_t, gnutls_datum_t *);
|
||||
|
||||
static void *libgnutls_handle;
|
||||
#define MAKE_FUNCPTR(f) static typeof(f) * p##f
|
||||
MAKE_FUNCPTR(gnutls_cipher_decrypt2);
|
||||
|
@ -262,12 +273,6 @@ static int compat_gnutls_pubkey_import_dsa_raw(gnutls_pubkey_t key, const gnutls
|
|||
return GNUTLS_E_UNKNOWN_PK_ALGORITHM;
|
||||
}
|
||||
|
||||
static int compat_gnutls_privkey_generate(gnutls_privkey_t key, gnutls_pk_algorithm_t algo, unsigned int bits,
|
||||
unsigned int flags)
|
||||
{
|
||||
return GNUTLS_E_UNKNOWN_PK_ALGORITHM;
|
||||
}
|
||||
|
||||
static int compat_gnutls_decode_rs_value(const gnutls_datum_t * sig_value, gnutls_datum_t * r, gnutls_datum_t * s)
|
||||
{
|
||||
return GNUTLS_E_INTERNAL_ERROR;
|
||||
|
@ -301,6 +306,12 @@ static void compat_gnutls_x509_spki_deinit(gnutls_x509_spki_t spki)
|
|||
{
|
||||
}
|
||||
|
||||
static int compat_gnutls_x509_spki_set_rsa_oaep_params(gnutls_x509_spki_t spki, gnutls_digest_algorithm_t dig,
|
||||
gnutls_datum_t *label)
|
||||
{
|
||||
return GNUTLS_E_UNKNOWN_PK_ALGORITHM;
|
||||
}
|
||||
|
||||
static void compat_gnutls_x509_spki_set_rsa_pss_params(gnutls_x509_spki_t spki, gnutls_digest_algorithm_t dig,
|
||||
unsigned int salt_size)
|
||||
{
|
||||
|
@ -346,6 +357,12 @@ static int compat_gnutls_pubkey_import_dh_raw(gnutls_pubkey_t pubkey, const gnut
|
|||
return GNUTLS_E_UNKNOWN_PK_ALGORITHM;
|
||||
}
|
||||
|
||||
static int compat_gnutls_privkey_generate2(gnutls_privkey_t privkey, gnutls_pk_algorithm_t alg, unsigned int bits,
|
||||
unsigned int flags, const gnutls_keygen_data_st *data, unsigned data_size)
|
||||
{
|
||||
return GNUTLS_E_UNKNOWN_PK_ALGORITHM;
|
||||
}
|
||||
|
||||
static void gnutls_log( int level, const char *msg )
|
||||
{
|
||||
TRACE( "<%d> %s", level, msg );
|
||||
|
@ -418,7 +435,7 @@ static NTSTATUS gnutls_process_attach( void *args )
|
|||
LOAD_FUNCPTR_OPT(gnutls_privkey_export_dsa_raw)
|
||||
LOAD_FUNCPTR_OPT(gnutls_privkey_export_ecc_raw)
|
||||
LOAD_FUNCPTR_OPT(gnutls_privkey_export_rsa_raw)
|
||||
LOAD_FUNCPTR_OPT(gnutls_privkey_generate)
|
||||
LOAD_FUNCPTR_OPT(gnutls_privkey_generate2)
|
||||
LOAD_FUNCPTR_OPT(gnutls_privkey_import_dh_raw)
|
||||
LOAD_FUNCPTR_OPT(gnutls_privkey_import_ecc_raw)
|
||||
LOAD_FUNCPTR_OPT(gnutls_privkey_import_rsa_raw)
|
||||
|
@ -436,6 +453,7 @@ static NTSTATUS gnutls_process_attach( void *args )
|
|||
LOAD_FUNCPTR_OPT(gnutls_pubkey_verify_hash2)
|
||||
LOAD_FUNCPTR_OPT(gnutls_x509_spki_deinit)
|
||||
LOAD_FUNCPTR_OPT(gnutls_x509_spki_init)
|
||||
LOAD_FUNCPTR_OPT(gnutls_x509_spki_set_rsa_oaep_params)
|
||||
LOAD_FUNCPTR_OPT(gnutls_x509_spki_set_rsa_pss_params)
|
||||
|
||||
#undef LOAD_FUNCPTR_OPT
|
||||
|
@ -1004,6 +1022,72 @@ done:
|
|||
return status;
|
||||
}
|
||||
|
||||
static gnutls_privkey_t create_privkey( gnutls_pk_algorithm_t pk_alg, unsigned int bitlen,
|
||||
const gnutls_keygen_data_st *data, unsigned int data_size )
|
||||
{
|
||||
gnutls_privkey_t privkey;
|
||||
int ret;
|
||||
|
||||
if ((ret = pgnutls_privkey_init( &privkey )))
|
||||
{
|
||||
pgnutls_perror( ret );
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if ((ret = pgnutls_privkey_generate2( privkey, pk_alg, bitlen, 0, data, data_size )))
|
||||
{
|
||||
pgnutls_perror( ret );
|
||||
pgnutls_privkey_deinit( privkey );
|
||||
return NULL;
|
||||
}
|
||||
|
||||
return privkey;
|
||||
}
|
||||
|
||||
static gnutls_pubkey_t create_pubkey_from_privkey( gnutls_privkey_t privkey )
|
||||
{
|
||||
gnutls_pubkey_t pubkey;
|
||||
int ret;
|
||||
|
||||
if ((ret = pgnutls_pubkey_init( &pubkey )))
|
||||
{
|
||||
pgnutls_perror( ret );
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if ((ret = pgnutls_pubkey_import_privkey( pubkey, privkey, 0, 0 )))
|
||||
{
|
||||
pgnutls_perror( ret );
|
||||
pgnutls_pubkey_deinit( pubkey );
|
||||
return NULL;
|
||||
}
|
||||
|
||||
return pubkey;
|
||||
}
|
||||
|
||||
static gnutls_dh_params_t get_dh_params( gnutls_privkey_t privkey )
|
||||
{
|
||||
gnutls_dh_params_t params;
|
||||
gnutls_datum_t x;
|
||||
int ret;
|
||||
|
||||
if ((ret = pgnutls_dh_params_init( ¶ms )))
|
||||
{
|
||||
pgnutls_perror( ret );
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if ((ret = pgnutls_privkey_export_dh_raw( privkey, params, NULL, &x, 0 )))
|
||||
{
|
||||
pgnutls_perror( ret );
|
||||
pgnutls_dh_params_deinit( params );
|
||||
return NULL;
|
||||
}
|
||||
|
||||
free( x.data );
|
||||
return params;
|
||||
}
|
||||
|
||||
static NTSTATUS key_asymmetric_generate( void *args )
|
||||
{
|
||||
struct key *key = args;
|
||||
|
@ -1011,7 +1095,6 @@ static NTSTATUS key_asymmetric_generate( void *args )
|
|||
gnutls_privkey_t privkey;
|
||||
gnutls_pubkey_t pubkey;
|
||||
unsigned int bitlen;
|
||||
int ret;
|
||||
|
||||
if (!libgnutls_handle) return STATUS_INTERNAL_ERROR;
|
||||
if (key_data(key)->a.privkey) return STATUS_INVALID_HANDLE;
|
||||
|
@ -1051,30 +1134,27 @@ static NTSTATUS key_asymmetric_generate( void *args )
|
|||
return STATUS_NOT_SUPPORTED;
|
||||
}
|
||||
|
||||
if ((ret = pgnutls_privkey_init( &privkey )))
|
||||
if (key->alg_id == ALG_ID_DH && key_data(key)->a.dh_params)
|
||||
{
|
||||
pgnutls_perror( ret );
|
||||
return STATUS_INTERNAL_ERROR;
|
||||
gnutls_keygen_data_st data;
|
||||
|
||||
data.type = GNUTLS_KEYGEN_DH;
|
||||
data.data = (unsigned char *)key_data(key)->a.dh_params;
|
||||
data.size = 0;
|
||||
if (!(privkey = create_privkey( pk_alg, bitlen, &data, 1 ))) return STATUS_INTERNAL_ERROR;
|
||||
}
|
||||
if ((ret = pgnutls_pubkey_init( &pubkey )))
|
||||
else if (!(privkey = create_privkey( pk_alg, bitlen, NULL, 0 ))) return STATUS_INTERNAL_ERROR;
|
||||
|
||||
if (key->alg_id == ALG_ID_DH && !key_data(key)->a.dh_params &&
|
||||
!(key_data(key)->a.dh_params = get_dh_params( privkey )))
|
||||
{
|
||||
pgnutls_perror( ret );
|
||||
pgnutls_privkey_deinit( privkey );
|
||||
return STATUS_INTERNAL_ERROR;
|
||||
}
|
||||
|
||||
if ((ret = pgnutls_privkey_generate( privkey, pk_alg, bitlen, 0 )))
|
||||
if (!(pubkey = create_pubkey_from_privkey( privkey )))
|
||||
{
|
||||
pgnutls_perror( ret );
|
||||
pgnutls_privkey_deinit( privkey );
|
||||
pgnutls_pubkey_deinit( pubkey );
|
||||
return STATUS_INTERNAL_ERROR;
|
||||
}
|
||||
if ((ret = pgnutls_pubkey_import_privkey( pubkey, privkey, 0, 0 )))
|
||||
{
|
||||
pgnutls_perror( ret );
|
||||
pgnutls_privkey_deinit( privkey );
|
||||
pgnutls_pubkey_deinit( pubkey );
|
||||
return STATUS_INTERNAL_ERROR;
|
||||
}
|
||||
|
||||
|
@ -1587,7 +1667,7 @@ static NTSTATUS key_export_dh_public( struct key *key, UCHAR *buf, ULONG len, UL
|
|||
BCRYPT_DH_KEY_BLOB *dh_blob = (BCRYPT_DH_KEY_BLOB *)buf;
|
||||
ULONG size = key->u.a.bitlen / 8;
|
||||
gnutls_dh_params_t params;
|
||||
gnutls_datum_t p, g, y, x = {0};
|
||||
gnutls_datum_t p, g, y;
|
||||
UCHAR *dst;
|
||||
int ret = GNUTLS_E_INVALID_REQUEST;
|
||||
|
||||
|
@ -1597,12 +1677,7 @@ static NTSTATUS key_export_dh_public( struct key *key, UCHAR *buf, ULONG len, UL
|
|||
return STATUS_INTERNAL_ERROR;
|
||||
}
|
||||
|
||||
if (key_data(key)->a.pubkey)
|
||||
ret = pgnutls_pubkey_export_dh_raw( key_data(key)->a.pubkey, params, &y, 0 );
|
||||
else if (key_data(key)->a.privkey)
|
||||
ret = pgnutls_privkey_export_dh_raw( key_data(key)->a.privkey, params, &y, &x, 0 );
|
||||
|
||||
if (ret)
|
||||
if ((ret = pgnutls_pubkey_export_dh_raw( key_data(key)->a.pubkey, params, &y, 0 )))
|
||||
{
|
||||
pgnutls_perror( ret );
|
||||
pgnutls_dh_params_deinit( params );
|
||||
|
@ -1612,7 +1687,7 @@ static NTSTATUS key_export_dh_public( struct key *key, UCHAR *buf, ULONG len, UL
|
|||
if ((ret = pgnutls_dh_params_export_raw( params, &p, &g, NULL )) < 0)
|
||||
{
|
||||
pgnutls_perror( ret );
|
||||
free( y.data ); free( x.data );
|
||||
free( y.data );
|
||||
pgnutls_dh_params_deinit( params );
|
||||
return STATUS_INTERNAL_ERROR;
|
||||
}
|
||||
|
@ -1629,7 +1704,7 @@ static NTSTATUS key_export_dh_public( struct key *key, UCHAR *buf, ULONG len, UL
|
|||
dh_blob->cbKey = size;
|
||||
}
|
||||
|
||||
free( p.data ); free( g.data ); free( y.data ); free( x.data );
|
||||
free( p.data ); free( g.data ); free( y.data );
|
||||
return STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
|
@ -1650,8 +1725,7 @@ static NTSTATUS key_export_dh( struct key *key, UCHAR *buf, ULONG len, ULONG *re
|
|||
return STATUS_INTERNAL_ERROR;
|
||||
}
|
||||
|
||||
ret = pgnutls_privkey_export_dh_raw( key_data(key)->a.privkey, params, &y, &x, 0 );
|
||||
if (ret)
|
||||
if ((ret = pgnutls_privkey_export_dh_raw( key_data(key)->a.privkey, params, &y, &x, 0 )))
|
||||
{
|
||||
pgnutls_perror( ret );
|
||||
pgnutls_dh_params_deinit( params );
|
||||
|
@ -1685,12 +1759,48 @@ static NTSTATUS key_export_dh( struct key *key, UCHAR *buf, ULONG len, ULONG *re
|
|||
return STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
static NTSTATUS key_export_dh_params( struct key *key, UCHAR *buf, ULONG len, ULONG *ret_len )
|
||||
{
|
||||
BCRYPT_DH_PARAMETER_HEADER *hdr = (BCRYPT_DH_PARAMETER_HEADER *)buf;
|
||||
unsigned int size = sizeof(*hdr) + key->u.a.bitlen / 8 * 2;
|
||||
gnutls_datum_t p, g;
|
||||
NTSTATUS status = STATUS_SUCCESS;
|
||||
UCHAR *dst;
|
||||
int ret;
|
||||
|
||||
if (!key_data(key)->a.dh_params) return STATUS_INVALID_PARAMETER;
|
||||
|
||||
if ((ret = pgnutls_dh_params_export_raw( key_data(key)->a.dh_params, &p, &g, NULL )))
|
||||
{
|
||||
pgnutls_perror( ret );
|
||||
return STATUS_INTERNAL_ERROR;
|
||||
}
|
||||
|
||||
*ret_len = size;
|
||||
if (len < size) status = STATUS_BUFFER_TOO_SMALL;
|
||||
else if (buf)
|
||||
{
|
||||
hdr->cbLength = size;
|
||||
hdr->dwMagic = BCRYPT_DH_PARAMETERS_MAGIC;
|
||||
hdr->cbKeyLength = key->u.a.bitlen / 8;
|
||||
|
||||
dst = (UCHAR *)(hdr + 1);
|
||||
dst += export_gnutls_datum( dst, hdr->cbKeyLength, &p, 1 );
|
||||
dst += export_gnutls_datum( dst, hdr->cbKeyLength, &g, 1 );
|
||||
}
|
||||
|
||||
free( p.data ); free( g.data );
|
||||
return status;
|
||||
}
|
||||
|
||||
static NTSTATUS key_asymmetric_export( void *args )
|
||||
{
|
||||
const struct key_asymmetric_export_params *params = args;
|
||||
struct key *key = params->key;
|
||||
unsigned flags = params->flags;
|
||||
|
||||
if (!(key->u.a.flags & KEY_FLAG_FINALIZED)) return STATUS_INVALID_HANDLE;
|
||||
|
||||
switch (key->alg_id)
|
||||
{
|
||||
case ALG_ID_ECDH_P256:
|
||||
|
@ -1719,7 +1829,9 @@ static NTSTATUS key_asymmetric_export( void *args )
|
|||
return STATUS_NOT_IMPLEMENTED;
|
||||
|
||||
case ALG_ID_DH:
|
||||
if (flags & KEY_EXPORT_FLAG_PUBLIC)
|
||||
if (flags & KEY_EXPORT_FLAG_DH_PARAMETERS)
|
||||
return key_export_dh_params( key, params->buf, params->len, params->ret_len );
|
||||
if (flags & KEY_EXPORT_FLAG_PUBLIC)
|
||||
return key_export_dh_public( key, params->buf, params->len, params->ret_len );
|
||||
return key_export_dh( key, params->buf, params->len, params->ret_len );
|
||||
|
||||
|
@ -1766,17 +1878,19 @@ static NTSTATUS key_import_dh_public( struct key *key, UCHAR *buf, ULONG len )
|
|||
return STATUS_INTERNAL_ERROR;
|
||||
}
|
||||
|
||||
ret = pgnutls_pubkey_import_dh_raw( handle, params, &y );
|
||||
pgnutls_dh_params_deinit( params );
|
||||
if (ret < 0)
|
||||
if ((ret = pgnutls_pubkey_import_dh_raw( handle, params, &y )))
|
||||
{
|
||||
pgnutls_perror( ret );
|
||||
pgnutls_dh_params_deinit( params );
|
||||
pgnutls_pubkey_deinit( handle );
|
||||
return STATUS_INTERNAL_ERROR;
|
||||
}
|
||||
|
||||
if (key_data(key)->a.pubkey) pgnutls_pubkey_deinit( key_data(key)->a.pubkey );
|
||||
key_data(key)->a.pubkey = handle;
|
||||
|
||||
if (key_data(key)->a.dh_params) pgnutls_dh_params_deinit( key_data(key)->a.dh_params );
|
||||
key_data(key)->a.dh_params = params;
|
||||
return STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
|
@ -1819,17 +1933,49 @@ static NTSTATUS key_import_dh( struct key *key, UCHAR *buf, ULONG len )
|
|||
return STATUS_INTERNAL_ERROR;
|
||||
}
|
||||
|
||||
ret = pgnutls_privkey_import_dh_raw( handle, params, &y, &x );
|
||||
pgnutls_dh_params_deinit( params );
|
||||
if (ret < 0)
|
||||
if ((ret = pgnutls_privkey_import_dh_raw( handle, params, &y, &x )))
|
||||
{
|
||||
pgnutls_perror( ret );
|
||||
pgnutls_dh_params_deinit( params );
|
||||
pgnutls_privkey_deinit( handle );
|
||||
return STATUS_INTERNAL_ERROR;
|
||||
}
|
||||
|
||||
if (key_data(key)->a.privkey) pgnutls_privkey_deinit( key_data(key)->a.privkey );
|
||||
key_data(key)->a.privkey = handle;
|
||||
|
||||
if (key_data(key)->a.dh_params) pgnutls_dh_params_deinit( key_data(key)->a.dh_params );
|
||||
key_data(key)->a.dh_params = params;
|
||||
return STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
static NTSTATUS key_import_dh_params( struct key *key, UCHAR *buf, ULONG len )
|
||||
{
|
||||
BCRYPT_DH_PARAMETER_HEADER *dh_header = (BCRYPT_DH_PARAMETER_HEADER *)buf;
|
||||
gnutls_dh_params_t params;
|
||||
gnutls_datum_t p, g;
|
||||
int ret;
|
||||
|
||||
if ((ret = pgnutls_dh_params_init( ¶ms )))
|
||||
{
|
||||
pgnutls_perror( ret );
|
||||
return STATUS_INTERNAL_ERROR;
|
||||
}
|
||||
|
||||
p.data = (unsigned char *)(dh_header + 1);
|
||||
p.size = dh_header->cbKeyLength;
|
||||
g.data = p.data + dh_header->cbKeyLength;
|
||||
g.size = dh_header->cbKeyLength;
|
||||
|
||||
if ((ret = pgnutls_dh_params_import_raw( params, &p, &g )))
|
||||
{
|
||||
pgnutls_perror( ret );
|
||||
pgnutls_dh_params_deinit( params );
|
||||
return STATUS_INTERNAL_ERROR;
|
||||
}
|
||||
|
||||
if (key_data(key)->a.dh_params) pgnutls_dh_params_deinit( key_data(key)->a.dh_params );
|
||||
key_data(key)->a.dh_params = params;
|
||||
return STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
|
@ -1875,9 +2021,12 @@ static NTSTATUS key_asymmetric_import( void *args )
|
|||
return STATUS_NOT_IMPLEMENTED;
|
||||
|
||||
case ALG_ID_DH:
|
||||
if (flags & KEY_IMPORT_FLAG_DH_PARAMETERS)
|
||||
return key_import_dh_params( key, params->buf, params->len );
|
||||
if (flags & KEY_IMPORT_FLAG_PUBLIC)
|
||||
return key_import_dh_public( key, params->buf, params->len );
|
||||
return key_import_dh( key, params->buf, params->len );
|
||||
ret = key_import_dh( key, params->buf, params->len );
|
||||
break;
|
||||
|
||||
default:
|
||||
FIXME( "algorithm %u not yet supported\n", key->alg_id );
|
||||
|
@ -2300,6 +2449,7 @@ static NTSTATUS key_asymmetric_destroy( void *args )
|
|||
|
||||
if (key_data(key)->a.privkey) pgnutls_privkey_deinit( key_data(key)->a.privkey );
|
||||
if (key_data(key)->a.pubkey) pgnutls_pubkey_deinit( key_data(key)->a.pubkey );
|
||||
if (key_data(key)->a.dh_params) pgnutls_dh_params_deinit( key_data(key)->a.dh_params );
|
||||
return STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
|
@ -2477,6 +2627,27 @@ static NTSTATUS key_asymmetric_duplicate( void *args )
|
|||
return STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
static NTSTATUS privkey_set_rsa_oaep_params( gnutls_privkey_t key, gnutls_digest_algorithm_t dig, gnutls_datum_t *label )
|
||||
{
|
||||
gnutls_x509_spki_t spki;
|
||||
int ret;
|
||||
|
||||
if (((ret = pgnutls_x509_spki_init( &spki ) < 0)))
|
||||
{
|
||||
pgnutls_perror( ret );
|
||||
return STATUS_INTERNAL_ERROR;
|
||||
}
|
||||
pgnutls_x509_spki_set_rsa_oaep_params( spki, dig, label );
|
||||
ret = pgnutls_privkey_set_spki( key, spki, 0 );
|
||||
pgnutls_x509_spki_deinit( spki );
|
||||
if (ret < 0)
|
||||
{
|
||||
pgnutls_perror( ret );
|
||||
return STATUS_INTERNAL_ERROR;
|
||||
}
|
||||
return STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
static NTSTATUS key_asymmetric_decrypt( void *args )
|
||||
{
|
||||
const struct key_asymmetric_decrypt_params *params = args;
|
||||
|
@ -2484,6 +2655,28 @@ static NTSTATUS key_asymmetric_decrypt( void *args )
|
|||
NTSTATUS status = STATUS_SUCCESS;
|
||||
int ret;
|
||||
|
||||
if (params->key->alg_id == ALG_ID_RSA && params->flags & BCRYPT_PAD_OAEP)
|
||||
{
|
||||
BCRYPT_OAEP_PADDING_INFO *pad = params->padding;
|
||||
gnutls_digest_algorithm_t dig;
|
||||
gnutls_datum_t label;
|
||||
|
||||
if (!pad || !pad->pszAlgId)
|
||||
{
|
||||
WARN( "padding info not found\n" );
|
||||
return STATUS_INVALID_PARAMETER;
|
||||
}
|
||||
if ((dig = get_digest_from_id( pad->pszAlgId )) == GNUTLS_DIG_UNKNOWN)
|
||||
{
|
||||
FIXME( "hash algorithm %s not recognized\n", debugstr_w(pad->pszAlgId) );
|
||||
return STATUS_NOT_SUPPORTED;
|
||||
}
|
||||
|
||||
label.data = pad->pbLabel;
|
||||
label.size = pad->cbLabel;
|
||||
if ((status = privkey_set_rsa_oaep_params( key_data(params->key)->a.privkey, dig, &label ))) return status;
|
||||
}
|
||||
|
||||
e.data = params->input;
|
||||
e.size = params->input_len;
|
||||
if ((ret = pgnutls_privkey_decrypt_data( key_data(params->key)->a.privkey, 0, &e, &d )))
|
||||
|
@ -2494,12 +2687,33 @@ static NTSTATUS key_asymmetric_decrypt( void *args )
|
|||
|
||||
*params->ret_len = d.size;
|
||||
if (params->output_len >= d.size) memcpy( params->output, d.data, *params->ret_len );
|
||||
else status = STATUS_BUFFER_TOO_SMALL;
|
||||
else if (params->output) status = STATUS_BUFFER_TOO_SMALL;
|
||||
|
||||
free( d.data );
|
||||
return status;
|
||||
}
|
||||
|
||||
static NTSTATUS pubkey_set_rsa_oaep_params( gnutls_pubkey_t key, gnutls_digest_algorithm_t dig, gnutls_datum_t *label )
|
||||
{
|
||||
gnutls_x509_spki_t spki;
|
||||
int ret;
|
||||
|
||||
if (((ret = pgnutls_x509_spki_init( &spki ) < 0)))
|
||||
{
|
||||
pgnutls_perror( ret );
|
||||
return STATUS_INTERNAL_ERROR;
|
||||
}
|
||||
pgnutls_x509_spki_set_rsa_oaep_params( spki, dig, label );
|
||||
ret = pgnutls_pubkey_set_spki( key, spki, 0 );
|
||||
pgnutls_x509_spki_deinit( spki );
|
||||
if (ret < 0)
|
||||
{
|
||||
pgnutls_perror( ret );
|
||||
return STATUS_INTERNAL_ERROR;
|
||||
}
|
||||
return STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
static NTSTATUS key_asymmetric_encrypt( void *args )
|
||||
{
|
||||
const struct key_asymmetric_encrypt_params *params = args;
|
||||
|
@ -2509,6 +2723,28 @@ static NTSTATUS key_asymmetric_encrypt( void *args )
|
|||
|
||||
if (!key_data(params->key)->a.pubkey) return STATUS_INVALID_HANDLE;
|
||||
|
||||
if (params->key->alg_id == ALG_ID_RSA && params->flags & BCRYPT_PAD_OAEP)
|
||||
{
|
||||
BCRYPT_OAEP_PADDING_INFO *pad = params->padding;
|
||||
gnutls_digest_algorithm_t dig;
|
||||
gnutls_datum_t label;
|
||||
|
||||
if (!pad || !pad->pszAlgId || !pad->pbLabel)
|
||||
{
|
||||
WARN( "padding info not found\n" );
|
||||
return STATUS_INVALID_PARAMETER;
|
||||
}
|
||||
if ((dig = get_digest_from_id( pad->pszAlgId )) == GNUTLS_DIG_UNKNOWN)
|
||||
{
|
||||
FIXME( "hash algorithm %s not recognized\n", debugstr_w(pad->pszAlgId) );
|
||||
return STATUS_NOT_SUPPORTED;
|
||||
}
|
||||
|
||||
label.data = pad->pbLabel;
|
||||
label.size = pad->cbLabel;
|
||||
if ((status = pubkey_set_rsa_oaep_params( key_data(params->key)->a.pubkey, dig, &label ))) return status;
|
||||
}
|
||||
|
||||
d.data = params->input;
|
||||
d.size = params->input_len;
|
||||
if ((ret = pgnutls_pubkey_encrypt_data(key_data(params->key)->a.pubkey, 0, &d, &e)))
|
||||
|
@ -2530,6 +2766,7 @@ static NTSTATUS key_asymmetric_derive_key( void *args )
|
|||
{
|
||||
const struct key_asymmetric_derive_key_params *params = args;
|
||||
gnutls_datum_t s;
|
||||
NTSTATUS status = STATUS_SUCCESS;
|
||||
int ret;
|
||||
|
||||
if ((ret = pgnutls_privkey_derive_secret( key_data(params->privkey)->a.privkey,
|
||||
|
@ -2539,15 +2776,15 @@ static NTSTATUS key_asymmetric_derive_key( void *args )
|
|||
return STATUS_INTERNAL_ERROR;
|
||||
}
|
||||
|
||||
if (!params->output) *params->ret_len = s.size;
|
||||
else
|
||||
*params->ret_len = EXPORT_SIZE( s, params->privkey->u.a.bitlen / 8, 1 );
|
||||
if (params->output)
|
||||
{
|
||||
*params->ret_len = min( params->output_len, s.size );
|
||||
memcpy( params->output, s.data, *params->ret_len );
|
||||
if (params->output_len < *params->ret_len) status = STATUS_BUFFER_TOO_SMALL;
|
||||
else export_gnutls_datum( params->output, *params->ret_len, &s, 1 );
|
||||
}
|
||||
|
||||
free( s.data );
|
||||
return STATUS_SUCCESS;
|
||||
return status;
|
||||
}
|
||||
|
||||
const unixlib_entry_t __wine_unix_call_funcs[] =
|
||||
|
@ -2600,7 +2837,7 @@ struct key32
|
|||
{
|
||||
struct object hdr;
|
||||
enum alg_id alg_id;
|
||||
UINT64 private[2]; /* private data for backend */
|
||||
UINT64 private[PRIVATE_DATA_SIZE]; /* private data for backend */
|
||||
union
|
||||
{
|
||||
struct key_symmetric32 s;
|
||||
|
@ -2610,12 +2847,19 @@ struct key32
|
|||
|
||||
union padding
|
||||
{
|
||||
BCRYPT_OAEP_PADDING_INFO oaep;
|
||||
BCRYPT_PKCS1_PADDING_INFO pkcs1;
|
||||
BCRYPT_PSS_PADDING_INFO pss;
|
||||
};
|
||||
|
||||
union padding32
|
||||
{
|
||||
struct
|
||||
{
|
||||
PTR32 pszAlgId;
|
||||
PTR32 pbLabel;
|
||||
ULONG cbLabel;
|
||||
} oaep;
|
||||
struct
|
||||
{
|
||||
PTR32 pszAlgId;
|
||||
|
@ -2633,13 +2877,21 @@ static union padding *get_padding( union padding32 *padding32, union padding *pa
|
|||
|
||||
switch (flags)
|
||||
{
|
||||
case BCRYPT_PAD_OAEP:
|
||||
padding->oaep.pszAlgId = ULongToPtr( padding32->oaep.pszAlgId );
|
||||
padding->oaep.pbLabel = ULongToPtr( padding32->oaep.pbLabel );
|
||||
padding->oaep.cbLabel = padding32->oaep.cbLabel;
|
||||
return padding;
|
||||
|
||||
case BCRYPT_PAD_PKCS1:
|
||||
padding->pkcs1.pszAlgId = ULongToPtr( padding32->pkcs1.pszAlgId );
|
||||
return padding;
|
||||
|
||||
case BCRYPT_PAD_PSS:
|
||||
padding->pss.pszAlgId = ULongToPtr( padding32->pss.pszAlgId );
|
||||
padding->pss.cbSalt = padding32->pss.cbSalt;
|
||||
return padding;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
@ -2650,8 +2902,7 @@ static struct key *get_symmetric_key( struct key32 *key32, struct key *key )
|
|||
{
|
||||
key->hdr = key32->hdr;
|
||||
key->alg_id = key32->alg_id;
|
||||
key->private[0] = key32->private[0];
|
||||
key->private[1] = key32->private[1];
|
||||
memcpy( key->private, key32->private, sizeof(key->private) );
|
||||
key->u.s.mode = key32->u.s.mode;
|
||||
key->u.s.block_size = key32->u.s.block_size;
|
||||
key->u.s.vector = ULongToPtr(key32->u.s.vector);
|
||||
|
@ -2665,8 +2916,7 @@ static struct key *get_asymmetric_key( struct key32 *key32, struct key *key )
|
|||
{
|
||||
key->hdr = key32->hdr;
|
||||
key->alg_id = key32->alg_id;
|
||||
key->private[0] = key32->private[0];
|
||||
key->private[1] = key32->private[1];
|
||||
memcpy( key->private, key32->private, sizeof(key->private) );
|
||||
key->u.a.bitlen = key32->u.a.bitlen;
|
||||
key->u.a.flags = key32->u.a.flags;
|
||||
key->u.a.dss_seed = key32->u.a.dss_seed;
|
||||
|
@ -2675,14 +2925,12 @@ static struct key *get_asymmetric_key( struct key32 *key32, struct key *key )
|
|||
|
||||
static void put_symmetric_key32( struct key *key, struct key32 *key32 )
|
||||
{
|
||||
key32->private[0] = key->private[0];
|
||||
key32->private[1] = key->private[1];
|
||||
memcpy( key32->private, key->private, sizeof(key32->private) );
|
||||
}
|
||||
|
||||
static void put_asymmetric_key32( struct key *key, struct key32 *key32 )
|
||||
{
|
||||
key32->private[0] = key->private[0];
|
||||
key32->private[1] = key->private[1];
|
||||
memcpy( key32->private, key->private, sizeof(key32->private) );
|
||||
key32->u.a.flags = key->u.a.flags;
|
||||
key32->u.a.dss_seed = key->u.a.dss_seed;
|
||||
}
|
||||
|
@ -2828,22 +3076,27 @@ static NTSTATUS wow64_key_asymmetric_decrypt( void *args )
|
|||
PTR32 key;
|
||||
PTR32 input;
|
||||
ULONG input_len;
|
||||
PTR32 padding;
|
||||
PTR32 output;
|
||||
ULONG output_len;
|
||||
PTR32 ret_len;
|
||||
ULONG flags;
|
||||
} const *params32 = args;
|
||||
|
||||
NTSTATUS ret;
|
||||
struct key key;
|
||||
union padding padding;
|
||||
struct key32 *key32 = ULongToPtr( params32->key );
|
||||
struct key_asymmetric_decrypt_params params =
|
||||
{
|
||||
get_asymmetric_key( key32, &key ),
|
||||
ULongToPtr(params32->input),
|
||||
params32->input_len,
|
||||
get_padding( ULongToPtr(params32->padding), &padding, params32->flags ),
|
||||
ULongToPtr(params32->output),
|
||||
params32->output_len,
|
||||
ULongToPtr(params32->ret_len)
|
||||
ULongToPtr(params32->ret_len),
|
||||
params32->flags
|
||||
};
|
||||
|
||||
ret = key_asymmetric_decrypt( ¶ms );
|
||||
|
@ -2858,22 +3111,27 @@ static NTSTATUS wow64_key_asymmetric_encrypt( void *args )
|
|||
PTR32 key;
|
||||
PTR32 input;
|
||||
ULONG input_len;
|
||||
PTR32 padding;
|
||||
PTR32 output;
|
||||
ULONG output_len;
|
||||
PTR32 ret_len;
|
||||
ULONG flags;
|
||||
} const *params32 = args;
|
||||
|
||||
NTSTATUS ret;
|
||||
struct key key;
|
||||
union padding padding;
|
||||
struct key32 *key32 = ULongToPtr( params32->key );
|
||||
struct key_asymmetric_encrypt_params params =
|
||||
{
|
||||
get_asymmetric_key( key32, &key ),
|
||||
ULongToPtr(params32->input),
|
||||
params32->input_len,
|
||||
get_padding( ULongToPtr(params32->padding), &padding, params32->flags ),
|
||||
ULongToPtr(params32->output),
|
||||
params32->output_len,
|
||||
ULongToPtr(params32->ret_len)
|
||||
ULongToPtr(params32->ret_len),
|
||||
params32->flags
|
||||
};
|
||||
|
||||
ret = key_asymmetric_encrypt( ¶ms );
|
||||
|
|
|
@ -2444,20 +2444,16 @@ static const UCHAR rsa_encrypted_no_padding[] =
|
|||
|
||||
static void test_rsa_encrypt(void)
|
||||
{
|
||||
static UCHAR input[] = "Hello World!";
|
||||
static UCHAR input_no_padding[64] = { 0 };
|
||||
UCHAR encrypted[64], decrypted[64];
|
||||
BCRYPT_ALG_HANDLE rsa = 0;
|
||||
BCRYPT_KEY_HANDLE key = 0, key2;
|
||||
NTSTATUS ret = 0;
|
||||
DWORD encrypted_size = 60;
|
||||
UCHAR *encrypted_a = NULL;
|
||||
UCHAR *encrypted_b = NULL;
|
||||
DWORD decrypted_size = 0;
|
||||
UCHAR input[] = "Hello World!", input_no_padding[64] = { 0 }, encrypted[64], decrypted[64];
|
||||
BCRYPT_ALG_HANDLE rsa;
|
||||
BCRYPT_KEY_HANDLE key, key2;
|
||||
NTSTATUS ret;
|
||||
DWORD encrypted_size, decrypted_size;
|
||||
UCHAR *encrypted_a = NULL, *encrypted_b = NULL;
|
||||
BCRYPT_OAEP_PADDING_INFO oaep_pad;
|
||||
|
||||
oaep_pad.pszAlgId = BCRYPT_MD5_ALGORITHM;
|
||||
oaep_pad.pbLabel = (PUCHAR)"test";
|
||||
oaep_pad.pszAlgId = BCRYPT_SHA256_ALGORITHM;
|
||||
oaep_pad.pbLabel = (UCHAR *)"test";
|
||||
oaep_pad.cbLabel = 5;
|
||||
|
||||
ret = BCryptOpenAlgorithmProvider(&rsa, BCRYPT_RSA_ALGORITHM, NULL, 0);
|
||||
|
@ -2478,10 +2474,11 @@ static void test_rsa_encrypt(void)
|
|||
ret = BCryptImportKeyPair(rsa, NULL, BCRYPT_RSAPRIVATE_BLOB, &key, rsaPrivateBlob, sizeof(rsaPrivateBlob), 0);
|
||||
ok(ret == STATUS_SUCCESS, "got %#lx\n", ret);
|
||||
|
||||
todo_wine {
|
||||
/* No padding */
|
||||
todo_wine {
|
||||
memset(input_no_padding, 0, sizeof(input_no_padding));
|
||||
strcpy((char *)input_no_padding, "Hello World");
|
||||
encrypted_size = 0;
|
||||
ret = BCryptEncrypt(key, input_no_padding, sizeof(input_no_padding), NULL, NULL, 0, NULL, 0, &encrypted_size, BCRYPT_PAD_NONE);
|
||||
ok(ret == STATUS_SUCCESS, "got %lx\n", ret);
|
||||
ok(encrypted_size == 64, "got size of %ld\n", encrypted_size);
|
||||
|
@ -2496,22 +2493,32 @@ static void test_rsa_encrypt(void)
|
|||
|
||||
ret = BCryptEncrypt(key, input_no_padding, sizeof(input_no_padding), NULL, NULL, 0, encrypted_a, 12, &encrypted_size, BCRYPT_PAD_NONE);
|
||||
ok(ret == STATUS_BUFFER_TOO_SMALL, "got %lx\n", ret);
|
||||
ok(encrypted_size == 64, "got size of %ld\n", encrypted_size);
|
||||
|
||||
ret = BCryptEncrypt(key, input_no_padding, sizeof(input_no_padding), NULL, NULL, 0, encrypted_a, encrypted_size, &encrypted_size, BCRYPT_PAD_NONE);
|
||||
ok(ret == STATUS_SUCCESS, "got %lx\n", ret);
|
||||
ok(encrypted_size == 64, "got size of %ld\n", encrypted_size);
|
||||
|
||||
ret = BCryptEncrypt(key, input_no_padding, sizeof(input_no_padding), NULL, NULL, 0, encrypted_b, encrypted_size, &encrypted_size, BCRYPT_PAD_NONE);
|
||||
ok(ret == STATUS_SUCCESS, "got %lx\n", ret);
|
||||
}
|
||||
ok(!memcmp(encrypted_a, encrypted_b, encrypted_size), "Both outputs should be the same\n");
|
||||
ok(!memcmp(encrypted_b, rsa_encrypted_no_padding, encrypted_size), "Data mismatch.\n");
|
||||
|
||||
BCryptDecrypt(key, encrypted_a, encrypted_size, NULL, NULL, 0, NULL, 0, &decrypted_size, BCRYPT_PAD_NONE);
|
||||
todo_wine {
|
||||
decrypted_size = 0;
|
||||
ret = BCryptDecrypt(key, encrypted_a, encrypted_size, NULL, NULL, 0, NULL, 0, &decrypted_size, BCRYPT_PAD_NONE);
|
||||
ok(ret == STATUS_SUCCESS, "got %lx\n", ret);
|
||||
ok(decrypted_size == sizeof(input_no_padding), "got %lu\n", decrypted_size);
|
||||
BCryptDecrypt(key, encrypted_a, encrypted_size, NULL, NULL, 0, decrypted, decrypted_size, &decrypted_size, BCRYPT_PAD_NONE);
|
||||
ok(!memcmp(decrypted, input_no_padding, sizeof(input_no_padding)), "Decrypted output it's not what expected\n");
|
||||
|
||||
ret = BCryptDecrypt(key, encrypted_a, encrypted_size, NULL, NULL, 0, decrypted, decrypted_size, &decrypted_size, BCRYPT_PAD_NONE);
|
||||
ok(ret == STATUS_SUCCESS, "got %lx\n", ret);
|
||||
ok(decrypted_size == sizeof(input_no_padding), "got %lu\n", decrypted_size);
|
||||
ok(!memcmp(decrypted, input_no_padding, sizeof(input_no_padding)), "unexpected output\n");
|
||||
}
|
||||
|
||||
encrypted_size = 60;
|
||||
/* PKCS1 Padding */
|
||||
encrypted_size = 0;
|
||||
ret = BCryptEncrypt(key, input, sizeof(input), NULL, NULL, 0, NULL, 0, &encrypted_size, BCRYPT_PAD_PKCS1);
|
||||
ok(ret == STATUS_SUCCESS, "got %lx\n", ret);
|
||||
ok(encrypted_size == 64, "got size of %ld\n", encrypted_size);
|
||||
|
@ -2523,22 +2530,54 @@ static void test_rsa_encrypt(void)
|
|||
|
||||
ret = BCryptEncrypt(key, input, sizeof(input), NULL, NULL, 0, encrypted_a, encrypted_size, &encrypted_size, BCRYPT_PAD_PKCS1);
|
||||
ok(ret == STATUS_SUCCESS, "got %lx\n", ret);
|
||||
ok(encrypted_size == 64, "got size of %ld\n", encrypted_size);
|
||||
|
||||
ret = BCryptEncrypt(key, input, sizeof(input), NULL, NULL, 0, encrypted_b, encrypted_size, &encrypted_size, BCRYPT_PAD_PKCS1);
|
||||
ok(ret == STATUS_SUCCESS, "got %lx\n", ret);
|
||||
ok(encrypted_size == 64, "got size of %ld\n", encrypted_size);
|
||||
ok(memcmp(encrypted_a, encrypted_b, encrypted_size), "Both outputs are the same\n");
|
||||
|
||||
BCryptDecrypt(key, encrypted_a, encrypted_size, NULL, NULL, 0, NULL, 0, &decrypted_size, BCRYPT_PAD_PKCS1);
|
||||
decrypted_size = 0;
|
||||
ret = BCryptDecrypt(key, encrypted_a, encrypted_size, NULL, NULL, 0, NULL, 0, &decrypted_size, BCRYPT_PAD_PKCS1);
|
||||
ok(ret == STATUS_SUCCESS, "got %lx\n", ret);
|
||||
ok(decrypted_size == sizeof(input), "got size of %ld\n", decrypted_size);
|
||||
BCryptDecrypt(key, encrypted_a, encrypted_size, NULL, NULL, 0, decrypted, decrypted_size, &decrypted_size, BCRYPT_PAD_PKCS1);
|
||||
ok(!memcmp(decrypted, input, sizeof(input)), "Decrypted output it's not what expected\n");
|
||||
|
||||
todo_wine {
|
||||
encrypted_size = 60;
|
||||
/* OAEP Padding */
|
||||
ret = BCryptEncrypt(key, input, sizeof(input), &oaep_pad, NULL, 0, NULL, 0, &encrypted_size, BCRYPT_PAD_OAEP);
|
||||
ret = BCryptDecrypt(key, encrypted_a, encrypted_size, NULL, NULL, 0, decrypted, decrypted_size, &decrypted_size, BCRYPT_PAD_PKCS1);
|
||||
ok(ret == STATUS_SUCCESS, "got %lx\n", ret);
|
||||
ok(decrypted_size == sizeof(input), "got size of %ld\n", decrypted_size);
|
||||
ok(!memcmp(decrypted, input, sizeof(input)), "unexpected output\n");
|
||||
|
||||
ret = BCryptImportKeyPair(rsa, NULL, LEGACY_RSAPRIVATE_BLOB, &key2, (UCHAR *)&rsaLegacyPrivateBlob,
|
||||
sizeof(rsaLegacyPrivateBlob), 0);
|
||||
ok(ret == STATUS_SUCCESS, "got %#lx\n", ret);
|
||||
|
||||
ret = BCryptEncrypt(key2, input, sizeof(input), NULL, NULL, 0, encrypted, sizeof(encrypted),
|
||||
&encrypted_size, BCRYPT_PAD_PKCS1);
|
||||
ok(ret == STATUS_SUCCESS, "got %lx\n", ret);
|
||||
ok(encrypted_size == 64, "got size of %ld\n", encrypted_size);
|
||||
|
||||
memset(decrypted, 0, sizeof(decrypted));
|
||||
ret = BCryptDecrypt(key, encrypted, sizeof(encrypted), NULL, NULL, 0, decrypted, sizeof(decrypted),
|
||||
&decrypted_size, BCRYPT_PAD_PKCS1);
|
||||
ok(ret == STATUS_SUCCESS, "got %lx\n", ret);
|
||||
ok(decrypted_size == sizeof(input), "got size of %ld\n", decrypted_size);
|
||||
ok(!memcmp(decrypted, input, sizeof(input)), "unexpected output\n");
|
||||
BCryptDestroyKey(key2);
|
||||
BCryptDestroyKey(key);
|
||||
|
||||
/* OAEP Padding */
|
||||
ret = BCryptGenerateKeyPair(rsa, &key, 640 /* minimum size for sha256 hash */, 0);
|
||||
ok(ret == STATUS_SUCCESS, "got %lx\n", ret);
|
||||
|
||||
ret = BCryptFinalizeKeyPair(key, 0);
|
||||
ok(ret == STATUS_SUCCESS, "got %#lx\n", ret);
|
||||
|
||||
todo_wine {
|
||||
encrypted_size = 0;
|
||||
ret = BCryptEncrypt(key, input, sizeof(input), &oaep_pad, NULL, 0, NULL, 0, &encrypted_size, BCRYPT_PAD_OAEP);
|
||||
ok(ret == STATUS_SUCCESS, "got %lx\n", ret);
|
||||
ok(encrypted_size == 80, "got size of %ld\n", encrypted_size);
|
||||
|
||||
encrypted_a = realloc(encrypted_a, encrypted_size);
|
||||
memset(encrypted_a, 0, encrypted_size);
|
||||
encrypted_b = realloc(encrypted_b, encrypted_size);
|
||||
|
@ -2546,38 +2585,28 @@ static void test_rsa_encrypt(void)
|
|||
|
||||
ret = BCryptEncrypt(key, input, sizeof(input), &oaep_pad, NULL, 0, encrypted_a, encrypted_size, &encrypted_size, BCRYPT_PAD_OAEP);
|
||||
ok(ret == STATUS_SUCCESS, "got %lx\n", ret);
|
||||
ok(encrypted_size == 80, "got size of %ld\n", encrypted_size);
|
||||
|
||||
ret = BCryptEncrypt(key, input, sizeof(input), &oaep_pad, NULL, 0, encrypted_b, encrypted_size, &encrypted_size, BCRYPT_PAD_OAEP);
|
||||
ok(ret == STATUS_SUCCESS, "got %lx\n", ret);
|
||||
ok(encrypted_size == 80, "got size of %ld\n", encrypted_size);
|
||||
ok(memcmp(encrypted_a, encrypted_b, encrypted_size), "Both outputs are the same\n");
|
||||
|
||||
decrypted_size = 0;
|
||||
memset(decrypted, 0, sizeof(decrypted));
|
||||
BCryptDecrypt(key, encrypted_a, encrypted_size, &oaep_pad, NULL, 0, NULL, 0, &decrypted_size, BCRYPT_PAD_OAEP);
|
||||
ret = BCryptDecrypt(key, encrypted_a, encrypted_size, &oaep_pad, NULL, 0, NULL, 0, &decrypted_size, BCRYPT_PAD_OAEP);
|
||||
ok(ret == STATUS_SUCCESS, "got %lx\n", ret);
|
||||
ok(decrypted_size == sizeof(input), "got %lu\n", decrypted_size);
|
||||
BCryptDecrypt(key, encrypted_a, encrypted_size, &oaep_pad, NULL, 0, decrypted, decrypted_size, &decrypted_size, BCRYPT_PAD_OAEP);
|
||||
ok(!memcmp(decrypted, input, sizeof(input)), "Decrypted output it's not what expected\n");
|
||||
|
||||
ret = BCryptDecrypt(key, encrypted_a, encrypted_size, &oaep_pad, NULL, 0, decrypted, decrypted_size, &decrypted_size, BCRYPT_PAD_OAEP);
|
||||
ok(ret == STATUS_SUCCESS, "got %lx\n", ret);
|
||||
ok(decrypted_size == sizeof(input), "got %lu\n", decrypted_size);
|
||||
ok(!memcmp(decrypted, input, sizeof(input)), "unexpected output\n");
|
||||
}
|
||||
|
||||
free(encrypted_a);
|
||||
free(encrypted_b);
|
||||
|
||||
ret = BCryptImportKeyPair(rsa, NULL, LEGACY_RSAPRIVATE_BLOB, &key2,
|
||||
(UCHAR *)&rsaLegacyPrivateBlob, sizeof(rsaLegacyPrivateBlob), 0);
|
||||
ok(ret == STATUS_SUCCESS, "got %#lx\n", ret);
|
||||
|
||||
ret = BCryptEncrypt(key2, input, sizeof(input), NULL, NULL, 0,
|
||||
encrypted, sizeof(encrypted), &encrypted_size, BCRYPT_PAD_PKCS1);
|
||||
ok(ret == STATUS_SUCCESS, "got %lx\n", ret);
|
||||
ok(encrypted_size == 64, "got size of %ld\n", encrypted_size);
|
||||
|
||||
memset(decrypted, 0, sizeof(decrypted));
|
||||
ret = BCryptDecrypt(key, encrypted, sizeof(encrypted), NULL, NULL, 0,
|
||||
decrypted, sizeof(decrypted), &decrypted_size, BCRYPT_PAD_PKCS1);
|
||||
ok(ret == STATUS_SUCCESS, "got %lx\n", ret);
|
||||
ok(decrypted_size == sizeof(input), "got size of %ld\n", decrypted_size);
|
||||
ok(!memcmp(decrypted, input, sizeof(input)), "Decrypted output it's not what expected\n");
|
||||
|
||||
BCryptDestroyKey(key2);
|
||||
BCryptDestroyKey(key);
|
||||
|
||||
if (pBCryptHash)
|
||||
|
@ -3835,11 +3864,113 @@ static void test_DSA(void)
|
|||
|
||||
static void test_SecretAgreement(void)
|
||||
{
|
||||
BCRYPT_SECRET_HANDLE secret;
|
||||
static BCryptBuffer hash_param_buffers[] =
|
||||
{
|
||||
{
|
||||
sizeof(BCRYPT_SHA256_ALGORITHM),
|
||||
KDF_HASH_ALGORITHM,
|
||||
(void *)BCRYPT_SHA256_ALGORITHM,
|
||||
}
|
||||
};
|
||||
static BCryptBufferDesc hash_params =
|
||||
{
|
||||
BCRYPTBUFFER_VERSION,
|
||||
ARRAY_SIZE(hash_param_buffers),
|
||||
hash_param_buffers,
|
||||
};
|
||||
|
||||
static const ULONG dh_private_key[] =
|
||||
{
|
||||
0xc4caf69c, 0x57b4db27, 0x36f7135f, 0x5ccba686, 0xc37b8819, 0x1d35c9b2, 0xbb07a1cf, 0x0c5d1c1b,
|
||||
0xc79acb10, 0x31dfdabb, 0x702e02b9, 0x1efab345, 0x262a8074, 0x5edf7698, 0x9b9dc630, 0x13c34b93,
|
||||
0xacbc928b, 0xb79eed8c, 0x7413dce9, 0xa5521280, 0x88d8e695, 0xa310269f, 0xca7c5719, 0xcd0c775b,
|
||||
0x9a6e2cf2, 0x9e235c51, 0xf49db62d, 0x28e72424, 0x4a44da5a, 0x3d98268d, 0x8e4d2be3, 0x254e44e6,
|
||||
|
||||
0x18a67e55, 0x572e13a1, 0x46f81ca8, 0xc331c9b9, 0xf8fe3dd4, 0x8a889e5a, 0x6c0505fd, 0xbd97a121,
|
||||
0xed2dbd67, 0xf39efa8e, 0x36f9c287, 0xf6bbfa6c, 0x461e42ad, 0x17dc170e, 0xc002dc2e, 0x4813d9a4,
|
||||
0x0b6fabb8, 0x6a9e1860, 0xa8a8cbd9, 0xb7ed6b5d, 0xabb34d23, 0xf2fbe1fd, 0x8670df1e, 0xba7fa4e6,
|
||||
0xf7039712, 0x94448f30, 0xe10c812e, 0x3e311976, 0xcfdd72c4, 0xbdbea98f, 0xc9a540d6, 0x89646d57,
|
||||
|
||||
0x7ab63b33, 0x03a1e9b6, 0x947f7a9b, 0x5ae59eeb, 0x1d12eb05, 0x3f425d92, 0xe028c6ba, 0xbf90ddc9,
|
||||
0xb554f55a, 0x7aeb88b6, 0x4a443a5f, 0xbab35111, 0x82c78a0c, 0x298dd482, 0x02937cb1, 0xc94cdc2e,
|
||||
0x59b010eb, 0x3bbc0a2b, 0xd845fee0, 0x04c1d0db, 0x0c8c9424, 0x1cafd4b2, 0x9aa7aed9, 0x6a478486,
|
||||
0xa8841fd7, 0xbfeff40a, 0x8fd7bcc5, 0x3bb28977, 0x2b9a7955, 0xa55cd2e4, 0x1b6ad657, 0x067cdf21,
|
||||
|
||||
0x06f36920, 0x63280e1b, 0xf17d930f, 0xa06e74a8, 0x463b3a6f, 0x2a464507, 0x93f8a982, 0x8f620a7d,
|
||||
0xeda32d11, 0x9706a6d4, 0x33dce588, 0x75a1c446, 0x048ab567, 0xd735aafa, 0x806f7c1c, 0xdcb9651a,
|
||||
0x26acf3b4, 0x45f91cc9, 0x2a0de6fc, 0xf3c03d0c, 0xf5aee0aa, 0x3eeaaf36, 0x18ccee61, 0x83faa783,
|
||||
0x4b2b5250, 0xf4ccea22, 0x5ac0714b, 0x3f0b2bc6, 0x481b13ce, 0x12040ea7, 0x66e0bbed, 0x158e1a67,
|
||||
};
|
||||
static const ULONG dh_private_key2[] =
|
||||
{
|
||||
0xffffffff, 0xffffffff, 0xa2da0fc9, 0x34c26821, 0x8b62c6c4, 0xd11cdc80, 0x084e0229, 0x74cc678a,
|
||||
0xa6be0b02, 0x229b133b, 0x79084a51, 0xdd04348e, 0xb31995ef, 0x1b433acd, 0x6d0a2b30, 0x37145ff2,
|
||||
0x6d35e14f, 0x45c2516d, 0x76b585e4, 0xc67e5e62, 0xe9424cf4, 0x6bed37a6, 0xb65cff0b, 0xedb706f4,
|
||||
0xfb6b38ee, 0xa59f895a, 0x11249fae, 0xe61f4b7c, 0x51662849, 0x8153e6ec, 0xffffffff, 0xffffffff,
|
||||
|
||||
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x02000000,
|
||||
|
||||
0xa0c3c734, 0xc130c92d, 0x5265abf8, 0xff409f17, 0xbcdce187, 0xff64dae3, 0x170560aa, 0xb2423ed8,
|
||||
0x9ee5a8b9, 0x92548030, 0x02bba1f9, 0x823e39a4, 0x69c438f5, 0xf91016ac, 0x89bfd166, 0x7f996446,
|
||||
0x86224203, 0x15bf689c, 0x619354a4, 0x0c1d3a1f, 0x11bcf3d2, 0x58aae029, 0x41c69824, 0x3fafc179,
|
||||
0xa742747c, 0x60658c7a, 0xd3b0bde4, 0x78d3f08b, 0x6cefa061, 0x33752536, 0xe84d4901, 0x48cd73f4,
|
||||
|
||||
0x8d449700, 0x1f95120e, 0xceb31745, 0x3663177b, 0xbd9bb2d5, 0x9c23c0d9, 0x814d34f8, 0xbc54edb0,
|
||||
0xb874659a, 0x3bac8a30, 0xa1f3dd46, 0x1705c900, 0xbc46fefe, 0x7d13875b, 0x3064351a, 0x4bd89a1c,
|
||||
0x9e938761, 0x931949db, 0x34490719, 0x84fb08ca, 0xa9dd355a, 0x5b3f5061, 0x2ac96663, 0xc594429e,
|
||||
0xbe58395d, 0x2f7d872a, 0x303d37b3, 0xa3a9b606, 0x735a6732, 0xa095bd95, 0x3d55a7c3, 0x00e54635,
|
||||
};
|
||||
static const ULONG dh_peer_key[] =
|
||||
{
|
||||
0xffffffff, 0xffffffff, 0xa2da0fc9, 0x34c26821, 0x8b62c6c4, 0xd11cdc80, 0x084e0229, 0x74cc678a,
|
||||
0xa6be0b02, 0x229b133b, 0x79084a51, 0xdd04348e, 0xb31995ef, 0x1b433acd, 0x6d0a2b30, 0x37145ff2,
|
||||
0x6d35e14f, 0x45c2516d, 0x76b585e4, 0xc67e5e62, 0xe9424cf4, 0x6bed37a6, 0xb65cff0b, 0xedb706f4,
|
||||
0xfb6b38ee, 0xa59f895a, 0x11249fae, 0xe61f4b7c, 0x51662849, 0x8153e6ec, 0xffffffff, 0xffffffff,
|
||||
|
||||
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x02000000,
|
||||
|
||||
0x3bf7404b, 0x6284fffe, 0x97c0d565, 0xd830c658, 0xcc21bf39, 0xcae45bb6, 0x019df7df, 0xbf4cd293,
|
||||
0x6bf1989d, 0x78a81f52, 0xa4ed861c, 0x6bacf493, 0xa3e700d1, 0xd06cc206, 0x411b9727, 0x01e9c9ab,
|
||||
0x9b7e6efa, 0xf46bb25d, 0xd1027242, 0x6130787c, 0xa7b87d8b, 0xfee41492, 0x50db6213, 0x321199b6,
|
||||
0x7dace53a, 0xe8b1ec51, 0x2181b113, 0x3b33e3c0, 0x5b3a2d67, 0xbd34f0c1, 0x7037c542, 0x4a8d5540,
|
||||
};
|
||||
static const ULONG dh_shared_secret_raw[] =
|
||||
{
|
||||
0x375d89b5, 0x35a9c270, 0xfbc5ba82, 0x09eb3069, 0xd50965b0, 0xace510f7, 0x981e8731, 0x80a76115,
|
||||
0xf386d348, 0xca17b8df, 0x0b0e84ec, 0xf81f756e, 0x5030fa20, 0x03113b71, 0x97b7e879, 0x899b5fae,
|
||||
0xe6913299, 0x09270076, 0x39bc813a, 0xde3ef070, 0x65ad5b3a, 0x2b7c4ba4, 0x86c98ef9, 0x3236feaf,
|
||||
0x3e0253f7, 0x0489d2dd, 0x97669a3d, 0x50242fca, 0x5d4aecb1, 0xcf2d805f, 0x2258afff, 0x750e92cd,
|
||||
};
|
||||
static const ULONG dh_shared_secret_raw2[] =
|
||||
{
|
||||
0x0815f37d, 0x19ee74ab, 0x9f63f123, 0xe1b3f10c, 0xbcc9be83, 0xaddf5b9d, 0x28174e72, 0xf8a33825,
|
||||
0xfc74e47d, 0x2c950888, 0xf5b776d9, 0xfc712fef, 0x5b213b32, 0x489a9829, 0xfc0a4d1d, 0x6e641d3b,
|
||||
0x3bb2ff57, 0x63500318, 0x081ee54f, 0xf33a2805, 0xb3759e98, 0xa9a64afe, 0x964b8897, 0x04691bbc,
|
||||
0x80f4aae1, 0x617405ee, 0xab71724d, 0x6c10c214, 0x6f60b96f, 0xdc777b0b, 0x22f40d4f, 0x8a1c4eb5,
|
||||
};
|
||||
static const ULONG dh_shared_secret_sha1[] =
|
||||
{
|
||||
0x0babba9c, 0x0bdeacbd, 0x04e36574, 0xdd504dcd, 0x0cd88db0,
|
||||
};
|
||||
static const ULONG dh_shared_secret_sha256[] =
|
||||
{
|
||||
0x3213db5b, 0x8cc8250b, 0xc829eaab, 0x00933709, 0x68160aa9, 0xfb9f1e20, 0xf92368e6, 0x2b8e18eb,
|
||||
};
|
||||
static const ULONG length = 1024;
|
||||
BCRYPT_DH_PARAMETER_HEADER *dh_header;
|
||||
BCRYPT_DH_KEY_BLOB *dh_key_blob;
|
||||
BCRYPT_SECRET_HANDLE secret, secret2;
|
||||
BCRYPT_ALG_HANDLE alg;
|
||||
BCRYPT_KEY_HANDLE key;
|
||||
BCRYPT_KEY_HANDLE key, key2;
|
||||
UCHAR buffer[2048];
|
||||
NTSTATUS status;
|
||||
ULONG size;
|
||||
ULONG size, i;
|
||||
|
||||
status = BCryptOpenAlgorithmProvider(&alg, BCRYPT_ECDH_P256_ALGORITHM, NULL, 0);
|
||||
ok(status == STATUS_SUCCESS, "got %#lx\n", status);
|
||||
|
@ -3928,6 +4059,224 @@ static void test_SecretAgreement(void)
|
|||
status = BCryptDestroySecret(secret);
|
||||
ok(status == STATUS_SUCCESS, "got %#lx\n", status);
|
||||
|
||||
key = NULL;
|
||||
status = BCryptGenerateKeyPair(alg, &key, 256, 0);
|
||||
ok(status == STATUS_INVALID_PARAMETER, "got %08lx\n", status);
|
||||
|
||||
status = BCryptGenerateKeyPair(alg, &key, length, 0);
|
||||
ok(status == STATUS_SUCCESS, "got %08lx\n", status);
|
||||
ok(key != NULL, "key not set\n");
|
||||
|
||||
memset(buffer, 0xcc, sizeof(buffer));
|
||||
status = BCryptGetProperty(key, BCRYPT_DH_PARAMETERS, buffer, sizeof(buffer), &size, 0);
|
||||
ok(status == STATUS_INVALID_HANDLE, "got %08lx\n", status);
|
||||
|
||||
status = BCryptExportKey(key, NULL, BCRYPT_DH_PUBLIC_BLOB, buffer, sizeof(buffer), &size, 0);
|
||||
ok(status == STATUS_INVALID_HANDLE, "got %08lx\n", status);
|
||||
|
||||
status = BCryptFinalizeKeyPair(key, 0);
|
||||
if (status != STATUS_SUCCESS)
|
||||
{
|
||||
BCryptDestroyKey(key);
|
||||
BCryptCloseAlgorithmProvider(alg, 0);
|
||||
return;
|
||||
}
|
||||
ok(status == STATUS_SUCCESS, "got %08lx\n", status);
|
||||
|
||||
status = BCryptFinalizeKeyPair(key, 0);
|
||||
ok(status == STATUS_INVALID_HANDLE, "got %08lx\n", status);
|
||||
|
||||
size = 0xdeadbeef;
|
||||
status = BCryptGetProperty(key, BCRYPT_DH_PARAMETERS, NULL, sizeof(buffer), &size, 0);
|
||||
ok(status == STATUS_SUCCESS, "got %08lx\n", status);
|
||||
ok(size == sizeof(BCRYPT_DH_PARAMETER_HEADER) + length / 8 * 2, "Got unexpected size %lu.\n", size);
|
||||
|
||||
size = 0xdeadbeef;
|
||||
status = BCryptGetProperty(key, BCRYPT_DH_PARAMETERS, buffer, 28, &size, 0);
|
||||
ok(status == STATUS_BUFFER_TOO_SMALL, "got %08lx\n", status);
|
||||
ok(size == sizeof(BCRYPT_DH_PARAMETER_HEADER) + length / 8 * 2, "Got unexpected size %lu.\n", size);
|
||||
|
||||
size = 0xdeadbeef;
|
||||
status = BCryptGetProperty(key, BCRYPT_DH_PARAMETERS, buffer, sizeof(buffer), &size, 0);
|
||||
ok(status == STATUS_SUCCESS, "got %08lx\n", status);
|
||||
ok(size == sizeof(BCRYPT_DH_PARAMETER_HEADER) + length / 8 * 2, "Got unexpected size %lu.\n", size);
|
||||
|
||||
dh_header = (BCRYPT_DH_PARAMETER_HEADER *)buffer;
|
||||
ok(dh_header->cbLength == sizeof(*dh_header) + length / 8 * 2, "Got unexpected length %lu.\n", dh_header->cbLength);
|
||||
ok(dh_header->cbKeyLength == length / 8, "Got unexpected length %lu.\n", dh_header->cbKeyLength);
|
||||
ok(dh_header->dwMagic == BCRYPT_DH_PARAMETERS_MAGIC, "Got unexpected magic %#lx.\n", dh_header->dwMagic);
|
||||
|
||||
status = BCryptDestroyKey(key);
|
||||
ok(status == STATUS_SUCCESS, "got %08lx\n", status);
|
||||
|
||||
dh_key_blob = (BCRYPT_DH_KEY_BLOB *)buffer;
|
||||
dh_key_blob->dwMagic = BCRYPT_DH_PRIVATE_MAGIC;
|
||||
dh_key_blob->cbKey = length / 8;
|
||||
memcpy(dh_key_blob + 1, dh_private_key, sizeof(dh_private_key));
|
||||
size = sizeof(buffer);
|
||||
status = BCryptImportKeyPair(alg, NULL, BCRYPT_DH_PRIVATE_BLOB, &key, buffer, size, 0);
|
||||
ok(status == STATUS_INVALID_PARAMETER, "got %08lx\n", status);
|
||||
size = sizeof(*dh_key_blob) + length / 8 * 4;
|
||||
status = BCryptImportKeyPair(alg, NULL, BCRYPT_DH_PRIVATE_BLOB, &key, buffer, size, 0);
|
||||
ok(status == STATUS_SUCCESS, "got %08lx\n", status);
|
||||
|
||||
memset(buffer, 0xcc, sizeof(buffer));
|
||||
size = 0xdeadbeef;
|
||||
status = BCryptExportKey(key, NULL, BCRYPT_DH_PUBLIC_BLOB, NULL, 0, &size, 0);
|
||||
ok(status == STATUS_SUCCESS, "got %08lx\n", status);
|
||||
ok(size == sizeof(BCRYPT_DH_KEY_BLOB) + length / 8 * 3, "Got unexpected size %lu.\n", size);
|
||||
|
||||
size = 0xdeadbeef;
|
||||
status = BCryptExportKey(key, NULL, BCRYPT_DH_PUBLIC_BLOB, buffer, sizeof(buffer), &size, 0);
|
||||
ok(status == STATUS_SUCCESS, "got %08lx\n", status);
|
||||
ok(size == sizeof(BCRYPT_DH_KEY_BLOB) + length / 8 * 3, "Got unexpected size %lu.\n", size);
|
||||
dh_key_blob = (BCRYPT_DH_KEY_BLOB *)buffer;
|
||||
ok(dh_key_blob->dwMagic == BCRYPT_DH_PUBLIC_MAGIC, "Got unexpected magic %#lx.\n", dh_key_blob->dwMagic);
|
||||
ok(dh_key_blob->cbKey == length / 8, "Got unexpected length %lu.\n", dh_key_blob->cbKey);
|
||||
ok(!memcmp(dh_key_blob + 1, dh_private_key, length / 8 * 3), "Key data does not match.\n");
|
||||
|
||||
status = BCryptGenerateKeyPair(alg, &key2, length, 0);
|
||||
ok(status == STATUS_SUCCESS, "got %08lx\n", status);
|
||||
dh_header = (BCRYPT_DH_PARAMETER_HEADER *)buffer;
|
||||
dh_header->dwMagic = BCRYPT_DH_PARAMETERS_MAGIC;
|
||||
dh_header->cbLength = sizeof(*dh_header) + length / 8 * 2;
|
||||
dh_header->cbKeyLength = length / 8;
|
||||
memcpy(dh_header + 1, dh_private_key, length / 8 * 2);
|
||||
status = BCryptSetProperty(key2, BCRYPT_DH_PARAMETERS, buffer, dh_header->cbLength, 0);
|
||||
ok(status == STATUS_SUCCESS, "got %08lx\n", status);
|
||||
status = BCryptFinalizeKeyPair(key2, 0);
|
||||
ok(status == STATUS_SUCCESS, "got %08lx\n", status);
|
||||
|
||||
status = BCryptExportKey(key2, NULL, BCRYPT_DH_PUBLIC_BLOB, buffer, sizeof(buffer), &size, 0);
|
||||
ok(status == STATUS_SUCCESS, "got %08lx\n", status);
|
||||
ok(size == sizeof(BCRYPT_DH_KEY_BLOB) + length / 8 * 3, "Got unexpected size %lu.\n", size);
|
||||
ok(dh_key_blob->dwMagic == BCRYPT_DH_PUBLIC_MAGIC, "Got unexpected dwMagic %#lx.\n", dh_key_blob->dwMagic);
|
||||
ok(dh_key_blob->cbKey == length / 8, "Got unexpected length %lu.\n", dh_key_blob->cbKey);
|
||||
todo_wine ok(!memcmp(dh_key_blob + 1, dh_private_key, length / 8 * 2), "DH parameters do not match.\n");
|
||||
ok(memcmp((BYTE *)(dh_key_blob + 1) + length / 8 * 2, (BYTE *)dh_private_key + length / 8 * 2, length / 8),
|
||||
"Random public key data matches.\n");
|
||||
|
||||
memset(buffer, 0xcc, sizeof(buffer));
|
||||
status = BCryptExportKey(key, NULL, BCRYPT_DH_PRIVATE_BLOB, buffer, sizeof(buffer), &size, 0);
|
||||
ok(status == STATUS_SUCCESS, "got %08lx\n", status);
|
||||
dh_key_blob = (BCRYPT_DH_KEY_BLOB *)buffer;
|
||||
ok(size == sizeof(BCRYPT_DH_KEY_BLOB) + length / 8 * 4, "Got unexpected size %lu.\n", size);
|
||||
ok(dh_key_blob->dwMagic == BCRYPT_DH_PRIVATE_MAGIC, "Got unexpected dwMagic %#lx.\n", dh_key_blob->dwMagic);
|
||||
ok(dh_key_blob->cbKey == length / 8, "Got unexpected length %lu.\n", dh_key_blob->cbKey);
|
||||
ok(!memcmp(dh_key_blob + 1, dh_private_key, length / 8 * 4), "Private key data does not match.\n");
|
||||
|
||||
status = BCryptSecretAgreement(NULL, key, &secret, 0);
|
||||
ok(status == STATUS_INVALID_HANDLE, "got %08lx\n", status);
|
||||
|
||||
status = BCryptSecretAgreement(key, NULL, &secret, 0);
|
||||
ok(status == STATUS_INVALID_HANDLE, "got %08lx\n", status);
|
||||
|
||||
status = BCryptSecretAgreement(key, key, NULL, 0);
|
||||
ok(status == STATUS_INVALID_PARAMETER, "got %08lx\n", status);
|
||||
|
||||
status = BCryptSecretAgreement(key, key, &secret, 0);
|
||||
ok(status == STATUS_SUCCESS, "got %08lx\n", status);
|
||||
|
||||
status = BCryptDeriveKey(NULL, L"HASH", NULL, NULL, 0, &size, 0);
|
||||
ok(status == STATUS_INVALID_HANDLE, "got %08lx\n", status);
|
||||
|
||||
status = BCryptDeriveKey(key, L"HASH", NULL, NULL, 0, &size, 0);
|
||||
ok(status == STATUS_INVALID_HANDLE, "got %08lx\n", status);
|
||||
|
||||
status = BCryptDeriveKey(secret, NULL, NULL, NULL, 0, &size, 0);
|
||||
ok(status == STATUS_INVALID_PARAMETER, "got %08lx\n", status);
|
||||
|
||||
size = 0xdeadbeef;
|
||||
status = BCryptDeriveKey(secret, L"HASH", NULL, NULL, 0, &size, 0);
|
||||
ok(status == STATUS_SUCCESS, "got %08lx\n", status);
|
||||
ok(size == 20, "Got unexpected size %lu.\n", size);
|
||||
|
||||
size = 0xdeadbeef;
|
||||
status = BCryptDeriveKey(secret, BCRYPT_KDF_RAW_SECRET, NULL, NULL, 0, &size, 0);
|
||||
ok(status == STATUS_SUCCESS, "got %08lx\n", status);
|
||||
ok(size == length / 8, "Got unexpected size %lu.\n", size);
|
||||
|
||||
status = BCryptDeriveKey(secret, BCRYPT_KDF_RAW_SECRET, NULL, buffer, 128, &size, 0);
|
||||
ok(status == STATUS_SUCCESS, "got %08lx\n", status);
|
||||
ok(size == length / 8, "Got unexpected size %lu.\n", size);
|
||||
ok(!memcmp(buffer, dh_shared_secret_raw, size), "Raw shared secret data does not match.\n");
|
||||
|
||||
size = sizeof(buffer);
|
||||
memset(buffer, 0xcc, sizeof(buffer));
|
||||
status = BCryptDeriveKey(secret, BCRYPT_KDF_HASH, NULL, buffer, 128, &size, 0);
|
||||
ok(status == STATUS_SUCCESS, "got %08lx\n", status);
|
||||
ok(size == 20, "Got unexpected size %lu.\n", size);
|
||||
ok(!memcmp(buffer, dh_shared_secret_sha1, sizeof(dh_shared_secret_sha1)),
|
||||
"sha1 shared secret data does not match.\n");
|
||||
|
||||
size = sizeof(buffer);
|
||||
status = BCryptDeriveKey(secret, BCRYPT_KDF_HASH, &hash_params, buffer, size, &size, 0);
|
||||
ok(status == STATUS_SUCCESS, "got %08lx\n", status);
|
||||
ok(size == 32, "Got unexpected size %lu.\n", size);
|
||||
ok(!memcmp(buffer, dh_shared_secret_sha256, sizeof(dh_shared_secret_sha256)),
|
||||
"sha256 shared secret data does not match.\n");
|
||||
|
||||
for (i = size; i < sizeof(buffer); ++i)
|
||||
if (buffer[i] != 0xcc) break;
|
||||
ok(i == sizeof(buffer), "Buffer modified at %lu, value %#x.\n", i, buffer[i]);
|
||||
|
||||
status = BCryptDestroySecret(secret);
|
||||
ok(status == STATUS_SUCCESS, "got %08lx\n", status);
|
||||
|
||||
status = BCryptSecretAgreement(key, key2, &secret, 0);
|
||||
ok(status == STATUS_SUCCESS, "got %08lx\n", status);
|
||||
status = BCryptSecretAgreement(key2, key, &secret2, 0);
|
||||
ok(status == STATUS_SUCCESS, "got %08lx\n", status);
|
||||
|
||||
status = BCryptDeriveKey(secret, BCRYPT_KDF_RAW_SECRET, NULL, buffer, 128, &size, 0);
|
||||
ok(status == STATUS_SUCCESS, "got %08lx\n", status);
|
||||
status = BCryptDeriveKey(secret, BCRYPT_KDF_RAW_SECRET, NULL, buffer + size, 128, &size, 0);
|
||||
ok(status == STATUS_SUCCESS, "got %08lx\n", status);
|
||||
ok(!memcmp(buffer, buffer + size, size), "Shared secrets do not match.\n");
|
||||
|
||||
status = BCryptDestroySecret(secret);
|
||||
ok(status == STATUS_SUCCESS, "got %08lx\n", status);
|
||||
status = BCryptDestroySecret(secret2);
|
||||
ok(status == STATUS_SUCCESS, "got %08lx\n", status);
|
||||
|
||||
status = BCryptDestroyKey(key);
|
||||
ok(status == STATUS_SUCCESS, "got %08lx\n", status);
|
||||
status = BCryptDestroyKey(key2);
|
||||
ok(status == STATUS_SUCCESS, "got %08lx\n", status);
|
||||
|
||||
dh_key_blob = (BCRYPT_DH_KEY_BLOB *)buffer;
|
||||
dh_key_blob->dwMagic = BCRYPT_DH_PRIVATE_MAGIC;
|
||||
dh_key_blob->cbKey = length / 8;
|
||||
memcpy(dh_key_blob + 1, dh_private_key2, sizeof(dh_private_key2));
|
||||
|
||||
size = sizeof(*dh_key_blob) + length / 8 * 4;
|
||||
status = BCryptImportKeyPair(alg, NULL, BCRYPT_DH_PRIVATE_BLOB, &key, buffer, size, 0);
|
||||
ok(status == STATUS_SUCCESS, "got %08lx\n", status);
|
||||
|
||||
dh_key_blob = (BCRYPT_DH_KEY_BLOB *)buffer;
|
||||
dh_key_blob->dwMagic = BCRYPT_DH_PUBLIC_MAGIC;
|
||||
dh_key_blob->cbKey = length / 8;
|
||||
memcpy(dh_key_blob + 1, dh_peer_key, sizeof(dh_peer_key));
|
||||
|
||||
size = sizeof(*dh_key_blob) + length / 8 * 3;
|
||||
status = BCryptImportKeyPair(alg, NULL, BCRYPT_DH_PUBLIC_BLOB, &key2, buffer, size, 0);
|
||||
ok(status == STATUS_SUCCESS, "got %08lx\n", status);
|
||||
|
||||
status = BCryptSecretAgreement(key, key2, &secret, 0);
|
||||
ok(status == STATUS_SUCCESS, "got %08lx\n", status);
|
||||
|
||||
status = BCryptDeriveKey(secret, BCRYPT_KDF_RAW_SECRET, NULL, buffer, 128, &size, 0);
|
||||
ok(status == STATUS_SUCCESS, "got %08lx\n", status);
|
||||
ok(size == length / 8, "Got unexpected size %lu.\n", size);
|
||||
ok(!memcmp(buffer, dh_shared_secret_raw2, size), "Raw shared secret data does not match.\n");
|
||||
|
||||
status = BCryptDestroySecret(secret);
|
||||
ok(status == STATUS_SUCCESS, "got %08lx\n", status);
|
||||
status = BCryptDestroyKey(key);
|
||||
ok(status == STATUS_SUCCESS, "got %08lx\n", status);
|
||||
status = BCryptDestroyKey(key2);
|
||||
ok(status == STATUS_SUCCESS, "got %08lx\n", status);
|
||||
|
||||
status = BCryptCloseAlgorithmProvider(alg, 0);
|
||||
ok(status == STATUS_SUCCESS, "got %#lx\n", status);
|
||||
}
|
||||
|
|
|
@ -149,7 +149,7 @@ HRESULT CompCatCacheDaemon_Constructor(IUnknown *pUnkOuter, IUnknown **ppOut)
|
|||
|
||||
This->IRunnableTask_iface.lpVtbl = &CompCatCacheDaemonVtbl;
|
||||
This->refCount = 1;
|
||||
InitializeCriticalSection(&This->cs);
|
||||
InitializeCriticalSectionEx(&This->cs, 0, RTL_CRITICAL_SECTION_FLAG_FORCE_DEBUG_INFO);
|
||||
This->cs.DebugInfo->Spare[0] = (DWORD_PTR)(__FILE__ ": CompCatCacheDaemon.cs");
|
||||
|
||||
TRACE("returning %p\n", This);
|
||||
|
|
|
@ -626,7 +626,7 @@ HRESULT ProgressDialog_Constructor(IUnknown *pUnkOuter, IUnknown **ppOut)
|
|||
This->IProgressDialog_iface.lpVtbl = &ProgressDialogVtbl;
|
||||
This->IOleWindow_iface.lpVtbl = &OleWindowVtbl;
|
||||
This->refCount = 1;
|
||||
InitializeCriticalSection(&This->cs);
|
||||
InitializeCriticalSectionEx(&This->cs, 0, RTL_CRITICAL_SECTION_FLAG_FORCE_DEBUG_INFO);
|
||||
This->cs.DebugInfo->Spare[0] = (DWORD_PTR)(__FILE__ ": ProgressDialog.cs");
|
||||
|
||||
TRACE("returning %p\n", This);
|
||||
|
|
|
@ -91,7 +91,7 @@
|
|||
@ stdcall CM_Get_Device_Interface_List_SizeW(ptr ptr wstr long) setupapi.CM_Get_Device_Interface_List_SizeW
|
||||
@ stdcall CM_Get_Device_Interface_List_Size_ExA(ptr ptr str long ptr) setupapi.CM_Get_Device_Interface_List_Size_ExA
|
||||
@ stdcall CM_Get_Device_Interface_List_Size_ExW(ptr ptr wstr long ptr) setupapi.CM_Get_Device_Interface_List_Size_ExW
|
||||
@ stub CM_Get_Device_Interface_PropertyW
|
||||
@ stdcall CM_Get_Device_Interface_PropertyW(wstr ptr ptr ptr ptr long)
|
||||
@ stub CM_Get_First_Log_Conf
|
||||
@ stub CM_Get_First_Log_Conf_Ex
|
||||
@ stub CM_Get_Global_State
|
||||
|
|
|
@ -17,6 +17,7 @@
|
|||
*/
|
||||
|
||||
#include "wine/debug.h"
|
||||
#include "winreg.h"
|
||||
#include "cfgmgr32.h"
|
||||
|
||||
WINE_DEFAULT_DEBUG_CHANNEL(setupapi);
|
||||
|
@ -67,3 +68,16 @@ CONFIGRET WINAPI CM_Register_Notification( CM_NOTIFY_FILTER *filter, void *conte
|
|||
|
||||
return CR_CALL_NOT_IMPLEMENTED;
|
||||
}
|
||||
|
||||
/***********************************************************************
|
||||
* CM_Get_Device_Interface_PropertyW (cfgmgr32.@)
|
||||
*/
|
||||
CONFIGRET WINAPI CM_Get_Device_Interface_PropertyW( LPCWSTR device_interface, const DEVPROPKEY *property_key,
|
||||
DEVPROPTYPE *property_type, BYTE *property_buffer,
|
||||
ULONG *property_buffer_size, ULONG flags )
|
||||
{
|
||||
FIXME("%s %p %p %p %p %ld stub!\n", debugstr_w(device_interface), property_key, property_type,
|
||||
property_buffer, property_buffer_size, flags);
|
||||
|
||||
return CR_CALL_NOT_IMPLEMENTED;
|
||||
}
|
||||
|
|
|
@ -17,6 +17,7 @@
|
|||
*/
|
||||
|
||||
#include "wine/test.h"
|
||||
#include "winreg.h"
|
||||
#include "cfgmgr32.h"
|
||||
|
||||
static void test_CM_MapCrToWin32Err(void)
|
||||
|
|
|
@ -376,7 +376,7 @@ static struct apartment *apartment_construct(DWORD model)
|
|||
apt->refs = 1;
|
||||
apt->remunk_exported = FALSE;
|
||||
apt->oidc = 1;
|
||||
InitializeCriticalSection(&apt->cs);
|
||||
InitializeCriticalSectionEx(&apt->cs, 0, RTL_CRITICAL_SECTION_FLAG_FORCE_DEBUG_INFO);
|
||||
apt->cs.DebugInfo->Spare[0] = (DWORD_PTR)(__FILE__ ": apartment");
|
||||
|
||||
apt->multi_threaded = !(model & COINIT_APARTMENTTHREADED);
|
||||
|
|
|
@ -1575,7 +1575,7 @@ static HRESULT proxy_manager_construct(
|
|||
list_init(&This->entry);
|
||||
list_init(&This->interfaces);
|
||||
|
||||
InitializeCriticalSection(&This->cs);
|
||||
InitializeCriticalSectionEx(&This->cs, 0, RTL_CRITICAL_SECTION_FLAG_FORCE_DEBUG_INFO);
|
||||
This->cs.DebugInfo->Spare[0] = (DWORD_PTR)(__FILE__ ": proxy_manager");
|
||||
|
||||
/* the apartment the object was unmarshaled into */
|
||||
|
|
|
@ -143,7 +143,7 @@ void WINAPI RoUninitialize(void)
|
|||
/***********************************************************************
|
||||
* RoGetActivationFactory (combase.@)
|
||||
*/
|
||||
HRESULT WINAPI RoGetActivationFactory(HSTRING classid, REFIID iid, void **class_factory)
|
||||
HRESULT WINAPI DECLSPEC_HOTPATCH RoGetActivationFactory(HSTRING classid, REFIID iid, void **class_factory)
|
||||
{
|
||||
PFNGETACTIVATIONFACTORY pDllGetActivationFactory;
|
||||
IActivationFactory *factory;
|
||||
|
|
|
@ -187,7 +187,7 @@ static struct stub_manager *new_stub_manager(struct apartment *apt, IUnknown *ob
|
|||
|
||||
list_init(&sm->ifstubs);
|
||||
|
||||
InitializeCriticalSection(&sm->lock);
|
||||
InitializeCriticalSectionEx(&sm->lock, 0, RTL_CRITICAL_SECTION_FLAG_FORCE_DEBUG_INFO);
|
||||
sm->lock.DebugInfo->Spare[0] = (DWORD_PTR)(__FILE__ ": stub_manager");
|
||||
|
||||
IUnknown_AddRef(object);
|
||||
|
|
|
@ -813,7 +813,7 @@ static BOOL ANIMATE_Create(HWND hWnd, const CREATESTRUCTW *lpcs)
|
|||
|
||||
TRACE("Animate style %#lx, parent %p\n", infoPtr->dwStyle, infoPtr->hwndNotify);
|
||||
|
||||
InitializeCriticalSection(&infoPtr->cs);
|
||||
InitializeCriticalSectionEx(&infoPtr->cs, 0, RTL_CRITICAL_SECTION_FLAG_FORCE_DEBUG_INFO);
|
||||
infoPtr->cs.DebugInfo->Spare[0] = (DWORD_PTR)(__FILE__ ": ANIMATE_INFO*->cs");
|
||||
|
||||
return TRUE;
|
||||
|
|
|
@ -763,106 +763,18 @@ HIMAGELIST WINAPI
|
|||
ImageList_Create (INT cx, INT cy, UINT flags,
|
||||
INT cInitial, INT cGrow)
|
||||
{
|
||||
HIMAGELIST himl;
|
||||
INT nCount;
|
||||
HBITMAP hbmTemp;
|
||||
UINT ilc = (flags & 0xFE);
|
||||
static const WORD aBitBlend25[] =
|
||||
{0xAA, 0x00, 0x55, 0x00, 0xAA, 0x00, 0x55, 0x00};
|
||||
|
||||
static const WORD aBitBlend50[] =
|
||||
{0x55, 0xAA, 0x55, 0xAA, 0x55, 0xAA, 0x55, 0xAA};
|
||||
IImageList2 *himl;
|
||||
|
||||
TRACE("(%d %d 0x%x %d %d)\n", cx, cy, flags, cInitial, cGrow);
|
||||
|
||||
if (cx < 0 || cy < 0) return NULL;
|
||||
if (!((flags&ILC_COLORDDB) == ILC_COLORDDB) && (cx == 0 || cy == 0)) return NULL;
|
||||
|
||||
/* Create the IImageList interface for the image list */
|
||||
if (FAILED(ImageListImpl_CreateInstance(NULL, &IID_IImageList, (void **)&himl)))
|
||||
if (FAILED(ImageListImpl_CreateInstance(NULL, &IID_IImageList2, (void **)&himl)))
|
||||
return NULL;
|
||||
|
||||
cGrow = (WORD)((max( cGrow, 1 ) + 3) & ~3);
|
||||
if (IImageList2_Initialize(himl, cx, cy, flags, cInitial, cGrow) == S_OK)
|
||||
return (HIMAGELIST)himl;
|
||||
|
||||
if (cGrow > 256)
|
||||
{
|
||||
/* Windows doesn't limit the size here, but X11 doesn't let us allocate such huge bitmaps */
|
||||
WARN( "grow %d too large, limiting to 256\n", cGrow );
|
||||
cGrow = 256;
|
||||
}
|
||||
|
||||
himl->cx = cx;
|
||||
himl->cy = cy;
|
||||
himl->flags = flags;
|
||||
himl->cMaxImage = cInitial + 1;
|
||||
himl->cInitial = cInitial;
|
||||
himl->cGrow = cGrow;
|
||||
himl->clrFg = CLR_DEFAULT;
|
||||
himl->clrBk = CLR_NONE;
|
||||
himl->color_table_set = FALSE;
|
||||
|
||||
/* initialize overlay mask indices */
|
||||
for (nCount = 0; nCount < MAX_OVERLAYIMAGE; nCount++)
|
||||
himl->nOvlIdx[nCount] = -1;
|
||||
|
||||
/* Create Image & Mask DCs */
|
||||
himl->hdcImage = CreateCompatibleDC (0);
|
||||
if (!himl->hdcImage)
|
||||
goto cleanup;
|
||||
if (himl->flags & ILC_MASK){
|
||||
himl->hdcMask = CreateCompatibleDC(0);
|
||||
if (!himl->hdcMask)
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
/* Default to ILC_COLOR4 if none of the ILC_COLOR* flags are specified */
|
||||
if (ilc == ILC_COLOR)
|
||||
{
|
||||
ilc = ILC_COLOR4;
|
||||
himl->flags |= ILC_COLOR4;
|
||||
}
|
||||
|
||||
if (ilc >= ILC_COLOR4 && ilc <= ILC_COLOR32)
|
||||
himl->uBitsPixel = ilc;
|
||||
else
|
||||
himl->uBitsPixel = (UINT)GetDeviceCaps (himl->hdcImage, BITSPIXEL);
|
||||
|
||||
if (himl->cMaxImage > 0) {
|
||||
himl->hbmImage = ImageList_CreateImage(himl->hdcImage, himl, himl->cMaxImage);
|
||||
SelectObject(himl->hdcImage, himl->hbmImage);
|
||||
} else
|
||||
himl->hbmImage = 0;
|
||||
|
||||
if ((himl->cMaxImage > 0) && (himl->flags & ILC_MASK)) {
|
||||
SIZE sz;
|
||||
|
||||
imagelist_get_bitmap_size(himl, himl->cMaxImage, &sz);
|
||||
himl->hbmMask = CreateBitmap (sz.cx, sz.cy, 1, 1, NULL);
|
||||
if (himl->hbmMask == 0) {
|
||||
ERR("Error creating mask bitmap!\n");
|
||||
goto cleanup;
|
||||
}
|
||||
SelectObject(himl->hdcMask, himl->hbmMask);
|
||||
}
|
||||
else
|
||||
himl->hbmMask = 0;
|
||||
|
||||
himl->item_flags = Alloc( himl->cMaxImage * sizeof(*himl->item_flags) );
|
||||
|
||||
/* create blending brushes */
|
||||
hbmTemp = CreateBitmap (8, 8, 1, 1, aBitBlend25);
|
||||
himl->hbrBlend25 = CreatePatternBrush (hbmTemp);
|
||||
DeleteObject (hbmTemp);
|
||||
|
||||
hbmTemp = CreateBitmap (8, 8, 1, 1, aBitBlend50);
|
||||
himl->hbrBlend50 = CreatePatternBrush (hbmTemp);
|
||||
DeleteObject (hbmTemp);
|
||||
|
||||
TRACE("created imagelist %p\n", himl);
|
||||
return himl;
|
||||
|
||||
cleanup:
|
||||
ImageList_Destroy(himl);
|
||||
IImageList2_Release(himl);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
@ -3721,8 +3633,99 @@ static HRESULT WINAPI ImageListImpl_GetStatistics(IImageList2 *iface, IMAGELISTS
|
|||
|
||||
static HRESULT WINAPI ImageListImpl_Initialize(IImageList2 *iface, INT cx, INT cy, UINT flags, INT initial, INT grow)
|
||||
{
|
||||
FIXME("(%p)->(%d %d %d %d %d): stub\n", iface, cx, cy, flags, initial, grow);
|
||||
return E_NOTIMPL;
|
||||
HIMAGELIST himl = impl_from_IImageList2(iface);
|
||||
INT nCount;
|
||||
HBITMAP hbmTemp;
|
||||
UINT ilc = (flags & 0xFE);
|
||||
static const WORD aBitBlend25[] =
|
||||
{0xAA, 0x00, 0x55, 0x00, 0xAA, 0x00, 0x55, 0x00};
|
||||
static const WORD aBitBlend50[] =
|
||||
{0x55, 0xAA, 0x55, 0xAA, 0x55, 0xAA, 0x55, 0xAA};
|
||||
|
||||
TRACE("(%p)->(%d %d %d %d %d)\n", iface, cx, cy, flags, initial, grow);
|
||||
|
||||
if (cx < 0 || cy < 0) return E_INVALIDARG;
|
||||
if (!((flags&ILC_COLORDDB) == ILC_COLORDDB) && (cx == 0 || cy == 0)) return E_INVALIDARG;
|
||||
|
||||
grow = (WORD)((max( grow, 1 ) + 3) & ~3);
|
||||
|
||||
if (grow > 256)
|
||||
{
|
||||
/* Windows doesn't limit the size here, but X11 doesn't let us allocate such huge bitmaps */
|
||||
WARN( "grow %d too large, limiting to 256\n", grow );
|
||||
grow = 256;
|
||||
}
|
||||
|
||||
himl->cx = cx;
|
||||
himl->cy = cy;
|
||||
himl->flags = flags;
|
||||
himl->cMaxImage = initial + 1;
|
||||
himl->cInitial = initial;
|
||||
himl->cGrow = grow;
|
||||
himl->clrFg = CLR_DEFAULT;
|
||||
himl->clrBk = CLR_NONE;
|
||||
himl->color_table_set = FALSE;
|
||||
|
||||
/* initialize overlay mask indices */
|
||||
for (nCount = 0; nCount < MAX_OVERLAYIMAGE; nCount++)
|
||||
himl->nOvlIdx[nCount] = -1;
|
||||
|
||||
/* Create Image & Mask DCs */
|
||||
himl->hdcImage = CreateCompatibleDC (0);
|
||||
if (!himl->hdcImage)
|
||||
return E_FAIL;
|
||||
if (himl->flags & ILC_MASK){
|
||||
himl->hdcMask = CreateCompatibleDC(0);
|
||||
if (!himl->hdcMask)
|
||||
return E_FAIL;
|
||||
}
|
||||
|
||||
/* Default to ILC_COLOR4 if none of the ILC_COLOR* flags are specified */
|
||||
if (ilc == ILC_COLOR)
|
||||
{
|
||||
ilc = ILC_COLOR4;
|
||||
himl->flags |= ILC_COLOR4;
|
||||
}
|
||||
|
||||
if (ilc >= ILC_COLOR4 && ilc <= ILC_COLOR32)
|
||||
himl->uBitsPixel = ilc;
|
||||
else
|
||||
himl->uBitsPixel = (UINT)GetDeviceCaps (himl->hdcImage, BITSPIXEL);
|
||||
|
||||
if (himl->cMaxImage > 0) {
|
||||
himl->hbmImage = ImageList_CreateImage(himl->hdcImage, himl, himl->cMaxImage);
|
||||
SelectObject(himl->hdcImage, himl->hbmImage);
|
||||
} else
|
||||
himl->hbmImage = 0;
|
||||
|
||||
if ((himl->cMaxImage > 0) && (himl->flags & ILC_MASK)) {
|
||||
SIZE sz;
|
||||
|
||||
imagelist_get_bitmap_size(himl, himl->cMaxImage, &sz);
|
||||
himl->hbmMask = CreateBitmap (sz.cx, sz.cy, 1, 1, NULL);
|
||||
if (himl->hbmMask == 0) {
|
||||
ERR("Error creating mask bitmap!\n");
|
||||
return E_FAIL;
|
||||
}
|
||||
SelectObject(himl->hdcMask, himl->hbmMask);
|
||||
}
|
||||
else
|
||||
himl->hbmMask = 0;
|
||||
|
||||
himl->item_flags = Alloc( himl->cMaxImage * sizeof(*himl->item_flags) );
|
||||
|
||||
/* create blending brushes */
|
||||
hbmTemp = CreateBitmap (8, 8, 1, 1, aBitBlend25);
|
||||
himl->hbrBlend25 = CreatePatternBrush (hbmTemp);
|
||||
DeleteObject (hbmTemp);
|
||||
|
||||
hbmTemp = CreateBitmap (8, 8, 1, 1, aBitBlend50);
|
||||
himl->hbrBlend50 = CreatePatternBrush (hbmTemp);
|
||||
DeleteObject (hbmTemp);
|
||||
|
||||
TRACE("created imagelist %p\n", himl);
|
||||
return S_OK;
|
||||
|
||||
}
|
||||
|
||||
static HRESULT WINAPI ImageListImpl_Replace2(IImageList2 *iface, INT i, HBITMAP image, HBITMAP mask, IUnknown *unk, DWORD flags)
|
||||
|
|
|
@ -1672,6 +1672,8 @@ static void test_iimagelist(void)
|
|||
HIMAGELIST himl;
|
||||
HRESULT hr;
|
||||
ULONG ret;
|
||||
HBITMAP hbm;
|
||||
int ret2;
|
||||
|
||||
if (!pHIMAGELIST_QueryInterface)
|
||||
{
|
||||
|
@ -1741,7 +1743,48 @@ static void test_iimagelist(void)
|
|||
win_skip("IImageList2 is not supported.\n");
|
||||
return;
|
||||
}
|
||||
ok(hr == S_OK, "got 0x%08lx\n", hr);
|
||||
|
||||
hr = IImageList2_Initialize(imagelist, BMP_CX, BMP_CX, ILC_COLOR24, 1, 1);
|
||||
ok(hr == S_OK, "got %#lx\n", hr);
|
||||
|
||||
check_iml_data((HIMAGELIST)imagelist, BMP_CX, BMP_CX, 0, 2, 1, ILC_COLOR24, "IImageList2 0");
|
||||
|
||||
hr = IImageList2_Remove(imagelist, 0);
|
||||
ok(hr == E_INVALIDARG, "got %#lx\n", hr);
|
||||
hr = IImageList2_Remove(imagelist, -1);
|
||||
ok(hr == S_OK, "got %#lx\n", hr);
|
||||
|
||||
hbm = CreateBitmap(BMP_CX, BMP_CX, 1, 1, NULL);
|
||||
|
||||
ret2 = -1;
|
||||
hr = IImageList2_Add(imagelist, hbm, 0, &ret2);
|
||||
ok(hr == S_OK, "got %#lx\n", hr);
|
||||
ok(ret2 == 0, "got %d\n", ret2);
|
||||
|
||||
check_iml_data((HIMAGELIST)imagelist, BMP_CX, BMP_CX, 1, 2, 4, ILC_COLOR24, "IImageList2 1");
|
||||
|
||||
ret2 = -1;
|
||||
hr = IImageList2_Add(imagelist, hbm, 0, &ret2);
|
||||
ok(hr == S_OK, "got %#lx\n", hr);
|
||||
ok(ret2 == 1, "got %d\n", ret2);
|
||||
|
||||
check_iml_data((HIMAGELIST)imagelist, BMP_CX, BMP_CX, 2, 7, 4, ILC_COLOR24, "IImageList2 2");
|
||||
|
||||
hr = IImageList2_Remove(imagelist, 0);
|
||||
ok(hr == S_OK, "got %#lx\n", hr);
|
||||
|
||||
check_iml_data((HIMAGELIST)imagelist, BMP_CX, BMP_CX, 1, 7, 4, ILC_COLOR24, "IImageList2 1");
|
||||
|
||||
hr = IImageList2_Remove(imagelist, -1);
|
||||
ok(hr == S_OK, "got %#lx\n", hr);
|
||||
|
||||
check_iml_data((HIMAGELIST)imagelist, BMP_CX, BMP_CX, 0, 4, 1, ILC_COLOR24, "IImageList2 0");
|
||||
|
||||
hr = IImageList2_Remove(imagelist, 0);
|
||||
ok(hr == E_INVALIDARG, "got %#lx\n", hr);
|
||||
|
||||
DeleteObject(hbm);
|
||||
|
||||
IImageList2_Release(imagelist);
|
||||
}
|
||||
|
||||
|
|
|
@ -469,6 +469,7 @@ static void test_monthcal(void)
|
|||
ok(limits == GDTR_MIN, "got 0x%08lx\n", limits);
|
||||
|
||||
GetSystemTime(st);
|
||||
st[0].wDay = 25;
|
||||
st[1] = st[0];
|
||||
st[1].wYear++;
|
||||
r = SendMessageA(hwnd, MCM_SETRANGE, 0, (LPARAM)st);
|
||||
|
@ -480,6 +481,7 @@ static void test_monthcal(void)
|
|||
|
||||
/* flags are 0, set min limit */
|
||||
GetSystemTime(st);
|
||||
st[0].wDay = 25;
|
||||
st[1] = st[0];
|
||||
st[1].wYear++;
|
||||
|
||||
|
|
|
@ -978,10 +978,11 @@ static BOOL PRINTDLG_SetUpPaperComboBoxW(HWND hDlg,
|
|||
/***********************************************************************
|
||||
* PRINTDLG_UpdatePrinterInfoTexts [internal]
|
||||
*/
|
||||
static void PRINTDLG_UpdatePrinterInfoTextsA(HWND hDlg, const PRINTER_INFO_2A *pi)
|
||||
static void PRINTDLG_UpdatePrinterInfoTextsA(HWND hDlg, DWORD flags, const PRINTER_INFO_2A *pi)
|
||||
{
|
||||
char StatusMsg[256];
|
||||
char ResourceString[256];
|
||||
char printer_name[256];
|
||||
int i;
|
||||
|
||||
/* Status Message */
|
||||
|
@ -1004,6 +1005,17 @@ static void PRINTDLG_UpdatePrinterInfoTextsA(HWND hDlg, const PRINTER_INFO_2A *p
|
|||
SetDlgItemTextA(hDlg, stc12, StatusMsg);
|
||||
|
||||
/* set all other printer info texts */
|
||||
if (flags & PD_PRINTSETUP)
|
||||
{
|
||||
DWORD dwBufLen = ARRAY_SIZE(printer_name);
|
||||
GetDefaultPrinterA(printer_name, &dwBufLen);
|
||||
}
|
||||
else
|
||||
{
|
||||
/* FIXME: Windows decorates the printer name with text like 'System Printer' or 'on <port>'. */
|
||||
lstrcpynA(printer_name, pi->pPrinterName, ARRAY_SIZE(printer_name));
|
||||
}
|
||||
SetDlgItemTextA(hDlg, stc1, printer_name);
|
||||
SetDlgItemTextA(hDlg, stc11, pi->pDriverName);
|
||||
|
||||
if (pi->pLocation != NULL && pi->pLocation[0] != '\0')
|
||||
|
@ -1014,11 +1026,12 @@ static void PRINTDLG_UpdatePrinterInfoTextsA(HWND hDlg, const PRINTER_INFO_2A *p
|
|||
return;
|
||||
}
|
||||
|
||||
static void PRINTDLG_UpdatePrinterInfoTextsW(HWND hDlg, const PRINTER_INFO_2W *pi)
|
||||
static void PRINTDLG_UpdatePrinterInfoTextsW(HWND hDlg, DWORD flags, const PRINTER_INFO_2W *pi)
|
||||
{
|
||||
WCHAR StatusMsg[256];
|
||||
WCHAR ResourceString[256];
|
||||
int i;
|
||||
WCHAR printer_name[256];
|
||||
int i;
|
||||
|
||||
/* Status Message */
|
||||
StatusMsg[0]='\0';
|
||||
|
@ -1040,6 +1053,17 @@ static void PRINTDLG_UpdatePrinterInfoTextsW(HWND hDlg, const PRINTER_INFO_2W *p
|
|||
SetDlgItemTextW(hDlg, stc12, StatusMsg);
|
||||
|
||||
/* set all other printer info texts */
|
||||
if (flags & PD_PRINTSETUP)
|
||||
{
|
||||
DWORD dwBufLen = ARRAY_SIZE(printer_name);
|
||||
GetDefaultPrinterW(printer_name, &dwBufLen);
|
||||
}
|
||||
else
|
||||
{
|
||||
/* FIXME: Windows decorates the printer name with text like 'System Printer' or 'on <port>'. */
|
||||
lstrcpynW(printer_name, pi->pPrinterName, ARRAY_SIZE(printer_name));
|
||||
}
|
||||
SetDlgItemTextW(hDlg, stc1, printer_name);
|
||||
SetDlgItemTextW(hDlg, stc11, pi->pDriverName);
|
||||
if (pi->pLocation != NULL && pi->pLocation[0] != '\0')
|
||||
SetDlgItemTextW(hDlg, stc14, pi->pLocation);
|
||||
|
@ -1081,7 +1105,7 @@ static BOOL PRINTDLG_ChangePrinterA(HWND hDlg, char *name, PRINT_PTRA *PrintStru
|
|||
}
|
||||
ClosePrinter(hprn);
|
||||
|
||||
PRINTDLG_UpdatePrinterInfoTextsA(hDlg, PrintStructures->lpPrinterInfo);
|
||||
PRINTDLG_UpdatePrinterInfoTextsA(hDlg, lppd->Flags, PrintStructures->lpPrinterInfo);
|
||||
|
||||
free(PrintStructures->lpDevMode);
|
||||
PrintStructures->lpDevMode = NULL;
|
||||
|
@ -1229,7 +1253,7 @@ static BOOL PRINTDLG_ChangePrinterA(HWND hDlg, char *name, PRINT_PTRA *PrintStru
|
|||
if(IsDefault)
|
||||
SendMessageA(hQuality, CB_SETCURSEL, Index, 0);
|
||||
|
||||
SendMessageA(hQuality, CB_SETITEMDATA, Index, MAKELONG(dpiX,dpiY));
|
||||
SendMessageA(hQuality, CB_SETITEMDATA, Index, MAKELONG(Resolutions[i], Resolutions[i+1]));
|
||||
}
|
||||
free(Resolutions);
|
||||
}
|
||||
|
@ -1288,7 +1312,7 @@ static BOOL PRINTDLG_ChangePrinterW(HWND hDlg, WCHAR *name,
|
|||
}
|
||||
ClosePrinter(hprn);
|
||||
|
||||
PRINTDLG_UpdatePrinterInfoTextsW(hDlg, PrintStructures->lpPrinterInfo);
|
||||
PRINTDLG_UpdatePrinterInfoTextsW(hDlg, lppd->Flags, PrintStructures->lpPrinterInfo);
|
||||
|
||||
free(PrintStructures->lpDevMode);
|
||||
PrintStructures->lpDevMode = NULL;
|
||||
|
@ -1386,6 +1410,61 @@ static BOOL PRINTDLG_ChangePrinterW(HWND hDlg, WCHAR *name,
|
|||
if (lppd->Flags & PD_HIDEPRINTTOFILE)
|
||||
ShowWindow(GetDlgItem(hDlg, chx1), SW_HIDE);
|
||||
|
||||
/* Fill print quality combo, PrintDlg16 */
|
||||
if (GetDlgItem(hDlg, cmb1))
|
||||
{
|
||||
DWORD num_resolutions = DeviceCapabilitiesW(PrintStructures->lpPrinterInfo->pPrinterName,
|
||||
PrintStructures->lpPrinterInfo->pPortName,
|
||||
DC_ENUMRESOLUTIONS, NULL, lpdm);
|
||||
|
||||
if (num_resolutions != -1)
|
||||
{
|
||||
HWND quality = GetDlgItem(hDlg, cmb1);
|
||||
LONG* resolutions;
|
||||
WCHAR buf[255];
|
||||
DWORD i;
|
||||
int dpiX, dpiY;
|
||||
HDC printer = CreateDCW(PrintStructures->lpPrinterInfo->pDriverName,
|
||||
PrintStructures->lpPrinterInfo->pPrinterName,
|
||||
0, lpdm);
|
||||
|
||||
resolutions = malloc(num_resolutions * sizeof(LONG) * 2);
|
||||
DeviceCapabilitiesW(PrintStructures->lpPrinterInfo->pPrinterName,
|
||||
PrintStructures->lpPrinterInfo->pPortName,
|
||||
DC_ENUMRESOLUTIONS, (LPWSTR)resolutions, lpdm);
|
||||
|
||||
dpiX = GetDeviceCaps(printer, LOGPIXELSX);
|
||||
dpiY = GetDeviceCaps(printer, LOGPIXELSY);
|
||||
DeleteDC(printer);
|
||||
|
||||
SendMessageW(quality, CB_RESETCONTENT, 0, 0);
|
||||
for (i = 0; i < (num_resolutions * 2); i += 2)
|
||||
{
|
||||
BOOL is_default = FALSE;
|
||||
LRESULT index;
|
||||
|
||||
if (resolutions[i] == resolutions[i+1])
|
||||
{
|
||||
if (dpiX == resolutions[i])
|
||||
is_default = TRUE;
|
||||
swprintf(buf, sizeof(buf), L"%ld dpi", resolutions[i]);
|
||||
} else
|
||||
{
|
||||
if (dpiX == resolutions[i] && dpiY == resolutions[i+1])
|
||||
is_default = TRUE;
|
||||
swprintf(buf, sizeof(buf), L"%ld dpi x %ld dpi", resolutions[i], resolutions[i+1]);
|
||||
}
|
||||
|
||||
index = SendMessageW(quality, CB_ADDSTRING, 0, (LPARAM)buf);
|
||||
|
||||
if (is_default)
|
||||
SendMessageW(quality, CB_SETCURSEL, index, 0);
|
||||
|
||||
SendMessageW(quality, CB_SETITEMDATA, index, MAKELONG(resolutions[i], resolutions[i+1]));
|
||||
}
|
||||
free(resolutions);
|
||||
}
|
||||
}
|
||||
} else { /* PD_PRINTSETUP */
|
||||
BOOL bPortrait = (lpdm->dmOrientation == DMORIENT_PORTRAIT);
|
||||
|
||||
|
@ -1761,8 +1840,8 @@ static LRESULT PRINTDLG_WMCommandA(HWND hDlg, WPARAM wParam,
|
|||
case cmb4: /* Printer combobox */
|
||||
if (HIWORD(wParam)==CBN_SELCHANGE) {
|
||||
char *PrinterName;
|
||||
INT index = SendDlgItemMessageW(hDlg, LOWORD(wParam), CB_GETCURSEL, 0, 0);
|
||||
INT length = SendDlgItemMessageW(hDlg, LOWORD(wParam), CB_GETLBTEXTLEN, index, 0);
|
||||
INT index = SendDlgItemMessageA(hDlg, LOWORD(wParam), CB_GETCURSEL, 0, 0);
|
||||
INT length = SendDlgItemMessageA(hDlg, LOWORD(wParam), CB_GETLBTEXTLEN, index, 0);
|
||||
PrinterName = malloc(length + 1);
|
||||
SendDlgItemMessageA(hDlg, LOWORD(wParam), CB_GETLBTEXT, index, (LPARAM)PrinterName);
|
||||
PRINTDLG_ChangePrinterA(hDlg, PrinterName, PrintStructures);
|
||||
|
@ -1909,7 +1988,10 @@ static LRESULT PRINTDLG_WMCommandW(HWND hDlg, WPARAM wParam,
|
|||
}
|
||||
break;
|
||||
|
||||
case cmb1: /* Printer Combobox in PRINT SETUP */
|
||||
case cmb1: /* Printer Combobox in PRINT SETUP, quality combobox in PRINT16 */
|
||||
if (PrinterComboID != LOWORD(wParam)) {
|
||||
break;
|
||||
}
|
||||
/* FALLTHROUGH */
|
||||
case cmb4: /* Printer combobox */
|
||||
if (HIWORD(wParam)==CBN_SELCHANGE) {
|
||||
|
|
|
@ -478,18 +478,22 @@ static LONG create_property_sheetW(struct propsheet *ps, PROPSHEETUI_INFO_HEADER
|
|||
(!header->titleW || !(header->flags & PSUIHDRF_EXACT_PTITLE)))
|
||||
{
|
||||
len = wcslen(title);
|
||||
if (len < ARRAY_SIZE(title))
|
||||
if (len < ARRAY_SIZE(title) - 1)
|
||||
{
|
||||
title[len++] = ' ';
|
||||
LoadStringW(compstui_hmod, IDS_CPSUI_DEFAULT, title + len, ARRAY_SIZE(title) - len);
|
||||
LoadStringW(compstui_hmod, IDS_CPSUI_DEFAULT, title + len, ARRAY_SIZE(title) - len);
|
||||
}
|
||||
}
|
||||
|
||||
if ((header->flags & PSUIHDRF_PROPTITLE) &&
|
||||
(!header->titleW || !(header->flags & PSUIHDRF_EXACT_PTITLE)))
|
||||
{
|
||||
len = wcslen(title);
|
||||
if (len < ARRAY_SIZE(title))
|
||||
if (len < ARRAY_SIZE(title) - 1)
|
||||
{
|
||||
title[len++] = ' ';
|
||||
LoadStringW(compstui_hmod, IDS_CPSUI_PROPERTIES, title + len, ARRAY_SIZE(title) - len);
|
||||
LoadStringW(compstui_hmod, IDS_CPSUI_PROPERTIES, title + len, ARRAY_SIZE(title) - len);
|
||||
}
|
||||
}
|
||||
|
||||
psh.nPages = ps->pages_cnt;
|
||||
|
|
|
@ -33,9 +33,9 @@
|
|||
@ cdecl -arch=arm ??0_NonReentrantPPLLock@details@Concurrency@@QAA@XZ(ptr) _NonReentrantPPLLock_ctor
|
||||
@ thiscall -arch=i386 ??0_NonReentrantPPLLock@details@Concurrency@@QAE@XZ(ptr) _NonReentrantPPLLock_ctor
|
||||
@ cdecl -arch=win64 ??0_NonReentrantPPLLock@details@Concurrency@@QEAA@XZ(ptr) _NonReentrantPPLLock_ctor
|
||||
@ stub -arch=arm ??0_ReaderWriterLock@details@Concurrency@@QAA@XZ
|
||||
@ stub -arch=i386 ??0_ReaderWriterLock@details@Concurrency@@QAE@XZ
|
||||
@ stub -arch=win64 ??0_ReaderWriterLock@details@Concurrency@@QEAA@XZ
|
||||
@ cdecl -arch=arm ??0_ReaderWriterLock@details@Concurrency@@QAA@XZ(ptr) _ReaderWriterLock_ctor
|
||||
@ thiscall -arch=i386 ??0_ReaderWriterLock@details@Concurrency@@QAE@XZ(ptr) _ReaderWriterLock_ctor
|
||||
@ cdecl -arch=win64 ??0_ReaderWriterLock@details@Concurrency@@QEAA@XZ(ptr) _ReaderWriterLock_ctor
|
||||
@ cdecl -arch=arm ??0_ReentrantBlockingLock@details@Concurrency@@QAA@XZ(ptr) _ReentrantBlockingLock_ctor
|
||||
@ thiscall -arch=i386 ??0_ReentrantBlockingLock@details@Concurrency@@QAE@XZ(ptr) _ReentrantBlockingLock_ctor
|
||||
@ cdecl -arch=win64 ??0_ReentrantBlockingLock@details@Concurrency@@QEAA@XZ(ptr) _ReentrantBlockingLock_ctor
|
||||
|
@ -450,9 +450,9 @@
|
|||
@ stub -arch=win64 ?_ConcRT_CoreAssert@details@Concurrency@@YAXPEBD0H@Z
|
||||
@ stub -arch=win32 ?_ConcRT_Trace@details@Concurrency@@YAXHPB_WZZ
|
||||
@ stub -arch=win64 ?_ConcRT_Trace@details@Concurrency@@YAXHPEB_WZZ
|
||||
@ stub -arch=arm ?_Confirm_cancel@_Cancellation_beacon@details@Concurrency@@QAA_NXZ
|
||||
@ stub -arch=i386 ?_Confirm_cancel@_Cancellation_beacon@details@Concurrency@@QAE_NXZ
|
||||
@ stub -arch=win64 ?_Confirm_cancel@_Cancellation_beacon@details@Concurrency@@QEAA_NXZ
|
||||
@ cdecl -arch=arm ?_Confirm_cancel@_Cancellation_beacon@details@Concurrency@@QAA_NXZ(ptr) _Cancellation_beacon__Confirm_cancel
|
||||
@ thiscall -arch=i386 ?_Confirm_cancel@_Cancellation_beacon@details@Concurrency@@QAE_NXZ(ptr) _Cancellation_beacon__Confirm_cancel
|
||||
@ cdecl -arch=win64 ?_Confirm_cancel@_Cancellation_beacon@details@Concurrency@@QEAA_NXZ(ptr) _Cancellation_beacon__Confirm_cancel
|
||||
@ cdecl ?_CurrentContext@_Context@details@Concurrency@@SA?AV123@XZ() _Context__CurrentContext
|
||||
@ stub ?_Current_node@location@Concurrency@@SA?AV12@XZ
|
||||
@ stub -arch=arm ?_Destroy@_AsyncTaskCollection@details@Concurrency@@EAAXXZ
|
||||
|
|
|
@ -268,7 +268,7 @@
|
|||
@ cdecl _scalb(double long)
|
||||
@ cdecl _searchenv(str str ptr)
|
||||
@ cdecl _seterrormode(long)
|
||||
@ cdecl -norelay _setjmp(ptr) MSVCRT__setjmp
|
||||
@ cdecl -norelay _setjmp(ptr)
|
||||
@ cdecl _setmode(long long)
|
||||
@ stub _setsystime(ptr long)
|
||||
@ cdecl _sleep(long)
|
||||
|
@ -434,7 +434,7 @@
|
|||
@ cdecl -arch=win64 localtime(ptr) _localtime64
|
||||
@ cdecl log(double)
|
||||
@ cdecl log10(double)
|
||||
@ cdecl longjmp(ptr long) MSVCRT_longjmp
|
||||
@ cdecl longjmp(ptr long)
|
||||
@ cdecl malloc(long)
|
||||
@ cdecl mblen(ptr long)
|
||||
@ cdecl mbstowcs(ptr str long)
|
||||
|
|
|
@ -111,8 +111,6 @@ static DWORD encodeBase64A(const BYTE *in_buf, int in_len, LPCSTR sep,
|
|||
i = 0;
|
||||
while (div > 0 && ptr < end)
|
||||
{
|
||||
if (i && i % 64 == 0)
|
||||
ptr += stradd(ptr, end, sep, strlen(sep));
|
||||
/* first char is the first 6 bits of the first byte*/
|
||||
chunk[0] = b64[ ( d[0] >> 2) & 0x3f ];
|
||||
/* second char is the last 2 bits of the first byte and the first 4
|
||||
|
@ -127,6 +125,9 @@ static DWORD encodeBase64A(const BYTE *in_buf, int in_len, LPCSTR sep,
|
|||
i += 4;
|
||||
d += 3;
|
||||
div--;
|
||||
|
||||
if (i && i % 64 == 0)
|
||||
ptr += stradd(ptr, end, sep, strlen(sep));
|
||||
}
|
||||
|
||||
switch(pad_bytes)
|
||||
|
@ -393,11 +394,6 @@ static LONG encodeBase64W(const BYTE *in_buf, int in_len, LPCWSTR sep,
|
|||
i = 0;
|
||||
while (div > 0)
|
||||
{
|
||||
if (i && i % 64 == 0)
|
||||
{
|
||||
lstrcpyW(ptr, sep);
|
||||
ptr += lstrlenW(sep);
|
||||
}
|
||||
/* first char is the first 6 bits of the first byte*/
|
||||
*ptr++ = b64[ ( d[0] >> 2) & 0x3f ];
|
||||
/* second char is the last 2 bits of the first byte and the first 4
|
||||
|
@ -411,6 +407,12 @@ static LONG encodeBase64W(const BYTE *in_buf, int in_len, LPCWSTR sep,
|
|||
i += 4;
|
||||
d += 3;
|
||||
div--;
|
||||
|
||||
if (i && i % 64 == 0)
|
||||
{
|
||||
lstrcpyW(ptr, sep);
|
||||
ptr += lstrlenW(sep);
|
||||
}
|
||||
}
|
||||
|
||||
switch(pad_bytes)
|
||||
|
|
|
@ -2778,32 +2778,37 @@ BOOL CNG_ImportPubKey(CERT_PUBLIC_KEY_INFO *pubKeyInfo, BCRYPT_KEY_HANDLE *key)
|
|||
static BOOL CNG_PrepareSignatureECC(BYTE *encoded_sig, DWORD encoded_size, BYTE **sig_value, DWORD *sig_len)
|
||||
{
|
||||
CERT_ECC_SIGNATURE *ecc_sig;
|
||||
DWORD size;
|
||||
DWORD size, r_size, s_size, r_offset, s_offset;
|
||||
int i;
|
||||
|
||||
if (!CryptDecodeObjectEx(X509_ASN_ENCODING, X509_ECC_SIGNATURE, encoded_sig, encoded_size,
|
||||
CRYPT_DECODE_ALLOC_FLAG, NULL, &ecc_sig, &size))
|
||||
return FALSE;
|
||||
|
||||
if (!ecc_sig->r.cbData || !ecc_sig->s.cbData)
|
||||
if (!(r_size = ecc_sig->r.cbData) || !(s_size = ecc_sig->s.cbData))
|
||||
{
|
||||
LocalFree(ecc_sig);
|
||||
SetLastError(ERROR_INVALID_DATA);
|
||||
return FALSE;
|
||||
}
|
||||
r_size = s_size = max( r_size, s_size );
|
||||
|
||||
*sig_len = ecc_sig->r.cbData + ecc_sig->s.cbData;
|
||||
*sig_len = r_size + s_size;
|
||||
if (!(*sig_value = CryptMemAlloc(*sig_len)))
|
||||
{
|
||||
LocalFree(ecc_sig);
|
||||
SetLastError(ERROR_OUTOFMEMORY);
|
||||
return FALSE;
|
||||
}
|
||||
memset( *sig_value, 0, *sig_len );
|
||||
|
||||
r_offset = r_size - ecc_sig->r.cbData;
|
||||
s_offset = s_size - ecc_sig->s.cbData;
|
||||
|
||||
for (i = 0; i < ecc_sig->r.cbData; i++)
|
||||
(*sig_value)[i] = ecc_sig->r.pbData[ecc_sig->r.cbData - i - 1];
|
||||
(*sig_value)[i + r_offset] = ecc_sig->r.pbData[ecc_sig->r.cbData - i - 1];
|
||||
for (i = 0; i < ecc_sig->s.cbData; i++)
|
||||
(*sig_value)[ecc_sig->r.cbData + i] = ecc_sig->s.pbData[ecc_sig->s.cbData - i - 1];
|
||||
(*sig_value)[r_size + i + s_offset] = ecc_sig->s.pbData[ecc_sig->s.cbData - i - 1];
|
||||
|
||||
LocalFree(ecc_sig);
|
||||
return TRUE;
|
||||
|
|
|
@ -478,7 +478,7 @@ WINECRYPT_CERTSTORE *CRYPT_CollectionOpenStore(HCRYPTPROV hCryptProv,
|
|||
{
|
||||
memset(store, 0, sizeof(WINE_COLLECTIONSTORE));
|
||||
CRYPT_InitStore(&store->hdr, dwFlags, StoreTypeCollection, &CollectionStoreVtbl);
|
||||
InitializeCriticalSection(&store->cs);
|
||||
InitializeCriticalSectionEx(&store->cs, 0, RTL_CRITICAL_SECTION_FLAG_FORCE_DEBUG_INFO);
|
||||
store->cs.DebugInfo->Spare[0] = (DWORD_PTR)(__FILE__ ": PWINE_COLLECTIONSTORE->cs");
|
||||
list_init(&store->stores);
|
||||
}
|
||||
|
|
|
@ -125,7 +125,7 @@ HCRYPTOIDFUNCSET WINAPI CryptInitOIDFunctionSet(LPCSTR pszFuncName,
|
|||
ret->name = CryptMemAlloc(strlen(pszFuncName) + 1);
|
||||
if (ret->name)
|
||||
{
|
||||
InitializeCriticalSection(&ret->cs);
|
||||
InitializeCriticalSectionEx(&ret->cs, 0, RTL_CRITICAL_SECTION_FLAG_FORCE_DEBUG_INFO);
|
||||
ret->cs.DebugInfo->Spare[0] = (DWORD_PTR)(__FILE__ ": OIDFunctionSet.cs");
|
||||
list_init(&ret->functions);
|
||||
strcpy(ret->name, pszFuncName);
|
||||
|
|
|
@ -46,7 +46,7 @@ CONTEXT_PROPERTY_LIST *ContextPropertyList_Create(void)
|
|||
|
||||
if (list)
|
||||
{
|
||||
InitializeCriticalSection(&list->cs);
|
||||
InitializeCriticalSectionEx(&list->cs, 0, RTL_CRITICAL_SECTION_FLAG_FORCE_DEBUG_INFO);
|
||||
list->cs.DebugInfo->Spare[0] = (DWORD_PTR)(__FILE__ ": PCONTEXT_PROPERTY_LIST->cs");
|
||||
list_init(&list->properties);
|
||||
}
|
||||
|
|
|
@ -545,7 +545,7 @@ WINECRYPT_CERTSTORE *CRYPT_RegOpenStore(HCRYPTPROV hCryptProv, DWORD dwFlags,
|
|||
regInfo->dwOpenFlags = dwFlags;
|
||||
regInfo->memStore = memStore;
|
||||
regInfo->key = key;
|
||||
InitializeCriticalSection(®Info->cs);
|
||||
InitializeCriticalSectionEx(®Info->cs, 0, RTL_CRITICAL_SECTION_FLAG_FORCE_DEBUG_INFO);
|
||||
regInfo->cs.DebugInfo->Spare[0] = (DWORD_PTR)(__FILE__ ": PWINE_REGSTOREINFO->cs");
|
||||
list_init(®Info->certsToDelete);
|
||||
list_init(®Info->crlsToDelete);
|
||||
|
|
|
@ -388,7 +388,7 @@ static WINECRYPT_CERTSTORE *CRYPT_MemOpenStore(HCRYPTPROV hCryptProv,
|
|||
{
|
||||
memset(store, 0, sizeof(WINE_MEMSTORE));
|
||||
CRYPT_InitStore(&store->hdr, dwFlags, StoreTypeMem, &MemStoreVtbl);
|
||||
InitializeCriticalSection(&store->cs);
|
||||
InitializeCriticalSectionEx(&store->cs, 0, RTL_CRITICAL_SECTION_FLAG_FORCE_DEBUG_INFO);
|
||||
store->cs.DebugInfo->Spare[0] = (DWORD_PTR)(__FILE__ ": ContextList.cs");
|
||||
list_init(&store->certs);
|
||||
list_init(&store->crls);
|
||||
|
|
|
@ -57,6 +57,8 @@ static const BYTE toEncode4[] =
|
|||
static const BYTE toEncode5[] =
|
||||
"abcdefghijlkmnopqrstuvwxyz01234567890ABCDEFGHI";
|
||||
|
||||
static const BYTE toEncode6[] = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";
|
||||
|
||||
static const struct BinTests tests[] = {
|
||||
{ toEncode1, sizeof(toEncode1), "AA==\r\n", },
|
||||
{ toEncode2, sizeof(toEncode2), "AQI=\r\n", },
|
||||
|
@ -69,6 +71,9 @@ static const struct BinTests tests[] = {
|
|||
"SElKS0xNTk9QUVJTVFVWV1hZWjAxMjM0NTY3ODkwAA==\r\n" },
|
||||
{ toEncode5, sizeof(toEncode5),
|
||||
"YWJjZGVmZ2hpamxrbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5MEFCQ0RFRkdISQA=\r\n" },
|
||||
{ toEncode6, sizeof(toEncode6),
|
||||
"YWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFh\r\n"
|
||||
"YQA=\r\n" },
|
||||
};
|
||||
|
||||
static const struct BinTests testsNoCR[] = {
|
||||
|
@ -83,6 +88,9 @@ static const struct BinTests testsNoCR[] = {
|
|||
"SElKS0xNTk9QUVJTVFVWV1hZWjAxMjM0NTY3ODkwAA==\n" },
|
||||
{ toEncode5, sizeof(toEncode5),
|
||||
"YWJjZGVmZ2hpamxrbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5MEFCQ0RFRkdISQA=\n" },
|
||||
{ toEncode6, sizeof(toEncode6),
|
||||
"YWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFh\n"
|
||||
"YQA=\n" },
|
||||
};
|
||||
|
||||
static WCHAR *strdupAtoW(const char *str)
|
||||
|
|
|
@ -355,7 +355,7 @@ static HRESULT async_info_create( IUnknown *invoker, IUnknown *param, async_oper
|
|||
if ((impl->invoker = invoker)) IUnknown_AddRef( impl->invoker );
|
||||
if ((impl->param = param)) IUnknown_AddRef( impl->param );
|
||||
|
||||
InitializeCriticalSection( &impl->cs );
|
||||
InitializeCriticalSectionEx( &impl->cs, 0, RTL_CRITICAL_SECTION_FLAG_FORCE_DEBUG_INFO );
|
||||
impl->cs.DebugInfo->Spare[0] = (DWORD_PTR)( __FILE__ ": async_info.cs" );
|
||||
|
||||
*out = &impl->IWineAsyncInfoImpl_iface;
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
MODULE = d2d1.dll
|
||||
IMPORTLIB = d2d1
|
||||
IMPORTS = d3d10_1 dxguid uuid gdi32 user32 advapi32
|
||||
IMPORTS = d3d10_1 dxguid uuid gdi32 user32 advapi32 d3dcompiler
|
||||
DELAYIMPORTS = dwrite xmllite ole32
|
||||
|
||||
SOURCES = \
|
||||
|
|
|
@ -674,8 +674,6 @@ struct d2d_effect_registration
|
|||
BOOL builtin;
|
||||
CLSID id;
|
||||
|
||||
UINT32 input_count;
|
||||
UINT32 default_input_count;
|
||||
struct d2d_effect_properties properties;
|
||||
};
|
||||
|
||||
|
@ -707,6 +705,8 @@ struct d2d_effect_registration * d2d_factory_get_registered_effect(ID2D1Factory
|
|||
const GUID *effect_id);
|
||||
void d2d_factory_register_effect(struct d2d_factory *factory,
|
||||
struct d2d_effect_registration *effect);
|
||||
HRESULT d2d_effect_property_get_uint32_value(const struct d2d_effect_properties *properties,
|
||||
const struct d2d_effect_property *prop, UINT32 *value);
|
||||
|
||||
struct d2d_transform_graph
|
||||
{
|
||||
|
@ -738,6 +738,9 @@ HRESULT d2d_effect_subproperties_add(struct d2d_effect_properties *props, const
|
|||
struct d2d_effect_property * d2d_effect_properties_get_property_by_name(
|
||||
const struct d2d_effect_properties *properties, const WCHAR *name);
|
||||
void d2d_effect_properties_cleanup(struct d2d_effect_properties *props);
|
||||
HRESULT d2d_factory_register_builtin_effect(struct d2d_factory *factory, REFCLSID effect_id,
|
||||
const WCHAR *property_xml, const D2D1_PROPERTY_BINDING *bindings, UINT32 binding_count,
|
||||
PD2D1_EFFECT_FACTORY effect_factory);
|
||||
|
||||
enum d2d_command_list_state
|
||||
{
|
||||
|
|
1414
dlls/d2d1/device.c
1414
dlls/d2d1/device.c
File diff suppressed because it is too large
Load diff
|
@ -189,7 +189,7 @@ static HRESULT STDMETHODCALLTYPE d2d_effect_impl_PrepareForRender(ID2D1EffectImp
|
|||
|
||||
static HRESULT STDMETHODCALLTYPE d2d_effect_impl_SetGraph(ID2D1EffectImpl *iface, ID2D1TransformGraph *graph)
|
||||
{
|
||||
return E_NOTIMPL;
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
static const ID2D1EffectImplVtbl d2d_effect_impl_vtbl =
|
||||
|
@ -211,48 +211,105 @@ static HRESULT STDMETHODCALLTYPE builtin_factory_stub(IUnknown **effect_impl)
|
|||
return S_OK;
|
||||
}
|
||||
|
||||
struct d2d_effect_info
|
||||
{
|
||||
const CLSID *clsid;
|
||||
UINT32 default_input_count;
|
||||
UINT32 min_inputs;
|
||||
UINT32 max_inputs;
|
||||
};
|
||||
static const WCHAR _2d_affine_transform_description[] =
|
||||
L"<?xml version='1.0'?> \
|
||||
<Effect> \
|
||||
<Property name='DisplayName' type='string' value='2D Affine Transform'/> \
|
||||
<Property name='Author' type='string' value='The Wine Project'/> \
|
||||
<Property name='Category' type='string' value='Stub'/> \
|
||||
<Property name='Description' type='string' value='2D Affine Transform'/> \
|
||||
<Inputs> \
|
||||
<Input name='Source'/> \
|
||||
</Inputs> \
|
||||
</Effect>";
|
||||
|
||||
static const struct d2d_effect_info builtin_effects[] =
|
||||
{
|
||||
{&CLSID_D2D12DAffineTransform, 1, 1, 1},
|
||||
{&CLSID_D2D13DPerspectiveTransform, 1, 1, 1},
|
||||
{&CLSID_D2D1Composite, 2, 1, 0xffffffff},
|
||||
{&CLSID_D2D1Crop, 1, 1, 1},
|
||||
{&CLSID_D2D1Shadow, 1, 1, 1},
|
||||
{&CLSID_D2D1Grayscale, 1, 1, 1},
|
||||
};
|
||||
static const WCHAR _3d_perspective_transform_description[] =
|
||||
L"<?xml version='1.0'?> \
|
||||
<Effect> \
|
||||
<Property name='DisplayName' type='string' value='3D Perspective Transform'/> \
|
||||
<Property name='Author' type='string' value='The Wine Project'/> \
|
||||
<Property name='Category' type='string' value='Stub'/> \
|
||||
<Property name='Description' type='string' value='3D Perspective Transform'/> \
|
||||
<Inputs> \
|
||||
<Input name='Source'/> \
|
||||
</Inputs> \
|
||||
</Effect>";
|
||||
|
||||
static const WCHAR composite_description[] =
|
||||
L"<?xml version='1.0'?> \
|
||||
<Effect> \
|
||||
<Property name='DisplayName' type='string' value='Composite'/> \
|
||||
<Property name='Author' type='string' value='The Wine Project'/> \
|
||||
<Property name='Category' type='string' value='Stub'/> \
|
||||
<Property name='Description' type='string' value='Composite'/> \
|
||||
<Inputs minimum='1' maximum='0xffffffff' > \
|
||||
<Input name='Source1'/> \
|
||||
<Input name='Source2'/> \
|
||||
</Inputs> \
|
||||
</Effect>";
|
||||
|
||||
static const WCHAR crop_description[] =
|
||||
L"<?xml version='1.0'?> \
|
||||
<Effect> \
|
||||
<Property name='DisplayName' type='string' value='Crop'/> \
|
||||
<Property name='Author' type='string' value='The Wine Project'/> \
|
||||
<Property name='Category' type='string' value='Stub'/> \
|
||||
<Property name='Description' type='string' value='Crop'/> \
|
||||
<Inputs > \
|
||||
<Input name='Source'/> \
|
||||
</Inputs> \
|
||||
</Effect>";
|
||||
|
||||
static const WCHAR shadow_description[] =
|
||||
L"<?xml version='1.0'?> \
|
||||
<Effect> \
|
||||
<Property name='DisplayName' type='string' value='Shadow'/> \
|
||||
<Property name='Author' type='string' value='The Wine Project'/> \
|
||||
<Property name='Category' type='string' value='Stub'/> \
|
||||
<Property name='Description' type='string' value='Shadow'/> \
|
||||
<Inputs > \
|
||||
<Input name='Source'/> \
|
||||
</Inputs> \
|
||||
</Effect>";
|
||||
|
||||
static const WCHAR grayscale_description[] =
|
||||
L"<?xml version='1.0'?> \
|
||||
<Effect> \
|
||||
<Property name='DisplayName' type='string' value='Grayscale'/> \
|
||||
<Property name='Author' type='string' value='The Wine Project'/> \
|
||||
<Property name='Category' type='string' value='Stub'/> \
|
||||
<Property name='Description' type='string' value='Grayscale'/> \
|
||||
<Inputs > \
|
||||
<Input name='Source'/> \
|
||||
</Inputs> \
|
||||
</Effect>";
|
||||
|
||||
void d2d_effects_init_builtins(struct d2d_factory *factory)
|
||||
{
|
||||
struct d2d_effect_registration *effect;
|
||||
static const struct builtin_description
|
||||
{
|
||||
const CLSID *clsid;
|
||||
const WCHAR *description;
|
||||
}
|
||||
builtin_effects[] =
|
||||
{
|
||||
{ &CLSID_D2D12DAffineTransform, _2d_affine_transform_description },
|
||||
{ &CLSID_D2D13DPerspectiveTransform, _3d_perspective_transform_description},
|
||||
{ &CLSID_D2D1Composite, composite_description },
|
||||
{ &CLSID_D2D1Crop, crop_description },
|
||||
{ &CLSID_D2D1Shadow, shadow_description },
|
||||
{ &CLSID_D2D1Grayscale, grayscale_description },
|
||||
};
|
||||
unsigned int i;
|
||||
HRESULT hr;
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(builtin_effects); ++i)
|
||||
{
|
||||
const struct d2d_effect_info *info = &builtin_effects[i];
|
||||
WCHAR max_inputs[32];
|
||||
|
||||
if (!(effect = calloc(1, sizeof(*effect))))
|
||||
return;
|
||||
|
||||
swprintf(max_inputs, ARRAY_SIZE(max_inputs), L"%lu", info->max_inputs);
|
||||
d2d_effect_properties_add(&effect->properties, L"MinInputs", D2D1_PROPERTY_MIN_INPUTS,
|
||||
D2D1_PROPERTY_TYPE_UINT32, L"1");
|
||||
d2d_effect_properties_add(&effect->properties, L"MaxInputs", D2D1_PROPERTY_MAX_INPUTS,
|
||||
D2D1_PROPERTY_TYPE_UINT32, max_inputs);
|
||||
|
||||
memcpy(&effect->id, info->clsid, sizeof(*info->clsid));
|
||||
effect->default_input_count = info->default_input_count;
|
||||
effect->factory = builtin_factory_stub;
|
||||
effect->builtin = TRUE;
|
||||
d2d_factory_register_effect(factory, effect);
|
||||
if (FAILED(hr = d2d_factory_register_builtin_effect(factory, builtin_effects[i].clsid, builtin_effects[i].description,
|
||||
NULL, 0, builtin_factory_stub)))
|
||||
{
|
||||
WARN("Failed to register the effect %s, hr %#lx.\n", wine_dbgstr_guid(builtin_effects[i].clsid), hr);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -304,25 +361,25 @@ static HRESULT d2d_effect_properties_internal_add(struct d2d_effect_properties *
|
|||
{
|
||||
static const UINT32 sizes[] =
|
||||
{
|
||||
0, /* D2D1_PROPERTY_TYPE_UNKNOWN */
|
||||
0, /* D2D1_PROPERTY_TYPE_STRING */
|
||||
sizeof(BOOL), /* D2D1_PROPERTY_TYPE_BOOL */
|
||||
sizeof(UINT32), /* D2D1_PROPERTY_TYPE_UINT32 */
|
||||
sizeof(INT32), /* D2D1_PROPERTY_TYPE_INT32 */
|
||||
sizeof(float), /* D2D1_PROPERTY_TYPE_FLOAT */
|
||||
2 * sizeof(float), /* D2D1_PROPERTY_TYPE_VECTOR2 */
|
||||
3 * sizeof(float), /* D2D1_PROPERTY_TYPE_VECTOR3 */
|
||||
4 * sizeof(float), /* D2D1_PROPERTY_TYPE_VECTOR4 */
|
||||
0, /* FIXME: D2D1_PROPERTY_TYPE_BLOB */
|
||||
sizeof(void *), /* D2D1_PROPERTY_TYPE_IUNKNOWN */
|
||||
sizeof(UINT32), /* D2D1_PROPERTY_TYPE_ENUM */
|
||||
sizeof(UINT32), /* D2D1_PROPERTY_TYPE_ARRAY */
|
||||
sizeof(CLSID), /* D2D1_PROPERTY_TYPE_CLSID */
|
||||
6 * sizeof(float), /* D2D1_PROPERTY_TYPE_MATRIX_3X2 */
|
||||
12 * sizeof(float), /* D2D1_PROPERTY_TYPE_MATRIX_4X3 */
|
||||
16 * sizeof(float), /* D2D1_PROPERTY_TYPE_MATRIX_4X4 */
|
||||
20 * sizeof(float), /* D2D1_PROPERTY_TYPE_MATRIX_5X4 */
|
||||
sizeof(void *), /* D2D1_PROPERTY_TYPE_COLOR_CONTEXT */
|
||||
[D2D1_PROPERTY_TYPE_UNKNOWN] = 0,
|
||||
[D2D1_PROPERTY_TYPE_STRING] = 0,
|
||||
[D2D1_PROPERTY_TYPE_BOOL] = sizeof(BOOL),
|
||||
[D2D1_PROPERTY_TYPE_UINT32] = sizeof(UINT32),
|
||||
[D2D1_PROPERTY_TYPE_INT32] = sizeof(INT32),
|
||||
[D2D1_PROPERTY_TYPE_FLOAT] = sizeof(float),
|
||||
[D2D1_PROPERTY_TYPE_VECTOR2] = sizeof(D2D_VECTOR_2F),
|
||||
[D2D1_PROPERTY_TYPE_VECTOR3] = sizeof(D2D_VECTOR_3F),
|
||||
[D2D1_PROPERTY_TYPE_VECTOR4] = sizeof(D2D_VECTOR_4F),
|
||||
[D2D1_PROPERTY_TYPE_BLOB] = 0 /* FIXME */,
|
||||
[D2D1_PROPERTY_TYPE_IUNKNOWN] = sizeof(IUnknown *),
|
||||
[D2D1_PROPERTY_TYPE_ENUM] = sizeof(UINT32),
|
||||
[D2D1_PROPERTY_TYPE_ARRAY] = sizeof(UINT32),
|
||||
[D2D1_PROPERTY_TYPE_CLSID] = sizeof(CLSID),
|
||||
[D2D1_PROPERTY_TYPE_MATRIX_3X2] = sizeof(D2D_MATRIX_3X2_F),
|
||||
[D2D1_PROPERTY_TYPE_MATRIX_4X3] = sizeof(D2D_MATRIX_4X3_F),
|
||||
[D2D1_PROPERTY_TYPE_MATRIX_4X4] = sizeof(D2D_MATRIX_4X4_F),
|
||||
[D2D1_PROPERTY_TYPE_MATRIX_5X4] = sizeof(D2D_MATRIX_5X4_F),
|
||||
[D2D1_PROPERTY_TYPE_COLOR_CONTEXT] = sizeof(ID2D1ColorContext *),
|
||||
};
|
||||
struct d2d_effect_property *p;
|
||||
HRESULT hr;
|
||||
|
@ -387,6 +444,9 @@ static HRESULT d2d_effect_properties_internal_add(struct d2d_effect_properties *
|
|||
{
|
||||
case D2D1_PROPERTY_TYPE_UINT32:
|
||||
case D2D1_PROPERTY_TYPE_INT32:
|
||||
_uint32 = wcstoul(value, NULL, 0);
|
||||
src = &_uint32;
|
||||
break;
|
||||
case D2D1_PROPERTY_TYPE_ENUM:
|
||||
_uint32 = wcstoul(value, NULL, 10);
|
||||
src = &_uint32;
|
||||
|
@ -570,6 +630,13 @@ static HRESULT d2d_effect_property_get_value(const struct d2d_effect_properties
|
|||
return S_OK;
|
||||
}
|
||||
|
||||
HRESULT d2d_effect_property_get_uint32_value(const struct d2d_effect_properties *properties,
|
||||
const struct d2d_effect_property *prop, UINT32 *value)
|
||||
{
|
||||
return d2d_effect_property_get_value(properties, prop, D2D1_PROPERTY_TYPE_UINT32,
|
||||
(BYTE *)value, sizeof(*value));
|
||||
}
|
||||
|
||||
static HRESULT d2d_effect_property_set_value(struct d2d_effect_properties *properties,
|
||||
struct d2d_effect_property *prop, D2D1_PROPERTY_TYPE type, const BYTE *value, UINT32 size)
|
||||
{
|
||||
|
@ -746,7 +813,7 @@ static HRESULT STDMETHODCALLTYPE d2d_effect_context_LoadPixelShader(ID2D1EffectC
|
|||
TRACE("iface %p, shader_id %s, buffer %p, buffer_size %u.\n",
|
||||
iface, debugstr_guid(shader_id), buffer, buffer_size);
|
||||
|
||||
if (ID2D1EffectContext_IsShaderLoaded(iface, shader_id))
|
||||
if (d2d_device_is_shader_loaded(effect_context->device_context->device, shader_id))
|
||||
return S_OK;
|
||||
|
||||
if (FAILED(hr = ID3D11Device1_CreatePixelShader(effect_context->device_context->d3d_device,
|
||||
|
@ -772,7 +839,7 @@ static HRESULT STDMETHODCALLTYPE d2d_effect_context_LoadVertexShader(ID2D1Effect
|
|||
TRACE("iface %p, shader_id %s, buffer %p, buffer_size %u.\n",
|
||||
iface, debugstr_guid(shader_id), buffer, buffer_size);
|
||||
|
||||
if (ID2D1EffectContext_IsShaderLoaded(iface, shader_id))
|
||||
if (d2d_device_is_shader_loaded(effect_context->device_context->device, shader_id))
|
||||
return S_OK;
|
||||
|
||||
if (FAILED(hr = ID3D11Device1_CreateVertexShader(effect_context->device_context->d3d_device,
|
||||
|
@ -798,7 +865,7 @@ static HRESULT STDMETHODCALLTYPE d2d_effect_context_LoadComputeShader(ID2D1Effec
|
|||
TRACE("iface %p, shader_id %s, buffer %p, buffer_size %u.\n",
|
||||
iface, debugstr_guid(shader_id), buffer, buffer_size);
|
||||
|
||||
if (ID2D1EffectContext_IsShaderLoaded(iface, shader_id))
|
||||
if (d2d_device_is_shader_loaded(effect_context->device_context->device, shader_id))
|
||||
return S_OK;
|
||||
|
||||
if (FAILED(hr = ID3D11Device1_CreateComputeShader(effect_context->device_context->d3d_device,
|
||||
|
@ -978,7 +1045,8 @@ static void d2d_effect_cleanup(struct d2d_effect *effect)
|
|||
}
|
||||
free(effect->inputs);
|
||||
ID2D1EffectContext_Release(&effect->effect_context->ID2D1EffectContext_iface);
|
||||
ID2D1TransformGraph_Release(&effect->graph->ID2D1TransformGraph_iface);
|
||||
if (effect->graph)
|
||||
ID2D1TransformGraph_Release(&effect->graph->ID2D1TransformGraph_iface);
|
||||
d2d_effect_properties_cleanup(&effect->properties);
|
||||
if (effect->impl)
|
||||
ID2D1EffectImpl_Release(effect->impl);
|
||||
|
@ -1120,6 +1188,12 @@ static HRESULT STDMETHODCALLTYPE d2d_effect_GetValueByName(ID2D1Effect *iface, c
|
|||
value, value_size);
|
||||
}
|
||||
|
||||
static HRESULT d2d_effect_get_value(struct d2d_effect *effect, UINT32 index, D2D1_PROPERTY_TYPE type,
|
||||
BYTE *value, UINT32 value_size)
|
||||
{
|
||||
return ID2D1Properties_GetValue(&effect->properties.ID2D1Properties_iface, index, type, value, value_size);
|
||||
}
|
||||
|
||||
static HRESULT STDMETHODCALLTYPE d2d_effect_GetValue(ID2D1Effect *iface, UINT32 index, D2D1_PROPERTY_TYPE type,
|
||||
BYTE *value, UINT32 value_size)
|
||||
{
|
||||
|
@ -1127,8 +1201,7 @@ static HRESULT STDMETHODCALLTYPE d2d_effect_GetValue(ID2D1Effect *iface, UINT32
|
|||
|
||||
TRACE("iface %p, index %#x, type %u, value %p, value_size %u.\n", iface, index, type, value, value_size);
|
||||
|
||||
return ID2D1Properties_GetValue(&effect->properties.ID2D1Properties_iface, index, type,
|
||||
value, value_size);
|
||||
return d2d_effect_get_value(effect, index, type, value, value_size);
|
||||
}
|
||||
|
||||
static UINT32 STDMETHODCALLTYPE d2d_effect_GetValueSize(ID2D1Effect *iface, UINT32 index)
|
||||
|
@ -1165,20 +1238,12 @@ static void STDMETHODCALLTYPE d2d_effect_SetInput(ID2D1Effect *iface, UINT32 ind
|
|||
effect->inputs[index] = input;
|
||||
}
|
||||
|
||||
static HRESULT STDMETHODCALLTYPE d2d_effect_SetInputCount(ID2D1Effect *iface, UINT32 count)
|
||||
static HRESULT d2d_effect_set_input_count(struct d2d_effect *effect, UINT32 count)
|
||||
{
|
||||
struct d2d_effect *effect = impl_from_ID2D1Effect(iface);
|
||||
unsigned int i, min_inputs, max_inputs;
|
||||
bool initialized = effect->inputs != NULL;
|
||||
HRESULT hr = S_OK;
|
||||
unsigned int i;
|
||||
|
||||
TRACE("iface %p, count %u.\n", iface, count);
|
||||
|
||||
d2d_effect_GetValue(iface, D2D1_PROPERTY_MIN_INPUTS, D2D1_PROPERTY_TYPE_UINT32,
|
||||
(BYTE *)&min_inputs, sizeof(min_inputs));
|
||||
d2d_effect_GetValue(iface, D2D1_PROPERTY_MAX_INPUTS, D2D1_PROPERTY_TYPE_UINT32,
|
||||
(BYTE *)&max_inputs, sizeof(max_inputs));
|
||||
|
||||
if (count < min_inputs || count > max_inputs)
|
||||
return E_INVALIDARG;
|
||||
if (count == effect->input_count)
|
||||
return S_OK;
|
||||
|
||||
|
@ -1189,21 +1254,52 @@ static HRESULT STDMETHODCALLTYPE d2d_effect_SetInputCount(ID2D1Effect *iface, UI
|
|||
if (effect->inputs[i])
|
||||
ID2D1Image_Release(effect->inputs[i]);
|
||||
}
|
||||
effect->input_count = count;
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
if (!d2d_array_reserve((void **)&effect->inputs, &effect->inputs_size,
|
||||
count, sizeof(*effect->inputs)))
|
||||
else
|
||||
{
|
||||
ERR("Failed to resize inputs array.\n");
|
||||
return E_OUTOFMEMORY;
|
||||
}
|
||||
if (!d2d_array_reserve((void **)&effect->inputs, &effect->inputs_size,
|
||||
count, sizeof(*effect->inputs)))
|
||||
{
|
||||
ERR("Failed to resize inputs array.\n");
|
||||
return E_OUTOFMEMORY;
|
||||
}
|
||||
|
||||
memset(&effect->inputs[effect->input_count], 0, sizeof(*effect->inputs) * (count - effect->input_count));
|
||||
memset(&effect->inputs[effect->input_count], 0, sizeof(*effect->inputs) * (count - effect->input_count));
|
||||
}
|
||||
effect->input_count = count;
|
||||
|
||||
return S_OK;
|
||||
if (initialized)
|
||||
{
|
||||
ID2D1TransformGraph_Release(&effect->graph->ID2D1TransformGraph_iface);
|
||||
effect->graph = NULL;
|
||||
|
||||
if (!(effect->graph = calloc(1, sizeof(*effect->graph))))
|
||||
return E_OUTOFMEMORY;
|
||||
d2d_transform_graph_init(effect->graph);
|
||||
|
||||
if (FAILED(hr = ID2D1EffectImpl_SetGraph(effect->impl, &effect->graph->ID2D1TransformGraph_iface)))
|
||||
WARN("Failed to set a new transform graph, hr %#lx.\n", hr);
|
||||
}
|
||||
|
||||
return hr;
|
||||
}
|
||||
|
||||
static HRESULT STDMETHODCALLTYPE d2d_effect_SetInputCount(ID2D1Effect *iface, UINT32 count)
|
||||
{
|
||||
struct d2d_effect *effect = impl_from_ID2D1Effect(iface);
|
||||
unsigned int min_inputs, max_inputs;
|
||||
|
||||
TRACE("iface %p, count %u.\n", iface, count);
|
||||
|
||||
d2d_effect_get_value(effect, D2D1_PROPERTY_MIN_INPUTS, D2D1_PROPERTY_TYPE_UINT32,
|
||||
(BYTE *)&min_inputs, sizeof(min_inputs));
|
||||
d2d_effect_get_value(effect, D2D1_PROPERTY_MAX_INPUTS, D2D1_PROPERTY_TYPE_UINT32,
|
||||
(BYTE *)&max_inputs, sizeof(max_inputs));
|
||||
|
||||
if (count < min_inputs || count > max_inputs)
|
||||
return E_INVALIDARG;
|
||||
|
||||
return d2d_effect_set_input_count(effect, count);
|
||||
}
|
||||
|
||||
static void STDMETHODCALLTYPE d2d_effect_GetInput(ID2D1Effect *iface, UINT32 index, ID2D1Image **input)
|
||||
|
@ -1532,6 +1628,7 @@ HRESULT d2d_effect_create(struct d2d_device_context *context, const CLSID *effec
|
|||
const struct d2d_effect_registration *reg;
|
||||
struct d2d_transform_graph *graph;
|
||||
struct d2d_effect *object;
|
||||
UINT32 input_count;
|
||||
WCHAR clsidW[39];
|
||||
HRESULT hr;
|
||||
|
||||
|
@ -1574,7 +1671,9 @@ HRESULT d2d_effect_create(struct d2d_device_context *context, const CLSID *effec
|
|||
d2d_effect_properties_add(&object->properties, L"Precision", D2D1_PROPERTY_PRECISION, D2D1_PROPERTY_TYPE_ENUM, L"0");
|
||||
d2d_effect_init_properties_vtbls(object);
|
||||
|
||||
d2d_effect_SetInputCount(&object->ID2D1Effect_iface, reg->default_input_count);
|
||||
/* Sync instance input count with default input count from the description. */
|
||||
d2d_effect_get_value(object, D2D1_PROPERTY_INPUTS, D2D1_PROPERTY_TYPE_ARRAY, (BYTE *)&input_count, sizeof(input_count));
|
||||
d2d_effect_set_input_count(object, input_count);
|
||||
|
||||
if (FAILED(hr = reg->factory((IUnknown **)&object->impl)))
|
||||
{
|
||||
|
|
|
@ -69,7 +69,7 @@ struct d2d_effect_registration * d2d_factory_get_registered_effect(ID2D1Factory
|
|||
struct d2d_factory *factory = unsafe_impl_from_ID2D1Factory(iface);
|
||||
struct d2d_effect_registration *reg;
|
||||
|
||||
d2d_effects_init_builtins(factory);
|
||||
d2d_factory_init_builtin_effects(factory);
|
||||
|
||||
LIST_FOR_EACH_ENTRY(reg, &factory->effects, struct d2d_effect_registration, entry)
|
||||
{
|
||||
|
@ -677,25 +677,25 @@ static HRESULT parse_effect_get_property_type(IXmlReader *reader, D2D1_PROPERTY_
|
|||
{
|
||||
static const WCHAR *types[] =
|
||||
{
|
||||
L"", /* D2D1_PROPERTY_TYPE_UNKNOWN */
|
||||
L"string", /* D2D1_PROPERTY_TYPE_STRING */
|
||||
L"bool", /* D2D1_PROPERTY_TYPE_BOOL */
|
||||
L"uint32", /* D2D1_PROPERTY_TYPE_UINT32 */
|
||||
L"int32", /* D2D1_PROPERTY_TYPE_INT32 */
|
||||
L"float", /* D2D1_PROPERTY_TYPE_FLOAT */
|
||||
L"vector2", /* D2D1_PROPERTY_TYPE_VECTOR2 */
|
||||
L"vector3", /* D2D1_PROPERTY_TYPE_VECTOR3 */
|
||||
L"vector4", /* D2D1_PROPERTY_TYPE_VECTOR4 */
|
||||
L"blob", /* D2D1_PROPERTY_TYPE_BLOB */
|
||||
L"iunknown", /* D2D1_PROPERTY_TYPE_IUNKNOWN */
|
||||
L"enum", /* D2D1_PROPERTY_TYPE_ENUM */
|
||||
L"array", /* D2D1_PROPERTY_TYPE_ARRAY */
|
||||
L"clsid", /* D2D1_PROPERTY_TYPE_CLSID */
|
||||
L"matrix3x2", /* D2D1_PROPERTY_TYPE_MATRIX_3X2 */
|
||||
L"matrix4x3", /* D2D1_PROPERTY_TYPE_MATRIX_4X3 */
|
||||
L"matrix4x4", /* D2D1_PROPERTY_TYPE_MATRIX_4X4 */
|
||||
L"matrix5x4", /* D2D1_PROPERTY_TYPE_MATRIX_5X4 */
|
||||
L"colorcontext", /* D2D1_PROPERTY_TYPE_COLOR_CONTEXT */
|
||||
[D2D1_PROPERTY_TYPE_UNKNOWN] = L"",
|
||||
[D2D1_PROPERTY_TYPE_STRING] = L"string",
|
||||
[D2D1_PROPERTY_TYPE_BOOL] = L"bool",
|
||||
[D2D1_PROPERTY_TYPE_UINT32] = L"uint32",
|
||||
[D2D1_PROPERTY_TYPE_INT32] = L"int32",
|
||||
[D2D1_PROPERTY_TYPE_FLOAT] = L"float",
|
||||
[D2D1_PROPERTY_TYPE_VECTOR2] = L"vector2",
|
||||
[D2D1_PROPERTY_TYPE_VECTOR3] = L"vector3",
|
||||
[D2D1_PROPERTY_TYPE_VECTOR4] = L"vector4",
|
||||
[D2D1_PROPERTY_TYPE_BLOB] = L"blob",
|
||||
[D2D1_PROPERTY_TYPE_IUNKNOWN] = L"iunknown",
|
||||
[D2D1_PROPERTY_TYPE_ENUM] = L"enum",
|
||||
[D2D1_PROPERTY_TYPE_ARRAY] = L"array",
|
||||
[D2D1_PROPERTY_TYPE_CLSID] = L"clsid",
|
||||
[D2D1_PROPERTY_TYPE_MATRIX_3X2] = L"matrix3x2",
|
||||
[D2D1_PROPERTY_TYPE_MATRIX_4X3] = L"matrix4x3",
|
||||
[D2D1_PROPERTY_TYPE_MATRIX_4X4] = L"matrix4x4",
|
||||
[D2D1_PROPERTY_TYPE_MATRIX_5X4] = L"matrix5x4",
|
||||
[D2D1_PROPERTY_TYPE_COLOR_CONTEXT] = L"colorcontext",
|
||||
};
|
||||
unsigned int i;
|
||||
WCHAR *value;
|
||||
|
@ -788,12 +788,13 @@ static HRESULT parse_effect_property(IXmlReader *reader, struct d2d_effect_regis
|
|||
|
||||
static HRESULT parse_effect_inputs(IXmlReader *reader, struct d2d_effect_registration *effect)
|
||||
{
|
||||
struct d2d_effect_property *inputs, *min_inputs, *max_inputs;
|
||||
struct d2d_effect_properties *subproperties;
|
||||
UINT32 min_inputs_value, max_inputs_value;
|
||||
unsigned int depth, input_count = 0;
|
||||
struct d2d_effect_property *inputs;
|
||||
XmlNodeType node_type;
|
||||
WCHAR nameW[16];
|
||||
WCHAR *name;
|
||||
WCHAR *name, *value;
|
||||
WCHAR buffW[16];
|
||||
HRESULT hr;
|
||||
|
||||
if (FAILED(hr = d2d_effect_properties_add(&effect->properties, L"Inputs",
|
||||
|
@ -811,28 +812,92 @@ static HRESULT parse_effect_inputs(IXmlReader *reader, struct d2d_effect_registr
|
|||
d2d_effect_subproperties_add(subproperties, L"DisplayName", D2D1_SUBPROPERTY_DISPLAYNAME,
|
||||
D2D1_PROPERTY_TYPE_STRING, L"Inputs");
|
||||
|
||||
if (IXmlReader_IsEmptyElement(reader)) return S_OK;
|
||||
|
||||
while (parse_effect_get_next_xml_node(reader, XmlNodeType_None, L"Input", &depth) == S_OK)
|
||||
if (SUCCEEDED(parse_effect_get_attribute(reader, L"minimum", &value)))
|
||||
{
|
||||
if (FAILED(hr = IXmlReader_GetNodeType(reader, &node_type))) return hr;
|
||||
if (node_type == XmlNodeType_EndElement) continue;
|
||||
if (node_type != XmlNodeType_Element) return HRESULT_FROM_WIN32(ERROR_NOT_FOUND);
|
||||
|
||||
if (FAILED(hr = parse_effect_get_attribute(reader, L"name", &name))) return hr;
|
||||
|
||||
swprintf(nameW, ARRAY_SIZE(nameW), L"%lu", input_count);
|
||||
d2d_effect_subproperties_add(subproperties, nameW, input_count, D2D1_PROPERTY_TYPE_STRING, name);
|
||||
input_count++;
|
||||
|
||||
free(name);
|
||||
hr = d2d_effect_properties_add(&effect->properties, L"MinInputs", D2D1_PROPERTY_MIN_INPUTS,
|
||||
D2D1_PROPERTY_TYPE_UINT32, value);
|
||||
free(value);
|
||||
if (FAILED(hr)) return hr;
|
||||
}
|
||||
if (SUCCEEDED(parse_effect_get_attribute(reader, L"maximum", &value)))
|
||||
{
|
||||
hr = d2d_effect_properties_add(&effect->properties, L"MaxInputs", D2D1_PROPERTY_MAX_INPUTS,
|
||||
D2D1_PROPERTY_TYPE_UINT32, value);
|
||||
free(value);
|
||||
if (FAILED(hr)) return hr;
|
||||
}
|
||||
*(UINT32 *)(effect->properties.data.ptr + inputs->data.offset) = input_count;
|
||||
|
||||
if (FAILED(hr = IXmlReader_GetNodeType(reader, &node_type))) return hr;
|
||||
if (node_type != XmlNodeType_EndElement) return HRESULT_FROM_WIN32(ERROR_NOT_FOUND);
|
||||
min_inputs = d2d_effect_properties_get_property_by_name(&effect->properties, L"MinInputs");
|
||||
max_inputs = d2d_effect_properties_get_property_by_name(&effect->properties, L"MaxInputs");
|
||||
|
||||
return S_OK;
|
||||
if (!IXmlReader_IsEmptyElement(reader))
|
||||
{
|
||||
while (parse_effect_get_next_xml_node(reader, XmlNodeType_None, L"Input", &depth) == S_OK)
|
||||
{
|
||||
if (FAILED(hr = IXmlReader_GetNodeType(reader, &node_type))) return hr;
|
||||
if (node_type == XmlNodeType_EndElement) continue;
|
||||
if (node_type != XmlNodeType_Element) return HRESULT_FROM_WIN32(ERROR_NOT_FOUND);
|
||||
|
||||
if (FAILED(hr = parse_effect_get_attribute(reader, L"name", &name))) return hr;
|
||||
|
||||
swprintf(buffW, ARRAY_SIZE(buffW), L"%lu", input_count);
|
||||
d2d_effect_subproperties_add(subproperties, buffW, input_count, D2D1_PROPERTY_TYPE_STRING, name);
|
||||
input_count++;
|
||||
|
||||
free(name);
|
||||
}
|
||||
*(UINT32 *)(effect->properties.data.ptr + inputs->data.offset) = input_count;
|
||||
|
||||
if (FAILED(hr = IXmlReader_GetNodeType(reader, &node_type))) return hr;
|
||||
if (node_type != XmlNodeType_EndElement) return HRESULT_FROM_WIN32(ERROR_NOT_FOUND);
|
||||
}
|
||||
|
||||
if (min_inputs)
|
||||
d2d_effect_property_get_uint32_value(&effect->properties, min_inputs, &min_inputs_value);
|
||||
if (max_inputs)
|
||||
d2d_effect_property_get_uint32_value(&effect->properties, max_inputs, &max_inputs_value);
|
||||
|
||||
/* Validate the range */
|
||||
if (min_inputs && max_inputs)
|
||||
{
|
||||
if (min_inputs_value > max_inputs_value)
|
||||
{
|
||||
WARN("Invalid input count range %u - %u.\n", min_inputs_value, max_inputs_value);
|
||||
return E_INVALIDARG;
|
||||
}
|
||||
}
|
||||
|
||||
/* Validate actual input count with specified range. */
|
||||
if (min_inputs && min_inputs_value > input_count)
|
||||
{
|
||||
WARN("Too few inputs were declared, expected at least %u.\n", min_inputs_value);
|
||||
return E_INVALIDARG;
|
||||
}
|
||||
|
||||
if (max_inputs && max_inputs_value < input_count)
|
||||
{
|
||||
WARN("Too many inputs were declared, expected at most %u.\n", max_inputs_value);
|
||||
return E_INVALIDARG;
|
||||
}
|
||||
|
||||
/* Apply default value to a missing property. If both properties are missing, add them. */
|
||||
if (min_inputs != max_inputs)
|
||||
{
|
||||
swprintf(buffW, ARRAY_SIZE(buffW), L"%lu", min_inputs ? min_inputs_value : max_inputs_value);
|
||||
if (min_inputs)
|
||||
hr = d2d_effect_properties_add(&effect->properties, L"MaxInputs", D2D1_PROPERTY_MAX_INPUTS, D2D1_PROPERTY_TYPE_UINT32, buffW);
|
||||
else
|
||||
hr = d2d_effect_properties_add(&effect->properties, L"MinInputs", D2D1_PROPERTY_MIN_INPUTS, D2D1_PROPERTY_TYPE_UINT32, buffW);
|
||||
}
|
||||
else if (!min_inputs)
|
||||
{
|
||||
swprintf(buffW, ARRAY_SIZE(buffW), L"%lu", input_count);
|
||||
hr = d2d_effect_properties_add(&effect->properties, L"MinInputs", D2D1_PROPERTY_MIN_INPUTS, D2D1_PROPERTY_TYPE_UINT32, buffW);
|
||||
if (SUCCEEDED(hr))
|
||||
hr = d2d_effect_properties_add(&effect->properties, L"MaxInputs", D2D1_PROPERTY_MAX_INPUTS, D2D1_PROPERTY_TYPE_UINT32, buffW);
|
||||
}
|
||||
|
||||
return hr;
|
||||
}
|
||||
|
||||
static HRESULT parse_effect_xml(IXmlReader *reader, struct d2d_effect_registration *effect)
|
||||
|
@ -875,21 +940,15 @@ static HRESULT parse_effect_xml(IXmlReader *reader, struct d2d_effect_registrati
|
|||
return hr;
|
||||
}
|
||||
|
||||
static HRESULT STDMETHODCALLTYPE d2d_factory_RegisterEffectFromStream(ID2D1Factory3 *iface,
|
||||
static HRESULT d2d_factory_register_effect_from_stream(struct d2d_factory *factory,
|
||||
REFCLSID effect_id, IStream *property_xml, const D2D1_PROPERTY_BINDING *bindings,
|
||||
UINT32 binding_count, PD2D1_EFFECT_FACTORY effect_factory)
|
||||
UINT32 binding_count, PD2D1_EFFECT_FACTORY effect_factory, BOOL builtin)
|
||||
{
|
||||
struct d2d_factory *factory = impl_from_ID2D1Factory3(iface);
|
||||
struct d2d_effect_registration *effect;
|
||||
IXmlReader *reader;
|
||||
unsigned int i;
|
||||
HRESULT hr;
|
||||
|
||||
TRACE("iface %p, effect_id %s, property_xml %p, bindings %p, binding_count %u, effect_factory %p.\n",
|
||||
iface, debugstr_guid(effect_id), property_xml, bindings, binding_count, effect_factory);
|
||||
|
||||
d2d_factory_init_builtin_effects(factory);
|
||||
|
||||
LIST_FOR_EACH_ENTRY_REV(effect, &factory->effects, struct d2d_effect_registration, entry)
|
||||
{
|
||||
if (IsEqualGUID(effect_id, &effect->id))
|
||||
|
@ -914,6 +973,7 @@ static HRESULT STDMETHODCALLTYPE d2d_factory_RegisterEffectFromStream(ID2D1Facto
|
|||
IXmlReader_Release(reader);
|
||||
return E_OUTOFMEMORY;
|
||||
}
|
||||
effect->builtin = builtin;
|
||||
|
||||
hr = parse_effect_xml(reader, effect);
|
||||
IXmlReader_Release(reader);
|
||||
|
@ -955,28 +1015,35 @@ static HRESULT STDMETHODCALLTYPE d2d_factory_RegisterEffectFromStream(ID2D1Facto
|
|||
effect->registration_count = 1;
|
||||
effect->id = *effect_id;
|
||||
effect->factory = effect_factory;
|
||||
d2d_effect_properties_add(&effect->properties, L"MinInputs", D2D1_PROPERTY_MIN_INPUTS,
|
||||
D2D1_PROPERTY_TYPE_UINT32, L"1");
|
||||
d2d_effect_properties_add(&effect->properties, L"MaxInputs", D2D1_PROPERTY_MAX_INPUTS,
|
||||
D2D1_PROPERTY_TYPE_UINT32, L"1" /* FIXME */);
|
||||
effect->default_input_count = 1;
|
||||
d2d_factory_register_effect(factory, effect);
|
||||
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
static HRESULT STDMETHODCALLTYPE d2d_factory_RegisterEffectFromString(ID2D1Factory3 *iface,
|
||||
REFCLSID effect_id, const WCHAR *property_xml, const D2D1_PROPERTY_BINDING *bindings,
|
||||
static HRESULT STDMETHODCALLTYPE d2d_factory_RegisterEffectFromStream(ID2D1Factory3 *iface,
|
||||
REFCLSID effect_id, IStream *property_xml, const D2D1_PROPERTY_BINDING *bindings,
|
||||
UINT32 binding_count, PD2D1_EFFECT_FACTORY effect_factory)
|
||||
{
|
||||
struct d2d_factory *factory = impl_from_ID2D1Factory3(iface);
|
||||
|
||||
TRACE("iface %p, effect_id %s, property_xml %p, bindings %p, binding_count %u, effect_factory %p.\n",
|
||||
iface, debugstr_guid(effect_id), property_xml, bindings, binding_count, effect_factory);
|
||||
|
||||
d2d_factory_init_builtin_effects(factory);
|
||||
|
||||
return d2d_factory_register_effect_from_stream(factory, effect_id, property_xml, bindings,
|
||||
binding_count, effect_factory, FALSE);
|
||||
}
|
||||
|
||||
static HRESULT d2d_factory_register_effect_from_string(struct d2d_factory *factory,
|
||||
REFCLSID effect_id, const WCHAR *property_xml, const D2D1_PROPERTY_BINDING *bindings,
|
||||
UINT32 binding_count, PD2D1_EFFECT_FACTORY effect_factory, BOOL builtin)
|
||||
{
|
||||
static const LARGE_INTEGER zero;
|
||||
IStream *stream;
|
||||
ULONG size;
|
||||
HRESULT hr;
|
||||
|
||||
TRACE("iface %p, effect_id %s, property_xml %s, bindings %p, binding_count %u, effect_factory %p.\n",
|
||||
iface, debugstr_guid(effect_id), debugstr_w(property_xml), bindings, binding_count, effect_factory);
|
||||
|
||||
if (FAILED(hr = CreateStreamOnHGlobal(NULL, TRUE, &stream)))
|
||||
return hr;
|
||||
|
||||
|
@ -985,13 +1052,36 @@ static HRESULT STDMETHODCALLTYPE d2d_factory_RegisterEffectFromString(ID2D1Facto
|
|||
hr = IStream_Seek(stream, zero, SEEK_SET, NULL);
|
||||
|
||||
if (SUCCEEDED(hr))
|
||||
hr = ID2D1Factory3_RegisterEffectFromStream(iface, effect_id, stream, bindings,
|
||||
binding_count, effect_factory);
|
||||
hr = d2d_factory_register_effect_from_stream(factory, effect_id, stream, bindings,
|
||||
binding_count, effect_factory, builtin);
|
||||
|
||||
IStream_Release(stream);
|
||||
return hr;
|
||||
}
|
||||
|
||||
HRESULT d2d_factory_register_builtin_effect(struct d2d_factory *factory, REFCLSID effect_id,
|
||||
const WCHAR *property_xml, const D2D1_PROPERTY_BINDING *bindings, UINT32 binding_count,
|
||||
PD2D1_EFFECT_FACTORY effect_factory)
|
||||
{
|
||||
return d2d_factory_register_effect_from_string(factory, effect_id, property_xml, bindings,
|
||||
binding_count, effect_factory, TRUE);
|
||||
}
|
||||
|
||||
static HRESULT STDMETHODCALLTYPE d2d_factory_RegisterEffectFromString(ID2D1Factory3 *iface,
|
||||
REFCLSID effect_id, const WCHAR *property_xml, const D2D1_PROPERTY_BINDING *bindings,
|
||||
UINT32 binding_count, PD2D1_EFFECT_FACTORY effect_factory)
|
||||
{
|
||||
struct d2d_factory *factory = impl_from_ID2D1Factory3(iface);
|
||||
|
||||
TRACE("iface %p, effect_id %s, property_xml %s, bindings %p, binding_count %u, effect_factory %p.\n",
|
||||
iface, debugstr_guid(effect_id), debugstr_w(property_xml), bindings, binding_count, effect_factory);
|
||||
|
||||
d2d_factory_init_builtin_effects(factory);
|
||||
|
||||
return d2d_factory_register_effect_from_string(factory, effect_id, property_xml, bindings,
|
||||
binding_count, effect_factory, FALSE);
|
||||
}
|
||||
|
||||
static HRESULT STDMETHODCALLTYPE d2d_factory_UnregisterEffect(ID2D1Factory3 *iface, REFCLSID effect_id)
|
||||
{
|
||||
struct d2d_factory *factory = impl_from_ID2D1Factory3(iface);
|
||||
|
|
|
@ -16,10 +16,6 @@
|
|||
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
|
||||
*/
|
||||
|
||||
#if defined(__GNUC__) && !defined(__clang__)
|
||||
#pragma GCC optimize "O2,no-strict-aliasing,excess-precision=standard"
|
||||
#endif
|
||||
|
||||
#include "d2d1_private.h"
|
||||
#include <float.h>
|
||||
|
||||
|
@ -1539,7 +1535,7 @@ static BOOL d2d_cdt_triangulate(struct d2d_cdt *cdt, size_t start_vertex, size_t
|
|||
return TRUE;
|
||||
}
|
||||
|
||||
/* More than tree vertices, divide. */
|
||||
/* More than three vertices, divide. */
|
||||
cut = vertex_count / 2;
|
||||
if (!d2d_cdt_triangulate(cdt, start_vertex, cut, &left_outer, &left_inner))
|
||||
return FALSE;
|
||||
|
@ -2289,6 +2285,9 @@ static HRESULT d2d_path_geometry_triangulate(struct d2d_geometry *geometry)
|
|||
size_t vertex_count, i, j;
|
||||
struct d2d_cdt cdt = {0};
|
||||
D2D1_POINT_2F *vertices;
|
||||
#ifdef __i386__
|
||||
unsigned int control_word_x87, mask = 0;
|
||||
#endif
|
||||
|
||||
for (i = 0, vertex_count = 0; i < geometry->u.path.figure_count; ++i)
|
||||
{
|
||||
|
@ -2339,10 +2338,20 @@ static HRESULT d2d_path_geometry_triangulate(struct d2d_geometry *geometry)
|
|||
|
||||
cdt.free_edge = ~0u;
|
||||
cdt.vertices = vertices;
|
||||
|
||||
#ifdef __i386__
|
||||
control_word_x87 = _controlfp(0, 0);
|
||||
_controlfp(_PC_24, mask = _MCW_PC);
|
||||
#endif
|
||||
if (!d2d_cdt_triangulate(&cdt, 0, vertex_count, &left_edge, &right_edge))
|
||||
goto fail;
|
||||
if (!d2d_cdt_insert_segments(&cdt, geometry))
|
||||
goto fail;
|
||||
#ifdef __i386__
|
||||
_controlfp(control_word_x87, _MCW_PC);
|
||||
mask = 0;
|
||||
#endif
|
||||
|
||||
if (!d2d_cdt_generate_faces(&cdt, geometry))
|
||||
goto fail;
|
||||
|
||||
|
@ -2354,6 +2363,9 @@ fail:
|
|||
geometry->fill.vertex_count = 0;
|
||||
free(vertices);
|
||||
free(cdt.edges);
|
||||
#ifdef __i386__
|
||||
if (mask) _controlfp(control_word_x87, mask);
|
||||
#endif
|
||||
return E_FAIL;
|
||||
}
|
||||
|
||||
|
@ -3235,6 +3247,7 @@ done:
|
|||
if (FAILED(hr))
|
||||
{
|
||||
free(geometry->fill.bezier_vertices);
|
||||
geometry->fill.bezier_vertices = NULL;
|
||||
geometry->fill.bezier_vertex_count = 0;
|
||||
d2d_path_geometry_free_figures(geometry);
|
||||
geometry->u.path.state = D2D_GEOMETRY_STATE_ERROR;
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
TESTDLL = d2d1.dll
|
||||
IMPORTS = d2d1 d3d10_1 d3d11 dwrite dxguid uuid user32 advapi32 ole32 gdi32
|
||||
IMPORTS = d2d1 d3d10_1 d3d11 dwrite dxguid uuid user32 advapi32 ole32 gdi32 d3dcompiler
|
||||
|
||||
SOURCES = \
|
||||
d2d1.c
|
||||
|
|
|
@ -20,6 +20,7 @@
|
|||
#include <limits.h>
|
||||
#include <math.h>
|
||||
#include <float.h>
|
||||
#include "d3dcompiler.h"
|
||||
#include "d2d1_3.h"
|
||||
#include "d2d1effectauthor.h"
|
||||
#include "d3d11.h"
|
||||
|
@ -53,10 +54,22 @@ L"<?xml version='1.0'?> \
|
|||
<Property name='DisplayName' type='string' value='Int32 prop'/> \
|
||||
<Property name='Default' type='int32' value='10'/> \
|
||||
</Property> \
|
||||
<Property name='Int32PropHex' type='int32' value='0xffff0001'> \
|
||||
<Property name='DisplayName' type='string' value='Int32 prop hex'/> \
|
||||
</Property> \
|
||||
<Property name='Int32PropOct' type='int32' value='012'> \
|
||||
<Property name='DisplayName' type='string' value='Int32 prop oct'/> \
|
||||
</Property> \
|
||||
<Property name='UInt32Prop' type='uint32' value='-3'> \
|
||||
<Property name='DisplayName' type='string' value='UInt32 prop'/> \
|
||||
<Property name='Default' type='uint32' value='10'/> \
|
||||
</Property> \
|
||||
<Property name='UInt32PropHex' type='uint32' value='0xfff'> \
|
||||
<Property name='DisplayName' type='string' value='UInt32 prop hex'/> \
|
||||
</Property> \
|
||||
<Property name='UInt32PropOct' type='uint32' value='013'> \
|
||||
<Property name='DisplayName' type='string' value='UInt32 prop oct'/> \
|
||||
</Property> \
|
||||
<Property name='Bool' type='bool'> \
|
||||
<Property name='DisplayName' type='string' value='Bool property'/> \
|
||||
<Property name='Default' type='bool' value='false'/> \
|
||||
|
@ -220,38 +233,32 @@ L"<?xml version='1.0'?> \
|
|||
</Effect> \
|
||||
";
|
||||
|
||||
static const DWORD test_vs[] =
|
||||
{
|
||||
#if 0
|
||||
void main(float4 pos : Position, out float4 output : SV_Position)
|
||||
{
|
||||
output = pos;
|
||||
}
|
||||
#endif
|
||||
0x43425844, 0xa84b398b, 0xc4047d32, 0xc19c67bb, 0x4644285e, 0x00000001, 0x000000d8, 0x00000003,
|
||||
0x0000002c, 0x00000060, 0x00000094, 0x4e475349, 0x0000002c, 0x00000001, 0x00000008, 0x00000020,
|
||||
0x00000000, 0x00000000, 0x00000003, 0x00000000, 0x00000f0f, 0x69736f50, 0x6e6f6974, 0xababab00,
|
||||
0x4e47534f, 0x0000002c, 0x00000001, 0x00000008, 0x00000020, 0x00000000, 0x00000001, 0x00000003,
|
||||
0x00000000, 0x0000000f, 0x505f5653, 0x7469736f, 0x006e6f69, 0x52444853, 0x0000003c, 0x00010040,
|
||||
0x0000000f, 0x0300005f, 0x001010f2, 0x00000000, 0x04000067, 0x001020f2, 0x00000000, 0x00000001,
|
||||
0x05000036, 0x001020f2, 0x00000000, 0x00101e46, 0x00000000, 0x0100003e,
|
||||
};
|
||||
static const WCHAR *effect_variable_input_count =
|
||||
L"<?xml version='1.0'?> \
|
||||
<Effect> \
|
||||
<Property name='DisplayName' type='string' value='VariableInputs'/> \
|
||||
<Property name='Author' type='string' value='The Wine Project'/> \
|
||||
<Property name='Category' type='string' value='Test'/> \
|
||||
<Property name='Description' type='string' value='Test effect.'/> \
|
||||
<Inputs minimum='2' maximum='5' > \
|
||||
<Input name='Source1'/> \
|
||||
<Input name='Source2'/> \
|
||||
<Input name='Source3'/> \
|
||||
</Inputs> \
|
||||
</Effect> \
|
||||
";
|
||||
|
||||
static const DWORD test_ps[] =
|
||||
{
|
||||
#if 0
|
||||
float4 main() : SV_Target
|
||||
{
|
||||
return float4(0.1, 0.2, 0.3, 0.4);
|
||||
}
|
||||
#endif
|
||||
0x43425844, 0xf34300ae, 0x22fc6d56, 0x5cca66fa, 0x86ae3266, 0x00000001, 0x000000b0, 0x00000003,
|
||||
0x0000002c, 0x0000003c, 0x00000070, 0x4e475349, 0x00000008, 0x00000000, 0x00000008, 0x4e47534f,
|
||||
0x0000002c, 0x00000001, 0x00000008, 0x00000020, 0x00000000, 0x00000000, 0x00000003, 0x00000000,
|
||||
0x0000000f, 0x545f5653, 0x65677261, 0xabab0074, 0x52444853, 0x00000038, 0x00000040, 0x0000000e,
|
||||
0x03000065, 0x001020f2, 0x00000000, 0x08000036, 0x001020f2, 0x00000000, 0x00004002, 0x3dcccccd,
|
||||
0x3e4ccccd, 0x3e99999a, 0x3ecccccd, 0x0100003e,
|
||||
};
|
||||
static const char test_vs_code[] =
|
||||
"void main(float4 pos : Position, out float4 output : SV_Position)\n"
|
||||
"{\n"
|
||||
" output = pos;\n"
|
||||
"}";
|
||||
|
||||
static const char test_ps_code[] =
|
||||
"float4 main() : SV_Target\n"
|
||||
"{\n"
|
||||
" return float4(0.1, 0.2, 0.3, 0.4);\n"
|
||||
"}";
|
||||
|
||||
static HRESULT (WINAPI *pD2D1CreateDevice)(IDXGIDevice *dxgi_device,
|
||||
const D2D1_CREATION_PROPERTIES *properties, ID2D1Device **device);
|
||||
|
@ -350,10 +357,12 @@ struct expected_geometry_figure
|
|||
struct effect_impl
|
||||
{
|
||||
ID2D1EffectImpl ID2D1EffectImpl_iface;
|
||||
ID2D1DrawTransform ID2D1DrawTransform_iface;
|
||||
LONG refcount;
|
||||
UINT integer;
|
||||
ID2D1EffectContext *effect_context;
|
||||
ID2D1TransformGraph *transform_graph;
|
||||
ID2D1DrawInfo *draw_info;
|
||||
};
|
||||
|
||||
static void queue_d3d1x_test(void (*test)(BOOL d3d11), BOOL d3d11)
|
||||
|
@ -10795,7 +10804,7 @@ static void test_mt_factory(BOOL d3d11)
|
|||
ID2D1Multithread_Enter(multithread);
|
||||
thread = CreateThread(NULL, 0, mt_factory_test_thread_draw_func, ctx.rt, 0, NULL);
|
||||
ok(!!thread, "Failed to create a thread.\n");
|
||||
ret = WaitForSingleObject(thread, 1000);
|
||||
ret = WaitForSingleObject(thread, 5000);
|
||||
ok(ret == WAIT_OBJECT_0, "Didn't expect timeout.\n");
|
||||
ID2D1Multithread_Leave(multithread);
|
||||
WaitForSingleObject(thread, INFINITE);
|
||||
|
@ -10805,8 +10814,8 @@ static void test_mt_factory(BOOL d3d11)
|
|||
release_test_context(&ctx);
|
||||
}
|
||||
|
||||
#define check_system_properties(effect, is_builtin) check_system_properties_(__LINE__, effect, is_builtin)
|
||||
static void check_system_properties_(unsigned int line, ID2D1Effect *effect, BOOL is_builtin)
|
||||
#define check_system_properties(effect) check_system_properties_(__LINE__, effect)
|
||||
static void check_system_properties_(unsigned int line, ID2D1Effect *effect)
|
||||
{
|
||||
UINT i, value_size, str_size;
|
||||
WCHAR name[32], buffer[256];
|
||||
|
@ -10848,7 +10857,6 @@ static void check_system_properties_(unsigned int line, ID2D1Effect *effect, BOO
|
|||
|
||||
name[0] = 0;
|
||||
hr = ID2D1Effect_GetPropertyName(effect, test->index, name, sizeof(name));
|
||||
todo_wine_if((is_builtin && (test->type == D2D1_PROPERTY_TYPE_ARRAY || test->type == D2D1_PROPERTY_TYPE_STRING)))
|
||||
ok_(__FILE__, line)(hr == S_OK, "Failed to get property name, hr %#lx\n", hr);
|
||||
if (hr == D2DERR_INVALID_PROPERTY)
|
||||
{
|
||||
|
@ -10859,7 +10867,6 @@ static void check_system_properties_(unsigned int line, ID2D1Effect *effect, BOO
|
|||
debugstr_w(name), debugstr_w(test->name));
|
||||
|
||||
type = ID2D1Effect_GetType(effect, test->index);
|
||||
todo_wine_if((is_builtin && (test->type == D2D1_PROPERTY_TYPE_ARRAY || test->type == D2D1_PROPERTY_TYPE_STRING)))
|
||||
ok_(__FILE__, line)(type == test->type, "Got unexpected property type %#x, expected %#x.\n",
|
||||
type, test->type);
|
||||
|
||||
|
@ -10867,17 +10874,15 @@ static void check_system_properties_(unsigned int line, ID2D1Effect *effect, BOO
|
|||
value_size = ID2D1Effect_GetValueSize(effect, test->index);
|
||||
if (test->value_size != 0)
|
||||
{
|
||||
todo_wine_if(is_builtin && test->type == D2D1_PROPERTY_TYPE_ARRAY)
|
||||
ok_(__FILE__, line)(value_size == test->value_size, "Got unexpected value size %u, expected %u.\n",
|
||||
value_size, test->value_size);
|
||||
}
|
||||
else if (test->type == D2D1_PROPERTY_TYPE_STRING)
|
||||
{
|
||||
hr = ID2D1Effect_GetValue(effect, test->index, D2D1_PROPERTY_TYPE_STRING, (BYTE *)buffer, sizeof(buffer));
|
||||
todo_wine_if(is_builtin)
|
||||
ok_(__FILE__, line)(hr == S_OK, "Failed to get value, hr %#lx.\n", hr);
|
||||
str_size = (wcslen((WCHAR *)buffer) + 1) * sizeof(WCHAR);
|
||||
todo_wine_if(is_builtin || buffer[0] == 0)
|
||||
todo_wine_if(buffer[0] == 0)
|
||||
ok_(__FILE__, line)(value_size == str_size, "Got unexpected value size %u, expected %u.\n",
|
||||
value_size, str_size);
|
||||
}
|
||||
|
@ -10967,12 +10972,12 @@ static void test_builtin_effect(BOOL d3d11)
|
|||
ok(hr == S_OK, "Got unexpected hr %#lx.\n", hr);
|
||||
|
||||
hr = ID2D1Effect_GetValue(effect, D2D1_PROPERTY_DISPLAYNAME, D2D1_PROPERTY_TYPE_STRING, buffer, sizeof(buffer));
|
||||
todo_wine ok(hr == S_OK, "Got unexpected hr %#lx.\n", hr);
|
||||
ok(hr == S_OK, "Got unexpected hr %#lx.\n", hr);
|
||||
str_size = (wcslen((WCHAR *)buffer) + 1) * sizeof(WCHAR);
|
||||
hr = ID2D1Effect_GetValue(effect, D2D1_PROPERTY_DISPLAYNAME, D2D1_PROPERTY_TYPE_STRING, buffer, str_size);
|
||||
todo_wine ok(hr == S_OK, "Got unexpected hr %#lx.\n", hr);
|
||||
ok(hr == S_OK, "Got unexpected hr %#lx.\n", hr);
|
||||
hr = ID2D1Effect_GetValue(effect, D2D1_PROPERTY_DISPLAYNAME, D2D1_PROPERTY_TYPE_STRING, buffer, str_size - 1);
|
||||
todo_wine ok(hr == D2DERR_INSUFFICIENT_BUFFER, "Got unexpected hr %#lx.\n", hr);
|
||||
ok(hr == D2DERR_INSUFFICIENT_BUFFER, "Got unexpected hr %#lx.\n", hr);
|
||||
|
||||
hr = ID2D1Effect_GetValue(effect, D2D1_PROPERTY_CLSID, 0xdeadbeef, (BYTE *)&clsid, sizeof(clsid));
|
||||
ok(hr == E_INVALIDARG, "Got unexpected hr %#lx.\n", hr);
|
||||
|
@ -11091,8 +11096,15 @@ static inline struct effect_impl *impl_from_ID2D1EffectImpl(ID2D1EffectImpl *ifa
|
|||
return CONTAINING_RECORD(iface, struct effect_impl, ID2D1EffectImpl_iface);
|
||||
}
|
||||
|
||||
static inline struct effect_impl *impl_from_ID2D1DrawTransform(ID2D1DrawTransform *iface)
|
||||
{
|
||||
return CONTAINING_RECORD(iface, struct effect_impl, ID2D1DrawTransform_iface);
|
||||
}
|
||||
|
||||
static HRESULT STDMETHODCALLTYPE effect_impl_QueryInterface(ID2D1EffectImpl *iface, REFIID iid, void **out)
|
||||
{
|
||||
struct effect_impl *effect_impl = impl_from_ID2D1EffectImpl(iface);
|
||||
|
||||
if (IsEqualGUID(iid, &IID_ID2D1EffectImpl)
|
||||
|| IsEqualGUID(iid, &IID_IUnknown))
|
||||
{
|
||||
|
@ -11100,6 +11112,14 @@ static HRESULT STDMETHODCALLTYPE effect_impl_QueryInterface(ID2D1EffectImpl *ifa
|
|||
*out = iface;
|
||||
return S_OK;
|
||||
}
|
||||
else if (IsEqualGUID(iid, &IID_ID2D1DrawTransform)
|
||||
|| IsEqualGUID(iid, &IID_ID2D1Transform)
|
||||
|| IsEqualGUID(iid, &IID_ID2D1TransformNode))
|
||||
{
|
||||
ID2D1EffectImpl_AddRef(iface);
|
||||
*out = &effect_impl->ID2D1DrawTransform_iface;
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
*out = NULL;
|
||||
return E_NOINTERFACE;
|
||||
|
@ -11121,6 +11141,8 @@ static ULONG STDMETHODCALLTYPE effect_impl_Release(ID2D1EffectImpl *iface)
|
|||
{
|
||||
if (effect_impl->effect_context)
|
||||
ID2D1EffectContext_Release(effect_impl->effect_context);
|
||||
if (effect_impl->draw_info)
|
||||
ID2D1DrawInfo_Release(effect_impl->draw_info);
|
||||
free(effect_impl);
|
||||
}
|
||||
|
||||
|
@ -11143,7 +11165,12 @@ static HRESULT STDMETHODCALLTYPE effect_impl_PrepareForRender(ID2D1EffectImpl *i
|
|||
|
||||
static HRESULT STDMETHODCALLTYPE effect_impl_SetGraph(ID2D1EffectImpl *iface, ID2D1TransformGraph *graph)
|
||||
{
|
||||
return E_NOTIMPL;
|
||||
struct effect_impl *effect_impl = impl_from_ID2D1EffectImpl(iface);
|
||||
|
||||
ID2D1TransformGraph_Release(effect_impl->transform_graph);
|
||||
ID2D1TransformGraph_AddRef(effect_impl->transform_graph = graph);
|
||||
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
static const ID2D1EffectImplVtbl effect_impl_vtbl =
|
||||
|
@ -11451,6 +11478,40 @@ static void test_effect_register(BOOL d3d11)
|
|||
hr = ID2D1Factory1_UnregisterEffect(factory, &CLSID_D2D1Composite);
|
||||
ok(hr == D2DERR_EFFECT_IS_NOT_REGISTERED, "Got unexpected hr %#lx.\n", hr);
|
||||
|
||||
/* Variable input count. */
|
||||
hr = ID2D1Factory1_RegisterEffectFromString(factory, &CLSID_TestEffect,
|
||||
effect_variable_input_count, NULL, 0, effect_impl_create);
|
||||
ok(hr == S_OK, "Got unexpected hr %#lx.\n", hr);
|
||||
hr = ID2D1DeviceContext_CreateEffect(device_context, &CLSID_TestEffect, &effect);
|
||||
ok(hr == S_OK, "Got unexpected hr %#lx.\n", hr);
|
||||
integer = ID2D1Effect_GetInputCount(effect);
|
||||
ok(integer == 3, "Unexpected input count %u.\n", integer);
|
||||
|
||||
integer = 0;
|
||||
hr = ID2D1Effect_GetValue(effect, D2D1_PROPERTY_MIN_INPUTS, D2D1_PROPERTY_TYPE_UINT32,
|
||||
(BYTE *)&integer, sizeof(integer));
|
||||
ok(hr == S_OK, "Got unexpected hr %#lx.\n", hr);
|
||||
ok(integer == 2, "Unexpected value %u.\n", integer);
|
||||
hr = ID2D1Effect_GetValue(effect, D2D1_PROPERTY_MAX_INPUTS, D2D1_PROPERTY_TYPE_UINT32,
|
||||
(BYTE *)&integer, sizeof(integer));
|
||||
ok(hr == S_OK, "Got unexpected hr %#lx.\n", hr);
|
||||
ok(integer == 5, "Unexpected value %u.\n", integer);
|
||||
hr = ID2D1Effect_GetValue(effect, D2D1_PROPERTY_INPUTS, D2D1_PROPERTY_TYPE_ARRAY,
|
||||
(BYTE *)&integer, sizeof(integer));
|
||||
ok(hr == S_OK, "Got unexpected hr %#lx.\n", hr);
|
||||
ok(integer == 3, "Unexpected data %u.\n", integer);
|
||||
hr = ID2D1Effect_SetInputCount(effect, 4);
|
||||
ok(hr == S_OK, "Got unexpected hr %#lx.\n", hr);
|
||||
hr = ID2D1Effect_GetValue(effect, D2D1_PROPERTY_INPUTS, D2D1_PROPERTY_TYPE_ARRAY,
|
||||
(BYTE *)&integer, sizeof(integer));
|
||||
ok(hr == S_OK, "Got unexpected hr %#lx.\n", hr);
|
||||
ok(integer == 3, "Unexpected data %u.\n", integer);
|
||||
|
||||
ID2D1Effect_Release(effect);
|
||||
|
||||
hr = ID2D1Factory1_UnregisterEffect(factory, &CLSID_TestEffect);
|
||||
ok(hr == S_OK, "Got unexpected hr %#lx.\n", hr);
|
||||
|
||||
release_test_context(&ctx);
|
||||
}
|
||||
|
||||
|
@ -11463,6 +11524,7 @@ static void test_effect_context(BOOL d3d11)
|
|||
struct d2d1_test_context ctx;
|
||||
ID2D1Factory1 *factory;
|
||||
ID2D1Device *device;
|
||||
ID3D10Blob *vs, *ps;
|
||||
ULONG refcount;
|
||||
BOOL loaded;
|
||||
HRESULT hr;
|
||||
|
@ -11478,6 +11540,14 @@ static void test_effect_context(BOOL d3d11)
|
|||
return;
|
||||
}
|
||||
|
||||
hr = D3DCompile(test_vs_code, sizeof(test_vs_code) - 1, "test_vs", NULL, NULL,
|
||||
"main", "vs_4_0", 0, 0, &vs, NULL);
|
||||
ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
|
||||
|
||||
hr = D3DCompile(test_ps_code, sizeof(test_ps_code) - 1, "test_ps", NULL, NULL,
|
||||
"main", "ps_4_0", 0, 0, &ps, NULL);
|
||||
ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
|
||||
|
||||
binding.propertyName = L"Context";
|
||||
binding.setFunction = NULL;
|
||||
binding.getFunction = effect_impl_get_context;
|
||||
|
@ -11500,26 +11570,26 @@ static void test_effect_context(BOOL d3d11)
|
|||
ok(!loaded, "Unexpected shader loaded state.\n");
|
||||
|
||||
hr = ID2D1EffectContext_LoadVertexShader(effect_context,
|
||||
&GUID_TestVertexShader, (const BYTE *)test_ps, sizeof(test_ps));
|
||||
&GUID_TestVertexShader, ID3D10Blob_GetBufferPointer(ps), ID3D10Blob_GetBufferSize(ps));
|
||||
ok(hr == E_INVALIDARG, "Got unexpected hr %#lx.\n", hr);
|
||||
hr = ID2D1EffectContext_LoadVertexShader(effect_context,
|
||||
&GUID_TestVertexShader, (const BYTE *)test_vs, sizeof(test_vs));
|
||||
&GUID_TestVertexShader, ID3D10Blob_GetBufferPointer(vs), ID3D10Blob_GetBufferSize(vs));
|
||||
ok(hr == S_OK, "Got unexpected hr %#lx.\n", hr);
|
||||
loaded = ID2D1EffectContext_IsShaderLoaded(effect_context, &GUID_TestVertexShader);
|
||||
ok(loaded, "Unexpected shader loaded state.\n");
|
||||
|
||||
hr = ID2D1EffectContext_LoadVertexShader(effect_context,
|
||||
&GUID_TestVertexShader, (const BYTE *)test_ps, sizeof(test_ps));
|
||||
&GUID_TestVertexShader, ID3D10Blob_GetBufferPointer(ps), ID3D10Blob_GetBufferSize(ps));
|
||||
ok(hr == S_OK, "Got unexpected hr %#lx.\n", hr);
|
||||
hr = ID2D1EffectContext_LoadVertexShader(effect_context,
|
||||
&GUID_TestVertexShader, (const BYTE *)test_vs, sizeof(test_vs));
|
||||
&GUID_TestVertexShader, ID3D10Blob_GetBufferPointer(vs), ID3D10Blob_GetBufferSize(vs));
|
||||
ok(hr == S_OK, "Got unexpected hr %#lx.\n", hr);
|
||||
|
||||
hr = ID2D1EffectContext_LoadPixelShader(effect_context,
|
||||
&GUID_TestPixelShader, (const BYTE *)test_vs, sizeof(test_vs));
|
||||
&GUID_TestPixelShader, ID3D10Blob_GetBufferPointer(vs), ID3D10Blob_GetBufferSize(vs));
|
||||
ok(hr == E_INVALIDARG, "Got unexpected hr %#lx.\n", hr);
|
||||
hr = ID2D1EffectContext_LoadPixelShader(effect_context,
|
||||
&GUID_TestPixelShader, (const BYTE *)test_ps, sizeof(test_ps));
|
||||
&GUID_TestPixelShader, ID3D10Blob_GetBufferPointer(ps), ID3D10Blob_GetBufferSize(ps));
|
||||
ok(hr == S_OK, "Got unexpected hr %#lx.\n", hr);
|
||||
loaded = ID2D1EffectContext_IsShaderLoaded(effect_context, &GUID_TestPixelShader);
|
||||
ok(loaded, "Unexpected shader loaded state.\n");
|
||||
|
@ -11580,6 +11650,10 @@ static void test_effect_context(BOOL d3d11)
|
|||
|
||||
hr = ID2D1Factory1_UnregisterEffect(factory, &CLSID_TestEffect);
|
||||
ok(hr == S_OK, "Got unexpected hr %#lx.\n", hr);
|
||||
|
||||
ID3D10Blob_Release(vs);
|
||||
ID3D10Blob_Release(ps);
|
||||
|
||||
release_test_context(&ctx);
|
||||
}
|
||||
|
||||
|
@ -11700,6 +11774,28 @@ static void test_effect_properties(BOOL d3d11)
|
|||
ok(hr == S_OK, "Got unexpected hr %#lx.\n", hr);
|
||||
ok(val == -2, "Unexpected value %d.\n", val);
|
||||
|
||||
/* Int32 property, hex literal. */
|
||||
index = ID2D1Effect_GetPropertyIndex(effect, L"Int32PropHex");
|
||||
hr = ID2D1Effect_GetPropertyName(effect, index, buffer, ARRAY_SIZE(buffer));
|
||||
ok(hr == S_OK, "Got unexpected hr %#lx.\n", hr);
|
||||
ok(!wcscmp(buffer, L"Int32PropHex"), "Unexpected name %s.\n", wine_dbgstr_w(buffer));
|
||||
prop_type = ID2D1Effect_GetType(effect, index);
|
||||
ok(prop_type == D2D1_PROPERTY_TYPE_INT32, "Unexpected type %u.\n", prop_type);
|
||||
hr = ID2D1Effect_GetValue(effect, index, D2D1_PROPERTY_TYPE_INT32, (BYTE *)&val, sizeof(val));
|
||||
ok(hr == S_OK, "Got unexpected hr %#lx.\n", hr);
|
||||
ok(val == -65535, "Unexpected value %d.\n", val);
|
||||
|
||||
/* Int32 property, octal literal. */
|
||||
index = ID2D1Effect_GetPropertyIndex(effect, L"Int32PropOct");
|
||||
hr = ID2D1Effect_GetPropertyName(effect, index, buffer, ARRAY_SIZE(buffer));
|
||||
ok(hr == S_OK, "Got unexpected hr %#lx.\n", hr);
|
||||
ok(!wcscmp(buffer, L"Int32PropOct"), "Unexpected name %s.\n", wine_dbgstr_w(buffer));
|
||||
prop_type = ID2D1Effect_GetType(effect, index);
|
||||
ok(prop_type == D2D1_PROPERTY_TYPE_INT32, "Unexpected type %u.\n", prop_type);
|
||||
hr = ID2D1Effect_GetValue(effect, index, D2D1_PROPERTY_TYPE_INT32, (BYTE *)&val, sizeof(val));
|
||||
ok(hr == S_OK, "Got unexpected hr %#lx.\n", hr);
|
||||
ok(val == 10, "Unexpected value %d.\n", val);
|
||||
|
||||
/* UInt32 property. */
|
||||
index = ID2D1Effect_GetPropertyIndex(effect, L"UInt32Prop");
|
||||
hr = ID2D1Effect_GetPropertyName(effect, index, buffer, ARRAY_SIZE(buffer));
|
||||
|
@ -11711,6 +11807,17 @@ static void test_effect_properties(BOOL d3d11)
|
|||
ok(hr == S_OK, "Got unexpected hr %#lx.\n", hr);
|
||||
ok(integer == -3, "Unexpected value %u.\n", integer);
|
||||
|
||||
/* UInt32 property, hex literal. */
|
||||
index = ID2D1Effect_GetPropertyIndex(effect, L"UInt32PropHex");
|
||||
hr = ID2D1Effect_GetPropertyName(effect, index, buffer, ARRAY_SIZE(buffer));
|
||||
ok(hr == S_OK, "Got unexpected hr %#lx.\n", hr);
|
||||
ok(!wcscmp(buffer, L"UInt32PropHex"), "Unexpected name %s.\n", wine_dbgstr_w(buffer));
|
||||
prop_type = ID2D1Effect_GetType(effect, index);
|
||||
ok(prop_type == D2D1_PROPERTY_TYPE_UINT32, "Unexpected type %u.\n", prop_type);
|
||||
hr = ID2D1Effect_GetValue(effect, index, D2D1_PROPERTY_TYPE_UINT32, (BYTE *)&integer, sizeof(integer));
|
||||
ok(hr == S_OK, "Got unexpected hr %#lx.\n", hr);
|
||||
ok(integer == 0xfff, "Unexpected value %x.\n", integer);
|
||||
|
||||
/* Vector2 property. */
|
||||
index = ID2D1Effect_GetPropertyIndex(effect, L"Vec2Prop");
|
||||
hr = ID2D1Effect_GetPropertyName(effect, index, buffer, ARRAY_SIZE(buffer));
|
||||
|
@ -11814,7 +11921,7 @@ static void test_effect_properties(BOOL d3d11)
|
|||
hr = ID2D1DeviceContext_CreateEffect(ctx.context, &CLSID_TestEffect, &effect);
|
||||
ok(hr == S_OK, "Got unexpected hr %#lx.\n", hr);
|
||||
|
||||
check_system_properties(effect, FALSE);
|
||||
check_system_properties(effect);
|
||||
|
||||
hr = ID2D1Effect_GetValue(effect, D2D1_PROPERTY_CLSID,
|
||||
D2D1_PROPERTY_TYPE_CLSID, (BYTE *)&clsid, sizeof(clsid));
|
||||
|
@ -11859,14 +11966,12 @@ static void test_effect_properties(BOOL d3d11)
|
|||
hr = ID2D1Effect_GetValue(effect, D2D1_PROPERTY_MIN_INPUTS,
|
||||
D2D1_PROPERTY_TYPE_UINT32, (BYTE *)&min_inputs, sizeof(min_inputs));
|
||||
ok(hr == S_OK, "Got unexpected hr %#lx.\n", hr);
|
||||
todo_wine_if(test->min_inputs == 0)
|
||||
ok(min_inputs == test->min_inputs, "Got unexpected min inputs %u, expected %u.\n",
|
||||
min_inputs, test->min_inputs);
|
||||
|
||||
hr = ID2D1Effect_GetValue(effect, D2D1_PROPERTY_MAX_INPUTS,
|
||||
D2D1_PROPERTY_TYPE_UINT32, (BYTE *)&max_inputs, sizeof(max_inputs));
|
||||
ok(hr == S_OK, "Got unexpected hr %#lx.\n", hr);
|
||||
todo_wine_if(test->max_inputs == 0)
|
||||
ok(max_inputs == test->max_inputs, "Got unexpected max inputs %u, expected %u.\n",
|
||||
max_inputs, test->max_inputs);
|
||||
|
||||
|
@ -12186,7 +12291,7 @@ static void test_effect_2d_affine(BOOL d3d11)
|
|||
hr = ID2D1DeviceContext_CreateEffect(context, &CLSID_D2D12DAffineTransform, &effect);
|
||||
ok(hr == S_OK, "Got unexpected hr %#lx.\n", hr);
|
||||
|
||||
check_system_properties(effect, TRUE);
|
||||
check_system_properties(effect);
|
||||
|
||||
count = ID2D1Effect_GetPropertyCount(effect);
|
||||
todo_wine ok(count == 4, "Got unexpected property count %u.\n", count);
|
||||
|
@ -12329,7 +12434,7 @@ static void test_effect_crop(BOOL d3d11)
|
|||
hr = ID2D1DeviceContext_CreateEffect(context, &CLSID_D2D1Crop, &effect);
|
||||
ok(hr == S_OK, "Got unexpected hr %#lx.\n", hr);
|
||||
|
||||
check_system_properties(effect, TRUE);
|
||||
check_system_properties(effect);
|
||||
|
||||
count = ID2D1Effect_GetPropertyCount(effect);
|
||||
todo_wine ok(count == 2, "Got unexpected property count %u.\n", count);
|
||||
|
@ -12413,7 +12518,7 @@ static void test_effect_grayscale(BOOL d3d11)
|
|||
hr = ID2D1DeviceContext_CreateEffect(context, &CLSID_D2D1Grayscale, &effect);
|
||||
ok(hr == S_OK, "Got unexpected hr %#lx.\n", hr);
|
||||
|
||||
check_system_properties(effect, TRUE);
|
||||
check_system_properties(effect);
|
||||
|
||||
count = ID2D1Effect_GetPropertyCount(effect);
|
||||
ok(!count, "Got unexpected property count %u.\n", count);
|
||||
|
@ -14161,6 +14266,224 @@ static void test_dc_target_is_supported(BOOL d3d11)
|
|||
release_test_context(&ctx);
|
||||
}
|
||||
|
||||
static HRESULT STDMETHODCALLTYPE ps_effect_impl_Initialize(ID2D1EffectImpl *iface,
|
||||
ID2D1EffectContext *context, ID2D1TransformGraph *graph)
|
||||
{
|
||||
static const char ps_code[] =
|
||||
"float4 main() : sv_target\n"
|
||||
"{\n"
|
||||
" return float4(0.1, 0.2, 0.3, 0.4);\n"
|
||||
"}";
|
||||
|
||||
struct effect_impl *effect_impl = impl_from_ID2D1EffectImpl(iface);
|
||||
ID3D10Blob *blob;
|
||||
HRESULT hr;
|
||||
|
||||
effect_impl->effect_context = context;
|
||||
ID2D1EffectContext_AddRef(effect_impl->effect_context);
|
||||
|
||||
hr = D3DCompile(ps_code, strlen(ps_code), "test_ps", NULL, NULL, "main",
|
||||
"ps_4_0", 0, 0, &blob, NULL);
|
||||
ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
|
||||
|
||||
if (SUCCEEDED(hr = ID2D1EffectContext_LoadPixelShader(context, &GUID_TestPixelShader,
|
||||
ID3D10Blob_GetBufferPointer(blob), ID3D10Blob_GetBufferSize(blob))))
|
||||
{
|
||||
hr = ID2D1TransformGraph_SetSingleTransformNode(graph,
|
||||
(ID2D1TransformNode *)&effect_impl->ID2D1DrawTransform_iface);
|
||||
}
|
||||
|
||||
ID3D10Blob_Release(blob);
|
||||
return hr;
|
||||
}
|
||||
|
||||
static const ID2D1EffectImplVtbl ps_effect_impl_vtbl =
|
||||
{
|
||||
effect_impl_QueryInterface,
|
||||
effect_impl_AddRef,
|
||||
effect_impl_Release,
|
||||
ps_effect_impl_Initialize,
|
||||
effect_impl_PrepareForRender,
|
||||
effect_impl_SetGraph,
|
||||
};
|
||||
|
||||
static HRESULT STDMETHODCALLTYPE effect_impl_draw_transform_QueryInterface(
|
||||
ID2D1DrawTransform *iface, REFIID iid, void **out)
|
||||
{
|
||||
struct effect_impl *effect_impl = impl_from_ID2D1DrawTransform(iface);
|
||||
return ID2D1EffectImpl_QueryInterface(&effect_impl->ID2D1EffectImpl_iface, iid, out);
|
||||
}
|
||||
|
||||
static ULONG STDMETHODCALLTYPE effect_impl_draw_transform_AddRef(ID2D1DrawTransform *iface)
|
||||
{
|
||||
struct effect_impl *effect_impl = impl_from_ID2D1DrawTransform(iface);
|
||||
return ID2D1EffectImpl_AddRef(&effect_impl->ID2D1EffectImpl_iface);
|
||||
}
|
||||
|
||||
static ULONG STDMETHODCALLTYPE effect_impl_draw_transform_Release(ID2D1DrawTransform *iface)
|
||||
{
|
||||
struct effect_impl *effect_impl = impl_from_ID2D1DrawTransform(iface);
|
||||
return ID2D1EffectImpl_Release(&effect_impl->ID2D1EffectImpl_iface);
|
||||
}
|
||||
|
||||
static UINT32 STDMETHODCALLTYPE effect_impl_draw_transform_GetInputCount(ID2D1DrawTransform *iface)
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
|
||||
static HRESULT STDMETHODCALLTYPE effect_impl_draw_transform_MapOutputRectToInputRects(
|
||||
ID2D1DrawTransform *iface, const D2D1_RECT_L *output_rect, D2D1_RECT_L *input_rects,
|
||||
UINT32 input_rect_count)
|
||||
{
|
||||
if (input_rect_count != 1)
|
||||
return E_INVALIDARG;
|
||||
|
||||
input_rects[0] = *output_rect;
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
static HRESULT STDMETHODCALLTYPE effect_impl_draw_transform_MapInputRectsToOutputRect(
|
||||
ID2D1DrawTransform *iface, const D2D1_RECT_L *input_rects, const D2D1_RECT_L *input_opaque_rects,
|
||||
UINT32 input_rect_count, D2D1_RECT_L *output_rect, D2D1_RECT_L *output_opaque_rect)
|
||||
{
|
||||
if (input_rect_count != 1)
|
||||
return E_INVALIDARG;
|
||||
|
||||
*output_rect = input_rects[0];
|
||||
memset(output_opaque_rect, 0, sizeof(*output_opaque_rect));
|
||||
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
static HRESULT STDMETHODCALLTYPE effect_impl_draw_transform_MapInvalidRect(
|
||||
ID2D1DrawTransform *iface, UINT32 index, D2D1_RECT_L input_rect, D2D1_RECT_L *output_rect)
|
||||
{
|
||||
ok(0, "Unexpected call.\n");
|
||||
return E_NOTIMPL;
|
||||
}
|
||||
|
||||
static HRESULT STDMETHODCALLTYPE effect_impl_draw_transform_SetDrawInfo(ID2D1DrawTransform *iface,
|
||||
ID2D1DrawInfo *info)
|
||||
{
|
||||
return ID2D1DrawInfo_SetPixelShader(info, &GUID_TestPixelShader, 0);
|
||||
}
|
||||
|
||||
static const ID2D1DrawTransformVtbl ps_effect_draw_transform_vtbl =
|
||||
{
|
||||
effect_impl_draw_transform_QueryInterface,
|
||||
effect_impl_draw_transform_AddRef,
|
||||
effect_impl_draw_transform_Release,
|
||||
effect_impl_draw_transform_GetInputCount,
|
||||
effect_impl_draw_transform_MapOutputRectToInputRects,
|
||||
effect_impl_draw_transform_MapInputRectsToOutputRect,
|
||||
effect_impl_draw_transform_MapInvalidRect,
|
||||
effect_impl_draw_transform_SetDrawInfo,
|
||||
};
|
||||
|
||||
static HRESULT STDMETHODCALLTYPE ps_effect_impl_create(IUnknown **effect_impl)
|
||||
{
|
||||
struct effect_impl *object;
|
||||
|
||||
if (!(object = calloc(1, sizeof(*object))))
|
||||
return E_OUTOFMEMORY;
|
||||
|
||||
object->ID2D1EffectImpl_iface.lpVtbl = &ps_effect_impl_vtbl;
|
||||
object->ID2D1DrawTransform_iface.lpVtbl = &ps_effect_draw_transform_vtbl;
|
||||
object->refcount = 1;
|
||||
|
||||
*effect_impl = (IUnknown *)&object->ID2D1EffectImpl_iface;
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
static void test_effect_custom_pixel_shader(BOOL d3d11)
|
||||
{
|
||||
static const WCHAR *description =
|
||||
L"<?xml version='1.0'?> \
|
||||
<Effect> \
|
||||
<Property name='DisplayName' type='string' value='PSEffect'/> \
|
||||
<Property name='Author' type='string' value='The Wine Project'/> \
|
||||
<Property name='Category' type='string' value='Test'/> \
|
||||
<Property name='Description' type='string' value='Test effect.'/> \
|
||||
<Inputs> \
|
||||
<Input name='Source'/> \
|
||||
</Inputs> \
|
||||
</Effect> \
|
||||
";
|
||||
|
||||
D2D1_BITMAP_PROPERTIES1 bitmap_desc;
|
||||
DWORD colour, expected_colour;
|
||||
struct d2d1_test_context ctx;
|
||||
struct resource_readback rb;
|
||||
ID2D1DeviceContext *context;
|
||||
D2D1_SIZE_U input_size;
|
||||
ID2D1Factory1 *factory;
|
||||
ID2D1Bitmap1 *bitmap;
|
||||
ID2D1Effect *effect;
|
||||
ID2D1Image *output;
|
||||
DWORD pixel;
|
||||
HRESULT hr;
|
||||
|
||||
if (!init_test_context(&ctx, d3d11))
|
||||
return;
|
||||
|
||||
context = ctx.context;
|
||||
factory = ctx.factory1;
|
||||
if (!factory)
|
||||
{
|
||||
win_skip("ID2D1Factory1 is not supported.\n");
|
||||
release_test_context(&ctx);
|
||||
return;
|
||||
}
|
||||
|
||||
hr = ID2D1Factory1_RegisterEffectFromString(factory, &CLSID_TestEffect, description, NULL,
|
||||
0, ps_effect_impl_create);
|
||||
ok(hr == S_OK, "Got unexpected hr %#lx.\n", hr);
|
||||
|
||||
hr = ID2D1DeviceContext_CreateEffect(context, &CLSID_TestEffect, &effect);
|
||||
todo_wine
|
||||
ok(hr == S_OK, "Got unexpected hr %#lx.\n", hr);
|
||||
if (FAILED(hr))
|
||||
{
|
||||
release_test_context(&ctx);
|
||||
return;
|
||||
}
|
||||
|
||||
set_size_u(&input_size, 1, 1);
|
||||
pixel = 0xabcd00ff;
|
||||
bitmap_desc.pixelFormat.format = DXGI_FORMAT_B8G8R8A8_UNORM;
|
||||
bitmap_desc.pixelFormat.alphaMode = D2D1_ALPHA_MODE_IGNORE;
|
||||
bitmap_desc.dpiX = 96.0f;
|
||||
bitmap_desc.dpiY = 96.0f;
|
||||
bitmap_desc.bitmapOptions = D2D1_BITMAP_OPTIONS_NONE;
|
||||
bitmap_desc.colorContext = NULL;
|
||||
hr = ID2D1DeviceContext_CreateBitmap(context, input_size, &pixel, sizeof(pixel),
|
||||
&bitmap_desc, &bitmap);
|
||||
ok(hr == S_OK, "Got unexpected hr %#lx.\n", hr);
|
||||
|
||||
ID2D1Effect_SetInput(effect, 0, (ID2D1Image *)bitmap, FALSE);
|
||||
ID2D1Effect_GetOutput(effect, &output);
|
||||
|
||||
ID2D1DeviceContext_BeginDraw(context);
|
||||
ID2D1DeviceContext_Clear(context, 0);
|
||||
ID2D1DeviceContext_DrawImage(context, output, NULL, NULL, 0, 0);
|
||||
hr = ID2D1DeviceContext_EndDraw(context, NULL, NULL);
|
||||
ok(hr == S_OK, "Got unexpected hr %#lx.\n", hr);
|
||||
|
||||
get_surface_readback(&ctx, &rb);
|
||||
colour = get_readback_colour(&rb, 0, 0);
|
||||
expected_colour = 0x661a334c;
|
||||
todo_wine ok(compare_colour(colour, expected_colour, 1),
|
||||
"Got unexpected colour %#lx, expected %#lx.\n", colour, expected_colour);
|
||||
release_resource_readback(&rb);
|
||||
|
||||
ID2D1Image_Release(output);
|
||||
ID2D1Bitmap1_Release(bitmap);
|
||||
|
||||
ID2D1Effect_Release(effect);
|
||||
|
||||
release_test_context(&ctx);
|
||||
}
|
||||
|
||||
START_TEST(d2d1)
|
||||
{
|
||||
HMODULE d2d1_dll = GetModuleHandleA("d2d1.dll");
|
||||
|
@ -14250,6 +14573,7 @@ START_TEST(d2d1)
|
|||
queue_test(test_image_bounds);
|
||||
queue_test(test_bitmap_map);
|
||||
queue_test(test_bitmap_create);
|
||||
queue_test(test_effect_custom_pixel_shader);
|
||||
|
||||
run_queued_tests();
|
||||
}
|
||||
|
|
|
@ -1,11 +1,12 @@
|
|||
MODULE = d3d10.dll
|
||||
IMPORTLIB = d3d10
|
||||
IMPORTS = uuid d3d10core d3dcompiler dxgi wined3d
|
||||
IMPORTS = uuid d3d10core d3dcompiler_39 dxgi wined3d
|
||||
EXTRADEFS = -DD3D_COMPILER_VERSION=0
|
||||
PARENTSRC = ../d3dcompiler_43
|
||||
EXTRAINCL = $(VKD3D_PE_CFLAGS)
|
||||
|
||||
SOURCES = \
|
||||
blob.c \
|
||||
d3d10_main.c \
|
||||
effect.c \
|
||||
reflection.c \
|
||||
|
|
|
@ -239,7 +239,7 @@ HRESULT WINAPI D3D10CompileEffectFromMemory(void *data, SIZE_T data_size, const
|
|||
data, data_size, wine_dbgstr_a(filename), defines, include,
|
||||
hlsl_flags, fx_flags, effect, errors);
|
||||
|
||||
return D3DCompile(data, data_size, filename, defines, include,
|
||||
return D3DCompileFromMemory(data, data_size, filename, defines, include,
|
||||
NULL, "fx_4_0", hlsl_flags, fx_flags, effect, errors);
|
||||
}
|
||||
|
||||
|
|
|
@ -315,4 +315,12 @@ HRESULT d3d10_effect_parse(struct d3d10_effect *effect, const void *data, SIZE_T
|
|||
HRESULT WINAPI D3D10CoreCreateDevice(IDXGIFactory *factory, IDXGIAdapter *adapter,
|
||||
unsigned int flags, D3D_FEATURE_LEVEL feature_level, ID3D10Device **device);
|
||||
|
||||
/* d3dcompiler_39 function prototypes */
|
||||
HRESULT WINAPI D3DCompileFromMemory(const void *data, SIZE_T data_size, const char *filename,
|
||||
const D3D_SHADER_MACRO *defines, ID3DInclude *include, const char *entrypoint,
|
||||
const char *target, UINT sflags, UINT eflags, ID3DBlob **shader, ID3DBlob **error_messages);
|
||||
|
||||
HRESULT WINAPI D3DDisassembleCode(const void *data, SIZE_T data_size,
|
||||
UINT flags, const char *comments, ID3DBlob **disassembly);
|
||||
|
||||
#endif /* __WINE_D3D10_PRIVATE_H */
|
||||
|
|
|
@ -34,20 +34,6 @@ WINE_DEFAULT_DEBUG_CHANNEL(d3d10);
|
|||
#define TAG_CLI4 MAKE_TAG('C', 'L', 'I', '4')
|
||||
#define TAG_CTAB MAKE_TAG('C', 'T', 'A', 'B')
|
||||
|
||||
#define D3D10_FX10_TYPE_COLUMN_SHIFT 11
|
||||
#define D3D10_FX10_TYPE_COLUMN_MASK (0x7 << D3D10_FX10_TYPE_COLUMN_SHIFT)
|
||||
|
||||
#define D3D10_FX10_TYPE_ROW_SHIFT 8
|
||||
#define D3D10_FX10_TYPE_ROW_MASK (0x7 << D3D10_FX10_TYPE_ROW_SHIFT)
|
||||
|
||||
#define D3D10_FX10_TYPE_BASETYPE_SHIFT 3
|
||||
#define D3D10_FX10_TYPE_BASETYPE_MASK (0x1f << D3D10_FX10_TYPE_BASETYPE_SHIFT)
|
||||
|
||||
#define D3D10_FX10_TYPE_CLASS_SHIFT 0
|
||||
#define D3D10_FX10_TYPE_CLASS_MASK (0x7 << D3D10_FX10_TYPE_CLASS_SHIFT)
|
||||
|
||||
#define D3D10_FX10_TYPE_MATRIX_COLUMN_MAJOR_MASK 0x4000
|
||||
|
||||
static inline struct d3d10_effect *impl_from_ID3D10EffectPool(ID3D10EffectPool *iface)
|
||||
{
|
||||
return CONTAINING_RECORD(iface, struct d3d10_effect, ID3D10EffectPool_iface);
|
||||
|
@ -1897,9 +1883,25 @@ static D3D10_SHADER_VARIABLE_TYPE d3d10_variable_type(uint32_t t, BOOL is_object
|
|||
}
|
||||
}
|
||||
|
||||
struct numeric_type
|
||||
{
|
||||
uint32_t type_class : 3;
|
||||
uint32_t base_type : 5;
|
||||
uint32_t rows : 3;
|
||||
uint32_t columns : 3;
|
||||
uint32_t column_major : 1;
|
||||
uint32_t unknown : 17;
|
||||
};
|
||||
|
||||
static HRESULT parse_fx10_type(const char *data, size_t data_size, uint32_t offset, struct d3d10_effect_type *t)
|
||||
{
|
||||
uint32_t typeinfo, type_flags, type_kind;
|
||||
union
|
||||
{
|
||||
struct numeric_type type;
|
||||
uint32_t data;
|
||||
} numeric;
|
||||
|
||||
const char *ptr;
|
||||
unsigned int i;
|
||||
|
||||
|
@ -1940,28 +1942,25 @@ static HRESULT parse_fx10_type(const char *data, size_t data_size, uint32_t offs
|
|||
case 1:
|
||||
TRACE("Type is numeric.\n");
|
||||
|
||||
if (!require_space(ptr - data, 1, sizeof(typeinfo), data_size))
|
||||
if (!require_space(ptr - data, 1, sizeof(numeric), data_size))
|
||||
{
|
||||
WARN("Invalid offset %#x (data size %#Ix).\n", offset, data_size);
|
||||
return E_FAIL;
|
||||
}
|
||||
|
||||
typeinfo = read_u32(&ptr);
|
||||
numeric.data = read_u32(&ptr);
|
||||
t->member_count = 0;
|
||||
t->column_count = (typeinfo & D3D10_FX10_TYPE_COLUMN_MASK) >> D3D10_FX10_TYPE_COLUMN_SHIFT;
|
||||
t->row_count = (typeinfo & D3D10_FX10_TYPE_ROW_MASK) >> D3D10_FX10_TYPE_ROW_SHIFT;
|
||||
t->basetype = d3d10_variable_type((typeinfo & D3D10_FX10_TYPE_BASETYPE_MASK)
|
||||
>> D3D10_FX10_TYPE_BASETYPE_SHIFT, FALSE, &type_flags);
|
||||
t->type_class = d3d10_variable_class((typeinfo & D3D10_FX10_TYPE_CLASS_MASK)
|
||||
>> D3D10_FX10_TYPE_CLASS_SHIFT, typeinfo & D3D10_FX10_TYPE_MATRIX_COLUMN_MAJOR_MASK);
|
||||
t->column_count = numeric.type.columns;
|
||||
t->row_count = numeric.type.rows;
|
||||
t->basetype = d3d10_variable_type(numeric.type.base_type, FALSE, &type_flags);
|
||||
t->type_class = d3d10_variable_class(numeric.type.type_class, numeric.type.column_major);
|
||||
|
||||
TRACE("Type description: %#x.\n", typeinfo);
|
||||
TRACE("Type description: %#x.\n", numeric.data);
|
||||
TRACE("\tcolumns: %u.\n", t->column_count);
|
||||
TRACE("\trows: %u.\n", t->row_count);
|
||||
TRACE("\tbasetype: %s.\n", debug_d3d10_shader_variable_type(t->basetype));
|
||||
TRACE("\tclass: %s.\n", debug_d3d10_shader_variable_class(t->type_class));
|
||||
TRACE("\tunknown bits: %#x.\n", typeinfo & ~(D3D10_FX10_TYPE_COLUMN_MASK | D3D10_FX10_TYPE_ROW_MASK
|
||||
| D3D10_FX10_TYPE_BASETYPE_MASK | D3D10_FX10_TYPE_CLASS_MASK | D3D10_FX10_TYPE_MATRIX_COLUMN_MAJOR_MASK));
|
||||
TRACE("\tunknown bits: %#x.\n", numeric.type.unknown);
|
||||
break;
|
||||
|
||||
case 2:
|
||||
|
@ -3797,10 +3796,13 @@ static HRESULT create_buffer_object(struct d3d10_effect_variable *v)
|
|||
static HRESULT parse_fx10_buffer(const char *data, size_t data_size, const char **ptr,
|
||||
BOOL local, struct d3d10_effect_variable *l)
|
||||
{
|
||||
enum buffer_flags
|
||||
{
|
||||
IS_TBUFFER = 1,
|
||||
};
|
||||
const char *prefix = local ? "Local" : "Shared";
|
||||
uint32_t offset, flags;
|
||||
unsigned int i;
|
||||
uint32_t offset;
|
||||
D3D10_CBUFFER_TYPE d3d10_cbuffer_type;
|
||||
HRESULT hr;
|
||||
unsigned int stride = 0;
|
||||
|
||||
|
@ -3827,32 +3829,30 @@ static HRESULT parse_fx10_buffer(const char *data, size_t data_size, const char
|
|||
l->data_size = read_u32(ptr);
|
||||
TRACE("%s buffer data size: %#x.\n", prefix, l->data_size);
|
||||
|
||||
d3d10_cbuffer_type = read_u32(ptr);
|
||||
TRACE("%s buffer type: %#x.\n", prefix, d3d10_cbuffer_type);
|
||||
flags = read_u32(ptr);
|
||||
TRACE("%s buffer flags: %#x.\n", prefix, flags);
|
||||
|
||||
switch(d3d10_cbuffer_type)
|
||||
if (flags & IS_TBUFFER)
|
||||
{
|
||||
case D3D10_CT_CBUFFER:
|
||||
l->type->basetype = D3D10_SVT_CBUFFER;
|
||||
if (!copy_name("cbuffer", &l->type->name))
|
||||
{
|
||||
ERR("Failed to copy name.\n");
|
||||
return E_OUTOFMEMORY;
|
||||
}
|
||||
break;
|
||||
l->type->basetype = D3D10_SVT_TBUFFER;
|
||||
copy_name("tbuffer", &l->type->name);
|
||||
}
|
||||
else
|
||||
{
|
||||
l->type->basetype = D3D10_SVT_CBUFFER;
|
||||
copy_name("cbuffer", &l->type->name);
|
||||
}
|
||||
if (!l->type->name)
|
||||
{
|
||||
ERR("Failed to copy name.\n");
|
||||
return E_OUTOFMEMORY;
|
||||
}
|
||||
|
||||
case D3D10_CT_TBUFFER:
|
||||
l->type->basetype = D3D10_SVT_TBUFFER;
|
||||
if (!copy_name("tbuffer", &l->type->name))
|
||||
{
|
||||
ERR("Failed to copy name.\n");
|
||||
return E_OUTOFMEMORY;
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
ERR("Unexpected D3D10_CBUFFER_TYPE %#x!\n", d3d10_cbuffer_type);
|
||||
return E_FAIL;
|
||||
flags &= ~IS_TBUFFER;
|
||||
if (flags)
|
||||
{
|
||||
ERR("Unexpected buffer flags %#x.\n", flags);
|
||||
return E_FAIL;
|
||||
}
|
||||
|
||||
l->type->member_count = read_u32(ptr);
|
||||
|
|
|
@ -26,8 +26,7 @@ HRESULT WINAPI D3D10CompileShader(const char *data, SIZE_T data_size, const char
|
|||
const D3D10_SHADER_MACRO *defines, ID3D10Include *include, const char *entrypoint,
|
||||
const char *profile, UINT flags, ID3D10Blob **shader, ID3D10Blob **error_messages)
|
||||
{
|
||||
/* Forward to d3dcompiler */
|
||||
return D3DCompile(data, data_size, filename, defines, include,
|
||||
return D3DCompileFromMemory(data, data_size, filename, defines, include,
|
||||
entrypoint, profile, flags, 0, shader, error_messages);
|
||||
}
|
||||
|
||||
|
@ -37,5 +36,5 @@ HRESULT WINAPI D3D10DisassembleShader(const void *data, SIZE_T data_size,
|
|||
TRACE("data %p, data_size %#Ix, color_code %#x, comments %p, disassembly %p.\n",
|
||||
data, data_size, color_code, comments, disassembly);
|
||||
|
||||
return D3DDisassemble(data, data_size, color_code ? D3D_DISASM_ENABLE_COLOR_CODE : 0, comments, disassembly);
|
||||
return D3DDisassembleCode(data, data_size, color_code ? D3D_DISASM_ENABLE_COLOR_CODE : 0, comments, disassembly);
|
||||
}
|
||||
|
|
|
@ -9147,7 +9147,7 @@ static void test_effect_value_expression(void)
|
|||
ID3D10Device_OMGetBlendState(device, &blend_state, blend_factor, &sample_mask);
|
||||
ok(!blend_state, "Unexpected blend state %p.\n", blend_state);
|
||||
for (idx = 0; idx < ARRAY_SIZE(blend_factor); ++idx)
|
||||
ok(blend_factor[idx] == UINT_MAX, "Got unexpected blend_factor[%u] %.8e.\n", idx, blend_factor[idx]);
|
||||
ok(blend_factor[idx] == (float)UINT_MAX, "Got unexpected blend_factor[%u] %.8e.\n", idx, blend_factor[idx]);
|
||||
ok(!sample_mask, "Got unexpected sample_mask %#x.\n", sample_mask);
|
||||
|
||||
/* movc */
|
||||
|
@ -9875,6 +9875,90 @@ static void test_effect_fx_4_1_blend_state(void)
|
|||
ok(!refcount, "Device has %lu references left.\n", refcount);
|
||||
}
|
||||
|
||||
static void test_effect_compiler(void)
|
||||
{
|
||||
static char empty_effect[] =
|
||||
"technique10 {};";
|
||||
static char empty_buffer[] =
|
||||
"cbuffer cb1 { float4 m1; }\n"
|
||||
"cbuffer cb2 { }\n"
|
||||
"technique10 {};";
|
||||
|
||||
D3D10_EFFECT_VARIABLE_DESC var_desc;
|
||||
ID3D10EffectConstantBuffer *cb;
|
||||
D3D10_EFFECT_DESC desc;
|
||||
ID3D10Device *device;
|
||||
ID3D10Effect *effect;
|
||||
ID3D10Blob *blob;
|
||||
HRESULT hr;
|
||||
|
||||
if (!(device = create_device()))
|
||||
{
|
||||
skip("Failed to create device, skipping tests.\n");
|
||||
return;
|
||||
}
|
||||
|
||||
hr = D3D10CompileEffectFromMemory(empty_effect, sizeof(empty_effect), NULL, NULL, NULL, 0, 0,
|
||||
&blob, NULL);
|
||||
ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
|
||||
|
||||
hr = create_effect(ID3D10Blob_GetBufferPointer(blob), 0, device, NULL, &effect);
|
||||
ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
|
||||
hr = ID3D10Effect_GetDesc(effect, &desc);
|
||||
ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
|
||||
ok(desc.Techniques == 1, "Unexpected technique count %u.\n", desc.Techniques);
|
||||
todo_wine
|
||||
ok(desc.ConstantBuffers == 1, "Unexpected buffer count %u.\n", desc.ConstantBuffers);
|
||||
|
||||
cb = effect->lpVtbl->GetConstantBufferByIndex(effect, 0);
|
||||
hr = cb->lpVtbl->GetDesc(cb, &var_desc);
|
||||
todo_wine
|
||||
ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
|
||||
if (hr == S_OK)
|
||||
ok(!strcmp(var_desc.Name, "$Globals"), "Unexpected variable name %s.\n", var_desc.Name);
|
||||
|
||||
ID3D10Effect_Release(effect);
|
||||
ID3D10Blob_Release(blob);
|
||||
|
||||
/* Empty user buffers. */
|
||||
hr = D3D10CompileEffectFromMemory(empty_buffer, sizeof(empty_buffer), NULL, NULL, NULL, 0, 0,
|
||||
&blob, NULL);
|
||||
ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
|
||||
|
||||
hr = create_effect(ID3D10Blob_GetBufferPointer(blob), 0, device, NULL, &effect);
|
||||
ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
|
||||
hr = ID3D10Effect_GetDesc(effect, &desc);
|
||||
ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
|
||||
ok(desc.Techniques == 1, "Unexpected technique count %u.\n", desc.Techniques);
|
||||
todo_wine
|
||||
ok(desc.ConstantBuffers == 3, "Unexpected buffer count %u.\n", desc.ConstantBuffers);
|
||||
|
||||
cb = effect->lpVtbl->GetConstantBufferByIndex(effect, 0);
|
||||
hr = cb->lpVtbl->GetDesc(cb, &var_desc);
|
||||
ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
|
||||
todo_wine
|
||||
ok(!strcmp(var_desc.Name, "$Globals"), "Unexpected variable name %s.\n", var_desc.Name);
|
||||
|
||||
cb = effect->lpVtbl->GetConstantBufferByIndex(effect, 1);
|
||||
hr = cb->lpVtbl->GetDesc(cb, &var_desc);
|
||||
todo_wine
|
||||
ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
|
||||
if (hr == S_OK)
|
||||
ok(!strcmp(var_desc.Name, "cb1"), "Unexpected variable name %s.\n", var_desc.Name);
|
||||
|
||||
cb = effect->lpVtbl->GetConstantBufferByIndex(effect, 2);
|
||||
hr = cb->lpVtbl->GetDesc(cb, &var_desc);
|
||||
todo_wine
|
||||
ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
|
||||
if (hr == S_OK)
|
||||
ok(!strcmp(var_desc.Name, "cb2"), "Unexpected variable name %s.\n", var_desc.Name);
|
||||
|
||||
ID3D10Effect_Release(effect);
|
||||
ID3D10Blob_Release(blob);
|
||||
|
||||
ID3D10Device_Release(device);
|
||||
}
|
||||
|
||||
START_TEST(effect)
|
||||
{
|
||||
test_effect_constant_buffer_type();
|
||||
|
@ -9903,4 +9987,5 @@ START_TEST(effect)
|
|||
test_effect_value_expression();
|
||||
test_effect_fx_4_1();
|
||||
test_effect_fx_4_1_blend_state();
|
||||
test_effect_compiler();
|
||||
}
|
||||
|
|
|
@ -1039,6 +1039,44 @@ static void test_fx_4_1_blend_state(void)
|
|||
ok(!refcount, "Device has %lu references left.\n", refcount);
|
||||
}
|
||||
|
||||
static void test_shader_profiles(void)
|
||||
{
|
||||
const char *profile;
|
||||
|
||||
profile = D3D10GetVertexShaderProfile(NULL);
|
||||
ok(!strcmp(profile, "vs_4_0"), "Unexpected profile %s.\n", profile);
|
||||
|
||||
profile = D3D10GetGeometryShaderProfile(NULL);
|
||||
ok(!strcmp(profile, "gs_4_0"), "Unexpected profile %s.\n", profile);
|
||||
|
||||
profile = D3D10GetPixelShaderProfile(NULL);
|
||||
ok(!strcmp(profile, "ps_4_0"), "Unexpected profile %s.\n", profile);
|
||||
}
|
||||
|
||||
static void test_compile_effect(void)
|
||||
{
|
||||
char default_bs_source[] = "BlendState default_blend_state {};";
|
||||
char bs_source2[] =
|
||||
"BlendState blend_state\n"
|
||||
"{\n"
|
||||
" srcblend[0] = zero;\n"
|
||||
"};";
|
||||
ID3D10Blob *blob;
|
||||
HRESULT hr;
|
||||
|
||||
hr = D3D10CompileEffectFromMemory(default_bs_source, strlen(default_bs_source),
|
||||
NULL, NULL, NULL, 0, 0, &blob, NULL);
|
||||
todo_wine
|
||||
ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
|
||||
if (SUCCEEDED(hr))
|
||||
ID3D10Blob_Release(blob);
|
||||
|
||||
/* Compilation fails due to 10.1 feature incompatibility with fx_4_0 profile. */
|
||||
hr = D3D10CompileEffectFromMemory(bs_source2, strlen(bs_source2), NULL, NULL, NULL,
|
||||
0, 0, &blob, NULL);
|
||||
ok(hr == E_FAIL, "Unexpected hr %#lx.\n", hr);
|
||||
}
|
||||
|
||||
START_TEST(d3d10_1)
|
||||
{
|
||||
test_create_device();
|
||||
|
@ -1047,4 +1085,6 @@ START_TEST(d3d10_1)
|
|||
test_create_blend_state();
|
||||
test_getdc();
|
||||
test_fx_4_1_blend_state();
|
||||
test_shader_profiles();
|
||||
test_compile_effect();
|
||||
}
|
||||
|
|
|
@ -4162,6 +4162,35 @@ static HRESULT STDMETHODCALLTYPE d3d11_device_CheckFeatureSupport(ID3D11Device2
|
|||
return S_OK;
|
||||
}
|
||||
|
||||
case D3D11_FEATURE_D3D11_OPTIONS2:
|
||||
{
|
||||
D3D11_FEATURE_DATA_D3D11_OPTIONS2 *options = feature_support_data;
|
||||
if (feature_support_data_size != sizeof(*options))
|
||||
{
|
||||
WARN("Invalid data size.\n");
|
||||
return E_INVALIDARG;
|
||||
}
|
||||
|
||||
wined3d_mutex_lock();
|
||||
hr = wined3d_device_get_device_caps(device->wined3d_device, &wined3d_caps);
|
||||
wined3d_mutex_unlock();
|
||||
if (FAILED(hr))
|
||||
{
|
||||
WARN("Failed to get device caps, hr %#lx.\n", hr);
|
||||
return hr;
|
||||
}
|
||||
|
||||
options->PSSpecifiedStencilRefSupported = wined3d_caps.stencil_export;
|
||||
options->TypedUAVLoadAdditionalFormats = FALSE;
|
||||
options->ROVsSupported = FALSE;
|
||||
options->ConservativeRasterizationTier = D3D11_CONSERVATIVE_RASTERIZATION_NOT_SUPPORTED;
|
||||
options->TiledResourcesTier = D3D11_TILED_RESOURCES_NOT_SUPPORTED;
|
||||
options->MapOnDefaultTextures = FALSE;
|
||||
options->StandardSwizzle = FALSE;
|
||||
options->UnifiedMemoryArchitecture = FALSE;
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
case D3D11_FEATURE_D3D11_OPTIONS3:
|
||||
{
|
||||
D3D11_FEATURE_DATA_D3D11_OPTIONS3 *options = feature_support_data;
|
||||
|
|
|
@ -21,6 +21,7 @@
|
|||
#include <float.h>
|
||||
#include <limits.h>
|
||||
#include <math.h>
|
||||
#include <stdbool.h>
|
||||
#include <stdlib.h>
|
||||
#define COBJMACROS
|
||||
#include "initguid.h"
|
||||
|
@ -1646,6 +1647,16 @@ static BOOL check_compute_shaders_via_sm4_support(ID3D11Device *device)
|
|||
return options.ComputeShaders_Plus_RawAndStructuredBuffers_Via_Shader_4_x;
|
||||
}
|
||||
|
||||
static bool check_stencil_ref_export_support(ID3D11Device *device)
|
||||
{
|
||||
D3D11_FEATURE_DATA_D3D11_OPTIONS2 options;
|
||||
|
||||
if (FAILED(ID3D11Device_CheckFeatureSupport(device,
|
||||
D3D11_FEATURE_D3D11_OPTIONS2, &options, sizeof(options))))
|
||||
return false;
|
||||
return options.PSSpecifiedStencilRefSupported;
|
||||
}
|
||||
|
||||
static BOOL check_viewport_array_index_from_any_shader_support(ID3D11Device *device)
|
||||
{
|
||||
D3D11_FEATURE_DATA_D3D11_OPTIONS3 options;
|
||||
|
@ -35452,6 +35463,707 @@ static void test_clear_during_render(void)
|
|||
release_test_context(&test_context);
|
||||
}
|
||||
|
||||
static void test_stencil_export(void)
|
||||
{
|
||||
D3D11_SHADER_RESOURCE_VIEW_DESC srv_desc;
|
||||
D3D11_DEPTH_STENCIL_VIEW_DESC dsv_desc;
|
||||
struct d3d11_test_context test_context;
|
||||
D3D11_DEPTH_STENCIL_DESC ds_desc = {0};
|
||||
ID3D11DepthStencilState *ds_state;
|
||||
D3D11_TEXTURE2D_DESC texture_desc;
|
||||
ID3D11PixelShader *ps, *ps_sample;
|
||||
ID3D11ShaderResourceView *srv;
|
||||
ID3D11DeviceContext *context;
|
||||
struct resource_readback rb;
|
||||
ID3D11DepthStencilView *dsv;
|
||||
ID3D11RenderTargetView *rtv;
|
||||
ID3D11Texture2D *rt, *ds;
|
||||
ID3D11Device *device;
|
||||
ID3D11Buffer *cb;
|
||||
HRESULT hr;
|
||||
|
||||
static const DWORD ps_code[] =
|
||||
{
|
||||
#if 0
|
||||
uint stencil_ref;
|
||||
|
||||
uint main() : SV_StencilRef
|
||||
{
|
||||
return stencil_ref;
|
||||
}
|
||||
#endif
|
||||
0x43425844, 0x3980cb16, 0xbbe87d38, 0xb93f7c61, 0x200c41ed, 0x00000001, 0x000000cc, 0x00000004,
|
||||
0x00000030, 0x00000040, 0x00000078, 0x000000bc, 0x4e475349, 0x00000008, 0x00000000, 0x00000008,
|
||||
0x4e47534f, 0x00000030, 0x00000001, 0x00000008, 0x00000020, 0x00000000, 0x00000000, 0x00000001,
|
||||
0xffffffff, 0x00000e01, 0x535f5653, 0x636e6574, 0x65526c69, 0xabab0066, 0x58454853, 0x0000003c,
|
||||
0x00000050, 0x0000000f, 0x0100086a, 0x04000059, 0x00208e46, 0x00000000, 0x00000001, 0x02000065,
|
||||
0x00029001, 0x05000036, 0x00029001, 0x0020800a, 0x00000000, 0x00000000, 0x0100003e, 0x30494653,
|
||||
0x00000008, 0x00000200, 0x00000000,
|
||||
};
|
||||
static const DWORD ps_sample_code[] =
|
||||
{
|
||||
#if 0
|
||||
Texture2D<uint4> tex : register(t0);
|
||||
|
||||
uint4 main(float4 pos : SV_Position) : SV_TARGET
|
||||
{
|
||||
return tex[uint2(pos.xy)].g;
|
||||
}
|
||||
#endif
|
||||
0x43425844, 0xdd1e98d4, 0x53c81701, 0x576f6b2e, 0x040b18bb, 0x00000001, 0x0000014c, 0x00000003,
|
||||
0x0000002c, 0x00000060, 0x00000094, 0x4e475349, 0x0000002c, 0x00000001, 0x00000008, 0x00000020,
|
||||
0x00000000, 0x00000001, 0x00000003, 0x00000000, 0x0000030f, 0x505f5653, 0x7469736f, 0x006e6f69,
|
||||
0x4e47534f, 0x0000002c, 0x00000001, 0x00000008, 0x00000020, 0x00000000, 0x00000000, 0x00000001,
|
||||
0x00000000, 0x0000000f, 0x545f5653, 0x45475241, 0xabab0054, 0x58454853, 0x000000b0, 0x00000050,
|
||||
0x0000002c, 0x0100086a, 0x04001858, 0x00107000, 0x00000000, 0x00004444, 0x04002064, 0x00101032,
|
||||
0x00000000, 0x00000001, 0x03000065, 0x001020f2, 0x00000000, 0x02000068, 0x00000001, 0x0500001c,
|
||||
0x00100032, 0x00000000, 0x00101046, 0x00000000, 0x08000036, 0x001000c2, 0x00000000, 0x00004002,
|
||||
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x8900002d, 0x800000c2, 0x00111103, 0x00100012,
|
||||
0x00000000, 0x00100e46, 0x00000000, 0x00107e16, 0x00000000, 0x05000036, 0x001020f2, 0x00000000,
|
||||
0x00100006, 0x00000000, 0x0100003e,
|
||||
};
|
||||
static const float black[] = {0.0f, 0.0f, 0.0f, 0.0f};
|
||||
static const DWORD cb_data[4] = {0xff};
|
||||
|
||||
if (!init_test_context(&test_context, NULL))
|
||||
return;
|
||||
|
||||
device = test_context.device;
|
||||
context = test_context.immediate_context;
|
||||
|
||||
if (!check_stencil_ref_export_support(device))
|
||||
{
|
||||
skip("The device does not support stencil ref export.\n");
|
||||
release_test_context(&test_context);
|
||||
return;
|
||||
}
|
||||
|
||||
ID3D11Texture2D_GetDesc(test_context.backbuffer, &texture_desc);
|
||||
texture_desc.Format = DXGI_FORMAT_R8_UINT;
|
||||
hr = ID3D11Device_CreateTexture2D(device, &texture_desc, NULL, &rt);
|
||||
ok(hr == S_OK, "Got hr %#lx.\n", hr);
|
||||
hr = ID3D11Device_CreateRenderTargetView(device, (ID3D11Resource *)rt, NULL, &rtv);
|
||||
ok(hr == S_OK, "Got hr %#lx.\n", hr);
|
||||
|
||||
ID3D11Texture2D_GetDesc(test_context.backbuffer, &texture_desc);
|
||||
texture_desc.Format = DXGI_FORMAT_R32G8X24_TYPELESS;
|
||||
texture_desc.BindFlags = D3D11_BIND_DEPTH_STENCIL | D3D11_BIND_SHADER_RESOURCE;
|
||||
hr = ID3D11Device_CreateTexture2D(device, &texture_desc, NULL, &ds);
|
||||
ok(hr == S_OK, "Got hr %#lx.\n", hr);
|
||||
dsv_desc.Format = DXGI_FORMAT_D32_FLOAT_S8X24_UINT;
|
||||
dsv_desc.ViewDimension = D3D11_DSV_DIMENSION_TEXTURE2D;
|
||||
dsv_desc.Flags = 0;
|
||||
dsv_desc.Texture2D.MipSlice = 0;
|
||||
hr = ID3D11Device_CreateDepthStencilView(device, (ID3D11Resource *)ds, &dsv_desc, &dsv);
|
||||
ok(hr == S_OK, "Got hr %#lx.\n", hr);
|
||||
srv_desc.Format = DXGI_FORMAT_X32_TYPELESS_G8X24_UINT;
|
||||
srv_desc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE2D;
|
||||
srv_desc.Texture2D.MostDetailedMip = 0;
|
||||
srv_desc.Texture2D.MipLevels = 1;
|
||||
hr = ID3D11Device_CreateShaderResourceView(device, (ID3D11Resource *)ds, &srv_desc, &srv);
|
||||
ok(hr == S_OK, "Got hr %#lx.\n", hr);
|
||||
|
||||
ds_desc.DepthFunc = D3D11_COMPARISON_NEVER;
|
||||
ds_desc.StencilEnable = TRUE,
|
||||
ds_desc.StencilReadMask = D3D11_DEFAULT_STENCIL_READ_MASK,
|
||||
ds_desc.StencilWriteMask = D3D11_DEFAULT_STENCIL_WRITE_MASK,
|
||||
ds_desc.FrontFace.StencilFailOp = D3D11_STENCIL_OP_REPLACE,
|
||||
ds_desc.FrontFace.StencilDepthFailOp = D3D11_STENCIL_OP_REPLACE,
|
||||
ds_desc.FrontFace.StencilPassOp = D3D11_STENCIL_OP_REPLACE,
|
||||
ds_desc.FrontFace.StencilFunc = D3D11_COMPARISON_ALWAYS,
|
||||
ds_desc.BackFace = ds_desc.FrontFace;
|
||||
hr = ID3D11Device_CreateDepthStencilState(device, &ds_desc, &ds_state);
|
||||
ok(hr == S_OK, "Got hr %#lx.\n", hr);
|
||||
|
||||
hr = ID3D11Device_CreatePixelShader(device, ps_code, sizeof(ps_code), NULL, &ps);
|
||||
ok(hr == S_OK, "Got hr %#lx.\n", hr);
|
||||
hr = ID3D11Device_CreatePixelShader(device, ps_sample_code, sizeof(ps_sample_code), NULL, &ps_sample);
|
||||
ok(hr == S_OK, "Got hr %#lx.\n", hr);
|
||||
|
||||
cb = create_buffer(device, D3D11_BIND_CONSTANT_BUFFER, sizeof(cb_data), cb_data);
|
||||
|
||||
ID3D11DeviceContext_ClearDepthStencilView(context, dsv, D3D11_CLEAR_STENCIL, 0.0f, 0x80);
|
||||
ID3D11DeviceContext_OMSetRenderTargets(context, 1, &rtv, dsv);
|
||||
ID3D11DeviceContext_OMSetDepthStencilState(context, ds_state, 0);
|
||||
ID3D11DeviceContext_PSSetShader(context, ps, NULL, 0);
|
||||
ID3D11DeviceContext_PSSetConstantBuffers(context, 0, 1, &cb);
|
||||
draw_quad(&test_context);
|
||||
|
||||
ID3D11DeviceContext_OMSetRenderTargets(context, 1, &rtv, NULL);
|
||||
ID3D11DeviceContext_ClearRenderTargetView(context, rtv, black);
|
||||
ID3D11DeviceContext_PSSetShaderResources(context, 0, 1, &srv);
|
||||
ID3D11DeviceContext_PSSetShader(context, ps_sample, NULL, 0);
|
||||
draw_quad(&test_context);
|
||||
|
||||
get_texture_readback(rt, 0, &rb);
|
||||
check_readback_data_u8(&rb, NULL, 0xff, 0);
|
||||
release_resource_readback(&rb);
|
||||
|
||||
ID3D11ShaderResourceView_Release(srv);
|
||||
ID3D11Buffer_Release(cb);
|
||||
ID3D11PixelShader_Release(ps);
|
||||
ID3D11PixelShader_Release(ps_sample);
|
||||
ID3D11DepthStencilState_Release(ds_state);
|
||||
ID3D11Texture2D_Release(rt);
|
||||
ID3D11Texture2D_Release(ds);
|
||||
ID3D11RenderTargetView_Release(rtv);
|
||||
ID3D11DepthStencilView_Release(dsv);
|
||||
release_test_context(&test_context);
|
||||
}
|
||||
|
||||
static void test_high_resource_count(void)
|
||||
{
|
||||
D3D11_TEXTURE2D_DESC texture_desc = {0};
|
||||
struct d3d11_test_context test_context;
|
||||
D3D11_SAMPLER_DESC sampler_desc = {0};
|
||||
D3D11_BUFFER_DESC buffer_desc = {0};
|
||||
ID3D11ShaderResourceView *srvs[100];
|
||||
ID3D11Texture2D *textures[50], *rt;
|
||||
D3D11_MAPPED_SUBRESOURCE map_desc;
|
||||
ID3D11SamplerState *samplers[2];
|
||||
ID3D11DeviceContext *context;
|
||||
ID3D11RenderTargetView *rtv;
|
||||
ID3D11Buffer *buffers[50];
|
||||
ID3D11PixelShader *ps;
|
||||
ID3D11Device *device;
|
||||
float *data_ptr;
|
||||
HRESULT hr;
|
||||
|
||||
static const struct vec4 expect = {1274.0f, 637.0f, 1225.0f, 0.0f};
|
||||
static const struct vec4 expect2 = {1274.0f, 637.0f, 1325.0f, 0.0f};
|
||||
|
||||
static const DWORD ps_code[] =
|
||||
{
|
||||
#if 0
|
||||
Texture2D<float> tex[50];
|
||||
Buffer<float> buf[50];
|
||||
|
||||
SamplerState point_sampler, linear_sampler;
|
||||
|
||||
float4 main() : SV_Target
|
||||
{
|
||||
float4 ret = 0;
|
||||
|
||||
for (uint i = 0; i < 50; ++i)
|
||||
{
|
||||
ret.x += tex[i].Sample(point_sampler, 0.5);
|
||||
ret.y += tex[i].Sample(linear_sampler, 0.5);
|
||||
ret.z += buf[i].Load(0);
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
#endif
|
||||
0x43425844, 0xa909dad8, 0x13f3f278, 0x34767ac9, 0x7c08344c, 0x00000001, 0x000031a8, 0x00000003,
|
||||
0x0000002c, 0x0000003c, 0x00000070, 0x4e475349, 0x00000008, 0x00000000, 0x00000008, 0x4e47534f,
|
||||
0x0000002c, 0x00000001, 0x00000008, 0x00000020, 0x00000000, 0x00000000, 0x00000003, 0x00000000,
|
||||
0x0000000f, 0x545f5653, 0x65677261, 0xabab0074, 0x52444853, 0x00003130, 0x00000040, 0x00000c4c,
|
||||
0x0300005a, 0x00106000, 0x00000000, 0x0300005a, 0x00106000, 0x00000001, 0x04001858, 0x00107000,
|
||||
0x00000000, 0x00005555, 0x04001858, 0x00107000, 0x00000001, 0x00005555, 0x04001858, 0x00107000,
|
||||
0x00000002, 0x00005555, 0x04001858, 0x00107000, 0x00000003, 0x00005555, 0x04001858, 0x00107000,
|
||||
0x00000004, 0x00005555, 0x04001858, 0x00107000, 0x00000005, 0x00005555, 0x04001858, 0x00107000,
|
||||
0x00000006, 0x00005555, 0x04001858, 0x00107000, 0x00000007, 0x00005555, 0x04001858, 0x00107000,
|
||||
0x00000008, 0x00005555, 0x04001858, 0x00107000, 0x00000009, 0x00005555, 0x04001858, 0x00107000,
|
||||
0x0000000a, 0x00005555, 0x04001858, 0x00107000, 0x0000000b, 0x00005555, 0x04001858, 0x00107000,
|
||||
0x0000000c, 0x00005555, 0x04001858, 0x00107000, 0x0000000d, 0x00005555, 0x04001858, 0x00107000,
|
||||
0x0000000e, 0x00005555, 0x04001858, 0x00107000, 0x0000000f, 0x00005555, 0x04001858, 0x00107000,
|
||||
0x00000010, 0x00005555, 0x04001858, 0x00107000, 0x00000011, 0x00005555, 0x04001858, 0x00107000,
|
||||
0x00000012, 0x00005555, 0x04001858, 0x00107000, 0x00000013, 0x00005555, 0x04001858, 0x00107000,
|
||||
0x00000014, 0x00005555, 0x04001858, 0x00107000, 0x00000015, 0x00005555, 0x04001858, 0x00107000,
|
||||
0x00000016, 0x00005555, 0x04001858, 0x00107000, 0x00000017, 0x00005555, 0x04001858, 0x00107000,
|
||||
0x00000018, 0x00005555, 0x04001858, 0x00107000, 0x00000019, 0x00005555, 0x04001858, 0x00107000,
|
||||
0x0000001a, 0x00005555, 0x04001858, 0x00107000, 0x0000001b, 0x00005555, 0x04001858, 0x00107000,
|
||||
0x0000001c, 0x00005555, 0x04001858, 0x00107000, 0x0000001d, 0x00005555, 0x04001858, 0x00107000,
|
||||
0x0000001e, 0x00005555, 0x04001858, 0x00107000, 0x0000001f, 0x00005555, 0x04001858, 0x00107000,
|
||||
0x00000020, 0x00005555, 0x04001858, 0x00107000, 0x00000021, 0x00005555, 0x04001858, 0x00107000,
|
||||
0x00000022, 0x00005555, 0x04001858, 0x00107000, 0x00000023, 0x00005555, 0x04001858, 0x00107000,
|
||||
0x00000024, 0x00005555, 0x04001858, 0x00107000, 0x00000025, 0x00005555, 0x04001858, 0x00107000,
|
||||
0x00000026, 0x00005555, 0x04001858, 0x00107000, 0x00000027, 0x00005555, 0x04001858, 0x00107000,
|
||||
0x00000028, 0x00005555, 0x04001858, 0x00107000, 0x00000029, 0x00005555, 0x04001858, 0x00107000,
|
||||
0x0000002a, 0x00005555, 0x04001858, 0x00107000, 0x0000002b, 0x00005555, 0x04001858, 0x00107000,
|
||||
0x0000002c, 0x00005555, 0x04001858, 0x00107000, 0x0000002d, 0x00005555, 0x04001858, 0x00107000,
|
||||
0x0000002e, 0x00005555, 0x04001858, 0x00107000, 0x0000002f, 0x00005555, 0x04001858, 0x00107000,
|
||||
0x00000030, 0x00005555, 0x04001858, 0x00107000, 0x00000031, 0x00005555, 0x04000858, 0x00107000,
|
||||
0x00000032, 0x00005555, 0x04000858, 0x00107000, 0x00000033, 0x00005555, 0x04000858, 0x00107000,
|
||||
0x00000034, 0x00005555, 0x04000858, 0x00107000, 0x00000035, 0x00005555, 0x04000858, 0x00107000,
|
||||
0x00000036, 0x00005555, 0x04000858, 0x00107000, 0x00000037, 0x00005555, 0x04000858, 0x00107000,
|
||||
0x00000038, 0x00005555, 0x04000858, 0x00107000, 0x00000039, 0x00005555, 0x04000858, 0x00107000,
|
||||
0x0000003a, 0x00005555, 0x04000858, 0x00107000, 0x0000003b, 0x00005555, 0x04000858, 0x00107000,
|
||||
0x0000003c, 0x00005555, 0x04000858, 0x00107000, 0x0000003d, 0x00005555, 0x04000858, 0x00107000,
|
||||
0x0000003e, 0x00005555, 0x04000858, 0x00107000, 0x0000003f, 0x00005555, 0x04000858, 0x00107000,
|
||||
0x00000040, 0x00005555, 0x04000858, 0x00107000, 0x00000041, 0x00005555, 0x04000858, 0x00107000,
|
||||
0x00000042, 0x00005555, 0x04000858, 0x00107000, 0x00000043, 0x00005555, 0x04000858, 0x00107000,
|
||||
0x00000044, 0x00005555, 0x04000858, 0x00107000, 0x00000045, 0x00005555, 0x04000858, 0x00107000,
|
||||
0x00000046, 0x00005555, 0x04000858, 0x00107000, 0x00000047, 0x00005555, 0x04000858, 0x00107000,
|
||||
0x00000048, 0x00005555, 0x04000858, 0x00107000, 0x00000049, 0x00005555, 0x04000858, 0x00107000,
|
||||
0x0000004a, 0x00005555, 0x04000858, 0x00107000, 0x0000004b, 0x00005555, 0x04000858, 0x00107000,
|
||||
0x0000004c, 0x00005555, 0x04000858, 0x00107000, 0x0000004d, 0x00005555, 0x04000858, 0x00107000,
|
||||
0x0000004e, 0x00005555, 0x04000858, 0x00107000, 0x0000004f, 0x00005555, 0x04000858, 0x00107000,
|
||||
0x00000050, 0x00005555, 0x04000858, 0x00107000, 0x00000051, 0x00005555, 0x04000858, 0x00107000,
|
||||
0x00000052, 0x00005555, 0x04000858, 0x00107000, 0x00000053, 0x00005555, 0x04000858, 0x00107000,
|
||||
0x00000054, 0x00005555, 0x04000858, 0x00107000, 0x00000055, 0x00005555, 0x04000858, 0x00107000,
|
||||
0x00000056, 0x00005555, 0x04000858, 0x00107000, 0x00000057, 0x00005555, 0x04000858, 0x00107000,
|
||||
0x00000058, 0x00005555, 0x04000858, 0x00107000, 0x00000059, 0x00005555, 0x04000858, 0x00107000,
|
||||
0x0000005a, 0x00005555, 0x04000858, 0x00107000, 0x0000005b, 0x00005555, 0x04000858, 0x00107000,
|
||||
0x0000005c, 0x00005555, 0x04000858, 0x00107000, 0x0000005d, 0x00005555, 0x04000858, 0x00107000,
|
||||
0x0000005e, 0x00005555, 0x04000858, 0x00107000, 0x0000005f, 0x00005555, 0x04000858, 0x00107000,
|
||||
0x00000060, 0x00005555, 0x04000858, 0x00107000, 0x00000061, 0x00005555, 0x04000858, 0x00107000,
|
||||
0x00000062, 0x00005555, 0x04000858, 0x00107000, 0x00000063, 0x00005555, 0x03000065, 0x001020f2,
|
||||
0x00000000, 0x02000068, 0x00000002, 0x0c000045, 0x001000f2, 0x00000000, 0x00004002, 0x3f000000,
|
||||
0x3f000000, 0x00000000, 0x00000000, 0x00107e46, 0x00000000, 0x00106000, 0x00000000, 0x0c000045,
|
||||
0x001000f2, 0x00000001, 0x00004002, 0x3f000000, 0x3f000000, 0x00000000, 0x00000000, 0x00107e46,
|
||||
0x00000001, 0x00106000, 0x00000000, 0x07000000, 0x00100012, 0x00000000, 0x0010000a, 0x00000000,
|
||||
0x0010000a, 0x00000001, 0x0c000045, 0x001000f2, 0x00000001, 0x00004002, 0x3f000000, 0x3f000000,
|
||||
0x00000000, 0x00000000, 0x00107e46, 0x00000002, 0x00106000, 0x00000000, 0x07000000, 0x00100012,
|
||||
0x00000000, 0x0010000a, 0x00000000, 0x0010000a, 0x00000001, 0x0c000045, 0x001000f2, 0x00000001,
|
||||
0x00004002, 0x3f000000, 0x3f000000, 0x00000000, 0x00000000, 0x00107e46, 0x00000003, 0x00106000,
|
||||
0x00000000, 0x07000000, 0x00100012, 0x00000000, 0x0010000a, 0x00000000, 0x0010000a, 0x00000001,
|
||||
0x0c000045, 0x001000f2, 0x00000001, 0x00004002, 0x3f000000, 0x3f000000, 0x00000000, 0x00000000,
|
||||
0x00107e46, 0x00000004, 0x00106000, 0x00000000, 0x07000000, 0x00100012, 0x00000000, 0x0010000a,
|
||||
0x00000000, 0x0010000a, 0x00000001, 0x0c000045, 0x001000f2, 0x00000001, 0x00004002, 0x3f000000,
|
||||
0x3f000000, 0x00000000, 0x00000000, 0x00107e46, 0x00000005, 0x00106000, 0x00000000, 0x07000000,
|
||||
0x00100012, 0x00000000, 0x0010000a, 0x00000000, 0x0010000a, 0x00000001, 0x0c000045, 0x001000f2,
|
||||
0x00000001, 0x00004002, 0x3f000000, 0x3f000000, 0x00000000, 0x00000000, 0x00107e46, 0x00000006,
|
||||
0x00106000, 0x00000000, 0x07000000, 0x00100012, 0x00000000, 0x0010000a, 0x00000000, 0x0010000a,
|
||||
0x00000001, 0x0c000045, 0x001000f2, 0x00000001, 0x00004002, 0x3f000000, 0x3f000000, 0x00000000,
|
||||
0x00000000, 0x00107e46, 0x00000007, 0x00106000, 0x00000000, 0x07000000, 0x00100012, 0x00000000,
|
||||
0x0010000a, 0x00000000, 0x0010000a, 0x00000001, 0x0c000045, 0x001000f2, 0x00000001, 0x00004002,
|
||||
0x3f000000, 0x3f000000, 0x00000000, 0x00000000, 0x00107e46, 0x00000008, 0x00106000, 0x00000000,
|
||||
0x07000000, 0x00100012, 0x00000000, 0x0010000a, 0x00000000, 0x0010000a, 0x00000001, 0x0c000045,
|
||||
0x001000f2, 0x00000001, 0x00004002, 0x3f000000, 0x3f000000, 0x00000000, 0x00000000, 0x00107e46,
|
||||
0x00000009, 0x00106000, 0x00000000, 0x07000000, 0x00100012, 0x00000000, 0x0010000a, 0x00000000,
|
||||
0x0010000a, 0x00000001, 0x0c000045, 0x001000f2, 0x00000001, 0x00004002, 0x3f000000, 0x3f000000,
|
||||
0x00000000, 0x00000000, 0x00107e46, 0x0000000a, 0x00106000, 0x00000000, 0x07000000, 0x00100012,
|
||||
0x00000000, 0x0010000a, 0x00000000, 0x0010000a, 0x00000001, 0x0c000045, 0x001000f2, 0x00000001,
|
||||
0x00004002, 0x3f000000, 0x3f000000, 0x00000000, 0x00000000, 0x00107e46, 0x0000000b, 0x00106000,
|
||||
0x00000000, 0x07000000, 0x00100012, 0x00000000, 0x0010000a, 0x00000000, 0x0010000a, 0x00000001,
|
||||
0x0c000045, 0x001000f2, 0x00000001, 0x00004002, 0x3f000000, 0x3f000000, 0x00000000, 0x00000000,
|
||||
0x00107e46, 0x0000000c, 0x00106000, 0x00000000, 0x07000000, 0x00100012, 0x00000000, 0x0010000a,
|
||||
0x00000000, 0x0010000a, 0x00000001, 0x0c000045, 0x001000f2, 0x00000001, 0x00004002, 0x3f000000,
|
||||
0x3f000000, 0x00000000, 0x00000000, 0x00107e46, 0x0000000d, 0x00106000, 0x00000000, 0x07000000,
|
||||
0x00100012, 0x00000000, 0x0010000a, 0x00000000, 0x0010000a, 0x00000001, 0x0c000045, 0x001000f2,
|
||||
0x00000001, 0x00004002, 0x3f000000, 0x3f000000, 0x00000000, 0x00000000, 0x00107e46, 0x0000000e,
|
||||
0x00106000, 0x00000000, 0x07000000, 0x00100012, 0x00000000, 0x0010000a, 0x00000000, 0x0010000a,
|
||||
0x00000001, 0x0c000045, 0x001000f2, 0x00000001, 0x00004002, 0x3f000000, 0x3f000000, 0x00000000,
|
||||
0x00000000, 0x00107e46, 0x0000000f, 0x00106000, 0x00000000, 0x07000000, 0x00100012, 0x00000000,
|
||||
0x0010000a, 0x00000000, 0x0010000a, 0x00000001, 0x0c000045, 0x001000f2, 0x00000001, 0x00004002,
|
||||
0x3f000000, 0x3f000000, 0x00000000, 0x00000000, 0x00107e46, 0x00000010, 0x00106000, 0x00000000,
|
||||
0x07000000, 0x00100012, 0x00000000, 0x0010000a, 0x00000000, 0x0010000a, 0x00000001, 0x0c000045,
|
||||
0x001000f2, 0x00000001, 0x00004002, 0x3f000000, 0x3f000000, 0x00000000, 0x00000000, 0x00107e46,
|
||||
0x00000011, 0x00106000, 0x00000000, 0x07000000, 0x00100012, 0x00000000, 0x0010000a, 0x00000000,
|
||||
0x0010000a, 0x00000001, 0x0c000045, 0x001000f2, 0x00000001, 0x00004002, 0x3f000000, 0x3f000000,
|
||||
0x00000000, 0x00000000, 0x00107e46, 0x00000012, 0x00106000, 0x00000000, 0x07000000, 0x00100012,
|
||||
0x00000000, 0x0010000a, 0x00000000, 0x0010000a, 0x00000001, 0x0c000045, 0x001000f2, 0x00000001,
|
||||
0x00004002, 0x3f000000, 0x3f000000, 0x00000000, 0x00000000, 0x00107e46, 0x00000013, 0x00106000,
|
||||
0x00000000, 0x07000000, 0x00100012, 0x00000000, 0x0010000a, 0x00000000, 0x0010000a, 0x00000001,
|
||||
0x0c000045, 0x001000f2, 0x00000001, 0x00004002, 0x3f000000, 0x3f000000, 0x00000000, 0x00000000,
|
||||
0x00107e46, 0x00000014, 0x00106000, 0x00000000, 0x07000000, 0x00100012, 0x00000000, 0x0010000a,
|
||||
0x00000000, 0x0010000a, 0x00000001, 0x0c000045, 0x001000f2, 0x00000001, 0x00004002, 0x3f000000,
|
||||
0x3f000000, 0x00000000, 0x00000000, 0x00107e46, 0x00000015, 0x00106000, 0x00000000, 0x07000000,
|
||||
0x00100012, 0x00000000, 0x0010000a, 0x00000000, 0x0010000a, 0x00000001, 0x0c000045, 0x001000f2,
|
||||
0x00000001, 0x00004002, 0x3f000000, 0x3f000000, 0x00000000, 0x00000000, 0x00107e46, 0x00000016,
|
||||
0x00106000, 0x00000000, 0x07000000, 0x00100012, 0x00000000, 0x0010000a, 0x00000000, 0x0010000a,
|
||||
0x00000001, 0x0c000045, 0x001000f2, 0x00000001, 0x00004002, 0x3f000000, 0x3f000000, 0x00000000,
|
||||
0x00000000, 0x00107e46, 0x00000017, 0x00106000, 0x00000000, 0x07000000, 0x00100012, 0x00000000,
|
||||
0x0010000a, 0x00000000, 0x0010000a, 0x00000001, 0x0c000045, 0x001000f2, 0x00000001, 0x00004002,
|
||||
0x3f000000, 0x3f000000, 0x00000000, 0x00000000, 0x00107e46, 0x00000018, 0x00106000, 0x00000000,
|
||||
0x07000000, 0x00100012, 0x00000000, 0x0010000a, 0x00000000, 0x0010000a, 0x00000001, 0x0c000045,
|
||||
0x001000f2, 0x00000001, 0x00004002, 0x3f000000, 0x3f000000, 0x00000000, 0x00000000, 0x00107e46,
|
||||
0x00000019, 0x00106000, 0x00000000, 0x07000000, 0x00100012, 0x00000000, 0x0010000a, 0x00000000,
|
||||
0x0010000a, 0x00000001, 0x0c000045, 0x001000f2, 0x00000001, 0x00004002, 0x3f000000, 0x3f000000,
|
||||
0x00000000, 0x00000000, 0x00107e46, 0x0000001a, 0x00106000, 0x00000000, 0x07000000, 0x00100012,
|
||||
0x00000000, 0x0010000a, 0x00000000, 0x0010000a, 0x00000001, 0x0c000045, 0x001000f2, 0x00000001,
|
||||
0x00004002, 0x3f000000, 0x3f000000, 0x00000000, 0x00000000, 0x00107e46, 0x0000001b, 0x00106000,
|
||||
0x00000000, 0x07000000, 0x00100012, 0x00000000, 0x0010000a, 0x00000000, 0x0010000a, 0x00000001,
|
||||
0x0c000045, 0x001000f2, 0x00000001, 0x00004002, 0x3f000000, 0x3f000000, 0x00000000, 0x00000000,
|
||||
0x00107e46, 0x0000001c, 0x00106000, 0x00000000, 0x07000000, 0x00100012, 0x00000000, 0x0010000a,
|
||||
0x00000000, 0x0010000a, 0x00000001, 0x0c000045, 0x001000f2, 0x00000001, 0x00004002, 0x3f000000,
|
||||
0x3f000000, 0x00000000, 0x00000000, 0x00107e46, 0x0000001d, 0x00106000, 0x00000000, 0x07000000,
|
||||
0x00100012, 0x00000000, 0x0010000a, 0x00000000, 0x0010000a, 0x00000001, 0x0c000045, 0x001000f2,
|
||||
0x00000001, 0x00004002, 0x3f000000, 0x3f000000, 0x00000000, 0x00000000, 0x00107e46, 0x0000001e,
|
||||
0x00106000, 0x00000000, 0x07000000, 0x00100012, 0x00000000, 0x0010000a, 0x00000000, 0x0010000a,
|
||||
0x00000001, 0x0c000045, 0x001000f2, 0x00000001, 0x00004002, 0x3f000000, 0x3f000000, 0x00000000,
|
||||
0x00000000, 0x00107e46, 0x0000001f, 0x00106000, 0x00000000, 0x07000000, 0x00100012, 0x00000000,
|
||||
0x0010000a, 0x00000000, 0x0010000a, 0x00000001, 0x0c000045, 0x001000f2, 0x00000001, 0x00004002,
|
||||
0x3f000000, 0x3f000000, 0x00000000, 0x00000000, 0x00107e46, 0x00000020, 0x00106000, 0x00000000,
|
||||
0x07000000, 0x00100012, 0x00000000, 0x0010000a, 0x00000000, 0x0010000a, 0x00000001, 0x0c000045,
|
||||
0x001000f2, 0x00000001, 0x00004002, 0x3f000000, 0x3f000000, 0x00000000, 0x00000000, 0x00107e46,
|
||||
0x00000021, 0x00106000, 0x00000000, 0x07000000, 0x00100012, 0x00000000, 0x0010000a, 0x00000000,
|
||||
0x0010000a, 0x00000001, 0x0c000045, 0x001000f2, 0x00000001, 0x00004002, 0x3f000000, 0x3f000000,
|
||||
0x00000000, 0x00000000, 0x00107e46, 0x00000022, 0x00106000, 0x00000000, 0x07000000, 0x00100012,
|
||||
0x00000000, 0x0010000a, 0x00000000, 0x0010000a, 0x00000001, 0x0c000045, 0x001000f2, 0x00000001,
|
||||
0x00004002, 0x3f000000, 0x3f000000, 0x00000000, 0x00000000, 0x00107e46, 0x00000023, 0x00106000,
|
||||
0x00000000, 0x07000000, 0x00100012, 0x00000000, 0x0010000a, 0x00000000, 0x0010000a, 0x00000001,
|
||||
0x0c000045, 0x001000f2, 0x00000001, 0x00004002, 0x3f000000, 0x3f000000, 0x00000000, 0x00000000,
|
||||
0x00107e46, 0x00000024, 0x00106000, 0x00000000, 0x07000000, 0x00100012, 0x00000000, 0x0010000a,
|
||||
0x00000000, 0x0010000a, 0x00000001, 0x0c000045, 0x001000f2, 0x00000001, 0x00004002, 0x3f000000,
|
||||
0x3f000000, 0x00000000, 0x00000000, 0x00107e46, 0x00000025, 0x00106000, 0x00000000, 0x07000000,
|
||||
0x00100012, 0x00000000, 0x0010000a, 0x00000000, 0x0010000a, 0x00000001, 0x0c000045, 0x001000f2,
|
||||
0x00000001, 0x00004002, 0x3f000000, 0x3f000000, 0x00000000, 0x00000000, 0x00107e46, 0x00000026,
|
||||
0x00106000, 0x00000000, 0x07000000, 0x00100012, 0x00000000, 0x0010000a, 0x00000000, 0x0010000a,
|
||||
0x00000001, 0x0c000045, 0x001000f2, 0x00000001, 0x00004002, 0x3f000000, 0x3f000000, 0x00000000,
|
||||
0x00000000, 0x00107e46, 0x00000027, 0x00106000, 0x00000000, 0x07000000, 0x00100012, 0x00000000,
|
||||
0x0010000a, 0x00000000, 0x0010000a, 0x00000001, 0x0c000045, 0x001000f2, 0x00000001, 0x00004002,
|
||||
0x3f000000, 0x3f000000, 0x00000000, 0x00000000, 0x00107e46, 0x00000028, 0x00106000, 0x00000000,
|
||||
0x07000000, 0x00100012, 0x00000000, 0x0010000a, 0x00000000, 0x0010000a, 0x00000001, 0x0c000045,
|
||||
0x001000f2, 0x00000001, 0x00004002, 0x3f000000, 0x3f000000, 0x00000000, 0x00000000, 0x00107e46,
|
||||
0x00000029, 0x00106000, 0x00000000, 0x07000000, 0x00100012, 0x00000000, 0x0010000a, 0x00000000,
|
||||
0x0010000a, 0x00000001, 0x0c000045, 0x001000f2, 0x00000001, 0x00004002, 0x3f000000, 0x3f000000,
|
||||
0x00000000, 0x00000000, 0x00107e46, 0x0000002a, 0x00106000, 0x00000000, 0x07000000, 0x00100012,
|
||||
0x00000000, 0x0010000a, 0x00000000, 0x0010000a, 0x00000001, 0x0c000045, 0x001000f2, 0x00000001,
|
||||
0x00004002, 0x3f000000, 0x3f000000, 0x00000000, 0x00000000, 0x00107e46, 0x0000002b, 0x00106000,
|
||||
0x00000000, 0x07000000, 0x00100012, 0x00000000, 0x0010000a, 0x00000000, 0x0010000a, 0x00000001,
|
||||
0x0c000045, 0x001000f2, 0x00000001, 0x00004002, 0x3f000000, 0x3f000000, 0x00000000, 0x00000000,
|
||||
0x00107e46, 0x0000002c, 0x00106000, 0x00000000, 0x07000000, 0x00100012, 0x00000000, 0x0010000a,
|
||||
0x00000000, 0x0010000a, 0x00000001, 0x0c000045, 0x001000f2, 0x00000001, 0x00004002, 0x3f000000,
|
||||
0x3f000000, 0x00000000, 0x00000000, 0x00107e46, 0x0000002d, 0x00106000, 0x00000000, 0x07000000,
|
||||
0x00100012, 0x00000000, 0x0010000a, 0x00000000, 0x0010000a, 0x00000001, 0x0c000045, 0x001000f2,
|
||||
0x00000001, 0x00004002, 0x3f000000, 0x3f000000, 0x00000000, 0x00000000, 0x00107e46, 0x0000002e,
|
||||
0x00106000, 0x00000000, 0x07000000, 0x00100012, 0x00000000, 0x0010000a, 0x00000000, 0x0010000a,
|
||||
0x00000001, 0x0c000045, 0x001000f2, 0x00000001, 0x00004002, 0x3f000000, 0x3f000000, 0x00000000,
|
||||
0x00000000, 0x00107e46, 0x0000002f, 0x00106000, 0x00000000, 0x07000000, 0x00100012, 0x00000000,
|
||||
0x0010000a, 0x00000000, 0x0010000a, 0x00000001, 0x0c000045, 0x001000f2, 0x00000001, 0x00004002,
|
||||
0x3f000000, 0x3f000000, 0x00000000, 0x00000000, 0x00107e46, 0x00000030, 0x00106000, 0x00000000,
|
||||
0x07000000, 0x00100012, 0x00000000, 0x0010000a, 0x00000000, 0x0010000a, 0x00000001, 0x0c000045,
|
||||
0x001000f2, 0x00000001, 0x00004002, 0x3f000000, 0x3f000000, 0x00000000, 0x00000000, 0x00107e46,
|
||||
0x00000031, 0x00106000, 0x00000000, 0x07000000, 0x00102012, 0x00000000, 0x0010000a, 0x00000000,
|
||||
0x0010000a, 0x00000001, 0x0c000045, 0x001000f2, 0x00000000, 0x00004002, 0x3f000000, 0x3f000000,
|
||||
0x00000000, 0x00000000, 0x00107e46, 0x00000000, 0x00106000, 0x00000001, 0x0c000045, 0x001000f2,
|
||||
0x00000001, 0x00004002, 0x3f000000, 0x3f000000, 0x00000000, 0x00000000, 0x00107e46, 0x00000001,
|
||||
0x00106000, 0x00000001, 0x07000000, 0x00100012, 0x00000000, 0x0010000a, 0x00000000, 0x0010000a,
|
||||
0x00000001, 0x0c000045, 0x001000f2, 0x00000001, 0x00004002, 0x3f000000, 0x3f000000, 0x00000000,
|
||||
0x00000000, 0x00107e46, 0x00000002, 0x00106000, 0x00000001, 0x07000000, 0x00100012, 0x00000000,
|
||||
0x0010000a, 0x00000000, 0x0010000a, 0x00000001, 0x0c000045, 0x001000f2, 0x00000001, 0x00004002,
|
||||
0x3f000000, 0x3f000000, 0x00000000, 0x00000000, 0x00107e46, 0x00000003, 0x00106000, 0x00000001,
|
||||
0x07000000, 0x00100012, 0x00000000, 0x0010000a, 0x00000000, 0x0010000a, 0x00000001, 0x0c000045,
|
||||
0x001000f2, 0x00000001, 0x00004002, 0x3f000000, 0x3f000000, 0x00000000, 0x00000000, 0x00107e46,
|
||||
0x00000004, 0x00106000, 0x00000001, 0x07000000, 0x00100012, 0x00000000, 0x0010000a, 0x00000000,
|
||||
0x0010000a, 0x00000001, 0x0c000045, 0x001000f2, 0x00000001, 0x00004002, 0x3f000000, 0x3f000000,
|
||||
0x00000000, 0x00000000, 0x00107e46, 0x00000005, 0x00106000, 0x00000001, 0x07000000, 0x00100012,
|
||||
0x00000000, 0x0010000a, 0x00000000, 0x0010000a, 0x00000001, 0x0c000045, 0x001000f2, 0x00000001,
|
||||
0x00004002, 0x3f000000, 0x3f000000, 0x00000000, 0x00000000, 0x00107e46, 0x00000006, 0x00106000,
|
||||
0x00000001, 0x07000000, 0x00100012, 0x00000000, 0x0010000a, 0x00000000, 0x0010000a, 0x00000001,
|
||||
0x0c000045, 0x001000f2, 0x00000001, 0x00004002, 0x3f000000, 0x3f000000, 0x00000000, 0x00000000,
|
||||
0x00107e46, 0x00000007, 0x00106000, 0x00000001, 0x07000000, 0x00100012, 0x00000000, 0x0010000a,
|
||||
0x00000000, 0x0010000a, 0x00000001, 0x0c000045, 0x001000f2, 0x00000001, 0x00004002, 0x3f000000,
|
||||
0x3f000000, 0x00000000, 0x00000000, 0x00107e46, 0x00000008, 0x00106000, 0x00000001, 0x07000000,
|
||||
0x00100012, 0x00000000, 0x0010000a, 0x00000000, 0x0010000a, 0x00000001, 0x0c000045, 0x001000f2,
|
||||
0x00000001, 0x00004002, 0x3f000000, 0x3f000000, 0x00000000, 0x00000000, 0x00107e46, 0x00000009,
|
||||
0x00106000, 0x00000001, 0x07000000, 0x00100012, 0x00000000, 0x0010000a, 0x00000000, 0x0010000a,
|
||||
0x00000001, 0x0c000045, 0x001000f2, 0x00000001, 0x00004002, 0x3f000000, 0x3f000000, 0x00000000,
|
||||
0x00000000, 0x00107e46, 0x0000000a, 0x00106000, 0x00000001, 0x07000000, 0x00100012, 0x00000000,
|
||||
0x0010000a, 0x00000000, 0x0010000a, 0x00000001, 0x0c000045, 0x001000f2, 0x00000001, 0x00004002,
|
||||
0x3f000000, 0x3f000000, 0x00000000, 0x00000000, 0x00107e46, 0x0000000b, 0x00106000, 0x00000001,
|
||||
0x07000000, 0x00100012, 0x00000000, 0x0010000a, 0x00000000, 0x0010000a, 0x00000001, 0x0c000045,
|
||||
0x001000f2, 0x00000001, 0x00004002, 0x3f000000, 0x3f000000, 0x00000000, 0x00000000, 0x00107e46,
|
||||
0x0000000c, 0x00106000, 0x00000001, 0x07000000, 0x00100012, 0x00000000, 0x0010000a, 0x00000000,
|
||||
0x0010000a, 0x00000001, 0x0c000045, 0x001000f2, 0x00000001, 0x00004002, 0x3f000000, 0x3f000000,
|
||||
0x00000000, 0x00000000, 0x00107e46, 0x0000000d, 0x00106000, 0x00000001, 0x07000000, 0x00100012,
|
||||
0x00000000, 0x0010000a, 0x00000000, 0x0010000a, 0x00000001, 0x0c000045, 0x001000f2, 0x00000001,
|
||||
0x00004002, 0x3f000000, 0x3f000000, 0x00000000, 0x00000000, 0x00107e46, 0x0000000e, 0x00106000,
|
||||
0x00000001, 0x07000000, 0x00100012, 0x00000000, 0x0010000a, 0x00000000, 0x0010000a, 0x00000001,
|
||||
0x0c000045, 0x001000f2, 0x00000001, 0x00004002, 0x3f000000, 0x3f000000, 0x00000000, 0x00000000,
|
||||
0x00107e46, 0x0000000f, 0x00106000, 0x00000001, 0x07000000, 0x00100012, 0x00000000, 0x0010000a,
|
||||
0x00000000, 0x0010000a, 0x00000001, 0x0c000045, 0x001000f2, 0x00000001, 0x00004002, 0x3f000000,
|
||||
0x3f000000, 0x00000000, 0x00000000, 0x00107e46, 0x00000010, 0x00106000, 0x00000001, 0x07000000,
|
||||
0x00100012, 0x00000000, 0x0010000a, 0x00000000, 0x0010000a, 0x00000001, 0x0c000045, 0x001000f2,
|
||||
0x00000001, 0x00004002, 0x3f000000, 0x3f000000, 0x00000000, 0x00000000, 0x00107e46, 0x00000011,
|
||||
0x00106000, 0x00000001, 0x07000000, 0x00100012, 0x00000000, 0x0010000a, 0x00000000, 0x0010000a,
|
||||
0x00000001, 0x0c000045, 0x001000f2, 0x00000001, 0x00004002, 0x3f000000, 0x3f000000, 0x00000000,
|
||||
0x00000000, 0x00107e46, 0x00000012, 0x00106000, 0x00000001, 0x07000000, 0x00100012, 0x00000000,
|
||||
0x0010000a, 0x00000000, 0x0010000a, 0x00000001, 0x0c000045, 0x001000f2, 0x00000001, 0x00004002,
|
||||
0x3f000000, 0x3f000000, 0x00000000, 0x00000000, 0x00107e46, 0x00000013, 0x00106000, 0x00000001,
|
||||
0x07000000, 0x00100012, 0x00000000, 0x0010000a, 0x00000000, 0x0010000a, 0x00000001, 0x0c000045,
|
||||
0x001000f2, 0x00000001, 0x00004002, 0x3f000000, 0x3f000000, 0x00000000, 0x00000000, 0x00107e46,
|
||||
0x00000014, 0x00106000, 0x00000001, 0x07000000, 0x00100012, 0x00000000, 0x0010000a, 0x00000000,
|
||||
0x0010000a, 0x00000001, 0x0c000045, 0x001000f2, 0x00000001, 0x00004002, 0x3f000000, 0x3f000000,
|
||||
0x00000000, 0x00000000, 0x00107e46, 0x00000015, 0x00106000, 0x00000001, 0x07000000, 0x00100012,
|
||||
0x00000000, 0x0010000a, 0x00000000, 0x0010000a, 0x00000001, 0x0c000045, 0x001000f2, 0x00000001,
|
||||
0x00004002, 0x3f000000, 0x3f000000, 0x00000000, 0x00000000, 0x00107e46, 0x00000016, 0x00106000,
|
||||
0x00000001, 0x07000000, 0x00100012, 0x00000000, 0x0010000a, 0x00000000, 0x0010000a, 0x00000001,
|
||||
0x0c000045, 0x001000f2, 0x00000001, 0x00004002, 0x3f000000, 0x3f000000, 0x00000000, 0x00000000,
|
||||
0x00107e46, 0x00000017, 0x00106000, 0x00000001, 0x07000000, 0x00100012, 0x00000000, 0x0010000a,
|
||||
0x00000000, 0x0010000a, 0x00000001, 0x0c000045, 0x001000f2, 0x00000001, 0x00004002, 0x3f000000,
|
||||
0x3f000000, 0x00000000, 0x00000000, 0x00107e46, 0x00000018, 0x00106000, 0x00000001, 0x07000000,
|
||||
0x00100012, 0x00000000, 0x0010000a, 0x00000000, 0x0010000a, 0x00000001, 0x0c000045, 0x001000f2,
|
||||
0x00000001, 0x00004002, 0x3f000000, 0x3f000000, 0x00000000, 0x00000000, 0x00107e46, 0x00000019,
|
||||
0x00106000, 0x00000001, 0x07000000, 0x00100012, 0x00000000, 0x0010000a, 0x00000000, 0x0010000a,
|
||||
0x00000001, 0x0c000045, 0x001000f2, 0x00000001, 0x00004002, 0x3f000000, 0x3f000000, 0x00000000,
|
||||
0x00000000, 0x00107e46, 0x0000001a, 0x00106000, 0x00000001, 0x07000000, 0x00100012, 0x00000000,
|
||||
0x0010000a, 0x00000000, 0x0010000a, 0x00000001, 0x0c000045, 0x001000f2, 0x00000001, 0x00004002,
|
||||
0x3f000000, 0x3f000000, 0x00000000, 0x00000000, 0x00107e46, 0x0000001b, 0x00106000, 0x00000001,
|
||||
0x07000000, 0x00100012, 0x00000000, 0x0010000a, 0x00000000, 0x0010000a, 0x00000001, 0x0c000045,
|
||||
0x001000f2, 0x00000001, 0x00004002, 0x3f000000, 0x3f000000, 0x00000000, 0x00000000, 0x00107e46,
|
||||
0x0000001c, 0x00106000, 0x00000001, 0x07000000, 0x00100012, 0x00000000, 0x0010000a, 0x00000000,
|
||||
0x0010000a, 0x00000001, 0x0c000045, 0x001000f2, 0x00000001, 0x00004002, 0x3f000000, 0x3f000000,
|
||||
0x00000000, 0x00000000, 0x00107e46, 0x0000001d, 0x00106000, 0x00000001, 0x07000000, 0x00100012,
|
||||
0x00000000, 0x0010000a, 0x00000000, 0x0010000a, 0x00000001, 0x0c000045, 0x001000f2, 0x00000001,
|
||||
0x00004002, 0x3f000000, 0x3f000000, 0x00000000, 0x00000000, 0x00107e46, 0x0000001e, 0x00106000,
|
||||
0x00000001, 0x07000000, 0x00100012, 0x00000000, 0x0010000a, 0x00000000, 0x0010000a, 0x00000001,
|
||||
0x0c000045, 0x001000f2, 0x00000001, 0x00004002, 0x3f000000, 0x3f000000, 0x00000000, 0x00000000,
|
||||
0x00107e46, 0x0000001f, 0x00106000, 0x00000001, 0x07000000, 0x00100012, 0x00000000, 0x0010000a,
|
||||
0x00000000, 0x0010000a, 0x00000001, 0x0c000045, 0x001000f2, 0x00000001, 0x00004002, 0x3f000000,
|
||||
0x3f000000, 0x00000000, 0x00000000, 0x00107e46, 0x00000020, 0x00106000, 0x00000001, 0x07000000,
|
||||
0x00100012, 0x00000000, 0x0010000a, 0x00000000, 0x0010000a, 0x00000001, 0x0c000045, 0x001000f2,
|
||||
0x00000001, 0x00004002, 0x3f000000, 0x3f000000, 0x00000000, 0x00000000, 0x00107e46, 0x00000021,
|
||||
0x00106000, 0x00000001, 0x07000000, 0x00100012, 0x00000000, 0x0010000a, 0x00000000, 0x0010000a,
|
||||
0x00000001, 0x0c000045, 0x001000f2, 0x00000001, 0x00004002, 0x3f000000, 0x3f000000, 0x00000000,
|
||||
0x00000000, 0x00107e46, 0x00000022, 0x00106000, 0x00000001, 0x07000000, 0x00100012, 0x00000000,
|
||||
0x0010000a, 0x00000000, 0x0010000a, 0x00000001, 0x0c000045, 0x001000f2, 0x00000001, 0x00004002,
|
||||
0x3f000000, 0x3f000000, 0x00000000, 0x00000000, 0x00107e46, 0x00000023, 0x00106000, 0x00000001,
|
||||
0x07000000, 0x00100012, 0x00000000, 0x0010000a, 0x00000000, 0x0010000a, 0x00000001, 0x0c000045,
|
||||
0x001000f2, 0x00000001, 0x00004002, 0x3f000000, 0x3f000000, 0x00000000, 0x00000000, 0x00107e46,
|
||||
0x00000024, 0x00106000, 0x00000001, 0x07000000, 0x00100012, 0x00000000, 0x0010000a, 0x00000000,
|
||||
0x0010000a, 0x00000001, 0x0c000045, 0x001000f2, 0x00000001, 0x00004002, 0x3f000000, 0x3f000000,
|
||||
0x00000000, 0x00000000, 0x00107e46, 0x00000025, 0x00106000, 0x00000001, 0x07000000, 0x00100012,
|
||||
0x00000000, 0x0010000a, 0x00000000, 0x0010000a, 0x00000001, 0x0c000045, 0x001000f2, 0x00000001,
|
||||
0x00004002, 0x3f000000, 0x3f000000, 0x00000000, 0x00000000, 0x00107e46, 0x00000026, 0x00106000,
|
||||
0x00000001, 0x07000000, 0x00100012, 0x00000000, 0x0010000a, 0x00000000, 0x0010000a, 0x00000001,
|
||||
0x0c000045, 0x001000f2, 0x00000001, 0x00004002, 0x3f000000, 0x3f000000, 0x00000000, 0x00000000,
|
||||
0x00107e46, 0x00000027, 0x00106000, 0x00000001, 0x07000000, 0x00100012, 0x00000000, 0x0010000a,
|
||||
0x00000000, 0x0010000a, 0x00000001, 0x0c000045, 0x001000f2, 0x00000001, 0x00004002, 0x3f000000,
|
||||
0x3f000000, 0x00000000, 0x00000000, 0x00107e46, 0x00000028, 0x00106000, 0x00000001, 0x07000000,
|
||||
0x00100012, 0x00000000, 0x0010000a, 0x00000000, 0x0010000a, 0x00000001, 0x0c000045, 0x001000f2,
|
||||
0x00000001, 0x00004002, 0x3f000000, 0x3f000000, 0x00000000, 0x00000000, 0x00107e46, 0x00000029,
|
||||
0x00106000, 0x00000001, 0x07000000, 0x00100012, 0x00000000, 0x0010000a, 0x00000000, 0x0010000a,
|
||||
0x00000001, 0x0c000045, 0x001000f2, 0x00000001, 0x00004002, 0x3f000000, 0x3f000000, 0x00000000,
|
||||
0x00000000, 0x00107e46, 0x0000002a, 0x00106000, 0x00000001, 0x07000000, 0x00100012, 0x00000000,
|
||||
0x0010000a, 0x00000000, 0x0010000a, 0x00000001, 0x0c000045, 0x001000f2, 0x00000001, 0x00004002,
|
||||
0x3f000000, 0x3f000000, 0x00000000, 0x00000000, 0x00107e46, 0x0000002b, 0x00106000, 0x00000001,
|
||||
0x07000000, 0x00100012, 0x00000000, 0x0010000a, 0x00000000, 0x0010000a, 0x00000001, 0x0c000045,
|
||||
0x001000f2, 0x00000001, 0x00004002, 0x3f000000, 0x3f000000, 0x00000000, 0x00000000, 0x00107e46,
|
||||
0x0000002c, 0x00106000, 0x00000001, 0x07000000, 0x00100012, 0x00000000, 0x0010000a, 0x00000000,
|
||||
0x0010000a, 0x00000001, 0x0c000045, 0x001000f2, 0x00000001, 0x00004002, 0x3f000000, 0x3f000000,
|
||||
0x00000000, 0x00000000, 0x00107e46, 0x0000002d, 0x00106000, 0x00000001, 0x07000000, 0x00100012,
|
||||
0x00000000, 0x0010000a, 0x00000000, 0x0010000a, 0x00000001, 0x0c000045, 0x001000f2, 0x00000001,
|
||||
0x00004002, 0x3f000000, 0x3f000000, 0x00000000, 0x00000000, 0x00107e46, 0x0000002e, 0x00106000,
|
||||
0x00000001, 0x07000000, 0x00100012, 0x00000000, 0x0010000a, 0x00000000, 0x0010000a, 0x00000001,
|
||||
0x0c000045, 0x001000f2, 0x00000001, 0x00004002, 0x3f000000, 0x3f000000, 0x00000000, 0x00000000,
|
||||
0x00107e46, 0x0000002f, 0x00106000, 0x00000001, 0x07000000, 0x00100012, 0x00000000, 0x0010000a,
|
||||
0x00000000, 0x0010000a, 0x00000001, 0x0c000045, 0x001000f2, 0x00000001, 0x00004002, 0x3f000000,
|
||||
0x3f000000, 0x00000000, 0x00000000, 0x00107e46, 0x00000030, 0x00106000, 0x00000001, 0x07000000,
|
||||
0x00100012, 0x00000000, 0x0010000a, 0x00000000, 0x0010000a, 0x00000001, 0x0c000045, 0x001000f2,
|
||||
0x00000001, 0x00004002, 0x3f000000, 0x3f000000, 0x00000000, 0x00000000, 0x00107e46, 0x00000031,
|
||||
0x00106000, 0x00000001, 0x07000000, 0x00102022, 0x00000000, 0x0010000a, 0x00000000, 0x0010000a,
|
||||
0x00000001, 0x0a00002d, 0x001000f2, 0x00000000, 0x00004002, 0x00000000, 0x00000000, 0x00000000,
|
||||
0x00000000, 0x00107e46, 0x00000032, 0x0a00002d, 0x001000f2, 0x00000001, 0x00004002, 0x00000000,
|
||||
0x00000000, 0x00000000, 0x00000000, 0x00107e46, 0x00000033, 0x07000000, 0x00100012, 0x00000000,
|
||||
0x0010000a, 0x00000000, 0x0010000a, 0x00000001, 0x0a00002d, 0x001000f2, 0x00000001, 0x00004002,
|
||||
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00107e46, 0x00000034, 0x07000000, 0x00100012,
|
||||
0x00000000, 0x0010000a, 0x00000000, 0x0010000a, 0x00000001, 0x0a00002d, 0x001000f2, 0x00000001,
|
||||
0x00004002, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00107e46, 0x00000035, 0x07000000,
|
||||
0x00100012, 0x00000000, 0x0010000a, 0x00000000, 0x0010000a, 0x00000001, 0x0a00002d, 0x001000f2,
|
||||
0x00000001, 0x00004002, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00107e46, 0x00000036,
|
||||
0x07000000, 0x00100012, 0x00000000, 0x0010000a, 0x00000000, 0x0010000a, 0x00000001, 0x0a00002d,
|
||||
0x001000f2, 0x00000001, 0x00004002, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00107e46,
|
||||
0x00000037, 0x07000000, 0x00100012, 0x00000000, 0x0010000a, 0x00000000, 0x0010000a, 0x00000001,
|
||||
0x0a00002d, 0x001000f2, 0x00000001, 0x00004002, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||
0x00107e46, 0x00000038, 0x07000000, 0x00100012, 0x00000000, 0x0010000a, 0x00000000, 0x0010000a,
|
||||
0x00000001, 0x0a00002d, 0x001000f2, 0x00000001, 0x00004002, 0x00000000, 0x00000000, 0x00000000,
|
||||
0x00000000, 0x00107e46, 0x00000039, 0x07000000, 0x00100012, 0x00000000, 0x0010000a, 0x00000000,
|
||||
0x0010000a, 0x00000001, 0x0a00002d, 0x001000f2, 0x00000001, 0x00004002, 0x00000000, 0x00000000,
|
||||
0x00000000, 0x00000000, 0x00107e46, 0x0000003a, 0x07000000, 0x00100012, 0x00000000, 0x0010000a,
|
||||
0x00000000, 0x0010000a, 0x00000001, 0x0a00002d, 0x001000f2, 0x00000001, 0x00004002, 0x00000000,
|
||||
0x00000000, 0x00000000, 0x00000000, 0x00107e46, 0x0000003b, 0x07000000, 0x00100012, 0x00000000,
|
||||
0x0010000a, 0x00000000, 0x0010000a, 0x00000001, 0x0a00002d, 0x001000f2, 0x00000001, 0x00004002,
|
||||
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00107e46, 0x0000003c, 0x07000000, 0x00100012,
|
||||
0x00000000, 0x0010000a, 0x00000000, 0x0010000a, 0x00000001, 0x0a00002d, 0x001000f2, 0x00000001,
|
||||
0x00004002, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00107e46, 0x0000003d, 0x07000000,
|
||||
0x00100012, 0x00000000, 0x0010000a, 0x00000000, 0x0010000a, 0x00000001, 0x0a00002d, 0x001000f2,
|
||||
0x00000001, 0x00004002, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00107e46, 0x0000003e,
|
||||
0x07000000, 0x00100012, 0x00000000, 0x0010000a, 0x00000000, 0x0010000a, 0x00000001, 0x0a00002d,
|
||||
0x001000f2, 0x00000001, 0x00004002, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00107e46,
|
||||
0x0000003f, 0x07000000, 0x00100012, 0x00000000, 0x0010000a, 0x00000000, 0x0010000a, 0x00000001,
|
||||
0x0a00002d, 0x001000f2, 0x00000001, 0x00004002, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||
0x00107e46, 0x00000040, 0x07000000, 0x00100012, 0x00000000, 0x0010000a, 0x00000000, 0x0010000a,
|
||||
0x00000001, 0x0a00002d, 0x001000f2, 0x00000001, 0x00004002, 0x00000000, 0x00000000, 0x00000000,
|
||||
0x00000000, 0x00107e46, 0x00000041, 0x07000000, 0x00100012, 0x00000000, 0x0010000a, 0x00000000,
|
||||
0x0010000a, 0x00000001, 0x0a00002d, 0x001000f2, 0x00000001, 0x00004002, 0x00000000, 0x00000000,
|
||||
0x00000000, 0x00000000, 0x00107e46, 0x00000042, 0x07000000, 0x00100012, 0x00000000, 0x0010000a,
|
||||
0x00000000, 0x0010000a, 0x00000001, 0x0a00002d, 0x001000f2, 0x00000001, 0x00004002, 0x00000000,
|
||||
0x00000000, 0x00000000, 0x00000000, 0x00107e46, 0x00000043, 0x07000000, 0x00100012, 0x00000000,
|
||||
0x0010000a, 0x00000000, 0x0010000a, 0x00000001, 0x0a00002d, 0x001000f2, 0x00000001, 0x00004002,
|
||||
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00107e46, 0x00000044, 0x07000000, 0x00100012,
|
||||
0x00000000, 0x0010000a, 0x00000000, 0x0010000a, 0x00000001, 0x0a00002d, 0x001000f2, 0x00000001,
|
||||
0x00004002, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00107e46, 0x00000045, 0x07000000,
|
||||
0x00100012, 0x00000000, 0x0010000a, 0x00000000, 0x0010000a, 0x00000001, 0x0a00002d, 0x001000f2,
|
||||
0x00000001, 0x00004002, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00107e46, 0x00000046,
|
||||
0x07000000, 0x00100012, 0x00000000, 0x0010000a, 0x00000000, 0x0010000a, 0x00000001, 0x0a00002d,
|
||||
0x001000f2, 0x00000001, 0x00004002, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00107e46,
|
||||
0x00000047, 0x07000000, 0x00100012, 0x00000000, 0x0010000a, 0x00000000, 0x0010000a, 0x00000001,
|
||||
0x0a00002d, 0x001000f2, 0x00000001, 0x00004002, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||
0x00107e46, 0x00000048, 0x07000000, 0x00100012, 0x00000000, 0x0010000a, 0x00000000, 0x0010000a,
|
||||
0x00000001, 0x0a00002d, 0x001000f2, 0x00000001, 0x00004002, 0x00000000, 0x00000000, 0x00000000,
|
||||
0x00000000, 0x00107e46, 0x00000049, 0x07000000, 0x00100012, 0x00000000, 0x0010000a, 0x00000000,
|
||||
0x0010000a, 0x00000001, 0x0a00002d, 0x001000f2, 0x00000001, 0x00004002, 0x00000000, 0x00000000,
|
||||
0x00000000, 0x00000000, 0x00107e46, 0x0000004a, 0x07000000, 0x00100012, 0x00000000, 0x0010000a,
|
||||
0x00000000, 0x0010000a, 0x00000001, 0x0a00002d, 0x001000f2, 0x00000001, 0x00004002, 0x00000000,
|
||||
0x00000000, 0x00000000, 0x00000000, 0x00107e46, 0x0000004b, 0x07000000, 0x00100012, 0x00000000,
|
||||
0x0010000a, 0x00000000, 0x0010000a, 0x00000001, 0x0a00002d, 0x001000f2, 0x00000001, 0x00004002,
|
||||
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00107e46, 0x0000004c, 0x07000000, 0x00100012,
|
||||
0x00000000, 0x0010000a, 0x00000000, 0x0010000a, 0x00000001, 0x0a00002d, 0x001000f2, 0x00000001,
|
||||
0x00004002, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00107e46, 0x0000004d, 0x07000000,
|
||||
0x00100012, 0x00000000, 0x0010000a, 0x00000000, 0x0010000a, 0x00000001, 0x0a00002d, 0x001000f2,
|
||||
0x00000001, 0x00004002, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00107e46, 0x0000004e,
|
||||
0x07000000, 0x00100012, 0x00000000, 0x0010000a, 0x00000000, 0x0010000a, 0x00000001, 0x0a00002d,
|
||||
0x001000f2, 0x00000001, 0x00004002, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00107e46,
|
||||
0x0000004f, 0x07000000, 0x00100012, 0x00000000, 0x0010000a, 0x00000000, 0x0010000a, 0x00000001,
|
||||
0x0a00002d, 0x001000f2, 0x00000001, 0x00004002, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||
0x00107e46, 0x00000050, 0x07000000, 0x00100012, 0x00000000, 0x0010000a, 0x00000000, 0x0010000a,
|
||||
0x00000001, 0x0a00002d, 0x001000f2, 0x00000001, 0x00004002, 0x00000000, 0x00000000, 0x00000000,
|
||||
0x00000000, 0x00107e46, 0x00000051, 0x07000000, 0x00100012, 0x00000000, 0x0010000a, 0x00000000,
|
||||
0x0010000a, 0x00000001, 0x0a00002d, 0x001000f2, 0x00000001, 0x00004002, 0x00000000, 0x00000000,
|
||||
0x00000000, 0x00000000, 0x00107e46, 0x00000052, 0x07000000, 0x00100012, 0x00000000, 0x0010000a,
|
||||
0x00000000, 0x0010000a, 0x00000001, 0x0a00002d, 0x001000f2, 0x00000001, 0x00004002, 0x00000000,
|
||||
0x00000000, 0x00000000, 0x00000000, 0x00107e46, 0x00000053, 0x07000000, 0x00100012, 0x00000000,
|
||||
0x0010000a, 0x00000000, 0x0010000a, 0x00000001, 0x0a00002d, 0x001000f2, 0x00000001, 0x00004002,
|
||||
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00107e46, 0x00000054, 0x07000000, 0x00100012,
|
||||
0x00000000, 0x0010000a, 0x00000000, 0x0010000a, 0x00000001, 0x0a00002d, 0x001000f2, 0x00000001,
|
||||
0x00004002, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00107e46, 0x00000055, 0x07000000,
|
||||
0x00100012, 0x00000000, 0x0010000a, 0x00000000, 0x0010000a, 0x00000001, 0x0a00002d, 0x001000f2,
|
||||
0x00000001, 0x00004002, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00107e46, 0x00000056,
|
||||
0x07000000, 0x00100012, 0x00000000, 0x0010000a, 0x00000000, 0x0010000a, 0x00000001, 0x0a00002d,
|
||||
0x001000f2, 0x00000001, 0x00004002, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00107e46,
|
||||
0x00000057, 0x07000000, 0x00100012, 0x00000000, 0x0010000a, 0x00000000, 0x0010000a, 0x00000001,
|
||||
0x0a00002d, 0x001000f2, 0x00000001, 0x00004002, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||
0x00107e46, 0x00000058, 0x07000000, 0x00100012, 0x00000000, 0x0010000a, 0x00000000, 0x0010000a,
|
||||
0x00000001, 0x0a00002d, 0x001000f2, 0x00000001, 0x00004002, 0x00000000, 0x00000000, 0x00000000,
|
||||
0x00000000, 0x00107e46, 0x00000059, 0x07000000, 0x00100012, 0x00000000, 0x0010000a, 0x00000000,
|
||||
0x0010000a, 0x00000001, 0x0a00002d, 0x001000f2, 0x00000001, 0x00004002, 0x00000000, 0x00000000,
|
||||
0x00000000, 0x00000000, 0x00107e46, 0x0000005a, 0x07000000, 0x00100012, 0x00000000, 0x0010000a,
|
||||
0x00000000, 0x0010000a, 0x00000001, 0x0a00002d, 0x001000f2, 0x00000001, 0x00004002, 0x00000000,
|
||||
0x00000000, 0x00000000, 0x00000000, 0x00107e46, 0x0000005b, 0x07000000, 0x00100012, 0x00000000,
|
||||
0x0010000a, 0x00000000, 0x0010000a, 0x00000001, 0x0a00002d, 0x001000f2, 0x00000001, 0x00004002,
|
||||
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00107e46, 0x0000005c, 0x07000000, 0x00100012,
|
||||
0x00000000, 0x0010000a, 0x00000000, 0x0010000a, 0x00000001, 0x0a00002d, 0x001000f2, 0x00000001,
|
||||
0x00004002, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00107e46, 0x0000005d, 0x07000000,
|
||||
0x00100012, 0x00000000, 0x0010000a, 0x00000000, 0x0010000a, 0x00000001, 0x0a00002d, 0x001000f2,
|
||||
0x00000001, 0x00004002, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00107e46, 0x0000005e,
|
||||
0x07000000, 0x00100012, 0x00000000, 0x0010000a, 0x00000000, 0x0010000a, 0x00000001, 0x0a00002d,
|
||||
0x001000f2, 0x00000001, 0x00004002, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00107e46,
|
||||
0x0000005f, 0x07000000, 0x00100012, 0x00000000, 0x0010000a, 0x00000000, 0x0010000a, 0x00000001,
|
||||
0x0a00002d, 0x001000f2, 0x00000001, 0x00004002, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||
0x00107e46, 0x00000060, 0x07000000, 0x00100012, 0x00000000, 0x0010000a, 0x00000000, 0x0010000a,
|
||||
0x00000001, 0x0a00002d, 0x001000f2, 0x00000001, 0x00004002, 0x00000000, 0x00000000, 0x00000000,
|
||||
0x00000000, 0x00107e46, 0x00000061, 0x07000000, 0x00100012, 0x00000000, 0x0010000a, 0x00000000,
|
||||
0x0010000a, 0x00000001, 0x0a00002d, 0x001000f2, 0x00000001, 0x00004002, 0x00000000, 0x00000000,
|
||||
0x00000000, 0x00000000, 0x00107e46, 0x00000062, 0x07000000, 0x00100012, 0x00000000, 0x0010000a,
|
||||
0x00000000, 0x0010000a, 0x00000001, 0x0a00002d, 0x001000f2, 0x00000001, 0x00004002, 0x00000000,
|
||||
0x00000000, 0x00000000, 0x00000000, 0x00107e46, 0x00000063, 0x07000000, 0x00102042, 0x00000000,
|
||||
0x0010000a, 0x00000000, 0x0010000a, 0x00000001, 0x05000036, 0x00102082, 0x00000000, 0x00004001,
|
||||
0x00000000, 0x0100003e,
|
||||
};
|
||||
|
||||
if (!init_test_context(&test_context, NULL))
|
||||
return;
|
||||
device = test_context.device;
|
||||
context = test_context.immediate_context;
|
||||
|
||||
hr = ID3D11Device_CreatePixelShader(device, ps_code, sizeof(ps_code), NULL, &ps);
|
||||
ok(hr == S_OK, "Failed to create pixel shader, hr %#lx.\n", hr);
|
||||
|
||||
texture_desc.Width = 16;
|
||||
texture_desc.Height = 16;
|
||||
texture_desc.MipLevels = 1;
|
||||
texture_desc.ArraySize = 1;
|
||||
texture_desc.Format = DXGI_FORMAT_R32G32B32A32_FLOAT;
|
||||
texture_desc.SampleDesc.Count = 1;
|
||||
texture_desc.Usage = D3D11_USAGE_DEFAULT;
|
||||
texture_desc.BindFlags = D3D11_BIND_RENDER_TARGET;
|
||||
hr = ID3D11Device_CreateTexture2D(device, &texture_desc, NULL, &rt);
|
||||
ok(hr == S_OK, "Got hr %#lx.\n", hr);
|
||||
hr = ID3D11Device_CreateRenderTargetView(device, (ID3D11Resource *)rt, NULL, &rtv);
|
||||
ok(hr == S_OK, "Got hr %#lx.\n", hr);
|
||||
|
||||
for (unsigned int i = 0; i < ARRAY_SIZE(textures); ++i)
|
||||
{
|
||||
float data[2] = {0.0f, i + 1};
|
||||
D3D11_SUBRESOURCE_DATA data_desc = {data, sizeof(data), sizeof(data)};
|
||||
|
||||
texture_desc.Width = 2;
|
||||
texture_desc.Height = 1;
|
||||
texture_desc.MipLevels = 1;
|
||||
texture_desc.ArraySize = 1;
|
||||
texture_desc.Format = DXGI_FORMAT_R32_FLOAT;
|
||||
texture_desc.SampleDesc.Count = 1;
|
||||
texture_desc.Usage = D3D11_USAGE_DEFAULT;
|
||||
texture_desc.BindFlags = D3D11_BIND_SHADER_RESOURCE;
|
||||
hr = ID3D11Device_CreateTexture2D(device, &texture_desc, &data_desc, &textures[i]);
|
||||
ok(hr == S_OK, "Got hr %#lx.\n", hr);
|
||||
hr = ID3D11Device_CreateShaderResourceView(device, (ID3D11Resource *)textures[i], NULL, &srvs[i]);
|
||||
ok(hr == S_OK, "Got hr %#lx.\n", hr);
|
||||
}
|
||||
|
||||
for (unsigned int i = 0; i < ARRAY_SIZE(buffers); ++i)
|
||||
{
|
||||
float data[2] = {i + 1, 0.0f};
|
||||
D3D11_SUBRESOURCE_DATA data_desc = {data, sizeof(data), sizeof(data)};
|
||||
D3D11_SHADER_RESOURCE_VIEW_DESC srv_desc;
|
||||
|
||||
buffer_desc.ByteWidth = sizeof(data);
|
||||
buffer_desc.Usage = D3D11_USAGE_DYNAMIC;
|
||||
buffer_desc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE;
|
||||
buffer_desc.BindFlags = D3D11_BIND_SHADER_RESOURCE;
|
||||
hr = ID3D11Device_CreateBuffer(device, &buffer_desc, &data_desc, &buffers[i]);
|
||||
ok(hr == S_OK, "Got hr %#lx.\n", hr);
|
||||
|
||||
srv_desc.Format = DXGI_FORMAT_R32_FLOAT;
|
||||
srv_desc.ViewDimension = D3D11_SRV_DIMENSION_BUFFER;
|
||||
srv_desc.Buffer.FirstElement = 0;
|
||||
srv_desc.Buffer.NumElements = 2;
|
||||
hr = ID3D11Device_CreateShaderResourceView(device,
|
||||
(ID3D11Resource *)buffers[i], &srv_desc, &srvs[ARRAY_SIZE(textures) + i]);
|
||||
ok(hr == S_OK, "Got hr %#lx.\n", hr);
|
||||
}
|
||||
|
||||
sampler_desc.Filter = D3D11_FILTER_MIN_MAG_MIP_POINT;
|
||||
sampler_desc.AddressU = D3D11_TEXTURE_ADDRESS_WRAP;
|
||||
sampler_desc.AddressV = D3D11_TEXTURE_ADDRESS_WRAP;
|
||||
sampler_desc.AddressW = D3D11_TEXTURE_ADDRESS_WRAP;
|
||||
sampler_desc.MaxLOD = FLT_MAX;
|
||||
hr = ID3D11Device_CreateSamplerState(device, &sampler_desc, &samplers[0]);
|
||||
ok(hr == S_OK, "Got hr %#lx.\n", hr);
|
||||
sampler_desc.Filter = D3D11_FILTER_MIN_MAG_MIP_LINEAR;
|
||||
hr = ID3D11Device_CreateSamplerState(device, &sampler_desc, &samplers[1]);
|
||||
ok(hr == S_OK, "Got hr %#lx.\n", hr);
|
||||
|
||||
ID3D11DeviceContext_OMSetRenderTargets(context, 1, &rtv, NULL);
|
||||
ID3D11DeviceContext_PSSetShader(context, ps, NULL, 0);
|
||||
/* Deliberately make the bindings mismatch, to test that we handle NULL
|
||||
* and unrelated bindings correctly. */
|
||||
ID3D11DeviceContext_PSSetShaderResources(context, 1, ARRAY_SIZE(srvs) - 2, &srvs[1]);
|
||||
ID3D11DeviceContext_PSSetShaderResources(context, ARRAY_SIZE(srvs) + 1, 1, &srvs[0]);
|
||||
ID3D11DeviceContext_PSSetShaderResources(context, ARRAY_SIZE(srvs) + 2, 1, &srvs[ARRAY_SIZE(srvs) - 1]);
|
||||
ID3D11DeviceContext_PSSetSamplers(context, 0, 2, samplers);
|
||||
draw_quad(&test_context);
|
||||
|
||||
check_texture_vec4(rt, &expect, 0);
|
||||
|
||||
/* Discard the data in one of the buffers and draw again. */
|
||||
|
||||
hr = ID3D11DeviceContext_Map(context, (ID3D11Resource *)buffers[1], 0, D3D11_MAP_WRITE_DISCARD, 0, &map_desc);
|
||||
ok(hr == S_OK, "Got hr %#lx.\n", hr);
|
||||
data_ptr = map_desc.pData;
|
||||
data_ptr[0] = 102.0f;
|
||||
data_ptr[1] = 0.0f;
|
||||
ID3D11DeviceContext_Unmap(context, (ID3D11Resource *)buffers[1], 0);
|
||||
draw_quad(&test_context);
|
||||
|
||||
check_texture_vec4(rt, &expect2, 0);
|
||||
|
||||
ID3D11Texture2D_Release(rt);
|
||||
ID3D11RenderTargetView_Release(rtv);
|
||||
for (unsigned int i = 0; i < ARRAY_SIZE(srvs); ++i)
|
||||
ID3D11ShaderResourceView_Release(srvs[i]);
|
||||
for (unsigned int i = 0; i < ARRAY_SIZE(buffers); ++i)
|
||||
ID3D11Buffer_Release(buffers[i]);
|
||||
for (unsigned int i = 0; i < ARRAY_SIZE(textures); ++i)
|
||||
ID3D11Texture2D_Release(textures[i]);
|
||||
for (unsigned int i = 0; i < ARRAY_SIZE(samplers); ++i)
|
||||
ID3D11SamplerState_Release(samplers[i]);
|
||||
ID3D11PixelShader_Release(ps);
|
||||
release_test_context(&test_context);
|
||||
}
|
||||
|
||||
START_TEST(d3d11)
|
||||
{
|
||||
unsigned int argc, i;
|
||||
|
@ -35649,6 +36361,8 @@ START_TEST(d3d11)
|
|||
queue_for_each_feature_level(test_shared_resource);
|
||||
queue_test(test_keyed_mutex);
|
||||
queue_test(test_clear_during_render);
|
||||
queue_test(test_stencil_export);
|
||||
queue_test(test_high_resource_count);
|
||||
|
||||
run_queued_tests();
|
||||
|
||||
|
|
|
@ -410,7 +410,11 @@ static void test_swapchain(void)
|
|||
d3dpp.BackBufferCount = 0;
|
||||
hr = IDirect3DDevice8_CreateAdditionalSwapChain(device, &d3dpp, &swapchain1);
|
||||
ok(SUCCEEDED(hr), "Got hr %#lx.\n", hr);
|
||||
ok(d3dpp.BackBufferCount == 1, "The back buffer count in the presentparams struct is %d\n", d3dpp.BackBufferCount);
|
||||
ok(!d3dpp.BackBufferWidth, "Got unexpected BackBufferWidth %u.\n", d3dpp.BackBufferWidth);
|
||||
ok(!d3dpp.BackBufferHeight, "Got unexpected BackBufferHeight %u.\n", d3dpp.BackBufferHeight);
|
||||
ok(d3dpp.BackBufferFormat == D3DFMT_A8R8G8B8, "Got unexpected BackBufferFormat %#x.\n", d3dpp.BackBufferFormat);
|
||||
ok(d3dpp.BackBufferCount == 1, "Got unexpected BackBufferCount %u.\n", d3dpp.BackBufferCount);
|
||||
ok(!d3dpp.hDeviceWindow, "Got unexpected hDeviceWindow %p.\n", d3dpp.hDeviceWindow);
|
||||
|
||||
d3dpp.hDeviceWindow = NULL;
|
||||
d3dpp.BackBufferCount = 1;
|
||||
|
@ -8896,6 +8900,33 @@ static void test_swapchain_parameters(void)
|
|||
IDirect3DDevice8_Release(device);
|
||||
}
|
||||
|
||||
memset(&present_parameters, 0, sizeof(present_parameters));
|
||||
present_parameters.SwapEffect = D3DSWAPEFFECT_DISCARD;
|
||||
present_parameters.Windowed = TRUE;
|
||||
present_parameters.BackBufferWidth = 0;
|
||||
present_parameters.BackBufferHeight = 0;
|
||||
present_parameters.BackBufferFormat = D3DFMT_X8R8G8B8;
|
||||
|
||||
hr = IDirect3D8_CreateDevice(d3d, D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL,
|
||||
window, D3DCREATE_SOFTWARE_VERTEXPROCESSING,
|
||||
&present_parameters, &device);
|
||||
|
||||
ok(hr == S_OK, "Got unexpected hr %#lx.\n", hr);
|
||||
ok(!present_parameters.BackBufferWidth, "Got unexpected BackBufferWidth %u.\n", present_parameters.BackBufferWidth);
|
||||
ok(!present_parameters.BackBufferHeight, "Got unexpected BackBufferHeight %u,.\n", present_parameters.BackBufferHeight);
|
||||
ok(present_parameters.BackBufferFormat == D3DFMT_X8R8G8B8, "Got unexpected BackBufferFormat %#x.\n", present_parameters.BackBufferFormat);
|
||||
ok(present_parameters.BackBufferCount == 1, "Got unexpected BackBufferCount %u.\n", present_parameters.BackBufferCount);
|
||||
ok(!present_parameters.MultiSampleType, "Got unexpected MultiSampleType %u.\n", present_parameters.MultiSampleType);
|
||||
ok(present_parameters.SwapEffect == D3DSWAPEFFECT_DISCARD, "Got unexpected SwapEffect %#x.\n", present_parameters.SwapEffect);
|
||||
ok(!present_parameters.hDeviceWindow, "Got unexpected hDeviceWindow %p.\n", present_parameters.hDeviceWindow);
|
||||
ok(present_parameters.Windowed, "Got unexpected Windowed %#x.\n", present_parameters.Windowed);
|
||||
ok(!present_parameters.EnableAutoDepthStencil, "Got unexpected EnableAutoDepthStencil %#x.\n", present_parameters.EnableAutoDepthStencil);
|
||||
ok(!present_parameters.AutoDepthStencilFormat, "Got unexpected AutoDepthStencilFormat %#x.\n", present_parameters.AutoDepthStencilFormat);
|
||||
ok(!present_parameters.Flags, "Got unexpected Flags %#lx.\n", present_parameters.Flags);
|
||||
ok(!present_parameters.FullScreen_RefreshRateInHz, "Got unexpected FullScreen_RefreshRateInHz %u.\n", present_parameters.FullScreen_RefreshRateInHz);
|
||||
ok(!present_parameters.FullScreen_PresentationInterval, "Got unexpected FullScreen_PresentationInterval %#x.\n", present_parameters.FullScreen_PresentationInterval);
|
||||
|
||||
IDirect3DDevice8_Release(device);
|
||||
IDirect3D8_Release(d3d);
|
||||
DestroyWindow(window);
|
||||
}
|
||||
|
|
|
@ -12188,6 +12188,200 @@ static void test_mipmap_upload(void)
|
|||
release_test_context(&context);
|
||||
}
|
||||
|
||||
static void test_specular_shaders(void)
|
||||
{
|
||||
struct d3d8_test_context context;
|
||||
struct surface_readback rb;
|
||||
IDirect3DDevice8 *device;
|
||||
unsigned int color;
|
||||
DWORD vs, ps;
|
||||
HRESULT hr;
|
||||
|
||||
static const DWORD vs_code[] =
|
||||
{
|
||||
#if 0
|
||||
vs_1_1
|
||||
mov oPos, v0
|
||||
mov oD0, v5
|
||||
mov oD1, v6
|
||||
#endif
|
||||
0xfffe0101,
|
||||
0x00000001, 0xc00f0000, 0x90e40000,
|
||||
0x00000001, 0xd00f0000, 0x90e40005,
|
||||
0x00000001, 0xd00f0001, 0x90e40006,
|
||||
0x0000ffff
|
||||
};
|
||||
|
||||
static const DWORD ps_code[] =
|
||||
{
|
||||
#if 0
|
||||
ps_1_1
|
||||
mov r0, v1
|
||||
#endif
|
||||
0xffff0101,
|
||||
0x00000001, 0x800f0000, 0x90e40001,
|
||||
0x0000ffff
|
||||
};
|
||||
|
||||
static const DWORD decl[] =
|
||||
{
|
||||
D3DVSD_STREAM(0),
|
||||
D3DVSD_REG(D3DVSDE_POSITION, D3DVSDT_FLOAT3),
|
||||
D3DVSD_REG(D3DVSDE_NORMAL, D3DVSDT_FLOAT3),
|
||||
D3DVSD_REG(D3DVSDE_DIFFUSE, D3DVSDT_D3DCOLOR),
|
||||
D3DVSD_REG(D3DVSDE_SPECULAR, D3DVSDT_D3DCOLOR),
|
||||
D3DVSD_END()
|
||||
};
|
||||
|
||||
static const struct
|
||||
{
|
||||
struct vec3 position;
|
||||
struct vec3 normal;
|
||||
unsigned int diffuse;
|
||||
unsigned int specular;
|
||||
}
|
||||
quad[] =
|
||||
{
|
||||
{{-1.0f, -1.0f, 0.0f}, {1.0f, 1.0f, 1.0f}, 0x0000003f, 0x00007f00},
|
||||
{{-1.0f, 1.0f, 0.0f}, {1.0f, 1.0f, 1.0f}, 0x0000003f, 0x00007f00},
|
||||
{{ 1.0f, -1.0f, 0.0f}, {1.0f, 1.0f, 1.0f}, 0x0000003f, 0x00007f00},
|
||||
{{ 1.0f, 1.0f, 0.0f}, {1.0f, 1.0f, 1.0f}, 0x0000003f, 0x00007f00},
|
||||
};
|
||||
|
||||
static const D3DMATERIAL8 material =
|
||||
{
|
||||
.Specular = {0.7f, 0.0f, 0.7f, 1.0f},
|
||||
.Power = 2.0f,
|
||||
};
|
||||
|
||||
static const D3DLIGHT8 light =
|
||||
{
|
||||
.Type = D3DLIGHT_DIRECTIONAL,
|
||||
.Diffuse = {0.0f, 0.1f, 0.1f, 0.0f},
|
||||
.Specular = {0.8f, 0.8f, 0.8f, 0.0f},
|
||||
.Direction = {0.0f, 0.0f, -1.0f},
|
||||
};
|
||||
|
||||
if (!init_test_context(&context))
|
||||
return;
|
||||
device = context.device;
|
||||
|
||||
/* Vertex shader only. */
|
||||
|
||||
hr = IDirect3DDevice8_CreateVertexShader(device, decl, vs_code, &vs, 0);
|
||||
ok(hr == S_OK, "Got hr %#lx.\n", hr);
|
||||
|
||||
hr = IDirect3DDevice8_Clear(device, 0, NULL, D3DCLEAR_TARGET, 0xffff0000, 0.0, 0);
|
||||
ok(hr == S_OK, "Got hr %#lx.\n", hr);
|
||||
|
||||
hr = IDirect3DDevice8_BeginScene(device);
|
||||
ok(hr == S_OK, "Got hr %#lx.\n", hr);
|
||||
hr = IDirect3DDevice8_SetVertexShader(device, vs);
|
||||
ok(hr == S_OK, "Got hr %#lx.\n", hr);
|
||||
hr = IDirect3DDevice8_SetRenderState(device, D3DRS_ZENABLE, FALSE);
|
||||
ok(hr == S_OK, "Got hr %#lx.\n", hr);
|
||||
hr = IDirect3DDevice8_SetRenderState(device, D3DRS_SPECULARENABLE, TRUE);
|
||||
ok(hr == S_OK, "Got hr %#lx.\n", hr);
|
||||
hr = IDirect3DDevice8_DrawPrimitiveUP(device, D3DPT_TRIANGLESTRIP, 2, quad, sizeof(*quad));
|
||||
ok(hr == S_OK, "Got hr %#lx.\n", hr);
|
||||
hr = IDirect3DDevice8_EndScene(device);
|
||||
ok(hr == S_OK, "Got hr %#lx.\n", hr);
|
||||
check_rt_color(context.backbuffer, 0x00007f3f);
|
||||
|
||||
hr = IDirect3DDevice8_BeginScene(device);
|
||||
ok(hr == S_OK, "Got hr %#lx.\n", hr);
|
||||
hr = IDirect3DDevice8_SetRenderState(device, D3DRS_SPECULARENABLE, FALSE);
|
||||
ok(hr == S_OK, "Got hr %#lx.\n", hr);
|
||||
hr = IDirect3DDevice8_DrawPrimitiveUP(device, D3DPT_TRIANGLESTRIP, 2, quad, sizeof(*quad));
|
||||
ok(hr == S_OK, "Got hr %#lx.\n", hr);
|
||||
hr = IDirect3DDevice8_EndScene(device);
|
||||
ok(hr == S_OK, "Got hr %#lx.\n", hr);
|
||||
check_rt_color(context.backbuffer, 0x0000003f);
|
||||
|
||||
hr = IDirect3DDevice8_CreatePixelShader(device, ps_code, &ps);
|
||||
ok(hr == S_OK, "Got hr %#lx.\n", hr);
|
||||
|
||||
/* Pixel shader only. */
|
||||
|
||||
hr = IDirect3DDevice8_SetPixelShader(device, ps);
|
||||
ok(hr == S_OK, "Got hr %#lx.\n", hr);
|
||||
hr = IDirect3DDevice8_SetVertexShader(device, D3DFVF_XYZ | D3DFVF_NORMAL | D3DFVF_DIFFUSE | D3DFVF_SPECULAR);
|
||||
ok(hr == S_OK, "Got hr %#lx.\n", hr);
|
||||
|
||||
hr = IDirect3DDevice8_SetMaterial(device, &material);
|
||||
ok(hr == S_OK, "Got hr %#lx.\n", hr);
|
||||
hr = IDirect3DDevice8_SetLight(device, 0, &light);
|
||||
ok(hr == S_OK, "Got hr %#lx.\n", hr);
|
||||
hr = IDirect3DDevice8_LightEnable(device, 0, TRUE);
|
||||
ok(hr == S_OK, "Got hr %#lx.\n", hr);
|
||||
|
||||
hr = IDirect3DDevice8_BeginScene(device);
|
||||
ok(hr == S_OK, "Got hr %#lx.\n", hr);
|
||||
hr = IDirect3DDevice8_SetRenderState(device, D3DRS_SPECULARENABLE, TRUE);
|
||||
ok(hr == S_OK, "Got hr %#lx.\n", hr);
|
||||
hr = IDirect3DDevice8_DrawPrimitiveUP(device, D3DPT_TRIANGLESTRIP, 2, quad, sizeof(*quad));
|
||||
ok(hr == S_OK, "Got hr %#lx.\n", hr);
|
||||
hr = IDirect3DDevice8_EndScene(device);
|
||||
ok(hr == S_OK, "Got hr %#lx.\n", hr);
|
||||
get_surface_readback(context.backbuffer, &rb);
|
||||
color = get_readback_color(&rb, 160, 120);
|
||||
ok(color_match(color, 0x003300, 1), "Got color %08x.\n", color);
|
||||
color = get_readback_color(&rb, 480, 120);
|
||||
ok(color_match(color, 0x001900, 1), "Got color %08x.\n", color);
|
||||
color = get_readback_color(&rb, 160, 360);
|
||||
ok(color_match(color, 0x009900, 1), "Got color %08x.\n", color);
|
||||
color = get_readback_color(&rb, 480, 360);
|
||||
ok(color_match(color, 0x003300, 1), "Got color %08x.\n", color);
|
||||
release_surface_readback(&rb);
|
||||
|
||||
hr = IDirect3DDevice8_BeginScene(device);
|
||||
ok(hr == S_OK, "Got hr %#lx.\n", hr);
|
||||
hr = IDirect3DDevice8_SetRenderState(device, D3DRS_SPECULARENABLE, FALSE);
|
||||
ok(hr == S_OK, "Got hr %#lx.\n", hr);
|
||||
hr = IDirect3DDevice8_DrawPrimitiveUP(device, D3DPT_TRIANGLESTRIP, 2, quad, sizeof(*quad));
|
||||
ok(hr == S_OK, "Got hr %#lx.\n", hr);
|
||||
hr = IDirect3DDevice8_EndScene(device);
|
||||
ok(hr == S_OK, "Got hr %#lx.\n", hr);
|
||||
check_rt_color(context.backbuffer, 0x00007f00);
|
||||
|
||||
hr = IDirect3DDevice8_BeginScene(device);
|
||||
ok(hr == S_OK, "Got hr %#lx.\n", hr);
|
||||
hr = IDirect3DDevice8_SetRenderState(device, D3DRS_SPECULARMATERIALSOURCE, D3DMCS_MATERIAL);
|
||||
ok(hr == S_OK, "Got hr %#lx.\n", hr);
|
||||
hr = IDirect3DDevice8_DrawPrimitiveUP(device, D3DPT_TRIANGLESTRIP, 2, quad, sizeof(*quad));
|
||||
ok(hr == S_OK, "Got hr %#lx.\n", hr);
|
||||
hr = IDirect3DDevice8_EndScene(device);
|
||||
ok(hr == S_OK, "Got hr %#lx.\n", hr);
|
||||
check_rt_color(context.backbuffer, 0x00007f00);
|
||||
|
||||
/* Vertex shader and pixel shader. */
|
||||
|
||||
hr = IDirect3DDevice8_SetVertexShader(device, vs);
|
||||
ok(hr == S_OK, "Got hr %#lx.\n", hr);
|
||||
|
||||
hr = IDirect3DDevice8_BeginScene(device);
|
||||
ok(hr == S_OK, "Got hr %#lx.\n", hr);
|
||||
hr = IDirect3DDevice8_SetRenderState(device, D3DRS_SPECULARENABLE, TRUE);
|
||||
ok(hr == S_OK, "Got hr %#lx.\n", hr);
|
||||
hr = IDirect3DDevice8_DrawPrimitiveUP(device, D3DPT_TRIANGLESTRIP, 2, quad, sizeof(*quad));
|
||||
ok(hr == S_OK, "Got hr %#lx.\n", hr);
|
||||
hr = IDirect3DDevice8_EndScene(device);
|
||||
ok(hr == S_OK, "Got hr %#lx.\n", hr);
|
||||
check_rt_color(context.backbuffer, 0x00007f00);
|
||||
|
||||
hr = IDirect3DDevice8_BeginScene(device);
|
||||
ok(hr == S_OK, "Got hr %#lx.\n", hr);
|
||||
hr = IDirect3DDevice8_SetRenderState(device, D3DRS_SPECULARENABLE, FALSE);
|
||||
ok(hr == S_OK, "Got hr %#lx.\n", hr);
|
||||
hr = IDirect3DDevice8_DrawPrimitiveUP(device, D3DPT_TRIANGLESTRIP, 2, quad, sizeof(*quad));
|
||||
ok(hr == S_OK, "Got hr %#lx.\n", hr);
|
||||
hr = IDirect3DDevice8_EndScene(device);
|
||||
ok(hr == S_OK, "Got hr %#lx.\n", hr);
|
||||
check_rt_color(context.backbuffer, 0x00007f00);
|
||||
|
||||
release_test_context(&context);
|
||||
}
|
||||
|
||||
START_TEST(visual)
|
||||
{
|
||||
D3DADAPTER_IDENTIFIER8 identifier;
|
||||
|
@ -12271,4 +12465,5 @@ START_TEST(visual)
|
|||
test_filling_convention();
|
||||
test_managed_reset();
|
||||
test_mipmap_upload();
|
||||
test_specular_shaders();
|
||||
}
|
||||
|
|
|
@ -370,6 +370,7 @@ static const struct wined3d_swapchain_state_parent_ops d3d9_swapchain_state_pare
|
|||
static HRESULT swapchain_init(struct d3d9_swapchain *swapchain, struct d3d9_device *device,
|
||||
struct wined3d_swapchain_desc *desc, unsigned int swap_interval)
|
||||
{
|
||||
struct wined3d_swapchain_desc swapchain_desc;
|
||||
HRESULT hr;
|
||||
|
||||
swapchain->refcount = 1;
|
||||
|
@ -384,6 +385,11 @@ static HRESULT swapchain_init(struct d3d9_swapchain *swapchain, struct d3d9_devi
|
|||
return hr;
|
||||
}
|
||||
|
||||
wined3d_swapchain_get_desc(swapchain->wined3d_swapchain, &swapchain_desc);
|
||||
desc->backbuffer_width = swapchain_desc.backbuffer_width;
|
||||
desc->backbuffer_height = swapchain_desc.backbuffer_height;
|
||||
desc->backbuffer_format = swapchain_desc.backbuffer_format;
|
||||
|
||||
swapchain->parent_device = &device->IDirect3DDevice9Ex_iface;
|
||||
IDirect3DDevice9Ex_AddRef(swapchain->parent_device);
|
||||
|
||||
|
|
|
@ -3686,6 +3686,7 @@ static void test_swapchain_parameters(void)
|
|||
{
|
||||
IDirect3DDevice9Ex *device;
|
||||
IDirect3D9Ex *d3d9ex;
|
||||
RECT client_rect;
|
||||
HWND window;
|
||||
HRESULT hr;
|
||||
unsigned int i;
|
||||
|
@ -3837,6 +3838,39 @@ static void test_swapchain_parameters(void)
|
|||
IDirect3DDevice9Ex_Release(device);
|
||||
}
|
||||
|
||||
memset(&present_parameters, 0, sizeof(present_parameters));
|
||||
present_parameters.SwapEffect = D3DSWAPEFFECT_DISCARD;
|
||||
present_parameters.Windowed = TRUE;
|
||||
present_parameters.BackBufferWidth = 0;
|
||||
present_parameters.BackBufferHeight = 0;
|
||||
present_parameters.BackBufferFormat = D3DFMT_UNKNOWN;
|
||||
|
||||
GetClientRect(window, &client_rect);
|
||||
|
||||
hr = IDirect3D9Ex_CreateDeviceEx(d3d9ex, D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL,
|
||||
window, D3DCREATE_SOFTWARE_VERTEXPROCESSING,
|
||||
&present_parameters, NULL, &device);
|
||||
|
||||
ok(present_parameters.BackBufferWidth == client_rect.right, "Got unexpected BackBufferWidth %u, expected %ld.\n",
|
||||
present_parameters.BackBufferWidth, client_rect.right);
|
||||
ok(present_parameters.BackBufferHeight == client_rect.bottom, "Got unexpected BackBufferHeight %u, expected %ld.\n",
|
||||
present_parameters.BackBufferHeight, client_rect.bottom);
|
||||
ok(present_parameters.BackBufferFormat != D3DFMT_UNKNOWN, "Got unexpected BackBufferFormat %#x.\n",
|
||||
present_parameters.BackBufferFormat);
|
||||
ok(present_parameters.BackBufferCount == 1, "Got unexpected BackBufferCount %u.\n", present_parameters.BackBufferCount);
|
||||
ok(!present_parameters.MultiSampleType, "Got unexpected MultiSampleType %u.\n", present_parameters.MultiSampleType);
|
||||
ok(!present_parameters.MultiSampleQuality, "Got unexpected MultiSampleQuality %lu.\n", present_parameters.MultiSampleQuality);
|
||||
ok(present_parameters.SwapEffect == D3DSWAPEFFECT_DISCARD, "Got unexpected SwapEffect %#x.\n", present_parameters.SwapEffect);
|
||||
ok(!present_parameters.hDeviceWindow, "Got unexpected hDeviceWindow %p.\n", present_parameters.hDeviceWindow);
|
||||
ok(present_parameters.Windowed, "Got unexpected Windowed %#x.\n", present_parameters.Windowed);
|
||||
ok(!present_parameters.EnableAutoDepthStencil, "Got unexpected EnableAutoDepthStencil %#x.\n", present_parameters.EnableAutoDepthStencil);
|
||||
ok(!present_parameters.AutoDepthStencilFormat, "Got unexpected AutoDepthStencilFormat %#x.\n", present_parameters.AutoDepthStencilFormat);
|
||||
ok(!present_parameters.Flags, "Got unexpected Flags %#lx.\n", present_parameters.Flags);
|
||||
ok(!present_parameters.FullScreen_RefreshRateInHz, "Got unexpected FullScreen_RefreshRateInHz %u.\n",
|
||||
present_parameters.FullScreen_RefreshRateInHz);
|
||||
ok(!present_parameters.PresentationInterval, "Got unexpected PresentationInterval %#x.\n", present_parameters.PresentationInterval);
|
||||
IDirect3DDevice9Ex_Release(device);
|
||||
|
||||
IDirect3D9Ex_Release(d3d9ex);
|
||||
DestroyWindow(window);
|
||||
}
|
||||
|
|
|
@ -1263,6 +1263,7 @@ static void test_swapchain(void)
|
|||
IDirect3DSurface9 *backbuffer, *stereo_buffer;
|
||||
D3DPRESENT_PARAMETERS d3dpp;
|
||||
IDirect3DDevice9 *device;
|
||||
RECT client_rect;
|
||||
IDirect3D9 *d3d;
|
||||
ULONG refcount;
|
||||
HWND window, window2;
|
||||
|
@ -1341,11 +1342,23 @@ static void test_swapchain(void)
|
|||
ok(swapchainX == NULL, "Swapchain 1 is %p\n", swapchainX);
|
||||
if(swapchainX) IDirect3DSwapChain9_Release(swapchainX);
|
||||
|
||||
memset(&d3dpp, 0, sizeof(d3dpp));
|
||||
d3dpp.Windowed = TRUE;
|
||||
d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
|
||||
d3dpp.BackBufferFormat = D3DFMT_A8R8G8B8;
|
||||
GetClientRect(window, &client_rect);
|
||||
|
||||
/* Create a bunch of swapchains */
|
||||
d3dpp.BackBufferCount = 0;
|
||||
hr = IDirect3DDevice9_CreateAdditionalSwapChain(device, &d3dpp, &swapchain1);
|
||||
ok(SUCCEEDED(hr), "Got hr %#lx.\n", hr);
|
||||
ok(d3dpp.BackBufferCount == 1, "The back buffer count in the presentparams struct is %d\n", d3dpp.BackBufferCount);
|
||||
ok(d3dpp.BackBufferWidth == client_rect.right, "Got unexpected BackBufferWidth %u, expected %ld.\n",
|
||||
d3dpp.BackBufferWidth, client_rect.right);
|
||||
ok(d3dpp.BackBufferHeight == client_rect.bottom, "Got unexpected BackBufferHeight %u, expected %ld.\n",
|
||||
d3dpp.BackBufferHeight, client_rect.bottom);
|
||||
ok(d3dpp.BackBufferFormat == D3DFMT_A8R8G8B8, "Got unexpected BackBufferFormat %#x.\n", d3dpp.BackBufferFormat);
|
||||
ok(d3dpp.BackBufferCount == 1, "Got unexpected BackBufferCount %u.\n", d3dpp.BackBufferCount);
|
||||
ok(!d3dpp.hDeviceWindow, "Got unexpected hDeviceWindow %p.\n", d3dpp.hDeviceWindow);
|
||||
|
||||
d3dpp.hDeviceWindow = NULL;
|
||||
d3dpp.BackBufferCount = 1;
|
||||
|
@ -12296,6 +12309,7 @@ static void test_swapchain_parameters(void)
|
|||
{
|
||||
IDirect3DDevice9 *device;
|
||||
HRESULT hr, expected_hr;
|
||||
RECT client_rect;
|
||||
IDirect3D9 *d3d;
|
||||
D3DCAPS9 caps;
|
||||
HWND window;
|
||||
|
@ -12493,6 +12507,40 @@ static void test_swapchain_parameters(void)
|
|||
IDirect3DDevice9_Release(device);
|
||||
}
|
||||
|
||||
memset(&present_parameters, 0, sizeof(present_parameters));
|
||||
present_parameters.SwapEffect = D3DSWAPEFFECT_DISCARD;
|
||||
present_parameters.Windowed = TRUE;
|
||||
present_parameters.BackBufferWidth = 0;
|
||||
present_parameters.BackBufferHeight = 0;
|
||||
present_parameters.BackBufferFormat = D3DFMT_UNKNOWN;
|
||||
|
||||
GetClientRect(window, &client_rect);
|
||||
|
||||
hr = IDirect3D9_CreateDevice(d3d, D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL,
|
||||
window, D3DCREATE_SOFTWARE_VERTEXPROCESSING,
|
||||
&present_parameters, &device);
|
||||
|
||||
ok(hr == S_OK, "Got unexpected hr %#lx.\n", hr);
|
||||
ok(present_parameters.BackBufferWidth == client_rect.right, "Got unexpected BackBufferWidth %u, expected %ld.\n",
|
||||
present_parameters.BackBufferWidth, client_rect.right);
|
||||
ok(present_parameters.BackBufferHeight == client_rect.bottom, "Got unexpected BackBufferHeight %u, expected %ld.\n",
|
||||
present_parameters.BackBufferHeight, client_rect.bottom);
|
||||
ok(present_parameters.BackBufferFormat != D3DFMT_UNKNOWN, "Got unexpected BackBufferFormat %#x.\n",
|
||||
present_parameters.BackBufferFormat);
|
||||
ok(present_parameters.BackBufferCount == 1, "Got unexpected BackBufferCount %u.\n", present_parameters.BackBufferCount);
|
||||
ok(!present_parameters.MultiSampleType, "Got unexpected MultiSampleType %u.\n", present_parameters.MultiSampleType);
|
||||
ok(!present_parameters.MultiSampleQuality, "Got unexpected MultiSampleQuality %lu.\n", present_parameters.MultiSampleQuality);
|
||||
ok(present_parameters.SwapEffect == D3DSWAPEFFECT_DISCARD, "Got unexpected SwapEffect %#x.\n", present_parameters.SwapEffect);
|
||||
ok(!present_parameters.hDeviceWindow, "Got unexpected hDeviceWindow %p.\n", present_parameters.hDeviceWindow);
|
||||
ok(present_parameters.Windowed, "Got unexpected Windowed %#x.\n", present_parameters.Windowed);
|
||||
ok(!present_parameters.EnableAutoDepthStencil, "Got unexpected EnableAutoDepthStencil %#x.\n", present_parameters.EnableAutoDepthStencil);
|
||||
ok(!present_parameters.AutoDepthStencilFormat, "Got unexpected AutoDepthStencilFormat %#x.\n", present_parameters.AutoDepthStencilFormat);
|
||||
ok(!present_parameters.Flags, "Got unexpected Flags %#lx.\n", present_parameters.Flags);
|
||||
ok(!present_parameters.FullScreen_RefreshRateInHz, "Got unexpected FullScreen_RefreshRateInHz %u.\n",
|
||||
present_parameters.FullScreen_RefreshRateInHz);
|
||||
ok(!present_parameters.PresentationInterval, "Got unexpected PresentationInterval %#x.\n", present_parameters.PresentationInterval);
|
||||
|
||||
IDirect3DDevice9_Release(device);
|
||||
IDirect3D9_Release(d3d);
|
||||
DestroyWindow(window);
|
||||
}
|
||||
|
|
|
@ -29,6 +29,7 @@
|
|||
*/
|
||||
|
||||
#include <stdbool.h>
|
||||
#include <stdint.h>
|
||||
#include <limits.h>
|
||||
#include <math.h>
|
||||
|
||||
|
@ -107,6 +108,18 @@ static BOOL compare_vec4(const struct vec4 *vec, float x, float y, float z, floa
|
|||
&& compare_float(vec->w, w, ulps);
|
||||
}
|
||||
|
||||
static uint32_t float_to_int(float f)
|
||||
{
|
||||
union
|
||||
{
|
||||
uint32_t u;
|
||||
float f;
|
||||
} u;
|
||||
|
||||
u.f = f;
|
||||
return u.u;
|
||||
}
|
||||
|
||||
static BOOL adapter_is_warp(const D3DADAPTER_IDENTIFIER9 *identifier)
|
||||
{
|
||||
return !strcmp(identifier->Driver, "d3d10warp.dll");
|
||||
|
@ -1667,16 +1680,17 @@ static void color_fill_test(void)
|
|||
{D3DPOOL_MANAGED, 0, D3DERR_INVALIDCALL},
|
||||
{D3DPOOL_SCRATCH, 0, D3DERR_INVALIDCALL},
|
||||
};
|
||||
enum format_flags
|
||||
{
|
||||
CHECK_FILL_VALUE = 0x1,
|
||||
BLOCKS = 0x2,
|
||||
FLOAT_VALUES = 0x4,
|
||||
};
|
||||
static const struct
|
||||
{
|
||||
D3DFORMAT format;
|
||||
const char *name;
|
||||
enum
|
||||
{
|
||||
CHECK_FILL_VALUE = 0x1,
|
||||
BLOCKS = 0x2,
|
||||
FLOAT_VALUES = 0x4,
|
||||
} flags;
|
||||
enum format_flags flags;
|
||||
unsigned int fill_i[4];
|
||||
float fill_f[4];
|
||||
}
|
||||
|
@ -3366,7 +3380,7 @@ static void generate_bumpmap_textures(IDirect3DDevice9 *device) {
|
|||
for (y = 0; y < 128; ++y)
|
||||
{
|
||||
if(i)
|
||||
{ /* Set up black texture with 2x2 texel white spot in the middle */
|
||||
{
|
||||
DWORD *ptr = (DWORD *)(((BYTE *)locked_rect.pBits) + (y * locked_rect.Pitch));
|
||||
for (x = 0; x < 128; ++x)
|
||||
{
|
||||
|
@ -3510,10 +3524,10 @@ static void texbem_test(void)
|
|||
|
||||
generate_bumpmap_textures(device);
|
||||
|
||||
IDirect3DDevice9_SetTextureStageState(device, 1, D3DTSS_BUMPENVMAT00, *(LPDWORD)&bumpenvmat[0]);
|
||||
IDirect3DDevice9_SetTextureStageState(device, 1, D3DTSS_BUMPENVMAT01, *(LPDWORD)&bumpenvmat[1]);
|
||||
IDirect3DDevice9_SetTextureStageState(device, 1, D3DTSS_BUMPENVMAT10, *(LPDWORD)&bumpenvmat[2]);
|
||||
hr = IDirect3DDevice9_SetTextureStageState(device, 1, D3DTSS_BUMPENVMAT11, *(LPDWORD)&bumpenvmat[3]);
|
||||
IDirect3DDevice9_SetTextureStageState(device, 1, D3DTSS_BUMPENVMAT00, float_to_int(bumpenvmat[0]));
|
||||
IDirect3DDevice9_SetTextureStageState(device, 1, D3DTSS_BUMPENVMAT01, float_to_int(bumpenvmat[1]));
|
||||
IDirect3DDevice9_SetTextureStageState(device, 1, D3DTSS_BUMPENVMAT10, float_to_int(bumpenvmat[2]));
|
||||
hr = IDirect3DDevice9_SetTextureStageState(device, 1, D3DTSS_BUMPENVMAT11, float_to_int(bumpenvmat[3]));
|
||||
ok(hr == S_OK, "Got hr %#lx.\n", hr);
|
||||
|
||||
hr = IDirect3DDevice9_SetVertexShader(device, NULL);
|
||||
|
@ -3664,24 +3678,24 @@ static void texbem_test(void)
|
|||
|
||||
bumpenvmat[0] =-1.0; bumpenvmat[2] = 2.0;
|
||||
bumpenvmat[1] = 0.0; bumpenvmat[3] = 0.0;
|
||||
hr = IDirect3DDevice9_SetTextureStageState(device, 1, D3DTSS_BUMPENVMAT00, *(LPDWORD)&bumpenvmat[0]);
|
||||
hr = IDirect3DDevice9_SetTextureStageState(device, 1, D3DTSS_BUMPENVMAT00, float_to_int(bumpenvmat[0]));
|
||||
ok(hr == S_OK, "Got hr %#lx.\n", hr);
|
||||
hr = IDirect3DDevice9_SetTextureStageState(device, 1, D3DTSS_BUMPENVMAT01, *(LPDWORD)&bumpenvmat[1]);
|
||||
hr = IDirect3DDevice9_SetTextureStageState(device, 1, D3DTSS_BUMPENVMAT01, float_to_int(bumpenvmat[1]));
|
||||
ok(hr == S_OK, "Got hr %#lx.\n", hr);
|
||||
hr = IDirect3DDevice9_SetTextureStageState(device, 1, D3DTSS_BUMPENVMAT10, *(LPDWORD)&bumpenvmat[2]);
|
||||
hr = IDirect3DDevice9_SetTextureStageState(device, 1, D3DTSS_BUMPENVMAT10, float_to_int(bumpenvmat[2]));
|
||||
ok(hr == S_OK, "Got hr %#lx.\n", hr);
|
||||
hr = IDirect3DDevice9_SetTextureStageState(device, 1, D3DTSS_BUMPENVMAT11, *(LPDWORD)&bumpenvmat[3]);
|
||||
hr = IDirect3DDevice9_SetTextureStageState(device, 1, D3DTSS_BUMPENVMAT11, float_to_int(bumpenvmat[3]));
|
||||
ok(hr == S_OK, "Got hr %#lx.\n", hr);
|
||||
|
||||
bumpenvmat[0] = 1.5; bumpenvmat[2] = 0.0;
|
||||
bumpenvmat[1] = 0.0; bumpenvmat[3] = 0.5;
|
||||
hr = IDirect3DDevice9_SetTextureStageState(device, 3, D3DTSS_BUMPENVMAT00, *(LPDWORD)&bumpenvmat[0]);
|
||||
hr = IDirect3DDevice9_SetTextureStageState(device, 3, D3DTSS_BUMPENVMAT00, float_to_int(bumpenvmat[0]));
|
||||
ok(hr == S_OK, "Got hr %#lx.\n", hr);
|
||||
hr = IDirect3DDevice9_SetTextureStageState(device, 3, D3DTSS_BUMPENVMAT01, *(LPDWORD)&bumpenvmat[1]);
|
||||
hr = IDirect3DDevice9_SetTextureStageState(device, 3, D3DTSS_BUMPENVMAT01, float_to_int(bumpenvmat[1]));
|
||||
ok(hr == S_OK, "Got hr %#lx.\n", hr);
|
||||
hr = IDirect3DDevice9_SetTextureStageState(device, 3, D3DTSS_BUMPENVMAT10, *(LPDWORD)&bumpenvmat[2]);
|
||||
hr = IDirect3DDevice9_SetTextureStageState(device, 3, D3DTSS_BUMPENVMAT10, float_to_int(bumpenvmat[2]));
|
||||
ok(hr == S_OK, "Got hr %#lx.\n", hr);
|
||||
hr = IDirect3DDevice9_SetTextureStageState(device, 3, D3DTSS_BUMPENVMAT11, *(LPDWORD)&bumpenvmat[3]);
|
||||
hr = IDirect3DDevice9_SetTextureStageState(device, 3, D3DTSS_BUMPENVMAT11, float_to_int(bumpenvmat[3]));
|
||||
ok(hr == S_OK, "Got hr %#lx.\n", hr);
|
||||
|
||||
hr = IDirect3DDevice9_SetSamplerState(device, 0, D3DSAMP_ADDRESSU, D3DTADDRESS_CLAMP);
|
||||
|
@ -11027,13 +11041,13 @@ static void fixed_function_bumpmap_test(void)
|
|||
/* Generate the textures */
|
||||
generate_bumpmap_textures(device);
|
||||
|
||||
hr = IDirect3DDevice9_SetTextureStageState(device, 0, D3DTSS_BUMPENVMAT00, *(LPDWORD)&bumpenvmat[0]);
|
||||
hr = IDirect3DDevice9_SetTextureStageState(device, 0, D3DTSS_BUMPENVMAT00, float_to_int(bumpenvmat[0]));
|
||||
ok(hr == S_OK, "Got hr %#lx.\n", hr);
|
||||
hr = IDirect3DDevice9_SetTextureStageState(device, 0, D3DTSS_BUMPENVMAT01, *(LPDWORD)&bumpenvmat[1]);
|
||||
hr = IDirect3DDevice9_SetTextureStageState(device, 0, D3DTSS_BUMPENVMAT01, float_to_int(bumpenvmat[1]));
|
||||
ok(hr == S_OK, "Got hr %#lx.\n", hr);
|
||||
hr = IDirect3DDevice9_SetTextureStageState(device, 0, D3DTSS_BUMPENVMAT10, *(LPDWORD)&bumpenvmat[2]);
|
||||
hr = IDirect3DDevice9_SetTextureStageState(device, 0, D3DTSS_BUMPENVMAT10, float_to_int(bumpenvmat[2]));
|
||||
ok(hr == S_OK, "Got hr %#lx.\n", hr);
|
||||
hr = IDirect3DDevice9_SetTextureStageState(device, 0, D3DTSS_BUMPENVMAT11, *(LPDWORD)&bumpenvmat[3]);
|
||||
hr = IDirect3DDevice9_SetTextureStageState(device, 0, D3DTSS_BUMPENVMAT11, float_to_int(bumpenvmat[3]));
|
||||
ok(hr == S_OK, "Got hr %#lx.\n", hr);
|
||||
|
||||
hr = IDirect3DDevice9_SetTextureStageState(device, 0, D3DTSS_COLOROP, D3DTOP_BUMPENVMAP);
|
||||
|
@ -23249,16 +23263,17 @@ static void test_texture_blending(void)
|
|||
DWORD value;
|
||||
};
|
||||
|
||||
enum texture_stage_texture
|
||||
{
|
||||
TEXTURE_INVALID,
|
||||
TEXTURE_NONE,
|
||||
TEXTURE_BUMPMAP,
|
||||
TEXTURE_RED,
|
||||
};
|
||||
|
||||
struct texture_stage
|
||||
{
|
||||
enum
|
||||
{
|
||||
TEXTURE_INVALID,
|
||||
TEXTURE_NONE,
|
||||
TEXTURE_BUMPMAP,
|
||||
TEXTURE_RED,
|
||||
}
|
||||
texture;
|
||||
enum texture_stage_texture texture;
|
||||
struct texture_stage_state state[20];
|
||||
};
|
||||
|
||||
|
@ -26438,16 +26453,23 @@ static void test_desktop_window(void)
|
|||
device = create_device(d3d, GetDesktopWindow(), GetDesktopWindow(), TRUE);
|
||||
ok(!!device, "Failed to create a D3D device.\n");
|
||||
|
||||
hr = IDirect3DDevice9_Clear(device, 0, NULL, D3DCLEAR_TARGET, 0xffff0000, 1.0f, 0);
|
||||
ok(SUCCEEDED(hr), "Failed to clear, hr %#lx.\n", hr);
|
||||
color = getPixelColor(device, 1, 1);
|
||||
ok(color == 0x00ff0000, "Got unexpected color 0x%08x.\n", color);
|
||||
if (device)
|
||||
{
|
||||
hr = IDirect3DDevice9_Clear(device, 0, NULL, D3DCLEAR_TARGET, 0xffff0000, 1.0f, 0);
|
||||
ok(SUCCEEDED(hr), "Failed to clear, hr %#lx.\n", hr);
|
||||
color = getPixelColor(device, 1, 1);
|
||||
ok(color == 0x00ff0000, "Got unexpected color 0x%08x.\n", color);
|
||||
|
||||
hr = IDirect3DDevice9_Present(device, NULL, NULL, NULL, NULL);
|
||||
ok(SUCCEEDED(hr), "Failed to present, hr %#lx.\n", hr);
|
||||
hr = IDirect3DDevice9_Present(device, NULL, NULL, NULL, NULL);
|
||||
ok(SUCCEEDED(hr), "Failed to present, hr %#lx.\n", hr);
|
||||
|
||||
refcount = IDirect3DDevice9_Release(device);
|
||||
ok(!refcount, "Device has %lu references left.\n", refcount);
|
||||
refcount = IDirect3DDevice9_Release(device);
|
||||
ok(!refcount, "Device has %lu references left.\n", refcount);
|
||||
}
|
||||
else
|
||||
{
|
||||
skip("Failed to create a D3D device for the desktop window, skipping tests.\n");
|
||||
}
|
||||
|
||||
/* test device with NULL HWND */
|
||||
device = create_device(d3d, NULL, NULL, TRUE);
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
MODULE = d3dcompiler_39.dll
|
||||
IMPORTLIB = d3dcompiler_39
|
||||
IMPORTS = wined3d
|
||||
EXTRADEFS = -DD3D_COMPILER_VERSION=39
|
||||
PARENTSRC = ../d3dcompiler_43
|
||||
|
|
|
@ -397,29 +397,12 @@ HRESULT WINAPI D3DAssemble(const void *data, SIZE_T datasize, const char *filena
|
|||
return hr;
|
||||
}
|
||||
|
||||
HRESULT WINAPI D3DCompile2(const void *data, SIZE_T data_size, const char *filename,
|
||||
const D3D_SHADER_MACRO *macros, ID3DInclude *include, const char *entry_point,
|
||||
const char *profile, UINT flags, UINT effect_flags, UINT secondary_flags,
|
||||
const void *secondary_data, SIZE_T secondary_data_size, ID3DBlob **shader_blob,
|
||||
ID3DBlob **messages_blob)
|
||||
static enum vkd3d_shader_target_type get_target_for_profile(const char *profile)
|
||||
{
|
||||
struct d3dcompiler_include_from_file include_from_file;
|
||||
struct vkd3d_shader_preprocess_info preprocess_info;
|
||||
struct vkd3d_shader_hlsl_source_info hlsl_info;
|
||||
struct vkd3d_shader_compile_option options[3];
|
||||
struct vkd3d_shader_compile_info compile_info;
|
||||
struct vkd3d_shader_compile_option *option;
|
||||
struct vkd3d_shader_code byte_code;
|
||||
const D3D_SHADER_MACRO *macro;
|
||||
size_t profile_len, i;
|
||||
char *messages;
|
||||
HRESULT hr;
|
||||
int ret;
|
||||
|
||||
static const char * const d3dbc_profiles[] =
|
||||
{
|
||||
"fx_2_",
|
||||
|
||||
"ps.1.",
|
||||
"ps.2.",
|
||||
"ps.3.",
|
||||
|
@ -439,6 +422,50 @@ HRESULT WINAPI D3DCompile2(const void *data, SIZE_T data_size, const char *filen
|
|||
"tx_1_",
|
||||
};
|
||||
|
||||
static const char * const fx_profiles[] =
|
||||
{
|
||||
"fx_2_0",
|
||||
"fx_4_0",
|
||||
"fx_4_1",
|
||||
"fx_5_0",
|
||||
};
|
||||
|
||||
profile_len = strlen(profile);
|
||||
for (i = 0; i < ARRAY_SIZE(d3dbc_profiles); ++i)
|
||||
{
|
||||
size_t len = strlen(d3dbc_profiles[i]);
|
||||
|
||||
if (len <= profile_len && !memcmp(profile, d3dbc_profiles[i], len))
|
||||
return VKD3D_SHADER_TARGET_D3D_BYTECODE;
|
||||
}
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(fx_profiles); ++i)
|
||||
{
|
||||
if (!strcmp(profile, fx_profiles[i]))
|
||||
return VKD3D_SHADER_TARGET_FX;
|
||||
}
|
||||
|
||||
return VKD3D_SHADER_TARGET_DXBC_TPF;
|
||||
}
|
||||
|
||||
HRESULT WINAPI D3DCompile2(const void *data, SIZE_T data_size, const char *filename,
|
||||
const D3D_SHADER_MACRO *macros, ID3DInclude *include, const char *entry_point,
|
||||
const char *profile, UINT flags, UINT effect_flags, UINT secondary_flags,
|
||||
const void *secondary_data, SIZE_T secondary_data_size, ID3DBlob **shader_blob,
|
||||
ID3DBlob **messages_blob)
|
||||
{
|
||||
struct d3dcompiler_include_from_file include_from_file;
|
||||
struct vkd3d_shader_preprocess_info preprocess_info;
|
||||
struct vkd3d_shader_hlsl_source_info hlsl_info;
|
||||
struct vkd3d_shader_compile_option options[4];
|
||||
struct vkd3d_shader_compile_info compile_info;
|
||||
struct vkd3d_shader_compile_option *option;
|
||||
struct vkd3d_shader_code byte_code;
|
||||
const D3D_SHADER_MACRO *macro;
|
||||
char *messages;
|
||||
HRESULT hr;
|
||||
int ret;
|
||||
|
||||
TRACE("data %p, data_size %Iu, filename %s, macros %p, include %p, entry_point %s, "
|
||||
"profile %s, flags %#x, effect_flags %#x, secondary_flags %#x, secondary_data %p, "
|
||||
"secondary_data_size %Iu, shader_blob %p, messages_blob %p.\n",
|
||||
|
@ -453,8 +480,11 @@ HRESULT WINAPI D3DCompile2(const void *data, SIZE_T data_size, const char *filen
|
|||
include = &include_from_file.ID3DInclude_iface;
|
||||
}
|
||||
|
||||
if (flags & ~(D3DCOMPILE_DEBUG | D3DCOMPILE_PACK_MATRIX_ROW_MAJOR | D3DCOMPILE_PACK_MATRIX_COLUMN_MAJOR))
|
||||
if (flags & ~(D3DCOMPILE_DEBUG | D3DCOMPILE_PACK_MATRIX_ROW_MAJOR | D3DCOMPILE_PACK_MATRIX_COLUMN_MAJOR
|
||||
| D3DCOMPILE_ENABLE_BACKWARDS_COMPATIBILITY))
|
||||
{
|
||||
FIXME("Ignoring flags %#x.\n", flags);
|
||||
}
|
||||
if (effect_flags)
|
||||
FIXME("Ignoring effect flags %#x.\n", effect_flags);
|
||||
if (secondary_flags)
|
||||
|
@ -474,24 +504,12 @@ HRESULT WINAPI D3DCompile2(const void *data, SIZE_T data_size, const char *filen
|
|||
compile_info.source.code = data;
|
||||
compile_info.source.size = data_size;
|
||||
compile_info.source_type = VKD3D_SHADER_SOURCE_HLSL;
|
||||
compile_info.target_type = VKD3D_SHADER_TARGET_DXBC_TPF;
|
||||
compile_info.target_type = get_target_for_profile(profile);
|
||||
compile_info.options = options;
|
||||
compile_info.option_count = 1;
|
||||
compile_info.log_level = VKD3D_SHADER_LOG_INFO;
|
||||
compile_info.source_name = filename;
|
||||
|
||||
profile_len = strlen(profile);
|
||||
for (i = 0; i < ARRAY_SIZE(d3dbc_profiles); ++i)
|
||||
{
|
||||
size_t len = strlen(d3dbc_profiles[i]);
|
||||
|
||||
if (len <= profile_len && !memcmp(profile, d3dbc_profiles[i], len))
|
||||
{
|
||||
compile_info.target_type = VKD3D_SHADER_TARGET_D3D_BYTECODE;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
preprocess_info.type = VKD3D_SHADER_STRUCTURE_TYPE_PREPROCESS_INFO;
|
||||
preprocess_info.next = &hlsl_info;
|
||||
preprocess_info.macros = (const struct vkd3d_shader_macro *)macros;
|
||||
|
@ -532,6 +550,13 @@ HRESULT WINAPI D3DCompile2(const void *data, SIZE_T data_size, const char *filen
|
|||
option->value = VKD3D_SHADER_COMPILE_OPTION_PACK_MATRIX_COLUMN_MAJOR;
|
||||
}
|
||||
|
||||
if (flags & D3DCOMPILE_ENABLE_BACKWARDS_COMPATIBILITY)
|
||||
{
|
||||
option = &options[compile_info.option_count++];
|
||||
option->name = VKD3D_SHADER_COMPILE_OPTION_BACKWARD_COMPATIBILITY;
|
||||
option->value = VKD3D_SHADER_COMPILE_OPTION_BACKCOMPAT_MAP_SEMANTIC_NAMES;
|
||||
}
|
||||
|
||||
ret = vkd3d_shader_compile(&compile_info, &byte_code, &messages);
|
||||
|
||||
if (ret)
|
||||
|
@ -576,6 +601,20 @@ HRESULT WINAPI D3DCompile2(const void *data, SIZE_T data_size, const char *filen
|
|||
return S_OK;
|
||||
}
|
||||
|
||||
/* Unlike other effect profiles fx_4_x is using DXBC container. */
|
||||
if (!strcmp(profile, "fx_4_0") || !strcmp(profile, "fx_4_1"))
|
||||
{
|
||||
struct vkd3d_shader_dxbc_section_desc section = { .tag = TAG_FX10, .data = byte_code };
|
||||
struct vkd3d_shader_code dxbc;
|
||||
|
||||
ret = vkd3d_shader_serialize_dxbc(1, §ion, &dxbc, NULL);
|
||||
vkd3d_shader_free_shader_code(&byte_code);
|
||||
if (ret)
|
||||
return hresult_from_vkd3d_result(ret);
|
||||
|
||||
byte_code = dxbc;
|
||||
}
|
||||
|
||||
if (SUCCEEDED(hr = D3DCreateBlob(byte_code.size, shader_blob)))
|
||||
memcpy(ID3D10Blob_GetBufferPointer(*shader_blob), byte_code.code, byte_code.size);
|
||||
|
||||
|
@ -735,6 +774,12 @@ end:
|
|||
return hr;
|
||||
}
|
||||
|
||||
HRESULT WINAPI D3DCreateLinker(ID3D11Linker **linker)
|
||||
{
|
||||
FIXME("linker %p stub!\n", linker);
|
||||
return E_NOTIMPL;
|
||||
}
|
||||
|
||||
HRESULT WINAPI D3DLoadModule(const void *data, SIZE_T size, ID3D11Module **module)
|
||||
{
|
||||
FIXME("data %p, size %Iu, module %p stub!\n", data, size, module);
|
||||
|
|
|
@ -523,6 +523,7 @@ void SlDeleteShader(struct bwriter_shader *shader);
|
|||
((DWORD)(ch2) << 16) | ((DWORD)(ch3) << 24 ))
|
||||
#define TAG_Aon9 MAKE_TAG('A', 'o', 'n', '9')
|
||||
#define TAG_DXBC MAKE_TAG('D', 'X', 'B', 'C')
|
||||
#define TAG_FX10 MAKE_TAG('F', 'X', '1', '0')
|
||||
#define TAG_ISGN MAKE_TAG('I', 'S', 'G', 'N')
|
||||
#define TAG_OSGN MAKE_TAG('O', 'S', 'G', 'N')
|
||||
#define TAG_OSG5 MAKE_TAG('O', 'S', 'G', '5')
|
||||
|
|
|
@ -622,7 +622,7 @@ static void test_sampling(void)
|
|||
draw_quad(&test_context, ps_code);
|
||||
|
||||
v = get_color_vec4(&test_context, 0, 0);
|
||||
todo_wine ok(compare_vec4(&v, 0.25f, 0.0f, 0.25f, 0.0f, 0),
|
||||
ok(compare_vec4(&v, 0.25f, 0.0f, 0.25f, 0.0f, 0),
|
||||
"Got unexpected value {%.8e, %.8e, %.8e, %.8e}.\n", v.x, v.y, v.z, v.w);
|
||||
|
||||
ID3D10Blob_Release(ps_code);
|
||||
|
|
|
@ -5,7 +5,7 @@
|
|||
@ stub D3DCompressShaders
|
||||
@ stdcall D3DCreateBlob(long ptr)
|
||||
@ stub D3DCreateFunctionLinkingGraph
|
||||
@ stub D3DCreateLinker
|
||||
@ stdcall D3DCreateLinker(ptr)
|
||||
@ stub D3DDecompressShaders
|
||||
@ stdcall D3DDisassemble(ptr long long ptr ptr)
|
||||
@ stub D3DDisassemble10Effect(ptr long ptr)
|
||||
|
|
|
@ -4375,11 +4375,10 @@ static void test_create_effect_from_memory(void)
|
|||
effect = (ID3D10Effect *)0xdeadbeef;
|
||||
hr = D3DX10CreateEffectFromMemory(test_fx_source, strlen(test_fx_source) + 1, NULL, NULL, NULL, "fx_4_0",
|
||||
0x0, 0x0, device, NULL, NULL, &effect, &errors, NULL);
|
||||
todo_wine ok(hr == S_OK, "Got unexpected hr %#lx.\n", hr);
|
||||
todo_wine ok(!errors, "Got unexpected errors %p.\n", errors);
|
||||
todo_wine ok(!!effect && effect != (ID3D10Effect *)0xdeadbeef, "Got unexpected effect %p.\n", effect);
|
||||
if (hr == S_OK)
|
||||
effect->lpVtbl->Release(effect);
|
||||
ok(hr == S_OK, "Got unexpected hr %#lx.\n", hr);
|
||||
ok(!errors, "Got unexpected errors %p.\n", errors);
|
||||
ok(!!effect && effect != (ID3D10Effect *)0xdeadbeef, "Got unexpected effect %p.\n", effect);
|
||||
effect->lpVtbl->Release(effect);
|
||||
|
||||
refcount = ID3D10Device_Release(device);
|
||||
ok(!refcount, "Got unexpected refcount %lu.\n", refcount);
|
||||
|
@ -4465,21 +4464,19 @@ static void test_create_effect_from_file(void)
|
|||
effect = (ID3D10Effect *)0xdeadbeef;
|
||||
hr = D3DX10CreateEffectFromFileW(path, NULL, NULL, "fx_4_0", 0x0, 0x0,
|
||||
device, NULL, NULL, &effect, &errors, NULL);
|
||||
todo_wine ok(hr == S_OK, "Got unexpected hr %#lx.\n", hr);
|
||||
todo_wine ok(!errors, "Got unexpected errors %p.\n", errors);
|
||||
todo_wine ok(effect && effect != (ID3D10Effect *)0xdeadbeef, "Got unexpected effect %p.\n", effect);
|
||||
if (hr == S_OK)
|
||||
effect->lpVtbl->Release(effect);
|
||||
ok(hr == S_OK, "Got unexpected hr %#lx.\n", hr);
|
||||
ok(!errors, "Got unexpected errors %p.\n", errors);
|
||||
ok(effect && effect != (ID3D10Effect *)0xdeadbeef, "Got unexpected effect %p.\n", effect);
|
||||
effect->lpVtbl->Release(effect);
|
||||
|
||||
errors = (ID3D10Blob *)0xdeadbeef;
|
||||
effect = (ID3D10Effect *)0xdeadbeef;
|
||||
hr = D3DX10CreateEffectFromFileA(get_str_a(path), NULL, NULL, "fx_4_0", 0x0, 0x0,
|
||||
device, NULL, NULL, &effect, &errors, NULL);
|
||||
todo_wine ok(hr == S_OK, "Got unexpected hr %#lx.\n", hr);
|
||||
todo_wine ok(!errors, "Got unexpected errors %p.\n", errors);
|
||||
todo_wine ok(effect && effect != (ID3D10Effect *)0xdeadbeef, "Got unexpected effect %p.\n", effect);
|
||||
if (hr == S_OK)
|
||||
effect->lpVtbl->Release(effect);
|
||||
ok(hr == S_OK, "Got unexpected hr %#lx.\n", hr);
|
||||
ok(!errors, "Got unexpected errors %p.\n", errors);
|
||||
ok(effect && effect != (ID3D10Effect *)0xdeadbeef, "Got unexpected effect %p.\n", effect);
|
||||
effect->lpVtbl->Release(effect);
|
||||
|
||||
delete_file(test_file_name);
|
||||
|
||||
|
@ -4584,21 +4581,19 @@ static void test_create_effect_from_resource(void)
|
|||
effect = (ID3D10Effect *)0xdeadbeef;
|
||||
hr = D3DX10CreateEffectFromResourceW(resource_module, test_resource_name, NULL, NULL, NULL, "fx_4_0",
|
||||
0, 0, device, NULL, NULL, &effect, &errors, NULL);
|
||||
todo_wine ok(hr == S_OK, "Got unexpected hr %#lx.\n", hr);
|
||||
todo_wine ok(!errors, "Got unexpected errors %p.\n", errors);
|
||||
todo_wine ok(effect && effect != (ID3D10Effect *)0xdeadbeef, "Got unexpected effect %p.\n", effect);
|
||||
if (hr == S_OK)
|
||||
effect->lpVtbl->Release(effect);
|
||||
ok(hr == S_OK, "Got unexpected hr %#lx.\n", hr);
|
||||
ok(!errors, "Got unexpected errors %p.\n", errors);
|
||||
ok(effect && effect != (ID3D10Effect *)0xdeadbeef, "Got unexpected effect %p.\n", effect);
|
||||
effect->lpVtbl->Release(effect);
|
||||
|
||||
errors = (ID3D10Blob *)0xdeadbeef;
|
||||
effect = (ID3D10Effect *)0xdeadbeef;
|
||||
hr = D3DX10CreateEffectFromResourceA(resource_module, get_str_a(test_resource_name), NULL, NULL, NULL, "fx_4_0",
|
||||
0, 0, device, NULL, NULL, &effect, &errors, NULL);
|
||||
todo_wine ok(hr == S_OK, "Got unexpected hr %#lx.\n", hr);
|
||||
todo_wine ok(!errors, "Got unexpected errors %p.\n", errors);
|
||||
todo_wine ok(effect && effect != (ID3D10Effect *)0xdeadbeef, "Got unexpected effect %p.\n", effect);
|
||||
if (hr == S_OK)
|
||||
effect->lpVtbl->Release(effect);
|
||||
ok(hr == S_OK, "Got unexpected hr %#lx.\n", hr);
|
||||
ok(!errors, "Got unexpected errors %p.\n", errors);
|
||||
ok(effect && effect != (ID3D10Effect *)0xdeadbeef, "Got unexpected effect %p.\n", effect);
|
||||
effect->lpVtbl->Release(effect);
|
||||
|
||||
delete_resource_module(test_resource_name, resource_module);
|
||||
|
||||
|
|
|
@ -1875,6 +1875,210 @@ void point_filter_argb_pixels(const BYTE *src, UINT src_row_pitch, UINT src_slic
|
|||
}
|
||||
}
|
||||
|
||||
static HRESULT d3dx_image_decompress(const void *memory, uint32_t row_pitch, const RECT *rect,
|
||||
const RECT *unaligned_rect, const struct volume *size, const struct pixel_format_desc *desc,
|
||||
void **out_memory, uint32_t *out_row_pitch, RECT *out_rect, const struct pixel_format_desc **out_desc)
|
||||
{
|
||||
void (*fetch_dxt_texel)(int srcRowStride, const BYTE *pixdata, int i, int j, void *texel);
|
||||
const struct pixel_format_desc *uncompressed_desc = NULL;
|
||||
uint32_t x, y, tmp_pitch;
|
||||
BYTE *uncompressed_mem;
|
||||
|
||||
switch (desc->format)
|
||||
{
|
||||
case D3DFMT_DXT1:
|
||||
uncompressed_desc = get_format_info(D3DFMT_A8B8G8R8);
|
||||
fetch_dxt_texel = fetch_2d_texel_rgba_dxt1;
|
||||
break;
|
||||
case D3DFMT_DXT2:
|
||||
case D3DFMT_DXT3:
|
||||
uncompressed_desc = get_format_info(D3DFMT_A8B8G8R8);
|
||||
fetch_dxt_texel = fetch_2d_texel_rgba_dxt3;
|
||||
break;
|
||||
case D3DFMT_DXT4:
|
||||
case D3DFMT_DXT5:
|
||||
uncompressed_desc = get_format_info(D3DFMT_A8B8G8R8);
|
||||
fetch_dxt_texel = fetch_2d_texel_rgba_dxt5;
|
||||
break;
|
||||
default:
|
||||
FIXME("Unexpected compressed texture format %u.\n", desc->format);
|
||||
return E_NOTIMPL;
|
||||
}
|
||||
|
||||
if (!(uncompressed_mem = malloc(size->width * size->height * size->depth * uncompressed_desc->bytes_per_pixel)))
|
||||
return E_OUTOFMEMORY;
|
||||
|
||||
if (unaligned_rect && EqualRect(rect, unaligned_rect))
|
||||
goto exit;
|
||||
|
||||
TRACE("Decompressing image.\n");
|
||||
tmp_pitch = row_pitch * desc->block_width / desc->block_byte_count;
|
||||
for (y = 0; y < size->height; ++y)
|
||||
{
|
||||
BYTE *ptr = &uncompressed_mem[y * size->width * uncompressed_desc->bytes_per_pixel];
|
||||
for (x = 0; x < size->width; ++x)
|
||||
{
|
||||
const POINT pt = { x, y };
|
||||
|
||||
if (!PtInRect(unaligned_rect, pt))
|
||||
fetch_dxt_texel(tmp_pitch, (BYTE *)memory, x + rect->left, y + rect->top, ptr);
|
||||
ptr += uncompressed_desc->bytes_per_pixel;
|
||||
}
|
||||
}
|
||||
|
||||
exit:
|
||||
*out_memory = uncompressed_mem;
|
||||
*out_row_pitch = size->width * uncompressed_desc->bytes_per_pixel;
|
||||
if (unaligned_rect)
|
||||
*out_rect = *unaligned_rect;
|
||||
else
|
||||
SetRect(out_rect, 0, 0, size->width, size->height);
|
||||
*out_desc = uncompressed_desc;
|
||||
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
static void set_volume_struct(struct volume *volume, uint32_t width, uint32_t height, uint32_t depth)
|
||||
{
|
||||
volume->width = width;
|
||||
volume->height = height;
|
||||
volume->depth = depth;
|
||||
}
|
||||
|
||||
static HRESULT d3dx_load_image_from_memory(void *dst_memory, uint32_t dst_row_pitch, const struct pixel_format_desc *dst_desc,
|
||||
const PALETTEENTRY *dst_palette, const RECT *dst_rect, const RECT *dst_rect_aligned, const void *src_memory,
|
||||
uint32_t src_row_pitch, const struct pixel_format_desc *src_desc, const PALETTEENTRY *src_palette, const RECT *src_rect,
|
||||
uint32_t filter_flags, uint32_t color_key)
|
||||
{
|
||||
struct volume src_size, dst_size, dst_size_aligned;
|
||||
const BYTE *src_memory_offset = src_memory;
|
||||
HRESULT hr = S_OK;
|
||||
|
||||
TRACE("dst_memory %p, dst_row_pitch %d, dst_desc %p, dst_palette %p, dst_rect %s, dst_rect_aligned %s, src_memory %p, "
|
||||
"src_row_pitch %d, src_desc %p, src_palette %p, src_rect %s, filter %#x, color_key 0x%08x.\n",
|
||||
dst_memory, dst_row_pitch, dst_desc, dst_palette, wine_dbgstr_rect(dst_rect), wine_dbgstr_rect(dst_rect_aligned),
|
||||
src_memory, src_row_pitch, src_desc, src_palette, wine_dbgstr_rect(src_rect), filter_flags, color_key);
|
||||
|
||||
set_volume_struct(&src_size, (src_rect->right - src_rect->left), (src_rect->bottom - src_rect->top), 1);
|
||||
set_volume_struct(&dst_size, (dst_rect->right - dst_rect->left), (dst_rect->bottom - dst_rect->top), 1);
|
||||
set_volume_struct(&dst_size_aligned, (dst_rect_aligned->right - dst_rect_aligned->left),
|
||||
(dst_rect_aligned->bottom - dst_rect_aligned->top), 1);
|
||||
|
||||
src_memory_offset += (src_rect->top / src_desc->block_height) * src_row_pitch;
|
||||
src_memory_offset += (src_rect->left / src_desc->block_width) * src_desc->block_byte_count;
|
||||
|
||||
/* Everything matches, simply copy the pixels. */
|
||||
if (src_desc->format == dst_desc->format
|
||||
&& dst_size.width == src_size.width
|
||||
&& dst_size.height == src_size.height
|
||||
&& color_key == 0
|
||||
&& !(src_rect->left & (src_desc->block_width - 1))
|
||||
&& !(src_rect->top & (src_desc->block_height - 1))
|
||||
&& !(dst_rect->left & (dst_desc->block_width - 1))
|
||||
&& !(dst_rect->top & (dst_desc->block_height - 1)))
|
||||
{
|
||||
TRACE("Simple copy.\n");
|
||||
copy_pixels(src_memory_offset, src_row_pitch, 0, dst_memory, dst_row_pitch, 0, &src_size, src_desc);
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
/* Stretching or format conversion. */
|
||||
if (!is_conversion_from_supported(src_desc)
|
||||
|| !is_conversion_to_supported(dst_desc))
|
||||
{
|
||||
FIXME("Unsupported format conversion %#x -> %#x.\n", src_desc->format, dst_desc->format);
|
||||
return E_NOTIMPL;
|
||||
}
|
||||
|
||||
/*
|
||||
* If the source is a compressed image, we need to decompress it first
|
||||
* before doing any modifications.
|
||||
*/
|
||||
if (src_desc->type == FORMAT_DXT)
|
||||
{
|
||||
const struct pixel_format_desc *uncompressed_desc;
|
||||
uint32_t uncompressed_row_pitch;
|
||||
void *uncompressed_mem = NULL;
|
||||
RECT uncompressed_rect;
|
||||
|
||||
hr = d3dx_image_decompress(src_memory, src_row_pitch, src_rect, NULL, &src_size, src_desc,
|
||||
&uncompressed_mem, &uncompressed_row_pitch, &uncompressed_rect, &uncompressed_desc);
|
||||
if (SUCCEEDED(hr))
|
||||
{
|
||||
hr = d3dx_load_image_from_memory(dst_memory, dst_row_pitch, dst_desc, dst_palette, dst_rect, dst_rect_aligned,
|
||||
uncompressed_mem, uncompressed_row_pitch, uncompressed_desc, src_palette, &uncompressed_rect,
|
||||
filter_flags, color_key);
|
||||
}
|
||||
free(uncompressed_mem);
|
||||
return hr;
|
||||
}
|
||||
|
||||
/* Same as the above, need to decompress the destination prior to modifying. */
|
||||
if (dst_desc->type == FORMAT_DXT)
|
||||
{
|
||||
const struct pixel_format_desc *uncompressed_desc;
|
||||
uint32_t uncompressed_row_pitch;
|
||||
void *uncompressed_mem = NULL;
|
||||
BYTE *uncompressed_mem_offset;
|
||||
RECT uncompressed_rect;
|
||||
|
||||
hr = d3dx_image_decompress(dst_memory, dst_row_pitch, dst_rect_aligned, dst_rect, &dst_size_aligned, dst_desc,
|
||||
&uncompressed_mem, &uncompressed_row_pitch, &uncompressed_rect, &uncompressed_desc);
|
||||
if (FAILED(hr))
|
||||
return hr;
|
||||
|
||||
uncompressed_mem_offset = (BYTE *)uncompressed_mem + (dst_rect->top - dst_rect_aligned->top) * uncompressed_row_pitch
|
||||
+ (dst_rect->left - dst_rect_aligned->left) * uncompressed_desc->bytes_per_pixel;
|
||||
hr = d3dx_load_image_from_memory(uncompressed_mem_offset, uncompressed_row_pitch, uncompressed_desc, dst_palette,
|
||||
&uncompressed_rect, &uncompressed_rect, src_memory, src_row_pitch, src_desc, src_palette,
|
||||
src_rect, filter_flags, color_key);
|
||||
if (SUCCEEDED(hr))
|
||||
{
|
||||
GLenum gl_format = 0;
|
||||
|
||||
TRACE("Compressing DXTn surface.\n");
|
||||
switch (dst_desc->format)
|
||||
{
|
||||
case D3DFMT_DXT1:
|
||||
gl_format = GL_COMPRESSED_RGBA_S3TC_DXT1_EXT;
|
||||
break;
|
||||
case D3DFMT_DXT2:
|
||||
case D3DFMT_DXT3:
|
||||
gl_format = GL_COMPRESSED_RGBA_S3TC_DXT3_EXT;
|
||||
break;
|
||||
case D3DFMT_DXT4:
|
||||
case D3DFMT_DXT5:
|
||||
gl_format = GL_COMPRESSED_RGBA_S3TC_DXT5_EXT;
|
||||
break;
|
||||
default:
|
||||
ERR("Unexpected destination compressed format %u.\n", dst_desc->format);
|
||||
}
|
||||
tx_compress_dxtn(4, dst_size_aligned.width, dst_size_aligned.height, uncompressed_mem, gl_format,
|
||||
dst_memory, dst_row_pitch);
|
||||
}
|
||||
free(uncompressed_mem);
|
||||
return hr;
|
||||
}
|
||||
|
||||
if ((filter_flags & 0xf) == D3DX_FILTER_NONE)
|
||||
{
|
||||
convert_argb_pixels(src_memory_offset, src_row_pitch, 0, &src_size, src_desc,
|
||||
dst_memory, dst_row_pitch, 0, &dst_size, dst_desc, color_key, src_palette);
|
||||
}
|
||||
else /* if ((filter & 0xf) == D3DX_FILTER_POINT) */
|
||||
{
|
||||
if ((filter_flags & 0xf) != D3DX_FILTER_POINT)
|
||||
FIXME("Unhandled filter %#x.\n", filter_flags);
|
||||
|
||||
/* Always apply a point filter until D3DX_FILTER_LINEAR,
|
||||
* D3DX_FILTER_TRIANGLE and D3DX_FILTER_BOX are implemented. */
|
||||
point_filter_argb_pixels(src_memory_offset, src_row_pitch, 0, &src_size, src_desc, dst_memory, dst_row_pitch, 0,
|
||||
&dst_size, dst_desc, color_key, src_palette);
|
||||
}
|
||||
|
||||
return hr;
|
||||
}
|
||||
|
||||
/************************************************************
|
||||
* D3DXLoadSurfaceFromMemory
|
||||
*
|
||||
|
@ -1913,7 +2117,6 @@ HRESULT WINAPI D3DXLoadSurfaceFromMemory(IDirect3DSurface9 *dst_surface,
|
|||
DWORD filter, D3DCOLOR color_key)
|
||||
{
|
||||
const struct pixel_format_desc *srcformatdesc, *destformatdesc;
|
||||
struct volume src_size, dst_size, dst_size_aligned;
|
||||
RECT dst_rect_temp, dst_rect_aligned;
|
||||
IDirect3DSurface9 *surface;
|
||||
D3DSURFACE_DESC surfdesc;
|
||||
|
@ -1945,10 +2148,6 @@ HRESULT WINAPI D3DXLoadSurfaceFromMemory(IDirect3DSurface9 *dst_surface,
|
|||
return E_NOTIMPL;
|
||||
}
|
||||
|
||||
src_size.width = src_rect->right - src_rect->left;
|
||||
src_size.height = src_rect->bottom - src_rect->top;
|
||||
src_size.depth = 1;
|
||||
|
||||
IDirect3DSurface9_GetDesc(dst_surface, &surfdesc);
|
||||
destformatdesc = get_format_info(surfdesc.Format);
|
||||
if (!dst_rect)
|
||||
|
@ -1987,172 +2186,16 @@ HRESULT WINAPI D3DXLoadSurfaceFromMemory(IDirect3DSurface9 *dst_surface,
|
|||
dst_rect_aligned.bottom = min((dst_rect_aligned.bottom + destformatdesc->block_height - 1)
|
||||
& ~(destformatdesc->block_height - 1), surfdesc.Height);
|
||||
|
||||
dst_size.width = dst_rect->right - dst_rect->left;
|
||||
dst_size.height = dst_rect->bottom - dst_rect->top;
|
||||
dst_size.depth = 1;
|
||||
dst_size_aligned.width = dst_rect_aligned.right - dst_rect_aligned.left;
|
||||
dst_size_aligned.height = dst_rect_aligned.bottom - dst_rect_aligned.top;
|
||||
dst_size_aligned.depth = 1;
|
||||
|
||||
if (filter == D3DX_DEFAULT)
|
||||
filter = D3DX_FILTER_TRIANGLE | D3DX_FILTER_DITHER;
|
||||
|
||||
if (FAILED(hr = lock_surface(dst_surface, &dst_rect_aligned, &lockrect, &surface, TRUE)))
|
||||
return hr;
|
||||
|
||||
src_memory = (BYTE *)src_memory + src_rect->top / srcformatdesc->block_height * src_pitch
|
||||
+ src_rect->left / srcformatdesc->block_width * srcformatdesc->block_byte_count;
|
||||
|
||||
if (src_format == surfdesc.Format
|
||||
&& dst_size.width == src_size.width
|
||||
&& dst_size.height == src_size.height
|
||||
&& color_key == 0
|
||||
&& !(src_rect->left & (srcformatdesc->block_width - 1))
|
||||
&& !(src_rect->top & (srcformatdesc->block_height - 1))
|
||||
&& !(dst_rect->left & (destformatdesc->block_width - 1))
|
||||
&& !(dst_rect->top & (destformatdesc->block_height - 1)))
|
||||
{
|
||||
TRACE("Simple copy.\n");
|
||||
copy_pixels(src_memory, src_pitch, 0, lockrect.pBits, lockrect.Pitch, 0,
|
||||
&src_size, srcformatdesc);
|
||||
}
|
||||
else /* Stretching or format conversion. */
|
||||
{
|
||||
const struct pixel_format_desc *dst_format;
|
||||
DWORD *src_uncompressed = NULL;
|
||||
BYTE *dst_uncompressed = NULL;
|
||||
unsigned int dst_pitch;
|
||||
BYTE *dst_mem;
|
||||
|
||||
if (!is_conversion_from_supported(srcformatdesc)
|
||||
|| !is_conversion_to_supported(destformatdesc))
|
||||
{
|
||||
FIXME("Unsupported format conversion %#x -> %#x.\n", src_format, surfdesc.Format);
|
||||
unlock_surface(dst_surface, &dst_rect_aligned, surface, FALSE);
|
||||
return E_NOTIMPL;
|
||||
}
|
||||
|
||||
if (srcformatdesc->type == FORMAT_DXT)
|
||||
{
|
||||
void (*fetch_dxt_texel)(int srcRowStride, const BYTE *pixdata,
|
||||
int i, int j, void *texel);
|
||||
unsigned int x, y;
|
||||
|
||||
src_pitch = src_pitch * srcformatdesc->block_width / srcformatdesc->block_byte_count;
|
||||
|
||||
src_uncompressed = malloc(src_size.width * src_size.height * sizeof(DWORD));
|
||||
if (!src_uncompressed)
|
||||
{
|
||||
unlock_surface(dst_surface, &dst_rect_aligned, surface, FALSE);
|
||||
return E_OUTOFMEMORY;
|
||||
}
|
||||
|
||||
switch(src_format)
|
||||
{
|
||||
case D3DFMT_DXT1:
|
||||
fetch_dxt_texel = fetch_2d_texel_rgba_dxt1;
|
||||
break;
|
||||
case D3DFMT_DXT2:
|
||||
case D3DFMT_DXT3:
|
||||
fetch_dxt_texel = fetch_2d_texel_rgba_dxt3;
|
||||
break;
|
||||
case D3DFMT_DXT4:
|
||||
case D3DFMT_DXT5:
|
||||
fetch_dxt_texel = fetch_2d_texel_rgba_dxt5;
|
||||
break;
|
||||
default:
|
||||
FIXME("Unexpected compressed texture format %u.\n", src_format);
|
||||
fetch_dxt_texel = NULL;
|
||||
}
|
||||
|
||||
TRACE("Uncompressing DXTn surface.\n");
|
||||
for (y = 0; y < src_size.height; ++y)
|
||||
{
|
||||
DWORD *ptr = &src_uncompressed[y * src_size.width];
|
||||
for (x = 0; x < src_size.width; ++x)
|
||||
{
|
||||
fetch_dxt_texel(src_pitch, src_memory, x + src_rect->left, y + src_rect->top, ptr);
|
||||
++ptr;
|
||||
}
|
||||
}
|
||||
src_memory = src_uncompressed;
|
||||
src_pitch = src_size.width * sizeof(DWORD);
|
||||
srcformatdesc = get_format_info(D3DFMT_A8B8G8R8);
|
||||
}
|
||||
|
||||
if (destformatdesc->type == FORMAT_DXT)
|
||||
{
|
||||
BOOL dst_misaligned = dst_rect->left != dst_rect_aligned.left
|
||||
|| dst_rect->top != dst_rect_aligned.top
|
||||
|| dst_rect->right != dst_rect_aligned.right
|
||||
|| dst_rect->bottom != dst_rect_aligned.bottom;
|
||||
size_t dst_uncompressed_size = dst_size_aligned.width * dst_size_aligned.height * sizeof(DWORD);
|
||||
|
||||
dst_uncompressed = malloc(dst_uncompressed_size);
|
||||
if (!dst_uncompressed)
|
||||
{
|
||||
free(src_uncompressed);
|
||||
unlock_surface(dst_surface, &dst_rect_aligned, surface, FALSE);
|
||||
return E_OUTOFMEMORY;
|
||||
}
|
||||
if (dst_misaligned) memset(dst_uncompressed, 0, dst_uncompressed_size);
|
||||
dst_pitch = dst_size_aligned.width * sizeof(DWORD);
|
||||
dst_format = get_format_info(D3DFMT_A8B8G8R8);
|
||||
dst_mem = dst_uncompressed + (dst_rect->top - dst_rect_aligned.top) * dst_pitch
|
||||
+ (dst_rect->left - dst_rect_aligned.left) * sizeof(DWORD);
|
||||
}
|
||||
else
|
||||
{
|
||||
dst_mem = lockrect.pBits;
|
||||
dst_pitch = lockrect.Pitch;
|
||||
dst_format = destformatdesc;
|
||||
}
|
||||
|
||||
if ((filter & 0xf) == D3DX_FILTER_NONE)
|
||||
{
|
||||
convert_argb_pixels(src_memory, src_pitch, 0, &src_size, srcformatdesc,
|
||||
dst_mem, dst_pitch, 0, &dst_size, dst_format, color_key, src_palette);
|
||||
}
|
||||
else /* if ((filter & 0xf) == D3DX_FILTER_POINT) */
|
||||
{
|
||||
if ((filter & 0xf) != D3DX_FILTER_POINT)
|
||||
FIXME("Unhandled filter %#lx.\n", filter);
|
||||
|
||||
/* Always apply a point filter until D3DX_FILTER_LINEAR,
|
||||
* D3DX_FILTER_TRIANGLE and D3DX_FILTER_BOX are implemented. */
|
||||
point_filter_argb_pixels(src_memory, src_pitch, 0, &src_size, srcformatdesc,
|
||||
dst_mem, dst_pitch, 0, &dst_size, dst_format, color_key, src_palette);
|
||||
}
|
||||
|
||||
free(src_uncompressed);
|
||||
|
||||
if (dst_uncompressed)
|
||||
{
|
||||
GLenum gl_format = 0;
|
||||
|
||||
TRACE("Compressing DXTn surface.\n");
|
||||
switch(surfdesc.Format)
|
||||
{
|
||||
case D3DFMT_DXT1:
|
||||
gl_format = GL_COMPRESSED_RGBA_S3TC_DXT1_EXT;
|
||||
break;
|
||||
case D3DFMT_DXT2:
|
||||
case D3DFMT_DXT3:
|
||||
gl_format = GL_COMPRESSED_RGBA_S3TC_DXT3_EXT;
|
||||
break;
|
||||
case D3DFMT_DXT4:
|
||||
case D3DFMT_DXT5:
|
||||
gl_format = GL_COMPRESSED_RGBA_S3TC_DXT5_EXT;
|
||||
break;
|
||||
default:
|
||||
ERR("Unexpected destination compressed format %u.\n", surfdesc.Format);
|
||||
}
|
||||
tx_compress_dxtn(4, dst_size_aligned.width, dst_size_aligned.height,
|
||||
dst_uncompressed, gl_format, lockrect.pBits,
|
||||
lockrect.Pitch);
|
||||
free(dst_uncompressed);
|
||||
}
|
||||
}
|
||||
hr = d3dx_load_image_from_memory(lockrect.pBits, lockrect.Pitch, destformatdesc, dst_palette, dst_rect,
|
||||
&dst_rect_aligned, src_memory, src_pitch, srcformatdesc, src_palette, src_rect, filter, color_key);
|
||||
if (FAILED(hr))
|
||||
WARN("d3dx_load_image_from_memory failed with hr %#lx\n", hr);
|
||||
|
||||
return unlock_surface(dst_surface, &dst_rect_aligned, surface, TRUE);
|
||||
}
|
||||
|
|
|
@ -257,12 +257,7 @@ static void test_create_effect_and_pool(IDirect3DDevice9 *device)
|
|||
ok(hr == D3D_OK, "Got result %lx, expected 0 (D3D_OK)\n", hr);
|
||||
|
||||
hr = D3DXCreateEffect(device, effect_desc, sizeof(effect_desc), NULL, NULL, 0, NULL, &effect, NULL);
|
||||
todo_wine ok(hr == D3D_OK, "Got result %lx, expected 0 (D3D_OK)\n", hr);
|
||||
if (FAILED(hr))
|
||||
{
|
||||
skip("Failed to compile effect, skipping test.\n");
|
||||
return;
|
||||
}
|
||||
ok(hr == D3D_OK, "Got result %lx, expected 0 (D3D_OK)\n", hr);
|
||||
|
||||
hr = effect->lpVtbl->QueryInterface(effect, &IID_ID3DXBaseEffect, (void **)&base);
|
||||
ok(hr == E_NOINTERFACE, "QueryInterface failed, got %lx, expected %lx (E_NOINTERFACE)\n", hr, E_NOINTERFACE);
|
||||
|
@ -8047,8 +8042,6 @@ static void test_create_effect_from_file(void)
|
|||
trace("D3DXCreateEffectFromFileExW messages:\n%s", (char *)ID3DXBuffer_GetBufferPointer(messages));
|
||||
ID3DXBuffer_Release(messages);
|
||||
}
|
||||
if (effect)
|
||||
effect->lpVtbl->Release(effect);
|
||||
|
||||
delete_file("effect1.fx");
|
||||
delete_file("effect2.fx");
|
||||
|
|
|
@ -23,6 +23,7 @@
|
|||
#include "wine/test.h"
|
||||
#include "d3dx9tex.h"
|
||||
#include "resources.h"
|
||||
#include <stdint.h>
|
||||
|
||||
#define check_release(obj, exp) _check_release(__LINE__, obj, exp)
|
||||
static inline void _check_release(unsigned int line, IUnknown *obj, int exp)
|
||||
|
@ -279,6 +280,87 @@ static const BYTE dds_dxt5_8_8[] =
|
|||
0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x00,0x00,0x05,0x05,0x50,0x50,
|
||||
};
|
||||
|
||||
/*
|
||||
* 8x8 dxt5 image data, four 4x4 blocks:
|
||||
* +-----+-----+
|
||||
* |Blue |Green|
|
||||
* | | |
|
||||
* +-----+-----+
|
||||
* |Red |Black|
|
||||
* | | |
|
||||
* +-----+-----+
|
||||
*/
|
||||
static const BYTE dxt5_8_8[] =
|
||||
{
|
||||
0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1f,0x00,0x1f,0x00,0x00,0x00,0x00,0x00,
|
||||
0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x07,0xe0,0x07,0x00,0x00,0x00,0x00,
|
||||
0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0x00,0xf8,0x00,0x00,0x00,0x00,
|
||||
0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
||||
};
|
||||
|
||||
struct surface_readback
|
||||
{
|
||||
IDirect3DSurface9 *surface;
|
||||
D3DLOCKED_RECT locked_rect;
|
||||
};
|
||||
|
||||
static uint32_t get_readback_color(struct surface_readback *rb, uint32_t x, uint32_t y)
|
||||
{
|
||||
return rb->locked_rect.pBits
|
||||
? ((uint32_t *)rb->locked_rect.pBits)[y * rb->locked_rect.Pitch / sizeof(uint32_t) + x] : 0xdeadbeef;
|
||||
}
|
||||
|
||||
static void release_surface_readback(struct surface_readback *rb)
|
||||
{
|
||||
HRESULT hr;
|
||||
|
||||
if (!rb->surface)
|
||||
return;
|
||||
if (rb->locked_rect.pBits && FAILED(hr = IDirect3DSurface9_UnlockRect(rb->surface)))
|
||||
trace("Can't unlock the offscreen surface, hr %#lx.\n", hr);
|
||||
IDirect3DSurface9_Release(rb->surface);
|
||||
}
|
||||
|
||||
static void get_surface_decompressed_readback(IDirect3DDevice9 *device, IDirect3DSurface9 *compressed_surface,
|
||||
struct surface_readback *rb)
|
||||
{
|
||||
D3DSURFACE_DESC desc;
|
||||
HRESULT hr;
|
||||
|
||||
memset(rb, 0, sizeof(*rb));
|
||||
hr = IDirect3DSurface9_GetDesc(compressed_surface, &desc);
|
||||
if (FAILED(hr))
|
||||
{
|
||||
trace("Failed to get compressed surface description, hr %#lx.\n", hr);
|
||||
return;
|
||||
}
|
||||
|
||||
hr = IDirect3DDevice9_CreateOffscreenPlainSurface(device, desc.Width, desc.Height, D3DFMT_A8R8G8B8, D3DPOOL_SYSTEMMEM,
|
||||
&rb->surface, NULL);
|
||||
if (FAILED(hr))
|
||||
{
|
||||
trace("Can't create the decompressed surface, hr %#lx.\n", hr);
|
||||
return;
|
||||
}
|
||||
|
||||
hr = D3DXLoadSurfaceFromSurface(rb->surface, NULL, NULL, compressed_surface, NULL, NULL, D3DX_FILTER_NONE, 0);
|
||||
if (FAILED(hr))
|
||||
{
|
||||
trace("Can't load the decompressed surface, hr %#lx.\n", hr);
|
||||
IDirect3DSurface9_Release(rb->surface);
|
||||
rb->surface = NULL;
|
||||
return;
|
||||
}
|
||||
|
||||
hr = IDirect3DSurface9_LockRect(rb->surface, &rb->locked_rect, NULL, D3DLOCK_READONLY);
|
||||
if (FAILED(hr))
|
||||
{
|
||||
trace("Can't lock the offscreen surface, hr %#lx.\n", hr);
|
||||
IDirect3DSurface9_Release(rb->surface);
|
||||
rb->surface = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
static HRESULT create_file(const char *filename, const unsigned char *data, const unsigned int size)
|
||||
{
|
||||
DWORD received;
|
||||
|
@ -832,6 +914,14 @@ static inline void _check_pixel_4bpp(unsigned int line, const D3DLOCKED_RECT *lo
|
|||
ok_(__FILE__, line)(color == expected_color, "Got color 0x%08lx, expected 0x%08lx\n", color, expected_color);
|
||||
}
|
||||
|
||||
#define check_readback_pixel_4bpp(rb, x, y, color, todo) _check_readback_pixel_4bpp(__LINE__, rb, x, y, color, todo)
|
||||
static inline void _check_readback_pixel_4bpp(unsigned int line, struct surface_readback *rb, uint32_t x,
|
||||
uint32_t y, uint32_t expected_color, BOOL todo)
|
||||
{
|
||||
uint32_t color = get_readback_color(rb, x, y);
|
||||
todo_wine_if(todo) ok_(__FILE__, line)(color == expected_color, "Got color 0x%08x, expected 0x%08x.\n", color, expected_color);
|
||||
}
|
||||
|
||||
static void test_D3DXLoadSurface(IDirect3DDevice9 *device)
|
||||
{
|
||||
HRESULT hr;
|
||||
|
@ -1450,6 +1540,8 @@ static void test_D3DXLoadSurface(IDirect3DDevice9 *device)
|
|||
skip("Failed to create DXT5 texture, hr %#lx.\n", hr);
|
||||
else
|
||||
{
|
||||
struct surface_readback surface_rb;
|
||||
|
||||
hr = IDirect3DTexture9_GetSurfaceLevel(tex, 0, &newsurf);
|
||||
ok(SUCCEEDED(hr), "Failed to get the surface, hr %#lx.\n", hr);
|
||||
hr = D3DXLoadSurfaceFromSurface(newsurf, NULL, NULL, surf, NULL, NULL, D3DX_FILTER_NONE, 0);
|
||||
|
@ -1521,6 +1613,57 @@ static void test_D3DXLoadSurface(IDirect3DDevice9 *device)
|
|||
|
||||
check_release((IUnknown *)newsurf, 1);
|
||||
check_release((IUnknown *)tex, 0);
|
||||
|
||||
/* Misalignment tests but check the resulting image. */
|
||||
hr = IDirect3DDevice9_CreateTexture(device, 8, 8, 1, 0, D3DFMT_DXT5, D3DPOOL_SYSTEMMEM, &tex, NULL);
|
||||
ok(hr == D3D_OK, "Got unexpected hr %#lx.\n", hr);
|
||||
hr = IDirect3DTexture9_GetSurfaceLevel(tex, 0, &newsurf);
|
||||
ok(hr == D3D_OK, "Got unexpected hr %#lx.\n", hr);
|
||||
|
||||
SetRect(&rect, 0, 0, 8, 8);
|
||||
hr = D3DXLoadSurfaceFromMemory(newsurf, NULL, NULL, dxt5_8_8,
|
||||
D3DFMT_DXT5, 16 * 2, NULL, &rect, D3DX_FILTER_NONE, 0);
|
||||
ok(hr == D3D_OK, "Got unexpected hr %#lx.\n", hr);
|
||||
|
||||
get_surface_decompressed_readback(device, newsurf, &surface_rb);
|
||||
|
||||
check_readback_pixel_4bpp(&surface_rb, 0, 0, 0xff0000ff, FALSE); /* Blue block, top left. */
|
||||
check_readback_pixel_4bpp(&surface_rb, 3, 3, 0xff0000ff, FALSE); /* Blue block, bottom right. */
|
||||
check_readback_pixel_4bpp(&surface_rb, 7, 0, 0xff00ff00, FALSE); /* Green block, top right. */
|
||||
check_readback_pixel_4bpp(&surface_rb, 4, 3, 0xff00ff00, FALSE); /* Green block, bottom left. */
|
||||
check_readback_pixel_4bpp(&surface_rb, 3, 4, 0xffff0000, FALSE); /* Red block, top right. */
|
||||
check_readback_pixel_4bpp(&surface_rb, 0, 7, 0xffff0000, FALSE); /* Red block, bottom left. */
|
||||
check_readback_pixel_4bpp(&surface_rb, 4, 4, 0xff000000, FALSE); /* Black block, top left. */
|
||||
check_readback_pixel_4bpp(&surface_rb, 7, 7, 0xff000000, FALSE); /* Black block, bottom right. */
|
||||
|
||||
release_surface_readback(&surface_rb);
|
||||
|
||||
/*
|
||||
* Load our surface into a destination rectangle that overlaps
|
||||
* multiple blocks. Original data in the blocks should be
|
||||
* preserved.
|
||||
*/
|
||||
SetRect(&rect, 4, 4, 8, 8);
|
||||
SetRect(&destrect, 2, 2, 6, 6);
|
||||
hr = D3DXLoadSurfaceFromMemory(newsurf, NULL, &destrect, dxt5_8_8,
|
||||
D3DFMT_DXT5, 16 * 2, NULL, &rect, D3DX_FILTER_NONE, 0);
|
||||
ok(hr == D3D_OK, "Got unexpected hr %#lx.\n", hr);
|
||||
|
||||
get_surface_decompressed_readback(device, newsurf, &surface_rb);
|
||||
|
||||
check_readback_pixel_4bpp(&surface_rb, 0, 0, 0xff0000ff, FALSE); /* Blue block, top left. */
|
||||
check_readback_pixel_4bpp(&surface_rb, 3, 3, 0xff000000, FALSE); /* Blue block, bottom right. */
|
||||
check_readback_pixel_4bpp(&surface_rb, 7, 0, 0xff00ff00, FALSE); /* Green block, top right. */
|
||||
check_readback_pixel_4bpp(&surface_rb, 4, 3, 0xff000000, FALSE); /* Green block, bottom left. */
|
||||
check_readback_pixel_4bpp(&surface_rb, 3, 4, 0xff000000, FALSE); /* Red block, top right. */
|
||||
check_readback_pixel_4bpp(&surface_rb, 0, 7, 0xffff0000, FALSE); /* Red block, bottom left. */
|
||||
check_readback_pixel_4bpp(&surface_rb, 4, 4, 0xff000000, FALSE); /* Black block, top left. */
|
||||
check_readback_pixel_4bpp(&surface_rb, 7, 7, 0xff000000, FALSE); /* Black block, bottom right. */
|
||||
|
||||
release_surface_readback(&surface_rb);
|
||||
|
||||
check_release((IUnknown *)newsurf, 1);
|
||||
check_release((IUnknown *)tex, 0);
|
||||
}
|
||||
|
||||
hr = IDirect3DDevice9_CreateTexture(device, 4, 4, 1, 0, D3DFMT_DXT1, D3DPOOL_SYSTEMMEM, &tex, NULL);
|
||||
|
|
|
@ -279,6 +279,7 @@ static int get_opcode_size(UNWIND_CODE op)
|
|||
return 2 + (op.OpInfo != 0);
|
||||
case UWOP_SAVE_NONVOL:
|
||||
case UWOP_SAVE_XMM128:
|
||||
case UWOP_EPILOG:
|
||||
return 2;
|
||||
case UWOP_SAVE_NONVOL_FAR:
|
||||
case UWOP_SAVE_XMM128_FAR:
|
||||
|
@ -586,6 +587,9 @@ static BOOL interpret_function_table_entry(struct cpu_stack_walk* csw,
|
|||
if (!sw_read_mem(csw, context->Rsp + 24, &context->Rsp, sizeof(DWORD64))) return FALSE;
|
||||
mach_frame = TRUE;
|
||||
break;
|
||||
case UWOP_EPILOG:
|
||||
if (info->Version == 2)
|
||||
break; /* nothing to do */
|
||||
default:
|
||||
FIXME("unknown code %u\n", info->UnwindCode[i].UnwindOp);
|
||||
break;
|
||||
|
@ -729,31 +733,46 @@ static BOOL x86_64_stack_walk(struct cpu_stack_walk *csw, STACKFRAME64 *frame,
|
|||
static void* x86_64_find_runtime_function(struct module* module, DWORD64 addr)
|
||||
{
|
||||
#ifdef __x86_64__
|
||||
RUNTIME_FUNCTION* rtf;
|
||||
ULONG size;
|
||||
int min, max;
|
||||
RUNTIME_FUNCTION *func = NULL;
|
||||
const RUNTIME_FUNCTION *rtf;
|
||||
ULONG size;
|
||||
|
||||
rtf = (RUNTIME_FUNCTION*)pe_map_directory(module, IMAGE_DIRECTORY_ENTRY_EXCEPTION, &size);
|
||||
if (rtf) for (min = 0, max = size / sizeof(*rtf); min <= max; )
|
||||
rtf = (const RUNTIME_FUNCTION*)pe_map_directory(module, IMAGE_DIRECTORY_ENTRY_EXCEPTION, &size);
|
||||
if (rtf)
|
||||
{
|
||||
int pos = (min + max) / 2;
|
||||
if (addr < module->module.BaseOfImage + rtf[pos].BeginAddress) max = pos - 1;
|
||||
else if (addr >= module->module.BaseOfImage + rtf[pos].EndAddress) min = pos + 1;
|
||||
else
|
||||
int lo, hi;
|
||||
|
||||
for (lo = 0, hi = size / sizeof(*rtf); lo <= hi; )
|
||||
{
|
||||
rtf += pos;
|
||||
while (rtf->UnwindData & 1) /* follow chained entry */
|
||||
int pos = (lo + hi) / 2;
|
||||
if (addr < module->module.BaseOfImage + rtf[pos].BeginAddress) hi = pos - 1;
|
||||
else if (addr >= module->module.BaseOfImage + rtf[pos].EndAddress) lo = pos + 1;
|
||||
else if ((func = fetch_buffer(module->process, sizeof(*func))))
|
||||
{
|
||||
FIXME("RunTime_Function outside IMAGE_DIRECTORY_ENTRY_EXCEPTION unimplemented yet!\n");
|
||||
return NULL;
|
||||
/* we need to read into the other process */
|
||||
/* rtf = (RUNTIME_FUNCTION*)(module->module.BaseOfImage + (rtf->UnwindData & ~1)); */
|
||||
*func = rtf[pos];
|
||||
while (func && (func->UnwindData & 1))
|
||||
{
|
||||
const BYTE *next = pe_lock_region_from_rva(module, func->UnwindData & ~1, sizeof(*func), NULL);
|
||||
if (next)
|
||||
{
|
||||
*func = *(const RUNTIME_FUNCTION *)next;
|
||||
pe_unlock_region(module, next);
|
||||
}
|
||||
else
|
||||
{
|
||||
WARN("Couldn't find chained RUNTIME_FUNCTION\n");
|
||||
func = NULL;
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
return rtf;
|
||||
}
|
||||
pe_unmap_directory(module, IMAGE_DIRECTORY_ENTRY_EXCEPTION, (const char*)rtf);
|
||||
}
|
||||
#endif
|
||||
return func;
|
||||
#else
|
||||
return NULL;
|
||||
#endif
|
||||
}
|
||||
|
||||
static unsigned x86_64_map_dwarf_register(unsigned regno, const struct module* module, BOOL eh_frame)
|
||||
|
@ -951,44 +970,7 @@ static BOOL x86_64_fetch_minidump_thread(struct dump_context* dc, unsigned index
|
|||
|
||||
static BOOL x86_64_fetch_minidump_module(struct dump_context* dc, unsigned index, unsigned flags)
|
||||
{
|
||||
/* FIXME: not sure about the flags... */
|
||||
if (1)
|
||||
{
|
||||
/* FIXME: crop values across module boundaries, */
|
||||
#ifdef __x86_64__
|
||||
struct process* pcs;
|
||||
struct module* module;
|
||||
const RUNTIME_FUNCTION* rtf;
|
||||
ULONG size;
|
||||
|
||||
if (!(pcs = process_find_by_handle(dc->process->handle)) ||
|
||||
!(module = module_find_by_addr(pcs, dc->modules[index].base)))
|
||||
return FALSE;
|
||||
rtf = (const RUNTIME_FUNCTION*)pe_map_directory(module, IMAGE_DIRECTORY_ENTRY_EXCEPTION, &size);
|
||||
if (rtf)
|
||||
{
|
||||
const RUNTIME_FUNCTION* end = (const RUNTIME_FUNCTION*)((const char*)rtf + size);
|
||||
UNWIND_INFO ui;
|
||||
|
||||
while (rtf + 1 < end)
|
||||
{
|
||||
while (rtf->UnwindData & 1) /* follow chained entry */
|
||||
{
|
||||
FIXME("RunTime_Function outside IMAGE_DIRECTORY_ENTRY_EXCEPTION unimplemented yet!\n");
|
||||
return FALSE;
|
||||
/* we need to read into the other process */
|
||||
/* rtf = (RUNTIME_FUNCTION*)(module->module.BaseOfImage + (rtf->UnwindData & ~1)); */
|
||||
}
|
||||
if (read_process_memory(dc->process, dc->modules[index].base + rtf->UnwindData, &ui, sizeof(ui)))
|
||||
minidump_add_memory_block(dc, dc->modules[index].base + rtf->UnwindData,
|
||||
FIELD_OFFSET(UNWIND_INFO, UnwindCode) + ui.CountOfCodes * sizeof(UNWIND_CODE), 0);
|
||||
rtf++;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
struct cpu cpu_x86_64 = {
|
||||
|
|
|
@ -438,9 +438,11 @@ struct module
|
|||
struct process* process;
|
||||
IMAGEHLP_MODULEW64 module;
|
||||
WCHAR modulename[64]; /* used for enumeration */
|
||||
WCHAR* alt_modulename; /* used in symbol lookup */
|
||||
struct module* next;
|
||||
enum dhext_module_type type : 16;
|
||||
unsigned short is_virtual : 1,
|
||||
dont_load_symbols : 1,
|
||||
is_wine_builtin : 1,
|
||||
has_file_image : 1;
|
||||
struct cpu* cpu;
|
||||
|
@ -548,17 +550,6 @@ struct module_pair
|
|||
struct module* effective; /* out: module with debug info */
|
||||
};
|
||||
|
||||
enum pdb_kind {PDB_JG, PDB_DS};
|
||||
|
||||
struct pdb_lookup
|
||||
{
|
||||
const char* filename;
|
||||
enum pdb_kind kind;
|
||||
unsigned int age;
|
||||
unsigned int timestamp;
|
||||
GUID guid;
|
||||
};
|
||||
|
||||
struct cpu_stack_walk
|
||||
{
|
||||
HANDLE hProcess;
|
||||
|
@ -627,7 +618,9 @@ struct dump_context
|
|||
struct dump_module* modules;
|
||||
unsigned num_modules;
|
||||
unsigned alloc_modules;
|
||||
/* exception information */
|
||||
/* outter information */
|
||||
MINIDUMP_EXCEPTION_INFORMATION *except_param;
|
||||
MINIDUMP_USER_STREAM_INFORMATION *user_stream;
|
||||
/* output information */
|
||||
MINIDUMP_TYPE type;
|
||||
HANDLE hFile;
|
||||
|
@ -759,7 +752,6 @@ extern BOOL pe_load_debug_directory(const struct process* pcs,
|
|||
const IMAGE_DEBUG_DIRECTORY* dbg, int nDbg);
|
||||
extern DWORD msc_get_file_indexinfo(void* image, const IMAGE_DEBUG_DIRECTORY* dbgdir, DWORD size,
|
||||
SYMSRV_INDEX_INFOW* info);
|
||||
extern BOOL pdb_fetch_file_info(const struct pdb_lookup* pdb_lookup, unsigned* matched);
|
||||
struct pdb_cmd_pair {
|
||||
const char* name;
|
||||
DWORD* pvalue;
|
||||
|
@ -767,11 +759,12 @@ struct pdb_cmd_pair {
|
|||
extern BOOL pdb_virtual_unwind(struct cpu_stack_walk *csw, DWORD_PTR ip,
|
||||
union ctx *context, struct pdb_cmd_pair *cpair);
|
||||
extern DWORD pdb_get_file_indexinfo(void* image, DWORD size, SYMSRV_INDEX_INFOW* info);
|
||||
extern DWORD dbg_get_file_indexinfo(void* image, DWORD size, SYMSRV_INDEX_INFOW* info);
|
||||
|
||||
/* path.c */
|
||||
extern BOOL path_find_symbol_file(const struct process* pcs, const struct module* module,
|
||||
extern BOOL path_find_symbol_file(const struct process *pcs, const struct module *module,
|
||||
PCSTR full_path, BOOL is_pdb, const GUID* guid, DWORD dw1, DWORD dw2,
|
||||
WCHAR *buffer, BOOL* is_unmatched);
|
||||
SYMSRV_INDEX_INFOW *info, BOOL *unmatched);
|
||||
extern WCHAR *get_dos_file_name(const WCHAR *filename) __WINE_DEALLOC(HeapFree, 3) __WINE_MALLOC;
|
||||
extern BOOL search_dll_path(const struct process* process, const WCHAR *name, WORD machine,
|
||||
BOOL (*match)(void*, HANDLE, const WCHAR*), void *param);
|
||||
|
@ -790,7 +783,10 @@ extern struct module*
|
|||
extern BOOL pe_load_debug_info(const struct process* pcs,
|
||||
struct module* module);
|
||||
extern const char* pe_map_directory(struct module* module, int dirno, DWORD* size);
|
||||
extern BOOL pe_unmap_directory(struct module* module, int dirno, const char*);
|
||||
extern DWORD pe_get_file_indexinfo(void* image, DWORD size, SYMSRV_INDEX_INFOW* info);
|
||||
extern const BYTE* pe_lock_region_from_rva(struct module *module, DWORD rva, DWORD size, DWORD *length);
|
||||
extern BOOL pe_unlock_region(struct module *module, const BYTE* region);
|
||||
|
||||
/* source.c */
|
||||
extern unsigned source_new(struct module* module, const char* basedir, const char* source);
|
||||
|
|
|
@ -61,15 +61,19 @@ static BOOL fetch_process_info(struct dump_context* dc)
|
|||
{
|
||||
if (HandleToUlong(spi->UniqueProcessId) == dc->pid)
|
||||
{
|
||||
dc->num_threads = spi->dwThreadCount;
|
||||
dc->num_threads = 0;
|
||||
dc->threads = HeapAlloc(GetProcessHeap(), 0,
|
||||
dc->num_threads * sizeof(dc->threads[0]));
|
||||
if (!dc->threads) goto failed;
|
||||
for (i = 0; i < dc->num_threads; i++)
|
||||
spi->dwThreadCount * sizeof(dc->threads[0]));
|
||||
if (!dc->threads) break;
|
||||
for (i = 0; i < spi->dwThreadCount; i++)
|
||||
{
|
||||
dc->threads[i].tid = HandleToULong(spi->ti[i].ClientId.UniqueThread);
|
||||
dc->threads[i].prio_class = spi->ti[i].dwBasePriority; /* FIXME */
|
||||
dc->threads[i].curr_prio = spi->ti[i].dwCurrentPriority;
|
||||
/* don't include current thread */
|
||||
if (HandleToULong(spi->ti[i].ClientId.UniqueThread) == GetCurrentThreadId())
|
||||
continue;
|
||||
dc->threads[dc->num_threads].tid = HandleToULong(spi->ti[i].ClientId.UniqueThread);
|
||||
dc->threads[dc->num_threads].prio_class = spi->ti[i].dwBasePriority; /* FIXME */
|
||||
dc->threads[dc->num_threads].curr_prio = spi->ti[i].dwCurrentPriority;
|
||||
dc->num_threads++;
|
||||
}
|
||||
HeapFree(GetProcessHeap(), 0, pcs_buffer);
|
||||
return TRUE;
|
||||
|
@ -78,7 +82,6 @@ static BOOL fetch_process_info(struct dump_context* dc)
|
|||
spi = (SYSTEM_PROCESS_INFORMATION*)((char*)spi + spi->NextEntryOffset);
|
||||
}
|
||||
}
|
||||
failed:
|
||||
HeapFree(GetProcessHeap(), 0, pcs_buffer);
|
||||
return FALSE;
|
||||
}
|
||||
|
@ -116,7 +119,6 @@ static void fetch_thread_stack(struct dump_context* dc, const void* teb_addr,
|
|||
* fetches some information about thread of id 'tid'
|
||||
*/
|
||||
static BOOL fetch_thread_info(struct dump_context* dc, int thd_idx,
|
||||
const MINIDUMP_EXCEPTION_INFORMATION* except,
|
||||
MINIDUMP_THREAD* mdThd, CONTEXT* ctx)
|
||||
{
|
||||
DWORD tid = dc->threads[thd_idx].tid;
|
||||
|
@ -141,44 +143,22 @@ static BOOL fetch_thread_info(struct dump_context* dc, int thd_idx,
|
|||
FIXME("Couldn't open thread %lu (%lu)\n", tid, GetLastError());
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
|
||||
if (NtQueryInformationThread(hThread, ThreadBasicInformation,
|
||||
&tbi, sizeof(tbi), NULL) == STATUS_SUCCESS)
|
||||
{
|
||||
mdThd->Teb = (ULONG_PTR)tbi.TebBaseAddress;
|
||||
if (tbi.ExitStatus == STILL_ACTIVE)
|
||||
{
|
||||
if (tid != GetCurrentThreadId() &&
|
||||
(mdThd->SuspendCount = SuspendThread(hThread)) != (DWORD)-1)
|
||||
{
|
||||
ctx->ContextFlags = CONTEXT_FULL;
|
||||
if (!GetThreadContext(hThread, ctx))
|
||||
memset(ctx, 0, sizeof(*ctx));
|
||||
|
||||
fetch_thread_stack(dc, tbi.TebBaseAddress, ctx, &mdThd->Stack);
|
||||
ResumeThread(hThread);
|
||||
}
|
||||
else if (tid == GetCurrentThreadId() && except)
|
||||
{
|
||||
CONTEXT lctx, *pctx;
|
||||
mdThd->SuspendCount = 1;
|
||||
if (except->ClientPointers)
|
||||
{
|
||||
EXCEPTION_POINTERS ep;
|
||||
|
||||
ReadProcessMemory(dc->process->handle, except->ExceptionPointers,
|
||||
&ep, sizeof(ep), NULL);
|
||||
ReadProcessMemory(dc->process->handle, ep.ContextRecord,
|
||||
&lctx, sizeof(lctx), NULL);
|
||||
pctx = &lctx;
|
||||
}
|
||||
else pctx = except->ExceptionPointers->ContextRecord;
|
||||
|
||||
*ctx = *pctx;
|
||||
fetch_thread_stack(dc, tbi.TebBaseAddress, pctx, &mdThd->Stack);
|
||||
}
|
||||
else mdThd->SuspendCount = 0;
|
||||
mdThd->SuspendCount = SuspendThread(hThread);
|
||||
ctx->ContextFlags = CONTEXT_ALL;
|
||||
if (!GetThreadContext(hThread, ctx))
|
||||
memset(ctx, 0, sizeof(*ctx));
|
||||
fetch_thread_stack(dc, tbi.TebBaseAddress, ctx, &mdThd->Stack);
|
||||
ResumeThread(hThread);
|
||||
}
|
||||
else
|
||||
mdThd->SuspendCount = (DWORD)-1;
|
||||
}
|
||||
CloseHandle(hThread);
|
||||
return TRUE;
|
||||
|
@ -397,22 +377,21 @@ static void append(struct dump_context* dc, const void* data, unsigned size)
|
|||
*
|
||||
* Write in File the exception information from pcs
|
||||
*/
|
||||
static unsigned dump_exception_info(struct dump_context* dc,
|
||||
const MINIDUMP_EXCEPTION_INFORMATION* except)
|
||||
static unsigned dump_exception_info(struct dump_context* dc)
|
||||
{
|
||||
MINIDUMP_EXCEPTION_STREAM mdExcpt;
|
||||
EXCEPTION_RECORD rec, *prec;
|
||||
CONTEXT ctx, *pctx;
|
||||
DWORD i;
|
||||
|
||||
mdExcpt.ThreadId = except->ThreadId;
|
||||
mdExcpt.ThreadId = dc->except_param->ThreadId;
|
||||
mdExcpt.__alignment = 0;
|
||||
if (except->ClientPointers)
|
||||
if (dc->except_param->ClientPointers)
|
||||
{
|
||||
EXCEPTION_POINTERS ep;
|
||||
|
||||
ReadProcessMemory(dc->process->handle,
|
||||
except->ExceptionPointers, &ep, sizeof(ep), NULL);
|
||||
dc->except_param->ExceptionPointers, &ep, sizeof(ep), NULL);
|
||||
ReadProcessMemory(dc->process->handle,
|
||||
ep.ExceptionRecord, &rec, sizeof(rec), NULL);
|
||||
ReadProcessMemory(dc->process->handle,
|
||||
|
@ -422,8 +401,8 @@ static unsigned dump_exception_info(struct dump_context* dc,
|
|||
}
|
||||
else
|
||||
{
|
||||
prec = except->ExceptionPointers->ExceptionRecord;
|
||||
pctx = except->ExceptionPointers->ContextRecord;
|
||||
prec = dc->except_param->ExceptionPointers->ExceptionRecord;
|
||||
pctx = dc->except_param->ExceptionPointers->ContextRecord;
|
||||
}
|
||||
mdExcpt.ExceptionRecord.ExceptionCode = prec->ExceptionCode;
|
||||
mdExcpt.ExceptionRecord.ExceptionFlags = prec->ExceptionFlags;
|
||||
|
@ -715,8 +694,7 @@ static unsigned dump_system_info(struct dump_context* dc)
|
|||
*
|
||||
* Dumps into File the information about running threads
|
||||
*/
|
||||
static unsigned dump_threads(struct dump_context* dc,
|
||||
const MINIDUMP_EXCEPTION_INFORMATION* except)
|
||||
static unsigned dump_threads(struct dump_context* dc)
|
||||
{
|
||||
MINIDUMP_THREAD mdThd;
|
||||
MINIDUMP_THREAD_LIST mdThdList;
|
||||
|
@ -732,7 +710,7 @@ static unsigned dump_threads(struct dump_context* dc,
|
|||
|
||||
for (i = 0; i < dc->num_threads; i++)
|
||||
{
|
||||
fetch_thread_info(dc, i, except, &mdThd, &ctx);
|
||||
fetch_thread_info(dc, i, &mdThd, &ctx);
|
||||
|
||||
flags_out = ThreadWriteThread | ThreadWriteStack | ThreadWriteContext |
|
||||
ThreadWriteInstructionWindow;
|
||||
|
@ -906,6 +884,126 @@ static unsigned dump_misc_info(struct dump_context* dc)
|
|||
return sizeof(mmi);
|
||||
}
|
||||
|
||||
static DWORD CALLBACK write_minidump(void *_args)
|
||||
{
|
||||
struct dump_context *dc = _args;
|
||||
static const MINIDUMP_DIRECTORY emptyDir = {UnusedStream, {0, 0}};
|
||||
MINIDUMP_HEADER mdHead;
|
||||
MINIDUMP_DIRECTORY mdDir;
|
||||
DWORD i, nStreams, idx_stream;
|
||||
|
||||
if (!fetch_process_info(dc)) return FALSE;
|
||||
fetch_modules_info(dc);
|
||||
|
||||
/* 1) init */
|
||||
nStreams = 6 + (dc->except_param ? 1 : 0) +
|
||||
(dc->user_stream ? dc->user_stream->UserStreamCount : 0);
|
||||
|
||||
/* pad the directory size to a multiple of 4 for alignment purposes */
|
||||
nStreams = (nStreams + 3) & ~3;
|
||||
|
||||
/* 2) write header */
|
||||
mdHead.Signature = MINIDUMP_SIGNATURE;
|
||||
mdHead.Version = MINIDUMP_VERSION; /* NOTE: native puts in an 'implementation specific' value in the high order word of this member */
|
||||
mdHead.NumberOfStreams = nStreams;
|
||||
mdHead.CheckSum = 0; /* native sets a 0 checksum in its files */
|
||||
mdHead.StreamDirectoryRva = sizeof(mdHead);
|
||||
mdHead.TimeDateStamp = time(NULL);
|
||||
mdHead.Flags = dc->type;
|
||||
append(dc, &mdHead, sizeof(mdHead));
|
||||
|
||||
/* 3) write stream directories */
|
||||
dc->rva += nStreams * sizeof(mdDir);
|
||||
idx_stream = 0;
|
||||
|
||||
/* 3.1) write data stream directories */
|
||||
|
||||
/* must be first in minidump */
|
||||
mdDir.StreamType = SystemInfoStream;
|
||||
mdDir.Location.Rva = dc->rva;
|
||||
mdDir.Location.DataSize = dump_system_info(dc);
|
||||
writeat(dc, mdHead.StreamDirectoryRva + idx_stream++ * sizeof(mdDir),
|
||||
&mdDir, sizeof(mdDir));
|
||||
|
||||
mdDir.StreamType = ThreadListStream;
|
||||
mdDir.Location.Rva = dc->rva;
|
||||
mdDir.Location.DataSize = dump_threads(dc);
|
||||
writeat(dc, mdHead.StreamDirectoryRva + idx_stream++ * sizeof(mdDir),
|
||||
&mdDir, sizeof(mdDir));
|
||||
|
||||
mdDir.StreamType = ModuleListStream;
|
||||
mdDir.Location.Rva = dc->rva;
|
||||
mdDir.Location.DataSize = dump_modules(dc, FALSE);
|
||||
writeat(dc, mdHead.StreamDirectoryRva + idx_stream++ * sizeof(mdDir),
|
||||
&mdDir, sizeof(mdDir));
|
||||
|
||||
mdDir.StreamType = 0xfff0; /* FIXME: this is part of MS reserved streams */
|
||||
mdDir.Location.Rva = dc->rva;
|
||||
mdDir.Location.DataSize = dump_modules(dc, TRUE);
|
||||
writeat(dc, mdHead.StreamDirectoryRva + idx_stream++ * sizeof(mdDir),
|
||||
&mdDir, sizeof(mdDir));
|
||||
|
||||
|
||||
if (!(dc->type & MiniDumpWithFullMemory))
|
||||
{
|
||||
mdDir.StreamType = MemoryListStream;
|
||||
mdDir.Location.Rva = dc->rva;
|
||||
mdDir.Location.DataSize = dump_memory_info(dc);
|
||||
writeat(dc, mdHead.StreamDirectoryRva + idx_stream++ * sizeof(mdDir),
|
||||
&mdDir, sizeof(mdDir));
|
||||
}
|
||||
|
||||
mdDir.StreamType = MiscInfoStream;
|
||||
mdDir.Location.Rva = dc->rva;
|
||||
mdDir.Location.DataSize = dump_misc_info(dc);
|
||||
writeat(dc, mdHead.StreamDirectoryRva + idx_stream++ * sizeof(mdDir),
|
||||
&mdDir, sizeof(mdDir));
|
||||
|
||||
/* 3.2) write exception information (if any) */
|
||||
if (dc->except_param)
|
||||
{
|
||||
mdDir.StreamType = ExceptionStream;
|
||||
mdDir.Location.Rva = dc->rva;
|
||||
mdDir.Location.DataSize = dump_exception_info(dc);
|
||||
writeat(dc, mdHead.StreamDirectoryRva + idx_stream++ * sizeof(mdDir),
|
||||
&mdDir, sizeof(mdDir));
|
||||
}
|
||||
|
||||
/* 3.3) write user defined streams (if any) */
|
||||
if (dc->user_stream)
|
||||
{
|
||||
for (i = 0; i < dc->user_stream->UserStreamCount; i++)
|
||||
{
|
||||
mdDir.StreamType = dc->user_stream->UserStreamArray[i].Type;
|
||||
mdDir.Location.DataSize = dc->user_stream->UserStreamArray[i].BufferSize;
|
||||
mdDir.Location.Rva = dc->rva;
|
||||
writeat(dc, mdHead.StreamDirectoryRva + idx_stream++ * sizeof(mdDir),
|
||||
&mdDir, sizeof(mdDir));
|
||||
append(dc, dc->user_stream->UserStreamArray[i].Buffer,
|
||||
dc->user_stream->UserStreamArray[i].BufferSize);
|
||||
}
|
||||
}
|
||||
|
||||
/* 3.4) write full memory (if requested) */
|
||||
if (dc->type & MiniDumpWithFullMemory)
|
||||
{
|
||||
fetch_memory64_info(dc);
|
||||
|
||||
mdDir.StreamType = Memory64ListStream;
|
||||
mdDir.Location.Rva = dc->rva;
|
||||
mdDir.Location.DataSize = dump_memory64_info(dc);
|
||||
writeat(dc, mdHead.StreamDirectoryRva + idx_stream++ * sizeof(mdDir),
|
||||
&mdDir, sizeof(mdDir));
|
||||
}
|
||||
|
||||
/* fill the remaining directory entries with 0's (unused stream types) */
|
||||
/* NOTE: this should always come last in the dump! */
|
||||
for (i = idx_stream; i < nStreams; i++)
|
||||
writeat(dc, mdHead.StreamDirectoryRva + i * sizeof(emptyDir), &emptyDir, sizeof(emptyDir));
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
/******************************************************************
|
||||
* MiniDumpWriteDump (DEBUGHLP.@)
|
||||
*
|
||||
|
@ -916,12 +1014,9 @@ BOOL WINAPI MiniDumpWriteDump(HANDLE hProcess, DWORD pid, HANDLE hFile,
|
|||
PMINIDUMP_USER_STREAM_INFORMATION UserStreamParam,
|
||||
PMINIDUMP_CALLBACK_INFORMATION CallbackParam)
|
||||
{
|
||||
static const MINIDUMP_DIRECTORY emptyDir = {UnusedStream, {0, 0}};
|
||||
MINIDUMP_HEADER mdHead;
|
||||
MINIDUMP_DIRECTORY mdDir;
|
||||
DWORD i, nStreams, idx_stream;
|
||||
struct dump_context dc;
|
||||
BOOL sym_initialized = FALSE;
|
||||
BOOL ret = FALSE;
|
||||
|
||||
if (!(dc.process = process_find_by_handle(hProcess)))
|
||||
{
|
||||
|
@ -933,6 +1028,15 @@ BOOL WINAPI MiniDumpWriteDump(HANDLE hProcess, DWORD pid, HANDLE hFile,
|
|||
dc.process = process_find_by_handle(hProcess);
|
||||
}
|
||||
|
||||
if (DumpType & MiniDumpWithDataSegs)
|
||||
FIXME("NIY MiniDumpWithDataSegs\n");
|
||||
if (DumpType & MiniDumpWithHandleData)
|
||||
FIXME("NIY MiniDumpWithHandleData\n");
|
||||
if (DumpType & MiniDumpFilterMemory)
|
||||
FIXME("NIY MiniDumpFilterMemory\n");
|
||||
if (DumpType & MiniDumpScanMemory)
|
||||
FIXME("NIY MiniDumpScanMemory\n");
|
||||
|
||||
dc.hFile = hFile;
|
||||
dc.pid = pid;
|
||||
dc.modules = NULL;
|
||||
|
@ -949,125 +1053,26 @@ BOOL WINAPI MiniDumpWriteDump(HANDLE hProcess, DWORD pid, HANDLE hFile,
|
|||
dc.num_mem64 = 0;
|
||||
dc.alloc_mem64 = 0;
|
||||
dc.rva = 0;
|
||||
dc.except_param = ExceptionParam;
|
||||
dc.user_stream = UserStreamParam;
|
||||
|
||||
if (!fetch_process_info(&dc)) return FALSE;
|
||||
fetch_modules_info(&dc);
|
||||
|
||||
/* 1) init */
|
||||
nStreams = 6 + (ExceptionParam ? 1 : 0) +
|
||||
(UserStreamParam ? UserStreamParam->UserStreamCount : 0);
|
||||
|
||||
/* pad the directory size to a multiple of 4 for alignment purposes */
|
||||
nStreams = (nStreams + 3) & ~3;
|
||||
|
||||
if (DumpType & MiniDumpWithDataSegs)
|
||||
FIXME("NIY MiniDumpWithDataSegs\n");
|
||||
if (DumpType & MiniDumpWithHandleData)
|
||||
FIXME("NIY MiniDumpWithHandleData\n");
|
||||
if (DumpType & MiniDumpFilterMemory)
|
||||
FIXME("NIY MiniDumpFilterMemory\n");
|
||||
if (DumpType & MiniDumpScanMemory)
|
||||
FIXME("NIY MiniDumpScanMemory\n");
|
||||
|
||||
/* 2) write header */
|
||||
mdHead.Signature = MINIDUMP_SIGNATURE;
|
||||
mdHead.Version = MINIDUMP_VERSION; /* NOTE: native puts in an 'implementation specific' value in the high order word of this member */
|
||||
mdHead.NumberOfStreams = nStreams;
|
||||
mdHead.CheckSum = 0; /* native sets a 0 checksum in its files */
|
||||
mdHead.StreamDirectoryRva = sizeof(mdHead);
|
||||
mdHead.TimeDateStamp = time(NULL);
|
||||
mdHead.Flags = DumpType;
|
||||
append(&dc, &mdHead, sizeof(mdHead));
|
||||
|
||||
/* 3) write stream directories */
|
||||
dc.rva += nStreams * sizeof(mdDir);
|
||||
idx_stream = 0;
|
||||
|
||||
/* 3.1) write data stream directories */
|
||||
|
||||
/* must be first in minidump */
|
||||
mdDir.StreamType = SystemInfoStream;
|
||||
mdDir.Location.Rva = dc.rva;
|
||||
mdDir.Location.DataSize = dump_system_info(&dc);
|
||||
writeat(&dc, mdHead.StreamDirectoryRva + idx_stream++ * sizeof(mdDir),
|
||||
&mdDir, sizeof(mdDir));
|
||||
|
||||
mdDir.StreamType = ThreadListStream;
|
||||
mdDir.Location.Rva = dc.rva;
|
||||
mdDir.Location.DataSize = dump_threads(&dc, ExceptionParam);
|
||||
writeat(&dc, mdHead.StreamDirectoryRva + idx_stream++ * sizeof(mdDir),
|
||||
&mdDir, sizeof(mdDir));
|
||||
|
||||
mdDir.StreamType = ModuleListStream;
|
||||
mdDir.Location.Rva = dc.rva;
|
||||
mdDir.Location.DataSize = dump_modules(&dc, FALSE);
|
||||
writeat(&dc, mdHead.StreamDirectoryRva + idx_stream++ * sizeof(mdDir),
|
||||
&mdDir, sizeof(mdDir));
|
||||
|
||||
mdDir.StreamType = 0xfff0; /* FIXME: this is part of MS reserved streams */
|
||||
mdDir.Location.Rva = dc.rva;
|
||||
mdDir.Location.DataSize = dump_modules(&dc, TRUE);
|
||||
writeat(&dc, mdHead.StreamDirectoryRva + idx_stream++ * sizeof(mdDir),
|
||||
&mdDir, sizeof(mdDir));
|
||||
|
||||
|
||||
if (!(DumpType & MiniDumpWithFullMemory))
|
||||
/* have a dedicated thread for fetching info on self */
|
||||
if (dc.pid != GetCurrentProcessId())
|
||||
ret = write_minidump(&dc);
|
||||
else
|
||||
{
|
||||
mdDir.StreamType = MemoryListStream;
|
||||
mdDir.Location.Rva = dc.rva;
|
||||
mdDir.Location.DataSize = dump_memory_info(&dc);
|
||||
writeat(&dc, mdHead.StreamDirectoryRva + idx_stream++ * sizeof(mdDir),
|
||||
&mdDir, sizeof(mdDir));
|
||||
}
|
||||
|
||||
mdDir.StreamType = MiscInfoStream;
|
||||
mdDir.Location.Rva = dc.rva;
|
||||
mdDir.Location.DataSize = dump_misc_info(&dc);
|
||||
writeat(&dc, mdHead.StreamDirectoryRva + idx_stream++ * sizeof(mdDir),
|
||||
&mdDir, sizeof(mdDir));
|
||||
|
||||
/* 3.2) write exception information (if any) */
|
||||
if (ExceptionParam)
|
||||
{
|
||||
mdDir.StreamType = ExceptionStream;
|
||||
mdDir.Location.Rva = dc.rva;
|
||||
mdDir.Location.DataSize = dump_exception_info(&dc, ExceptionParam);
|
||||
writeat(&dc, mdHead.StreamDirectoryRva + idx_stream++ * sizeof(mdDir),
|
||||
&mdDir, sizeof(mdDir));
|
||||
}
|
||||
|
||||
/* 3.3) write user defined streams (if any) */
|
||||
if (UserStreamParam)
|
||||
{
|
||||
for (i = 0; i < UserStreamParam->UserStreamCount; i++)
|
||||
DWORD exit_code;
|
||||
HANDLE h = CreateThread(NULL, 0, write_minidump, &dc, 0, NULL);
|
||||
if (h)
|
||||
{
|
||||
mdDir.StreamType = UserStreamParam->UserStreamArray[i].Type;
|
||||
mdDir.Location.DataSize = UserStreamParam->UserStreamArray[i].BufferSize;
|
||||
mdDir.Location.Rva = dc.rva;
|
||||
writeat(&dc, mdHead.StreamDirectoryRva + idx_stream++ * sizeof(mdDir),
|
||||
&mdDir, sizeof(mdDir));
|
||||
append(&dc, UserStreamParam->UserStreamArray[i].Buffer,
|
||||
UserStreamParam->UserStreamArray[i].BufferSize);
|
||||
if (WaitForSingleObject(h, INFINITE) == WAIT_OBJECT_0 && GetExitCodeThread(h, &exit_code))
|
||||
ret = exit_code;
|
||||
else
|
||||
TerminateThread(h, 0);
|
||||
CloseHandle(h);
|
||||
}
|
||||
}
|
||||
|
||||
/* 3.4) write full memory (if requested) */
|
||||
if (DumpType & MiniDumpWithFullMemory)
|
||||
{
|
||||
fetch_memory64_info(&dc);
|
||||
|
||||
mdDir.StreamType = Memory64ListStream;
|
||||
mdDir.Location.Rva = dc.rva;
|
||||
mdDir.Location.DataSize = dump_memory64_info(&dc);
|
||||
writeat(&dc, mdHead.StreamDirectoryRva + idx_stream++ * sizeof(mdDir),
|
||||
&mdDir, sizeof(mdDir));
|
||||
}
|
||||
|
||||
/* fill the remaining directory entries with 0's (unused stream types) */
|
||||
/* NOTE: this should always come last in the dump! */
|
||||
for (i = idx_stream; i < nStreams; i++)
|
||||
writeat(&dc, mdHead.StreamDirectoryRva + i * sizeof(emptyDir), &emptyDir, sizeof(emptyDir));
|
||||
|
||||
if (sym_initialized)
|
||||
SymCleanup(hProcess);
|
||||
|
||||
|
@ -1076,7 +1081,7 @@ BOOL WINAPI MiniDumpWriteDump(HANDLE hProcess, DWORD pid, HANDLE hFile,
|
|||
HeapFree(GetProcessHeap(), 0, dc.modules);
|
||||
HeapFree(GetProcessHeap(), 0, dc.threads);
|
||||
|
||||
return TRUE;
|
||||
return ret;
|
||||
}
|
||||
|
||||
/******************************************************************
|
||||
|
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Add table
Reference in a new issue