Something went wrong. Try again.
Reactos
Something went wrong. Try again.
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390/*++
Copyright (c) Microsoft Corporation
Module Name:
FxCollectionApi.cpp
Abstract:
This module implements the "C" interface to the collection object.
Author:
Environment:
Both kernel and user mode
Revision History:
--*/
#include "fxsupportpch.hpp"
extern "C" {// #include "FxCollectionApi.tmh"}
//// Extern the entire file//extern "C" {_Must_inspect_result___drv_maxIRQL(DISPATCH_LEVEL)NTSTATUSNTAPIWDFEXPORT(WdfCollectionCreate)( __in PWDF_DRIVER_GLOBALS DriverGlobals, __in_opt PWDF_OBJECT_ATTRIBUTES CollectionAttributes, __out WDFCOLLECTION *Collection ){ DDI_ENTRY();
PFX_DRIVER_GLOBALS pFxDriverGlobals; NTSTATUS status; FxCollection *pCollection; WDFCOLLECTION hCol;
pFxDriverGlobals = GetFxDriverGlobals(DriverGlobals);
// // Get the parent's globals if it is present // if (NT_SUCCESS(FxValidateObjectAttributesForParentHandle( pFxDriverGlobals, CollectionAttributes))) { FxObject* pParent;
FxObjectHandleGetPtrAndGlobals(pFxDriverGlobals, CollectionAttributes->ParentObject, FX_TYPE_OBJECT, (PVOID*)&pParent, &pFxDriverGlobals); }
FxPointerNotNull(pFxDriverGlobals, Collection);
*Collection = NULL;
status = FxValidateObjectAttributes(pFxDriverGlobals, CollectionAttributes); if (!NT_SUCCESS(status)) { return status; }
pCollection = new (pFxDriverGlobals, CollectionAttributes) FxCollection(pFxDriverGlobals);
if (pCollection != NULL) { status = pCollection->Commit(CollectionAttributes, (WDFOBJECT*)&hCol);
if (NT_SUCCESS(status)) { *Collection = hCol; } else { DoTraceLevelMessage(pFxDriverGlobals, TRACE_LEVEL_ERROR, TRACINGERROR, "Could not create collection object: %!STATUS!", status);
pCollection->DeleteFromFailedCreate(); } } else { DoTraceLevelMessage(pFxDriverGlobals, TRACE_LEVEL_ERROR, TRACINGERROR, "Could not create collection object: " "STATUS_INSUFFICIENT_RESOURCES" ); status = STATUS_INSUFFICIENT_RESOURCES; }
return status;}
__drv_maxIRQL(DISPATCH_LEVEL)ULONGNTAPIWDFEXPORT(WdfCollectionGetCount)( __in PWDF_DRIVER_GLOBALS DriverGlobals, __in WDFCOLLECTION Collection ){ DDI_ENTRY();
FxCollection *pCollection; KIRQL irql; ULONG count;
FxObjectHandleGetPtr(GetFxDriverGlobals(DriverGlobals), Collection, FX_TYPE_COLLECTION, (PVOID *)&pCollection);
pCollection->Lock(&irql); count = pCollection->Count(); pCollection->Unlock(irql);
return count;}
_Must_inspect_result___drv_maxIRQL(DISPATCH_LEVEL)NTSTATUSNTAPIWDFEXPORT(WdfCollectionAdd)( __in PWDF_DRIVER_GLOBALS DriverGlobals, __in WDFCOLLECTION Collection, __in WDFOBJECT Object ){ DDI_ENTRY();
PFX_DRIVER_GLOBALS pFxDriverGlobals; FxCollection *pCollection; FxObject *pObject; NTSTATUS status; KIRQL irql;
FxObjectHandleGetPtrAndGlobals(GetFxDriverGlobals(DriverGlobals), Collection, FX_TYPE_COLLECTION, (PVOID*) &pCollection, &pFxDriverGlobals);
FxObjectHandleGetPtr(pFxDriverGlobals, Object, FX_TYPE_OBJECT, (PVOID*) &pObject);
pCollection->Lock(&irql); status = pCollection->Add(pObject) ? STATUS_SUCCESS : STATUS_UNSUCCESSFUL; pCollection->Unlock(irql);
return status;}
__drv_maxIRQL(DISPATCH_LEVEL)VOIDNTAPIWDFEXPORT(WdfCollectionRemoveItem)( __in PWDF_DRIVER_GLOBALS DriverGlobals, __in WDFCOLLECTION Collection, __in ULONG Index ){ DDI_ENTRY();
PFX_DRIVER_GLOBALS pFxDriverGlobals; FxCollection* pCollection; FxCollectionEntry* pEntry; FxObject* pObject; NTSTATUS status; KIRQL irql;
FxObjectHandleGetPtrAndGlobals(GetFxDriverGlobals(DriverGlobals), Collection, FX_TYPE_COLLECTION, (PVOID*) &pCollection, &pFxDriverGlobals);
pCollection->Lock(&irql);
pEntry = pCollection->FindEntry(Index);
if (pEntry != NULL) { pObject = pEntry->m_Object; pCollection->CleanupEntry(pEntry); status = STATUS_SUCCESS; } else { pObject = NULL; status = STATUS_NOT_FOUND; }
pCollection->Unlock(irql);
if (pObject != NULL) { pCollection->CleanupEntryObject(pObject); }
if (!NT_SUCCESS(status)) { DoTraceLevelMessage( pFxDriverGlobals, TRACE_LEVEL_ERROR, TRACINGERROR, "Index %d is not valid in WDFCOLLECTION %p (count is %d), %!STATUS!", Index, Collection, pCollection->Count(), status); FxVerifierDbgBreakPoint(pFxDriverGlobals); }}
__drv_maxIRQL(DISPATCH_LEVEL)VOIDNTAPIWDFEXPORT(WdfCollectionRemove)( __in PWDF_DRIVER_GLOBALS DriverGlobals, __in WDFCOLLECTION Collection, __in WDFOBJECT Item ){ DDI_ENTRY();
PFX_DRIVER_GLOBALS pFxDriverGlobals; FxCollection *pCollection; FxCollectionEntry *pEntry; FxObject* pObject; NTSTATUS status; KIRQL irql;
FxObjectHandleGetPtrAndGlobals(GetFxDriverGlobals(DriverGlobals), Collection, FX_TYPE_COLLECTION, (PVOID*) &pCollection, &pFxDriverGlobals);
FxObjectHandleGetPtr(pFxDriverGlobals, Item, FX_TYPE_OBJECT, (PVOID*) &pObject);
pCollection->Lock(&irql);
pEntry = pCollection->FindEntryByObject(pObject);
if (pEntry != NULL) { pCollection->CleanupEntry(pEntry); status = STATUS_SUCCESS; } else { pObject = NULL; status = STATUS_NOT_FOUND; }
pCollection->Unlock(irql);
if (pObject != NULL) { pCollection->CleanupEntryObject(pObject); }
if (!NT_SUCCESS(status)) { DoTraceLevelMessage(pFxDriverGlobals, TRACE_LEVEL_ERROR, TRACINGERROR, "WDFOBJECT %p not in WDFCOLLECTION %p, %!STATUS!", Item, Collection, status); FxVerifierDbgBreakPoint(pFxDriverGlobals); }}
__drv_maxIRQL(DISPATCH_LEVEL)WDFOBJECTNTAPIWDFEXPORT(WdfCollectionGetItem)( __in PWDF_DRIVER_GLOBALS DriverGlobals, __in WDFCOLLECTION Collection, __in ULONG Index ){ DDI_ENTRY();
FxCollection *pCollection; FxObject *pObject; KIRQL irql;
FxObjectHandleGetPtr(GetFxDriverGlobals(DriverGlobals), Collection, FX_TYPE_COLLECTION, (PVOID*) &pCollection);
pCollection->Lock(&irql); pObject = pCollection->GetItem(Index); pCollection->Unlock(irql);
if (pObject == NULL) { return NULL; }
return pObject->GetObjectHandle();}
__drv_maxIRQL(DISPATCH_LEVEL)WDFOBJECTNTAPIWDFEXPORT(WdfCollectionGetFirstItem)( __in PWDF_DRIVER_GLOBALS DriverGlobals, __in WDFCOLLECTION Collection ){ DDI_ENTRY();
FxCollection *pCollection; FxObject* pObject; KIRQL irql;
FxObjectHandleGetPtr(GetFxDriverGlobals(DriverGlobals), Collection, FX_TYPE_COLLECTION, (PVOID*) &pCollection);
pCollection->Lock(&irql); pObject = pCollection->GetFirstItem(); pCollection->Unlock(irql);
if (pObject != NULL) { return pObject->GetObjectHandle(); } else { return NULL; }}
__drv_maxIRQL(DISPATCH_LEVEL)WDFOBJECTNTAPIWDFEXPORT(WdfCollectionGetLastItem)( __in PWDF_DRIVER_GLOBALS DriverGlobals, __in WDFCOLLECTION Collection ){ DDI_ENTRY();
FxCollection *pCollection; FxObject* pObject; KIRQL irql;
FxObjectHandleGetPtr(GetFxDriverGlobals(DriverGlobals), Collection, FX_TYPE_COLLECTION, (PVOID*) &pCollection);
pCollection->Lock(&irql); pObject = pCollection->GetLastItem(); pCollection->Unlock(irql);
if (pObject != NULL) { return pObject->GetObjectHandle(); } else { return NULL; }}
} // extern "C" of entire file