- CFGMGR32.DLL: Forward implemented functions to SETUPAPI.DLL.

- SETUPAPI.DLL: Use PNP_EnumerateSubKeys to implement CM_Enumerate_Classes_Ex.

svn path=/trunk/; revision=17801
This commit is contained in:
Eric Kohl 2005-09-11 14:38:57 +00:00
parent 61420d12f3
commit 9e486c444b
2 changed files with 46 additions and 81 deletions

View file

@ -41,8 +41,8 @@ CM_Connect_MachineW@8=SETUPAPI.CM_Connect_MachineW
;CM_Create_DevNode_ExA
;CM_Create_DevNode_ExW
;CM_Create_Range_List
;CM_Delete_Class_Key
;CM_Delete_Class_Key_Ex
CM_Delete_Class_Key@8=SETUPAPI.CM_Delete_Class_Key
CM_Delete_Class_Key_Ex@12=SETUPAPI.CM_Delete_Class_Key_Ex
;CM_Delete_DevNode_Key
;CM_Delete_DevNode_Key_Ex
;CM_Delete_Range
@ -56,10 +56,10 @@ CM_Disconnect_Machine@4=SETUPAPI.CM_Disconnect_Machine
;CM_Enable_DevNode_Ex
CM_Enumerate_Classes@12=SETUPAPI.CM_Enumerate_Classes
CM_Enumerate_Classes_Ex@16=SETUPAPI.CM_Enumerate_Classes_Ex
;CM_Enumerate_EnumeratorsA
;CM_Enumerate_EnumeratorsW
;CM_Enumerate_Enumerators_ExA
;CM_Enumerate_Enumerators_ExW
CM_Enumerate_EnumeratorsA@16=SETUPAPI.CM_Enumerate_EnumeratorsA
CM_Enumerate_EnumeratorsW@16=SETUPAPI.CM_Enumerate_EnumeratorsW
CM_Enumerate_Enumerators_ExA@20=SETUPAPI.CM_Enumerate_Enumerators_ExA
CM_Enumerate_Enumerators_ExW@20=SETUPAPI.CM_Enumerate_Enumerators_ExW
;CM_Find_Range
;CM_First_Range
;CM_Free_Log_Conf
@ -71,14 +71,14 @@ CM_Enumerate_Classes_Ex@16=SETUPAPI.CM_Enumerate_Classes_Ex
;CM_Free_Res_Des_Handle
CM_Get_Child@12=SETUPAPI.CM_Get_Child
CM_Get_Child_Ex@16=SETUPAPI.CM_Get_ChildEx
;CM_Get_Class_Key_NameA
;CM_Get_Class_Key_NameW
;CM_Get_Class_Key_Name_ExA
;CM_Get_Class_Key_Name_ExW
;CM_Get_Class_NameA
;CM_Get_Class_NameW
;CM_Get_Class_Name_ExA
;CM_Get_Class_Name_ExW
CM_Get_Class_Key_NameA@16=SETUPAPI.CM_Get_Class_Key_NameA
CM_Get_Class_Key_NameW@16=SETUPAPI.CM_Get_Class_Key_NameW
CM_Get_Class_Key_Name_ExA@20=SETUPAPI.CM_Get_Class_Key_Name_ExA
CM_Get_Class_Key_Name_ExW@20=SETUPAPI.CM_Get_Class_Key_Name_ExW
CM_Get_Class_NameA@16=SETUPAPI.CM_Get_Class_NameA
CM_Get_Class_NameW@16=SETUPAPI.CM_Get_Class_NameW
CM_Get_Class_Name_ExA@20=SETUPAPI.CM_Get_Class_Name_ExA
CM_Get_Class_Name_ExW@20=SETUPAPI.CM_Get_Class_Name_ExW
CM_Get_Depth@12=SETUPAPI.CM_Get_Depth
CM_Get_Depth_Ex@16=SETUPAPI.CM_Get_Depth_Ex
CM_Get_DevNode_Registry_PropertyA@24=SETUPAPI.CM_Get_DevNode_Registry_PropertyA
@ -186,12 +186,12 @@ CM_Open_Class_Key_ExW@28=SETUPAPI.CM_Open_Class_Key_ExW
;CM_Reset_Children_Marks_Ex
;CM_Run_Detection
;CM_Run_Detection_Ex
;CM_Set_DevNode_Problem
;CM_Set_DevNode_Problem_Ex
;CM_Set_DevNode_Registry_PropertyA
;CM_Set_DevNode_Registry_PropertyW
;CM_Set_DevNode_Registry_Property_ExA
;CM_Set_DevNode_Registry_Property_ExW
CM_Set_DevNode_Problem@12=SETUPAPI.CM_Set_DevNode_Problem
CM_Set_DevNode_Problem_Ex@16=SETUPAPI.CM_Set_DevNode_Problem_Ex
CM_Set_DevNode_Registry_PropertyA@20=SETUPAPI.CM_Set_DevNode_Registry_PropertyA
CM_Set_DevNode_Registry_PropertyW@20=SETUPAPI.CM_Set_DevNode_Registry_PropertyW
CM_Set_DevNode_Registry_Property_ExA@24=SETUPAPI.CM_Set_DevNode_Registry_Property_ExA
CM_Set_DevNode_Registry_Property_ExW@24=SETUPAPI.CM_Set_DevNode_Registry_Property_ExW
;CM_Set_HW_Prof
;CM_Set_HW_Prof_Ex
;CM_Set_HW_Prof_FlagsA

View file

@ -226,46 +226,16 @@ CONFIGRET WINAPI CM_Enumerate_Classes(
}
static CONFIGRET GetCmCodeFromErrorCode(DWORD ErrorCode)
{
switch (ErrorCode)
{
case ERROR_SUCCESS:
return CR_SUCCESS;
case ERROR_ACCESS_DENIED:
return CR_ACCESS_DENIED;
case ERROR_INSUFFICIENT_BUFFER:
return CR_BUFFER_SMALL;
case ERROR_INVALID_DATA:
return CR_INVALID_DATA;
case ERROR_INVALID_PARAMETER:
return CR_INVALID_DATA;
case ERROR_NO_MORE_ITEMS:
return CR_NO_SUCH_VALUE;
case ERROR_NO_SYSTEM_RESOURCES:
return CR_OUT_OF_MEMORY;
default:
return CR_FAILURE;
}
}
/***********************************************************************
* CM_Enumerate_Classes_Ex [SETUPAPI.@]
*/
CONFIGRET WINAPI CM_Enumerate_Classes_Ex(
ULONG ulClassIndex, LPGUID ClassGuid, ULONG ulFlags, HMACHINE hMachine)
{
HKEY hRelativeKey, hKey;
DWORD rc;
WCHAR Buffer[MAX_GUID_STRING_LEN];
WCHAR szBuffer[MAX_GUID_STRING_LEN];
RPC_BINDING_HANDLE BindingHandle = NULL;
CONFIGRET ret = CR_SUCCESS;
ULONG ulLength = MAX_GUID_STRING_LEN;
TRACE("%lx %p %lx %p\n", ulClassIndex, ClassGuid, ulFlags, hMachine);
@ -277,39 +247,34 @@ CONFIGRET WINAPI CM_Enumerate_Classes_Ex(
if (hMachine != NULL)
{
FIXME("hMachine argument ignored\n");
hRelativeKey = HKEY_LOCAL_MACHINE; /* FIXME: use here a field in hMachine */
BindingHandle = ((PMACHINE_INFO)hMachine)->BindingHandle;
if (BindingHandle == NULL)
return CR_FAILURE;
}
else
hRelativeKey = HKEY_LOCAL_MACHINE;
rc = RegOpenKeyExW(
hRelativeKey,
ControlClass,
0, /* options */
KEY_ENUMERATE_SUB_KEYS,
&hKey);
if (rc != ERROR_SUCCESS)
return GetCmCodeFromErrorCode(rc);
rc = RegEnumKeyW(
hKey,
ulClassIndex,
Buffer,
sizeof(Buffer) / sizeof(WCHAR));
RegCloseKey(hKey);
if (rc == ERROR_SUCCESS)
{
/* Remove the {} */
Buffer[MAX_GUID_STRING_LEN - 2] = UNICODE_NULL;
/* Convert the buffer to a GUID */
if (UuidFromStringW(&Buffer[1], ClassGuid) != RPC_S_OK)
if (!PnpGetLocalHandles(&BindingHandle, NULL))
return CR_FAILURE;
}
return GetCmCodeFromErrorCode(rc);
ret = PNP_EnumerateSubKeys(BindingHandle,
PNP_BRANCH_CLASS,
ulClassIndex,
szBuffer,
MAX_GUID_STRING_LEN,
&ulLength,
ulFlags);
if (ret == CR_SUCCESS)
{
/* Remove the {} */
szBuffer[MAX_GUID_STRING_LEN - 2] = UNICODE_NULL;
/* Convert the buffer to a GUID */
if (UuidFromStringW(&szBuffer[1], ClassGuid) != RPC_S_OK)
return CR_FAILURE;
}
return ret;
}