Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
W
wine-cw
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-cw
Commits
b55cc5e4
Commit
b55cc5e4
authored
May 01, 2015
by
Andrew Eikum
Committed by
Alexandre Julliard
May 04, 2015
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
mmdevapi: Always use 64-bit registry keys.
parent
a3487ad3
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
99 additions
and
8 deletions
+99
-8
devenum.c
dlls/mmdevapi/devenum.c
+7
-7
propstore.c
dlls/mmdevapi/tests/propstore.c
+92
-1
No files found.
dlls/mmdevapi/devenum.c
View file @
b55cc5e4
...
...
@@ -143,12 +143,12 @@ static HRESULT MMDevPropStore_OpenPropKey(const GUID *guid, DWORD flow, HKEY *pr
LONG
ret
;
HKEY
key
;
StringFromGUID2
(
guid
,
buffer
,
39
);
if
((
ret
=
RegOpenKeyExW
(
flow
==
eRender
?
key_render
:
key_capture
,
buffer
,
0
,
KEY_READ
|
KEY_WRITE
,
&
key
))
!=
ERROR_SUCCESS
)
if
((
ret
=
RegOpenKeyExW
(
flow
==
eRender
?
key_render
:
key_capture
,
buffer
,
0
,
KEY_READ
|
KEY_WRITE
|
KEY_WOW64_64KEY
,
&
key
))
!=
ERROR_SUCCESS
)
{
WARN
(
"Opening key %s failed with %u
\n
"
,
debugstr_w
(
buffer
),
ret
);
return
E_FAIL
;
}
ret
=
RegOpenKeyExW
(
key
,
reg_properties
,
0
,
KEY_READ
|
KEY_WRITE
,
propkey
);
ret
=
RegOpenKeyExW
(
key
,
reg_properties
,
0
,
KEY_READ
|
KEY_WRITE
|
KEY_WOW64_64KEY
,
propkey
);
RegCloseKey
(
key
);
if
(
ret
!=
ERROR_SUCCESS
)
{
...
...
@@ -345,11 +345,11 @@ static MMDevice *MMDevice_Create(WCHAR *name, GUID *id, EDataFlow flow, DWORD st
else
root
=
key_capture
;
if
(
RegCreateKeyExW
(
root
,
guidstr
,
0
,
NULL
,
0
,
KEY_WRITE
|
KEY_READ
,
NULL
,
&
key
,
NULL
)
==
ERROR_SUCCESS
)
if
(
RegCreateKeyExW
(
root
,
guidstr
,
0
,
NULL
,
0
,
KEY_WRITE
|
KEY_READ
|
KEY_WOW64_64KEY
,
NULL
,
&
key
,
NULL
)
==
ERROR_SUCCESS
)
{
HKEY
keyprop
;
RegSetValueExW
(
key
,
reg_devicestate
,
0
,
REG_DWORD
,
(
const
BYTE
*
)
&
state
,
sizeof
(
DWORD
));
if
(
!
RegCreateKeyExW
(
key
,
reg_properties
,
0
,
NULL
,
0
,
KEY_WRITE
|
KEY_READ
,
NULL
,
&
keyprop
,
NULL
))
if
(
!
RegCreateKeyExW
(
key
,
reg_properties
,
0
,
NULL
,
0
,
KEY_WRITE
|
KEY_READ
|
KEY_WOW64_64KEY
,
NULL
,
&
keyprop
,
NULL
))
{
PROPVARIANT
pv
;
...
...
@@ -406,11 +406,11 @@ static HRESULT load_devices_from_reg(void)
LONG
ret
;
DWORD
curflow
;
ret
=
RegCreateKeyExW
(
HKEY_LOCAL_MACHINE
,
software_mmdevapi
,
0
,
NULL
,
0
,
KEY_WRITE
|
KEY_READ
,
NULL
,
&
root
,
NULL
);
ret
=
RegCreateKeyExW
(
HKEY_LOCAL_MACHINE
,
software_mmdevapi
,
0
,
NULL
,
0
,
KEY_WRITE
|
KEY_READ
|
KEY_WOW64_64KEY
,
NULL
,
&
root
,
NULL
);
if
(
ret
==
ERROR_SUCCESS
)
ret
=
RegCreateKeyExW
(
root
,
reg_capture
,
0
,
NULL
,
0
,
KEY_READ
|
KEY_WRITE
,
NULL
,
&
key_capture
,
NULL
);
ret
=
RegCreateKeyExW
(
root
,
reg_capture
,
0
,
NULL
,
0
,
KEY_READ
|
KEY_WRITE
|
KEY_WOW64_64KEY
,
NULL
,
&
key_capture
,
NULL
);
if
(
ret
==
ERROR_SUCCESS
)
ret
=
RegCreateKeyExW
(
root
,
reg_render
,
0
,
NULL
,
0
,
KEY_READ
|
KEY_WRITE
,
NULL
,
&
key_render
,
NULL
);
ret
=
RegCreateKeyExW
(
root
,
reg_render
,
0
,
NULL
,
0
,
KEY_READ
|
KEY_WRITE
|
KEY_WOW64_64KEY
,
NULL
,
&
key_render
,
NULL
);
RegCloseKey
(
root
);
cur
=
key_capture
;
curflow
=
eCapture
;
...
...
dlls/mmdevapi/tests/propstore.c
View file @
b55cc5e4
...
...
@@ -30,6 +30,19 @@
#include "mmdeviceapi.h"
#include "devpkey.h"
static
BOOL
(
WINAPI
*
pIsWow64Process
)(
HANDLE
,
BOOL
*
);
static
const
WCHAR
software_renderW
[]
=
{
'S'
,
'o'
,
'f'
,
't'
,
'w'
,
'a'
,
'r'
,
'e'
,
'\\'
,
'M'
,
'i'
,
'c'
,
'r'
,
'o'
,
's'
,
'o'
,
'f'
,
't'
,
'\\'
,
'W'
,
'i'
,
'n'
,
'd'
,
'o'
,
'w'
,
's'
,
'\\'
,
'C'
,
'u'
,
'r'
,
'r'
,
'e'
,
'n'
,
't'
,
'V'
,
'e'
,
'r'
,
's'
,
'i'
,
'o'
,
'n'
,
'\\'
,
'M'
,
'M'
,
'D'
,
'e'
,
'v'
,
'i'
,
'c'
,
'e'
,
's'
,
'\\'
,
'A'
,
'u'
,
'd'
,
'i'
,
'o'
,
'\\'
,
'R'
,
'e'
,
'n'
,
'd'
,
'e'
,
'r'
,
0
};
static
const
WCHAR
propertiesW
[]
=
{
'P'
,
'r'
,
'o'
,
'p'
,
'e'
,
'r'
,
't'
,
'i'
,
'e'
,
's'
,
0
};
static
void
test_propertystore
(
IPropertyStore
*
store
)
{
HRESULT
hr
;
...
...
@@ -109,12 +122,86 @@ static void test_getat(IPropertyStore *store)
ok
(
found_desc
==
TRUE
,
"DEVPKEY_Device_DeviceDesc not found
\n
"
);
}
static
void
test_setvalue_on_wow64
(
IPropertyStore
*
store
)
{
PROPVARIANT
pv
;
HRESULT
hr
;
LONG
ret
;
WCHAR
*
guidW
;
HKEY
root
,
props
,
devkey
;
DWORD
type
,
regval
,
size
;
static
const
PROPERTYKEY
PKEY_Bogus
=
{
{
0x1da5d803
,
0xd492
,
0x4edd
,
{
0x8c
,
0x23
,
0xe0
,
0xc0
,
0xff
,
0xee
,
0x7f
,
0x00
}},
0x7f
};
static
const
WCHAR
bogusW
[]
=
{
'{'
,
'1'
,
'D'
,
'A'
,
'5'
,
'D'
,
'8'
,
'0'
,
'3'
,
'-'
,
'D'
,
'4'
,
'9'
,
'2'
,
'-'
,
'4'
,
'E'
,
'D'
,
'D'
,
'-'
,
'8'
,
'C'
,
'2'
,
'3'
,
'-'
,
'E'
,
'0'
,
'C'
,
'0'
,
'F'
,
'F'
,
'E'
,
'E'
,
'7'
,
'F'
,
'0'
,
'0'
,
'}'
,
','
,
'1'
,
'2'
,
'7'
,
0
};
PropVariantInit
(
&
pv
);
pv
.
vt
=
VT_EMPTY
;
hr
=
IPropertyStore_GetValue
(
store
,
&
PKEY_AudioEndpoint_GUID
,
&
pv
);
ok
(
hr
==
S_OK
,
"Failed to get Endpoint GUID: %08x
\n
"
,
hr
);
guidW
=
pv
.
u
.
pwszVal
;
pv
.
vt
=
VT_UI4
;
pv
.
u
.
ulVal
=
0xAB
;
hr
=
IPropertyStore_SetValue
(
store
,
&
PKEY_Bogus
,
&
pv
);
ok
(
hr
==
S_OK
||
hr
==
E_ACCESSDENIED
,
"SetValue failed: %08x
\n
"
,
hr
);
if
(
hr
!=
S_OK
)
{
win_skip
(
"Missing permission to write to registry
\n
"
);
return
;
}
pv
.
u
.
ulVal
=
0x00
;
hr
=
IPropertyStore_GetValue
(
store
,
&
PKEY_Bogus
,
&
pv
);
ok
(
hr
==
S_OK
,
"GetValue failed: %08x
\n
"
,
hr
);
ok
(
pv
.
u
.
ulVal
==
0xAB
,
"Got wrong value: 0x%x
\n
"
,
pv
.
u
.
ulVal
);
/* should find the key in 64-bit view */
ret
=
RegOpenKeyExW
(
HKEY_LOCAL_MACHINE
,
software_renderW
,
0
,
KEY_READ
|
KEY_WOW64_64KEY
,
&
root
);
ok
(
ret
==
ERROR_SUCCESS
,
"Couldn't open mmdevices Render key: %u
\n
"
,
ret
);
ret
=
RegOpenKeyExW
(
root
,
guidW
,
0
,
KEY_READ
|
KEY_WOW64_64KEY
,
&
devkey
);
ok
(
ret
==
ERROR_SUCCESS
,
"Couldn't open mmdevice guid key: %u
\n
"
,
ret
);
ret
=
RegOpenKeyExW
(
devkey
,
propertiesW
,
0
,
KEY_READ
|
KEY_WOW64_64KEY
,
&
props
);
ok
(
ret
==
ERROR_SUCCESS
,
"Couldn't open mmdevice property key: %u
\n
"
,
ret
);
/* Note: the registry key exists even without calling IPropStore::Commit */
size
=
sizeof
(
regval
);
ret
=
RegGetValueW
(
props
,
NULL
,
bogusW
,
RRF_RT_DWORD
,
&
type
,
&
regval
,
&
size
);
ok
(
ret
==
ERROR_SUCCESS
,
"Couldn't get bogus propertykey value: %u
\n
"
,
ret
);
ok
(
type
==
REG_DWORD
,
"Got wrong value type: %u
\n
"
,
type
);
ok
(
regval
==
0xAB
,
"Got wrong value: 0x%x
\n
"
,
regval
);
RegCloseKey
(
props
);
RegCloseKey
(
devkey
);
RegCloseKey
(
root
);
CoTaskMemFree
(
guidW
);
/* should NOT find the key in 32-bit view */
ret
=
RegOpenKeyExW
(
HKEY_LOCAL_MACHINE
,
software_renderW
,
0
,
KEY_READ
,
&
root
);
ok
(
ret
==
ERROR_FILE_NOT_FOUND
,
"Wrong error when opening mmdevices Render key: %u
\n
"
,
ret
);
}
START_TEST
(
propstore
)
{
HRESULT
hr
;
IMMDeviceEnumerator
*
mme
=
NULL
;
IMMDevice
*
dev
=
NULL
;
IPropertyStore
*
store
;
BOOL
is_wow64
=
FALSE
;
HMODULE
hk32
=
GetModuleHandleA
(
"kernel32.dll"
);
pIsWow64Process
=
(
void
*
)
GetProcAddress
(
hk32
,
"IsWow64Process"
);
if
(
pIsWow64Process
)
pIsWow64Process
(
GetCurrentProcess
(),
&
is_wow64
);
CoInitializeEx
(
NULL
,
COINIT_MULTITHREADED
);
hr
=
CoCreateInstance
(
&
CLSID_MMDeviceEnumerator
,
NULL
,
CLSCTX_INPROC_SERVER
,
&
IID_IMMDeviceEnumerator
,
(
void
**
)
&
mme
);
...
...
@@ -149,13 +236,17 @@ START_TEST(propstore)
ok
(
hr
==
E_POINTER
,
"Wrong hr returned: %08x
\n
"
,
hr
);
store
=
NULL
;
hr
=
IMMDevice_OpenPropertyStore
(
dev
,
STGM_READ
,
&
store
);
hr
=
IMMDevice_OpenPropertyStore
(
dev
,
STGM_READWRITE
,
&
store
);
if
(
hr
==
E_ACCESSDENIED
)
hr
=
IMMDevice_OpenPropertyStore
(
dev
,
STGM_READ
,
&
store
);
ok
(
hr
==
S_OK
,
"Opening valid store returned %08x
\n
"
,
hr
);
if
(
store
)
{
test_propertystore
(
store
);
test_deviceinterface
(
store
);
test_getat
(
store
);
if
(
is_wow64
)
test_setvalue_on_wow64
(
store
);
IPropertyStore_Release
(
store
);
}
IMMDevice_Release
(
dev
);
...
...
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