- Implement CM_Enumerate_Enumerators[_Ex]A/W
- Fix PNP_EnumerateSubKeys
Modified: trunk/reactos/include/idl/pnp.idl
Modified: trunk/reactos/include/wine/cfgmgr32.h
Modified: trunk/reactos/lib/setupapi/cfgmgr.c
Modified: trunk/reactos/lib/setupapi/setupapi.spec
Modified: trunk/reactos/services/umpnpmgr/umpnpmgr.c

Modified: trunk/reactos/include/idl/pnp.idl
--- trunk/reactos/include/idl/pnp.idl	2005-09-10 18:45:34 UTC (rev 17784)
+++ trunk/reactos/include/idl/pnp.idl	2005-09-10 19:01:44 UTC (rev 17785)
@@ -39,6 +39,8 @@
                                          [in] DWORD Length,
                                          [in] DWORD Flags);
 
+  cpp_quote("#define PNP_BRANCH_ENUM  1")
+  cpp_quote("#define PNP_BRANCH_CLASS 2")
   CONFIGRET PNP_EnumerateSubKeys(handle_t BindingHandle,
                                  [in] unsigned long Branch,
                                  [in] unsigned long Index,

Modified: trunk/reactos/include/wine/cfgmgr32.h
--- trunk/reactos/include/wine/cfgmgr32.h	2005-09-10 18:45:34 UTC (rev 17784)
+++ trunk/reactos/include/wine/cfgmgr32.h	2005-09-10 19:01:44 UTC (rev 17785)
@@ -137,6 +137,12 @@
 CONFIGRET WINAPI CM_Disconnect_Machine( HMACHINE );
 CONFIGRET WINAPI CM_Enumerate_Classes( ULONG, LPGUID, ULONG );
 CONFIGRET WINAPI CM_Enumerate_Classes_Ex( ULONG, LPGUID, ULONG, HMACHINE );
+CONFIGRET WINAPI CM_Enumerate_EnumeratorsA( ULONG, PCHAR, PULONG, ULONG );
+CONFIGRET WINAPI CM_Enumerate_EnumeratorsW( ULONG, PWCHAR, PULONG, ULONG );
+#define     CM_Enumerate_Enumerators WINELIB_NAME_AW(CM_Enumerate_Enumerators)
+CONFIGRET WINAPI CM_Enumerate_Enumerators_ExA( ULONG, PCHAR, PULONG, ULONG, HMACHINE );
+CONFIGRET WINAPI CM_Enumerate_Enumerators_ExW( ULONG, PWCHAR, PULONG, ULONG, HMACHINE );
+#define     CM_Enumerate_Enumerators_Ex WINELIB_NAME_AW(CM_Enumerate_Enumerators_Ex)
 CONFIGRET WINAPI CM_Get_Child( PDEVINST, DEVINST, ULONG );
 CONFIGRET WINAPI CM_Get_Child_Ex( PDEVINST, DEVINST, ULONG, HMACHINE );
 CONFIGRET WINAPI CM_Get_Class_Key_NameA( LPGUID, LPSTR, PULONG, ULONG );

Modified: trunk/reactos/lib/setupapi/cfgmgr.c
--- trunk/reactos/lib/setupapi/cfgmgr.c	2005-09-10 18:45:34 UTC (rev 17784)
+++ trunk/reactos/lib/setupapi/cfgmgr.c	2005-09-10 19:01:44 UTC (rev 17785)
@@ -314,6 +314,85 @@
 
 
 /***********************************************************************
+ * CM_Enumerate_EnumeratorsA [SETUPAPI.@]
+ */
+CONFIGRET WINAPI CM_Enumerate_EnumeratorsA(
+    ULONG ulEnumIndex, PCHAR Buffer, PULONG pulLength, ULONG ulFlags)
+{
+    TRACE("%lu %p %p %lx\n", ulEnumIndex, Buffer, pulLength, ulFlags);
+    return CM_Enumerate_Enumerators_ExA(ulEnumIndex, Buffer, pulLength,
+                                        ulFlags, NULL);
+}
+
+
+/***********************************************************************
+ * CM_Enumerate_EnumeratorsW [SETUPAPI.@]
+ */
+CONFIGRET WINAPI CM_Enumerate_EnumeratorsW(
+    ULONG ulEnumIndex, PWCHAR Buffer, PULONG pulLength, ULONG ulFlags)
+{
+    TRACE("%lu %p %p %lx\n", ulEnumIndex, Buffer, pulLength, ulFlags);
+    return CM_Enumerate_Enumerators_ExW(ulEnumIndex, Buffer, pulLength,
+                                        ulFlags, NULL);
+}
+
+
+/***********************************************************************
+ * CM_Enumerate_Enumerators_ExA [SETUPAPI.@]
+ */
+CONFIGRET WINAPI CM_Enumerate_Enumerators_ExA(
+    ULONG ulEnumIndex, PCHAR Buffer, PULONG pulLength, ULONG ulFlags,
+    HMACHINE hMachine)
+{
+    FIXME("%lu %p %p %lx %lx\n", ulEnumIndex, Buffer, pulLength, ulFlags,
+          hMachine);
+    return CR_CALL_NOT_IMPLEMENTED;
+}
+
+
+/***********************************************************************
+ * CM_Enumerate_Enumerators_ExW [SETUPAPI.@]
+ */
+CONFIGRET WINAPI CM_Enumerate_Enumerators_ExW(
+    ULONG ulEnumIndex, PWCHAR Buffer, PULONG pulLength, ULONG ulFlags,
+    HMACHINE hMachine)
+{
+    RPC_BINDING_HANDLE BindingHandle = NULL;
+
+    FIXME("%lu %p %p %lx %lx\n", ulEnumIndex, Buffer, pulLength, ulFlags,
+          hMachine);
+
+    if (Buffer == NULL || pulLength == NULL)
+        return CR_INVALID_POINTER;
+
+    if (ulFlags != 0)
+        return CR_INVALID_FLAG;
+
+    Buffer[0] = (WCHAR)0;
+
+    if (hMachine != NULL)
+    {
+        BindingHandle = ((PMACHINE_INFO)hMachine)->BindingHandle;
+        if (BindingHandle == NULL)
+            return CR_FAILURE;
+    }
+    else
+    {
+        if (!PnpGetLocalHandles(&BindingHandle, NULL))
+            return CR_FAILURE;
+    }
+
+    return PNP_EnumerateSubKeys(BindingHandle,
+                                PNP_BRANCH_ENUM,
+                                ulEnumIndex,
+                                Buffer,
+                                *pulLength,
+                                pulLength,
+                                ulFlags);
+}
+
+
+/***********************************************************************
  * CM_Get_Child [SETUPAPI.@]
  */
 CONFIGRET WINAPI CM_Get_Child(

Modified: trunk/reactos/lib/setupapi/setupapi.spec
--- trunk/reactos/lib/setupapi/setupapi.spec	2005-09-10 18:45:34 UTC (rev 17784)
+++ trunk/reactos/lib/setupapi/setupapi.spec	2005-09-10 19:01:44 UTC (rev 17785)
@@ -40,10 +40,10 @@
 @ stub CM_Enable_DevNode_Ex
 @ stdcall CM_Enumerate_Classes(long ptr long)
 @ stdcall CM_Enumerate_Classes_Ex(long ptr long ptr)
-@ stub CM_Enumerate_EnumeratorsA
-@ stub CM_Enumerate_EnumeratorsW
-@ stub CM_Enumerate_Enumerators_ExA
-@ stub CM_Enumerate_Enumerators_ExW
+@ stdcall CM_Enumerate_EnumeratorsA(long str ptr long)
+@ stdcall CM_Enumerate_EnumeratorsW(long wstr ptr long)
+@ stdcall CM_Enumerate_Enumerators_ExA(long str ptr long long)
+@ stdcall CM_Enumerate_Enumerators_ExW(long wstr ptr long long)
 @ stub CM_Find_Range
 @ stub CM_First_Range
 @ stub CM_Free_Log_Conf

Modified: trunk/reactos/services/umpnpmgr/umpnpmgr.c
--- trunk/reactos/services/umpnpmgr/umpnpmgr.c	2005-09-10 18:45:34 UTC (rev 17784)
+++ trunk/reactos/services/umpnpmgr/umpnpmgr.c	2005-09-10 19:01:44 UTC (rev 17785)
@@ -262,15 +262,15 @@
     HKEY hKey;
     DWORD dwError;
 
-    DPRINT1("PNP_EnumerateSubKeys() called\n");
+    DPRINT("PNP_EnumerateSubKeys() called\n");
 
     switch (Branch)
     {
-        case 1:
+        case PNP_BRANCH_ENUM:
             hKey = hEnumKey;
             break;
 
-        case 2:
+        case PNP_BRANCH_CLASS:
             hKey = hClassKey;
             break;
 
@@ -289,15 +289,15 @@
                             NULL);
     if (dwError != ERROR_SUCCESS)
     {
-        ret = CR_FAILURE;
+        ret = (dwError == ERROR_NO_MORE_ITEMS) ? CR_NO_SUCH_VALUE : CR_FAILURE;
     }
-
-    DPRINT1("PNP_EnumerateSubKeys() done (returns %lx)\n", ret);
-    if (ret == CR_SUCCESS)
+    else
     {
-        DPRINT1("Sub key: %S\n", Buffer);
+        *RequiredLength++;
     }
 
+    DPRINT("PNP_EnumerateSubKeys() done (returns %lx)\n", ret);
+
     return ret;
 }