mirror of
https://github.com/reactos/reactos.git
synced 2025-05-31 15:08:14 +00:00
[NTOSKRNL]
- Inline KeDisableInterrupts - Make ExInterlocked* functions portable svn path=/trunk/; revision=52897
This commit is contained in:
parent
fc7a05e721
commit
22c0da4ef9
11 changed files with 129 additions and 681 deletions
|
@ -83,12 +83,12 @@ list(APPEND SOURCE
|
||||||
ex/event.c
|
ex/event.c
|
||||||
ex/evtpair.c
|
ex/evtpair.c
|
||||||
ex/exintrin.c
|
ex/exintrin.c
|
||||||
ex/fastinterlck.c
|
|
||||||
ex/fmutex.c
|
ex/fmutex.c
|
||||||
ex/handle.c
|
ex/handle.c
|
||||||
ex/harderr.c
|
ex/harderr.c
|
||||||
ex/hdlsterm.c
|
ex/hdlsterm.c
|
||||||
ex/init.c
|
ex/init.c
|
||||||
|
ex/interlocked.c
|
||||||
ex/keyedevt.c
|
ex/keyedevt.c
|
||||||
ex/locale.c
|
ex/locale.c
|
||||||
ex/lookas.c
|
ex/lookas.c
|
||||||
|
@ -277,7 +277,6 @@ if(ARCH MATCHES i386)
|
||||||
list(APPEND SOURCE
|
list(APPEND SOURCE
|
||||||
config/i386/cmhardwr.c
|
config/i386/cmhardwr.c
|
||||||
ex/i386/fastinterlck_asm.S
|
ex/i386/fastinterlck_asm.S
|
||||||
ex/i386/interlocked.c
|
|
||||||
ex/i386/ioport.S
|
ex/i386/ioport.S
|
||||||
ke/i386/abios.c
|
ke/i386/abios.c
|
||||||
ke/i386/cpu.c
|
ke/i386/cpu.c
|
||||||
|
@ -305,7 +304,6 @@ if(ARCH MATCHES i386)
|
||||||
elseif(ARCH MATCHES amd64)
|
elseif(ARCH MATCHES amd64)
|
||||||
list(APPEND SOURCE
|
list(APPEND SOURCE
|
||||||
config/i386/cmhardwr.c
|
config/i386/cmhardwr.c
|
||||||
ex/amd64/fastinterlck.c
|
|
||||||
ke/amd64/boot.S
|
ke/amd64/boot.S
|
||||||
ke/amd64/context.c
|
ke/amd64/context.c
|
||||||
ke/amd64/cpu.c
|
ke/amd64/cpu.c
|
||||||
|
|
|
@ -1,114 +0,0 @@
|
||||||
/*
|
|
||||||
* PROJECT: ReactOS Kernel
|
|
||||||
* LICENSE: BSD - See COPYING.ARM in the top level directory
|
|
||||||
* FILE: ntoskrnl/ex/fastinterlck.c
|
|
||||||
* PURPOSE: Portable Ex*Interlocked and REGISTER routines for amd64
|
|
||||||
* PROGRAMMERS: ReactOS Portable Systems Group
|
|
||||||
* Timo Kreuzer
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* INCLUDES *******************************************************************/
|
|
||||||
|
|
||||||
#include <ntoskrnl.h>
|
|
||||||
#define NDEBUG
|
|
||||||
#include <debug.h>
|
|
||||||
|
|
||||||
#undef ExInterlockedAddLargeInteger
|
|
||||||
#undef ExInterlockedAddUlong
|
|
||||||
#undef ExInterlockedExtendZone
|
|
||||||
#undef ExInterlockedInsertHeadList
|
|
||||||
#undef ExInterlockedInsertTailList
|
|
||||||
#undef ExInterlockedPopEntryList
|
|
||||||
#undef ExInterlockedPushEntryList
|
|
||||||
#undef ExInterlockedRemoveHeadList
|
|
||||||
#undef ExpInterlockedFlushSList
|
|
||||||
#undef ExpInterlockedPopEntrySList
|
|
||||||
#undef ExpInterlockedPushEntrySList
|
|
||||||
|
|
||||||
/* FUNCTIONS ******************************************************************/
|
|
||||||
|
|
||||||
LARGE_INTEGER
|
|
||||||
ExInterlockedAddLargeInteger(IN PLARGE_INTEGER Addend,
|
|
||||||
IN LARGE_INTEGER Increment,
|
|
||||||
IN PKSPIN_LOCK Lock)
|
|
||||||
{
|
|
||||||
LARGE_INTEGER Int;
|
|
||||||
Int.QuadPart = _InterlockedExchangeAdd64(&Addend->QuadPart,
|
|
||||||
Increment.QuadPart);
|
|
||||||
return Int;
|
|
||||||
}
|
|
||||||
|
|
||||||
ULONG
|
|
||||||
ExInterlockedAddUlong(IN PULONG Addend,
|
|
||||||
IN ULONG Increment,
|
|
||||||
PKSPIN_LOCK Lock)
|
|
||||||
{
|
|
||||||
return (ULONG)_InterlockedExchangeAdd((PLONG)Addend, Increment);
|
|
||||||
}
|
|
||||||
|
|
||||||
PLIST_ENTRY
|
|
||||||
ExInterlockedInsertHeadList(IN PLIST_ENTRY ListHead,
|
|
||||||
IN PLIST_ENTRY ListEntry,
|
|
||||||
IN PKSPIN_LOCK Lock)
|
|
||||||
{
|
|
||||||
KIRQL OldIrql;
|
|
||||||
PLIST_ENTRY OldHead = NULL;
|
|
||||||
KeAcquireSpinLock(Lock, &OldIrql);
|
|
||||||
if (!IsListEmpty(ListHead)) OldHead = ListEntry->Flink;
|
|
||||||
InsertHeadList(ListHead, ListEntry);
|
|
||||||
KeReleaseSpinLock(Lock, OldIrql);
|
|
||||||
return OldHead;
|
|
||||||
}
|
|
||||||
|
|
||||||
PLIST_ENTRY
|
|
||||||
ExInterlockedInsertTailList(IN PLIST_ENTRY ListHead,
|
|
||||||
IN PLIST_ENTRY ListEntry,
|
|
||||||
IN PKSPIN_LOCK Lock)
|
|
||||||
{
|
|
||||||
KIRQL OldIrql;
|
|
||||||
PLIST_ENTRY OldHead = NULL;
|
|
||||||
KeAcquireSpinLock(Lock, &OldIrql);
|
|
||||||
if (!IsListEmpty(ListHead)) OldHead = ListEntry->Blink;
|
|
||||||
InsertTailList(ListHead, ListEntry);
|
|
||||||
KeReleaseSpinLock(Lock, OldIrql);
|
|
||||||
return OldHead;
|
|
||||||
}
|
|
||||||
|
|
||||||
PSINGLE_LIST_ENTRY
|
|
||||||
ExInterlockedPopEntryList(IN PSINGLE_LIST_ENTRY ListHead,
|
|
||||||
IN PKSPIN_LOCK Lock)
|
|
||||||
{
|
|
||||||
KIRQL OldIrql;
|
|
||||||
PSINGLE_LIST_ENTRY FirstEntry;
|
|
||||||
KeAcquireSpinLock(Lock, &OldIrql);
|
|
||||||
FirstEntry = PopEntryList(ListHead);
|
|
||||||
KeReleaseSpinLock(Lock, OldIrql);
|
|
||||||
return FirstEntry;
|
|
||||||
}
|
|
||||||
|
|
||||||
PSINGLE_LIST_ENTRY
|
|
||||||
ExInterlockedPushEntryList(IN PSINGLE_LIST_ENTRY ListHead,
|
|
||||||
IN PSINGLE_LIST_ENTRY ListEntry,
|
|
||||||
IN PKSPIN_LOCK Lock)
|
|
||||||
{
|
|
||||||
KIRQL OldIrql;
|
|
||||||
PSINGLE_LIST_ENTRY OldHead = NULL;
|
|
||||||
KeAcquireSpinLock(Lock, &OldIrql);
|
|
||||||
OldHead = ListHead->Next;
|
|
||||||
PushEntryList(ListHead, ListEntry);
|
|
||||||
KeReleaseSpinLock(Lock, OldIrql);
|
|
||||||
return OldHead;
|
|
||||||
}
|
|
||||||
|
|
||||||
PLIST_ENTRY
|
|
||||||
ExInterlockedRemoveHeadList(IN PLIST_ENTRY ListHead,
|
|
||||||
IN PKSPIN_LOCK Lock)
|
|
||||||
{
|
|
||||||
KIRQL OldIrql;
|
|
||||||
PLIST_ENTRY OldHead = NULL;
|
|
||||||
KeAcquireSpinLock(Lock, &OldIrql);
|
|
||||||
if (!IsListEmpty(ListHead)) OldHead = RemoveHeadList(ListHead);
|
|
||||||
KeReleaseSpinLock(Lock, OldIrql);
|
|
||||||
return OldHead;
|
|
||||||
}
|
|
||||||
|
|
|
@ -1,460 +0,0 @@
|
||||||
/*
|
|
||||||
* PROJECT: ReactOS Kernel
|
|
||||||
* LICENSE: BSD - See COPYING.ARM in the top level directory
|
|
||||||
* FILE: ntoskrnl/ex/fastinterlck.c
|
|
||||||
* PURPOSE: Portable Ex*Interlocked and REGISTER routines for non-x86
|
|
||||||
* PROGRAMMERS: ReactOS Portable Systems Group
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* INCLUDES *******************************************************************/
|
|
||||||
|
|
||||||
#if defined(_ARM_) || defined(_PPC_) || defined(NTOS_USE_GENERICS)
|
|
||||||
|
|
||||||
#include <ntoskrnl.h>
|
|
||||||
#define NDEBUG
|
|
||||||
#include <debug.h>
|
|
||||||
|
|
||||||
#undef ExInterlockedPushEntrySList
|
|
||||||
#undef ExInterlockedPopEntrySList
|
|
||||||
#undef ExInterlockedAddULong
|
|
||||||
#undef ExInterlockedIncrementLong
|
|
||||||
#undef ExInterlockedDecrementLong
|
|
||||||
#undef ExInterlockedAddLargeStatistic
|
|
||||||
|
|
||||||
/* FUNCTIONS ******************************************************************/
|
|
||||||
|
|
||||||
PSLIST_ENTRY
|
|
||||||
NTAPI
|
|
||||||
InterlockedPushEntrySList(IN PSLIST_HEADER ListHead,
|
|
||||||
IN PSLIST_ENTRY ListEntry)
|
|
||||||
{
|
|
||||||
|
|
||||||
PSINGLE_LIST_ENTRY FirstEntry, NextEntry;
|
|
||||||
PSINGLE_LIST_ENTRY Entry = (PVOID)ListEntry, Head = (PVOID)ListHead;
|
|
||||||
|
|
||||||
FirstEntry = Head->Next;
|
|
||||||
do
|
|
||||||
{
|
|
||||||
Entry->Next = FirstEntry;
|
|
||||||
NextEntry = FirstEntry;
|
|
||||||
FirstEntry = (PVOID)_InterlockedCompareExchange((PLONG)Head,
|
|
||||||
(LONG)Entry,
|
|
||||||
(LONG)FirstEntry);
|
|
||||||
} while (FirstEntry != NextEntry);
|
|
||||||
|
|
||||||
return FirstEntry;
|
|
||||||
}
|
|
||||||
|
|
||||||
PSLIST_ENTRY
|
|
||||||
NTAPI
|
|
||||||
InterlockedPopEntrySList(IN PSLIST_HEADER ListHead)
|
|
||||||
{
|
|
||||||
PSINGLE_LIST_ENTRY FirstEntry, NextEntry, Head = (PVOID)ListHead;
|
|
||||||
|
|
||||||
FirstEntry = Head->Next;
|
|
||||||
do
|
|
||||||
{
|
|
||||||
if (!FirstEntry) return NULL;
|
|
||||||
|
|
||||||
NextEntry = FirstEntry;
|
|
||||||
FirstEntry = (PVOID)_InterlockedCompareExchange((PLONG)Head,
|
|
||||||
(LONG)FirstEntry->Next,
|
|
||||||
(LONG)FirstEntry);
|
|
||||||
} while (FirstEntry != NextEntry);
|
|
||||||
|
|
||||||
return FirstEntry;
|
|
||||||
}
|
|
||||||
|
|
||||||
PSINGLE_LIST_ENTRY
|
|
||||||
FASTCALL
|
|
||||||
ExInterlockedFlushSList(IN PSLIST_HEADER ListHead)
|
|
||||||
{
|
|
||||||
return (PVOID)_InterlockedExchange((PLONG)&ListHead->Next.Next, (LONG)NULL);
|
|
||||||
}
|
|
||||||
|
|
||||||
PSLIST_ENTRY
|
|
||||||
FASTCALL
|
|
||||||
ExInterlockedPushEntrySList(IN PSLIST_HEADER ListHead,
|
|
||||||
IN PSLIST_ENTRY ListEntry,
|
|
||||||
IN PKSPIN_LOCK Lock)
|
|
||||||
{
|
|
||||||
return InterlockedPushEntrySList(ListHead, ListEntry);
|
|
||||||
}
|
|
||||||
|
|
||||||
PSINGLE_LIST_ENTRY
|
|
||||||
NTAPI
|
|
||||||
ExInterlockedPopEntrySList(IN PSLIST_HEADER ListHead,
|
|
||||||
IN PKSPIN_LOCK Lock)
|
|
||||||
{
|
|
||||||
return InterlockedPopEntrySList(ListHead);
|
|
||||||
}
|
|
||||||
|
|
||||||
ULONG
|
|
||||||
FASTCALL
|
|
||||||
ExfInterlockedAddUlong(IN PULONG Addend,
|
|
||||||
IN ULONG Increment,
|
|
||||||
PKSPIN_LOCK Lock)
|
|
||||||
{
|
|
||||||
KIRQL OldIrql;
|
|
||||||
KeAcquireSpinLock(Lock, &OldIrql);
|
|
||||||
*Addend += Increment;
|
|
||||||
KeReleaseSpinLock(Lock, OldIrql);
|
|
||||||
return *Addend;
|
|
||||||
}
|
|
||||||
|
|
||||||
LONGLONG
|
|
||||||
FASTCALL
|
|
||||||
ExfInterlockedCompareExchange64(IN OUT LONGLONG volatile *Destination,
|
|
||||||
IN PLONGLONG Exchange,
|
|
||||||
IN PLONGLONG Comparand)
|
|
||||||
{
|
|
||||||
LONGLONG Result;
|
|
||||||
|
|
||||||
Result = *Destination;
|
|
||||||
if (*Destination == *Comparand) *Destination = *Exchange;
|
|
||||||
return Result;
|
|
||||||
}
|
|
||||||
|
|
||||||
PLIST_ENTRY
|
|
||||||
FASTCALL
|
|
||||||
ExfInterlockedInsertHeadList(IN PLIST_ENTRY ListHead,
|
|
||||||
IN PLIST_ENTRY ListEntry,
|
|
||||||
IN PKSPIN_LOCK Lock)
|
|
||||||
{
|
|
||||||
KIRQL OldIrql;
|
|
||||||
PLIST_ENTRY OldHead = NULL;
|
|
||||||
KeAcquireSpinLock(Lock, &OldIrql);
|
|
||||||
if (!IsListEmpty(ListHead)) OldHead = ListEntry->Flink;
|
|
||||||
InsertHeadList(ListHead, ListEntry);
|
|
||||||
KeReleaseSpinLock(Lock, OldIrql);
|
|
||||||
return OldHead;
|
|
||||||
}
|
|
||||||
|
|
||||||
PLIST_ENTRY
|
|
||||||
FASTCALL
|
|
||||||
ExfInterlockedInsertTailList(IN PLIST_ENTRY ListHead,
|
|
||||||
IN PLIST_ENTRY ListEntry,
|
|
||||||
IN PKSPIN_LOCK Lock)
|
|
||||||
{
|
|
||||||
KIRQL OldIrql;
|
|
||||||
PLIST_ENTRY OldHead = NULL;
|
|
||||||
KeAcquireSpinLock(Lock, &OldIrql);
|
|
||||||
if (!IsListEmpty(ListHead)) OldHead = ListEntry->Blink;
|
|
||||||
InsertTailList(ListHead, ListEntry);
|
|
||||||
KeReleaseSpinLock(Lock, OldIrql);
|
|
||||||
return OldHead;
|
|
||||||
}
|
|
||||||
|
|
||||||
PSINGLE_LIST_ENTRY
|
|
||||||
FASTCALL
|
|
||||||
ExfInterlockedPopEntryList(IN PSINGLE_LIST_ENTRY ListHead,
|
|
||||||
IN PKSPIN_LOCK Lock)
|
|
||||||
{
|
|
||||||
UNIMPLEMENTED;
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
PSINGLE_LIST_ENTRY
|
|
||||||
FASTCALL
|
|
||||||
ExfInterlockedPushEntryList(IN PSINGLE_LIST_ENTRY ListHead,
|
|
||||||
IN PSINGLE_LIST_ENTRY ListEntry,
|
|
||||||
IN PKSPIN_LOCK Lock)
|
|
||||||
{
|
|
||||||
UNIMPLEMENTED;
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
PLIST_ENTRY
|
|
||||||
FASTCALL
|
|
||||||
ExfInterlockedRemoveHeadList(IN PLIST_ENTRY ListHead,
|
|
||||||
IN PKSPIN_LOCK Lock)
|
|
||||||
{
|
|
||||||
return ExInterlockedRemoveHeadList(ListHead, Lock);
|
|
||||||
}
|
|
||||||
|
|
||||||
LARGE_INTEGER
|
|
||||||
NTAPI
|
|
||||||
ExInterlockedAddLargeInteger(IN PLARGE_INTEGER Addend,
|
|
||||||
IN LARGE_INTEGER Increment,
|
|
||||||
IN PKSPIN_LOCK Lock)
|
|
||||||
{
|
|
||||||
LARGE_INTEGER Integer = {{0}};
|
|
||||||
UNIMPLEMENTED;
|
|
||||||
return Integer;
|
|
||||||
}
|
|
||||||
|
|
||||||
ULONG
|
|
||||||
NTAPI
|
|
||||||
ExInterlockedAddUlong(IN PULONG Addend,
|
|
||||||
IN ULONG Increment,
|
|
||||||
PKSPIN_LOCK Lock)
|
|
||||||
{
|
|
||||||
return (ULONG)_InterlockedExchangeAdd((PLONG)Addend, Increment);
|
|
||||||
}
|
|
||||||
|
|
||||||
INTERLOCKED_RESULT
|
|
||||||
NTAPI
|
|
||||||
ExInterlockedIncrementLong(IN PLONG Addend,
|
|
||||||
IN PKSPIN_LOCK Lock)
|
|
||||||
{
|
|
||||||
return _InterlockedIncrement(Addend);
|
|
||||||
}
|
|
||||||
|
|
||||||
INTERLOCKED_RESULT
|
|
||||||
NTAPI
|
|
||||||
ExInterlockedDecrementLong(IN PLONG Addend,
|
|
||||||
IN PKSPIN_LOCK Lock)
|
|
||||||
{
|
|
||||||
return _InterlockedDecrement(Addend);
|
|
||||||
}
|
|
||||||
|
|
||||||
ULONG
|
|
||||||
NTAPI
|
|
||||||
ExInterlockedExchangeUlong(IN PULONG Target,
|
|
||||||
IN ULONG Value,
|
|
||||||
IN PKSPIN_LOCK Lock)
|
|
||||||
{
|
|
||||||
return (ULONG)_InterlockedExchange((PLONG)Target, Value);
|
|
||||||
}
|
|
||||||
|
|
||||||
PLIST_ENTRY
|
|
||||||
NTAPI
|
|
||||||
ExInterlockedInsertHeadList(IN PLIST_ENTRY ListHead,
|
|
||||||
IN PLIST_ENTRY ListEntry,
|
|
||||||
IN PKSPIN_LOCK Lock)
|
|
||||||
{
|
|
||||||
KIRQL OldIrql;
|
|
||||||
PLIST_ENTRY OldHead = NULL;
|
|
||||||
KeAcquireSpinLock(Lock, &OldIrql);
|
|
||||||
if (!IsListEmpty(ListHead)) OldHead = ListEntry->Flink;
|
|
||||||
InsertHeadList(ListHead, ListEntry);
|
|
||||||
KeReleaseSpinLock(Lock, OldIrql);
|
|
||||||
return OldHead;
|
|
||||||
}
|
|
||||||
|
|
||||||
PLIST_ENTRY
|
|
||||||
NTAPI
|
|
||||||
ExInterlockedInsertTailList(IN PLIST_ENTRY ListHead,
|
|
||||||
IN PLIST_ENTRY ListEntry,
|
|
||||||
IN PKSPIN_LOCK Lock)
|
|
||||||
{
|
|
||||||
KIRQL OldIrql;
|
|
||||||
PLIST_ENTRY OldHead = NULL;
|
|
||||||
KeAcquireSpinLock(Lock, &OldIrql);
|
|
||||||
if (!IsListEmpty(ListHead)) OldHead = ListEntry->Blink;
|
|
||||||
InsertTailList(ListHead, ListEntry);
|
|
||||||
KeReleaseSpinLock(Lock, OldIrql);
|
|
||||||
return OldHead;
|
|
||||||
}
|
|
||||||
|
|
||||||
PSINGLE_LIST_ENTRY
|
|
||||||
NTAPI
|
|
||||||
ExInterlockedPopEntryList(IN PSINGLE_LIST_ENTRY ListHead,
|
|
||||||
IN PKSPIN_LOCK Lock)
|
|
||||||
{
|
|
||||||
KIRQL OldIrql;
|
|
||||||
PSINGLE_LIST_ENTRY OldHead = NULL;
|
|
||||||
KeAcquireSpinLock(Lock, &OldIrql);
|
|
||||||
OldHead = PopEntryList(ListHead);
|
|
||||||
KeReleaseSpinLock(Lock, OldIrql);
|
|
||||||
return OldHead;
|
|
||||||
}
|
|
||||||
|
|
||||||
PSINGLE_LIST_ENTRY
|
|
||||||
NTAPI
|
|
||||||
ExInterlockedPushEntryList(IN PSINGLE_LIST_ENTRY ListHead,
|
|
||||||
IN PSINGLE_LIST_ENTRY ListEntry,
|
|
||||||
IN PKSPIN_LOCK Lock)
|
|
||||||
{
|
|
||||||
KIRQL OldIrql;
|
|
||||||
PSINGLE_LIST_ENTRY OldHead = NULL;
|
|
||||||
KeAcquireSpinLock(Lock, &OldIrql);
|
|
||||||
OldHead = ListHead->Next;
|
|
||||||
PushEntryList(ListHead, ListEntry);
|
|
||||||
KeReleaseSpinLock(Lock, OldIrql);
|
|
||||||
return OldHead;
|
|
||||||
}
|
|
||||||
|
|
||||||
PLIST_ENTRY
|
|
||||||
NTAPI
|
|
||||||
ExInterlockedRemoveHeadList(IN PLIST_ENTRY ListHead,
|
|
||||||
IN PKSPIN_LOCK Lock)
|
|
||||||
{
|
|
||||||
KIRQL OldIrql;
|
|
||||||
PLIST_ENTRY OldHead = NULL;
|
|
||||||
KeAcquireSpinLock(Lock, &OldIrql);
|
|
||||||
if (!IsListEmpty(ListHead)) OldHead = RemoveHeadList(ListHead);
|
|
||||||
KeReleaseSpinLock(Lock, OldIrql);
|
|
||||||
return OldHead;
|
|
||||||
}
|
|
||||||
|
|
||||||
VOID
|
|
||||||
FASTCALL
|
|
||||||
ExInterlockedAddLargeStatistic(IN PLONGLONG Addend,
|
|
||||||
IN ULONG Increment)
|
|
||||||
{
|
|
||||||
UNIMPLEMENTED;
|
|
||||||
}
|
|
||||||
|
|
||||||
LONGLONG
|
|
||||||
FASTCALL
|
|
||||||
ExInterlockedCompareExchange64(IN OUT LONGLONG volatile *Destination,
|
|
||||||
IN PLONGLONG Exchange,
|
|
||||||
IN PLONGLONG Comparand,
|
|
||||||
IN PKSPIN_LOCK Lock)
|
|
||||||
{
|
|
||||||
KIRQL OldIrql;
|
|
||||||
LONGLONG Result;
|
|
||||||
|
|
||||||
KeAcquireSpinLock(Lock, &OldIrql);
|
|
||||||
Result = *Destination;
|
|
||||||
if (*Destination == *Comparand) *Destination = *Exchange;
|
|
||||||
KeReleaseSpinLock(Lock, OldIrql);
|
|
||||||
return Result;
|
|
||||||
}
|
|
||||||
|
|
||||||
VOID
|
|
||||||
NTAPI
|
|
||||||
READ_REGISTER_BUFFER_UCHAR(IN PUCHAR Register,
|
|
||||||
IN PUCHAR Buffer,
|
|
||||||
IN ULONG Count)
|
|
||||||
{
|
|
||||||
PUCHAR registerBuffer = Register;
|
|
||||||
PUCHAR readBuffer = Buffer;
|
|
||||||
ULONG readCount;
|
|
||||||
|
|
||||||
for (readCount = Count; readCount--; readBuffer++, registerBuffer++)
|
|
||||||
{
|
|
||||||
*readBuffer = *(volatile UCHAR * const)registerBuffer;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
VOID
|
|
||||||
NTAPI
|
|
||||||
READ_REGISTER_BUFFER_ULONG(IN PULONG Register,
|
|
||||||
IN PULONG Buffer,
|
|
||||||
IN ULONG Count)
|
|
||||||
{
|
|
||||||
PULONG registerBuffer = Register;
|
|
||||||
PULONG readBuffer = Buffer;
|
|
||||||
ULONG readCount;
|
|
||||||
|
|
||||||
for (readCount = Count; readCount--; readBuffer++, registerBuffer++)
|
|
||||||
{
|
|
||||||
*readBuffer = *(volatile ULONG * const)registerBuffer;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
VOID
|
|
||||||
NTAPI
|
|
||||||
READ_REGISTER_BUFFER_USHORT(IN PUSHORT Register,
|
|
||||||
IN PUSHORT Buffer,
|
|
||||||
IN ULONG Count)
|
|
||||||
{
|
|
||||||
PUSHORT registerBuffer = Register;
|
|
||||||
PUSHORT readBuffer = Buffer;
|
|
||||||
ULONG readCount;
|
|
||||||
|
|
||||||
for (readCount = Count; readCount--; readBuffer++, registerBuffer++)
|
|
||||||
{
|
|
||||||
*readBuffer = *(volatile USHORT * const)registerBuffer;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
UCHAR
|
|
||||||
NTAPI
|
|
||||||
READ_REGISTER_UCHAR(IN PUCHAR Register)
|
|
||||||
{
|
|
||||||
return *(volatile UCHAR * const)Register;
|
|
||||||
}
|
|
||||||
|
|
||||||
ULONG
|
|
||||||
NTAPI
|
|
||||||
READ_REGISTER_ULONG(IN PULONG Register)
|
|
||||||
{
|
|
||||||
return *(volatile ULONG * const)Register;
|
|
||||||
}
|
|
||||||
|
|
||||||
USHORT
|
|
||||||
NTAPI
|
|
||||||
READ_REGISTER_USHORT(IN PUSHORT Register)
|
|
||||||
{
|
|
||||||
return *(volatile USHORT * const)Register;
|
|
||||||
}
|
|
||||||
|
|
||||||
VOID
|
|
||||||
NTAPI
|
|
||||||
WRITE_REGISTER_BUFFER_UCHAR(IN PUCHAR Register,
|
|
||||||
IN PUCHAR Buffer,
|
|
||||||
IN ULONG Count)
|
|
||||||
{
|
|
||||||
PUCHAR registerBuffer = Register;
|
|
||||||
PUCHAR writeBuffer = Buffer;
|
|
||||||
ULONG writeCount;
|
|
||||||
for (writeCount = Count; writeCount--; writeBuffer++, registerBuffer++)
|
|
||||||
{
|
|
||||||
*(volatile UCHAR * const)registerBuffer = *writeBuffer;
|
|
||||||
}
|
|
||||||
KeFlushWriteBuffer();
|
|
||||||
}
|
|
||||||
|
|
||||||
VOID
|
|
||||||
NTAPI
|
|
||||||
WRITE_REGISTER_BUFFER_ULONG(IN PULONG Register,
|
|
||||||
IN PULONG Buffer,
|
|
||||||
IN ULONG Count)
|
|
||||||
{
|
|
||||||
PULONG registerBuffer = Register;
|
|
||||||
PULONG writeBuffer = Buffer;
|
|
||||||
ULONG writeCount;
|
|
||||||
for (writeCount = Count; writeCount--; writeBuffer++, registerBuffer++)
|
|
||||||
{
|
|
||||||
*(volatile ULONG * const)registerBuffer = *writeBuffer;
|
|
||||||
}
|
|
||||||
KeFlushWriteBuffer();
|
|
||||||
}
|
|
||||||
|
|
||||||
VOID
|
|
||||||
NTAPI
|
|
||||||
WRITE_REGISTER_BUFFER_USHORT(IN PUSHORT Register,
|
|
||||||
IN PUSHORT Buffer,
|
|
||||||
IN ULONG Count)
|
|
||||||
{
|
|
||||||
PUSHORT registerBuffer = Register;
|
|
||||||
PUSHORT writeBuffer = Buffer;
|
|
||||||
ULONG writeCount;
|
|
||||||
for (writeCount = Count; writeCount--; writeBuffer++, registerBuffer++)
|
|
||||||
{
|
|
||||||
*(volatile USHORT * const)registerBuffer = *writeBuffer;
|
|
||||||
}
|
|
||||||
KeFlushWriteBuffer();
|
|
||||||
}
|
|
||||||
|
|
||||||
VOID
|
|
||||||
NTAPI
|
|
||||||
WRITE_REGISTER_UCHAR(IN PUCHAR Register,
|
|
||||||
IN UCHAR Value)
|
|
||||||
{
|
|
||||||
*(volatile UCHAR * const)Register = Value;
|
|
||||||
KeFlushWriteBuffer();
|
|
||||||
}
|
|
||||||
|
|
||||||
VOID
|
|
||||||
NTAPI
|
|
||||||
WRITE_REGISTER_ULONG(IN PULONG Register,
|
|
||||||
IN ULONG Value)
|
|
||||||
{
|
|
||||||
*(volatile ULONG * const)Register = Value;
|
|
||||||
KeFlushWriteBuffer();
|
|
||||||
}
|
|
||||||
|
|
||||||
VOID
|
|
||||||
NTAPI
|
|
||||||
WRITE_REGISTER_USHORT(IN PUSHORT Register,
|
|
||||||
IN USHORT Value)
|
|
||||||
{
|
|
||||||
*(volatile USHORT * const)Register = Value;
|
|
||||||
KeFlushWriteBuffer();
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif
|
|
|
@ -27,41 +27,35 @@
|
||||||
|
|
||||||
/* FUNCTIONS ****************************************************************/
|
/* FUNCTIONS ****************************************************************/
|
||||||
|
|
||||||
#if defined(_M_IX86 ) || defined(_M_AMD64)
|
|
||||||
FORCEINLINE
|
FORCEINLINE
|
||||||
ULONG_PTR
|
BOOLEAN
|
||||||
_ExiDisableInteruptsAndAcquireSpinlock(
|
_ExiDisableInteruptsAndAcquireSpinlock(
|
||||||
IN OUT PKSPIN_LOCK Lock)
|
IN OUT PKSPIN_LOCK Lock)
|
||||||
{
|
{
|
||||||
UINT_PTR EFlags;
|
BOOLEAN Enabled;
|
||||||
|
|
||||||
/* Save flags */
|
|
||||||
EFlags = __readeflags();
|
|
||||||
|
|
||||||
/* Disable interrupts */
|
/* Disable interrupts */
|
||||||
_disable();
|
Enabled = KeDisableInterrupts();
|
||||||
|
|
||||||
/* Acquire the spinlock (inline) */
|
/* Acquire the spinlock (inline) */
|
||||||
KxAcquireSpinLock(Lock);
|
KxAcquireSpinLock(Lock);
|
||||||
|
|
||||||
return EFlags;
|
return Enabled;
|
||||||
}
|
}
|
||||||
|
|
||||||
FORCEINLINE
|
FORCEINLINE
|
||||||
VOID
|
VOID
|
||||||
_ExiReleaseSpinLockAndRestoreInterupts(
|
_ExiReleaseSpinLockAndRestoreInterupts(
|
||||||
IN OUT PKSPIN_LOCK Lock,
|
IN OUT PKSPIN_LOCK Lock,
|
||||||
ULONG_PTR EFlags)
|
BOOLEAN Enable)
|
||||||
{
|
{
|
||||||
/* Release the spinlock */
|
/* Release the spinlock */
|
||||||
KxReleaseSpinLock(Lock);
|
KxReleaseSpinLock(Lock);
|
||||||
|
|
||||||
/* Restore flags */
|
/* Restore interrupts */
|
||||||
__writeeflags(EFlags);
|
KeRestoreInterrupts(Enable);
|
||||||
}
|
}
|
||||||
#else
|
|
||||||
#error Unimplemented
|
|
||||||
#endif
|
|
||||||
|
|
||||||
LARGE_INTEGER
|
LARGE_INTEGER
|
||||||
NTAPI
|
NTAPI
|
||||||
|
@ -71,10 +65,10 @@ ExInterlockedAddLargeInteger(
|
||||||
IN OUT PKSPIN_LOCK Lock)
|
IN OUT PKSPIN_LOCK Lock)
|
||||||
{
|
{
|
||||||
LARGE_INTEGER OldValue;
|
LARGE_INTEGER OldValue;
|
||||||
ULONG_PTR LockHandle;
|
BOOLEAN Enable;
|
||||||
|
|
||||||
/* Disable interrupts and acquire the spinlock */
|
/* Disable interrupts and acquire the spinlock */
|
||||||
LockHandle = _ExiDisableInteruptsAndAcquireSpinlock(Lock);
|
Enable = _ExiDisableInteruptsAndAcquireSpinlock(Lock);
|
||||||
|
|
||||||
/* Save the old value */
|
/* Save the old value */
|
||||||
OldValue.QuadPart = Addend->QuadPart;
|
OldValue.QuadPart = Addend->QuadPart;
|
||||||
|
@ -83,7 +77,7 @@ ExInterlockedAddLargeInteger(
|
||||||
Addend->QuadPart += Increment.QuadPart;
|
Addend->QuadPart += Increment.QuadPart;
|
||||||
|
|
||||||
/* Release the spinlock and restore interrupts */
|
/* Release the spinlock and restore interrupts */
|
||||||
_ExiReleaseSpinLockAndRestoreInterupts(Lock, LockHandle);
|
_ExiReleaseSpinLockAndRestoreInterupts(Lock, Enable);
|
||||||
|
|
||||||
/* Return the old value */
|
/* Return the old value */
|
||||||
return OldValue;
|
return OldValue;
|
||||||
|
@ -96,11 +90,11 @@ ExInterlockedAddUlong(
|
||||||
IN ULONG Increment,
|
IN ULONG Increment,
|
||||||
IN OUT PKSPIN_LOCK Lock)
|
IN OUT PKSPIN_LOCK Lock)
|
||||||
{
|
{
|
||||||
ULONG_PTR LockHandle;
|
BOOLEAN Enable;
|
||||||
ULONG OldValue;
|
ULONG OldValue;
|
||||||
|
|
||||||
/* Disable interrupts and acquire the spinlock */
|
/* Disable interrupts and acquire the spinlock */
|
||||||
LockHandle = _ExiDisableInteruptsAndAcquireSpinlock(Lock);
|
Enable = _ExiDisableInteruptsAndAcquireSpinlock(Lock);
|
||||||
|
|
||||||
/* Save the old value */
|
/* Save the old value */
|
||||||
OldValue = *Addend;
|
OldValue = *Addend;
|
||||||
|
@ -109,7 +103,7 @@ ExInterlockedAddUlong(
|
||||||
*Addend += Increment;
|
*Addend += Increment;
|
||||||
|
|
||||||
/* Release the spinlock and restore interrupts */
|
/* Release the spinlock and restore interrupts */
|
||||||
_ExiReleaseSpinLockAndRestoreInterupts(Lock, LockHandle);
|
_ExiReleaseSpinLockAndRestoreInterupts(Lock, Enable);
|
||||||
|
|
||||||
/* Return the old value */
|
/* Return the old value */
|
||||||
return OldValue;
|
return OldValue;
|
||||||
|
@ -122,11 +116,11 @@ ExInterlockedInsertHeadList(
|
||||||
IN OUT PLIST_ENTRY ListEntry,
|
IN OUT PLIST_ENTRY ListEntry,
|
||||||
IN OUT PKSPIN_LOCK Lock)
|
IN OUT PKSPIN_LOCK Lock)
|
||||||
{
|
{
|
||||||
ULONG_PTR LockHandle;
|
BOOLEAN Enable;
|
||||||
PLIST_ENTRY FirstEntry;
|
PLIST_ENTRY FirstEntry;
|
||||||
|
|
||||||
/* Disable interrupts and acquire the spinlock */
|
/* Disable interrupts and acquire the spinlock */
|
||||||
LockHandle = _ExiDisableInteruptsAndAcquireSpinlock(Lock);
|
Enable = _ExiDisableInteruptsAndAcquireSpinlock(Lock);
|
||||||
|
|
||||||
/* Save the first entry */
|
/* Save the first entry */
|
||||||
FirstEntry = ListHead->Flink;
|
FirstEntry = ListHead->Flink;
|
||||||
|
@ -135,7 +129,7 @@ ExInterlockedInsertHeadList(
|
||||||
InsertHeadList(ListHead, ListEntry);
|
InsertHeadList(ListHead, ListEntry);
|
||||||
|
|
||||||
/* Release the spinlock and restore interrupts */
|
/* Release the spinlock and restore interrupts */
|
||||||
_ExiReleaseSpinLockAndRestoreInterupts(Lock, LockHandle);
|
_ExiReleaseSpinLockAndRestoreInterupts(Lock, Enable);
|
||||||
|
|
||||||
/* Return the old first entry or NULL for empty list */
|
/* Return the old first entry or NULL for empty list */
|
||||||
return (FirstEntry == ListHead) ? NULL : FirstEntry;
|
return (FirstEntry == ListHead) ? NULL : FirstEntry;
|
||||||
|
@ -148,11 +142,11 @@ ExInterlockedInsertTailList(
|
||||||
IN OUT PLIST_ENTRY ListEntry,
|
IN OUT PLIST_ENTRY ListEntry,
|
||||||
IN OUT PKSPIN_LOCK Lock)
|
IN OUT PKSPIN_LOCK Lock)
|
||||||
{
|
{
|
||||||
ULONG_PTR LockHandle;
|
BOOLEAN Enable;
|
||||||
PLIST_ENTRY LastEntry;
|
PLIST_ENTRY LastEntry;
|
||||||
|
|
||||||
/* Disable interrupts and acquire the spinlock */
|
/* Disable interrupts and acquire the spinlock */
|
||||||
LockHandle = _ExiDisableInteruptsAndAcquireSpinlock(Lock);
|
Enable = _ExiDisableInteruptsAndAcquireSpinlock(Lock);
|
||||||
|
|
||||||
/* Save the last entry */
|
/* Save the last entry */
|
||||||
LastEntry = ListHead->Blink;
|
LastEntry = ListHead->Blink;
|
||||||
|
@ -161,7 +155,7 @@ ExInterlockedInsertTailList(
|
||||||
InsertTailList(ListHead, ListEntry);
|
InsertTailList(ListHead, ListEntry);
|
||||||
|
|
||||||
/* Release the spinlock and restore interrupts */
|
/* Release the spinlock and restore interrupts */
|
||||||
_ExiReleaseSpinLockAndRestoreInterupts(Lock, LockHandle);
|
_ExiReleaseSpinLockAndRestoreInterupts(Lock, Enable);
|
||||||
|
|
||||||
/* Return the old last entry or NULL for empty list */
|
/* Return the old last entry or NULL for empty list */
|
||||||
return (LastEntry == ListHead) ? NULL : LastEntry;
|
return (LastEntry == ListHead) ? NULL : LastEntry;
|
||||||
|
@ -173,11 +167,11 @@ ExInterlockedRemoveHeadList(
|
||||||
IN OUT PLIST_ENTRY ListHead,
|
IN OUT PLIST_ENTRY ListHead,
|
||||||
IN OUT PKSPIN_LOCK Lock)
|
IN OUT PKSPIN_LOCK Lock)
|
||||||
{
|
{
|
||||||
ULONG_PTR LockHandle;
|
BOOLEAN Enable;
|
||||||
PLIST_ENTRY ListEntry;
|
PLIST_ENTRY ListEntry;
|
||||||
|
|
||||||
/* Disable interrupts and acquire the spinlock */
|
/* Disable interrupts and acquire the spinlock */
|
||||||
LockHandle = _ExiDisableInteruptsAndAcquireSpinlock(Lock);
|
Enable = _ExiDisableInteruptsAndAcquireSpinlock(Lock);
|
||||||
|
|
||||||
/* Check if the list is empty */
|
/* Check if the list is empty */
|
||||||
if (IsListEmpty(ListHead))
|
if (IsListEmpty(ListHead))
|
||||||
|
@ -192,7 +186,7 @@ ExInterlockedRemoveHeadList(
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Release the spinlock and restore interrupts */
|
/* Release the spinlock and restore interrupts */
|
||||||
_ExiReleaseSpinLockAndRestoreInterupts(Lock, LockHandle);
|
_ExiReleaseSpinLockAndRestoreInterupts(Lock, Enable);
|
||||||
|
|
||||||
/* Return the entry */
|
/* Return the entry */
|
||||||
return ListEntry;
|
return ListEntry;
|
||||||
|
@ -204,17 +198,17 @@ ExInterlockedPopEntryList(
|
||||||
IN OUT PSINGLE_LIST_ENTRY ListHead,
|
IN OUT PSINGLE_LIST_ENTRY ListHead,
|
||||||
IN OUT PKSPIN_LOCK Lock)
|
IN OUT PKSPIN_LOCK Lock)
|
||||||
{
|
{
|
||||||
ULONG_PTR LockHandle;
|
BOOLEAN Enable;
|
||||||
PSINGLE_LIST_ENTRY ListEntry;
|
PSINGLE_LIST_ENTRY ListEntry;
|
||||||
|
|
||||||
/* Disable interrupts and acquire the spinlock */
|
/* Disable interrupts and acquire the spinlock */
|
||||||
LockHandle = _ExiDisableInteruptsAndAcquireSpinlock(Lock);
|
Enable = _ExiDisableInteruptsAndAcquireSpinlock(Lock);
|
||||||
|
|
||||||
/* Pop the first entry from the list */
|
/* Pop the first entry from the list */
|
||||||
ListEntry = PopEntryList(ListHead);
|
ListEntry = PopEntryList(ListHead);
|
||||||
|
|
||||||
/* Release the spinlock and restore interrupts */
|
/* Release the spinlock and restore interrupts */
|
||||||
_ExiReleaseSpinLockAndRestoreInterupts(Lock, LockHandle);
|
_ExiReleaseSpinLockAndRestoreInterupts(Lock, Enable);
|
||||||
|
|
||||||
/* Return the entry */
|
/* Return the entry */
|
||||||
return ListEntry;
|
return ListEntry;
|
||||||
|
@ -227,11 +221,11 @@ ExInterlockedPushEntryList(
|
||||||
IN OUT PSINGLE_LIST_ENTRY ListEntry,
|
IN OUT PSINGLE_LIST_ENTRY ListEntry,
|
||||||
IN OUT PKSPIN_LOCK Lock)
|
IN OUT PKSPIN_LOCK Lock)
|
||||||
{
|
{
|
||||||
ULONG_PTR LockHandle;
|
BOOLEAN Enable;
|
||||||
PSINGLE_LIST_ENTRY OldListEntry;
|
PSINGLE_LIST_ENTRY OldListEntry;
|
||||||
|
|
||||||
/* Disable interrupts and acquire the spinlock */
|
/* Disable interrupts and acquire the spinlock */
|
||||||
LockHandle = _ExiDisableInteruptsAndAcquireSpinlock(Lock);
|
Enable = _ExiDisableInteruptsAndAcquireSpinlock(Lock);
|
||||||
|
|
||||||
/* Save the old top entry */
|
/* Save the old top entry */
|
||||||
OldListEntry = ListHead->Next;
|
OldListEntry = ListHead->Next;
|
||||||
|
@ -240,7 +234,7 @@ ExInterlockedPushEntryList(
|
||||||
PushEntryList(ListHead, ListEntry);
|
PushEntryList(ListHead, ListEntry);
|
||||||
|
|
||||||
/* Release the spinlock and restore interrupts */
|
/* Release the spinlock and restore interrupts */
|
||||||
_ExiReleaseSpinLockAndRestoreInterupts(Lock, LockHandle);
|
_ExiReleaseSpinLockAndRestoreInterupts(Lock, Enable);
|
||||||
|
|
||||||
/* Return the entry */
|
/* Return the entry */
|
||||||
return OldListEntry;
|
return OldListEntry;
|
||||||
|
@ -293,11 +287,11 @@ ExfInterlockedAddUlong(
|
||||||
IN ULONG Increment,
|
IN ULONG Increment,
|
||||||
IN OUT PKSPIN_LOCK Lock)
|
IN OUT PKSPIN_LOCK Lock)
|
||||||
{
|
{
|
||||||
ULONG_PTR LockHandle;
|
BOOLEAN Enable;
|
||||||
ULONG OldValue;
|
ULONG OldValue;
|
||||||
|
|
||||||
/* Disable interrupts and acquire the spinlock */
|
/* Disable interrupts and acquire the spinlock */
|
||||||
LockHandle = _ExiDisableInteruptsAndAcquireSpinlock(Lock);
|
Enable = _ExiDisableInteruptsAndAcquireSpinlock(Lock);
|
||||||
|
|
||||||
/* Save the old value */
|
/* Save the old value */
|
||||||
OldValue = *Addend;
|
OldValue = *Addend;
|
||||||
|
@ -306,7 +300,7 @@ ExfInterlockedAddUlong(
|
||||||
*Addend += Increment;
|
*Addend += Increment;
|
||||||
|
|
||||||
/* Release the spinlock and restore interrupts */
|
/* Release the spinlock and restore interrupts */
|
||||||
_ExiReleaseSpinLockAndRestoreInterupts(Lock, LockHandle);
|
_ExiReleaseSpinLockAndRestoreInterupts(Lock, Enable);
|
||||||
|
|
||||||
/* Return the old value */
|
/* Return the old value */
|
||||||
return OldValue;
|
return OldValue;
|
||||||
|
@ -319,11 +313,11 @@ ExfInterlockedInsertHeadList(
|
||||||
IN PLIST_ENTRY ListEntry,
|
IN PLIST_ENTRY ListEntry,
|
||||||
IN OUT PKSPIN_LOCK Lock)
|
IN OUT PKSPIN_LOCK Lock)
|
||||||
{
|
{
|
||||||
ULONG_PTR LockHandle;
|
BOOLEAN Enable;
|
||||||
PLIST_ENTRY FirstEntry;
|
PLIST_ENTRY FirstEntry;
|
||||||
|
|
||||||
/* Disable interrupts and acquire the spinlock */
|
/* Disable interrupts and acquire the spinlock */
|
||||||
LockHandle = _ExiDisableInteruptsAndAcquireSpinlock(Lock);
|
Enable = _ExiDisableInteruptsAndAcquireSpinlock(Lock);
|
||||||
|
|
||||||
/* Save the first entry */
|
/* Save the first entry */
|
||||||
FirstEntry = ListHead->Flink;
|
FirstEntry = ListHead->Flink;
|
||||||
|
@ -332,7 +326,7 @@ ExfInterlockedInsertHeadList(
|
||||||
InsertHeadList(ListHead, ListEntry);
|
InsertHeadList(ListHead, ListEntry);
|
||||||
|
|
||||||
/* Release the spinlock and restore interrupts */
|
/* Release the spinlock and restore interrupts */
|
||||||
_ExiReleaseSpinLockAndRestoreInterupts(Lock, LockHandle);
|
_ExiReleaseSpinLockAndRestoreInterupts(Lock, Enable);
|
||||||
|
|
||||||
/* Return the old first entry or NULL for empty list */
|
/* Return the old first entry or NULL for empty list */
|
||||||
return (FirstEntry == ListHead) ? NULL : FirstEntry;
|
return (FirstEntry == ListHead) ? NULL : FirstEntry;
|
||||||
|
@ -345,11 +339,11 @@ ExfInterlockedInsertTailList(
|
||||||
IN PLIST_ENTRY ListEntry,
|
IN PLIST_ENTRY ListEntry,
|
||||||
IN OUT PKSPIN_LOCK Lock)
|
IN OUT PKSPIN_LOCK Lock)
|
||||||
{
|
{
|
||||||
ULONG_PTR LockHandle;
|
BOOLEAN Enable;
|
||||||
PLIST_ENTRY LastEntry;
|
PLIST_ENTRY LastEntry;
|
||||||
|
|
||||||
/* Disable interrupts and acquire the spinlock */
|
/* Disable interrupts and acquire the spinlock */
|
||||||
LockHandle = _ExiDisableInteruptsAndAcquireSpinlock(Lock);
|
Enable = _ExiDisableInteruptsAndAcquireSpinlock(Lock);
|
||||||
|
|
||||||
/* Save the last entry */
|
/* Save the last entry */
|
||||||
LastEntry = ListHead->Blink;
|
LastEntry = ListHead->Blink;
|
||||||
|
@ -358,7 +352,7 @@ ExfInterlockedInsertTailList(
|
||||||
InsertTailList(ListHead, ListEntry);
|
InsertTailList(ListHead, ListEntry);
|
||||||
|
|
||||||
/* Release the spinlock and restore interrupts */
|
/* Release the spinlock and restore interrupts */
|
||||||
_ExiReleaseSpinLockAndRestoreInterupts(Lock, LockHandle);
|
_ExiReleaseSpinLockAndRestoreInterupts(Lock, Enable);
|
||||||
|
|
||||||
/* Return the old last entry or NULL for empty list */
|
/* Return the old last entry or NULL for empty list */
|
||||||
return (LastEntry == ListHead) ? NULL : LastEntry;
|
return (LastEntry == ListHead) ? NULL : LastEntry;
|
||||||
|
@ -371,11 +365,11 @@ ExfInterlockedRemoveHeadList(
|
||||||
IN OUT PLIST_ENTRY ListHead,
|
IN OUT PLIST_ENTRY ListHead,
|
||||||
IN OUT PKSPIN_LOCK Lock)
|
IN OUT PKSPIN_LOCK Lock)
|
||||||
{
|
{
|
||||||
ULONG_PTR LockHandle;
|
BOOLEAN Enable;
|
||||||
PLIST_ENTRY ListEntry;
|
PLIST_ENTRY ListEntry;
|
||||||
|
|
||||||
/* Disable interrupts and acquire the spinlock */
|
/* Disable interrupts and acquire the spinlock */
|
||||||
LockHandle = _ExiDisableInteruptsAndAcquireSpinlock(Lock);
|
Enable = _ExiDisableInteruptsAndAcquireSpinlock(Lock);
|
||||||
|
|
||||||
/* Check if the list is empty */
|
/* Check if the list is empty */
|
||||||
if (IsListEmpty(ListHead))
|
if (IsListEmpty(ListHead))
|
||||||
|
@ -390,7 +384,7 @@ ExfInterlockedRemoveHeadList(
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Release the spinlock and restore interrupts */
|
/* Release the spinlock and restore interrupts */
|
||||||
_ExiReleaseSpinLockAndRestoreInterupts(Lock, LockHandle);
|
_ExiReleaseSpinLockAndRestoreInterupts(Lock, Enable);
|
||||||
|
|
||||||
/* return the entry */
|
/* return the entry */
|
||||||
return ListEntry;
|
return ListEntry;
|
||||||
|
@ -402,17 +396,17 @@ ExfInterlockedPopEntryList(
|
||||||
IN OUT PSINGLE_LIST_ENTRY ListHead,
|
IN OUT PSINGLE_LIST_ENTRY ListHead,
|
||||||
IN OUT PKSPIN_LOCK Lock)
|
IN OUT PKSPIN_LOCK Lock)
|
||||||
{
|
{
|
||||||
ULONG_PTR LockHandle;
|
BOOLEAN Enable;
|
||||||
PSINGLE_LIST_ENTRY ListEntry;
|
PSINGLE_LIST_ENTRY ListEntry;
|
||||||
|
|
||||||
/* Disable interrupts and acquire the spinlock */
|
/* Disable interrupts and acquire the spinlock */
|
||||||
LockHandle = _ExiDisableInteruptsAndAcquireSpinlock(Lock);
|
Enable = _ExiDisableInteruptsAndAcquireSpinlock(Lock);
|
||||||
|
|
||||||
/* Pop the first entry from the list */
|
/* Pop the first entry from the list */
|
||||||
ListEntry = PopEntryList(ListHead);
|
ListEntry = PopEntryList(ListHead);
|
||||||
|
|
||||||
/* Release the spinlock and restore interrupts */
|
/* Release the spinlock and restore interrupts */
|
||||||
_ExiReleaseSpinLockAndRestoreInterupts(Lock, LockHandle);
|
_ExiReleaseSpinLockAndRestoreInterupts(Lock, Enable);
|
||||||
|
|
||||||
/* return the entry */
|
/* return the entry */
|
||||||
return ListEntry;
|
return ListEntry;
|
||||||
|
@ -425,11 +419,11 @@ ExfInterlockedPushEntryList(
|
||||||
IN PSINGLE_LIST_ENTRY ListEntry,
|
IN PSINGLE_LIST_ENTRY ListEntry,
|
||||||
IN OUT PKSPIN_LOCK Lock)
|
IN OUT PKSPIN_LOCK Lock)
|
||||||
{
|
{
|
||||||
ULONG_PTR LockHandle;
|
BOOLEAN Enable;
|
||||||
PSINGLE_LIST_ENTRY OldListEntry;
|
PSINGLE_LIST_ENTRY OldListEntry;
|
||||||
|
|
||||||
/* Disable interrupts and acquire the spinlock */
|
/* Disable interrupts and acquire the spinlock */
|
||||||
LockHandle = _ExiDisableInteruptsAndAcquireSpinlock(Lock);
|
Enable = _ExiDisableInteruptsAndAcquireSpinlock(Lock);
|
||||||
|
|
||||||
/* Save the old top entry */
|
/* Save the old top entry */
|
||||||
OldListEntry = ListHead->Next;
|
OldListEntry = ListHead->Next;
|
||||||
|
@ -438,7 +432,7 @@ ExfInterlockedPushEntryList(
|
||||||
PushEntryList(ListHead, ListEntry);
|
PushEntryList(ListHead, ListEntry);
|
||||||
|
|
||||||
/* Release the spinlock and restore interrupts */
|
/* Release the spinlock and restore interrupts */
|
||||||
_ExiReleaseSpinLockAndRestoreInterupts(Lock, LockHandle);
|
_ExiReleaseSpinLockAndRestoreInterupts(Lock, Enable);
|
||||||
|
|
||||||
/* return the entry */
|
/* return the entry */
|
||||||
return OldListEntry;
|
return OldListEntry;
|
|
@ -134,6 +134,31 @@ extern ULONG KeI386CpuStep;
|
||||||
#define KeGetTrapFrameInterruptState(TrapFrame) \
|
#define KeGetTrapFrameInterruptState(TrapFrame) \
|
||||||
BooleanFlagOn((TrapFrame)->EFlags, EFLAGS_INTERRUPT_MASK)
|
BooleanFlagOn((TrapFrame)->EFlags, EFLAGS_INTERRUPT_MASK)
|
||||||
|
|
||||||
|
/* Diable interrupts and return whether they were enabled before */
|
||||||
|
BOOLEAN
|
||||||
|
NTAPI
|
||||||
|
KeDisableInterrupts(VOID)
|
||||||
|
{
|
||||||
|
ULONG Flags;
|
||||||
|
BOOLEAN Return;
|
||||||
|
|
||||||
|
/* Get EFLAGS and check if the interrupt bit is set */
|
||||||
|
Flags = __readeflags();
|
||||||
|
Return = (Flags & EFLAGS_INTERRUPT_MASK) ? TRUE: FALSE;
|
||||||
|
|
||||||
|
/* Disable interrupts */
|
||||||
|
_disable();
|
||||||
|
return Return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Restore previous interrupt state */
|
||||||
|
FORCEINLINE
|
||||||
|
VOID
|
||||||
|
KeRestoreInterrupts(BOOLEAN WereEnabled)
|
||||||
|
{
|
||||||
|
if (WereEnabled) _enable();
|
||||||
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// Invalidates the TLB entry for a specified address
|
// Invalidates the TLB entry for a specified address
|
||||||
//
|
//
|
||||||
|
|
|
@ -65,6 +65,31 @@
|
||||||
//
|
//
|
||||||
//#define KeGetTrapFrameInterruptState(TrapFrame)
|
//#define KeGetTrapFrameInterruptState(TrapFrame)
|
||||||
|
|
||||||
|
FORCEINLINE
|
||||||
|
BOOLEAN
|
||||||
|
KeDisableInterrupts(VOID)
|
||||||
|
{
|
||||||
|
ARM_STATUS_REGISTER Flags;
|
||||||
|
|
||||||
|
//
|
||||||
|
// Get current interrupt state and disable interrupts
|
||||||
|
//
|
||||||
|
Flags = KeArmStatusRegisterGet();
|
||||||
|
_disable();
|
||||||
|
|
||||||
|
//
|
||||||
|
// Return previous interrupt state
|
||||||
|
//
|
||||||
|
return Flags.IrqDisable;
|
||||||
|
}
|
||||||
|
|
||||||
|
FORCEINLINE
|
||||||
|
VOID
|
||||||
|
KeRestoreInterrupts(BOOLEAN WereEnabled)
|
||||||
|
{
|
||||||
|
if (WereEnabled) _enable();
|
||||||
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// Invalidates the TLB entry for a specified address
|
// Invalidates the TLB entry for a specified address
|
||||||
//
|
//
|
||||||
|
|
|
@ -164,6 +164,31 @@ typedef struct _KV8086_STACK_FRAME
|
||||||
KV86_FRAME V86Frame;
|
KV86_FRAME V86Frame;
|
||||||
} KV8086_STACK_FRAME, *PKV8086_STACK_FRAME;
|
} KV8086_STACK_FRAME, *PKV8086_STACK_FRAME;
|
||||||
|
|
||||||
|
/* Diable interrupts and return whether they were enabled before */
|
||||||
|
FORCEINLINE
|
||||||
|
BOOLEAN
|
||||||
|
KeDisableInterrupts(VOID)
|
||||||
|
{
|
||||||
|
ULONG Flags;
|
||||||
|
BOOLEAN Return;
|
||||||
|
|
||||||
|
/* Get EFLAGS and check if the interrupt bit is set */
|
||||||
|
Flags = __readeflags();
|
||||||
|
Return = (Flags & EFLAGS_INTERRUPT_MASK) ? TRUE: FALSE;
|
||||||
|
|
||||||
|
/* Disable interrupts */
|
||||||
|
_disable();
|
||||||
|
return Return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Restore previous interrupt state */
|
||||||
|
FORCEINLINE
|
||||||
|
VOID
|
||||||
|
KeRestoreInterrupts(BOOLEAN WereEnabled)
|
||||||
|
{
|
||||||
|
if (WereEnabled) _enable();
|
||||||
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// Registers an interrupt handler with an IDT vector
|
// Registers an interrupt handler with an IDT vector
|
||||||
//
|
//
|
||||||
|
|
|
@ -1033,12 +1033,6 @@ VOID
|
||||||
NTAPI
|
NTAPI
|
||||||
KeThawExecution(IN BOOLEAN Enable);
|
KeThawExecution(IN BOOLEAN Enable);
|
||||||
|
|
||||||
BOOLEAN
|
|
||||||
NTAPI
|
|
||||||
KeDisableInterrupts(
|
|
||||||
VOID
|
|
||||||
);
|
|
||||||
|
|
||||||
VOID
|
VOID
|
||||||
FASTCALL
|
FASTCALL
|
||||||
KeAcquireQueuedSpinLockAtDpcLevel(
|
KeAcquireQueuedSpinLockAtDpcLevel(
|
||||||
|
|
|
@ -90,23 +90,6 @@ KeInvalidateAllCaches(VOID)
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
BOOLEAN
|
|
||||||
NTAPI
|
|
||||||
KeDisableInterrupts(VOID)
|
|
||||||
{
|
|
||||||
ARM_STATUS_REGISTER Flags;
|
|
||||||
|
|
||||||
//
|
|
||||||
// Get current interrupt state and disable interrupts
|
|
||||||
//
|
|
||||||
Flags = KeArmStatusRegisterGet();
|
|
||||||
_disable();
|
|
||||||
|
|
||||||
//
|
|
||||||
// Return previous interrupt state
|
|
||||||
//
|
|
||||||
return Flags.IrqDisable;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* PUBLIC FUNCTIONS ***********************************************************/
|
/* PUBLIC FUNCTIONS ***********************************************************/
|
||||||
|
|
||||||
|
@ -130,17 +113,17 @@ KeFlushEntireTb(IN BOOLEAN Invalid,
|
||||||
IN BOOLEAN AllProcessors)
|
IN BOOLEAN AllProcessors)
|
||||||
{
|
{
|
||||||
KIRQL OldIrql;
|
KIRQL OldIrql;
|
||||||
|
|
||||||
//
|
//
|
||||||
// Raise the IRQL for the TB Flush
|
// Raise the IRQL for the TB Flush
|
||||||
//
|
//
|
||||||
OldIrql = KeRaiseIrqlToSynchLevel();
|
OldIrql = KeRaiseIrqlToSynchLevel();
|
||||||
|
|
||||||
//
|
//
|
||||||
// Flush the TB for the Current CPU
|
// Flush the TB for the Current CPU
|
||||||
//
|
//
|
||||||
KeFlushCurrentTb();
|
KeFlushCurrentTb();
|
||||||
|
|
||||||
//
|
//
|
||||||
// Return to Original IRQL
|
// Return to Original IRQL
|
||||||
//
|
//
|
||||||
|
@ -168,7 +151,7 @@ NTAPI
|
||||||
KeQueryActiveProcessors(VOID)
|
KeQueryActiveProcessors(VOID)
|
||||||
{
|
{
|
||||||
PAGED_CODE();
|
PAGED_CODE();
|
||||||
|
|
||||||
//
|
//
|
||||||
// Simply return the number of active processors
|
// Simply return the number of active processors
|
||||||
//
|
//
|
||||||
|
@ -186,7 +169,7 @@ KeSaveStateForHibernate(IN PKPROCESSOR_STATE State)
|
||||||
// Capture the context
|
// Capture the context
|
||||||
//
|
//
|
||||||
RtlCaptureContext(&State->ContextFrame);
|
RtlCaptureContext(&State->ContextFrame);
|
||||||
|
|
||||||
//
|
//
|
||||||
// Capture the control state
|
// Capture the control state
|
||||||
//
|
//
|
||||||
|
|
|
@ -1173,22 +1173,6 @@ KiI386PentiumLockErrataFixup(VOID)
|
||||||
MmSetPageProtect(NULL, NewIdt, PAGE_READONLY);
|
MmSetPageProtect(NULL, NewIdt, PAGE_READONLY);
|
||||||
}
|
}
|
||||||
|
|
||||||
BOOLEAN
|
|
||||||
NTAPI
|
|
||||||
KeDisableInterrupts(VOID)
|
|
||||||
{
|
|
||||||
ULONG Flags;
|
|
||||||
BOOLEAN Return;
|
|
||||||
|
|
||||||
/* Get EFLAGS and check if the interrupt bit is set */
|
|
||||||
Flags = __readeflags();
|
|
||||||
Return = (Flags & EFLAGS_INTERRUPT_MASK) ? TRUE: FALSE;
|
|
||||||
|
|
||||||
/* Disable interrupts */
|
|
||||||
_disable();
|
|
||||||
return Return;
|
|
||||||
}
|
|
||||||
|
|
||||||
BOOLEAN
|
BOOLEAN
|
||||||
NTAPI
|
NTAPI
|
||||||
KeInvalidateAllCaches(VOID)
|
KeInvalidateAllCaches(VOID)
|
||||||
|
|
|
@ -218,16 +218,10 @@
|
||||||
<directory name="ex">
|
<directory name="ex">
|
||||||
<if property="ARCH" value="i386">
|
<if property="ARCH" value="i386">
|
||||||
<directory name="i386">
|
<directory name="i386">
|
||||||
<file>interlocked.c</file>
|
|
||||||
<file>fastinterlck_asm.S</file>
|
<file>fastinterlck_asm.S</file>
|
||||||
<file>ioport.S</file>
|
<file>ioport.S</file>
|
||||||
</directory>
|
</directory>
|
||||||
</if>
|
</if>
|
||||||
<if property="ARCH" value="amd64">
|
|
||||||
<directory name="amd64">
|
|
||||||
<file>fastinterlck.c</file>
|
|
||||||
</directory>
|
|
||||||
</if>
|
|
||||||
<file>atom.c</file>
|
<file>atom.c</file>
|
||||||
<file>callback.c</file>
|
<file>callback.c</file>
|
||||||
<file>dbgctrl.c</file>
|
<file>dbgctrl.c</file>
|
||||||
|
@ -235,12 +229,12 @@
|
||||||
<file>event.c</file>
|
<file>event.c</file>
|
||||||
<file>evtpair.c</file>
|
<file>evtpair.c</file>
|
||||||
<file>exintrin.c</file>
|
<file>exintrin.c</file>
|
||||||
<file>fastinterlck.c</file>
|
|
||||||
<file>fmutex.c</file>
|
<file>fmutex.c</file>
|
||||||
<file>handle.c</file>
|
<file>handle.c</file>
|
||||||
<file>harderr.c</file>
|
<file>harderr.c</file>
|
||||||
<file>hdlsterm.c</file>
|
<file>hdlsterm.c</file>
|
||||||
<file>init.c</file>
|
<file>init.c</file>
|
||||||
|
<file>interlocked.c</file>
|
||||||
<file>keyedevt.c</file>
|
<file>keyedevt.c</file>
|
||||||
<file>locale.c</file>
|
<file>locale.c</file>
|
||||||
<file>lookas.c</file>
|
<file>lookas.c</file>
|
||||||
|
|
Loading…
Reference in a new issue