ReactOS 0.4.17-dev-684-ga6524ef
arbiter.h File Reference
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Classes

struct  _ARBITER_ALTERNATIVE
 
struct  _ARBITER_ALLOCATION_STATE
 
struct  _ARBITER_ORDERING
 
struct  _ARBITER_ORDERING_LIST
 
struct  _ARBITER_INSTANCE
 

Macros

#define TAG_ARBITER   'ibrA'
 
#define ARBITER_PRIORITY_NULL   0x00000000
 
#define ARBITER_PRIORITY_PREFERRED_RESERVED   0x7FFFFFFD
 
#define ARBITER_PRIORITY_RESERVED   0x7FFFFFFE
 
#define ARBITER_PRIORITY_EXHAUSTED   0x7FFFFFFF
 
#define ARBITER_ALTERNATIVE_FLAG_FIXED   0x00000001
 
#define ARBITER_ALTERNATIVE_FLAG_SHARED   0x00000002
 
#define ARBITER_RANGE_SHARED_DRIVER   0x0
 
#define ARBITER_RANGE_BOOT_ALLOCATED   0x04
 
#define ARBITER_STATE_FLAG_NULL_CONFLICT_OK   0x0001
 

Typedefs

typedef struct _ARBITER_ALTERNATIVE ARBITER_ALTERNATIVE
 
typedef struct _ARBITER_ALTERNATIVEPARBITER_ALTERNATIVE
 
typedef struct _ARBITER_ALLOCATION_STATE ARBITER_ALLOCATION_STATE
 
typedef struct _ARBITER_ALLOCATION_STATEPARBITER_ALLOCATION_STATE
 
typedef struct _ARBITER_ORDERING ARBITER_ORDERING
 
typedef struct _ARBITER_ORDERINGPARBITER_ORDERING
 
typedef struct _ARBITER_ORDERING_LIST ARBITER_ORDERING_LIST
 
typedef struct _ARBITER_ORDERING_LISTPARBITER_ORDERING_LIST
 
typedef struct _ARBITER_INSTANCEPARBITER_INSTANCE
 
typedef NTSTATUS(NTAPIPARB_UNPACK_REQUIREMENT) (_In_ PIO_RESOURCE_DESCRIPTOR IoDescriptor, _Out_ PUINT64 OutMinimumAddress, _Out_ PUINT64 OutMaximumAddress, _Out_ PUINT64 OutLength, _Out_ PUINT64 OutAlignment)
 
typedef NTSTATUS(NTAPIPARB_PACK_RESOURCE) (_In_ PIO_RESOURCE_DESCRIPTOR IoDescriptor, _In_ UINT64 Start, _Out_ PCM_PARTIAL_RESOURCE_DESCRIPTOR CmDescriptor)
 
typedef NTSTATUS(NTAPIPARB_UNPACK_RESOURCE) (_In_ PCM_PARTIAL_RESOURCE_DESCRIPTOR CmDescriptor, _Out_ PUINT64 Start, _Out_ PUINT64 OutLength)
 
typedef INT32(NTAPIPARB_SCORE_REQUIREMENT) (_In_ PIO_RESOURCE_DESCRIPTOR IoDescriptor)
 
typedef NTSTATUS(NTAPIPARB_TEST_ALLOCATION) (_In_ PARBITER_INSTANCE Arbiter, _Inout_ PARBITER_TEST_ALLOCATION_PARAMETERS Parameters)
 
typedef NTSTATUS(NTAPIPARB_RETEST_ALLOCATION) (_In_ PARBITER_INSTANCE Arbiter, _Inout_ PARBITER_RETEST_ALLOCATION_PARAMETERS Parameters)
 
typedef NTSTATUS(NTAPIPARB_BOOT_ALLOCATION) (_In_ PARBITER_INSTANCE Arbiter, _Inout_ PARBITER_BOOT_ALLOCATION_PARAMETERS Parameters)
 
typedef NTSTATUS(NTAPIPARB_QUERY_ARBITRATE) (_In_ PARBITER_INSTANCE Arbiter, _Inout_ PARBITER_QUERY_ARBITRATE_PARAMETERS Parameters)
 
typedef NTSTATUS(NTAPIPARB_QUERY_CONFLICT) (_In_ PARBITER_INSTANCE Arbiter, _Inout_ PARBITER_QUERY_CONFLICT_PARAMETERS Parameters)
 
typedef NTSTATUS(NTAPIPARB_ADD_RESERVED) (_In_ PARBITER_INSTANCE Arbiter, _Inout_ PARBITER_ADD_RESERVED_PARAMETERS Parameters)
 
typedef NTSTATUS(NTAPIPARB_COMMIT_ALLOCATION) (_In_ PARBITER_INSTANCE Arbiter)
 
typedef NTSTATUS(NTAPIPARB_ROLLBACK_ALLOCATION) (_In_ PARBITER_INSTANCE Arbiter)
 
typedef NTSTATUS(NTAPIPARB_START_ARBITER) (_In_ PARBITER_INSTANCE Arbiter, _In_ PCM_RESOURCE_LIST StartResources)
 
typedef NTSTATUS(NTAPIPARB_PREPROCESS_ENTRY) (_In_ PARBITER_INSTANCE Arbiter, _Inout_ PARBITER_ALLOCATION_STATE ArbState)
 
typedef NTSTATUS(NTAPIPARB_ALLOCATE_ENTRY) (_In_ PARBITER_INSTANCE Arbiter, _Inout_ PARBITER_ALLOCATION_STATE ArbState)
 
typedef BOOLEAN(NTAPIPARB_GET_NEXT_ALLOCATION_RANGE) (_In_ PARBITER_INSTANCE Arbiter, _Inout_ PARBITER_ALLOCATION_STATE ArbState)
 
typedef BOOLEAN(NTAPIPARB_FIND_SUITABLE_RANGE) (_In_ PARBITER_INSTANCE Arbiter, _Inout_ PARBITER_ALLOCATION_STATE ArbState)
 
typedef VOID(NTAPIPARB_ADD_ALLOCATION) (_In_ PARBITER_INSTANCE Arbiter, _Inout_ PARBITER_ALLOCATION_STATE ArbState)
 
typedef VOID(NTAPIPARB_BACKTRACK_ALLOCATION) (_In_ PARBITER_INSTANCE Arbiter, _Inout_ PARBITER_ALLOCATION_STATE ArbState)
 
typedef BOOLEAN(NTAPIPARB_OVERRIDE_CONFLICT) (_In_ PARBITER_INSTANCE Arbiter, _Inout_ PARBITER_ALLOCATION_STATE ArbState)
 
typedef NTSTATUS(NTAPIPARB_TRANSLATE_ORDERING) (_Out_ PIO_RESOURCE_DESCRIPTOR OutIoDescriptor, _In_ PIO_RESOURCE_DESCRIPTOR IoDescriptor)
 
typedef NTSTATUS(NTAPIPARB_INITIALIZE_RANGE_LIST) (_In_ PARBITER_INSTANCE Arbiter, _In_ ULONG DescriptorCount, _In_ PCM_PARTIAL_RESOURCE_DESCRIPTOR Descriptors, _Inout_ PRTL_RANGE_LIST RangeList)
 
typedef struct _ARBITER_INSTANCE ARBITER_INSTANCE
 

Functions

NTSTATUS NTAPI ArbiterLibInitializeInstance (_Inout_ PARBITER_INSTANCE Arbiter, _In_ PDEVICE_OBJECT BusDeviceObject, _In_ CM_RESOURCE_TYPE ResourceType, _In_ PCWSTR ArbiterName, _In_ PCWSTR OrderName, _In_ PARB_TRANSLATE_ORDERING TranslateOrderingFunction)
 
VOID NTAPI ArbiterLibDeleteInstance (_In_ PARBITER_INSTANCE Arbiter)
 
VOID NTAPI ArbiterLibFreeOrderingList (_Inout_ PARBITER_ORDERING_LIST OrderingList)
 
NTSTATUS NTAPI ArbiterLibAddOrdering (_Inout_ PARBITER_ORDERING_LIST OrderingList, _In_ UINT64 Start, _In_ UINT64 End)
 
NTSTATUS NTAPI ArbiterLibDefaultAssignmentOrdering (_Inout_ PARBITER_INSTANCE Arbiter, _In_ PCWSTR AllocationOrderName, _In_ PCWSTR ReservedResourcesName, _In_opt_ PARB_TRANSLATE_ORDERING TranslateOrderingFunction)
 
NTSTATUS NTAPI ArbiterLibHandler (_In_ PVOID Context, _In_ ARBITER_ACTION Action, _Inout_ PARBITER_PARAMETERS Parameters)
 
NTSTATUS NTAPI ArbiterLibTestAllocation (_In_ PARBITER_INSTANCE Arbiter, _Inout_ PARBITER_TEST_ALLOCATION_PARAMETERS Parameters)
 
NTSTATUS NTAPI ArbiterLibRetestAllocation (_In_ PARBITER_INSTANCE Arbiter, _Inout_ PARBITER_RETEST_ALLOCATION_PARAMETERS Parameters)
 
NTSTATUS NTAPI ArbiterLibBootAllocation (_In_ PARBITER_INSTANCE Arbiter, _Inout_ PARBITER_BOOT_ALLOCATION_PARAMETERS Parameters)
 
NTSTATUS NTAPI ArbiterLibQueryConflict (_In_ PARBITER_INSTANCE Arbiter, _Inout_ PARBITER_QUERY_CONFLICT_PARAMETERS Parameters)
 
NTSTATUS NTAPI ArbiterLibCommitAllocation (_In_ PARBITER_INSTANCE Arbiter)
 
NTSTATUS NTAPI ArbiterLibRollbackAllocation (_In_ PARBITER_INSTANCE Arbiter)
 
BOOLEAN NTAPI ArbiterLibGetNextAllocationRange (_In_ PARBITER_INSTANCE Arbiter, _Inout_ PARBITER_ALLOCATION_STATE ArbState)
 Moves the working window to the next candidate range, walking the entry's alternatives in priority order across the arbiter's ordering list.
 
BOOLEAN NTAPI ArbiterLibFindSuitableRange (_In_ PARBITER_INSTANCE Arbiter, _Inout_ PARBITER_ALLOCATION_STATE ArbState)
 Finds a free range of the current candidate window in the arbiter's tentative allocation list.
 
VOID NTAPI ArbiterLibAddAllocation (_In_ PARBITER_INSTANCE Arbiter, _Inout_ PARBITER_ALLOCATION_STATE ArbState)
 Records the chosen placement in the arbiter's tentative allocation list, owned by the requesting device.
 
VOID NTAPI ArbiterLibBacktrackAllocation (_In_ PARBITER_INSTANCE Arbiter, _Inout_ PARBITER_ALLOCATION_STATE ArbState)
 Undoes the last AddAllocation performed for this entry.
 

Macro Definition Documentation

◆ ARBITER_ALTERNATIVE_FLAG_FIXED

#define ARBITER_ALTERNATIVE_FLAG_FIXED   0x00000001

Definition at line 28 of file arbiter.h.

◆ ARBITER_ALTERNATIVE_FLAG_SHARED

#define ARBITER_ALTERNATIVE_FLAG_SHARED   0x00000002

Definition at line 29 of file arbiter.h.

◆ ARBITER_PRIORITY_EXHAUSTED

#define ARBITER_PRIORITY_EXHAUSTED   0x7FFFFFFF

Definition at line 25 of file arbiter.h.

◆ ARBITER_PRIORITY_NULL

#define ARBITER_PRIORITY_NULL   0x00000000

Definition at line 22 of file arbiter.h.

◆ ARBITER_PRIORITY_PREFERRED_RESERVED

#define ARBITER_PRIORITY_PREFERRED_RESERVED   0x7FFFFFFD

Definition at line 23 of file arbiter.h.

◆ ARBITER_PRIORITY_RESERVED

#define ARBITER_PRIORITY_RESERVED   0x7FFFFFFE

Definition at line 24 of file arbiter.h.

◆ ARBITER_RANGE_BOOT_ALLOCATED

#define ARBITER_RANGE_BOOT_ALLOCATED   0x04

Definition at line 41 of file arbiter.h.

◆ ARBITER_RANGE_SHARED_DRIVER

#define ARBITER_RANGE_SHARED_DRIVER   0x0

Definition at line 40 of file arbiter.h.

◆ ARBITER_STATE_FLAG_NULL_CONFLICT_OK

#define ARBITER_STATE_FLAG_NULL_CONFLICT_OK   0x0001

Definition at line 44 of file arbiter.h.

◆ TAG_ARBITER

#define TAG_ARBITER   'ibrA'

Definition at line 10 of file arbiter.h.

Typedef Documentation

◆ ARBITER_ALLOCATION_STATE

◆ ARBITER_ALTERNATIVE

◆ ARBITER_INSTANCE

◆ ARBITER_ORDERING

◆ ARBITER_ORDERING_LIST

◆ PARB_ADD_ALLOCATION

typedef VOID(NTAPI * PARB_ADD_ALLOCATION) (_In_ PARBITER_INSTANCE Arbiter, _Inout_ PARBITER_ALLOCATION_STATE ArbState)

Definition at line 241 of file arbiter.h.

◆ PARB_ADD_RESERVED

Definition at line 153 of file arbiter.h.

◆ PARB_ALLOCATE_ENTRY

typedef NTSTATUS(NTAPI * PARB_ALLOCATE_ENTRY) (_In_ PARBITER_INSTANCE Arbiter, _Inout_ PARBITER_ALLOCATION_STATE ArbState)

Definition at line 223 of file arbiter.h.

◆ PARB_BACKTRACK_ALLOCATION

typedef VOID(NTAPI * PARB_BACKTRACK_ALLOCATION) (_In_ PARBITER_INSTANCE Arbiter, _Inout_ PARBITER_ALLOCATION_STATE ArbState)

Definition at line 247 of file arbiter.h.

◆ PARB_BOOT_ALLOCATION

Definition at line 135 of file arbiter.h.

◆ PARB_COMMIT_ALLOCATION

typedef NTSTATUS(NTAPI * PARB_COMMIT_ALLOCATION) (_In_ PARBITER_INSTANCE Arbiter)

Definition at line 201 of file arbiter.h.

◆ PARB_FIND_SUITABLE_RANGE

typedef BOOLEAN(NTAPI * PARB_FIND_SUITABLE_RANGE) (_In_ PARBITER_INSTANCE Arbiter, _Inout_ PARBITER_ALLOCATION_STATE ArbState)

Definition at line 235 of file arbiter.h.

◆ PARB_GET_NEXT_ALLOCATION_RANGE

typedef BOOLEAN(NTAPI * PARB_GET_NEXT_ALLOCATION_RANGE) (_In_ PARBITER_INSTANCE Arbiter, _Inout_ PARBITER_ALLOCATION_STATE ArbState)

Definition at line 229 of file arbiter.h.

◆ PARB_INITIALIZE_RANGE_LIST

typedef NTSTATUS(NTAPI * PARB_INITIALIZE_RANGE_LIST) (_In_ PARBITER_INSTANCE Arbiter, _In_ ULONG DescriptorCount, _In_ PCM_PARTIAL_RESOURCE_DESCRIPTOR Descriptors, _Inout_ PRTL_RANGE_LIST RangeList)

Definition at line 266 of file arbiter.h.

◆ PARB_OVERRIDE_CONFLICT

typedef BOOLEAN(NTAPI * PARB_OVERRIDE_CONFLICT) (_In_ PARBITER_INSTANCE Arbiter, _Inout_ PARBITER_ALLOCATION_STATE ArbState)

Definition at line 253 of file arbiter.h.

◆ PARB_PACK_RESOURCE

typedef NTSTATUS(NTAPI * PARB_PACK_RESOURCE) (_In_ PIO_RESOURCE_DESCRIPTOR IoDescriptor, _In_ UINT64 Start, _Out_ PCM_PARTIAL_RESOURCE_DESCRIPTOR CmDescriptor)

Definition at line 103 of file arbiter.h.

◆ PARB_PREPROCESS_ENTRY

typedef NTSTATUS(NTAPI * PARB_PREPROCESS_ENTRY) (_In_ PARBITER_INSTANCE Arbiter, _Inout_ PARBITER_ALLOCATION_STATE ArbState)

Definition at line 217 of file arbiter.h.

◆ PARB_QUERY_ARBITRATE

Definition at line 141 of file arbiter.h.

◆ PARB_QUERY_CONFLICT

Definition at line 147 of file arbiter.h.

◆ PARB_RETEST_ALLOCATION

Definition at line 129 of file arbiter.h.

◆ PARB_ROLLBACK_ALLOCATION

typedef NTSTATUS(NTAPI * PARB_ROLLBACK_ALLOCATION) (_In_ PARBITER_INSTANCE Arbiter)

Definition at line 206 of file arbiter.h.

◆ PARB_SCORE_REQUIREMENT

typedef INT32(NTAPI * PARB_SCORE_REQUIREMENT) (_In_ PIO_RESOURCE_DESCRIPTOR IoDescriptor)

Definition at line 117 of file arbiter.h.

◆ PARB_START_ARBITER

typedef NTSTATUS(NTAPI * PARB_START_ARBITER) (_In_ PARBITER_INSTANCE Arbiter, _In_ PCM_RESOURCE_LIST StartResources)

Definition at line 211 of file arbiter.h.

◆ PARB_TEST_ALLOCATION

Definition at line 123 of file arbiter.h.

◆ PARB_TRANSLATE_ORDERING

typedef NTSTATUS(NTAPI * PARB_TRANSLATE_ORDERING) (_Out_ PIO_RESOURCE_DESCRIPTOR OutIoDescriptor, _In_ PIO_RESOURCE_DESCRIPTOR IoDescriptor)

Definition at line 259 of file arbiter.h.

◆ PARB_UNPACK_REQUIREMENT

typedef NTSTATUS(NTAPI * PARB_UNPACK_REQUIREMENT) (_In_ PIO_RESOURCE_DESCRIPTOR IoDescriptor, _Out_ PUINT64 OutMinimumAddress, _Out_ PUINT64 OutMaximumAddress, _Out_ PUINT64 OutLength, _Out_ PUINT64 OutAlignment)

Definition at line 94 of file arbiter.h.

◆ PARB_UNPACK_RESOURCE

typedef NTSTATUS(NTAPI * PARB_UNPACK_RESOURCE) (_In_ PCM_PARTIAL_RESOURCE_DESCRIPTOR CmDescriptor, _Out_ PUINT64 Start, _Out_ PUINT64 OutLength)

Definition at line 110 of file arbiter.h.

◆ PARBITER_ALLOCATION_STATE

◆ PARBITER_ALTERNATIVE

◆ PARBITER_INSTANCE

Definition at line 92 of file arbiter.h.

◆ PARBITER_ORDERING

◆ PARBITER_ORDERING_LIST

Function Documentation

◆ ArbiterLibAddAllocation()

VOID NTAPI ArbiterLibAddAllocation ( _In_ PARBITER_INSTANCE  Arbiter,
_Inout_ PARBITER_ALLOCATION_STATE  ArbState 
)

Records the chosen placement in the arbiter's tentative allocation list, owned by the requesting device.

Parameters
[in]ArbiterThe arbiter instance whose PossibleAllocation list receives the range.
[in,out]ArbStateThe allocation state whose Start, End and RangeAttributes describe the placement. The range is owned by the entry's physical device object.
Remarks
ADD_IF_CONFLICT is required because override solutions intentionally overlap existing ranges.

Definition at line 618 of file range.c.

621{
623
624 PAGED_CODE();
625
626 if (ArbState->CurrentAlternative != NULL &&
627 (ArbState->CurrentAlternative->Flags & ARBITER_ALTERNATIVE_FLAG_SHARED))
628 {
630 }
631
632 RtlAddRange(Arbiter->PossibleAllocation,
633 ArbState->Start,
634 ArbState->End,
635 ArbState->RangeAttributes,
636 Flags,
637 NULL,
638 ArbState->Entry ? ArbState->Entry->PhysicalDeviceObject : NULL);
639}
#define PAGED_CODE()
#define ARBITER_ALTERNATIVE_FLAG_SHARED
Definition: arbiter.h:29
#define NULL
Definition: types.h:112
NTSYSAPI NTSTATUS NTAPI RtlAddRange(_Inout_ PRTL_RANGE_LIST RangeList, _In_ ULONGLONG Start, _In_ ULONGLONG End, _In_ UCHAR Attributes, _In_ ULONG Flags, _In_opt_ PVOID UserData, _In_opt_ PVOID Owner)
#define RTL_RANGE_LIST_ADD_IF_CONFLICT
Definition: rtltypes.h:81
#define RTL_RANGE_LIST_ADD_SHARED
Definition: rtltypes.h:82
uint32_t ULONG
Definition: typedefs.h:59
_Must_inspect_result_ _In_ ULONG Flags
Definition: wsk.h:170

Referenced by ArbiterLibInitializeInstance().

◆ ArbiterLibAddOrdering()

NTSTATUS NTAPI ArbiterLibAddOrdering ( _Inout_ PARBITER_ORDERING_LIST  OrderingList,
_In_ UINT64  Start,
_In_ UINT64  End 
)

Definition at line 70 of file ordering.c.

74{
75 PAGED_CODE();
76
77 if (End < Start)
79
80 /* Double the array capacity when it fills up, up to the sanity cap. */
81 if (OrderingList->Count == OrderingList->Maximum)
82 {
83 ULONG NewMaximum;
84 PARBITER_ORDERING NewArray;
85
86 NewMaximum = OrderingList->Maximum ? (ULONG)OrderingList->Maximum * 2
88 if (NewMaximum > ARBITER_ORDERING_LIMIT)
90
92 NewMaximum * sizeof(ARBITER_ORDERING),
94 if (NewArray == NULL)
96
97 if (OrderingList->Orderings != NULL)
98 {
99 RtlCopyMemory(NewArray, OrderingList->Orderings,
100 OrderingList->Count * sizeof(ARBITER_ORDERING));
101 ExFreePoolWithTag(OrderingList->Orderings, TAG_ARBITER);
102 }
103
104 OrderingList->Maximum = (UINT16)NewMaximum;
105 OrderingList->Orderings = NewArray;
106 }
107
108 OrderingList->Orderings[OrderingList->Count].Start = Start;
109 OrderingList->Orderings[OrderingList->Count].End = End;
110 OrderingList->Count++;
111 return STATUS_SUCCESS;
112}
static _Out_opt_ PULONGLONG Start
unsigned short UINT16
Definition: actypes.h:129
#define TAG_ARBITER
Definition: arbiter.h:10
#define ExAllocatePoolWithTag(hernya, size, tag)
Definition: env_spec_w32.h:350
#define PagedPool
Definition: env_spec_w32.h:308
if(dx< 0)
Definition: linetemp.h:194
#define ExFreePoolWithTag(_P, _T)
Definition: module.h:1109
#define ARBITER_ORDERING_LIMIT
Definition: ordering.c:18
#define ARBITER_ORDERING_GRANULARITY
Definition: ordering.c:17
#define STATUS_SUCCESS
Definition: shellext.h:65
UINT64 Start
Definition: arbiter.h:81
#define RtlCopyMemory(Destination, Source, Length)
Definition: typedefs.h:263
#define STATUS_INVALID_PARAMETER
Definition: udferr_usr.h:135
#define STATUS_INSUFFICIENT_RESOURCES
Definition: udferr_usr.h:158

Referenced by ArbiterLibDefaultAssignmentOrdering(), and ArbpAddOrderingCallback().

◆ ArbiterLibBacktrackAllocation()

VOID NTAPI ArbiterLibBacktrackAllocation ( _In_ PARBITER_INSTANCE  Arbiter,
_Inout_ PARBITER_ALLOCATION_STATE  ArbState 
)

Undoes the last AddAllocation performed for this entry.

Parameters
[in]ArbiterThe arbiter instance whose PossibleAllocation list the tentative range is deleted from.
[in,out]ArbStateThe allocation state whose Start and End describe the placement being removed sanity checked by the entry's physical device object.

Definition at line 656 of file range.c.

659{
660 PAGED_CODE();
661
662 RtlDeleteRange(Arbiter->PossibleAllocation,
663 ArbState->Start,
664 ArbState->End,
665 ArbState->Entry ? ArbState->Entry->PhysicalDeviceObject : NULL);
666}
NTSYSAPI NTSTATUS NTAPI RtlDeleteRange(_Inout_ PRTL_RANGE_LIST RangeList, _In_ ULONGLONG Start, _In_ ULONGLONG End, _In_ PVOID Owner)

Referenced by ArbiterLibInitializeInstance().

◆ ArbiterLibBootAllocation()

NTSTATUS NTAPI ArbiterLibBootAllocation ( _In_ PARBITER_INSTANCE  Arbiter,
_Inout_ PARBITER_BOOT_ALLOCATION_PARAMETERS  Parameters 
)

Definition at line 61 of file arbiter.c.

69{
70 PAGED_CODE();
71
74}
#define UNIMPLEMENTED
Definition: ntoskrnl.c:15
#define STATUS_NOT_IMPLEMENTED
Definition: d3dkmdt.h:42

Referenced by ArbiterLibInitializeInstance().

◆ ArbiterLibCommitAllocation()

NTSTATUS NTAPI ArbiterLibCommitAllocation ( _In_ PARBITER_INSTANCE  Arbiter)

Definition at line 138 of file arbiter.c.

140{
141 PAGED_CODE();
142
145}

Referenced by ArbiterLibInitializeInstance().

◆ ArbiterLibDefaultAssignmentOrdering()

NTSTATUS NTAPI ArbiterLibDefaultAssignmentOrdering ( _Inout_ PARBITER_INSTANCE  Arbiter,
_In_ PCWSTR  AllocationOrderName,
_In_ PCWSTR  ReservedResourcesName,
_In_opt_ PARB_TRANSLATE_ORDERING  TranslateOrderingFunction 
)

Definition at line 328 of file ordering.c.

333{
335
336 PAGED_CODE();
337
338 UNREFERENCED_PARAMETER(ReservedResourcesName);
339 UNREFERENCED_PARAMETER(TranslateOrderingFunction);
340
341 ArbiterLibFreeOrderingList(&Arbiter->OrderingList);
342 ArbiterLibFreeOrderingList(&Arbiter->ReservedList);
343
344 Status = ArbpCreateOrderingList(&Arbiter->OrderingList);
345 if (!NT_SUCCESS(Status))
346 return Status;
347 Status = ArbpCreateOrderingList(&Arbiter->ReservedList);
348 if (!NT_SUCCESS(Status))
349 {
350 ArbiterLibFreeOrderingList(&Arbiter->OrderingList);
351 return Status;
352 }
353
354 ArbpForEachRegistryRange(Arbiter, L"AllocationOrder", AllocationOrderName,
356
357 return ArbiterLibAddOrdering(&Arbiter->OrderingList, 0, 0xFFFFFFFFFFFFFFFFULL);
358}
LONG NTSTATUS
Definition: precomp.h:26
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:33
#define L(x)
Definition: resources.c:13
Status
Definition: gdiplustypes.h:24
#define UNREFERENCED_PARAMETER(P)
Definition: ntbasedef.h:329
static NTSTATUS ArbpCreateOrderingList(_Out_ PARBITER_ORDERING_LIST OrderingList)
Definition: ordering.c:29
static VOID NTAPI ArbpAddOrderingCallback(_In_ PARBITER_INSTANCE Arbiter, _In_opt_ PVOID Context, _In_ ULONGLONG Start, _In_ ULONGLONG End)
Definition: ordering.c:305
static NTSTATUS ArbpForEachRegistryRange(_In_ PARBITER_INSTANCE Arbiter, _In_ PCWSTR Subkey, _In_ PCWSTR ValueName, _In_ PARB_RANGE_CALLBACK Callback, _In_opt_ PVOID Context)
Definition: ordering.c:230
VOID NTAPI ArbiterLibFreeOrderingList(_Inout_ PARBITER_ORDERING_LIST OrderingList)
Definition: ordering.c:52
NTSTATUS NTAPI ArbiterLibAddOrdering(_Inout_ PARBITER_ORDERING_LIST OrderingList, _In_ UINT64 Start, _In_ UINT64 End)
Definition: ordering.c:70

Referenced by ArbiterLibInitializeInstance(), and ario_ApplyBrokenVideoHack().

◆ ArbiterLibDeleteInstance()

VOID NTAPI ArbiterLibDeleteInstance ( _In_ PARBITER_INSTANCE  Arbiter)

Definition at line 252 of file arbiter.c.

254{
255 PAGED_CODE();
256
257 if (Arbiter->PossibleAllocation)
258 {
259 RtlFreeRangeList(Arbiter->PossibleAllocation);
260 ExFreePoolWithTag(Arbiter->PossibleAllocation, TAG_ARBITER);
261 Arbiter->PossibleAllocation = NULL;
262 }
263
264 if (Arbiter->Allocation)
265 {
266 RtlFreeRangeList(Arbiter->Allocation);
267 ExFreePoolWithTag(Arbiter->Allocation, TAG_ARBITER);
268 Arbiter->Allocation = NULL;
269 }
270
271 if (Arbiter->AllocationStack)
272 {
273 ExFreePoolWithTag(Arbiter->AllocationStack, TAG_ARBITER);
274 Arbiter->AllocationStack = NULL;
275 Arbiter->AllocationStackMaxSize = 0;
276 }
277
278 ArbiterLibFreeOrderingList(&Arbiter->OrderingList);
279 ArbiterLibFreeOrderingList(&Arbiter->ReservedList);
280
281#if (NTDDI_VERSION >= NTDDI_VISTA)
282 if (Arbiter->TransactionEvent)
283 {
284 ExFreePoolWithTag(Arbiter->TransactionEvent, TAG_ARBITER);
285 Arbiter->TransactionEvent = NULL;
286 }
287#endif
288
289 if (Arbiter->MutexEvent)
290 {
291 ExFreePoolWithTag(Arbiter->MutexEvent, TAG_ARBITER);
292 Arbiter->MutexEvent = NULL;
293 }
294}
VOID NTAPI ArbiterLibFreeOrderingList(_Inout_ PARBITER_ORDERING_LIST OrderingList)
Definition: ordering.c:52
NTSYSAPI VOID NTAPI RtlFreeRangeList(_In_ PRTL_RANGE_LIST RangeList)

Referenced by ArbiterLibInitializeInstance().

◆ ArbiterLibFindSuitableRange()

BOOLEAN NTAPI ArbiterLibFindSuitableRange ( _In_ PARBITER_INSTANCE  Arbiter,
_Inout_ PARBITER_ALLOCATION_STATE  ArbState 
)

Finds a free range of the current candidate window in the arbiter's tentative allocation list.

Parameters
[in]ArbiterThe arbiter instance whose PossibleAllocation list is searched.
[in,out]ArbStateThe allocation state of the entry being placed. On success, Start and End receive the chosen window.
Returns
Returns TRUE if a placement was found,FALSE if the window cannot satisfy the requirement.
Remarks
Legacy requests treat boot-allocated ranges as available. When RtlFindRange reports a conflict, a driver-exclusive requirement may still share the range (ArbpShareDriverExclusive), and failing that the arbiter's OverrideConflict callback gets a last-chance override. this is how a device is re-assigned its own boot configuration.

Definition at line 520 of file range.c.

523{
524 PARBITER_ALTERNATIVE Alternative = ArbState->CurrentAlternative;
525 ULONG Flags = 0;
527
528 PAGED_CODE();
529
530 if (Alternative == NULL)
531 return FALSE;
532
533 if (ArbState->CurrentMinimum > ArbState->CurrentMaximum)
534 return FALSE;
535
536 if (Alternative->Length == 0)
537 {
538 ArbState->Start = ArbState->CurrentMinimum;
539 ArbState->End = ArbState->CurrentMinimum;
540 return TRUE;
541 }
542
543 /*
544 * Interrupt retention: give the device back its firmware-routed vector rather
545 * than letting the top-down search pick an untranslatable one
546 */
547 if (ArbpReuseOwnedInterrupt(Arbiter, ArbState))
548 return TRUE;
549
550 /* Legacy requests consider preallocated (boot) ranges available. */
551 if (ArbState->Entry != NULL &&
552 (ArbState->Entry->RequestSource == ArbiterRequestLegacyReported ||
553 ArbState->Entry->RequestSource == ArbiterRequestLegacyAssigned))
554 {
555 ArbState->RangeAvailableAttributes |= ARBITER_RANGE_BOOT_ALLOCATED;
556 }
557
558 if (ArbState->Flags & ARBITER_STATE_FLAG_NULL_CONFLICT_OK)
560 if (Alternative->Flags & ARBITER_ALTERNATIVE_FLAG_SHARED)
562
563 Status = RtlFindRange(Arbiter->PossibleAllocation,
564 ArbState->CurrentMinimum,
565 ArbState->CurrentMaximum,
566 (ULONG)Alternative->Length,
567 (ULONG)(Alternative->Alignment ? Alternative->Alignment : 1),
568 Flags,
569 ArbState->RangeAvailableAttributes,
570 Arbiter->ConflictCallbackContext,
571 Arbiter->ConflictCallback,
572 &ArbState->Start);
573 if (!NT_SUCCESS(Status))
574 {
575 /*
576 * The window is occupied. A CmResourceShareDriverExclusive requirement
577 * can still succeed by sharing the conflicting range with the same driver
578 * or another root-enumerated device
579 *
580 * This matters a lot because HAL reverses quite a bit and marks it this.
581 * This mechanism is how Windows "internally allows this".
582 */
583 if (ArbpShareDriverExclusive(Arbiter, ArbState))
584 return TRUE;
585 if (Arbiter->OverrideConflict != NULL &&
586 Arbiter->OverrideConflict(Arbiter, ArbState))
587 {
588 return TRUE;
589 }
590 return FALSE;
591 }
592
593 ArbState->End = ArbState->Start + Alternative->Length - 1;
594 return TRUE;
595}
#define ARBITER_STATE_FLAG_NULL_CONFLICT_OK
Definition: arbiter.h:44
#define ARBITER_RANGE_BOOT_ALLOCATED
Definition: arbiter.h:41
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
NTSYSAPI NTSTATUS NTAPI RtlFindRange(_In_ PRTL_RANGE_LIST RangeList, _In_ ULONGLONG Minimum, _In_ ULONGLONG Maximum, _In_ ULONG Length, _In_ ULONG Alignment, _In_ ULONG Flags, _In_ UCHAR AttributeAvailableMask, _In_opt_ PVOID Context, _In_opt_ PRTL_CONFLICT_RANGE_CALLBACK Callback, _Out_ PULONGLONG Start)
#define RTL_RANGE_LIST_NULL_CONFLICT_OK
Definition: rtltypes.h:90
#define RTL_RANGE_LIST_SHARED_OK
Definition: rtltypes.h:89
static BOOLEAN ArbpShareDriverExclusive(_In_ PARBITER_INSTANCE Arbiter, _Inout_ PARBITER_ALLOCATION_STATE ArbState)
Attempts last-chance sharing for a CmResourceShareDriverExclusive requirement whose window RtlFindRan...
Definition: range.c:215
static BOOLEAN ArbpReuseOwnedInterrupt(_In_ PARBITER_INSTANCE Arbiter, _Inout_ PARBITER_ALLOCATION_STATE ArbState)
Hands a device back its own already routed IRQ instead of searching for a fresh one,...
Definition: range.c:316
@ ArbiterRequestLegacyAssigned
Definition: iotypes.h:4619
@ ArbiterRequestLegacyReported
Definition: iotypes.h:4617

Referenced by ArbiterLibInitializeInstance().

◆ ArbiterLibFreeOrderingList()

VOID NTAPI ArbiterLibFreeOrderingList ( _Inout_ PARBITER_ORDERING_LIST  OrderingList)

Definition at line 52 of file ordering.c.

54{
55 PAGED_CODE();
56
57 if (OrderingList->Orderings != NULL)
58 ExFreePoolWithTag(OrderingList->Orderings, TAG_ARBITER);
59
60 OrderingList->Orderings = NULL;
61 OrderingList->Count = 0;
62 OrderingList->Maximum = 0;
63}

Referenced by ArbiterLibDefaultAssignmentOrdering(), ArbiterLibDeleteInstance(), and ario_ApplyBrokenVideoHack().

◆ ArbiterLibGetNextAllocationRange()

BOOLEAN NTAPI ArbiterLibGetNextAllocationRange ( _In_ PARBITER_INSTANCE  Arbiter,
_Inout_ PARBITER_ALLOCATION_STATE  ArbState 
)

Moves the working window to the next candidate range, walking the entry's alternatives in priority order across the arbiter's ordering list.

Parameters
[in]ArbiterThe arbiter instance whose ordering list supplies the candidate windows.
[in,out]ArbStateThe allocation state of the entry being placed. On success, CurrentMinimum, CurrentMaximum and CurrentAlternative describe the next window to search; the window is pre-trimmed so an aligned allocation of the required length fits inside it.
Returns
Returns TRUE if a new candidate window was produced, FALSE once every alternative is exhausted.

Definition at line 379 of file range.c.

382{
383 PARBITER_ALTERNATIVE Alternative;
385 UINT64 Minimum, Maximum;
386
387 PAGED_CODE();
388
389 if (ArbState->AlternativeCount == 0)
390 return FALSE;
391
392 for (;;)
393 {
394 /* Advance the alternative we last worked on, or seed all on first entry. */
395 if (ArbState->CurrentAlternative != NULL)
396 {
397 ArbpWritePriority(Arbiter, ArbState->CurrentAlternative);
398 }
399 else
400 {
401 for (Alternative = ArbState->Alternatives;
402 Alternative < &ArbState->Alternatives[ArbState->AlternativeCount];
403 ++Alternative)
404 {
405 Alternative->Priority = ARBITER_PRIORITY_NULL;
406 ArbpWritePriority(Arbiter, Alternative);
407 }
408 }
409
410 /* Pick the best (lowest-priority) alternative. */
411 Lowest = ArbState->Alternatives;
412 for (Alternative = ArbState->Alternatives + 1;
413 Alternative < &ArbState->Alternatives[ArbState->AlternativeCount];
414 ++Alternative)
415 {
416 if (Alternative->Priority < Lowest->Priority)
417 Lowest = Alternative;
418 }
419
421 return FALSE;
422
423 if (Lowest->Priority == ARBITER_PRIORITY_RESERVED ||
425 {
426 /* Final pass: the whole requirement window. */
427 Minimum = Lowest->Minimum;
428 Maximum = Lowest->Maximum;
429 }
430 else
431 {
432 PARBITER_ORDERING Ordering;
433 ULONG Index = (Lowest->Priority < 0) ? (ULONG)(-(Lowest->Priority + 1))
434 : (ULONG)(Lowest->Priority - 1);
435 if (Index >= Arbiter->OrderingList.Count)
436 {
438 continue;
439 }
440 Ordering = &Arbiter->OrderingList.Orderings[Index];
441 Minimum = max(Lowest->Minimum, Ordering->Start);
442 Maximum = min(Lowest->Maximum, Ordering->End);
443 }
444
445 /*
446 * Trim the window so an aligned allocation of the required length is
447 * possible; skip the window entirely if it cannot hold one.
448 */
449 if (Lowest->Length != 0)
450 {
451 UINT64 Alignment = Lowest->Alignment ? Lowest->Alignment : 1;
452 UINT64 LengthMinusOne = Lowest->Length - 1;
453 UINT64 AlignedMax;
454
455 Minimum += Alignment - 1;
456 Minimum -= Minimum % Alignment;
457
458 if (Minimum > Maximum || LengthMinusOne > Maximum - Minimum)
459 {
460 ArbState->CurrentAlternative = Lowest; /* consume this priority */
461 continue;
462 }
463
464 AlignedMax = Maximum - LengthMinusOne;
465 AlignedMax -= AlignedMax % Alignment;
466 if (AlignedMax < Minimum)
467 {
468 ArbState->CurrentAlternative = Lowest; /* no aligned start fits */
469 continue;
470 }
471 Maximum = AlignedMax + LengthMinusOne;
472 }
473 else
474 {
475 Minimum = Lowest->Minimum;
476 Maximum = Lowest->Maximum;
477 }
478
479 if (Minimum != ArbState->CurrentMinimum ||
480 Maximum != ArbState->CurrentMaximum ||
481 ArbState->CurrentAlternative != Lowest)
482 {
483 ArbState->CurrentMinimum = Minimum;
484 ArbState->CurrentMaximum = Maximum;
485 ArbState->CurrentAlternative = Lowest;
486 return TRUE;
487 }
488
489 ArbState->CurrentAlternative = Lowest;
490 }
491}
COMPILER_DEPENDENT_UINT64 UINT64
Definition: actypes.h:131
#define ARBITER_PRIORITY_NULL
Definition: arbiter.h:22
#define ARBITER_PRIORITY_RESERVED
Definition: arbiter.h:24
#define ARBITER_PRIORITY_EXHAUSTED
Definition: arbiter.h:25
#define ARBITER_PRIORITY_PREFERRED_RESERVED
Definition: arbiter.h:23
union Alignment_ Alignment
#define min(a, b)
Definition: monoChain.cc:55
static VOID ArbpWritePriority(_In_ PARBITER_INSTANCE Arbiter, _Inout_ PARBITER_ALTERNATIVE Alternative)
Writes an alternative's priority to the next ordering-list range it can be satisfied from.
Definition: range.c:38
#define max(a, b)
Definition: svc.c:63
_In_ WDFCOLLECTION _In_ ULONG Index

Referenced by ArbiterLibInitializeInstance().

◆ ArbiterLibHandler()

NTSTATUS NTAPI ArbiterLibHandler ( _In_ PVOID  Context,
_In_ ARBITER_ACTION  Action,
_Inout_ PARBITER_PARAMETERS  Parameters 
)

Definition at line 238 of file arbiter.c.

242{
243 PAGED_CODE();
244
247}

◆ ArbiterLibInitializeInstance()

NTSTATUS NTAPI ArbiterLibInitializeInstance ( _Inout_ PARBITER_INSTANCE  Arbiter,
_In_ PDEVICE_OBJECT  BusDeviceObject,
_In_ CM_RESOURCE_TYPE  ResourceType,
_In_ PCWSTR  ArbiterName,
_In_ PCWSTR  OrderName,
_In_ PARB_TRANSLATE_ORDERING  TranslateOrderingFunction 
)

Definition at line 299 of file arbiter.c.

306{
308
309 PAGED_CODE();
310
311 DPRINT("ArbiterLibInitializeInstance: '%S'\n", ArbiterName);
312
313 ASSERT(Arbiter->UnpackRequirement != NULL);
314 ASSERT(Arbiter->PackResource != NULL);
315 ASSERT(Arbiter->UnpackResource != NULL);
316 ASSERT(Arbiter->MutexEvent == NULL);
317 ASSERT(Arbiter->Allocation == NULL);
318 ASSERT(Arbiter->PossibleAllocation == NULL);
319 ASSERT(Arbiter->AllocationStack == NULL);
320
321 Arbiter->Signature = ARBITER_SIG;
322 Arbiter->BusDeviceObject = BusDeviceObject;
323 Arbiter->Name = ArbiterName;
324 Arbiter->ResourceType = ResourceType;
325 Arbiter->TransactionInProgress = FALSE;
326#if (NTDDI_VERSION >= NTDDI_VISTA)
327 Arbiter->OrderingName = OrderName;
328#endif
329
330 /* The per-instance lock: a signaled synchronization event used as a mutex. */
331 Arbiter->MutexEvent = ExAllocatePoolWithTag(NonPagedPool, sizeof(KEVENT), TAG_ARBITER);
332 if (!Arbiter->MutexEvent)
333 {
335 goto Failure;
336 }
337 KeInitializeEvent(Arbiter->MutexEvent, SynchronizationEvent, TRUE);
338
339#if (NTDDI_VERSION >= NTDDI_VISTA)
340 /* Vista+: a notification event exposing whether a Test is outstanding. */
341 Arbiter->TransactionEvent = ExAllocatePoolWithTag(NonPagedPool, sizeof(KEVENT), TAG_ARBITER);
342 if (!Arbiter->TransactionEvent)
343 {
345 goto Failure;
346 }
347 KeInitializeEvent(Arbiter->TransactionEvent, NotificationEvent, TRUE);
348#endif
349
350 Arbiter->AllocationStack = ExAllocatePoolWithTag(PagedPool, PAGE_SIZE, TAG_ARBITER);
351 if (!Arbiter->AllocationStack)
352 {
354 goto Failure;
355 }
356 Arbiter->AllocationStackMaxSize = PAGE_SIZE;
357 Arbiter->Allocation = ExAllocatePoolWithTag(PagedPool, sizeof(RTL_RANGE_LIST), TAG_ARBITER);
358 if (!Arbiter->Allocation)
359 {
361 goto Failure;
362 }
363 RtlInitializeRangeList(Arbiter->Allocation);
364
365 Arbiter->PossibleAllocation = ExAllocatePoolWithTag(PagedPool, sizeof(RTL_RANGE_LIST), TAG_ARBITER);
366 if (!Arbiter->PossibleAllocation)
367 {
369 goto Failure;
370 }
371 RtlInitializeRangeList(Arbiter->PossibleAllocation);
372
373 if (!Arbiter->TestAllocation)
374 Arbiter->TestAllocation = ArbiterLibTestAllocation;
375 if (!Arbiter->RetestAllocation)
376 Arbiter->RetestAllocation = ArbiterLibRetestAllocation;
377 if (!Arbiter->CommitAllocation)
378 Arbiter->CommitAllocation = ArbiterLibCommitAllocation;
379 if (!Arbiter->RollbackAllocation)
380 Arbiter->RollbackAllocation = ArbiterLibRollbackAllocation;
381 if (!Arbiter->BootAllocation)
382 Arbiter->BootAllocation = ArbiterLibBootAllocation;
383 if (!Arbiter->AddReserved)
384 Arbiter->AddReserved = ArbiterLibAddReserved;
385 if (!Arbiter->QueryConflict)
386 Arbiter->QueryConflict = ArbiterLibQueryConflict;
387 if (!Arbiter->StartArbiter)
388 Arbiter->StartArbiter = ArbiterLibStartArbiter;
389 if (!Arbiter->PreprocessEntry)
390 Arbiter->PreprocessEntry = ArbiterLibPreprocessEntry;
391 if (!Arbiter->AllocateEntry)
392 Arbiter->AllocateEntry = ArbiterLibAllocateEntry;
393 if (!Arbiter->GetNextAllocationRange)
394 Arbiter->GetNextAllocationRange = ArbiterLibGetNextAllocationRange;
395 if (!Arbiter->FindSuitableRange)
396 Arbiter->FindSuitableRange = ArbiterLibFindSuitableRange;
397 if (!Arbiter->AddAllocation)
398 Arbiter->AddAllocation = ArbiterLibAddAllocation;
399 if (!Arbiter->BacktrackAllocation)
400 Arbiter->BacktrackAllocation = ArbiterLibBacktrackAllocation;
401 if (!Arbiter->OverrideConflict)
402 Arbiter->OverrideConflict = ArbiterLibOverrideConflict;
403#if (NTDDI_VERSION >= NTDDI_VISTA)
404 if (!Arbiter->InitializeRangeList)
405 Arbiter->InitializeRangeList = ArbiterLibInitializeRangeList;
406#endif
407
408 Status = ArbiterLibDefaultAssignmentOrdering(Arbiter, OrderName, OrderName, TranslateOrderingFunction);
409 if (!NT_SUCCESS(Status))
410 {
411 DPRINT1("ArbiterLibInitializeInstance: ArbiterLibDefaultAssignmentOrdering failed, Status %X\n", Status);
412 goto Failure;
413 }
414
415 return STATUS_SUCCESS;
416
417Failure:
418 DPRINT1("ArbiterLibInitializeInstance: '%S' failed, Status %X\n", ArbiterName, Status);
420 return Status;
421}
NTSTATUS NTAPI ArbiterLibBootAllocation(_In_ PARBITER_INSTANCE Arbiter, _Inout_ PARBITER_BOOT_ALLOCATION_PARAMETERS Parameters)
Definition: arbiter.c:61
NTSTATUS NTAPI ArbiterLibInitializeRangeList(_In_ PARBITER_INSTANCE Arbiter, _In_ ULONG ResourceCount, _In_ PCM_PARTIAL_RESOURCE_DESCRIPTOR Resources, _Inout_ PRTL_RANGE_LIST RangeList)
Definition: arbiter.c:122
NTSTATUS NTAPI ArbiterLibAllocateEntry(_In_ PARBITER_INSTANCE Arbiter, _Inout_ PARBITER_ALLOCATION_STATE ArbState)
Definition: arbiter.c:188
NTSTATUS NTAPI ArbiterLibRetestAllocation(_In_ PARBITER_INSTANCE Arbiter, _Inout_ PARBITER_RETEST_ALLOCATION_PARAMETERS Parameters)
Definition: arbiter.c:42
NTSTATUS NTAPI ArbiterLibTestAllocation(_In_ PARBITER_INSTANCE Arbiter, _Inout_ PARBITER_TEST_ALLOCATION_PARAMETERS Parameters)
Definition: arbiter.c:23
NTSTATUS NTAPI ArbiterLibAddReserved(_In_ PARBITER_INSTANCE Arbiter, _Inout_ PARBITER_ADD_RESERVED_PARAMETERS Parameters)
Definition: arbiter.c:80
NTSTATUS NTAPI ArbiterLibCommitAllocation(_In_ PARBITER_INSTANCE Arbiter)
Definition: arbiter.c:138
VOID NTAPI ArbiterLibDeleteInstance(_In_ PARBITER_INSTANCE Arbiter)
Definition: arbiter.c:252
NTSTATUS NTAPI ArbiterLibRollbackAllocation(_In_ PARBITER_INSTANCE Arbiter)
Definition: arbiter.c:150
NTSTATUS NTAPI ArbiterLibPreprocessEntry(_In_ PARBITER_INSTANCE Arbiter, _Inout_ PARBITER_ALLOCATION_STATE ArbState)
Definition: arbiter.c:175
NTSTATUS NTAPI ArbiterLibStartArbiter(_In_ PARBITER_INSTANCE Arbiter, _In_ PCM_RESOURCE_LIST StartResources)
Definition: arbiter.c:162
BOOLEAN NTAPI ArbiterLibOverrideConflict(_In_ PARBITER_INSTANCE Arbiter, _Inout_ PARBITER_ALLOCATION_STATE ArbState)
Definition: arbiter.c:225
#define ARBITER_SIG
Definition: arbiter.c:17
NTSTATUS NTAPI ArbiterLibQueryConflict(_In_ PARBITER_INSTANCE Arbiter, _Inout_ PARBITER_QUERY_CONFLICT_PARAMETERS Parameters)
Definition: arbiter.c:100
BOOLEAN NTAPI ArbiterLibGetNextAllocationRange(_In_ PARBITER_INSTANCE Arbiter, _Inout_ PARBITER_ALLOCATION_STATE ArbState)
Moves the working window to the next candidate range, walking the entry's alternatives in priority or...
Definition: range.c:379
VOID NTAPI ArbiterLibBacktrackAllocation(_In_ PARBITER_INSTANCE Arbiter, _Inout_ PARBITER_ALLOCATION_STATE ArbState)
Undoes the last AddAllocation performed for this entry.
Definition: range.c:656
BOOLEAN NTAPI ArbiterLibFindSuitableRange(_In_ PARBITER_INSTANCE Arbiter, _Inout_ PARBITER_ALLOCATION_STATE ArbState)
Finds a free range of the current candidate window in the arbiter's tentative allocation list.
Definition: range.c:520
NTSTATUS NTAPI ArbiterLibDefaultAssignmentOrdering(_Inout_ PARBITER_INSTANCE Arbiter, _In_ PCWSTR AllocationOrderName, _In_ PCWSTR ReservedResourcesName, _In_opt_ PARB_TRANSLATE_ORDERING TranslateOrderingFunction)
Definition: ordering.c:328
VOID NTAPI ArbiterLibAddAllocation(_In_ PARBITER_INSTANCE Arbiter, _Inout_ PARBITER_ALLOCATION_STATE ArbState)
Records the chosen placement in the arbiter's tentative allocation list, owned by the requesting devi...
Definition: range.c:618
#define DPRINT1
Definition: precomp.h:8
#define KeInitializeEvent(pEvt, foo, foo2)
Definition: env_spec_w32.h:477
#define PAGE_SIZE
Definition: env_spec_w32.h:49
#define NonPagedPool
Definition: env_spec_w32.h:307
#define ASSERT(a)
Definition: mode.c:44
NTSYSAPI VOID NTAPI RtlInitializeRangeList(_Out_ PRTL_RANGE_LIST RangeList)
@ NotificationEvent
@ SynchronizationEvent
#define DPRINT
Definition: sndvol32.h:73

Referenced by arbusno_Initializer(), IopArbBusNumberInitialize(), IopArbDmaInitialize(), IopArbIrqInitialize(), IopArbMemInitialize(), and IopArbPortInitialize().

◆ ArbiterLibQueryConflict()

NTSTATUS NTAPI ArbiterLibQueryConflict ( _In_ PARBITER_INSTANCE  Arbiter,
_Inout_ PARBITER_QUERY_CONFLICT_PARAMETERS  Parameters 
)

Definition at line 100 of file arbiter.c.

111{
112 PAGED_CODE();
113
116}

Referenced by ArbiterLibInitializeInstance().

◆ ArbiterLibRetestAllocation()

NTSTATUS NTAPI ArbiterLibRetestAllocation ( _In_ PARBITER_INSTANCE  Arbiter,
_Inout_ PARBITER_RETEST_ALLOCATION_PARAMETERS  Parameters 
)

Definition at line 42 of file arbiter.c.

50{
51 PAGED_CODE();
52
55}

Referenced by ArbiterLibInitializeInstance().

◆ ArbiterLibRollbackAllocation()

NTSTATUS NTAPI ArbiterLibRollbackAllocation ( _In_ PARBITER_INSTANCE  Arbiter)

Definition at line 150 of file arbiter.c.

152{
153 PAGED_CODE();
154
157}

Referenced by ArbiterLibInitializeInstance().

◆ ArbiterLibTestAllocation()

NTSTATUS NTAPI ArbiterLibTestAllocation ( _In_ PARBITER_INSTANCE  Arbiter,
_Inout_ PARBITER_TEST_ALLOCATION_PARAMETERS  Parameters 
)

Definition at line 23 of file arbiter.c.

31{
32 PAGED_CODE();
33
36}

Referenced by ArbiterLibInitializeInstance().