ntoskrnl.exe: Implement KeAcquireSpinLockAtDpcLevel().

Signed-off-by: Zebediah Figura <z.figura12@gmail.com>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
stable
Zebediah Figura 2019-01-27 20:45:32 -06:00 committed by Alexandre Julliard
parent a1dfdfaf22
commit da4291dfc5
3 changed files with 12 additions and 1 deletions

View File

@ -510,7 +510,7 @@
@ stub Ke386QueryIoAccessMap @ stub Ke386QueryIoAccessMap
@ stdcall Ke386SetIoAccessMap(long ptr) @ stdcall Ke386SetIoAccessMap(long ptr)
@ stub KeAcquireInterruptSpinLock @ stub KeAcquireInterruptSpinLock
@ stub KeAcquireSpinLockAtDpcLevel @ stdcall KeAcquireSpinLockAtDpcLevel(ptr)
@ stdcall -arch=arm,arm64,x86_64 KeAcquireSpinLockRaiseToDpc(ptr) @ stdcall -arch=arm,arm64,x86_64 KeAcquireSpinLockRaiseToDpc(ptr)
@ stub KeAddSystemServiceTable @ stub KeAddSystemServiceTable
@ stub KeAreApcsDisabled @ stub KeAreApcsDisabled

View File

@ -395,6 +395,16 @@ static inline void small_pause(void)
#endif #endif
} }
/***********************************************************************
* KeAcquireSpinLockAtDpcLevel (NTOSKRNL.EXE.@)
*/
void WINAPI KeAcquireSpinLockAtDpcLevel( KSPIN_LOCK *lock )
{
TRACE("lock %p.\n", lock);
while (!InterlockedCompareExchangePointer( (void **)lock, (void *)1, (void *)0 ))
small_pause();
}
/*********************************************************************** /***********************************************************************
* KeReleaseSpinLockFromDpcLevel (NTOSKRNL.EXE.@) * KeReleaseSpinLockFromDpcLevel (NTOSKRNL.EXE.@)
*/ */

View File

@ -1427,6 +1427,7 @@ void WINAPI KeAcquireSpinLock(KSPIN_LOCK*,KIRQL*);
#define KeAcquireSpinLock( lock, irql ) *(irql) = KeAcquireSpinLockRaiseToDpc( lock ) #define KeAcquireSpinLock( lock, irql ) *(irql) = KeAcquireSpinLockRaiseToDpc( lock )
KIRQL WINAPI KeAcquireSpinLockRaiseToDpc(KSPIN_LOCK*); KIRQL WINAPI KeAcquireSpinLockRaiseToDpc(KSPIN_LOCK*);
#endif #endif
void WINAPI KeAcquireSpinLockAtDpcLevel(KSPIN_LOCK*);
BOOLEAN WINAPI KeCancelTimer(KTIMER*); BOOLEAN WINAPI KeCancelTimer(KTIMER*);
void WINAPI KeClearEvent(PRKEVENT); void WINAPI KeClearEvent(PRKEVENT);
NTSTATUS WINAPI KeDelayExecutionThread(KPROCESSOR_MODE,BOOLEAN,LARGE_INTEGER*); NTSTATUS WINAPI KeDelayExecutionThread(KPROCESSOR_MODE,BOOLEAN,LARGE_INTEGER*);