reactos/sdk/lib/drivers/arbiter/arbiter.h
Hermès Bélusca-Maïto 6f67132686
[LIB:ARBITER] Addendum to 374f2b4d: Fix build.
- No need to use a PCH when compiling a 1-file library.
- Add the _NTSYSTEM_ definition.

- Since the arbiter.h file is to be included by the users of this
  library, namely only kernel-mode NT components (incl. NTOS), there
  is no need to include the standard kernel-mode headers in it.
  Include these headers instead in the private implementation of the
  library, arbiter.c.
2020-04-09 20:41:17 +02:00

236 lines
5.9 KiB
C

/*
* PROJECT: ReactOS Kernel
* COPYRIGHT: GPL-2.0+ (https://spdx.org/licenses/GPL-2.0+)
* FILE: lib/drivers/arbiter/arbiter.h
* PURPOSE: Hardware Resources Arbiter Library
* PROGRAMMERS: Copyright 2020 Vadim Galyant <vgal@rambler.ru>
*/
#ifndef _ARBITER_H
#define _ARBITER_H
typedef struct _ARBITER_ORDERING
{
ULONGLONG Start;
ULONGLONG End;
} ARBITER_ORDERING, *PARBITER_ORDERING;
typedef struct _ARBITER_ORDERING_LIST
{
USHORT Count;
USHORT Maximum;
PARBITER_ORDERING Orderings;
} ARBITER_ORDERING_LIST, *PARBITER_ORDERING_LIST;
typedef struct _ARBITER_ALTERNATIVE
{
ULONGLONG Minimum;
ULONGLONG Maximum;
ULONG Length;
ULONG Alignment;
LONG Priority;
ULONG Flags;
PIO_RESOURCE_DESCRIPTOR Descriptor;
ULONG Reserved[3];
} ARBITER_ALTERNATIVE, *PARBITER_ALTERNATIVE;
typedef struct _ARBITER_ALLOCATION_STATE
{
ULONGLONG Start;
ULONGLONG End;
ULONGLONG CurrentMinimum;
ULONGLONG CurrentMaximum;
PARBITER_LIST_ENTRY Entry;
PARBITER_ALTERNATIVE CurrentAlternative;
ULONG AlternativeCount;
PARBITER_ALTERNATIVE Alternatives;
USHORT Flags;
UCHAR RangeAttributes;
UCHAR RangeAvailableAttributes;
ULONG_PTR WorkSpace;
} ARBITER_ALLOCATION_STATE, *PARBITER_ALLOCATION_STATE;
typedef struct _ARBITER_INSTANCE *PARBITER_INSTANCE;
typedef NTSTATUS
(NTAPI * PARB_UNPACK_REQUIREMENT)(
_In_ PIO_RESOURCE_DESCRIPTOR IoDescriptor,
_Out_ PULONGLONG OutMinimumAddress,
_Out_ PULONGLONG OutMaximumAddress,
_Out_ PULONG OutLength,
_Out_ PULONG OutAlignment
);
typedef NTSTATUS
(NTAPI * PARB_PACK_RESOURCE)(
_In_ PIO_RESOURCE_DESCRIPTOR IoDescriptor,
_In_ ULONGLONG Start,
_Out_ PCM_PARTIAL_RESOURCE_DESCRIPTOR CmDescriptor
);
typedef NTSTATUS
(NTAPI * PARB_UNPACK_RESOURCE)(
_In_ PCM_PARTIAL_RESOURCE_DESCRIPTOR CmDescriptor,
_Out_ PULONGLONG Start,
_Out_ PULONG OutLength
);
typedef LONG
(NTAPI * PARB_SCORE_REQUIREMENT)(
_In_ PIO_RESOURCE_DESCRIPTOR IoDescriptor
);
typedef NTSTATUS
(NTAPI * PARB_TEST_ALLOCATION)(
_In_ PARBITER_INSTANCE Arbiter,
_In_ PLIST_ENTRY ArbitrationList
);
typedef NTSTATUS
(NTAPI * PARB_RETEST_ALLOCATION)(
_In_ PARBITER_INSTANCE Arbiter,
_In_ PLIST_ENTRY ArbitrationList
);
typedef NTSTATUS
(NTAPI * PARB_COMMIT_ALLOCATION)(
_In_ PARBITER_INSTANCE Arbiter
);
typedef NTSTATUS
(NTAPI * PARB_ROLLBACK_ALLOCATION)(
_In_ PARBITER_INSTANCE Arbiter
);
typedef NTSTATUS
(NTAPI * PARB_BOOT_ALLOCATION)(
_In_ PARBITER_INSTANCE Arbiter,
_In_ PLIST_ENTRY ArbitrationList
);
/* Not correct yet, FIXME! */
typedef NTSTATUS
(NTAPI * PARB_QUERY_ARBITRATE)(
_In_ PARBITER_INSTANCE Arbiter
);
/* Not correct yet, FIXME! */
typedef NTSTATUS
(NTAPI * PARB_QUERY_CONFLICT)(
_In_ PARBITER_INSTANCE Arbiter
);
/* Not correct yet, FIXME! */
typedef NTSTATUS
(NTAPI * PARB_ADD_RESERVED)(
_In_ PARBITER_INSTANCE Arbiter
);
/* Not correct yet, FIXME! */
typedef NTSTATUS
(NTAPI * PARB_START_ARBITER)(
_In_ PARBITER_INSTANCE Arbiter
);
typedef NTSTATUS
(NTAPI * PARB_PREPROCESS_ENTRY)(
_In_ PARBITER_INSTANCE Arbiter,
_Inout_ PARBITER_ALLOCATION_STATE ArbState
);
typedef NTSTATUS
(NTAPI * PARB_ALLOCATE_ENTRY)(
_In_ PARBITER_INSTANCE Arbiter,
_Inout_ PARBITER_ALLOCATION_STATE ArbState
);
typedef BOOLEAN
(NTAPI * PARB_GET_NEXT_ALLOCATION_RANGE)(
_In_ PARBITER_INSTANCE Arbiter,
_Inout_ PARBITER_ALLOCATION_STATE ArbState
);
typedef BOOLEAN
(NTAPI * PARB_FIND_SUITABLE_RANGE)(
_In_ PARBITER_INSTANCE Arbiter,
_Inout_ PARBITER_ALLOCATION_STATE ArbState
);
typedef VOID
(NTAPI * PARB_ADD_ALLOCATION)(
_In_ PARBITER_INSTANCE Arbiter,
_Inout_ PARBITER_ALLOCATION_STATE ArbState
);
typedef VOID
(NTAPI * PARB_BACKTRACK_ALLOCATION)(
_In_ PARBITER_INSTANCE Arbiter,
_Inout_ PARBITER_ALLOCATION_STATE ArbState
);
/* Not correct yet, FIXME! */
typedef NTSTATUS
(NTAPI * PARB_OVERRIDE_CONFLICT)(
_In_ PARBITER_INSTANCE Arbiter
);
typedef struct _ARBITER_INSTANCE
{
ULONG Signature;
PKEVENT MutexEvent;
PCWSTR Name;
CM_RESOURCE_TYPE ResourceType;
PRTL_RANGE_LIST Allocation;
PRTL_RANGE_LIST PossibleAllocation;
ARBITER_ORDERING_LIST OrderingList;
ARBITER_ORDERING_LIST ReservedList;
LONG ReferenceCount;
PARBITER_INTERFACE Interface;
ULONG AllocationStackMaxSize;
PARBITER_ALLOCATION_STATE AllocationStack;
PARB_UNPACK_REQUIREMENT UnpackRequirement;
PARB_PACK_RESOURCE PackResource;
PARB_UNPACK_RESOURCE UnpackResource;
PARB_SCORE_REQUIREMENT ScoreRequirement;
PARB_TEST_ALLOCATION TestAllocation;
PARB_RETEST_ALLOCATION RetestAllocation;
PARB_COMMIT_ALLOCATION CommitAllocation;
PARB_ROLLBACK_ALLOCATION RollbackAllocation;
PARB_BOOT_ALLOCATION BootAllocation;
PARB_QUERY_ARBITRATE QueryArbitrate; // Not used yet
PARB_QUERY_CONFLICT QueryConflict; // Not used yet
PARB_ADD_RESERVED AddReserved; // Not used yet
PARB_START_ARBITER StartArbiter; // Not used yet
PARB_PREPROCESS_ENTRY PreprocessEntry;
PARB_ALLOCATE_ENTRY AllocateEntry;
PARB_GET_NEXT_ALLOCATION_RANGE GetNextAllocationRange;
PARB_FIND_SUITABLE_RANGE FindSuitableRange;
PARB_ADD_ALLOCATION AddAllocation;
PARB_BACKTRACK_ALLOCATION BacktrackAllocation;
PARB_OVERRIDE_CONFLICT OverrideConflict; // Not used yet
BOOLEAN TransactionInProgress;
PVOID Extension;
PDEVICE_OBJECT BusDeviceObject;
PVOID ConflictCallbackContext;
PVOID ConflictCallback;
} ARBITER_INSTANCE, *PARBITER_INSTANCE;
typedef NTSTATUS
(NTAPI * PARB_TRANSLATE_ORDERING)(
_Out_ PIO_RESOURCE_DESCRIPTOR OutIoDescriptor,
_In_ PIO_RESOURCE_DESCRIPTOR IoDescriptor
);
NTSTATUS
NTAPI
ArbInitializeArbiterInstance(
_Inout_ PARBITER_INSTANCE Arbiter,
_In_ PDEVICE_OBJECT BusDeviceObject,
_In_ CM_RESOURCE_TYPE ResourceType,
_In_ PCWSTR ArbiterName,
_In_ PCWSTR OrderName,
_In_ PARB_TRANSLATE_ORDERING TranslateOrderingFunction
);
#endif /* _ARBITER_H */