[SDK:DDK][NTOS:PNP] Implement PnP arbiters initialization
authorVadim Galyant <vgal@rambler.ru>
Mon, 10 Jan 2022 03:35:45 +0000 (06:35 +0300)
committerGitHub <noreply@github.com>
Mon, 10 Jan 2022 03:35:45 +0000 (06:35 +0300)
ntoskrnl/io/pnpmgr/arbiters.c [new file with mode: 0644]
ntoskrnl/io/pnpmgr/arbs.c [deleted file]
ntoskrnl/ntos.cmake
sdk/lib/drivers/arbiter/arbiter.c
sdk/lib/drivers/arbiter/arbiter.h

diff --git a/ntoskrnl/io/pnpmgr/arbiters.c b/ntoskrnl/io/pnpmgr/arbiters.c
new file mode 100644 (file)
index 0000000..9a299c0
--- /dev/null
@@ -0,0 +1,514 @@
+/*
+ * PROJECT:     ReactOS Kernel
+ * LICENSE:     GPL-2.0-or-later (https://spdx.org/licenses/GPL-2.0-or-later)
+ * PURPOSE:     Root arbiters of the PnP manager
+ * COPYRIGHT:   Copyright 2020 Vadim Galyant <vgal@rambler.ru>
+ */
+
+/* INCLUDES ******************************************************************/
+
+#include <ntoskrnl.h>
+
+#define NDEBUG
+#include <debug.h>
+
+/* GLOBALS *******************************************************************/
+
+extern ARBITER_INSTANCE IopRootBusNumberArbiter;
+extern ARBITER_INSTANCE IopRootIrqArbiter;
+extern ARBITER_INSTANCE IopRootDmaArbiter;
+extern ARBITER_INSTANCE IopRootMemArbiter;
+extern ARBITER_INSTANCE IopRootPortArbiter;
+
+/* DATA **********************************************************************/
+
+/* FUNCTIONS *****************************************************************/
+
+/* BusNumber arbiter */
+
+CODE_SEG("PAGE")
+NTSTATUS
+NTAPI
+IopBusNumberUnpackRequirement(
+    _In_ PIO_RESOURCE_DESCRIPTOR IoDescriptor,
+    _Out_ PUINT64 OutMinimumAddress,
+    _Out_ PUINT64 OutMaximumAddress,
+    _Out_ PUINT32 OutLength,
+    _Out_ PUINT32 OutAlignment)
+{
+    PAGED_CODE();
+
+    UNIMPLEMENTED;
+    return STATUS_NOT_IMPLEMENTED;
+}
+
+CODE_SEG("PAGE")
+NTSTATUS
+NTAPI
+IopBusNumberPackResource(
+    _In_ PIO_RESOURCE_DESCRIPTOR IoDescriptor,
+    _In_ UINT64 Start,
+    _Out_ PCM_PARTIAL_RESOURCE_DESCRIPTOR CmDescriptor)
+{
+    PAGED_CODE();
+
+    UNIMPLEMENTED;
+    return STATUS_NOT_IMPLEMENTED;
+}
+
+CODE_SEG("PAGE")
+NTSTATUS
+NTAPI
+IopBusNumberUnpackResource(
+    _In_ PCM_PARTIAL_RESOURCE_DESCRIPTOR Descriptor,
+    _Out_ PUINT64 Start,
+    _Out_ PUINT32 Length)
+{
+    PAGED_CODE();
+
+    UNIMPLEMENTED;
+    return STATUS_NOT_IMPLEMENTED;
+}
+
+CODE_SEG("PAGE")
+INT32
+NTAPI
+IopBusNumberScoreRequirement(
+    _In_ PIO_RESOURCE_DESCRIPTOR IoDescriptor)
+{
+    PAGED_CODE();
+
+    UNIMPLEMENTED;
+    return 0;
+}
+
+#define ARB_MAX_BUS_NUMBER 0xFF
+
+CODE_SEG("PAGE")
+NTSTATUS
+NTAPI
+IopBusNumberInitialize(VOID)
+{
+    NTSTATUS Status;
+
+    PAGED_CODE();
+
+    DPRINT("IopRootBusNumberArbiter %p\n", &IopRootBusNumberArbiter);
+
+    IopRootBusNumberArbiter.UnpackRequirement = IopBusNumberUnpackRequirement;
+    IopRootBusNumberArbiter.PackResource = IopBusNumberPackResource;
+    IopRootBusNumberArbiter.UnpackResource = IopBusNumberUnpackResource;
+    IopRootBusNumberArbiter.ScoreRequirement = IopBusNumberScoreRequirement;
+
+    Status = ArbInitializeArbiterInstance(&IopRootBusNumberArbiter,
+                                          NULL,
+                                          CmResourceTypeBusNumber,
+                                          L"RootBusNumber",
+                                          L"Root",
+                                          NULL);
+    if (!NT_SUCCESS(Status))
+    {
+        DPRINT1("IopBusNumberInitialize: Status %p\n", Status);
+        ASSERT(FALSE);
+        return Status;
+    }
+
+    Status = RtlAddRange(IopRootBusNumberArbiter.Allocation,
+                         (UINT64)(ARB_MAX_BUS_NUMBER + 1),
+                         (UINT64)(-1),
+                         0,
+                         0,
+                         NULL,
+                         NULL);
+
+    return Status;
+}
+
+/* Irq arbiter */
+
+CODE_SEG("PAGE")
+NTSTATUS
+NTAPI
+IopIrqUnpackRequirement(
+    _In_ PIO_RESOURCE_DESCRIPTOR IoDescriptor,
+    _Out_ PUINT64 OutMinimumVector,
+    _Out_ PUINT64 OutMaximumVector,
+    _Out_ PUINT32 OutParam1,
+    _Out_ PUINT32 OutParam2)
+{
+    PAGED_CODE();
+
+    UNIMPLEMENTED;
+    return STATUS_NOT_IMPLEMENTED;
+}
+
+CODE_SEG("PAGE")
+NTSTATUS
+NTAPI
+IopIrqPackResource(
+    _In_ PIO_RESOURCE_DESCRIPTOR IoDescriptor,
+    _In_ UINT64 Start,
+    _Out_ PCM_PARTIAL_RESOURCE_DESCRIPTOR CmDescriptor)
+{
+    PAGED_CODE();
+
+    UNIMPLEMENTED;
+    return STATUS_NOT_IMPLEMENTED;
+}
+
+CODE_SEG("PAGE")
+NTSTATUS
+NTAPI
+IopIrqUnpackResource(
+    _In_ PCM_PARTIAL_RESOURCE_DESCRIPTOR CmDescriptor,
+    _Out_ PUINT64 Start,
+    _Out_ PUINT32 OutLength)
+{
+    PAGED_CODE();
+
+    UNIMPLEMENTED;
+    return STATUS_NOT_IMPLEMENTED;
+}
+
+CODE_SEG("PAGE")
+INT32
+NTAPI
+IopIrqScoreRequirement(
+    _In_ PIO_RESOURCE_DESCRIPTOR IoDescriptor)
+{
+    PAGED_CODE();
+
+    UNIMPLEMENTED;
+    return 0;
+}
+
+CODE_SEG("PAGE")
+NTSTATUS
+NTAPI
+IopIrqTranslateOrdering(
+    _Out_ PIO_RESOURCE_DESCRIPTOR OutIoDescriptor,
+    _In_ PIO_RESOURCE_DESCRIPTOR IoDescriptor)
+{
+    PAGED_CODE();
+
+    UNIMPLEMENTED;
+    return STATUS_NOT_IMPLEMENTED;
+}
+
+CODE_SEG("PAGE")
+NTSTATUS
+NTAPI
+IopIrqInitialize(VOID)
+{
+    NTSTATUS Status;
+
+    PAGED_CODE();
+
+    DPRINT("IopRootIrqArbiter %p\n", &IopRootIrqArbiter);
+
+    IopRootIrqArbiter.UnpackRequirement = IopIrqUnpackRequirement;
+    IopRootIrqArbiter.PackResource = IopIrqPackResource;
+    IopRootIrqArbiter.UnpackResource = IopIrqUnpackResource;
+    IopRootIrqArbiter.ScoreRequirement = IopIrqScoreRequirement;
+
+    Status = ArbInitializeArbiterInstance(&IopRootIrqArbiter,
+                                          NULL,
+                                          CmResourceTypeInterrupt,
+                                          L"RootIRQ",
+                                          L"Root",
+                                          IopIrqTranslateOrdering);
+    return Status;
+}
+
+/* Dma arbiter */
+
+CODE_SEG("PAGE")
+NTSTATUS
+NTAPI
+IopDmaUnpackRequirement(
+    _In_ PIO_RESOURCE_DESCRIPTOR IoDescriptor,
+    _Out_ PUINT64 OutMinimumChannel,
+    _Out_ PUINT64 OutMaximumChannel,
+    _Out_ PUINT32 OutParam1,
+    _Out_ PUINT32 OutParam2)
+{
+    PAGED_CODE();
+
+    UNIMPLEMENTED;
+    return STATUS_NOT_IMPLEMENTED;
+}
+
+CODE_SEG("PAGE")
+NTSTATUS
+NTAPI
+IopDmaPackResource(
+    _In_ PIO_RESOURCE_DESCRIPTOR IoDescriptor,
+    _In_ UINT64 Start,
+    _Out_ PCM_PARTIAL_RESOURCE_DESCRIPTOR CmDescriptor)
+{
+    PAGED_CODE();
+
+    UNIMPLEMENTED;
+    return STATUS_NOT_IMPLEMENTED;
+}
+
+CODE_SEG("PAGE")
+NTSTATUS
+NTAPI
+IopDmaUnpackResource(
+    _In_ PCM_PARTIAL_RESOURCE_DESCRIPTOR CmDescriptor,
+    _Out_ PUINT64 Start,
+    _Out_ PUINT32 OutLength)
+{
+    PAGED_CODE();
+
+    UNIMPLEMENTED;
+    return STATUS_NOT_IMPLEMENTED;
+}
+
+CODE_SEG("PAGE")
+INT32
+NTAPI
+IopDmaScoreRequirement(
+    _In_ PIO_RESOURCE_DESCRIPTOR IoDescriptor)
+{
+    PAGED_CODE();
+
+    UNIMPLEMENTED;
+    return 0;
+}
+
+CODE_SEG("PAGE")
+NTSTATUS
+NTAPI
+IopDmaOverrideConflict(
+    _In_ PARBITER_INSTANCE Arbiter)
+{
+    PAGED_CODE();
+
+    UNIMPLEMENTED;
+    return STATUS_NOT_IMPLEMENTED;
+}
+
+CODE_SEG("PAGE")
+NTSTATUS
+NTAPI
+IopDmaInitialize(VOID)
+{
+    NTSTATUS Status;
+
+    PAGED_CODE();
+
+    DPRINT("IopRootDmaArbiter %p\n", &IopRootDmaArbiter);
+
+    IopRootDmaArbiter.UnpackRequirement = IopDmaUnpackRequirement;
+    IopRootDmaArbiter.PackResource = IopDmaPackResource;
+    IopRootDmaArbiter.UnpackResource = IopDmaUnpackResource;
+    IopRootDmaArbiter.ScoreRequirement = IopDmaScoreRequirement;
+
+    IopRootDmaArbiter.OverrideConflict = IopDmaOverrideConflict;
+
+    Status = ArbInitializeArbiterInstance(&IopRootDmaArbiter,
+                                          NULL,
+                                          CmResourceTypeDma,
+                                          L"RootDMA",
+                                          L"Root",
+                                          NULL);
+    return Status;
+}
+
+/* Common for Memory and Port arbiters */
+
+CODE_SEG("PAGE")
+NTSTATUS
+NTAPI
+IopGenericUnpackRequirement(
+    _In_ PIO_RESOURCE_DESCRIPTOR IoDescriptor,
+    _Out_ PUINT64 OutMinimumAddress,
+    _Out_ PUINT64 OutMaximumAddress,
+    _Out_ PUINT32 OutLength,
+    _Out_ PUINT32 OutAlignment)
+{
+    PAGED_CODE();
+
+    UNIMPLEMENTED;
+    return STATUS_NOT_IMPLEMENTED;
+}
+
+CODE_SEG("PAGE")
+NTSTATUS
+NTAPI
+IopGenericPackResource(
+    _In_ PIO_RESOURCE_DESCRIPTOR IoDescriptor,
+    _In_ UINT64 Start,
+    _Out_ PCM_PARTIAL_RESOURCE_DESCRIPTOR CmDescriptor)
+{
+    PAGED_CODE();
+
+    UNIMPLEMENTED;
+    return STATUS_NOT_IMPLEMENTED;
+}
+
+CODE_SEG("PAGE")
+NTSTATUS
+NTAPI
+IopGenericUnpackResource(
+    _In_ PCM_PARTIAL_RESOURCE_DESCRIPTOR CmDescriptor,
+    _Out_ PUINT64 Start,
+    _Out_ PUINT32 OutLength)
+{
+    PAGED_CODE();
+
+    UNIMPLEMENTED;
+    return STATUS_NOT_IMPLEMENTED;
+}
+
+CODE_SEG("PAGE")
+INT32
+NTAPI
+IopGenericScoreRequirement(
+    _In_ PIO_RESOURCE_DESCRIPTOR IoDescriptor)
+{
+    PAGED_CODE();
+
+    UNIMPLEMENTED;
+    return 0;
+}
+
+CODE_SEG("PAGE")
+NTSTATUS
+NTAPI
+IopGenericTranslateOrdering(
+    _Out_ PIO_RESOURCE_DESCRIPTOR OutIoDescriptor,
+    _In_ PIO_RESOURCE_DESCRIPTOR IoDescriptor)
+{
+    PAGED_CODE();
+
+    UNIMPLEMENTED;
+    return STATUS_NOT_IMPLEMENTED;
+}
+
+/* Memory arbiter */
+
+CODE_SEG("PAGE")
+BOOLEAN
+NTAPI
+IopMemFindSuitableRange(
+    _In_ PARBITER_INSTANCE Arbiter,
+    _In_ PARBITER_ALLOCATION_STATE State)
+{
+    PAGED_CODE();
+
+    UNIMPLEMENTED;
+    return FALSE;
+}
+
+CODE_SEG("PAGE")
+NTSTATUS
+NTAPI
+IopMemInitialize(VOID)
+{
+    NTSTATUS Status;
+
+    PAGED_CODE();
+
+    DPRINT("IopRootMemArbiter %p\n", &IopRootMemArbiter);
+
+    IopRootMemArbiter.UnpackRequirement = IopGenericUnpackRequirement;
+    IopRootMemArbiter.PackResource = IopGenericPackResource;
+    IopRootMemArbiter.UnpackResource = IopGenericUnpackResource;
+    IopRootMemArbiter.ScoreRequirement = IopGenericScoreRequirement;
+
+    IopRootMemArbiter.FindSuitableRange = IopMemFindSuitableRange;
+
+    Status = ArbInitializeArbiterInstance(&IopRootMemArbiter,
+                                          NULL,
+                                          CmResourceTypeMemory,
+                                          L"RootMemory",
+                                          L"Root",
+                                          IopGenericTranslateOrdering);
+    if (!NT_SUCCESS(Status))
+    {
+        DPRINT1("IopMemInitialize: Status %p\n", Status);
+        ASSERT(FALSE);
+        return Status;
+    }
+
+    Status = RtlAddRange(IopRootMemArbiter.Allocation,
+                         0,
+                         (UINT64)(PAGE_SIZE - 1),
+                         0,
+                         0,
+                         NULL,
+                         NULL);
+
+    return Status;
+}
+
+/* Port arbiter */
+
+CODE_SEG("PAGE")
+BOOLEAN
+NTAPI
+IopPortFindSuitableRange(
+    _In_ PARBITER_INSTANCE Arbiter,
+    _In_ PARBITER_ALLOCATION_STATE State)
+{
+    PAGED_CODE();
+
+    UNIMPLEMENTED;
+    return FALSE;
+}
+
+CODE_SEG("PAGE")
+VOID
+NTAPI
+IopPortAddAllocation(
+    _In_ PARBITER_INSTANCE Arbiter,
+    _In_ PARBITER_ALLOCATION_STATE ArbState)
+{
+    PAGED_CODE();
+
+    UNIMPLEMENTED;
+}
+
+CODE_SEG("PAGE")
+VOID
+NTAPI
+IopPortBacktrackAllocation(
+    _In_ PARBITER_INSTANCE Arbiter,
+    _Inout_ PARBITER_ALLOCATION_STATE ArbState)
+{
+    PAGED_CODE();
+
+    UNIMPLEMENTED;
+}
+
+CODE_SEG("PAGE")
+NTSTATUS
+NTAPI
+IopPortInitialize(VOID)
+{
+    NTSTATUS Status;
+
+    PAGED_CODE();
+
+    DPRINT("IopRootPortArbiter %p\n", &IopRootPortArbiter);
+
+    IopRootPortArbiter.UnpackRequirement = IopGenericUnpackRequirement;
+    IopRootPortArbiter.PackResource = IopGenericPackResource;
+    IopRootPortArbiter.UnpackResource = IopGenericUnpackResource;
+    IopRootPortArbiter.ScoreRequirement = IopGenericScoreRequirement;
+
+    IopRootPortArbiter.FindSuitableRange = IopPortFindSuitableRange;
+    IopRootPortArbiter.AddAllocation = IopPortAddAllocation;
+    IopRootPortArbiter.BacktrackAllocation = IopPortBacktrackAllocation;
+
+    Status = ArbInitializeArbiterInstance(&IopRootPortArbiter,
+                                          NULL,
+                                          CmResourceTypePort,
+                                          L"RootPort",
+                                          L"Root",
+                                          IopGenericTranslateOrdering);
+    return Status;
+}
diff --git a/ntoskrnl/io/pnpmgr/arbs.c b/ntoskrnl/io/pnpmgr/arbs.c
deleted file mode 100644 (file)
index 09bab2a..0000000
+++ /dev/null
@@ -1,123 +0,0 @@
-/*
- * PROJECT:         ReactOS Kernel
- * COPYRIGHT:       GPL-2.0+ (https://spdx.org/licenses/GPL-2.0+)
- * FILE:            ntoskrnl/io/pnpmgr/arbs.c
- * PURPOSE:         Root arbiters of the PnP manager
- * PROGRAMMERS:     Copyright 2020 Vadim Galyant <vgal@rambler.ru>
- */
-
-/* INCLUDES ******************************************************************/
-
-#include <ntoskrnl.h>
-
-#define NDEBUG
-#include <debug.h>
-
-/* GLOBALS *******************************************************************/
-
-extern ARBITER_INSTANCE IopRootBusNumberArbiter;
-extern ARBITER_INSTANCE IopRootIrqArbiter;
-extern ARBITER_INSTANCE IopRootDmaArbiter;
-extern ARBITER_INSTANCE IopRootMemArbiter;
-extern ARBITER_INSTANCE IopRootPortArbiter;
-
-/* DATA **********************************************************************/
-
-/* FUNCTIONS *****************************************************************/
-
-/* BusNumber arbiter */
-
-NTSTATUS
-NTAPI
-IopBusNumberInitialize(VOID)
-{
-    NTSTATUS Status;
-
-    DPRINT("IopRootBusNumberArbiter %p\n", &IopRootBusNumberArbiter);
-
-    Status = ArbInitializeArbiterInstance(&IopRootBusNumberArbiter,
-                                          NULL,
-                                          CmResourceTypeBusNumber,
-                                          L"RootBusNumber",
-                                          L"Root",
-                                          NULL);
-    return Status;
-}
-
-/* Irq arbiter */
-
-NTSTATUS
-NTAPI
-IopIrqInitialize(VOID)
-{
-    NTSTATUS Status;
-
-    DPRINT("IopRootIrqArbiter %p\n", &IopRootIrqArbiter);
-
-    Status = ArbInitializeArbiterInstance(&IopRootIrqArbiter,
-                                          NULL,
-                                          CmResourceTypeInterrupt,
-                                          L"RootIRQ",
-                                          L"Root",
-                                          NULL);
-    return Status;
-}
-
-/* Dma arbiter */
-
-NTSTATUS
-NTAPI
-IopDmaInitialize(VOID)
-{
-    NTSTATUS Status;
-
-    DPRINT("IopRootDmaArbiter %p\n", &IopRootDmaArbiter);
-
-    Status = ArbInitializeArbiterInstance(&IopRootDmaArbiter,
-                                          NULL,
-                                          CmResourceTypeDma,
-                                          L"RootDMA",
-                                          L"Root",
-                                          NULL);
-    return Status;
-}
-
-/* Memory arbiter */
-
-NTSTATUS
-NTAPI
-IopMemInitialize(VOID)
-{
-    NTSTATUS Status;
-
-    DPRINT("IopRootMemArbiter %p\n", &IopRootMemArbiter);
-
-    Status = ArbInitializeArbiterInstance(&IopRootMemArbiter,
-                                          NULL,
-                                          CmResourceTypeMemory,
-                                          L"RootMemory",
-                                          L"Root",
-                                          NULL);
-    return Status;
-}
-
-/* Port arbiter */
-
-NTSTATUS
-NTAPI
-IopPortInitialize(VOID)
-{
-    NTSTATUS Status;
-
-    DPRINT("IopRootPortArbiter %p\n", &IopRootPortArbiter);
-
-    Status = ArbInitializeArbiterInstance(&IopRootPortArbiter,
-                                          NULL,
-                                          CmResourceTypePort,
-                                          L"RootPort",
-                                          L"Root",
-                                          NULL);
-    return Status;
-}
-
-/* EOF */
index d4bfd5f..89802e0 100644 (file)
@@ -151,7 +151,7 @@ list(APPEND SOURCE
     ${REACTOS_SOURCE_DIR}/ntoskrnl/io/iomgr/symlink.c
     ${REACTOS_SOURCE_DIR}/ntoskrnl/io/iomgr/util.c
     ${REACTOS_SOURCE_DIR}/ntoskrnl/io/iomgr/volume.c
-    ${REACTOS_SOURCE_DIR}/ntoskrnl/io/pnpmgr/arbs.c
+    ${REACTOS_SOURCE_DIR}/ntoskrnl/io/pnpmgr/arbiters.c
     ${REACTOS_SOURCE_DIR}/ntoskrnl/io/pnpmgr/devaction.c
     ${REACTOS_SOURCE_DIR}/ntoskrnl/io/pnpmgr/devnode.c
     ${REACTOS_SOURCE_DIR}/ntoskrnl/io/pnpmgr/plugplay.c
index 9d7d556..e4e1c71 100644 (file)
@@ -1,16 +1,14 @@
 /*
- * PROJECT:         ReactOS Kernel
- * COPYRIGHT:       GPL-2.0+ (https://spdx.org/licenses/GPL-2.0+)
- * FILE:            lib/drivers/arbiter/arbiter.c
- * PURPOSE:         Hardware Resources Arbiter Library
- * PROGRAMMERS:     Copyright 2020 Vadim Galyant <vgal@rambler.ru>
+ * PROJECT:     ReactOS Kernel&Driver SDK
+ * LICENSE:     GPL-2.0-or-later (https://spdx.org/licenses/GPL-2.0-or-later)
+ * PURPOSE:     Hardware Resources Arbiter Library
+ * COPYRIGHT:   Copyright 2020 Vadim Galyant <vgal@rambler.ru>
  */
 
 /* INCLUDES *******************************************************************/
 
 #include <ntifs.h>
-#include <ndk/rtltypes.h>
-
+#include <ndk/rtlfuncs.h>
 #include "arbiter.h"
 
 #define NDEBUG
 
 /* FUNCTIONS ******************************************************************/
 
+CODE_SEG("PAGE")
+NTSTATUS
+NTAPI
+ArbTestAllocation(
+    _In_ PARBITER_INSTANCE Arbiter,
+    _In_ PLIST_ENTRY ArbitrationList)
+{
+    PAGED_CODE();
+
+    UNIMPLEMENTED;
+    return STATUS_NOT_IMPLEMENTED;
+}
+
+CODE_SEG("PAGE")
+NTSTATUS
+NTAPI
+ArbRetestAllocation(
+    _In_ PARBITER_INSTANCE Arbiter,
+    _In_ PLIST_ENTRY ArbitrationList)
+{
+    PAGED_CODE();
+
+    UNIMPLEMENTED;
+    return STATUS_NOT_IMPLEMENTED;
+}
+
+CODE_SEG("PAGE")
+NTSTATUS
+NTAPI
+ArbCommitAllocation(
+    _In_ PARBITER_INSTANCE Arbiter)
+{
+    PAGED_CODE();
+
+    UNIMPLEMENTED;
+    return STATUS_NOT_IMPLEMENTED;
+}
+
+CODE_SEG("PAGE")
+NTSTATUS
+NTAPI
+ArbRollbackAllocation(
+    _In_ PARBITER_INSTANCE Arbiter)
+{
+    PAGED_CODE();
+
+    UNIMPLEMENTED;
+    return STATUS_NOT_IMPLEMENTED;
+}
+
+/* FIXME: the prototype is not correct yet. */
+CODE_SEG("PAGE")
+NTSTATUS
+NTAPI
+ArbAddReserved(
+    _In_ PARBITER_INSTANCE Arbiter)
+{
+    PAGED_CODE();
+
+    UNIMPLEMENTED;
+    return STATUS_NOT_IMPLEMENTED;
+}
+
+CODE_SEG("PAGE")
+NTSTATUS
+NTAPI
+ArbPreprocessEntry(
+    _In_ PARBITER_INSTANCE Arbiter,
+    _Inout_ PARBITER_ALLOCATION_STATE ArbState)
+{
+    PAGED_CODE();
+
+    return STATUS_SUCCESS;
+}
+
+CODE_SEG("PAGE")
+NTSTATUS
+NTAPI
+ArbAllocateEntry(
+    _In_ PARBITER_INSTANCE Arbiter,
+    _Inout_ PARBITER_ALLOCATION_STATE ArbState)
+{
+    PAGED_CODE();
+
+    UNIMPLEMENTED;
+    return STATUS_NOT_IMPLEMENTED;
+}
+
+CODE_SEG("PAGE")
+BOOLEAN
+NTAPI
+ArbGetNextAllocationRange(
+    _In_ PARBITER_INSTANCE Arbiter,
+    _Inout_ PARBITER_ALLOCATION_STATE ArbState)
+{
+    PAGED_CODE();
+
+    UNIMPLEMENTED;
+    return FALSE;
+}
+
+CODE_SEG("PAGE")
+BOOLEAN
+NTAPI
+ArbFindSuitableRange(
+    _In_ PARBITER_INSTANCE Arbiter,
+    _Inout_ PARBITER_ALLOCATION_STATE ArbState)
+{
+    PAGED_CODE();
+
+    UNIMPLEMENTED;
+    return FALSE;
+}
+
+CODE_SEG("PAGE")
+VOID
+NTAPI
+ArbAddAllocation(
+    _In_ PARBITER_INSTANCE Arbiter,
+    _Inout_ PARBITER_ALLOCATION_STATE ArbState)
+{
+    PAGED_CODE();
+
+    UNIMPLEMENTED;
+}
+
+CODE_SEG("PAGE")
+VOID
+NTAPI
+ArbBacktrackAllocation(
+    _In_ PARBITER_INSTANCE Arbiter,
+    _Inout_ PARBITER_ALLOCATION_STATE ArbState)
+{
+    PAGED_CODE();
+
+    UNIMPLEMENTED;
+}
+
+/* FIXME: the prototype is not correct yet. */
+CODE_SEG("PAGE")
+NTSTATUS
+NTAPI
+ArbOverrideConflict(
+    _In_ PARBITER_INSTANCE Arbiter)
+{
+    PAGED_CODE();
+
+    UNIMPLEMENTED;
+    return STATUS_NOT_IMPLEMENTED;
+}
+
+CODE_SEG("PAGE")
+NTSTATUS
+NTAPI
+ArbBootAllocation(
+    _In_ PARBITER_INSTANCE Arbiter,
+    _In_ PLIST_ENTRY ArbitrationList)
+{
+    PAGED_CODE();
+
+    UNIMPLEMENTED;
+    return STATUS_NOT_IMPLEMENTED;
+}
+
+/* FIXME: the prototype is not correct yet. */
+CODE_SEG("PAGE")
+NTSTATUS
+NTAPI
+ArbQueryConflict(
+    _In_ PARBITER_INSTANCE Arbiter)
+{
+    PAGED_CODE();
+
+    UNIMPLEMENTED;
+    return STATUS_NOT_IMPLEMENTED;
+}
+
+/* FIXME: the prototype is not correct yet. */
+CODE_SEG("PAGE")
+NTSTATUS
+NTAPI
+ArbStartArbiter(
+    _In_ PARBITER_INSTANCE Arbiter)
+{
+    PAGED_CODE();
+
+    UNIMPLEMENTED;
+    return STATUS_NOT_IMPLEMENTED;
+}
+
+CODE_SEG("PAGE")
+NTSTATUS
+NTAPI
+ArbAddOrdering(
+    _Out_ PARBITER_ORDERING_LIST OrderList,
+    _In_ UINT64 MinimumAddress,
+    _In_ UINT64 MaximumAddress)
+{
+    PAGED_CODE();
+
+    UNIMPLEMENTED;
+    return STATUS_NOT_IMPLEMENTED;
+}
+
+CODE_SEG("PAGE")
+NTSTATUS
+NTAPI
+ArbPruneOrdering(
+    _Out_ PARBITER_ORDERING_LIST OrderingList,
+    _In_ UINT64 MinimumAddress,
+    _In_ UINT64 MaximumAddress)
+{
+    PAGED_CODE();
+
+    UNIMPLEMENTED;
+    return STATUS_NOT_IMPLEMENTED;
+}
+
+CODE_SEG("PAGE")
+NTSTATUS
+NTAPI
+ArbInitializeOrderingList(
+    _Out_ PARBITER_ORDERING_LIST OrderList)
+{
+    PAGED_CODE();
+
+    UNIMPLEMENTED;
+    return STATUS_NOT_IMPLEMENTED;
+}
+
+CODE_SEG("PAGE")
+VOID
+NTAPI
+ArbFreeOrderingList(
+    _Out_ PARBITER_ORDERING_LIST OrderList)
+{
+    PAGED_CODE();
+
+    UNIMPLEMENTED;
+}
+
+CODE_SEG("PAGE")
+NTSTATUS
+NTAPI
+ArbBuildAssignmentOrdering(
+    _Inout_ PARBITER_INSTANCE ArbInstance,
+    _In_ PCWSTR OrderName,
+    _In_ PCWSTR ReservedOrderName,
+    _In_ PARB_TRANSLATE_ORDERING TranslateOrderingFunction)
+{
+    PAGED_CODE();
+
+    UNIMPLEMENTED;
+    return STATUS_SUCCESS;
+}
+
+CODE_SEG("PAGE")
 NTSTATUS
 NTAPI
 ArbInitializeArbiterInstance(
@@ -34,11 +289,118 @@ ArbInitializeArbiterInstance(
 {
     NTSTATUS Status;
 
-    DPRINT("ArbInitializeArbiterInstance: Initializing %S Arbiter\n", ArbiterName);
-    UNIMPLEMENTED;
+    PAGED_CODE();
+
+    DPRINT("ArbInitializeArbiterInstance: '%S'\n", ArbiterName);
+
+    ASSERT(Arbiter->UnpackRequirement != NULL);
+    ASSERT(Arbiter->PackResource != NULL);
+    ASSERT(Arbiter->UnpackResource != NULL);
+    ASSERT(Arbiter->MutexEvent == NULL);
+    ASSERT(Arbiter->Allocation == NULL);
+    ASSERT(Arbiter->PossibleAllocation == NULL);
+    ASSERT(Arbiter->AllocationStack == NULL);
+
+    Arbiter->Signature = ARBITER_SIGNATURE;
+    Arbiter->BusDeviceObject = BusDeviceObject;
+
+    Arbiter->MutexEvent = ExAllocatePoolWithTag(NonPagedPool, sizeof(KEVENT), TAG_ARBITER);
+    if (!Arbiter->MutexEvent)
+    {
+        DPRINT1("ArbInitializeArbiterInstance: STATUS_INSUFFICIENT_RESOURCES\n");
+        return STATUS_INSUFFICIENT_RESOURCES;
+    }
+
+    KeInitializeEvent(Arbiter->MutexEvent, SynchronizationEvent, TRUE);
+
+    Arbiter->AllocationStack = ExAllocatePoolWithTag(PagedPool, PAGE_SIZE, TAG_ARB_ALLOCATION);
+    if (!Arbiter->AllocationStack)
+    {
+        DPRINT1("ArbInitializeArbiterInstance: STATUS_INSUFFICIENT_RESOURCES\n");
+        ExFreePoolWithTag(Arbiter->MutexEvent, TAG_ARBITER);
+        return STATUS_INSUFFICIENT_RESOURCES;
+    }
+
+    Arbiter->AllocationStackMaxSize = PAGE_SIZE;
+
+    Arbiter->Allocation = ExAllocatePoolWithTag(PagedPool, sizeof(RTL_RANGE_LIST), TAG_ARB_RANGE);
+    if (!Arbiter->Allocation)
+    {
+        DPRINT1("ArbInitializeArbiterInstance: STATUS_INSUFFICIENT_RESOURCES\n");
+        ExFreePoolWithTag(Arbiter->AllocationStack, TAG_ARB_ALLOCATION);
+        ExFreePoolWithTag(Arbiter->MutexEvent, TAG_ARBITER);
+        return STATUS_INSUFFICIENT_RESOURCES;
+    }
+
+    Arbiter->PossibleAllocation = ExAllocatePoolWithTag(PagedPool, sizeof(RTL_RANGE_LIST), TAG_ARB_RANGE);
+    if (!Arbiter->PossibleAllocation)
+    {
+        DPRINT1("ArbInitializeArbiterInstance: STATUS_INSUFFICIENT_RESOURCES\n");
+        ExFreePoolWithTag(Arbiter->Allocation, TAG_ARB_RANGE);
+        ExFreePoolWithTag(Arbiter->AllocationStack, TAG_ARB_ALLOCATION);
+        ExFreePoolWithTag(Arbiter->MutexEvent, TAG_ARBITER);
+        return STATUS_INSUFFICIENT_RESOURCES;
+    }
+
+    RtlInitializeRangeList(Arbiter->Allocation);
+    RtlInitializeRangeList(Arbiter->PossibleAllocation);
+
+    Arbiter->Name = ArbiterName;
+    Arbiter->ResourceType = ResourceType;
+    Arbiter->TransactionInProgress = FALSE;
+
+    if (!Arbiter->TestAllocation)
+        Arbiter->TestAllocation = ArbTestAllocation;
+
+    if (!Arbiter->RetestAllocation)
+        Arbiter->RetestAllocation = ArbRetestAllocation;
+
+    if (!Arbiter->CommitAllocation)
+        Arbiter->CommitAllocation = ArbCommitAllocation;
+
+    if (!Arbiter->RollbackAllocation)
+        Arbiter->RollbackAllocation = ArbRollbackAllocation;
+
+    if (!Arbiter->AddReserved)
+        Arbiter->AddReserved = ArbAddReserved;
+
+    if (!Arbiter->PreprocessEntry)
+        Arbiter->PreprocessEntry = ArbPreprocessEntry;
+
+    if (!Arbiter->AllocateEntry)
+        Arbiter->AllocateEntry = ArbAllocateEntry;
+
+    if (!Arbiter->GetNextAllocationRange)
+        Arbiter->GetNextAllocationRange = ArbGetNextAllocationRange;
+
+    if (!Arbiter->FindSuitableRange)
+        Arbiter->FindSuitableRange = ArbFindSuitableRange;
+
+    if (!Arbiter->AddAllocation)
+        Arbiter->AddAllocation = ArbAddAllocation;
+
+    if (!Arbiter->BacktrackAllocation)
+        Arbiter->BacktrackAllocation = ArbBacktrackAllocation;
+
+    if (!Arbiter->OverrideConflict)
+        Arbiter->OverrideConflict = ArbOverrideConflict;
+
+    if (!Arbiter->BootAllocation)
+        Arbiter->BootAllocation = ArbBootAllocation;
+
+    if (!Arbiter->QueryConflict)
+        Arbiter->QueryConflict = ArbQueryConflict;
+
+    if (!Arbiter->StartArbiter)
+        Arbiter->StartArbiter = ArbStartArbiter;
+
+    Status = ArbBuildAssignmentOrdering(Arbiter, OrderName, OrderName, TranslateOrderingFunction);
+    if (NT_SUCCESS(Status))
+    {
+        return STATUS_SUCCESS;
+    }
+
+    DPRINT1("ArbInitializeArbiterInstance: Status %X\n", Status);
 
-    Status = STATUS_SUCCESS;
     return Status;
 }
-
-/* EOF */
index 6b8be2f..98e8171 100644 (file)
@@ -1,50 +1,53 @@
 /*
- * 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>
+ * PROJECT:     ReactOS Kernel&Driver SDK
+ * LICENSE:     GPL-2.0-or-later (https://spdx.org/licenses/GPL-2.0-or-later)
+ * PURPOSE:     Hardware Resources Arbiter Library
+ * COPYRIGHT:   Copyright 2020 Vadim Galyant <vgal@rambler.ru>
  */
 
-#ifndef _ARBITER_H
-#define _ARBITER_H
+#pragma once
+
+#define ARBITER_SIGNATURE  'sbrA'
+#define TAG_ARBITER        'MbrA'
+#define TAG_ARB_ALLOCATION 'AbrA'
+#define TAG_ARB_RANGE      'RbrA'
 
 typedef struct _ARBITER_ORDERING
 {
-    ULONGLONG Start;
-    ULONGLONG End;
+    UINT64 Start;
+    UINT64 End;
 } ARBITER_ORDERING, *PARBITER_ORDERING;
 
 typedef struct _ARBITER_ORDERING_LIST
 {
-    USHORT Count;
-    USHORT Maximum;
+    UINT16 Count;
+    UINT16 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;
+    UINT64 Minimum;
+    UINT64 Maximum;
+    UINT32 Length;
+    UINT32 Alignment;
+    INT32 Priority;
+    UINT32 Flags;
     PIO_RESOURCE_DESCRIPTOR Descriptor;
-    ULONG Reserved[3];
+    UINT32 Reserved[3];
 } ARBITER_ALTERNATIVE, *PARBITER_ALTERNATIVE;
 
 typedef struct _ARBITER_ALLOCATION_STATE
 {
-    ULONGLONG Start;
-    ULONGLONG End;
-    ULONGLONG CurrentMinimum;
-    ULONGLONG CurrentMaximum;
+    UINT64 Start;
+    UINT64 End;
+    UINT64 CurrentMinimum;
+    UINT64 CurrentMaximum;
     PARBITER_LIST_ENTRY Entry;
     PARBITER_ALTERNATIVE CurrentAlternative;
-    ULONG AlternativeCount;
+    UINT32 AlternativeCount;
     PARBITER_ALTERNATIVE Alternatives;
-    USHORT Flags;
+    UINT16 Flags;
     UCHAR RangeAttributes;
     UCHAR RangeAvailableAttributes;
     ULONG_PTR WorkSpace;
@@ -55,27 +58,27 @@ 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
+    _Out_ PUINT64 OutMinimumAddress,
+    _Out_ PUINT64 OutMaximumAddress,
+    _Out_ PUINT32 OutLength,
+    _Out_ PUINT32 OutAlignment
 );
 
 typedef NTSTATUS
 (NTAPI * PARB_PACK_RESOURCE)(
     _In_ PIO_RESOURCE_DESCRIPTOR IoDescriptor,
-    _In_ ULONGLONG Start,
+    _In_ UINT64 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
+    _Out_ PUINT64 Start,
+    _Out_ PUINT32 OutLength
 );
 
-typedef LONG
+typedef INT32
 (NTAPI * PARB_SCORE_REQUIREMENT)(
     _In_ PIO_RESOURCE_DESCRIPTOR IoDescriptor
 );
@@ -176,7 +179,7 @@ typedef NTSTATUS
 
 typedef struct _ARBITER_INSTANCE
 {
-    ULONG Signature;
+    UINT32 Signature;
     PKEVENT MutexEvent;
     PCWSTR Name;
     CM_RESOURCE_TYPE ResourceType;
@@ -184,9 +187,9 @@ typedef struct _ARBITER_INSTANCE
     PRTL_RANGE_LIST PossibleAllocation;
     ARBITER_ORDERING_LIST OrderingList;
     ARBITER_ORDERING_LIST ReservedList;
-    LONG ReferenceCount;
+    INT32 ReferenceCount;
     PARBITER_INTERFACE Interface;
-    ULONG AllocationStackMaxSize;
+    UINT32 AllocationStackMaxSize;
     PARBITER_ALLOCATION_STATE AllocationStack;
     PARB_UNPACK_REQUIREMENT UnpackRequirement;
     PARB_PACK_RESOURCE PackResource;
@@ -221,6 +224,7 @@ typedef NTSTATUS
     _In_ PIO_RESOURCE_DESCRIPTOR IoDescriptor
 );
 
+CODE_SEG("PAGE")
 NTSTATUS
 NTAPI
 ArbInitializeArbiterInstance(
@@ -231,5 +235,3 @@ ArbInitializeArbiterInstance(
     _In_ PCWSTR OrderName,
     _In_ PARB_TRANSLATE_ORDERING TranslateOrderingFunction
 );
-
-#endif  /* _ARBITER_H */