ReactOS  0.4.15-dev-2996-gf777e6b
FxCmResList Class Reference

#include <fxresource.hpp>

Inheritance diagram for FxCmResList:
Collaboration diagram for FxCmResList:

Public Member Functions

WDFCMRESLIST GetHandle (VOID)
 
_Must_inspect_result_ NTSTATUS BuildFromWdmList (__in PCM_RESOURCE_LIST ResourceList, __in UCHAR AccessFlags)
 
_Must_inspect_result_ PCM_RESOURCE_LIST CreateWdmList (__in __drv_strictTypeMatch(__drv_typeExpr) POOL_TYPE PoolType=PagedPool)
 
ULONG GetCount (VOID)
 
PCM_PARTIAL_RESOURCE_DESCRIPTOR GetDescriptor (__in ULONG Index)
 
__inline void LockResourceTable ()
 
__inline void UnlockResourceTable ()
 
NTSTATUS BuildRegisterResourceTable (VOID)
 
NTSTATUS BuildPortResourceTable (VOID)
 
VOID UpdateRegisterResourceEntryLocked (__in FxRegisterResourceInfo *Entry, __in PVOID SystemMappedAddress, __in SIZE_T NumberOfBytes, __in PVOID UsermodeMappedAddress)
 
VOID ClearRegisterResourceEntryLocked (__in FxRegisterResourceInfo *Entry)
 
HRESULT ValidateRegisterPhysicalAddressRange (__in PHYSICAL_ADDRESS PhysicalAddress, __in SIZE_T Size, __out FxRegisterResourceInfo **TableEntry)
 
HRESULT ValidateRegisterSystemBaseAddress (__in PVOID Address, __out PVOID *UsermodeBaseAddress)
 
HRESULT ValidateRegisterSystemAddressRange (__in PVOID SystemAddress, __in SIZE_T Length, __out_opt PVOID *UsermodeAddress)
 
HRESULT ValidateAndClearMapping (__in PVOID Address, __in SIZE_T Length)
 
HRESULT ValidatePortAddressRange (__in PVOID Address, __in SIZE_T Length)
 
SIZE_T GetResourceLength (__in PCM_PARTIAL_RESOURCE_DESCRIPTOR Descriptor, __out_opt PHYSICAL_ADDRESS *Start)
 
HRESULT MapIoSpaceWorker (__in PHYSICAL_ADDRESS PhysicalAddress, __in SIZE_T NumberOfBytes, __in MEMORY_CACHING_TYPE CacheType, __deref_out VOID **PseudoBaseAddress)
 
VOID ValidateResourceUnmap (VOID)
 
VOID DeleteRegisterResourceTable (VOID)
 
VOID DeletePortResourceTable (VOID)
 
_Must_inspect_result_ NTSTATUS CheckForConnectionResources (VOID)
 
BOOLEAN HasConnectionResources (VOID)
 
- Public Member Functions inherited from FxResourceCollection
BOOLEAN RemoveAndDelete (__in ULONG Index)
 
_Must_inspect_result_ NTSTATUS AddAt (__in ULONG Index, __in FxObject *Object)
 
BOOLEAN IsRemoveAllowed (VOID)
 
BOOLEAN IsAddAllowed (VOID)
 
VOID MarkChanged (VOID)
 
BOOLEAN IsChanged (VOID)
 
- Public Member Functions inherited from FxCollection
 FxCollection (__in PFX_DRIVER_GLOBALS FxDriverGlobals)
 
 ~FxCollection (VOID)
 
BOOLEAN Add (__in FxObject *Item)
 
VOID StealCollection (__in FxCollection *Collection)
 
- Public Member Functions inherited from FxNonPagedObject
 FxNonPagedObject (__in WDFTYPE Type, __in USHORT Size, __in PFX_DRIVER_GLOBALS FxDriverGlobals)
 
 FxNonPagedObject (__in WDFTYPE Type, __in USHORT Size, __in PFX_DRIVER_GLOBALS FxDriverGlobals, __in FxObjectType ObjectType)
 
virtual ~FxNonPagedObject (VOID)
 
 _Acquires_lock_ (this->m_NPLock.m_Lock) __drv_maxIRQL(DISPATCH_LEVEL) __drv_setsIRQL(DISPATCH_LEVEL) VOID Lock(__out __drv_deref(__drv_savesIRQL) PKIRQL PreviousIrql)
 
 _Releases_lock_ (this->m_NPLock.m_Lock) __drv_requiresIRQL(DISPATCH_LEVEL) __inline VOID Unlock(__in __drv_restoresIRQL KIRQL PreviousIrql)
 
 _Acquires_lock_ (this->m_NPLock.m_Lock) __drv_requiresIRQL(DISPATCH_LEVEL) VOID LockAtDispatch(VOID)
 
 _Requires_lock_held_ (this->m_NPLock.m_Lock) _Releases_lock_(this -> m_NPLock.m_Lock) __drv_requiresIRQL(DISPATCH_LEVEL) __inline VOID UnlockFromDispatch(VOID)
 
- Public Member Functions inherited from FxObject
PVOID GetCOMWrapper ()
 
void SetCOMWrapper (__drv_aliasesMem PVOID Wrapper)
 
 FxObject (__in WDFTYPE Type, __in USHORT Size, __in PFX_DRIVER_GLOBALS FxDriverGlobals)
 
virtual ~FxObject (VOID)
 
PVOID __inline operator new (__in size_t Size, __in PFX_DRIVER_GLOBALS FxDriverGlobals, __in FxObjectType Type)
 
PVOID __inline operator new (__in size_t Size, __in PFX_DRIVER_GLOBALS FxDriverGlobals, __in_opt PWDF_OBJECT_ATTRIBUTES Attributes, __in USHORT ExtraSize=0)
 
VOID operator delete (__in PVOID Memory)
 
VOID SetNoContextHeader (VOID)
 
PVOID __inline GetObjectHandle (VOID)
 
__inline FxContextHeaderGetContextHeader (VOID)
 
__inline PFX_DRIVER_GLOBALS GetDriverGlobals (VOID)
 
WDFTYPE GetType (VOID)
 
USHORT GetObjectSize (VOID)
 
LONG GetRefCnt (VOID)
 
FxTagTrackerGetTagTracker (VOID)
 
CfxDeviceGetDevice (VOID)
 
CfxDeviceBaseGetDeviceBase (VOID)
 
VOID SetDeviceBase (__in CfxDeviceBase *DeviceBase)
 
__inline VOID CallCleanup (VOID)
 
ULONG __inline AddRef (__in_opt PVOID Tag=NULL, __in LONG Line=0, __in_opt PSTR File=NULL)
 
virtual ULONG Release (__in_opt PVOID Tag=NULL, __in LONG Line=0, __in_opt PSTR File=NULL)
 
virtual ULONG AddRefOverride (__in WDFOBJECT_OFFSET Offset, __in_opt PVOID Tag=NULL, __in LONG Line=0, __in_opt PSTR File=NULL)
 
virtual ULONG ReleaseOverride (__in WDFOBJECT_OFFSET Offset, __in_opt PVOID Tag=NULL, __in LONG Line=0, __in_opt PSTR File=NULL)
 
virtual _Must_inspect_result_ NTSTATUS QueryInterface (__in FxQueryInterfaceParams *Params)
 
VOID MarkTraceState (VOID)
 
BOOLEAN __inline IsTraceState (VOID)
 
VOID __inline TraceDroppedEvent (__in FxObjectDroppedEvent Event)
 
VOID MarkPassiveDispose (__in FxObjectLockState State=ObjectLock)
 
VOID MarkPassiveCallbacks (__in FxObjectLockState State=ObjectLock)
 
VOID MarkForceDisposeThread (__in FxObjectLockState State=ObjectLock)
 
BOOLEAN IsPassiveCallbacks (__in BOOLEAN AcquireLock=TRUE)
 
BOOLEAN IsPassiveDispose (__in BOOLEAN AcquireLock=TRUE)
 
BOOLEAN IsForceDisposeThread (__in BOOLEAN AcquireLock=TRUE)
 
VOID MarkCommitted (VOID)
 
BOOLEAN IsCommitted (VOID)
 
VOID MarkDisposeOverride (__in FxObjectLockState State=ObjectLock)
 
VOID MarkNoDeleteDDI (__in FxObjectLockState State=ObjectLock)
 
BOOLEAN IsNoDeleteDDI (VOID)
 
_Must_inspect_result_ NTSTATUS Commit (__in_opt PWDF_OBJECT_ATTRIBUTES Attributes, __out_opt WDFOBJECT *ObjectHandle, __in_opt FxObject *Parent=NULL, __in BOOLEAN AssignDriverAsDefaultParent=TRUE)
 
VOID DeleteFromFailedCreate (VOID)
 
VOID ClearEvtCallbacks (VOID)
 
BOOLEAN EarlyDispose (VOID)
 
virtual VOID DeleteObject (VOID)
 
virtual BOOLEAN Dispose (VOID)
 
_Must_inspect_result_ NTSTATUS AssignParentObject (__in FxObject *ParentObject)
 
_Must_inspect_result_ NTSTATUS AddContext (__in FxContextHeader *Header, __in PVOID *Context, __in PWDF_OBJECT_ATTRIBUTES Attributes)
 
_Must_inspect_result_ NTSTATUS RemoveParentAssignment (VOID)
 
_Must_inspect_result_ FxObjectGetParentObjectReferenced (__in PVOID Tag)
 
BOOLEAN IsDisposed (VOID)
 
- Public Member Functions inherited from FxCollectionInternal
 FxCollectionInternal (VOID)
 
 ~FxCollectionInternal (VOID)
 
_Must_inspect_result_ FxCollectionEntryFindEntry (__in ULONG Index)
 
_Must_inspect_result_ FxCollectionEntryFindEntryByObject (__in FxObject *Object)
 
ULONG Count (VOID)
 
BOOLEAN Add (__in PFX_DRIVER_GLOBALS FxDriverGlobals, __in FxObject *Item)
 
_Must_inspect_result_ FxObjectGetItem (__in ULONG Index)
 
_Must_inspect_result_ FxObjectGetFirstItem (VOID)
 
_Must_inspect_result_ FxObjectGetLastItem (VOID)
 
NTSTATUS Remove (__in ULONG Index)
 
VOID CleanupEntry (__in FxCollectionEntry *Entry)
 
VOID CleanupEntryObject (__in FxObject *Object)
 
NTSTATUS RemoveEntry (__in FxCollectionEntry *Entry)
 
_Must_inspect_result_ NTSTATUS RemoveItem (__in FxObject *Item)
 
_Must_inspect_result_ FxCollectionEntryStart (VOID)
 
_Must_inspect_result_ FxCollectionEntryEnd (VOID)
 
VOID Clear (VOID)
 

Static Public Member Functions

static _Must_inspect_result_ NTSTATUS _CreateAndInit (__in FxCmResList **ResourceList, __in PFX_DRIVER_GLOBALS FxDriverGlobals, __in CfxDevice *Device, __in_opt PWDF_OBJECT_ATTRIBUTES ListAttributes, __in UCHAR AccessFlags)
 
- Static Public Member Functions inherited from FxObject
static FxObject_FromDisposeEntry (__in PSINGLE_LIST_ENTRY Entry)
 
static FxObject_GetObjectFromHandle (__in WDFOBJECT Handle, __inout PWDFOBJECT_OFFSET ObjectOffset)
 
static PVOID __inline _ToHandle (__in FxObject *Object)
 
static VOID __inline _ReferenceActual (__in WDFOBJECT Object, __in_opt PVOID Tag, __in LONG Line, __in PSTR File)
 
static VOID __inline _DereferenceActual (__in WDFOBJECT Object, __in_opt PVOID Tag, __in LONG Line, __in PSTR File)
 
static PVOID _GetDebugBase (__in FxObject *Object)
 
static PFX_POOL_HEADER _CleanupPointer (__in PFX_DRIVER_GLOBALS FxDriverGlobals, __in FxObject *Object)
 
static _Must_inspect_result_ NTSTATUS _GetEffectiveLock (__in FxObject *Object, __in_opt IFxHasCallbacks *Callbacks, __in BOOLEAN AutomaticLocking, __in BOOLEAN PassiveCallbacks, __out FxCallbackLock **CallbackLock, __out_opt FxObject **CallbackLockObject)
 
static _Must_inspect_result_ NTSTATUS _ObjectQuery (_In_ FxObject *Object, _In_ CONST GUID *Guid, _In_ ULONG QueryBufferLength, _Out_writes_bytes_(QueryBufferLength) PVOID QueryBuffer)
 

Protected Member Functions

 FxCmResList (__in PFX_DRIVER_GLOBALS FxDriverGlobals, __in UCHAR AccessFlags)
 
 ~FxCmResList ()
 
- Protected Member Functions inherited from FxResourceCollection
 FxResourceCollection (__in PFX_DRIVER_GLOBALS FxDriverGlobals, __in WDFTYPE Type, __in USHORT Size, __in UCHAR AccessFlags=FxResourceNoAccess)
 
- Protected Member Functions inherited from FxCollection
 FxCollection (__in PFX_DRIVER_GLOBALS FxDriverGlobals, __in WDFTYPE Type, __in USHORT Size)
 
- Protected Member Functions inherited from FxObject
 FxObject (__in WDFTYPE Type, __in USHORT Size, __in PFX_DRIVER_GLOBALS FxDriverGlobals, __in FxObjectType ObjectType)
 
FxObjectDebugExtensionGetDebugExtension (VOID)
 
BOOLEAN IsDebug (VOID)
 
VOID AllocateTagTracker (__in WDFTYPE Type)
 
virtual VOID SelfDestruct (VOID)
 
PVOID __inline GetObjectHandleUnchecked (VOID)
 
VOID __inline DestroyChildren (VOID)
 
VOID DeleteEarlyDisposedObject (VOID)
 
- Protected Member Functions inherited from FxCollectionInternal
_Must_inspect_result_ FxCollectionEntryAllocateEntry (__in PFX_DRIVER_GLOBALS FxDriverGlobals)
 
VOID AddEntry (__in FxCollectionEntry *Node, __in FxObject *Item)
 

Protected Attributes

FxRegisterResourceInfom_RegisterResourceTable
 
ULONG m_RegisterResourceTableSizeCe
 
FxPortResourceInfom_PortResourceTable
 
ULONG m_PortResourceTableSizeCe
 
BOOLEAN m_HasConnectionResources
 
MxLock m_ResourceTableLock
 
- Protected Attributes inherited from FxObject
union {
   CfxDeviceBase *   m_DeviceBase
 
   CfxDevice *   m_Device
 
}; 
 
- Protected Attributes inherited from FxCollectionInternal
ULONG m_Count
 
LIST_ENTRY m_ListHead
 

Additional Inherited Members

- Public Attributes inherited from FxResourceCollection
UCHAR m_AccessFlags
 
BOOLEAN m_Changed
 
- Static Protected Member Functions inherited from FxObject
static PVOID _GetBase (__in FxObject *Object)
 

Detailed Description

Definition at line 348 of file fxresource.hpp.

Constructor & Destructor Documentation

◆ FxCmResList()

FxCmResList::FxCmResList ( __in PFX_DRIVER_GLOBALS  FxDriverGlobals,
__in UCHAR  AccessFlags 
)
inlineprotected

Definition at line 377 of file fxresource.hpp.

380  : FxResourceCollection(FxDriverGlobals,
382  sizeof(FxCmResList),
383  AccessFlags)
384  {
385 #if (FX_CORE_MODE==FX_CORE_USER_MODE)
391 #endif // FX_CORE_USER_MODE
392  }
FxResourceCollection(__in PFX_DRIVER_GLOBALS FxDriverGlobals, __in WDFTYPE Type, __in USHORT Size, __in UCHAR AccessFlags=FxResourceNoAccess)
Definition: fxresource.hpp:282
FxRegisterResourceInfo * m_RegisterResourceTable
Definition: fxresource.hpp:355
FxPortResourceInfo * m_PortResourceTable
Definition: fxresource.hpp:361
BOOLEAN m_HasConnectionResources
Definition: fxresource.hpp:367
#define FALSE
Definition: types.h:117
ULONG m_PortResourceTableSizeCe
Definition: fxresource.hpp:362
#define NULL
Definition: types.h:112
ULONG m_RegisterResourceTableSizeCe
Definition: fxresource.hpp:356

Referenced by _CreateAndInit().

◆ ~FxCmResList()

FxCmResList::~FxCmResList ( )
protected

Definition at line 35 of file fxresourcecollectionkm.cpp.

36 {
37 }

Member Function Documentation

◆ _CreateAndInit()

static _Must_inspect_result_ NTSTATUS FxCmResList::_CreateAndInit ( __in FxCmResList **  ResourceList,
__in PFX_DRIVER_GLOBALS  FxDriverGlobals,
__in CfxDevice Device,
__in_opt PWDF_OBJECT_ATTRIBUTES  ListAttributes,
__in UCHAR  AccessFlags 
)
inlinestatic

Definition at line 400 of file fxresource.hpp.

407  {
408  NTSTATUS ntStatus;
409  FxCmResList *resList = NULL;
410 
412 
413  //
414  // Initialize
415  //
416  *ResourceList = NULL;
417 
418  //
419  // Allocate a new resource list object
420  //
421  resList = new(FxDriverGlobals, ListAttributes)
422  FxCmResList(FxDriverGlobals, AccessFlags);
423 
424  if (resList == NULL) {
425 
427 
428  DoTraceLevelMessage(FxDriverGlobals, TRACE_LEVEL_ERROR,
430  "Failed to allocate FxCmResList, "
431  "returning %!STATUS!",
432  ntStatus);
433  goto exit;
434  }
435 
436  *ResourceList = resList;
437  ntStatus = STATUS_SUCCESS;
438 
439  exit:
440  if (!NT_SUCCESS(ntStatus)) {
441  if (NULL != resList) {
442  resList->DeleteFromFailedCreate();
443  }
444  }
445  return ntStatus;
446  }
#define STATUS_INSUFFICIENT_RESOURCES
Definition: udferr_usr.h:158
#define UNREFERENCED_PARAMETER(P)
Definition: ntbasedef.h:317
LONG NTSTATUS
Definition: precomp.h:26
_Must_inspect_result_ _In_ WDFIORESREQLIST _In_opt_ PWDF_OBJECT_ATTRIBUTES _Out_ WDFIORESLIST * ResourceList
Definition: wdfresource.h:304
#define TRACINGDEVICE
Definition: dbgtrace.h:58
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:32
_Must_inspect_result_ _In_ WDFDEVICE Device
Definition: wdfchildlist.h:474
#define TRACE_LEVEL_ERROR
Definition: storswtr.h:27
DoTraceLevelMessage(pFxDriverGlobals, TRACE_LEVEL_VERBOSE, TRACINGPNP, "Enter, WDFDEVICE %p", Device)
#define NULL
Definition: types.h:112
VOID DeleteFromFailedCreate(VOID)
Definition: fxobject.cpp:391
FxCmResList(__in PFX_DRIVER_GLOBALS FxDriverGlobals, __in UCHAR AccessFlags)
Definition: fxresource.hpp:377
#define STATUS_SUCCESS
Definition: shellext.h:65
void exit(int exitcode)
Definition: _exit.c:33

Referenced by FxPkgPnp::Initialize(), and FxPkgPdo::PnpQueryResources().

◆ BuildFromWdmList()

_Must_inspect_result_ NTSTATUS FxCmResList::BuildFromWdmList ( __in PCM_RESOURCE_LIST  ResourceList,
__in UCHAR  AccessFlags 
)

Definition at line 289 of file fxresourcecollection.cpp.

308 {
310 
311  //
312  // Predispose to success
313  //
315 
316  Clear();
317 
318  m_AccessFlags = AccessFlags;
319 
320  if (WdmResourceList != NULL) {
322  ULONG count, i;
323 
324  //
325  // We only expect to see one full resource descriptor.
326  //
327  ASSERT(WdmResourceList->Count == 1);
328 
329  count = WdmResourceList->List[0].PartialResourceList.Count;
330  pDescriptor = WdmResourceList->List[0].PartialResourceList.PartialDescriptors;
331 
332  for(i = 0; i < count; i++, pDescriptor++) {
333  FxResourceCm *pResource;
334 
335  pResource = new(GetDriverGlobals())
336  FxResourceCm(GetDriverGlobals(), pDescriptor);
337 
338  if (pResource == NULL) {
340  }
341 
342  if (NT_SUCCESS(status)) {
343  status = pResource->AssignParentObject(this);
344 
345  //
346  // Since we control our own lifetime here, the assign should
347  // always work.
348  //
350 
352  }
353 
354  if (!NT_SUCCESS(status)) {
355  Clear();
356  break;
357  }
358  }
359  }
360 
361  return status;
362 }
#define STATUS_INSUFFICIENT_RESOURCES
Definition: udferr_usr.h:158
GLuint GLuint GLsizei count
Definition: gl.h:1545
LONG NTSTATUS
Definition: precomp.h:26
BOOLEAN Add(__in FxObject *Item)
#define ASSERT(a)
Definition: mode.c:44
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:32
_Must_inspect_result_ NTSTATUS AssignParentObject(__in FxObject *ParentObject)
Definition: fxobject.cpp:529
__inline PFX_DRIVER_GLOBALS GetDriverGlobals(VOID)
Definition: fxobject.hpp:734
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
#define NULL
Definition: types.h:112
unsigned int ULONG
Definition: retypes.h:1
#define STATUS_SUCCESS
Definition: shellext.h:65
static SERVICE_STATUS status
Definition: service.c:31
Definition: ps.c:97

Referenced by FxPkgPnp::PnpMatchResources(), and FxPkgFdo::PnpSendStartDeviceDownTheStackOverload().

◆ BuildPortResourceTable()

NTSTATUS FxCmResList::BuildPortResourceTable ( VOID  )

Definition at line 146 of file fxresourcecollectionum.cpp.

149 {
150  ULONG count;
151  ULONG i, index;
153  ULONG numPortDesc;
154  BOOLEAN locked = FALSE;
156 
157  count = GetCount();
158  numPortDesc = 0;
159 
160  //
161  // count number of register descriptors
162  //
163  for (i = 0; i < count; i++) {
164  desc = GetDescriptor(i);
165  if (desc == NULL) {
168  "Resource Descriptor not found %!STATUS!", status);
169  goto exit;
170  }
171 
172  if (desc->Type == CmResourceTypePort) {
173  numPortDesc++;
174  }
175  }
176 
177  if (numPortDesc == 0) {
178  return STATUS_SUCCESS;
179  }
180 
181  //
182  // allocate table
183  //
185  locked = TRUE;
186 
189  numPortDesc,
191  );
192  if (!NT_SUCCESS(status)) {
194  "Failed to allocate memory for resource table"
195  " %!STATUS!", status);
196  goto exit;
197  }
198  m_PortResourceTableSizeCe = numPortDesc;
199 
200  //
201  // Populate table
202  //
203  index = 0;
204  for (i = 0; i < count; i++) {
205  desc = GetDescriptor(i);
206  if (desc == NULL) {
209  "Resource Descriptor not found %!STATUS!", status);
210  goto exit;
211  }
212 
213  if (desc->Type == CmResourceTypePort) {
214  SIZE_T len;
216 
217  //
218  // This will populate Length, StartPa and EndPa
219  //
221  if (len) {
223  }
224 
225  index++;
226  }
227  }
228 
229 exit:
230 
231  if (!NT_SUCCESS(status)) {
232  if (m_PortResourceTable != NULL) {
233  delete [] m_PortResourceTable;
236  }
237  }
238 
239  if (locked) {
241  }
242 
243  return status;
244 }
#define TRUE
Definition: types.h:120
GLuint GLuint GLsizei count
Definition: gl.h:1545
LONG NTSTATUS
Definition: precomp.h:26
#define CmResourceTypePort
Definition: hwresource.cpp:123
#define STATUS_INVALID_DEVICE_STATE
Definition: udferr_usr.h:178
__inline void UnlockResourceTable()
Definition: fxresource.hpp:500
FxPortResourceInfo * m_PortResourceTable
Definition: fxresource.hpp:361
#define FALSE
Definition: types.h:117
static const WCHAR desc[]
Definition: protectdata.c:36
VOID SetPhysicalAddress(__in PHYSICAL_ADDRESS StartPa, __in SIZE_T Length)
Definition: fxresource.hpp:205
unsigned char BOOLEAN
GLuint index
Definition: glext.h:6031
PCM_PARTIAL_RESOURCE_DESCRIPTOR GetDescriptor(__in ULONG Index)
static int ** pa
Definition: server.c:126
static NTSTATUS _CreateAndInit(_In_ PFX_DRIVER_GLOBALS DriverGlobals, _In_ ULONG Count, _Out_ FxPortResourceInfo **PortTable)
Definition: fxresource.hpp:166
ULONG m_PortResourceTableSizeCe
Definition: fxresource.hpp:362
__inline void LockResourceTable()
Definition: fxresource.hpp:487
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:32
SIZE_T GetResourceLength(__in PCM_PARTIAL_RESOURCE_DESCRIPTOR Descriptor, __out_opt PHYSICAL_ADDRESS *Start)
#define index(s, c)
Definition: various.h:29
GLenum GLsizei len
Definition: glext.h:6722
#define TRACE_LEVEL_ERROR
Definition: storswtr.h:27
ULONG_PTR SIZE_T
Definition: typedefs.h:80
#define TRACINGPNP
Definition: dbgtrace.h:67
__inline PFX_DRIVER_GLOBALS GetDriverGlobals(VOID)
Definition: fxobject.hpp:734
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
DoTraceLevelMessage(pFxDriverGlobals, TRACE_LEVEL_VERBOSE, TRACINGPNP, "Enter, WDFDEVICE %p", Device)
#define NULL
Definition: types.h:112
unsigned int ULONG
Definition: retypes.h:1
#define STATUS_SUCCESS
Definition: shellext.h:65
void exit(int exitcode)
Definition: _exit.c:33
static SERVICE_STATUS status
Definition: service.c:31
Definition: ps.c:97

Referenced by __drv_when().

◆ BuildRegisterResourceTable()

NTSTATUS FxCmResList::BuildRegisterResourceTable ( VOID  )

Definition at line 43 of file fxresourcecollectionum.cpp.

46 {
47  ULONG count;
48  ULONG i, index;
50  ULONG numRegisterDesc;
51  BOOLEAN locked = FALSE;
53 
54  count = GetCount();
55  numRegisterDesc = 0;
56 
57  //
58  // count number of register descriptors
59  //
60  for (i = 0; i < count; i++) {
61  desc = GetDescriptor(i);
62  if (desc == NULL) {
65  "Resource Descriptor not found %!STATUS!", status);
66  goto exit;
67  }
68 
69  if (desc->Type == CmResourceTypeMemory ||
71  numRegisterDesc++;
72  }
73  }
74 
75  if (numRegisterDesc == 0) {
76  return STATUS_SUCCESS;
77  }
78 
79  //
80  // allocate table
81  //
83  locked = TRUE;
84 
87  numRegisterDesc,
89  );
90  if (!NT_SUCCESS(status)) {
92  "Failed to allocate memory for resource table"
93  " %!STATUS!", status);
94  goto exit;
95  }
96  m_RegisterResourceTableSizeCe = numRegisterDesc;
97 
98  //
99  // Populate table
100  //
101  index = 0;
102  for (i = 0; i < count; i++) {
103  desc = GetDescriptor(i);
104  if (desc == NULL) {
107  "Resource Descriptor not found %!STATUS!", status);
108  goto exit;
109  }
110 
111  if (desc->Type == CmResourceTypeMemory ||
112  desc->Type == CmResourceTypeMemoryLarge) {
113  SIZE_T len;
115 
116  //
117  // This will populate Length and StartPa
118  //
120  if (len) {
122  }
123 
124  index++;
125  }
126  }
127 
128 exit:
129 
130  if (!NT_SUCCESS(status)) {
131  if (m_RegisterResourceTable != NULL) {
132  delete [] m_RegisterResourceTable;
135  }
136  }
137 
138  if (locked) {
140  }
141 
142  return status;
143 }
static NTSTATUS _CreateAndInit(_In_ PFX_DRIVER_GLOBALS DriverGlobals, _In_ ULONG Count, _Out_ FxRegisterResourceInfo **RegisterTable)
Definition: fxresource.hpp:71
#define TRUE
Definition: types.h:120
GLuint GLuint GLsizei count
Definition: gl.h:1545
LONG NTSTATUS
Definition: precomp.h:26
#define CmResourceTypeMemoryLarge
Definition: cmtypes.h:231
FxRegisterResourceInfo * m_RegisterResourceTable
Definition: fxresource.hpp:355
#define STATUS_INVALID_DEVICE_STATE
Definition: udferr_usr.h:178
__inline void UnlockResourceTable()
Definition: fxresource.hpp:500
#define FALSE
Definition: types.h:117
static const WCHAR desc[]
Definition: protectdata.c:36
unsigned char BOOLEAN
GLuint index
Definition: glext.h:6031
PCM_PARTIAL_RESOURCE_DESCRIPTOR GetDescriptor(__in ULONG Index)
static int ** pa
Definition: server.c:126
__inline void LockResourceTable()
Definition: fxresource.hpp:487
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:32
SIZE_T GetResourceLength(__in PCM_PARTIAL_RESOURCE_DESCRIPTOR Descriptor, __out_opt PHYSICAL_ADDRESS *Start)
#define index(s, c)
Definition: various.h:29
GLenum GLsizei len
Definition: glext.h:6722
#define TRACE_LEVEL_ERROR
Definition: storswtr.h:27
ULONG_PTR SIZE_T
Definition: typedefs.h:80
#define TRACINGPNP
Definition: dbgtrace.h:67
__inline PFX_DRIVER_GLOBALS GetDriverGlobals(VOID)
Definition: fxobject.hpp:734
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
DoTraceLevelMessage(pFxDriverGlobals, TRACE_LEVEL_VERBOSE, TRACINGPNP, "Enter, WDFDEVICE %p", Device)
#define NULL
Definition: types.h:112
ULONG m_RegisterResourceTableSizeCe
Definition: fxresource.hpp:356
unsigned int ULONG
Definition: retypes.h:1
#define STATUS_SUCCESS
Definition: shellext.h:65
VOID SetPhysicalAddress(__in PHYSICAL_ADDRESS StartPa, __in SIZE_T Length)
Definition: fxresource.hpp:113
void exit(int exitcode)
Definition: _exit.c:33
#define CmResourceTypeMemory
Definition: hwresource.cpp:125
static SERVICE_STATUS status
Definition: service.c:31
Definition: ps.c:97

Referenced by __drv_when().

◆ CheckForConnectionResources()

_Must_inspect_result_ NTSTATUS FxCmResList::CheckForConnectionResources ( VOID  )

Definition at line 758 of file fxresourcecollectionum.cpp.

761 {
763  ULONG i;
764  ULONG count;
766 
768  count = GetCount();
769 
770  for (i = 0; i < count; i++) {
771  pDescriptor = GetDescriptor(i);
772  if (pDescriptor == NULL) {
775  "Resource Descriptor not found %!STATUS!", status);
776  goto exit;
777  }
778 
779  if (pDescriptor->Type == CmResourceTypeConnection) {
781  break;
782  }
783  }
784 
785 exit:
786  return status;
787 }
#define TRUE
Definition: types.h:120
GLuint GLuint GLsizei count
Definition: gl.h:1545
LONG NTSTATUS
Definition: precomp.h:26
#define STATUS_INVALID_DEVICE_STATE
Definition: udferr_usr.h:178
BOOLEAN m_HasConnectionResources
Definition: fxresource.hpp:367
PCM_PARTIAL_RESOURCE_DESCRIPTOR GetDescriptor(__in ULONG Index)
#define TRACE_LEVEL_ERROR
Definition: storswtr.h:27
#define TRACINGPNP
Definition: dbgtrace.h:67
__inline PFX_DRIVER_GLOBALS GetDriverGlobals(VOID)
Definition: fxobject.hpp:734
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
DoTraceLevelMessage(pFxDriverGlobals, TRACE_LEVEL_VERBOSE, TRACINGPNP, "Enter, WDFDEVICE %p", Device)
#define NULL
Definition: types.h:112
unsigned int ULONG
Definition: retypes.h:1
#define STATUS_SUCCESS
Definition: shellext.h:65
void exit(int exitcode)
Definition: _exit.c:33
static SERVICE_STATUS status
Definition: service.c:31
Definition: ps.c:97

Referenced by __drv_when().

◆ ClearRegisterResourceEntryLocked()

VOID FxCmResList::ClearRegisterResourceEntryLocked ( __in FxRegisterResourceInfo Entry)

Definition at line 259 of file fxresourcecollectionum.cpp.

262 {
263  Entry->ClearMappedAddress();
264 }
base of all file and directory entries
Definition: entries.h:82

Referenced by ValidateAndClearMapping().

◆ CreateWdmList()

_Must_inspect_result_ PCM_RESOURCE_LIST FxCmResList::CreateWdmList ( __in __drv_strictTypeMatch(__drv_typeExpr) POOL_TYPE  PoolType = PagedPool)

Definition at line 366 of file fxresourcecollection.cpp.

382 {
383  PCM_RESOURCE_LIST pWdmResourceList;
384  ULONG size;
386 
387  pWdmResourceList = NULL;
389 
390  if (Count()) {
391  //
392  // NOTE: This function assumes all resources are on the same bus
393  // and therefore there is only one FULL_RESOURCE_DESCRIPTOR.
394  //
395  size = sizeof(CM_RESOURCE_LIST) +
396  (sizeof(CM_PARTIAL_RESOURCE_DESCRIPTOR) * (Count() - 1));
397 
398  pWdmResourceList = (PCM_RESOURCE_LIST)
400 
401  if (pWdmResourceList != NULL) {
404 
405  RtlZeroMemory(pWdmResourceList, size);
406 
407  pWdmResourceList->Count = 1; // We only return one full descriptor
408 
409  pWdmResourceList->List[0].PartialResourceList.Version = 1;
410  pWdmResourceList->List[0].PartialResourceList.Revision = 1;
411  pWdmResourceList->List[0].PartialResourceList.Count = Count();
412 
413  pDescriptor =
414  pWdmResourceList->List[0].PartialResourceList.PartialDescriptors;
415 
416  end = End();
417  for (cur = Start(); cur != end; cur = cur->Next()) {
418  FxResourceCm *pResource;
419 
420  pResource = (FxResourceCm*) cur->m_Object;
421 
422  RtlCopyMemory(pDescriptor,
423  &pResource->m_Descriptor,
424  sizeof(pResource->m_Descriptor));
425  pDescriptor++;
426  }
427  }
428  }
429 
430  return pWdmResourceList;
431 }
struct _CM_RESOURCE_LIST * PCM_RESOURCE_LIST
_Must_inspect_result_ FxCollectionEntry * Start(VOID)
CM_FULL_RESOURCE_DESCRIPTOR List[1]
Definition: hwresource.cpp:165
CM_PARTIAL_RESOURCE_DESCRIPTOR m_Descriptor
Definition: fxresource.hpp:251
CM_PARTIAL_RESOURCE_LIST PartialResourceList
Definition: hwresource.cpp:160
static __inline PVOID MxAllocatePoolWithTag(__in POOL_TYPE PoolType, __in SIZE_T NumberOfBytes, __in ULONG Tag)
Definition: mxmemorykm.h:30
_Must_inspect_result_ FxCollectionEntry * End(VOID)
GLsizeiptr size
Definition: glext.h:5919
PFX_DRIVER_GLOBALS pFxDriverGlobals
FxObject * m_Object
GLuint GLuint end
Definition: gl.h:1545
CM_PARTIAL_RESOURCE_DESCRIPTOR PartialDescriptors[1]
Definition: hwresource.cpp:119
struct _CM_RESOURCE_LIST CM_RESOURCE_LIST
FxCollectionEntry * cur
__inline PFX_DRIVER_GLOBALS GetDriverGlobals(VOID)
Definition: fxobject.hpp:734
#define NULL
Definition: types.h:112
_Must_inspect_result_ _In_ WDFDEVICE _In_ DEVICE_REGISTRY_PROPERTY _In_ _Strict_type_match_ POOL_TYPE PoolType
Definition: wdfdevice.h:3810
unsigned int ULONG
Definition: retypes.h:1
#define RtlZeroMemory(Destination, Length)
Definition: typedefs.h:262
#define RtlCopyMemory(Destination, Source, Length)
Definition: typedefs.h:263
FxCollectionEntry * Next(VOID)

Referenced by FxPkgFdo::PnpSendStartDeviceDownTheStackOverload().

◆ DeletePortResourceTable()

VOID FxCmResList::DeletePortResourceTable ( VOID  )
inline

Definition at line 595 of file fxresource.hpp.

598  {
600  if (m_PortResourceTable != NULL) {
601  delete [] m_PortResourceTable;
604  }
606  }
__inline void UnlockResourceTable()
Definition: fxresource.hpp:500
FxPortResourceInfo * m_PortResourceTable
Definition: fxresource.hpp:361
ULONG m_PortResourceTableSizeCe
Definition: fxresource.hpp:362
__inline void LockResourceTable()
Definition: fxresource.hpp:487
#define NULL
Definition: types.h:112

Referenced by FxPkgPnp::PnpReleaseHardware().

◆ DeleteRegisterResourceTable()

VOID FxCmResList::DeleteRegisterResourceTable ( VOID  )
inline

Definition at line 581 of file fxresource.hpp.

584  {
586  if (m_RegisterResourceTable != NULL) {
587  delete [] m_RegisterResourceTable;
590  }
592  }
FxRegisterResourceInfo * m_RegisterResourceTable
Definition: fxresource.hpp:355
__inline void UnlockResourceTable()
Definition: fxresource.hpp:500
__inline void LockResourceTable()
Definition: fxresource.hpp:487
#define NULL
Definition: types.h:112
ULONG m_RegisterResourceTableSizeCe
Definition: fxresource.hpp:356

Referenced by FxPkgPnp::PnpReleaseHardware().

◆ GetCount()

ULONG FxCmResList::GetCount ( VOID  )

Definition at line 434 of file fxresourcecollection.cpp.

437 {
438  ULONG count;
439  KIRQL irql;
440 
441  Lock(&irql);
442  count = Count();
443  Unlock(irql);
444 
445  return count;
446 }
__drv_restoresIRQL KIRQL __in BOOLEAN Unlock
Definition: fxobject.hpp:1474
GLuint GLuint GLsizei count
Definition: gl.h:1545
KIRQL irql
Definition: wave.h:1
UCHAR KIRQL
Definition: env_spec_w32.h:591
_Must_inspect_result_ _In_opt_ PWDF_OBJECT_ATTRIBUTES _Out_ WDFWAITLOCK * Lock
Definition: wdfsync.h:124
unsigned int ULONG
Definition: retypes.h:1

Referenced by BuildPortResourceTable(), BuildRegisterResourceTable(), and CheckForConnectionResources().

◆ GetDescriptor()

PCM_PARTIAL_RESOURCE_DESCRIPTOR FxCmResList::GetDescriptor ( __in ULONG  Index)

Definition at line 449 of file fxresourcecollection.cpp.

452 {
454  KIRQL irql;
455 
456  Lock(&irql);
458  Unlock(irql);
459 
460  if (pObject == NULL) {
461  return NULL;
462  }
463  else {
464  //
465  // Copy the current descriptor to the clone and return it
466  //
467  RtlCopyMemory(&pObject->m_DescriptorClone,
468  &pObject->m_Descriptor,
469  sizeof(pObject->m_Descriptor));
470 
471  return &pObject->m_DescriptorClone;
472  }
473 }
__drv_restoresIRQL KIRQL __in BOOLEAN Unlock
Definition: fxobject.hpp:1474
FxObject * pObject
KIRQL irql
Definition: wave.h:1
UCHAR KIRQL
Definition: env_spec_w32.h:591
_In_ WDFCOLLECTION _In_ ULONG Index
#define NULL
Definition: types.h:112
_Must_inspect_result_ _In_opt_ PWDF_OBJECT_ATTRIBUTES _Out_ WDFWAITLOCK * Lock
Definition: wdfsync.h:124
#define RtlCopyMemory(Destination, Source, Length)
Definition: typedefs.h:263
_Must_inspect_result_ FxObject * GetItem(__in ULONG Index)

Referenced by BuildPortResourceTable(), BuildRegisterResourceTable(), and CheckForConnectionResources().

◆ GetHandle()

WDFCMRESLIST FxCmResList::GetHandle ( VOID  )
inline

Definition at line 449 of file fxresource.hpp.

452  {
453  return (WDFCMRESLIST) GetObjectHandle();
454  }
PVOID __inline GetObjectHandle(VOID)
Definition: fxobject.hpp:603

Referenced by __drv_when(), FxPkgPnp::PnpReleaseHardware(), and FxPkgFdo::PnpSendStartDeviceDownTheStackOverload().

◆ GetResourceLength()

SIZE_T FxCmResList::GetResourceLength ( __in PCM_PARTIAL_RESOURCE_DESCRIPTOR  Descriptor,
__out_opt PHYSICAL_ADDRESS Start 
)

Definition at line 551 of file fxresourcecollectionum.cpp.

573 {
575 
576  length = 0;
577 
580  (Descriptor->Type == CmResourceTypePort));
581 
582  //
583  // If it is not large memory resource than length is in u.Memory.Length.
584  // For large memory resource, the length is given by different fields in
585  // CM_PARTIAL_RESOURCE_DESCRIPTOR structure.
586  //
587  if ((Descriptor->Type == CmResourceTypeMemory) ||
588  (Descriptor->Type == CmResourceTypePort)) {
589  length = Descriptor->u.Memory.Length;
590 
591  } else if (Descriptor->Flags & CM_RESOURCE_MEMORY_LARGE_40) {
592  length = (((ULONGLONG)Descriptor->u.Memory40.Length40) << 8);
593 
594  } else if (Descriptor->Flags & CM_RESOURCE_MEMORY_LARGE_48) {
595  length = (((ULONGLONG)Descriptor->u.Memory48.Length48) << 16);
596 
597  } else if (Descriptor->Flags & CM_RESOURCE_MEMORY_LARGE_64) {
598  length = (((ULONGLONG)Descriptor->u.Memory64.Length64) << 32);
599 
600  } else {
601  //
602  // It should not be possible to get here.
603  //
604  ASSERT(FALSE);
605  }
606 
607  if (Start != NULL) {
608  *Start = Descriptor->u.Generic.Start;
609  }
610 
611  //
612  // large memory descriptor is only supported on 64-bit so the casting
613  // below is ok.
614  //
615  return (SIZE_T) length;
616 }
_Must_inspect_result_ FxCollectionEntry * Start(VOID)
_Must_inspect_result_ _In_ WDFIORESLIST _In_ PIO_RESOURCE_DESCRIPTOR Descriptor
Definition: wdfresource.h:339
#define CM_RESOURCE_MEMORY_LARGE_48
Definition: cmtypes.h:284
#define CmResourceTypeMemoryLarge
Definition: cmtypes.h:231
#define CmResourceTypePort
Definition: hwresource.cpp:123
#define FALSE
Definition: types.h:117
GLenum GLuint GLenum GLsizei length
Definition: glext.h:5579
#define ASSERT(a)
Definition: mode.c:44
uint64_t ULONGLONG
Definition: typedefs.h:67
#define CM_RESOURCE_MEMORY_LARGE_40
Definition: cmtypes.h:283
ULONG_PTR SIZE_T
Definition: typedefs.h:80
#define NULL
Definition: types.h:112
#define CmResourceTypeMemory
Definition: hwresource.cpp:125
#define CM_RESOURCE_MEMORY_LARGE_64
Definition: cmtypes.h:285

Referenced by BuildPortResourceTable(), and BuildRegisterResourceTable().

◆ HasConnectionResources()

BOOLEAN FxCmResList::HasConnectionResources ( VOID  )
inline

Definition at line 615 of file fxresource.hpp.

618  {
620  }
BOOLEAN m_HasConnectionResources
Definition: fxresource.hpp:367

Referenced by FxDevice::IsInterruptAccessAllowed().

◆ LockResourceTable()

__inline void FxCmResList::LockResourceTable ( )
inline

Definition at line 487 of file fxresource.hpp.

489  {
490  KIRQL oldIrql;
491 
492  m_ResourceTableLock.Acquire(&oldIrql);
493 
494  UNREFERENCED_PARAMETER(oldIrql);
495  }
#define UNREFERENCED_PARAMETER(P)
Definition: ntbasedef.h:317
UCHAR KIRQL
Definition: env_spec_w32.h:591
MxLock m_ResourceTableLock
Definition: fxresource.hpp:372

Referenced by BuildPortResourceTable(), BuildRegisterResourceTable(), DeletePortResourceTable(), DeleteRegisterResourceTable(), if(), MapIoSpaceWorker(), ValidateAndClearMapping(), and ValidateRegisterSystemBaseAddress().

◆ MapIoSpaceWorker()

HRESULT FxCmResList::MapIoSpaceWorker ( __in PHYSICAL_ADDRESS  PhysicalAddress,
__in SIZE_T  NumberOfBytes,
__in MEMORY_CACHING_TYPE  CacheType,
__deref_out VOID **  PseudoBaseAddress 
)

Definition at line 619 of file fxresourcecollectionum.cpp.

625 {
626  IWudfDeviceStack *deviceStack;
628  PVOID usermodeAddress;
629  HRESULT hr;
630  FxRegisterResourceInfo* resEntry;
631 
632  //
633  // check if this physical resource is among the assigned resources.
634  // If it is, retrieve the table entry corresponding to to register res.
635  //
637 
640  &resEntry);
641 
642  FX_VERIFY_WITH_NAME(DRIVER(BadArgument, TODO),
643  CHECK("Invalid physical address or number of bytes provided",
644  (SUCCEEDED(hr))), GetDriverGlobals()->Public.DriverName);
645 
647 
648  //
649  // Call host
650  //
653  usermodeAddress = NULL;
654 
655  if(GetDevice()->AreRegistersMappedToUsermode()) {
656  hr = deviceStack->MapIoSpace(PhysicalAddress,
658  CacheType,
659  &systemAddress,
660  &usermodeAddress);
661  }
662  else {
663  hr = deviceStack->MapIoSpace(PhysicalAddress,
665  CacheType,
666  &systemAddress,
667  NULL);
668  }
669 
670  if (SUCCEEDED(hr)) {
671  //
672  // update the mapped resource list entry and add it to list
673  //
677  usermodeAddress);
678 
679  //
680  // Convert system address to pseudo (opaque) base address
681  //
684  );
685  }
686 
688 
689  return hr;
690 }
HRESULT ValidateRegisterPhysicalAddressRange(__in PHYSICAL_ADDRESS PhysicalAddress, __in SIZE_T Size, __out FxRegisterResourceInfo **TableEntry)
HRESULT hr
Definition: shlfolder.c:183
IWudfDeviceStack * deviceStack
#define CHECK(type, val, base, expected)
FX_VERIFY_WITH_NAME(DRIVER(BadArgument, TODO), CHECK(ERROR_STRING_HW_ACCESS_NOT_ALLOWED,(pDevice->IsDirectHardwareAccessAllowed()==TRUE)), DriverGlobals->DriverName)
__inline void UnlockResourceTable()
Definition: fxresource.hpp:500
_Must_inspect_result_ _In_ WDFDEVICE _In_ PHYSICAL_ADDRESS _In_ SIZE_T _In_ MEMORY_CACHING_TYPE _Out_ PVOID * PseudoBaseAddress
#define TODO
Definition: SAX2.c:49
if SUCCEEDED(hr)
_Must_inspect_result_ _In_ PHYSICAL_ADDRESS _In_ PHYSICAL_ADDRESS _In_opt_ PHYSICAL_ADDRESS _In_ MEMORY_CACHING_TYPE CacheType
Definition: mmfuncs.h:214
IWudfDeviceStack * GetDeviceStack(VOID)
Definition: fxdeviceum.hpp:435
__inline void LockResourceTable()
Definition: fxresource.hpp:487
LONG HRESULT
Definition: typedefs.h:79
VOID UpdateRegisterResourceEntryLocked(__in FxRegisterResourceInfo *Entry, __in PVOID SystemMappedAddress, __in SIZE_T NumberOfBytes, __in PVOID UsermodeMappedAddress)
_Must_inspect_result_ typedef _In_ PHYSICAL_ADDRESS PhysicalAddress
Definition: iotypes.h:1098
CfxDevice * GetDevice(VOID)
Definition: fxobject.hpp:781
__inline PFX_DRIVER_GLOBALS GetDriverGlobals(VOID)
Definition: fxobject.hpp:734
_Must_inspect_result_ typedef _In_ PHYSICAL_ADDRESS _Inout_ PLARGE_INTEGER NumberOfBytes
Definition: iotypes.h:1035
#define NULL
Definition: types.h:112
PVOID GetPseudoAddressFromSystemAddress(__in PVOID SystemAddress)
Definition: fxdevice.hpp:2100
PVOID systemAddress

◆ UnlockResourceTable()

__inline void FxCmResList::UnlockResourceTable ( )
inline

◆ UpdateRegisterResourceEntryLocked()

VOID FxCmResList::UpdateRegisterResourceEntryLocked ( __in FxRegisterResourceInfo Entry,
__in PVOID  SystemMappedAddress,
__in SIZE_T  NumberOfBytes,
__in PVOID  UsermodeMappedAddress 
)

Definition at line 248 of file fxresourcecollectionum.cpp.

254 {
255  Entry->SetMappedAddress(SystemMappedAddress, NumberOfBytes, UsermodeMappedAddress);
256 }
_Must_inspect_result_ typedef _In_ PHYSICAL_ADDRESS _Inout_ PLARGE_INTEGER NumberOfBytes
Definition: iotypes.h:1035
base of all file and directory entries
Definition: entries.h:82

Referenced by MapIoSpaceWorker().

◆ ValidateAndClearMapping()

HRESULT FxCmResList::ValidateAndClearMapping ( __in PVOID  Address,
__in SIZE_T  Length 
)

Definition at line 363 of file fxresourcecollectionum.cpp.

389 {
391  ULONG i;
393 
395 
396  for (i = 0; i < m_RegisterResourceTableSizeCe; i++) {
398 
399  if (NULL != entry->m_StartSystemVa &&
400  Address == entry->m_StartSystemVa &&
401  Length == entry->m_MappedLength) {
402  //
403  // there is a valid mapping. clear it.
404  //
405  FX_VERIFY_WITH_NAME(INTERNAL, CHECK_NOT_NULL(entry->m_EndSystemVa),
406  GetDriverGlobals()->Public.DriverName);
407 
409 
410  hr = S_OK;
411  break;
412  }
413  }
414 
416 
417  return hr;
418 }
_In_ ULONG _In_ ULONG _In_ ULONG Length
Definition: ntddpcm.h:101
HRESULT hr
Definition: shlfolder.c:183
FxRegisterResourceInfo * m_RegisterResourceTable
Definition: fxresource.hpp:355
FX_VERIFY_WITH_NAME(DRIVER(BadArgument, TODO), CHECK(ERROR_STRING_HW_ACCESS_NOT_ALLOWED,(pDevice->IsDirectHardwareAccessAllowed()==TRUE)), DriverGlobals->DriverName)
__inline void UnlockResourceTable()
Definition: fxresource.hpp:500
#define E_INVALIDARG
Definition: ddrawi.h:101
static WCHAR Address[46]
Definition: ping.c:68
__inline void LockResourceTable()
Definition: fxresource.hpp:487
LONG HRESULT
Definition: typedefs.h:79
uint32_t entry
Definition: isohybrid.c:63
#define S_OK
Definition: intsafe.h:52
__inline PFX_DRIVER_GLOBALS GetDriverGlobals(VOID)
Definition: fxobject.hpp:734
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
#define NULL
Definition: types.h:112
ULONG m_RegisterResourceTableSizeCe
Definition: fxresource.hpp:356
unsigned int ULONG
Definition: retypes.h:1
VOID ClearRegisterResourceEntryLocked(__in FxRegisterResourceInfo *Entry)

◆ ValidatePortAddressRange()

HRESULT FxCmResList::ValidatePortAddressRange ( __in PVOID  Address,
__in SIZE_T  Length 
)

Definition at line 718 of file fxresourcecollectionum.cpp.

722 {
723  ULONG i;
724  HRESULT hr;
725  ULONGLONG driverStartPa, driverEndPa, systemStartPa, systemEndPa;
726  ULONGLONG tmp;
728 
729  driverStartPa = (ULONGLONG)Address;
730 
731  //
732  // driverEndPa = driverStartPa + Length - 1;
733  //
734  hr = ULongLongAdd(driverStartPa, Length, &tmp);
735  FX_VERIFY_WITH_NAME(DRIVER(BadArgument, TODO), CHECK("Integer overflow occurred"
736  "when computing port address range", SUCCEEDED(hr)),
737  GetDriverGlobals()->Public.DriverName);
738 
739  driverEndPa = tmp - 1;
740 
741  for (i = 0; i < m_PortResourceTableSizeCe; i++) {
743 
744  systemStartPa = entry->m_StartPa.QuadPart;
745  systemEndPa = entry->m_EndPa.QuadPart;
746 
747  if (driverStartPa >= systemStartPa &&
748  driverEndPa <= systemEndPa) {
749  return S_OK;
750  }
751  }
752 
753  return E_INVALIDARG;
754 }
_In_ ULONG _In_ ULONG _In_ ULONG Length
Definition: ntddpcm.h:101
HRESULT hr
Definition: shlfolder.c:183
#define CHECK(type, val, base, expected)
FX_VERIFY_WITH_NAME(DRIVER(BadArgument, TODO), CHECK(ERROR_STRING_HW_ACCESS_NOT_ALLOWED,(pDevice->IsDirectHardwareAccessAllowed()==TRUE)), DriverGlobals->DriverName)
FxPortResourceInfo * m_PortResourceTable
Definition: fxresource.hpp:361
#define TODO
Definition: SAX2.c:49
if SUCCEEDED(hr)
#define E_INVALIDARG
Definition: ddrawi.h:101
static WCHAR Address[46]
Definition: ping.c:68
ULONG m_PortResourceTableSizeCe
Definition: fxresource.hpp:362
LONG HRESULT
Definition: typedefs.h:79
uint64_t ULONGLONG
Definition: typedefs.h:67
uint32_t entry
Definition: isohybrid.c:63
#define S_OK
Definition: intsafe.h:52
__inline PFX_DRIVER_GLOBALS GetDriverGlobals(VOID)
Definition: fxobject.hpp:734
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
#define NULL
Definition: types.h:112
unsigned int ULONG
Definition: retypes.h:1

◆ ValidateRegisterPhysicalAddressRange()

HRESULT FxCmResList::ValidateRegisterPhysicalAddressRange ( __in PHYSICAL_ADDRESS  PhysicalAddress,
__in SIZE_T  Size,
__out FxRegisterResourceInfo **  TableEntry 
)

Definition at line 267 of file fxresourcecollectionum.cpp.

297 {
298  ULONG i;
299  HRESULT hr;
300  ULONGLONG driverStartPa, driverEndPa, systemStartPa, systemEndPa;
301  ULONGLONG tmp;
303 
304  *TableEntry = NULL;
305 
306  //
307  // Physical address is of LONGLONG type (signed) we need to cast it to
308  // ULONGLONG for comparision because in a LONGLONG comprison, the
309  // result is different when highest bit is set vs when it is not set.
310  //
311  driverStartPa = PhysicalAddress.QuadPart;
312 
313  //
314  // driverEndPa = driverStartPa + Size - 1;
315  //
316  hr = ULongLongAdd(driverStartPa, Size, &tmp);
317  FX_VERIFY_WITH_NAME(DRIVER(BadArgument, TODO), CHECK("Integer overflow occurred"
318  "when computing register address range", SUCCEEDED(hr)),
319  GetDriverGlobals()->Public.DriverName);
320 
321  driverEndPa = tmp - 1;
322 
323  //
324  // We allow one physical address range mapping only. The base address and
325  // length can be flexible within the assigned range.
326  //
327  for (i = 0; i < m_RegisterResourceTableSizeCe; i++) {
329 
330  //
331  // No need to do int overflow safe additon here since start address and
332  // length are assigned by pnp manager. Note that we don't store endPa in
333  // resource table the way we do for SystemVa is because endPa is not
334  // needed in hot path so can be computed using length.
335  //
336  systemStartPa = entry->m_StartPa.QuadPart;
337  systemEndPa = systemStartPa + entry->m_Length - 1;
338 
339  if (driverStartPa >= systemStartPa &&
340  driverEndPa <= systemEndPa) {
341 
342  FX_VERIFY_WITH_NAME(DRIVER(BadArgument, TODO), CHECK("Attempt to do multiple "
343  "mapping of same resource, or multiple mapping in same resource"
344  " range",
345  (entry->m_StartSystemVa == NULL)), GetDriverGlobals()->Public.DriverName);
346  FX_VERIFY_WITH_NAME(INTERNAL, CHECK_NULL(entry->m_EndSystemVa),
347  GetDriverGlobals()->Public.DriverName);
348  FX_VERIFY_WITH_NAME(INTERNAL, CHECK_NULL(entry->m_StartUsermodeVa),
349  GetDriverGlobals()->Public.DriverName);
350  FX_VERIFY_WITH_NAME(INTERNAL, CHECK("Mapped length not zero",
351  (entry->m_MappedLength == 0)), GetDriverGlobals()->Public.DriverName);
352 
353  *TableEntry = entry;
354 
355  return S_OK;
356  }
357  }
358 
359  return E_INVALIDARG;
360 }
HRESULT hr
Definition: shlfolder.c:183
IN PVOID IN PVOID IN USHORT IN USHORT Size
Definition: pci.h:361
#define CHECK(type, val, base, expected)
FxRegisterResourceInfo * m_RegisterResourceTable
Definition: fxresource.hpp:355
FX_VERIFY_WITH_NAME(DRIVER(BadArgument, TODO), CHECK(ERROR_STRING_HW_ACCESS_NOT_ALLOWED,(pDevice->IsDirectHardwareAccessAllowed()==TRUE)), DriverGlobals->DriverName)
#define TODO
Definition: SAX2.c:49
if SUCCEEDED(hr)
#define E_INVALIDARG
Definition: ddrawi.h:101
LONG HRESULT
Definition: typedefs.h:79
uint64_t ULONGLONG
Definition: typedefs.h:67
_Must_inspect_result_ typedef _In_ PHYSICAL_ADDRESS PhysicalAddress
Definition: iotypes.h:1098
uint32_t entry
Definition: isohybrid.c:63
#define S_OK
Definition: intsafe.h:52
__inline PFX_DRIVER_GLOBALS GetDriverGlobals(VOID)
Definition: fxobject.hpp:734
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
#define NULL
Definition: types.h:112
_Must_inspect_result_ typedef _In_ ULONG TableEntry
Definition: iotypes.h:4303
ULONG m_RegisterResourceTableSizeCe
Definition: fxresource.hpp:356
unsigned int ULONG
Definition: retypes.h:1
LONGLONG QuadPart
Definition: typedefs.h:114

Referenced by MapIoSpaceWorker().

◆ ValidateRegisterSystemAddressRange()

HRESULT FxCmResList::ValidateRegisterSystemAddressRange ( __in PVOID  SystemAddress,
__in SIZE_T  Length,
__out_opt PVOID UsermodeAddress 
)

Definition at line 471 of file fxresourcecollectionum.cpp.

500 {
503  SIZE_T offset = 0;
504  ULONG i;
505  PVOID start = NULL;
506  PVOID end = NULL;
507  ULONG_PTR tmp;
508 
509  //
510  // compute system address range to look for
511  //
512  start = SystemAddress;
513 
514  //
515  // Use interger overflow safe functions
516  // end = ((PUCHAR)SystemAddress) + Length - 1;
517  //
518  hr = ULongPtrAdd((ULONG_PTR) start, Length, &tmp);
519  FX_VERIFY_WITH_NAME(DRIVER(BadArgument, TODO), CHECK("Integer overflow occurred"
520  "when computing register address range", SUCCEEDED(hr)),
521  GetDriverGlobals()->Public.DriverName);
522 
523  end = (PVOID)(tmp - 1);
524 
525  //
526  // check if range is in the register resource table
527  //
528  hr = E_INVALIDARG;
529  for (i = 0; i < m_RegisterResourceTableSizeCe; i++) {
531 
532  if (start >= entry->m_StartSystemVa &&
533  end <= entry->m_EndSystemVa) {
534  hr = S_OK;
535  break;
536  }
537  }
538 
539  //
540  // compute the corresponding usermode address
541  //
542  if (SUCCEEDED(hr) && UsermodeAddress != NULL) {
543  offset = ((PUCHAR)SystemAddress) - ((PUCHAR)entry->m_StartSystemVa);
544  *UsermodeAddress = ((PUCHAR)entry->m_StartUsermodeVa) + offset;
545  }
546 
547  return hr;
548 }
_In_ ULONG _In_ ULONG _In_ ULONG Length
Definition: ntddpcm.h:101
HRESULT hr
Definition: shlfolder.c:183
unsigned char * PUCHAR
Definition: retypes.h:3
#define CHECK(type, val, base, expected)
FxRegisterResourceInfo * m_RegisterResourceTable
Definition: fxresource.hpp:355
FX_VERIFY_WITH_NAME(DRIVER(BadArgument, TODO), CHECK(ERROR_STRING_HW_ACCESS_NOT_ALLOWED,(pDevice->IsDirectHardwareAccessAllowed()==TRUE)), DriverGlobals->DriverName)
uint32_t ULONG_PTR
Definition: typedefs.h:65
#define TODO
Definition: SAX2.c:49
if SUCCEEDED(hr)
#define E_INVALIDARG
Definition: ddrawi.h:101
void * PVOID
Definition: retypes.h:9
LONG HRESULT
Definition: typedefs.h:79
GLintptr offset
Definition: glext.h:5920
GLuint GLuint end
Definition: gl.h:1545
uint32_t entry
Definition: isohybrid.c:63
ULONG_PTR SIZE_T
Definition: typedefs.h:80
#define S_OK
Definition: intsafe.h:52
__inline PFX_DRIVER_GLOBALS GetDriverGlobals(VOID)
Definition: fxobject.hpp:734
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
GLuint start
Definition: gl.h:1545
#define NULL
Definition: types.h:112
ULONG m_RegisterResourceTableSizeCe
Definition: fxresource.hpp:356
unsigned int ULONG
Definition: retypes.h:1

Referenced by if().

◆ ValidateRegisterSystemBaseAddress()

HRESULT FxCmResList::ValidateRegisterSystemBaseAddress ( __in PVOID  Address,
__out PVOID UsermodeBaseAddress 
)

Definition at line 421 of file fxresourcecollectionum.cpp.

446 {
447  ULONG i;
449 
451  for (i = 0; i < m_RegisterResourceTableSizeCe; i++) {
453 
454  if (Address == entry->m_StartSystemVa) {
455 
456  FX_VERIFY_WITH_NAME(INTERNAL, CHECK_NOT_NULL(entry->m_StartUsermodeVa),
457  GetDriverGlobals()->Public.DriverName);
458 
459  *UsermodeBaseAddress = entry->m_StartUsermodeVa;
460 
462  return S_OK;
463  }
464  }
465 
467  return E_INVALIDARG;
468 }
FxRegisterResourceInfo * m_RegisterResourceTable
Definition: fxresource.hpp:355
FX_VERIFY_WITH_NAME(DRIVER(BadArgument, TODO), CHECK(ERROR_STRING_HW_ACCESS_NOT_ALLOWED,(pDevice->IsDirectHardwareAccessAllowed()==TRUE)), DriverGlobals->DriverName)
__inline void UnlockResourceTable()
Definition: fxresource.hpp:500
#define E_INVALIDARG
Definition: ddrawi.h:101
static WCHAR Address[46]
Definition: ping.c:68
__inline void LockResourceTable()
Definition: fxresource.hpp:487
uint32_t entry
Definition: isohybrid.c:63
#define S_OK
Definition: intsafe.h:52
__inline PFX_DRIVER_GLOBALS GetDriverGlobals(VOID)
Definition: fxobject.hpp:734
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
#define NULL
Definition: types.h:112
ULONG m_RegisterResourceTableSizeCe
Definition: fxresource.hpp:356
unsigned int ULONG
Definition: retypes.h:1

◆ ValidateResourceUnmap()

VOID FxCmResList::ValidateResourceUnmap ( VOID  )

Definition at line 693 of file fxresourcecollectionum.cpp.

696 {
697  ULONG i;
699 
700  //
701  // make sure driver has unmapped its resources. No need to
702  // acquire the resource validation table lock as this is called in
703  // ReleaseHardware pnp callback and cannot race with another framework
704  // pnp callback that updates this table (PrepareHardware) so no invalid
705  // access. If a driver thread unmaps after ReleaseHardware return then also
706  // it will be a valid access of table entry.
707  //
708 
709  for (i = 0; i < m_RegisterResourceTableSizeCe; i++) {
711 
712  FX_VERIFY_WITH_NAME(DRIVER(BadArgument, TODO), CHECK("Driver did not unmap its "
713  "register resources", (entry->m_StartSystemVa == NULL)), GetDriverGlobals()->Public.DriverName);
714  }
715 }
#define CHECK(type, val, base, expected)
FxRegisterResourceInfo * m_RegisterResourceTable
Definition: fxresource.hpp:355
FX_VERIFY_WITH_NAME(DRIVER(BadArgument, TODO), CHECK(ERROR_STRING_HW_ACCESS_NOT_ALLOWED,(pDevice->IsDirectHardwareAccessAllowed()==TRUE)), DriverGlobals->DriverName)
#define TODO
Definition: SAX2.c:49
uint32_t entry
Definition: isohybrid.c:63
__inline PFX_DRIVER_GLOBALS GetDriverGlobals(VOID)
Definition: fxobject.hpp:734
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
#define NULL
Definition: types.h:112
ULONG m_RegisterResourceTableSizeCe
Definition: fxresource.hpp:356
unsigned int ULONG
Definition: retypes.h:1

Referenced by FxPkgPnp::PnpReleaseHardware().

Member Data Documentation

◆ m_HasConnectionResources

BOOLEAN FxCmResList::m_HasConnectionResources
protected

◆ m_PortResourceTable

FxPortResourceInfo* FxCmResList::m_PortResourceTable
protected

◆ m_PortResourceTableSizeCe

ULONG FxCmResList::m_PortResourceTableSizeCe
protected

◆ m_RegisterResourceTable

◆ m_RegisterResourceTableSizeCe

◆ m_ResourceTableLock

MxLock FxCmResList::m_ResourceTableLock
protected

Definition at line 372 of file fxresource.hpp.

Referenced by LockResourceTable(), and UnlockResourceTable().


The documentation for this class was generated from the following files: