ReactOS 0.4.17-dev-806-gffa4164
arbmem.c File Reference
#include <ntoskrnl.h>
#include <debug.h>
Include dependency graph for arbmem.c:

Go to the source code of this file.

Macros

#define NDEBUG
 
#define MEMORY_24_BIT_MAX_ADDRESS   0xFFFFFF
 

Functions

ULONGLONG NTAPI RtlIoDecodeMemIoResource (_In_ PIO_RESOURCE_DESCRIPTOR Descriptor, _Out_opt_ PULONGLONG Alignment, _Out_opt_ PULONGLONG MinimumAddress, _Out_opt_ PULONGLONG MaximumAddress)
 
ULONGLONG NTAPI RtlCmDecodeMemIoResource (_In_ PCM_PARTIAL_RESOURCE_DESCRIPTOR Descriptor, _Out_opt_ PULONGLONG Start)
 
static NTSTATUS IopArbMemTranslateAddress (_In_ UCHAR SourceType, _In_ PHYSICAL_ADDRESS SourceAddress, _Out_ PPHYSICAL_ADDRESS TranslatedAddress, _Out_ PUCHAR TranslatedType)
 Translates one bus-relative address to a system-physical one on the ISA bus, and reports the space it landed in as a CM resource type.
 
static NTSTATUS NTAPI IopArbMemUnpackRequirements (_In_ PIO_RESOURCE_DESCRIPTOR IoDescriptor, _Out_ PUINT64 OutMinimumAddress, _Out_ PUINT64 OutMaximumAddress, _Out_ PUINT64 OutLength, _Out_ PUINT64 OutAlignment)
 Extracts the placement window from one memory requirement. The UnpackRequirement callback of the Root Memory arbiter.
 
static NTSTATUS NTAPI IopArbMemPackResource (_In_ PIO_RESOURCE_DESCRIPTOR IoDescriptor, _In_ UINT64 Start, _Out_ PCM_PARTIAL_RESOURCE_DESCRIPTOR CmDescriptor)
 Materialises the arbiter's chosen placement as an assigned CM descriptor. The PackResource callback of the Root Memory arbiter.
 
static NTSTATUS NTAPI IopArbMemUnpackResource (_In_ PCM_PARTIAL_RESOURCE_DESCRIPTOR CmDescriptor, _Out_ PUINT64 Start, _Out_ PUINT64 OutLength)
 Reads the placement back out of an already-assigned descriptor (a firmware boot configuration, typically) so the arbiter can mark that span occupied. The inverse of IopArbMemPackResource and the UnpackResource callback of the Root Memory arbiter.
 
static INT32 NTAPI IopArbMemScoreRequirement (_In_ PIO_RESOURCE_DESCRIPTOR IoDescriptor)
 Scores how constrained a requirement is: the number of distinct aligned addresses it could be placed at inside its own window, ignoring what is already allocated. The ScoreRequirement callback of the Root Memory arbiter.
 
static NTSTATUS NTAPI IopArbMemTranslateOrdering (_Out_ PIO_RESOURCE_DESCRIPTOR OutIoDescriptor, _In_ PIO_RESOURCE_DESCRIPTOR IoDescriptor)
 Translates one registry allocation-ordering window from the bus-relative addresses it is written in into the system-physical space the arbiter allocates in. The TranslateOrdering function of the Root Memory arbiter.
 
static BOOLEAN NTAPI IopArbMemFindSuitableRange (_In_ PARBITER_INSTANCE Arbiter, _Inout_ PARBITER_ALLOCATION_STATE ArbState)
 The Root Memory arbiter's FindSuitableRange: the engine search, incremented for a device asking to keep the MMIO window the firmware already programmed it into.
 
NTSTATUS NTAPI IopArbMemInitialize (VOID)
 Initialize the RootMemoryArbiter.
 

Variables

ARBITER_INSTANCE IopRootMemArbiter
 

Macro Definition Documentation

◆ MEMORY_24_BIT_MAX_ADDRESS

#define MEMORY_24_BIT_MAX_ADDRESS   0xFFFFFF

Definition at line 33 of file arbmem.c.

◆ NDEBUG

#define NDEBUG

Definition at line 11 of file arbmem.c.

Function Documentation

◆ IopArbMemFindSuitableRange()

static BOOLEAN NTAPI IopArbMemFindSuitableRange ( _In_ PARBITER_INSTANCE  Arbiter,
_Inout_ PARBITER_ALLOCATION_STATE  ArbState 
)
static

The Root Memory arbiter's FindSuitableRange: the engine search, incremented for a device asking to keep the MMIO window the firmware already programmed it into.

Parameters
[in]ArbiterThe Root Memory arbiter instance.
[in,out]ArbStateThe allocation state of the requirement being placed.
Returns
Returns TRUE if a placement was found, FALSE otherwise.
Remarks
A boot configuration is held in the range list as an ARBITER_RANGE_BOOT_ALLOCATED range and so reads as occupied. A request carrying ARBITER_FLAG_BOOT_CONFIG is precisely the one asking for that space back, so those ranges are made available to it. The engine already extends the same courtesy to legacy request sources.

Definition at line 384 of file arbmem.c.

387{
388 PAGED_CODE();
389
390 if (ArbState->Entry != NULL && (ArbState->Entry->Flags & ARBITER_FLAG_BOOT_CONFIG))
391 ArbState->RangeAvailableAttributes |= ARBITER_RANGE_BOOT_ALLOCATED;
392
393 return ArbiterLibFindSuitableRange(Arbiter, ArbState);
394}
#define PAGED_CODE()
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:717
#define ARBITER_RANGE_BOOT_ALLOCATED
Definition: arbiter.h:53
#define NULL
Definition: types.h:112
#define ARBITER_FLAG_BOOT_CONFIG
Definition: iotypes.h:4631

Referenced by IopArbMemInitialize().

◆ IopArbMemInitialize()

NTSTATUS NTAPI IopArbMemInitialize ( VOID  )

Initialize the RootMemoryArbiter.

The root memory arbiter owns CPU physical address space and hands each device the MMIO window it decodes. It is the fallback for every device whose memory no closer arbiter claims.

The physical page 0 is reserved with no attributes at all, so that no availability mask can hand it out: the real-mode interrupt vector table and the BIOS data area live there, and a device decoding over them corrupts the machine rather than merely failing.

Returns
NTSTATUS
Return values
STATUS_SUCCESS
STATUS_UNSUCCESSFUL
STATUS_INSUFFICIENT_RESOURCES

Definition at line 415 of file arbmem.c.

416{
418
419 PAGED_CODE();
420
421 IopRootMemArbiter.Name = L"RootMemory";
427
429 NULL,
432 L"Root",
434 if (!NT_SUCCESS(Status))
435 {
436 DPRINT1("IopArbMemInitialize: Failed with %X\n", Status);
437 return Status;
438 }
439
441 if (!NT_SUCCESS(Status))
442 {
443 DPRINT1("IopArbMemInitialize: Reserving page 0 failed with %X\n", Status);
444 }
445
446 return Status;
447}
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: arbiter.c:69
static NTSTATUS NTAPI IopArbMemPackResource(_In_ PIO_RESOURCE_DESCRIPTOR IoDescriptor, _In_ UINT64 Start, _Out_ PCM_PARTIAL_RESOURCE_DESCRIPTOR CmDescriptor)
Materialises the arbiter's chosen placement as an assigned CM descriptor. The PackResource callback o...
Definition: arbmem.c:186
static NTSTATUS NTAPI IopArbMemTranslateOrdering(_Out_ PIO_RESOURCE_DESCRIPTOR OutIoDescriptor, _In_ PIO_RESOURCE_DESCRIPTOR IoDescriptor)
Translates one registry allocation-ordering window from the bus-relative addresses it is written in i...
Definition: arbmem.c:316
static NTSTATUS NTAPI IopArbMemUnpackRequirements(_In_ PIO_RESOURCE_DESCRIPTOR IoDescriptor, _Out_ PUINT64 OutMinimumAddress, _Out_ PUINT64 OutMaximumAddress, _Out_ PUINT64 OutLength, _Out_ PUINT64 OutAlignment)
Extracts the placement window from one memory requirement. The UnpackRequirement callback of the Root...
Definition: arbmem.c:136
ARBITER_INSTANCE IopRootMemArbiter
Definition: pnpinit.c:26
static NTSTATUS NTAPI IopArbMemUnpackResource(_In_ PCM_PARTIAL_RESOURCE_DESCRIPTOR CmDescriptor, _Out_ PUINT64 Start, _Out_ PUINT64 OutLength)
Reads the placement back out of an already-assigned descriptor (a firmware boot configuration,...
Definition: arbmem.c:225
static BOOLEAN NTAPI IopArbMemFindSuitableRange(_In_ PARBITER_INSTANCE Arbiter, _Inout_ PARBITER_ALLOCATION_STATE ArbState)
The Root Memory arbiter's FindSuitableRange: the engine search, incremented for a device asking to ke...
Definition: arbmem.c:384
static INT32 NTAPI IopArbMemScoreRequirement(_In_ PIO_RESOURCE_DESCRIPTOR IoDescriptor)
Scores how constrained a requirement is: the number of distinct aligned addresses it could be placed ...
Definition: arbmem.c:260
LONG NTSTATUS
Definition: precomp.h:26
#define DPRINT1
Definition: precomp.h:8
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:33
#define L(x)
Definition: resources.c:13
Status
Definition: gdiplustypes.h:24
#define ULL(a, b)
Definition: format_msg.c:27
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 CmResourceTypeMemory
Definition: restypes.h:106
PARB_UNPACK_RESOURCE UnpackResource
Definition: arbiter.h:312
PARB_SCORE_REQUIREMENT ScoreRequirement
Definition: arbiter.h:313
PRTL_RANGE_LIST Allocation
Definition: arbiter.h:302
PARB_UNPACK_REQUIREMENT UnpackRequirement
Definition: arbiter.h:310
PARB_FIND_SUITABLE_RANGE FindSuitableRange
Definition: arbiter.h:326
PARB_PACK_RESOURCE PackResource
Definition: arbiter.h:311

Referenced by IopInitializeArbiters().

◆ IopArbMemPackResource()

static NTSTATUS NTAPI IopArbMemPackResource ( _In_ PIO_RESOURCE_DESCRIPTOR  IoDescriptor,
_In_ UINT64  Start,
_Out_ PCM_PARTIAL_RESOURCE_DESCRIPTOR  CmDescriptor 
)
static

Materialises the arbiter's chosen placement as an assigned CM descriptor. The PackResource callback of the Root Memory arbiter.

Parameters
[in]IoDescriptorThe requirement the placement satisfies. Type, Flags and ShareDisposition come across unchanged - and have to, since for a large-memory descriptor the Flags are what say how the Length beside them is encoded.
[in]StartThe physical address the arbiter settled on.
[out]CmDescriptorReceives the assigned descriptor.
Returns
Returns STATUS_SUCCESS.

Definition at line 186 of file arbmem.c.

190{
191 PAGED_CODE();
192
193 CmDescriptor->Type = IoDescriptor->Type;
194 CmDescriptor->Flags = IoDescriptor->Flags;
195 CmDescriptor->ShareDisposition = IoDescriptor->ShareDisposition;
196
197 CmDescriptor->u.Generic.Start.QuadPart = Start;
198 CmDescriptor->u.Generic.Length = IoDescriptor->u.Generic.Length;
199
200 return STATUS_SUCCESS;
201}
static _Out_opt_ PULONGLONG Start
#define STATUS_SUCCESS
Definition: shellext.h:65

Referenced by IopArbMemInitialize().

◆ IopArbMemScoreRequirement()

static INT32 NTAPI IopArbMemScoreRequirement ( _In_ PIO_RESOURCE_DESCRIPTOR  IoDescriptor)
static

Scores how constrained a requirement is: the number of distinct aligned addresses it could be placed at inside its own window, ignoring what is already allocated. The ScoreRequirement callback of the Root Memory arbiter.

Parameters
[in]IoDescriptorThe requirement to score.
Returns
Returns the placement count, saturated to MAXLONG, or -1 for a window that cannot hold the requirement at all - which the engine treats as a bad configuration and fails the arbitration on.
Remarks
The engine places the most constrained device (the lowest score) first, PCI devices have a habit of absorbing a remaining range.

Definition at line 260 of file arbmem.c.

262{
264 UINT64 Minimum, Maximum, AlignedMinimum;
265 UINT64 Span, Placements;
266
267 PAGED_CODE();
268
269 Length = RtlIoDecodeMemIoResource(IoDescriptor, &Alignment, &Minimum, &Maximum);
270
271 if (Alignment == 0)
272 Alignment = 1;
273
274 /* Round the window's base up to the first address the device can sit at. */
275 AlignedMinimum = (Minimum + Alignment - 1) & ~(Alignment - 1);
276 if (AlignedMinimum < Minimum || AlignedMinimum > Maximum)
277 return -1;
278
279 /* Count in addresses above the base, so a full-width window cannot overflow. */
280 Span = Maximum - AlignedMinimum;
281
282 if (Length != 0)
283 {
284 if (Length - 1 > Span)
285 return -1;
286
287 Span -= Length - 1;
288 }
289
290 Placements = Span / Alignment + 1;
291 return (INT32)min(Placements, MAXLONG);
292}
COMPILER_DEPENDENT_UINT64 UINT64
Definition: actypes.h:131
ULONGLONG NTAPI RtlIoDecodeMemIoResource(_In_ PIO_RESOURCE_DESCRIPTOR Descriptor, _Out_opt_ PULONGLONG Alignment, _Out_opt_ PULONGLONG MinimumAddress, _Out_opt_ PULONGLONG MaximumAddress)
Definition: memres.c:79
union Alignment_ Alignment
#define min(a, b)
Definition: monoChain.cc:55
_In_ ULONG _In_ ULONG _In_ ULONG Length
Definition: ntddpcm.h:102
int32_t INT32
Definition: typedefs.h:58
#define MAXLONG
Definition: umtypes.h:116

Referenced by IopArbMemInitialize().

◆ IopArbMemTranslateAddress()

static NTSTATUS IopArbMemTranslateAddress ( _In_ UCHAR  SourceType,
_In_ PHYSICAL_ADDRESS  SourceAddress,
_Out_ PPHYSICAL_ADDRESS  TranslatedAddress,
_Out_ PUCHAR  TranslatedType 
)
static

Translates one bus-relative address to a system-physical one on the ISA bus, and reports the space it landed in as a CM resource type.

Parameters
[in]SourceTypeThe CM resource type of the address being translated.
[in]SourceAddressThe bus-relative address.
[out]TranslatedAddressReceives the system-physical address.
[out]TranslatedTypeReceives the post-translation resource type. A HAL may map one space onto another, so the type is taken from the space the translation actually returned rather than assumed, e.g IOPorts, MMIO, etc.
Returns
Returns STATUS_SUCCESS, STATUS_INVALID_PARAMETER for a resource type that carries no address or for an address space the HAL is not expected to report, or STATUS_UNSUCCESSFUL when the HAL declines the translation.

Definition at line 65 of file arbmem.c.

70{
72
73 PAGED_CODE();
74
75 if (SourceType == CmResourceTypeMemory || SourceType == CmResourceTypeMemoryLarge)
76 AddressSpace = 0; /* System memory */
77 else if (SourceType == CmResourceTypePort)
78 AddressSpace = 1; /* I/O port space */
79 else
81
84
85 /* The HAL reports back the space it landed in; only these two are expected. */
86 if (AddressSpace == 1)
87 {
88 *TranslatedType = CmResourceTypePort;
89 }
90 else if (AddressSpace == 0)
91 {
92 *TranslatedType = (SourceType == CmResourceTypeMemoryLarge)
95 }
96 else
97 {
99 }
100
101 return STATUS_SUCCESS;
102}
BOOLEAN NTAPI HalTranslateBusAddress(IN INTERFACE_TYPE InterfaceType, IN ULONG BusNumber, IN PHYSICAL_ADDRESS BusAddress, IN OUT PULONG AddressSpace, OUT PPHYSICAL_ADDRESS TranslatedAddress)
Definition: bus.c:140
@ Isa
Definition: restypes.h:122
#define CmResourceTypePort
Definition: restypes.h:104
uint32_t ULONG
Definition: typedefs.h:59
#define STATUS_INVALID_PARAMETER
Definition: udferr_usr.h:135
#define STATUS_UNSUCCESSFUL
Definition: udferr_usr.h:132
#define CmResourceTypeMemoryLarge
Definition: cmtypes.h:231
_In_ ULONG _In_ PHYSICAL_ADDRESS _Inout_ PULONG _Out_ PPHYSICAL_ADDRESS TranslatedAddress
Definition: iofuncs.h:2275
_In_ ULONG _In_ PHYSICAL_ADDRESS _Inout_ PULONG AddressSpace
Definition: iofuncs.h:2274
_Must_inspect_result_ typedef _In_ PHYSICAL_ADDRESS SourceAddress
Definition: iotypes.h:1127

Referenced by IopArbMemTranslateOrdering().

◆ IopArbMemTranslateOrdering()

static NTSTATUS NTAPI IopArbMemTranslateOrdering ( _Out_ PIO_RESOURCE_DESCRIPTOR  OutIoDescriptor,
_In_ PIO_RESOURCE_DESCRIPTOR  IoDescriptor 
)
static

Translates one registry allocation-ordering window from the bus-relative addresses it is written in into the system-physical space the arbiter allocates in. The TranslateOrdering function of the Root Memory arbiter.

Parameters
[out]OutIoDescriptorReceives the translated copy. An entry whose endpoints cannot both be translated is marked CmResourceTypeNull for the ordering reader to drop; otherwise it takes the translated type.
[in]IoDescriptorThe ordering window. A descriptor that carries no address passes through untouched.
Returns
Returns STATUS_SUCCESS.

Definition at line 316 of file arbmem.c.

319{
320 UCHAR SourceType;
321 UCHAR MinimumType;
323
324 PAGED_CODE();
325
326 *OutIoDescriptor = *IoDescriptor;
327
328 SourceType = IoDescriptor->Type;
329 if (SourceType != CmResourceTypePort &&
330 SourceType != CmResourceTypeMemory &&
331 SourceType != CmResourceTypeMemoryLarge)
332 {
333 return STATUS_SUCCESS;
334 }
335
336 MinimumType = SourceType;
337 MaximumType = SourceType;
338
340 IoDescriptor->u.Generic.MinimumAddress,
341 &OutIoDescriptor->u.Generic.MinimumAddress,
342 &MinimumType)) ||
344 IoDescriptor->u.Generic.MaximumAddress,
345 &OutIoDescriptor->u.Generic.MaximumAddress,
346 &MaximumType)))
347 {
348 OutIoDescriptor->Type = CmResourceTypeNull;
349 }
350 else
351 {
352 OutIoDescriptor->Type = MaximumType;
353 }
354
355 return STATUS_SUCCESS;
356}
static NTSTATUS IopArbMemTranslateAddress(_In_ UCHAR SourceType, _In_ PHYSICAL_ADDRESS SourceAddress, _Out_ PPHYSICAL_ADDRESS TranslatedAddress, _Out_ PUCHAR TranslatedType)
Translates one bus-relative address to a system-physical one on the ISA bus, and reports the space it...
Definition: arbmem.c:65
#define CmResourceTypeNull
Definition: restypes.h:103
@ MaximumType
Definition: arc.h:154
unsigned char UCHAR
Definition: typedefs.h:53

Referenced by IopArbMemInitialize().

◆ IopArbMemUnpackRequirements()

static NTSTATUS NTAPI IopArbMemUnpackRequirements ( _In_ PIO_RESOURCE_DESCRIPTOR  IoDescriptor,
_Out_ PUINT64  OutMinimumAddress,
_Out_ PUINT64  OutMaximumAddress,
_Out_ PUINT64  OutLength,
_Out_ PUINT64  OutAlignment 
)
static

Extracts the placement window from one memory requirement. The UnpackRequirement callback of the Root Memory arbiter.

Parameters
[in]IoDescriptorThe requirement to decode.
[out]OutMinimumAddressReceives the lowest physical address the requirement accepts.
[out]OutMaximumAddressReceives the highest physical address the requirement accepts. A CM_RESOURCE_MEMORY_24 card only wires up 24 address lines and cannot be reached above 16 MB whatever its descriptor claims, so its window is clamped here rather than left for the placement search to get wrong.
[out]OutLengthReceives the size of the window wanted.
[out]OutAlignmentReceives the requirement's alignment; a zero alignment means the device does not care and is normalised to byte alignment, since the placement arithmetic divides by it.
Returns
Returns STATUS_SUCCESS.

Definition at line 136 of file arbmem.c.

142{
143 PAGED_CODE();
144
145 *OutLength = RtlIoDecodeMemIoResource(IoDescriptor,
146 OutAlignment,
147 OutMinimumAddress,
148 OutMaximumAddress);
149
150 if (*OutAlignment == 0)
151 *OutAlignment = 1;
152
153 if (IoDescriptor->Type == CmResourceTypeMemory &&
154 (IoDescriptor->Flags & CM_RESOURCE_MEMORY_24) &&
155 *OutMaximumAddress > MEMORY_24_BIT_MAX_ADDRESS)
156 {
157 *OutMaximumAddress = MEMORY_24_BIT_MAX_ADDRESS;
158 }
159
160 return STATUS_SUCCESS;
161}
#define MEMORY_24_BIT_MAX_ADDRESS
Definition: arbmem.c:33
#define CM_RESOURCE_MEMORY_24
Definition: cmtypes.h:127

Referenced by IopArbMemInitialize().

◆ IopArbMemUnpackResource()

static NTSTATUS NTAPI IopArbMemUnpackResource ( _In_ PCM_PARTIAL_RESOURCE_DESCRIPTOR  CmDescriptor,
_Out_ PUINT64  Start,
_Out_ PUINT64  OutLength 
)
static

Reads the placement back out of an already-assigned descriptor (a firmware boot configuration, typically) so the arbiter can mark that span occupied. The inverse of IopArbMemPackResource and the UnpackResource callback of the Root Memory arbiter.

Parameters
[in]CmDescriptorThe assigned descriptor to decode.
[out]StartReceives the assigned physical address.
[out]OutLengthReceives the assigned length.
Returns
Returns STATUS_SUCCESS.

Definition at line 225 of file arbmem.c.

229{
230 PAGED_CODE();
231
232 *OutLength = RtlCmDecodeMemIoResource(CmDescriptor, Start);
233
234 return STATUS_SUCCESS;
235}
ULONGLONG NTAPI RtlCmDecodeMemIoResource(_In_ PCM_PARTIAL_RESOURCE_DESCRIPTOR Descriptor, _Out_opt_ PULONGLONG Start)
Definition: memres.c:58

Referenced by IopArbMemInitialize().

◆ RtlCmDecodeMemIoResource()

ULONGLONG NTAPI RtlCmDecodeMemIoResource ( _In_ PCM_PARTIAL_RESOURCE_DESCRIPTOR  Descriptor,
_Out_opt_ PULONGLONG  Start 
)

Definition at line 58 of file memres.c.

61{
62 if (Start != NULL)
63 *Start = Descriptor->u.Generic.Start.QuadPart;
64
66 Descriptor->Flags,
67 Descriptor->u.Generic.Length);
68}
static ULONGLONG RtlpDecodeMemIoValue(_In_ UCHAR Type, _In_ USHORT Flags, _In_ ULONG Encoded)
Definition: memres.c:30
_Must_inspect_result_ _In_ WDFIORESLIST _In_ PIO_RESOURCE_DESCRIPTOR Descriptor
Definition: wdfresource.h:342

Referenced by IopArbMemUnpackResource().

◆ RtlIoDecodeMemIoResource()

ULONGLONG NTAPI RtlIoDecodeMemIoResource ( _In_ PIO_RESOURCE_DESCRIPTOR  Descriptor,
_Out_opt_ PULONGLONG  Alignment,
_Out_opt_ PULONGLONG  MinimumAddress,
_Out_opt_ PULONGLONG  MaximumAddress 
)

Definition at line 79 of file memres.c.

84{
85 if (Alignment != NULL)
86 {
88 Descriptor->Flags,
89 Descriptor->u.Generic.Alignment);
90 }
91
92 if (MinimumAddress != NULL)
93 *MinimumAddress = Descriptor->u.Generic.MinimumAddress.QuadPart;
94
95 if (MaximumAddress != NULL)
96 *MaximumAddress = Descriptor->u.Generic.MaximumAddress.QuadPart;
97
99 Descriptor->Flags,
100 Descriptor->u.Generic.Length);
101}
static _Out_opt_ PULONGLONG _Out_opt_ PULONGLONG MinimumAddress
static _Out_opt_ PULONGLONG _Out_opt_ PULONGLONG _Out_opt_ PULONGLONG MaximumAddress

Referenced by IopArbMemScoreRequirement(), and IopArbMemUnpackRequirements().

Variable Documentation

◆ IopRootMemArbiter

ARBITER_INSTANCE IopRootMemArbiter
extern

Definition at line 26 of file pnpinit.c.

Referenced by IopArbMemInitialize().