- Implement IResourceList_AddEntryFromParent

- Implement PcNewResourceSublist

svn path=/trunk/; revision=37945
This commit is contained in:
Johannes Anderwald 2008-12-08 20:18:02 +00:00
parent e9c0e48377
commit 6fe59166a1

View file

@ -225,6 +225,27 @@ IResourceList_fnAddEntryFromParent(
IN CM_RESOURCE_TYPE Type, IN CM_RESOURCE_TYPE Type,
IN ULONG Index) IN ULONG Index)
{ {
PCM_PARTIAL_RESOURCE_DESCRIPTOR Translated;
PCM_RESOURCE_LIST NewTranslatedResources;
ULONG NewTranslatedSize;
IResourceListImpl * This = (IResourceListImpl*)iface;
Translated = Parent->lpVtbl->FindTranslatedEntry(Parent, Type, Index);
if (!Translated)
return STATUS_INVALID_PARAMETER;
NewTranslatedSize = sizeof(CM_RESOURCE_LIST) + This->TranslatedResourceList[0].List->PartialResourceList.Count * sizeof(CM_PARTIAL_RESOURCE_DESCRIPTOR);
NewTranslatedResources = ExAllocatePoolWithTag(This->PoolType, NewTranslatedSize, TAG_PORTCLASS);
if (!NewTranslatedResources)
return STATUS_INSUFFICIENT_RESOURCES;
RtlCopyMemory(NewTranslatedResources, This->TranslatedResourceList, sizeof(CM_RESOURCE_LIST) + (This->TranslatedResourceList[0].List->PartialResourceList.Count-1) * sizeof(CM_PARTIAL_RESOURCE_DESCRIPTOR));
RtlCopyMemory(&NewTranslatedResources->List[0].PartialResourceList.PartialDescriptors[This->TranslatedResourceList[0].List->PartialResourceList.Count], Translated, sizeof(CM_PARTIAL_RESOURCE_DESCRIPTOR));
ExFreePoolWithTag(This->TranslatedResourceList, TAG_PORTCLASS);
This->TranslatedResourceList = NewTranslatedResources;
NewTranslatedResources->List[0].PartialResourceList.Count++;
return STATUS_SUCCESS; return STATUS_SUCCESS;
} }
@ -281,7 +302,7 @@ PcNewResourceList(
IN PCM_RESOURCE_LIST TranslatedResources, IN PCM_RESOURCE_LIST TranslatedResources,
IN PCM_RESOURCE_LIST UntranslatedResources) IN PCM_RESOURCE_LIST UntranslatedResources)
{ {
IResourceListImpl* NewList = NULL; IResourceListImpl* NewList;
/* TODO: Validate parameters */ /* TODO: Validate parameters */
@ -317,5 +338,53 @@ PcNewResourceSublist(
IN PRESOURCELIST ParentList, IN PRESOURCELIST ParentList,
IN ULONG MaximumEntries) IN ULONG MaximumEntries)
{ {
return STATUS_UNSUCCESSFUL; IResourceListImpl* NewList, *Parent;
if (!OuterUnknown || !ParentList || !MaximumEntries)
return STATUS_INVALID_PARAMETER;
Parent = (IResourceListImpl*)ParentList;
if (!Parent->TranslatedResourceList->List->PartialResourceList.Count ||
!Parent->UntranslatedResourceList->List->PartialResourceList.Count)
{
/* parent list can't be empty */
return STATUS_INVALID_PARAMETER;
}
NewList = ExAllocatePoolWithTag(PoolType, sizeof(IResourceListImpl), TAG_PORTCLASS);
if (!NewList)
return STATUS_INSUFFICIENT_RESOURCES;
NewList->TranslatedResourceList = ExAllocatePoolWithTag(PoolType, sizeof(CM_RESOURCE_LIST), TAG_PORTCLASS);
if (!NewList->TranslatedResourceList)
{
ExFreePoolWithTag(NewList, TAG_PORTCLASS);
return STATUS_INSUFFICIENT_RESOURCES;
}
NewList->UntranslatedResourceList = ExAllocatePoolWithTag(PoolType, sizeof(CM_RESOURCE_LIST), TAG_PORTCLASS);
if (!NewList->UntranslatedResourceList)
{
ExFreePoolWithTag(NewList->TranslatedResourceList, TAG_PORTCLASS);
ExFreePoolWithTag(NewList, TAG_PORTCLASS);
return STATUS_INSUFFICIENT_RESOURCES;
}
RtlCopyMemory(NewList->TranslatedResourceList, Parent->TranslatedResourceList, sizeof(CM_RESOURCE_LIST));
RtlCopyMemory(NewList->UntranslatedResourceList, Parent->UntranslatedResourceList, sizeof(CM_RESOURCE_LIST));
/* mark list as empty */
NewList->TranslatedResourceList->List->PartialResourceList.Count = 0;
NewList->UntranslatedResourceList->List->PartialResourceList.Count = 0;
NewList->lpVtbl = (IResourceListVtbl*)&vt_ResourceListVtbl;
NewList->ref = 1;
NewList->OuterUnknown = OuterUnknown;
NewList->PoolType = PoolType;
*OutResourceList = (IResourceList*)&NewList->lpVtbl;
return STATUS_SUCCESS;
} }