https://git.reactos.org/?p=reactos.git;a=commitdiff;h=06f9e1220f87a5ec1a662…
commit 06f9e1220f87a5ec1a66230609c01533129846c1
Author: Eric Kohl <eric.kohl(a)reactos.org>
AuthorDate: Sat Nov 4 20:00:54 2017 +0100
[SETUPAPI] CM_Open_DevNode_Key_Ex: Add support for remote registry access and the
Disposition parameter.
---
dll/win32/setupapi/cfgmgr.c | 58 +++++++++++++++++++++++++++++++++++----------
1 file changed, 46 insertions(+), 12 deletions(-)
diff --git a/dll/win32/setupapi/cfgmgr.c b/dll/win32/setupapi/cfgmgr.c
index b45e6dec7a..362d34e14e 100644
--- a/dll/win32/setupapi/cfgmgr.c
+++ b/dll/win32/setupapi/cfgmgr.c
@@ -5002,9 +5002,10 @@ CM_Open_Class_Key_ExW(
}
else
{
- if (RegConnectRegistryW(((PMACHINE_INFO)hMachine)->szMachineName,
- HKEY_LOCAL_MACHINE, &hKey))
- return CR_REGISTRY_ERROR;
+ if (RegConnectRegistryW(((PMACHINE_INFO)hMachine)->szMachineName,
+ HKEY_LOCAL_MACHINE,
+ &hKey))
+ return CR_REGISTRY_ERROR;
}
if (ulFlags & CM_OPEN_CLASS_KEY_INTERFACE)
@@ -5097,6 +5098,8 @@ CM_Open_DevNode_Key_Ex(
HSTRING_TABLE StringTable = NULL;
LPWSTR pszDevInst, pszKeyPath = NULL, pszInstancePath = NULL;
LONG lError;
+ DWORD dwDisposition;
+ HKEY hRootKey = NULL;
CONFIGRET ret = CR_CALL_NOT_IMPLEMENTED;
FIXME("CM_Open_DevNode_Key_Ex(%lx %lx %lu %lx %p %lx %lx)\n",
@@ -5138,14 +5141,14 @@ CM_Open_DevNode_Key_Ex(
TRACE("pszDevInst: %S\n", pszDevInst);
- pszKeyPath = MyMalloc(1024);
+ pszKeyPath = MyMalloc(512 * sizeof(WCHAR));
if (pszKeyPath == NULL)
{
ret = CR_OUT_OF_MEMORY;
goto done;
}
- pszInstancePath = MyMalloc(1024);
+ pszInstancePath = MyMalloc(512 * sizeof(WCHAR));
if (pszInstancePath == NULL)
{
ret = CR_OUT_OF_MEMORY;
@@ -5169,14 +5172,42 @@ CM_Open_DevNode_Key_Ex(
TRACE("pszKeyPath: %S\n", pszKeyPath);
- // FIXME: Disposition
- // FIXME: hMachine
+ if (hMachine == NULL)
+ {
+ hRootKey = HKEY_LOCAL_MACHINE;
+ }
+ else
+ {
+ if (RegConnectRegistryW(((PMACHINE_INFO)hMachine)->szMachineName,
+ HKEY_LOCAL_MACHINE,
+ &hRootKey))
+ {
+ ret = CR_REGISTRY_ERROR;
+ goto done;
+ }
+ }
+
+ if (Disposition == RegDisposition_OpenAlways)
+ {
+ lError = RegCreateKeyExW(hRootKey,
+ pszKeyPath,
+ 0,
+ NULL,
+ 0,
+ samDesired,
+ NULL,
+ phkDevice,
+ &dwDisposition);
+ }
+ else
+ {
+ lError = RegOpenKeyExW(hRootKey,
+ pszKeyPath,
+ 0,
+ samDesired,
+ phkDevice);
+ }
- lError = RegOpenKeyExW(HKEY_LOCAL_MACHINE,
- pszKeyPath,
- 0,
- samDesired,
- phkDevice);
if (lError != ERROR_SUCCESS)
{
*phkDevice = NULL;
@@ -5184,6 +5215,9 @@ CM_Open_DevNode_Key_Ex(
}
done:
+ if ((hRootKey != NULL) && (hRootKey != HKEY_LOCAL_MACHINE))
+ RegCloseKey(hRootKey);
+
if (pszInstancePath != NULL)
MyFree(pszInstancePath);