[SETUPAPI] Fix broken control definition.
[reactos.git] / dll / win32 / setupapi / cfgmgr.c
index c2044d9..c7087e6 100644 (file)
@@ -85,6 +85,16 @@ typedef struct _INTERNAL_RANGE_LIST
 
 #define RANGE_LIST_MAGIC 0x33445566
 
+typedef struct _CONFLICT_DATA
+{
+    ULONG ulMagic;
+    PPNP_CONFLICT_LIST pConflictList;
+} CONFLICT_DATA, *PCONFLICT_DATA;
+
+#define CONFLICT_MAGIC 0x11225588
+
+
+/* FUNCTIONS ****************************************************************/
 
 static
 BOOL
@@ -341,7 +351,7 @@ done:
 
 BOOL
 IsValidRangeList(
-    _In_ PINTERNAL_RANGE_LIST pRangeList)
+    _In_opt_ PINTERNAL_RANGE_LIST pRangeList)
 {
     BOOL bValid = TRUE;
 
@@ -363,6 +373,54 @@ IsValidRangeList(
 }
 
 
+BOOL
+IsValidLogConf(
+    _In_opt_ PLOG_CONF_INFO pLogConfInfo)
+{
+    BOOL bValid = TRUE;
+
+    if (pLogConfInfo == NULL)
+        return FALSE;
+
+    _SEH2_TRY
+    {
+        if (pLogConfInfo->ulMagic != LOG_CONF_MAGIC)
+            bValid = FALSE;
+    }
+    _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
+    {
+        bValid = FALSE;
+    }
+    _SEH2_END;
+
+    return bValid;
+}
+
+
+BOOL
+IsValidConflictData(
+    _In_opt_ PCONFLICT_DATA pConflictData)
+{
+    BOOL bValid = TRUE;
+
+    if (pConflictData == NULL)
+        return FALSE;
+
+    _SEH2_TRY
+    {
+        if (pConflictData->ulMagic != CONFLICT_MAGIC)
+            bValid = FALSE;
+    }
+    _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
+    {
+        bValid = FALSE;
+    }
+    _SEH2_END;
+
+    return bValid;
+}
+
+
 /***********************************************************************
  * CMP_GetBlockedDriverInfo [SETUPAPI.@]
  */
@@ -1490,6 +1548,55 @@ CM_Delete_Range(
 }
 
 
+/***********************************************************************
+ * CM_Detect_Resource_Conflict [SETUPAPI.@]
+ */
+CONFIGRET
+WINAPI
+CM_Detect_Resource_Conflict(
+    _In_ DEVINST dnDevInst,
+    _In_ RESOURCEID ResourceID,
+    _In_reads_bytes_(ResourceLen) PCVOID ResourceData,
+    _In_ ULONG ResourceLen,
+    _Out_ PBOOL pbConflictDetected,
+    _In_ ULONG ulFlags)
+{
+    TRACE("CM_Detect_Resource_Conflict(%p %lu %p %lu %p 0x%lx)\n",
+          dnDevInst, ResourceID, ResourceData, ResourceLen,
+          pbConflictDetected, ulFlags);
+
+    return CM_Detect_Resource_Conflict_Ex(dnDevInst,
+                                          ResourceID,
+                                          ResourceData,
+                                          ResourceLen,
+                                          pbConflictDetected,
+                                          ulFlags,
+                                          NULL);
+}
+
+
+/***********************************************************************
+ * CM_Detect_Resource_Conflict_Ex [SETUPAPI.@]
+ */
+CONFIGRET
+WINAPI
+CM_Detect_Resource_Conflict_Ex(
+    _In_ DEVINST dnDevInst,
+    _In_ RESOURCEID ResourceID,
+    _In_reads_bytes_(ResourceLen) PCVOID ResourceData,
+    _In_ ULONG ResourceLen,
+    _Out_ PBOOL pbConflictDetected,
+    _In_ ULONG ulFlags,
+    _In_opt_ HMACHINE hMachine)
+{
+    FIXME("CM_Detect_Resource_Conflict_Ex(%p %lu %p %lu %p 0x%lx %p)\n",
+          dnDevInst, ResourceID, ResourceData, ResourceLen,
+          pbConflictDetected, ulFlags, hMachine);
+
+    return CR_CALL_NOT_IMPLEMENTED;
+}
+
+
 /***********************************************************************
  * CM_Disable_DevNode [SETUPAPI.@]
  */
@@ -2049,7 +2156,7 @@ CM_Free_Log_Conf_Ex(
         return CR_ACCESS_DENIED;
 
     pLogConfInfo = (PLOG_CONF_INFO)lcLogConfToBeFreed;
-    if (pLogConfInfo == NULL || pLogConfInfo->ulMagic != LOG_CONF_MAGIC)
+    if (!IsValidLogConf(pLogConfInfo))
         return CR_INVALID_LOG_CONF;
 
     if (ulFlags != 0)
@@ -2103,7 +2210,7 @@ CM_Free_Log_Conf_Handle(
     TRACE("CM_Free_Log_Conf_Handle(%lx)\n", lcLogConf);
 
     pLogConfInfo = (PLOG_CONF_INFO)lcLogConf;
-    if (pLogConfInfo == NULL || pLogConfInfo->ulMagic != LOG_CONF_MAGIC)
+    if (!IsValidLogConf(pLogConfInfo))
         return CR_INVALID_LOG_CONF;
 
     HeapFree(GetProcessHeap(), 0, pLogConfInfo);
@@ -2209,6 +2316,32 @@ CM_Free_Res_Des_Handle(
 }
 
 
+/***********************************************************************
+ * CM_Free_Resource_Conflict_Handle [SETUPAPI.@]
+ */
+CONFIGRET
+WINAPI
+CM_Free_Resource_Conflict_Handle(
+    _In_ CONFLICT_LIST clConflictList)
+{
+    PCONFLICT_DATA pConflictData;
+
+    FIXME("CM_Free_Resource_Conflict_Handle(%p)\n",
+          clConflictList);
+
+    pConflictData = (PCONFLICT_DATA)clConflictList;
+    if (!IsValidConflictData(pConflictData))
+        return CR_INVALID_CONFLICT_LIST;
+
+    if (pConflictData->pConflictList != NULL)
+        MyFree(pConflictData->pConflictList);
+
+    MyFree(pConflictData);
+
+    return CR_SUCCESS;
+}
+
+
 /***********************************************************************
  * CM_Get_Child [SETUPAPI.@]
  */
@@ -4709,7 +4842,7 @@ CM_Get_Log_Conf_Priority_Ex(
           lcLogConf, pPriority, ulFlags, hMachine);
 
     pLogConfInfo = (PLOG_CONF_INFO)lcLogConf;
-    if (pLogConfInfo == NULL || pLogConfInfo->ulMagic != LOG_CONF_MAGIC)
+    if (!IsValidLogConf(pLogConfInfo))
         return CR_INVALID_LOG_CONF;
 
     if (pPriority == NULL)
@@ -4800,7 +4933,7 @@ CM_Get_Next_Log_Conf_Ex(
         *plcLogConf = 0;
 
     pLogConfInfo = (PLOG_CONF_INFO)lcLogConf;
-    if (pLogConfInfo == NULL || pLogConfInfo->ulMagic != LOG_CONF_MAGIC)
+    if (!IsValidLogConf(pLogConfInfo))
         return CR_INVALID_LOG_CONF;
 
     if (ulFlags != 0)
@@ -5073,6 +5206,67 @@ CM_Get_Res_Des_Data_Size_Ex(
 }
 
 
+/***********************************************************************
+ * CM_Get_Resource_Conflict_Count [SETUPAPI.@]
+ */
+CONFIGRET
+WINAPI
+CM_Get_Resource_Conflict_Count(
+    _In_ CONFLICT_LIST clConflictList,
+    _Out_ PULONG pulCount)
+{
+    PCONFLICT_DATA pConflictData;
+
+    FIXME("CM_Get_Resource_Conflict_Count(%p %p)\n",
+          clConflictList, pulCount);
+
+    pConflictData = (PCONFLICT_DATA)clConflictList;
+    if (!IsValidConflictData(pConflictData))
+        return CR_INVALID_CONFLICT_LIST;
+
+    if (pulCount == NULL)
+        return CR_INVALID_POINTER;
+
+    *pulCount = pConflictData->pConflictList->ConflictsListed;
+
+    return CR_SUCCESS;
+}
+
+
+/***********************************************************************
+ * CM_Get_Resource_Conflict_DetailsA [SETUPAPI.@]
+ */
+CONFIGRET
+WINAPI
+CM_Get_Resource_Conflict_DetailsA(
+    _In_ CONFLICT_LIST clConflictList,
+    _In_ ULONG ulIndex,
+    _Inout_ PCONFLICT_DETAILS_A pConflictDetails)
+{
+    FIXME("CM_Get_Resource_Conflict_CountA(%p %lu %p)\n",
+          clConflictList, ulIndex, pConflictDetails);
+
+    return CR_CALL_NOT_IMPLEMENTED;
+}
+
+
+/***********************************************************************
+ * CM_Get_Resource_Conflict_DetailsW [SETUPAPI.@]
+ */
+CONFIGRET
+WINAPI
+CM_Get_Resource_Conflict_DetailsW(
+    _In_ CONFLICT_LIST clConflictList,
+    _In_ ULONG ulIndex,
+    _Inout_ PCONFLICT_DETAILS_W pConflictDetails)
+{
+    FIXME("CM_Get_Resource_Conflict_CountW(%p %lu %p)\n",
+          clConflictList, ulIndex, pConflictDetails);
+
+    return CR_CALL_NOT_IMPLEMENTED;
+}
+
+
 /***********************************************************************
  * CM_Get_Sibling [SETUPAPI.@]
  */
@@ -6435,6 +6629,124 @@ CM_Query_Remove_SubTree_Ex(
 }
 
 
+/***********************************************************************
+ * CM_Query_Resource_Conflict_List [SETUPAPI.@]
+ */
+CONFIGRET
+WINAPI
+CM_Query_Resource_Conflict_List(
+    _Out_ PCONFLICT_LIST pclConflictList,
+    _In_ DEVINST dnDevInst,
+    _In_ RESOURCEID ResourceID,
+    _In_ PCVOID ResourceData,
+    _In_ ULONG ResourceLen,
+    _In_ ULONG ulFlags,
+    _In_opt_ HMACHINE hMachine)
+{
+    RPC_BINDING_HANDLE BindingHandle = NULL;
+    HSTRING_TABLE StringTable = NULL;
+    PPNP_CONFLICT_LIST pConflictBuffer = NULL;
+    PCONFLICT_DATA pConflictData = NULL;
+    ULONG ulBufferLength;
+    LPWSTR lpDevInst;
+    CONFIGRET ret;
+
+    FIXME("CM_Query_Resource_Conflict_List(%p %lx %lu %p %lu %lx %p)\n",
+          pclConflictList, dnDevInst, ResourceID, ResourceData,
+          ResourceLen, ulFlags, hMachine);
+
+    if (dnDevInst == 0)
+        return CR_INVALID_DEVNODE;
+
+    if (ulFlags & ~CM_RESDES_WIDTH_BITS)
+        return CR_INVALID_FLAG;
+
+    if (pclConflictList == NULL ||
+        ResourceData == NULL ||
+        ResourceLen == 0)
+        return CR_INVALID_POINTER;
+
+    if (ResourceID == 0)
+        return CR_INVALID_RESOURCEID;
+
+    *pclConflictList = 0;
+
+    if (hMachine != NULL)
+    {
+        BindingHandle = ((PMACHINE_INFO)hMachine)->BindingHandle;
+        if (BindingHandle == NULL)
+            return CR_FAILURE;
+
+        StringTable = ((PMACHINE_INFO)hMachine)->StringTable;
+        if (StringTable == 0)
+            return CR_FAILURE;
+    }
+    else
+    {
+        if (!PnpGetLocalHandles(&BindingHandle, &StringTable))
+            return CR_FAILURE;
+    }
+
+    lpDevInst = pSetupStringTableStringFromId(StringTable, dnDevInst);
+    if (lpDevInst == NULL)
+        return CR_INVALID_DEVNODE;
+
+    pConflictData = MyMalloc(sizeof(PCONFLICT_DATA));
+    if (pConflictData == NULL)
+    {
+        ret = CR_OUT_OF_MEMORY;
+        goto done;
+    }
+
+    ulBufferLength = sizeof(PNP_CONFLICT_LIST) +
+                     sizeof(PNP_CONFLICT_STRINGS) +
+                     (sizeof(wchar_t) * 200);
+    pConflictBuffer = MyMalloc(ulBufferLength);
+    if (pConflictBuffer == NULL)
+    {
+        ret = CR_OUT_OF_MEMORY;
+        goto done;
+    }
+
+    RpcTryExcept
+    {
+        ret = PNP_QueryResConfList(BindingHandle,
+                                   lpDevInst,
+                                   ResourceID,
+                                   (PBYTE)ResourceData,
+                                   ResourceLen,
+                                   (PBYTE)pConflictBuffer,
+                                   ulBufferLength,
+                                   ulFlags);
+    }
+    RpcExcept(EXCEPTION_EXECUTE_HANDLER)
+    {
+        ret = RpcStatusToCmStatus(RpcExceptionCode());
+    }
+    RpcEndExcept;
+
+    if (ret != CR_SUCCESS)
+        goto done;
+
+    pConflictData->ulMagic = CONFLICT_MAGIC;
+    pConflictData->pConflictList = pConflictBuffer;
+
+    *pclConflictList = (CONFLICT_LIST)pConflictData;
+
+done:
+    if (ret != CR_SUCCESS)
+    {
+        if (pConflictBuffer != NULL)
+            MyFree(pConflictBuffer);
+
+        if (pConflictData != NULL)
+            MyFree(pConflictData);
+    }
+
+    return ret;
+}
+
+
 /***********************************************************************
  * CM_Reenumerate_DevNode [SETUPAPI.@]
  */