Something went wrong. Try again.
Reactos
Something went wrong. Try again.
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337/*++
Copyright (c) Microsoft Corporation
Module Name:
FxResourceAPI.cpp
Abstract:
This module implements the resource class.
Author:
Environment:
Both kernel and user mode
Revision History:
--*/#include "fxsupportpch.hpp"
extern "C" {// #include "FxResourceAPI.tmh"}
//// Extern "C" the entire file//extern "C" {
__drv_maxIRQL(DISPATCH_LEVEL)VOIDNTAPIWDFEXPORT(WdfIoResourceRequirementsListSetSlotNumber)( __in PWDF_DRIVER_GLOBALS DriverGlobals, __in WDFIORESREQLIST RequirementsList, __in ULONG SlotNumber )/*++
Routine Description: Sets the slot number for a given resource requirements list
Arguments: RequirementsList - list to be modified
SlotNumber - slot value to assign
Return Value: None
--*/{ FxIoResReqList* pIoResReqList;
FxObjectHandleGetPtr(GetFxDriverGlobals(DriverGlobals), RequirementsList, FX_TYPE_IO_RES_REQ_LIST, (PVOID*) &pIoResReqList);
if (pIoResReqList->m_SlotNumber != SlotNumber) { pIoResReqList->MarkChanged(); } pIoResReqList->m_SlotNumber = SlotNumber;}
__drv_maxIRQL(DISPATCH_LEVEL)VOIDNTAPIWDFEXPORT(WdfIoResourceRequirementsListSetInterfaceType)( __in PWDF_DRIVER_GLOBALS DriverGlobals, __in WDFIORESREQLIST RequirementsList, __in __drv_strictTypeMatch(__drv_typeCond) INTERFACE_TYPE InterfaceType )/*++
Routine Description: Sets the InterfaceType for a given resource requirements list
Arguments: RequirementsList - list to be modified
InterfaceType - interface type to assign
Return Value: None
--*/{ FxIoResReqList* pIoResReqList;
FxObjectHandleGetPtr(GetFxDriverGlobals(DriverGlobals), RequirementsList, FX_TYPE_IO_RES_REQ_LIST, (PVOID*) &pIoResReqList);
if (pIoResReqList->m_InterfaceType != InterfaceType) { pIoResReqList->MarkChanged(); }
pIoResReqList->m_InterfaceType = InterfaceType;}
_Must_inspect_result___drv_maxIRQL(DISPATCH_LEVEL)NTSTATUSFxIoResourceRequirementsListInsertIoResList( __in PWDF_DRIVER_GLOBALS DriverGlobals, __in WDFIORESREQLIST RequirementsList, __in WDFIORESLIST IoResList, ULONG Index )/*++
Routine Description: Inserts a resource list into a requirements list at a particular index.
Arguments: RequirementsList - list to be modified
IoResList - resource list to add
Index - zero based index to insert at
Return Value: NTSTATUS
--*/{ PFX_DRIVER_GLOBALS pFxDriverGlobals; FxIoResReqList* pIoResReqList; FxIoResList* pIoResList; NTSTATUS status;
FxObjectHandleGetPtrAndGlobals(GetFxDriverGlobals(DriverGlobals), RequirementsList, FX_TYPE_IO_RES_REQ_LIST, (PVOID*) &pIoResReqList, &pFxDriverGlobals);
FxObjectHandleGetPtr(pFxDriverGlobals, IoResList, FX_TYPE_IO_RES_LIST, (PVOID*) &pIoResList);
if (pIoResList->m_OwningList != pIoResReqList) { return STATUS_INVALID_DEVICE_REQUEST; }
status = pIoResReqList->AddAt(Index, pIoResList);
if (NT_SUCCESS(status)) { // // Mirror the access flags as well. // pIoResList->m_AccessFlags = pIoResReqList->m_AccessFlags; pIoResList->m_OwningList = pIoResReqList; }
return status;}
_Must_inspect_result___drv_maxIRQL(DISPATCH_LEVEL)NTSTATUSNTAPIWDFEXPORT(WdfIoResourceRequirementsListInsertIoResList)( __in PWDF_DRIVER_GLOBALS DriverGlobals, __in WDFIORESREQLIST RequirementsList, __in WDFIORESLIST IoResList, __in ULONG Index )/*++
Routine Description: Inserts a resource list into a requirements list at a particular index.
Arguments: RequirementsList - list to be modified
IoResList - resource list to add
Index - zero based index to insert at
Return Value: NTSTATUS
--*/{ return FxIoResourceRequirementsListInsertIoResList(DriverGlobals, RequirementsList, IoResList, Index);}
_Must_inspect_result___drv_maxIRQL(DISPATCH_LEVEL)NTSTATUSNTAPIWDFEXPORT(WdfIoResourceRequirementsListAppendIoResList)( __in PWDF_DRIVER_GLOBALS DriverGlobals, __in WDFIORESREQLIST RequirementsList, __in WDFIORESLIST IoResList )/*++
Routine Description: Appends a resource list to a resource requirements list
Arguments: RequirementsList - list to be modified
IoResList - resource list to append
Return Value: NTSTATUS
--*/
{ return FxIoResourceRequirementsListInsertIoResList(DriverGlobals, RequirementsList, IoResList, WDF_INSERT_AT_END);}
__drv_maxIRQL(DISPATCH_LEVEL)ULONGNTAPIWDFEXPORT(WdfIoResourceRequirementsListGetCount)( __in PWDF_DRIVER_GLOBALS DriverGlobals, __in WDFIORESREQLIST RequirementsList )/*++
Routine Description: Returns the number of resource lists in the requirements list
Arguments: RequirementsList - requirements list whose count will be returned
Return Value: number of elements in the list
--*/
{ FxIoResReqList* pList; ULONG count; KIRQL irql;
FxObjectHandleGetPtr(GetFxDriverGlobals(DriverGlobals), RequirementsList, FX_TYPE_IO_RES_REQ_LIST, (PVOID*) &pList);
pList->Lock(&irql); count = pList->Count(); pList->Unlock(irql);
return count;}
__drv_maxIRQL(DISPATCH_LEVEL)WDFIORESLISTNTAPIWDFEXPORT(WdfIoResourceRequirementsListGetIoResList)( __in PWDF_DRIVER_GLOBALS DriverGlobals, __in WDFIORESREQLIST RequirementsList, __in ULONG Index )/*++
Routine Description: Retrieves a resource list from the requirements list at a given index.
Arguments: RequirementsList - list to retrieve the resource list from
Index - zero based index from which to retrieve the list
Return Value: resource list handle or NULL
--*/{ FxIoResReqList* pIoResReqList; FxObject* pObject; KIRQL irql;
FxObjectHandleGetPtr(GetFxDriverGlobals(DriverGlobals), RequirementsList, FX_TYPE_IO_RES_REQ_LIST, (PVOID*) &pIoResReqList);
pIoResReqList->Lock(&irql); pObject = pIoResReqList->GetItem(Index); pIoResReqList->Unlock(irql);
if (pObject == NULL) { return NULL; } else { return (WDFIORESLIST) pObject->GetObjectHandle(); }}
__drv_maxIRQL(DISPATCH_LEVEL)VOIDNTAPIWDFEXPORT(WdfIoResourceRequirementsListRemove)( __in PWDF_DRIVER_GLOBALS DriverGlobals, __in WDFIORESREQLIST RequirementsList, __in ULONG Index )/*++
Routine Description: Removes a resource list from the requirements list at a given index
Arguments: RequirementsList - list of resource requirements which will be modified
Index - zero based index which indictes location in the list to find the resource list
Return Value: None
--*/{ PFX_DRIVER_GLOBALS pFxDriverGlobals; FxIoResReqList* pList;
FxObjectHandleGetPtrAndGlobals(GetFxDriverGlobals(DriverGlobals), RequirementsList, FX_TYPE_IO_RES_REQ_LIST, (PVOID*) &pList, &pFxDriverGlobals);
if (pList->RemoveAndDelete(Index) == FALSE) { DoTraceLevelMessage( pFxDriverGlobals, TRACE_LEVEL_ERROR, TRACINGPNP, "WDFIORESLIST %p, could not remove list at index %d (not found), " "list item count is %d", RequirementsList, Index, pList->Count());
FxVerifierDbgBreakPoint(pFxDriverGlobals); }}
__drv_maxIRQL(DISPATCH_LEVEL)VOIDNTAPIWDFEXPORT(WdfIoResourceRequirementsListRemoveByIoResList)( __in PWDF_DRIVER_GLOBALS DriverGlobals, __in WDFIORESREQLIST RequirementsList, __in WDFIORESLIST IoResList )/*++
Routine Description: Removes a resource list from the requirements list based on the resource list's handle
Arguments: RequirementsList - resource requirements list being modified
IoResList - resource list to be removed
Return Value: None
--*/{ PFX_DRIVER_GLOBALS pFxDriverGlobals; FxCollectionEntry* cur, *end; FxIoResReqList* pList; FxIoResList* pResList; KIRQL irql; BOOLEAN listFound;
FxObjectHandleGetPtrAndGlobals(GetFxDriverGlobals(DriverGlobals), RequirementsList, FX_TYPE_IO_RES_REQ_LIST, (PVOID*) &pList, &pFxDriverGlobals);
if (pList->IsRemoveAllowed() == FALSE) { DoTraceLevelMessage(pFxDriverGlobals, TRACE_LEVEL_ERROR, TRACINGPNP, "WDFIORESREQLIST %p: Removes not allowed", RequirementsList);
FxVerifierDbgBreakPoint(pFxDriverGlobals); return; }
FxObjectHandleGetPtr(pFxDriverGlobals, IoResList, FX_TYPE_IO_RES_LIST, (PVOID*) &pResList);
pList->Lock(&irql);
cur = pList->Start(); end = pList->End(); listFound = FALSE;
while (cur != end) { if (cur->m_Object == pResList) { pList->MarkChanged();
pList->RemoveEntry(cur); listFound = TRUE; break; }
cur = cur->Next(); }
pList->Unlock(irql);
if (listFound) { pResList->DeleteObject(); pResList = NULL; }}
_Must_inspect_result___drv_maxIRQL(DISPATCH_LEVEL)NTSTATUSNTAPIWDFEXPORT(WdfIoResourceListCreate)( __in PWDF_DRIVER_GLOBALS DriverGlobals, __in WDFIORESREQLIST RequirementsList, __in_opt PWDF_OBJECT_ATTRIBUTES Attributes, __out WDFIORESLIST* ResourceList )/*++
Routine Description: Creates a resource list.
Arguments: RequirementsList - the resource requirements list that the resource list will be associated with
Attributes - generic object attributes for the new resource list
ResourceList - pointer which will receive the new object handle
Return Value: NTSTATUS
--*/{ PFX_DRIVER_GLOBALS pFxDriverGlobals; FxIoResReqList* pIoResReqList; FxIoResList* pIoResList; NTSTATUS status;
FxObjectHandleGetPtrAndGlobals(GetFxDriverGlobals(DriverGlobals), RequirementsList, FX_TYPE_IO_RES_REQ_LIST, (PVOID*) &pIoResReqList, &pFxDriverGlobals);
FxPointerNotNull(pFxDriverGlobals, ResourceList); *ResourceList = NULL;
status = FxValidateObjectAttributes(pFxDriverGlobals, Attributes, FX_VALIDATE_OPTION_PARENT_NOT_ALLOWED);
if (!NT_SUCCESS(status)) { return status; }
pIoResList = new (pFxDriverGlobals, Attributes) FxIoResList( pFxDriverGlobals, pIoResReqList);
if (pIoResList == NULL) { return STATUS_INSUFFICIENT_RESOURCES; }
status = pIoResList->Commit(Attributes, (WDFOBJECT*) ResourceList, pIoResReqList);
if (!NT_SUCCESS(status)) { pIoResList->DeleteFromFailedCreate(); }
return status;}
_Must_inspect_result___drv_maxIRQL(DISPATCH_LEVEL)NTSTATUSFxIoResourceListInsertDescriptor( __in PWDF_DRIVER_GLOBALS DriverGlobals, __in WDFIORESLIST ResourceList, __in PIO_RESOURCE_DESCRIPTOR Descriptor, ULONG Index )/*++
Routine Description: Inserts a descriptor into a resource list at a particular index.
Arguments: ResourceList - list to be modified
Descriptor - descriptor to insert
Index - zero based index to insert at
Return Value: NTSTATUS
--*/{ PFX_DRIVER_GLOBALS pFxDriverGlobals; FxIoResList* pList; FxResourceIo* pObject; NTSTATUS status;
FxObjectHandleGetPtrAndGlobals(GetFxDriverGlobals(DriverGlobals), ResourceList, FX_TYPE_IO_RES_LIST, (PVOID*) &pList, &pFxDriverGlobals);
FxPointerNotNull(pFxDriverGlobals, Descriptor);
if (pList->m_OwningList->IsAddAllowed() == FALSE) { DoTraceLevelMessage(pFxDriverGlobals, TRACE_LEVEL_ERROR, TRACINGPNP, "Removes not allowed on WDFIORESLIST %p", ResourceList); FxVerifierDbgBreakPoint(pFxDriverGlobals); return STATUS_ACCESS_DENIED; }
pObject = new(pFxDriverGlobals) FxResourceIo(pFxDriverGlobals, Descriptor);
if (pObject == NULL) { return STATUS_INSUFFICIENT_RESOURCES; }
status = pObject->AssignParentObject(pList); if (!NT_SUCCESS(status)) { pObject->DeleteObject(); return status; }
status = pList->AddAt(Index, pObject);
// // Mark both this list and its owning list as changed so when it comes // time to evaluate the entire requirements list for changes, we do not // have to iterate over all the resource lists. // if (NT_SUCCESS(status)) { pList->m_OwningList->MarkChanged(); }
return status;}
_Must_inspect_result___drv_maxIRQL(DISPATCH_LEVEL)NTSTATUSNTAPIWDFEXPORT(WdfIoResourceListInsertDescriptor)( __in PWDF_DRIVER_GLOBALS DriverGlobals, __in WDFIORESLIST ResourceList, __in PIO_RESOURCE_DESCRIPTOR Descriptor, __in ULONG Index )/*++
Routine Description: Inserts a descriptor into a resource list at a particular index.
Arguments: ResourceList - list to be modified
Descriptor - descriptor to insert
Index - zero based index to insert at
Return Value: NTSTATUS
--*/{ return FxIoResourceListInsertDescriptor(DriverGlobals, ResourceList, Descriptor, Index);}
_Must_inspect_result___drv_maxIRQL(DISPATCH_LEVEL)NTSTATUSNTAPIWDFEXPORT(WdfIoResourceListAppendDescriptor)( __in PWDF_DRIVER_GLOBALS DriverGlobals, __in WDFIORESLIST ResourceList, __in PIO_RESOURCE_DESCRIPTOR Descriptor )/*++
Routine Description: Appends a descriptor to a resource list
Arguments: ResourceList - list to be modified
Descriptor - item to be appended
Return Value: NTSTATUS
--*/{ return FxIoResourceListInsertDescriptor(DriverGlobals, ResourceList, Descriptor, WDF_INSERT_AT_END);}
__drv_maxIRQL(DISPATCH_LEVEL)VOIDNTAPIWDFEXPORT(WdfIoResourceListUpdateDescriptor)( __in PWDF_DRIVER_GLOBALS DriverGlobals, __in WDFIORESLIST ResourceList, __in PIO_RESOURCE_DESCRIPTOR Descriptor, __in ULONG Index )/*++
Routine Description: Updates resource requirement in place in the list.
Arguments: ResourceList - list to be modified
Descriptor - Pointer to descriptor whic contains the updated value
Index - zero based location in the list to update
Return Value: None
--*/{ PFX_DRIVER_GLOBALS pFxDriverGlobals; FxIoResList* pList; FxResourceIo* pObject; KIRQL irql;
FxObjectHandleGetPtrAndGlobals(GetFxDriverGlobals(DriverGlobals), ResourceList, FX_TYPE_IO_RES_LIST, (PVOID*) &pList, &pFxDriverGlobals);
FxPointerNotNull(pFxDriverGlobals, Descriptor);
pList->Lock(&irql); pObject = (FxResourceIo*) pList->GetItem(Index); pList->Unlock(irql);
if (pObject != NULL) { // // We don't check for add or remove access because we don't know what // the update is actually doing (ie widening a range, shortening it, etc). // For this operation we have to trust the driver that it is doing the // right thing at the right time. // RtlCopyMemory(&pObject->m_Descriptor, Descriptor, sizeof(pObject->m_Descriptor));
// // Mark both this list and its owning list as changed so when it comes // time to evaluate the entire requirements list for changes, we do not // have to iterate over all the resource lists. // pList->MarkChanged(); pList->m_OwningList->MarkChanged(); } else { DoTraceLevelMessage( pFxDriverGlobals, TRACE_LEVEL_ERROR, TRACINGPNP, "WDFIORESREQLIST %p, cannot update item at index %d, item not found," " list item count is %d", ResourceList, Index, pList->Count());
FxVerifierDbgBreakPoint(pFxDriverGlobals); }}
__drv_maxIRQL(DISPATCH_LEVEL)ULONGNTAPIWDFEXPORT(WdfIoResourceListGetCount)( __in PWDF_DRIVER_GLOBALS DriverGlobals, __in WDFIORESLIST ResourceList )/*++
Routine Description: Returns the number of descriptors in the resource list
Arguments: ResourceList - resource list whose count will be returned
Return Value: number of elements in the list
--*/{ FxIoResList* pList; ULONG count; KIRQL irql;
FxObjectHandleGetPtr(GetFxDriverGlobals(DriverGlobals), ResourceList, FX_TYPE_IO_RES_LIST, (PVOID*) &pList);
pList->Lock(&irql); count = pList->Count(); pList->Unlock(irql);
return count;}
__drv_maxIRQL(DISPATCH_LEVEL)PIO_RESOURCE_DESCRIPTORNTAPIWDFEXPORT(WdfIoResourceListGetDescriptor)( __in PWDF_DRIVER_GLOBALS DriverGlobals, __in WDFIORESLIST ResourceList, __in ULONG Index )/*++
Routine Description: Retrieves an io resource desciptor for a given index in the resource list
Arguments: ResourceList - list being looked up
Index - zero based index into the list to find the value of
Return Value: pointer to an io resource descriptor upon success, NULL upon error
--*/
{ FxIoResList* pList; FxResourceIo* pObject; KIRQL irql;
FxObjectHandleGetPtr(GetFxDriverGlobals(DriverGlobals), ResourceList, FX_TYPE_IO_RES_LIST, (PVOID*) &pList);
pList->Lock(&irql); pObject = (FxResourceIo*) pList->GetItem(Index); pList->Unlock(irql);
if (pObject == NULL) { return NULL; } else { // // Copy the current descriptor to the clone and return it // RtlCopyMemory(&pObject->m_DescriptorClone, &pObject->m_Descriptor, sizeof(pObject->m_Descriptor));
return &pObject->m_DescriptorClone; }}
__drv_maxIRQL(DISPATCH_LEVEL)VOIDNTAPIWDFEXPORT(WdfIoResourceListRemove)( __in PWDF_DRIVER_GLOBALS DriverGlobals, __in WDFIORESLIST ResourceList, __in ULONG Index )/*++
Routine Description: Removes a descriptor in an io resource list
Arguments: ResourceList - resource list to modify
Index - zero based index into the list in which to remove the descriptor
Return Value: None
--*/{ PFX_DRIVER_GLOBALS pFxDriverGlobals; FxIoResList* pList;
FxObjectHandleGetPtrAndGlobals(GetFxDriverGlobals(DriverGlobals), ResourceList, FX_TYPE_IO_RES_LIST, (PVOID*) &pList, &pFxDriverGlobals);
if (pList->RemoveAndDelete(Index)) { // // Mark this list's owning list as changed so when it comes // time to evaluate the entire requirements list for changes, we do not // have to iterate over all the resource lists. // // RemoveAndDelete marked pList as changed already // pList->m_OwningList->MarkChanged(); } else { DoTraceLevelMessage( pFxDriverGlobals, TRACE_LEVEL_ERROR, TRACINGPNP, "WDFIORESLIST %p, could not remove item at index %d (not found), " "list item count is %d", ResourceList, Index, pList->Count());
FxVerifierDbgBreakPoint(pFxDriverGlobals); }}
__drv_maxIRQL(DISPATCH_LEVEL)VOIDNTAPIWDFEXPORT(WdfIoResourceListRemoveByDescriptor)( __in PWDF_DRIVER_GLOBALS DriverGlobals, __in WDFIORESLIST ResourceList, __in PIO_RESOURCE_DESCRIPTOR Descriptor )/*++
Routine Description: Removes a descriptor by value in a given io resource list. Equality is determined by RtlCompareMemory.
Arguments: ResourceList - the io resource list to modify
Descriptor - pointer to a descriptor to remove.
Return Value: None
--*/{ PFX_DRIVER_GLOBALS pFxDriverGlobals; FxCollectionEntry* cur, *end; FxIoResList* pList; FxResourceIo* pObject; KIRQL irql;
FxObjectHandleGetPtrAndGlobals(GetFxDriverGlobals(DriverGlobals), ResourceList, FX_TYPE_IO_RES_LIST, (PVOID*) &pList, &pFxDriverGlobals);
FxPointerNotNull(pFxDriverGlobals, Descriptor);
if (pList->IsRemoveAllowed() == FALSE) { DoTraceLevelMessage(pFxDriverGlobals, TRACE_LEVEL_ERROR, TRACINGPNP, "Removes not allowed on WDFIORESLIST %p", ResourceList);
FxVerifierDbgBreakPoint(pFxDriverGlobals); return; }
pList->Lock(&irql);
cur = pList->Start(); end = pList->End(); pObject = NULL;
while (cur != end) { pObject = (FxResourceIo*) cur->m_Object;
if (RtlCompareMemory(&pObject->m_Descriptor, Descriptor, sizeof(*Descriptor)) == sizeof(*Descriptor)) { // // Mark both this list and its owning list as changed so when it // comes time to evaluate the entire requirements list for // changes, we do not have to iterate over all the resource lists. // pList->MarkChanged(); pList->m_OwningList->MarkChanged();
pList->RemoveEntry(cur); break; }
// // Set to NULL so that we do not delete it if this is the last item in // the list. // pObject = NULL;
cur = cur->Next(); }
pList->Unlock(irql);
if (pObject != NULL) { pObject->DeleteObject(); }}
_Must_inspect_result___drv_maxIRQL(DISPATCH_LEVEL)NTSTATUSFxCmResourceListInsertDescriptor( __in PWDF_DRIVER_GLOBALS DriverGlobals, __in WDFCMRESLIST List, __in PCM_PARTIAL_RESOURCE_DESCRIPTOR Descriptor, __in ULONG Index )/*++
Routine Description: Inserts a descriptor into a cm resource list at a particular index.
Arguments: ResourceList - list to be modified
Descriptor - descriptor to insert
Index - zero based index to insert at
Return Value: NTSTATUS
--*/{ PFX_DRIVER_GLOBALS pFxDriverGlobals; FxCmResList* pList; FxResourceCm* pObject; NTSTATUS status;
pFxDriverGlobals = GetFxDriverGlobals(DriverGlobals);
FxPointerNotNull(pFxDriverGlobals, Descriptor);
FxObjectHandleGetPtr(pFxDriverGlobals, List, FX_TYPE_CM_RES_LIST, (PVOID*) &pList);
pObject = new(pFxDriverGlobals) FxResourceCm(pFxDriverGlobals, Descriptor);
if (pObject == NULL) { return STATUS_INSUFFICIENT_RESOURCES; }
status = pObject->AssignParentObject(pList); if (!NT_SUCCESS(status)) { pObject->DeleteObject(); return status; }
return pList->AddAt(Index, pObject);}
_Must_inspect_result___drv_maxIRQL(DISPATCH_LEVEL)NTSTATUSNTAPIWDFEXPORT(WdfCmResourceListInsertDescriptor)( __in PWDF_DRIVER_GLOBALS DriverGlobals, __in WDFCMRESLIST List, __in PCM_PARTIAL_RESOURCE_DESCRIPTOR Descriptor, __in ULONG Index )/*++
Routine Description: Inserts a descriptor into a cm resource list at a particular index.
Arguments: ResourceList - list to be modified
Descriptor - descriptor to insert
Index - zero based index to insert at
Return Value: NTSTATUS
--*/{ DDI_ENTRY();
return FxCmResourceListInsertDescriptor(DriverGlobals, List, Descriptor, Index);}
_Must_inspect_result___drv_maxIRQL(DISPATCH_LEVEL)NTSTATUSNTAPIWDFEXPORT(WdfCmResourceListAppendDescriptor)( __in PWDF_DRIVER_GLOBALS DriverGlobals, __in WDFCMRESLIST List, __in PCM_PARTIAL_RESOURCE_DESCRIPTOR Descriptor )/*++
Routine Description: Appends a descriptor to a cm resource list
Arguments: ResourceList - list to be modified
Descriptor - item to be appended
Return Value: NTSTATUS
--*/{ DDI_ENTRY();
return FxCmResourceListInsertDescriptor(DriverGlobals, List, Descriptor, WDF_INSERT_AT_END);}
__drv_maxIRQL(DISPATCH_LEVEL)ULONGNTAPIWDFEXPORT(WdfCmResourceListGetCount)( __in PWDF_DRIVER_GLOBALS DriverGlobals, __in WDFCMRESLIST List )/*++
Routine Description: Returns the number of cm descriptors in the resource list
Arguments: ResourceList - resource list whose count will be returned
Return Value: number of elements in the list
--*/{ FxCmResList* pList;
FxObjectHandleGetPtr(GetFxDriverGlobals(DriverGlobals), List, FX_TYPE_CM_RES_LIST, (PVOID*) &pList);
return pList->GetCount();}
__drv_maxIRQL(DISPATCH_LEVEL)PCM_PARTIAL_RESOURCE_DESCRIPTORNTAPIWDFEXPORT(WdfCmResourceListGetDescriptor)( __in PWDF_DRIVER_GLOBALS DriverGlobals, __in WDFCMRESLIST List, __in ULONG Index )/*++
Routine Description: Retrieves a cm resource desciptor for a given index in the resource list
Arguments: ResourceList - list being looked up
Index - zero based index into the list to find the value of
Return Value: pointer to a cm resource descriptor upon success, NULL upon error
--*/{ DDI_ENTRY();
FxCmResList* pList;
FxObjectHandleGetPtr(GetFxDriverGlobals(DriverGlobals), List, FX_TYPE_CM_RES_LIST, (PVOID*) &pList);
return pList->GetDescriptor(Index);}
__drv_maxIRQL(DISPATCH_LEVEL)VOIDNTAPIWDFEXPORT(WdfCmResourceListRemove)( __in PWDF_DRIVER_GLOBALS DriverGlobals, __in WDFCMRESLIST List, __in ULONG Index )/*++
Routine Description: Removes a descriptor in an cm resource list
Arguments: ResourceList - resource list to modify
Index - zero based index into the list in which to remove the descriptor
Return Value: None
--*/{ DDI_ENTRY();
PFX_DRIVER_GLOBALS pFxDriverGlobals; FxCmResList* pList;
FxObjectHandleGetPtrAndGlobals(GetFxDriverGlobals(DriverGlobals), List, FX_TYPE_CM_RES_LIST, (PVOID*) &pList, &pFxDriverGlobals);
if (pList->RemoveAndDelete(Index) == FALSE) { DoTraceLevelMessage( pFxDriverGlobals, TRACE_LEVEL_ERROR, TRACINGPNP, "WDFCMRESLIST %p, could not remove list at index %d (not found), " "list item count is %d", List, Index, pList->Count());
FxVerifierDbgBreakPoint(pFxDriverGlobals); }}
__drv_maxIRQL(DISPATCH_LEVEL)VOIDNTAPIWDFEXPORT(WdfCmResourceListRemoveByDescriptor)( __in PWDF_DRIVER_GLOBALS DriverGlobals, __in WDFCMRESLIST List, __in PCM_PARTIAL_RESOURCE_DESCRIPTOR Descriptor )/*++
Routine Description: Removes a descriptor by value in a given cm resource list. Equality is determined by RtlCompareMemory.
Arguments: ResourceList - the io resource list to modify
Descriptor - pointer to a descriptor to remove.
Return Value: None
--*/{ DDI_ENTRY();
PFX_DRIVER_GLOBALS pFxDriverGlobals; FxCollectionEntry* cur; FxCollectionEntry* end; FxCmResList* pList; FxResourceCm* pObject; KIRQL irql;
FxObjectHandleGetPtrAndGlobals(GetFxDriverGlobals(DriverGlobals), List, FX_TYPE_CM_RES_LIST, (PVOID*) &pList, &pFxDriverGlobals);
FxPointerNotNull(pFxDriverGlobals, Descriptor);
if (pList->IsRemoveAllowed() == FALSE) { DoTraceLevelMessage(pFxDriverGlobals, TRACE_LEVEL_ERROR, TRACINGPNP, "Removes not allowed on WDFCMRESLIST %p", List);
FxVerifierDbgBreakPoint(pFxDriverGlobals); return; }
pList->Lock(&irql);
cur = pList->Start(); end = pList->End(); pObject = NULL;
while (cur != end) { pObject = (FxResourceCm*) cur->m_Object;
if (RtlCompareMemory(&pObject->m_Descriptor, Descriptor, sizeof(*Descriptor)) == sizeof(*Descriptor)) { pList->MarkChanged();
pList->RemoveEntry(cur); break; }
// // Set to NULL so that we do not delete it if this is the last item in // the list. // pObject = NULL;
cur = cur->Next(); }
pList->Unlock(irql);
if (pObject != NULL) { pObject->DeleteObject(); pObject = NULL; }}
} // extern "C"