mirror of
https://github.com/reactos/reactos.git
synced 2025-04-27 09:00:27 +00:00
[SETUPAPI] Implement CM_Dup_Range_List() and CM_Test_Range_Available()
This commit is contained in:
parent
b6b82fee3f
commit
f24fbb655e
1 changed files with 111 additions and 2 deletions
|
@ -1931,10 +1931,66 @@ CM_Dup_Range_List(
|
|||
_In_ RANGE_LIST rlhNew,
|
||||
_In_ ULONG ulFlags)
|
||||
{
|
||||
PINTERNAL_RANGE_LIST pOldRangeList, pNewRangeList;
|
||||
PINTERNAL_RANGE pOldRange, pNewRange;
|
||||
PLIST_ENTRY ListEntry;
|
||||
CONFIGRET ret = CR_SUCCESS;
|
||||
|
||||
FIXME("CM_Dup_Range_List(%p %p %lx)\n",
|
||||
rlhOld, rlhNew, ulFlags);
|
||||
|
||||
return CR_CALL_NOT_IMPLEMENTED;
|
||||
pOldRangeList = (PINTERNAL_RANGE_LIST)rlhOld;
|
||||
pNewRangeList = (PINTERNAL_RANGE_LIST)rlhNew;
|
||||
|
||||
if (!IsValidRangeList(pOldRangeList))
|
||||
return CR_INVALID_RANGE_LIST;
|
||||
|
||||
if (!IsValidRangeList(pNewRangeList))
|
||||
return CR_INVALID_RANGE_LIST;
|
||||
|
||||
if (ulFlags != 0)
|
||||
return CR_INVALID_FLAG;
|
||||
|
||||
/* Lock the range lists */
|
||||
WaitForSingleObject(pOldRangeList->hMutex, INFINITE);
|
||||
WaitForSingleObject(pNewRangeList->hMutex, INFINITE);
|
||||
|
||||
/* Delete the new range list, if ist is not empty */
|
||||
while (!IsListEmpty(&pNewRangeList->ListHead))
|
||||
{
|
||||
ListEntry = RemoveHeadList(&pNewRangeList->ListHead);
|
||||
pNewRange = CONTAINING_RECORD(ListEntry, INTERNAL_RANGE, ListEntry);
|
||||
HeapFree(GetProcessHeap(), 0, pNewRange);
|
||||
}
|
||||
|
||||
/* Copy the old range list into the new range list */
|
||||
ListEntry = &pOldRangeList->ListHead;
|
||||
while (ListEntry->Flink == &pOldRangeList->ListHead)
|
||||
{
|
||||
pOldRange = CONTAINING_RECORD(ListEntry, INTERNAL_RANGE, ListEntry);
|
||||
|
||||
pNewRange = HeapAlloc(GetProcessHeap(), 0, sizeof(INTERNAL_RANGE));
|
||||
if (pNewRange == NULL)
|
||||
{
|
||||
ret = CR_OUT_OF_MEMORY;
|
||||
goto done;
|
||||
}
|
||||
|
||||
pNewRange->pRangeList = pNewRangeList;
|
||||
pNewRange->ullStart = pOldRange->ullStart;
|
||||
pNewRange->ullEnd = pOldRange->ullEnd;
|
||||
|
||||
InsertTailList(&pNewRangeList->ListHead, &pNewRange->ListEntry);
|
||||
|
||||
ListEntry = ListEntry->Flink;
|
||||
}
|
||||
|
||||
done:
|
||||
/* Unlock the range lists */
|
||||
ReleaseMutex(pNewRangeList->hMutex);
|
||||
ReleaseMutex(pOldRangeList->hMutex);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
|
@ -8379,9 +8435,62 @@ CM_Test_Range_Available(
|
|||
_In_ RANGE_LIST rlh,
|
||||
_In_ ULONG ulFlags)
|
||||
{
|
||||
PINTERNAL_RANGE_LIST pRangeList;
|
||||
PINTERNAL_RANGE pRange;
|
||||
PLIST_ENTRY ListEntry;
|
||||
CONFIGRET ret = CR_SUCCESS;
|
||||
|
||||
FIXME("CM_Test_Range_Available(%I64u %I64u %p %lx)\n",
|
||||
ullStartValue, ullEndValue, rlh, ulFlags);
|
||||
return CR_CALL_NOT_IMPLEMENTED;
|
||||
|
||||
pRangeList = (PINTERNAL_RANGE_LIST)rlh;
|
||||
|
||||
if (!IsValidRangeList(pRangeList))
|
||||
return CR_INVALID_RANGE_LIST;
|
||||
|
||||
if (ulFlags != 0)
|
||||
return CR_INVALID_FLAG;
|
||||
|
||||
if (ullStartValue > ullEndValue)
|
||||
return CR_INVALID_RANGE;
|
||||
|
||||
/* Lock the range list */
|
||||
WaitForSingleObject(pRangeList->hMutex, INFINITE);
|
||||
|
||||
/* Check the ranges */
|
||||
ListEntry = &pRangeList->ListHead;
|
||||
while (ListEntry->Flink == &pRangeList->ListHead)
|
||||
{
|
||||
pRange = CONTAINING_RECORD(ListEntry, INTERNAL_RANGE, ListEntry);
|
||||
|
||||
/* Check if the start value is within the current range */
|
||||
if ((ullStartValue >= pRange->ullStart) && (ullStartValue <= pRange->ullEnd))
|
||||
{
|
||||
ret = CR_FAILURE;
|
||||
break;
|
||||
}
|
||||
|
||||
/* Check if the end value is within the current range */
|
||||
if ((ullEndValue >= pRange->ullStart) && (ullEndValue <= pRange->ullEnd))
|
||||
{
|
||||
ret = CR_FAILURE;
|
||||
break;
|
||||
}
|
||||
|
||||
/* Check if the current range lies inside of the start-end interval */
|
||||
if ((ullStartValue <= pRange->ullStart) && (ullEndValue >= pRange->ullEnd))
|
||||
{
|
||||
ret = CR_FAILURE;
|
||||
break;
|
||||
}
|
||||
|
||||
ListEntry = ListEntry->Flink;
|
||||
}
|
||||
|
||||
/* Unlock the range list */
|
||||
ReleaseMutex(pRangeList->hMutex);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
|
|
Loading…
Reference in a new issue