From f913bdb3784c6bcdb611e67bc72f710237debde9 Mon Sep 17 00:00:00 2001 From: Eric Kohl Date: Sat, 10 Sep 2005 19:01:44 +0000 Subject: [PATCH] - Implement CM_Enumerate_Enumerators[_Ex]A/W - Fix PNP_EnumerateSubKeys svn path=/trunk/; revision=17785 --- reactos/include/idl/pnp.idl | 2 + reactos/include/wine/cfgmgr32.h | 6 +++ reactos/lib/setupapi/cfgmgr.c | 79 ++++++++++++++++++++++++++++ reactos/lib/setupapi/setupapi.spec | 8 +-- reactos/services/umpnpmgr/umpnpmgr.c | 18 +++---- 5 files changed, 100 insertions(+), 13 deletions(-) diff --git a/reactos/include/idl/pnp.idl b/reactos/include/idl/pnp.idl index 765b81d72cb..f4648d4fa2a 100644 --- a/reactos/include/idl/pnp.idl +++ b/reactos/include/idl/pnp.idl @@ -39,6 +39,8 @@ interface pnp [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, diff --git a/reactos/include/wine/cfgmgr32.h b/reactos/include/wine/cfgmgr32.h index 3e535bfa4dd..857e3fc6940 100644 --- a/reactos/include/wine/cfgmgr32.h +++ b/reactos/include/wine/cfgmgr32.h @@ -137,6 +137,12 @@ CONFIGRET WINAPI CM_Delete_Class_Key_Ex( LPGUID, ULONG, HANDLE ); 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 ); diff --git a/reactos/lib/setupapi/cfgmgr.c b/reactos/lib/setupapi/cfgmgr.c index 26b3fba486c..93ea59d2cce 100644 --- a/reactos/lib/setupapi/cfgmgr.c +++ b/reactos/lib/setupapi/cfgmgr.c @@ -313,6 +313,85 @@ CONFIGRET WINAPI CM_Enumerate_Classes_Ex( } +/*********************************************************************** + * 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.@] */ diff --git a/reactos/lib/setupapi/setupapi.spec b/reactos/lib/setupapi/setupapi.spec index 003968a1c8b..eea0d8fc0b0 100644 --- a/reactos/lib/setupapi/setupapi.spec +++ b/reactos/lib/setupapi/setupapi.spec @@ -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 diff --git a/reactos/services/umpnpmgr/umpnpmgr.c b/reactos/services/umpnpmgr/umpnpmgr.c index 14304a315d0..4f451a4b99c 100644 --- a/reactos/services/umpnpmgr/umpnpmgr.c +++ b/reactos/services/umpnpmgr/umpnpmgr.c @@ -262,15 +262,15 @@ PNP_EnumerateSubKeys(handle_t BindingHandle, 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,14 +289,14 @@ PNP_EnumerateSubKeys(handle_t BindingHandle, NULL); if (dwError != ERROR_SUCCESS) { - ret = CR_FAILURE; + ret = (dwError == ERROR_NO_MORE_ITEMS) ? CR_NO_SUCH_VALUE : CR_FAILURE; + } + else + { + *RequiredLength++; } - DPRINT1("PNP_EnumerateSubKeys() done (returns %lx)\n", ret); - if (ret == CR_SUCCESS) - { - DPRINT1("Sub key: %S\n", Buffer); - } + DPRINT("PNP_EnumerateSubKeys() done (returns %lx)\n", ret); return ret; }