Something went wrong. Try again.
Reactos
Something went wrong. Try again.
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390/*++
Copyright (c) Microsoft Corporation
Module Name:
FxObjectApi.cpp
Abstract:
Author:
Environment:
kernel mode only
Revision History:
--*/
#include "fxobjectpch.hpp"
extern "C" {
#if defined(EVENT_TRACING)#include "FxObjectAPI.tmh"#endif
}
extern "C" {
__drv_maxIRQL(DISPATCH_LEVEL)WDFAPIVOIDNTAPIWDFEXPORT(WdfObjectReferenceActual)( __in PWDF_DRIVER_GLOBALS DriverGlobals, __in WDFOBJECT Object, __in_opt PVOID Tag, __in LONG Line, __in PSTR File )/*++
Routine Description: Adds an explicit reference that was taken on an object.
Arguments: Object - the object to reference Tag - The tag used to track this reference. If not matched on dereference, a breakpoint is hit. Tags are only tracked when enabled via the registry or WDF verifier. Line - the caller's line number making the call File - the caller's file name making the call
Return Value: None. We do not return the current reference count.
--*/{ DDI_ENTRY();
FxPointerNotNull(GetFxDriverGlobals(DriverGlobals), Object);
FxObject::_ReferenceActual( Object, Tag, Line, File );}
__drv_maxIRQL(DISPATCH_LEVEL)WDFAPIVOIDNTAPIWDFEXPORT(WdfObjectDereferenceActual)( __in PWDF_DRIVER_GLOBALS DriverGlobals, __in WDFOBJECT Object, __in_opt PVOID Tag, __in LONG Line, __in PSTR File )/*++
Routine Description: Removes an explicit reference that was taken on an object.
Arguments: Object - the object to dereference Tag - The tag used when referencing the Object, if not matched, a breakpoint is hit. Tags are only tracked when enabled via the registry or WDF verifier. Line - the caller's line number making the call File - the caller's file name making the call
Return Value: None. We do not return the current reference count.
--*/{ DDI_ENTRY();
FxPointerNotNull(GetFxDriverGlobals(DriverGlobals), Object);
FxObject::_DereferenceActual( Object, Tag, Line, File );}
FxCallbackLock*FxGetCallbackLock( FxObject* Object )
/*++
Routine Description:
This returns the proper FxCallbackLock pointer for the object.
It returns NULL if an FxCallbackLock is not valid for the object.
Arguments:
Object - Pointer to object to retrieve the callback lock pointer for
Returns:
FxCallbackLock*
--*/
{ NTSTATUS status; IFxHasCallbacks* ihcb; FxQueryInterfaceParams params = { (PVOID*) &ihcb, FX_TYPE_IHASCALLBACKS, 0 };
ihcb = NULL;
// // Query the object for the IFxHasCallbacks interface. Objects that // have callback locks must support this interface. // status = Object->QueryInterface(¶ms); if (!NT_SUCCESS(status)) { return NULL; }
return ihcb->GetCallbackLockPtr(NULL);}
__drv_maxIRQL(DISPATCH_LEVEL)WDFAPIVOIDNTAPIWDFEXPORT(WdfObjectAcquireLock)( __in PWDF_DRIVER_GLOBALS DriverGlobals, __in _Requires_lock_not_held_(_Curr_) _Acquires_lock_(_Curr_) WDFOBJECT Object ){ DDI_ENTRY();
FxObject* pObject; FxCallbackLock* pLock; PFX_DRIVER_GLOBALS pFxDriverGlobals; KIRQL irql;
FxObjectHandleGetPtrAndGlobals(GetFxDriverGlobals(DriverGlobals), Object, FX_TYPE_OBJECT, (PVOID*)&pObject, &pFxDriverGlobals);
// // If Lock Verifier on, validate whether its correct to // make this call // if (pFxDriverGlobals->FxVerifierLock) { // // Check IRQL Level, etc. // }
// // Get the CallbackLock for the object // pLock = FxGetCallbackLock(pObject);
if (pLock == NULL) { DoTraceLevelMessage(pFxDriverGlobals, TRACE_LEVEL_ERROR, TRACINGDEVICE, "Invalid to call on WDFOBJECT 0x%p", Object); FxVerifierDbgBreakPoint(pFxDriverGlobals); FxVerifierBugCheck(pFxDriverGlobals, WDF_INVALID_LOCK_OPERATION, (ULONG_PTR)Object, (ULONG_PTR)NULL ); return; }
pLock->Lock(&irql); pLock->m_PreviousIrql = irql;
return;}
__drv_maxIRQL(DISPATCH_LEVEL)WDFAPIVOIDNTAPIWDFEXPORT(WdfObjectReleaseLock)( __in PWDF_DRIVER_GLOBALS DriverGlobals, __in _Requires_lock_held_(_Curr_) _Releases_lock_(_Curr_) WDFOBJECT Object ){ DDI_ENTRY();
PFX_DRIVER_GLOBALS pFxDriverGlobals; FxObject* pObject; FxCallbackLock* pLock;
FxObjectHandleGetPtrAndGlobals(GetFxDriverGlobals(DriverGlobals), Object, FX_TYPE_OBJECT, (PVOID*)&pObject, &pFxDriverGlobals);
// // If Lock Verifier on, validate whether its correct to // make this call // if (pFxDriverGlobals->FxVerifierLock) { // // Check IRQL Level, etc. // }
// // Get the CallbackLock for the object // pLock = FxGetCallbackLock(pObject); if (pLock == NULL) { DoTraceLevelMessage(pFxDriverGlobals, TRACE_LEVEL_ERROR, TRACINGDEVICE, "Invalid to call on WDFOBJECT 0x%p",Object); FxVerifierDbgBreakPoint(pFxDriverGlobals); FxVerifierBugCheck(pFxDriverGlobals, WDF_INVALID_LOCK_OPERATION, (ULONG_PTR)Object, (ULONG_PTR)NULL ); return; }
pLock->Unlock(pLock->m_PreviousIrql);
return;}
__drv_maxIRQL(DISPATCH_LEVEL)WDFAPIVOIDNTAPIWDFEXPORT(WdfObjectDelete)( __in PWDF_DRIVER_GLOBALS DriverGlobals, __in WDFOBJECT Object ){ DDI_ENTRY();
PFX_DRIVER_GLOBALS pFxDriverGlobals; FxObject* pObject;
FxObjectHandleGetPtrAndGlobals(GetFxDriverGlobals(DriverGlobals), Object, FX_TYPE_OBJECT, (PVOID*)&pObject, &pFxDriverGlobals);
// // The object may not allow the Delete DDI // if (pObject->IsNoDeleteDDI()) { DoTraceLevelMessage( pFxDriverGlobals, TRACE_LEVEL_ERROR, TRACINGDEVICE, "Attempt to Delete an Object Which does not allow WdfDeleteObject " "Handle 0x%p, %!STATUS!", Object, STATUS_CANNOT_DELETE); FxVerifierDbgBreakPoint(pFxDriverGlobals); } else { pObject->DeleteObject(); }}
_Must_inspect_result___drv_maxIRQL(DISPATCH_LEVEL)WDFAPINTSTATUSNTAPIWDFEXPORT(WdfObjectQuery)( __in PWDF_DRIVER_GLOBALS DriverGlobals, __in WDFOBJECT Object, __in CONST GUID* Guid, __in ULONG QueryBufferLength, __out_bcount(QueryBufferLength) PVOID QueryBuffer )
/*++
Routine Description:
Query the object handle for specific information
This allows dynamic extensions to DDI's.
Currently, it is used to allow test hooks for verification which are not available in a production release.
Arguments:
Object - Handle to object for the query
Guid - GUID to represent the information/DDI to query for
QueryBufferLength - Length of QueryBuffer to return data in
QueryBuffer - Pointer to QueryBuffer
Returns:
NTSTATUS
--*/
{ DDI_ENTRY();
FxObject* p;
FxObjectHandleGetPtr(GetFxDriverGlobals(DriverGlobals), Object, FX_TYPE_OBJECT, (PVOID*)&p);
return FxObject::_ObjectQuery(p, Guid, QueryBufferLength, QueryBuffer);}
} // extern "C" for all functions