From 894ad4f17d119d312d4ae816cb41db12369389e8 Mon Sep 17 00:00:00 2001 From: Eric Kohl Date: Sat, 20 Jul 2024 22:20:36 +0200 Subject: [PATCH] [SETUPAPI] Implement CM_Free_Res_Des_Handle() and improve CM_Get_Next_Re_Des_Ex() --- dll/win32/setupapi/cfgmgr.c | 99 +++++++++++++++++++++++++++++++------ 1 file changed, 83 insertions(+), 16 deletions(-) diff --git a/dll/win32/setupapi/cfgmgr.c b/dll/win32/setupapi/cfgmgr.c index a3f524714ce31..13e6841c8c62c 100644 --- a/dll/win32/setupapi/cfgmgr.c +++ b/dll/win32/setupapi/cfgmgr.c @@ -70,6 +70,17 @@ typedef struct _LOG_CONF_INFO #define LOG_CONF_MAGIC 0x464E434C /* "LCNF" */ +typedef struct _RES_DES_INFO +{ + ULONG ulMagic; + DEVINST dnDevInst; + ULONG ulLogConfType; + ULONG ulLogConfTag; + ULONG ulResDesType; + ULONG ulResDesTag; +} RES_DES_INFO, *PRES_DES_INFO; + +#define RES_DES_MAGIC 0x53445352 /* "RSDS" */ typedef struct _NOTIFY_DATA { @@ -434,6 +445,30 @@ IsValidLogConf( } +BOOL +IsValidResDes( + _In_opt_ PRES_DES_INFO pResDesInfo) +{ + BOOL bValid = TRUE; + + if (pResDesInfo == NULL) + return FALSE; + + _SEH2_TRY + { + if (pResDesInfo->ulMagic != RES_DES_MAGIC) + bValid = FALSE; + } + _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) + { + bValid = FALSE; + } + _SEH2_END; + + return bValid; +} + + BOOL IsValidConflictData( _In_opt_ PCONFLICT_DATA pConflictData) @@ -2490,9 +2525,17 @@ WINAPI CM_Free_Res_Des_Handle( _In_ RES_DES rdResDes) { + PRES_DES_INFO pResDesInfo; + FIXME("CM_Free_Res_Des_Handle(%p)\n", rdResDes); - return CR_CALL_NOT_IMPLEMENTED; + pResDesInfo = (PRES_DES_INFO)rdResDes; + if (!IsValidResDes(pResDesInfo)) + return CR_INVALID_RES_DES; + + HeapFree(GetProcessHeap(), 0, pResDesInfo); + + return CR_SUCCESS; } @@ -5175,7 +5218,7 @@ CM_Get_Next_Log_Conf_Ex( /*********************************************************************** - * CM_Get_Next_Re_Des [SETUPAPI.@] + * CM_Get_Next_Res_Des [SETUPAPI.@] */ CONFIGRET WINAPI @@ -5209,8 +5252,9 @@ CM_Get_Next_Res_Des_Ex( { RPC_BINDING_HANDLE BindingHandle = NULL; HSTRING_TABLE StringTable = NULL; - ULONG ulInTag, ulOutTag = 0; - ULONG ulInType, ulOutType = 0; + PRES_DES_INFO pNewResDesInfo = NULL; + ULONG ulLogConfTag, ulLogConfType, ulResDesTag; + ULONG ulNextResDesType = 0, ulNextResDesTag = 0; LPWSTR lpDevInst; DEVINST dnDevInst; CONFIGRET ret; @@ -5225,23 +5269,29 @@ CM_Get_Next_Res_Des_Ex( { FIXME("LogConf found!\n"); dnDevInst = ((PLOG_CONF_INFO)rdResDes)->dnDevInst; - ulInTag = ((PLOG_CONF_INFO)rdResDes)->ulTag; - ulInType = ((PLOG_CONF_INFO)rdResDes)->ulType; + ulLogConfTag = ((PLOG_CONF_INFO)rdResDes)->ulTag; + ulLogConfType = ((PLOG_CONF_INFO)rdResDes)->ulType; + ulResDesTag = (ULONG)-1; } -#if 0 else if (IsValidResDes((PRES_DES_INFO)rdResDes)) { FIXME("ResDes found!\n"); dnDevInst = ((PRES_DES_INFO)rdResDes)->dnDevInst; - ulInTag = ((PRES_DES_INFO)rdResDes)->ulTag; - ulInType = ((PRES_DES_INFO)rdResDes)->ulType; + ulLogConfTag = ((PRES_DES_INFO)rdResDes)->ulLogConfTag; + ulLogConfType = ((PRES_DES_INFO)rdResDes)->ulLogConfType; + ulResDesTag = ((PRES_DES_INFO)rdResDes)->ulResDesTag; } -#endif else { return CR_INVALID_RES_DES; } + if ((ForResource == ResType_All) && (pResourceID == NULL)) + return CR_INVALID_POINTER; + + if (ulFlags != 0) + return CR_INVALID_FLAG; + if (hMachine != NULL) { BindingHandle = ((PMACHINE_INFO)hMachine)->BindingHandle; @@ -5266,12 +5316,12 @@ CM_Get_Next_Res_Des_Ex( { ret = PNP_GetNextResDes(BindingHandle, lpDevInst, - ulInTag, - ulInType, + ulLogConfTag, + ulLogConfType, ForResource, - 0, /* unsigned long ulResourceTag, */ - &ulOutTag, - &ulOutType, + ulResDesTag, + &ulNextResDesTag, + &ulNextResDesType, 0); } RpcExcept(EXCEPTION_EXECUTE_HANDLER) @@ -5283,7 +5333,24 @@ CM_Get_Next_Res_Des_Ex( if (ret != CR_SUCCESS) return ret; - /* FIXME: Create the ResDes handle */ + if (ForResource == ResType_All) + *pResourceID = ulNextResDesType; + + if (prdResDes) + { + pNewResDesInfo = HeapAlloc(GetProcessHeap(), 0, sizeof(RES_DES_INFO)); + if (pNewResDesInfo == NULL) + return CR_OUT_OF_MEMORY; + + pNewResDesInfo->ulMagic = LOG_CONF_MAGIC; + pNewResDesInfo->dnDevInst = dnDevInst; + pNewResDesInfo->ulLogConfType = ulLogConfType; + pNewResDesInfo->ulLogConfTag = ulLogConfTag; + pNewResDesInfo->ulResDesType = ulNextResDesType; + pNewResDesInfo->ulResDesTag = ulNextResDesTag; + + *prdResDes = (RES_DES)pNewResDesInfo; + } return CR_SUCCESS; }