17#define ARBITER_ORDERING_GRANULARITY 16
18#define ARBITER_ORDERING_LIMIT 1024
20#define ARBP_POLICY_ROOT L"\\Registry\\Machine\\System\\CurrentControlSet\\Control\\Arbiters\\"
21#define ARBP_LONGEST_SUBKEY L"ReservedResources"
45 if (OrderingList->Orderings ==
NULL)
47 OrderingList->Count = 0;
48 OrderingList->Maximum = 0;
52 OrderingList->Count = 0;
65 if (OrderingList->Orderings !=
NULL)
68 OrderingList->Orderings =
NULL;
69 OrderingList->Count = 0;
70 OrderingList->Maximum = 0;
89 if (OrderingList->Count == OrderingList->Maximum)
94 NewMaximum = OrderingList->Maximum ? (
ULONG)OrderingList->Maximum * 2
102 if (NewArray ==
NULL)
105 if (OrderingList->Orderings !=
NULL)
112 OrderingList->Maximum = (
UINT16)NewMaximum;
113 OrderingList->Orderings = NewArray;
116 OrderingList->Orderings[OrderingList->Count].
Start =
Start;
117 OrderingList->Orderings[OrderingList->Count].End = End;
118 OrderingList->Count++;
166 UINT64 CurrentStart = OrderingList->Orderings[
Index].Start;
167 UINT64 CurrentEnd = OrderingList->Orderings[
Index].End;
171 if (CurrentEnd < Start || CurrentStart > End)
178 if (CurrentStart <
Start)
193 *OrderingList = Pruned;
228 RtlInitEmptyUnicodeString(&KeyPath, PathBuffer,
sizeof(PathBuffer));
339 if (TargetChars != 0 &&
358 DataEnd = (
PUCHAR)Requirements +
Value->DataLength;
359 Alternative = &Requirements->
List[0];
377 if (Translate !=
NULL)
395 Status = Arbiter->UnpackRequirement(&
Window, &Minimum, &Maximum,
static _Out_opt_ PULONGLONG Start
COMPILER_DEPENDENT_UINT64 UINT64
NTSTATUS(NTAPI * PARB_TRANSLATE_ORDERING)(_Out_ PIO_RESOURCE_DESCRIPTOR OutIoDescriptor, _In_ PIO_RESOURCE_DESCRIPTOR IoDescriptor)
#define ARBITER_MAXIMUM_ADDRESS
#define ARBITER_RANGE_INACCESSIBLE
#define ARBITER_RANGE_BOOT_ALLOCATED
_In_opt_ PWSTR SubkeyName
IN PUNICODE_STRING IN POBJECT_ATTRIBUTES ObjectAttributes
_In_ ULONG _In_ ULONG _In_opt_ DXGKCB_MIRACAST_SEND_MESSAGE_CALLBACK Callback
#define NT_SUCCESS(StatCode)
#define ExAllocatePoolWithTag(hernya, size, tag)
NTSTATUS RtlAppendUnicodeToString(IN PUNICODE_STRING Str1, IN PWSTR Str2)
union Alignment_ Alignment
#define ExFreePoolWithTag(_P, _T)
#define InitializeObjectAttributes(p, n, a, r, s)
@ KeyValueFullInformationAlign64
_Must_inspect_result_ _Out_ PNDIS_STATUS _In_ NDIS_HANDLE _In_ ULONG _Out_ PNDIS_STRING _Out_ PNDIS_HANDLE KeyHandle
NTSYSAPI NTSTATUS NTAPI ZwClose(_In_ HANDLE Handle)
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
NTSYSAPI VOID NTAPI RtlInitUnicodeString(PUNICODE_STRING DestinationString, PCWSTR SourceString)
#define REG_RESOURCE_REQUIREMENTS_LIST
#define UNREFERENCED_PARAMETER(P)
_In_ ULONG _In_ ULONG _In_ ULONG Length
static ULONGLONG ArbpMmConfigEnd
VOID(NTAPI * PARB_RANGE_CALLBACK)(_In_ PARBITER_INSTANCE Arbiter, _In_opt_ PVOID Context, _In_ ULONGLONG Start, _In_ ULONGLONG End)
static BOOLEAN ArbpDescriptorMatchesArbiter(_In_ PARBITER_INSTANCE Arbiter, _In_ UCHAR DescriptorType)
static VOID NTAPI ArbpAddReservedCallback(_In_ PARBITER_INSTANCE Arbiter, _In_opt_ PVOID Context, _In_ ULONGLONG Start, _In_ ULONGLONG End)
Range callback moving one reserved window into last-resort territory: recorded in the arbiter's Reser...
NTSTATUS NTAPI ArbiterLibAddInaccessibleAllocationRange(_In_ PARBITER_INSTANCE Arbiter, _In_ PCWSTR OrderingName, _Inout_ PRTL_RANGE_LIST RangeList)
Carves the firmware-reported inaccessible ranges (Arbiters\InaccessibleRange<OrderingName>) out of a ...
static NTSTATUS ArbpReadPolicyValue(_In_ HANDLE KeyHandle, _In_ PCWSTR ValueName, _Out_ PKEY_VALUE_FULL_INFORMATION *Value)
static NTSTATUS ArbpExcludeOrderingRange(_Inout_ PARBITER_ORDERING_LIST OrderingList, _In_ UINT64 Start, _In_ UINT64 End)
Removes [Start, End] from every window of an ordering list, splitting windows that straddle it.
static NTSTATUS ArbpOpenPolicySubkey(_In_ PCWSTR SubkeyName, _Out_ PHANDLE KeyHandle)
#define ARBITER_ORDERING_LIMIT
static VOID NTAPI ArbpAddRangeCallback(_In_ PARBITER_INSTANCE Arbiter, _In_opt_ PVOID Context, _In_ ULONGLONG Start, _In_ ULONGLONG End)
Range callback carving one window out of a range list as an unowned blocking range,...
static NTSTATUS ArbpCreateOrderingList(_Out_ PARBITER_ORDERING_LIST OrderingList)
NTSTATUS NTAPI ArbiterLibAddMmConfigRangeAsBootReserved(_In_ PARBITER_INSTANCE Arbiter, _Inout_ PRTL_RANGE_LIST RangeList)
Reserves the PCI-Express enhanced-config (MMCONFIG / ECAM) MMIO window (Arbiters\ReservedResources\Mm...
#define ARBP_LONGEST_SUBKEY
NTSTATUS NTAPI ArbiterLibDefaultAssignmentOrdering(_Inout_ PARBITER_INSTANCE Arbiter, _In_ PCWSTR AllocationOrderName, _In_ PCWSTR ReservedResourcesName, _In_opt_ PARB_TRANSLATE_ORDERING TranslateOrderingFunction)
Builds the arbiter's allocation ordering from the registry policy, most-preferred window first.
static ULONGLONG ArbpMmConfigStart
static VOID NTAPI ArbpAddOrderingCallback(_In_ PARBITER_INSTANCE Arbiter, _In_opt_ PVOID Context, _In_ ULONGLONG Start, _In_ ULONGLONG End)
BOOLEAN NTAPI ArbiterLibIsConflictWithMmConfigRange(_In_ ULONGLONG Start, _In_ ULONGLONG End)
Determines whether a range overlaps the recorded MMCONFIG window.
static VOID NTAPI ArbpMmConfigCallback(_In_ PARBITER_INSTANCE Arbiter, _In_opt_ PVOID Context, _In_ ULONGLONG Start, _In_ ULONGLONG End)
Range callback recording the MMCONFIG (ECAM) window and reserving it in a range list as a boot alloca...
VOID NTAPI ArbiterLibFreeOrderingList(_Inout_ PARBITER_ORDERING_LIST OrderingList)
#define ARBITER_ORDERING_GRANULARITY
NTSTATUS NTAPI ArbiterLibAddOrdering(_Inout_ PARBITER_ORDERING_LIST OrderingList, _In_ UINT64 Start, _In_ UINT64 End)
static NTSTATUS ArbpForEachRegistryRange(_In_ PARBITER_INSTANCE Arbiter, _In_ PCWSTR Subkey, _In_ PCWSTR ValueName, _In_opt_ PARB_TRANSLATE_ORDERING Translate, _In_ PARB_RANGE_CALLBACK Callback, _In_opt_ PVOID Context)
#define OBJ_KERNEL_HANDLE
#define OBJ_CASE_INSENSITIVE
for(i=0;i< sizeof(testsuite)/sizeof(testsuite[0]);++i) ok(call_test(testsuite[i].func)
#define CmResourceTypeMemory
#define STATUS_BUFFER_TOO_SMALL
#define STATUS_BUFFER_OVERFLOW
IO_RESOURCE_DESCRIPTOR Descriptors[1]
#define RtlCopyMemory(Destination, Source, Length)
#define STATUS_INVALID_PARAMETER
#define STATUS_UNSUCCESSFUL
#define STATUS_INSUFFICIENT_RESOURCES
_In_ ULONG _In_ PVOID _In_ LONG DescriptorType
_In_ WDFCOLLECTION _In_ ULONG Index
_Must_inspect_result_ _In_ WDFDEVICE _In_ DEVICE_REGISTRY_PROPERTY _In_ ULONG _Out_ PULONG ResultLength
_Must_inspect_result_ _In_ WDFDEVICE _In_ PWDF_DEVICE_PROPERTY_DATA _In_ DEVPROPTYPE _In_ ULONG Size
_Must_inspect_result_ _In_ WDFKEY _In_ PCUNICODE_STRING ValueName
_Must_inspect_result_ _In_ WDFKEY _In_ PCUNICODE_STRING _Out_opt_ PUSHORT _Inout_opt_ PUNICODE_STRING Value
_Must_inspect_result_ _In_ WDFIORESLIST _In_ PIO_RESOURCE_DESCRIPTOR Descriptor
#define CmResourceTypeMemoryLarge
struct _IO_RESOURCE_REQUIREMENTS_LIST * PIO_RESOURCE_REQUIREMENTS_LIST