mirror of
https://github.com/reactos/reactos.git
synced 2025-08-05 22:33:00 +00:00
[SDK:DDK][NTOS:PNP] Implement PnP arbiters initialization
This commit is contained in:
parent
b2f8d62cd1
commit
fec440d8b8
5 changed files with 928 additions and 173 deletions
|
@ -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
|
||||
|
@ -22,6 +20,263 @@
|
|||
|
||||
/* 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 */
|
||||
|
|
|
@ -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 */
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue