Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
W
wine-winehq
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Registry
Registry
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
wine
wine-winehq
Commits
00a0c978
Commit
00a0c978
authored
Feb 27, 2024
by
Rémi Bernon
Committed by
Alexandre Julliard
Mar 28, 2024
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
win32u: Use a symlink for the logically indexed adapter config key.
Linking it to what will be a physically identified adapter config key.
parent
c6e328c2
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
24 additions
and
20 deletions
+24
-20
sysparams.c
dlls/win32u/sysparams.c
+24
-20
No files found.
dlls/win32u/sysparams.c
View file @
00a0c978
...
...
@@ -109,10 +109,10 @@ struct adapter
{
LONG
refcount
;
struct
list
entry
;
char
path
[
MAX_PATH
];
unsigned
int
id
;
struct
gpu
*
gpu
;
UINT
state_flags
;
WCHAR
config_key
[
MAX_PATH
];
UINT
monitor_count
;
UINT
mode_count
;
DEVMODEW
*
modes
;
...
...
@@ -447,7 +447,7 @@ static BOOL adapter_get_registry_settings( const struct adapter *adapter, DEVMOD
mutex
=
get_display_device_init_mutex
();
if
(
!
(
hkey
=
reg_open_
key
(
config_key
,
adapter
->
config_key
,
lstrlenW
(
adapter
->
config_key
)
*
sizeof
(
WCHAR
)
)))
ret
=
FALSE
;
if
(
!
(
hkey
=
reg_open_
ascii_key
(
config_key
,
adapter
->
path
)))
ret
=
FALSE
;
else
{
ret
=
read_adapter_mode
(
hkey
,
ENUM_REGISTRY_SETTINGS
,
mode
);
...
...
@@ -466,7 +466,7 @@ static BOOL adapter_set_registry_settings( const struct adapter *adapter, const
mutex
=
get_display_device_init_mutex
();
if
(
!
(
hkey
=
reg_open_
key
(
config_key
,
adapter
->
config_key
,
lstrlenW
(
adapter
->
config_key
)
*
sizeof
(
WCHAR
)
)))
ret
=
FALSE
;
if
(
!
(
hkey
=
reg_open_
ascii_key
(
config_key
,
adapter
->
path
)))
ret
=
FALSE
;
else
{
ret
=
write_adapter_mode
(
hkey
,
ENUM_REGISTRY_SETTINGS
,
mode
);
...
...
@@ -499,7 +499,7 @@ static BOOL adapter_get_current_settings( const struct adapter *adapter, DEVMODE
mutex
=
get_display_device_init_mutex
();
if
(
!
(
hkey
=
reg_open_
key
(
config_key
,
adapter
->
config_key
,
lstrlenW
(
adapter
->
config_key
)
*
sizeof
(
WCHAR
)
)))
ret
=
FALSE
;
if
(
!
(
hkey
=
reg_open_
ascii_key
(
config_key
,
adapter
->
path
)))
ret
=
FALSE
;
else
{
ret
=
read_adapter_mode
(
hkey
,
ENUM_CURRENT_SETTINGS
,
mode
);
...
...
@@ -518,7 +518,7 @@ static BOOL adapter_set_current_settings( const struct adapter *adapter, const D
mutex
=
get_display_device_init_mutex
();
if
(
!
(
hkey
=
reg_open_
key
(
config_key
,
adapter
->
config_key
,
lstrlenW
(
adapter
->
config_key
)
*
sizeof
(
WCHAR
)
)))
ret
=
FALSE
;
if
(
!
(
hkey
=
reg_open_
ascii_key
(
config_key
,
adapter
->
path
)))
ret
=
FALSE
;
else
{
ret
=
write_adapter_mode
(
hkey
,
ENUM_CURRENT_SETTINGS
,
mode
);
...
...
@@ -618,17 +618,13 @@ static BOOL read_display_adapter_settings( unsigned int index, struct adapter *i
/* Find adapter */
sprintf
(
buffer
,
"
\\
Device
\\
Video%d"
,
index
);
size
=
query_reg_ascii_value
(
video_key
,
buffer
,
value
,
sizeof
(
buffer
)
);
if
(
!
size
||
value
->
Type
!=
REG_SZ
||
value
->
DataLength
<=
sizeof
(
"
\\
Registry
\\
Machine
\\
"
)
*
sizeof
(
WCHAR
))
return
FALSE
;
if
(
!
size
||
value
->
Type
!=
REG_SZ
)
return
FALSE
;
/* DeviceKey */
size
=
sizeof
(
"
\\
Registry
\\
Machine
\\
"
)
-
1
;
memcpy
(
info
->
config_key
,
value_str
+
size
,
value
->
DataLength
-
size
);
if
(
!
(
hkey
=
reg_open_key
(
config_key
,
info
->
config_key
,
lstrlenW
(
info
->
config_key
)
*
sizeof
(
WCHAR
)
)))
return
FALSE
;
size
=
sizeof
(
"
\\
Registry
\\
Machine"
);
if
(
value
->
DataLength
/
sizeof
(
WCHAR
)
<=
size
)
return
FALSE
;
for
(
i
=
0
;
i
<
value
->
DataLength
/
sizeof
(
WCHAR
)
-
size
;
i
++
)
info
->
path
[
i
]
=
value_str
[
size
+
i
];
if
(
!
(
hkey
=
reg_open_ascii_key
(
config_key
,
info
->
path
)))
return
FALSE
;
/* StateFlags */
if
(
query_reg_ascii_value
(
hkey
,
"StateFlags"
,
value
,
sizeof
(
buffer
)
)
&&
value
->
Type
==
REG_DWORD
)
...
...
@@ -1282,13 +1278,19 @@ static BOOL write_adapter_to_registry( const struct adapter *adapter, HKEY *adap
NtClose
(
hkey
);
/* Following information is Wine specific, it doesn't really exist on Windows. */
sprintf
(
buffer
,
"System
\\
CurrentControlSet
\\
Control
\\
Video
\\
%s
\\
%04x"
,
gpu
->
guid
,
adapter_index
);
*
adapter_key
=
reg_create_ascii_key
(
config_key
,
buffer
,
REG_OPTION_VOLATILE
,
NULL
);
*
adapter_key
=
reg_create_ascii_key
(
NULL
,
adapter
->
path
,
REG_OPTION_VOLATILE
,
NULL
);
set_reg_ascii_value
(
*
adapter_key
,
"GPUID"
,
gpu
->
path
);
set_reg_value
(
*
adapter_key
,
state_flagsW
,
REG_DWORD
,
&
adapter
->
state_flags
,
sizeof
(
adapter
->
state_flags
)
);
sprintf
(
buffer
,
"System
\\
CurrentControlSet
\\
Control
\\
Video
\\
%s
\\
%04x"
,
gpu
->
guid
,
adapter_index
);
hkey
=
reg_create_ascii_key
(
config_key
,
buffer
,
REG_OPTION_VOLATILE
|
REG_OPTION_CREATE_LINK
,
NULL
);
if
(
!
hkey
)
hkey
=
reg_create_ascii_key
(
config_key
,
buffer
,
REG_OPTION_VOLATILE
|
REG_OPTION_OPEN_LINK
,
NULL
);
len
=
asciiz_to_unicode
(
bufferW
,
adapter
->
path
)
-
sizeof
(
WCHAR
);
set_reg_value
(
hkey
,
symbolic_link_valueW
,
REG_LINK
,
bufferW
,
len
);
NtClose
(
hkey
);
return
TRUE
;
}
...
...
@@ -1309,6 +1311,10 @@ static void add_adapter( const struct gdi_adapter *adapter, void *param )
ctx
->
adapter
.
id
=
ctx
->
adapter_count
;
ctx
->
adapter
.
state_flags
=
adapter
->
state_flags
;
/* Wine specific config key where adapter settings will be held, symlinked with the logically indexed config key */
sprintf
(
ctx
->
adapter
.
path
,
"%s
\\
%s
\\
Video
\\
%s
\\
Adapters
\\
%04x"
,
config_keyA
,
control_keyA
+
strlen
(
"
\\
Registry
\\
Machine"
),
ctx
->
gpu
.
guid
,
ctx
->
gpu
.
adapter_count
);
if
(
!
write_adapter_to_registry
(
&
ctx
->
adapter
,
&
ctx
->
adapter_key
))
WARN
(
"Failed to write adapter to registry
\n
"
);
else
...
...
@@ -1695,9 +1701,7 @@ static BOOL update_display_cache_from_registry(void)
}
list_add_tail
(
&
adapters
,
&
adapter
->
entry
);
size
=
lstrlenW
(
adapter
->
config_key
)
*
sizeof
(
WCHAR
);
if
(
!
(
hkey
=
reg_open_key
(
config_key
,
adapter
->
config_key
,
size
)))
continue
;
if
(
!
(
hkey
=
reg_open_ascii_key
(
config_key
,
adapter
->
path
)))
continue
;
for
(
monitor_id
=
0
;;
monitor_id
++
)
{
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment