80 lines
1.7 KiB
C
80 lines
1.7 KiB
C
|
/*++
|
||
|
|
||
|
Copyright (c) 1990 Microsoft Corporation
|
||
|
|
||
|
Module Name:
|
||
|
|
||
|
eballoc.c
|
||
|
|
||
|
Abstract:
|
||
|
|
||
|
Process/Thread Environment Block allocation functions
|
||
|
|
||
|
Author:
|
||
|
|
||
|
Steve Wood (stevewo) 10-May-1990
|
||
|
|
||
|
Revision History:
|
||
|
|
||
|
--*/
|
||
|
|
||
|
#include "ntrtlp.h"
|
||
|
#include <nturtl.h>
|
||
|
|
||
|
#if defined(ALLOC_PRAGMA) && defined(NTOS_KERNEL_RUNTIME)
|
||
|
#pragma alloc_text(PAGE,RtlAcquirePebLock)
|
||
|
#pragma alloc_text(PAGE,RtlReleasePebLock)
|
||
|
#endif
|
||
|
|
||
|
typedef VOID (*PEB_LOCK_ROUTINE)(PVOID FastLock);
|
||
|
|
||
|
VOID
|
||
|
RtlAcquirePebLock( VOID )
|
||
|
{
|
||
|
PEB_LOCK_ROUTINE LockRoutine;
|
||
|
PPEB Peb;
|
||
|
LARGE_INTEGER Timeout;
|
||
|
|
||
|
RTL_PAGED_CODE();
|
||
|
|
||
|
Peb = NtCurrentPeb();
|
||
|
|
||
|
LockRoutine = (PEB_LOCK_ROUTINE)Peb->FastPebLockRoutine;
|
||
|
ASSERT(LockRoutine);
|
||
|
|
||
|
for (;;) {
|
||
|
try {
|
||
|
(LockRoutine)(Peb->FastPebLock);
|
||
|
break;
|
||
|
} except ( GetExceptionCode() == STATUS_INSUFFICIENT_RESOURCES
|
||
|
? EXCEPTION_EXECUTE_HANDLER
|
||
|
: EXCEPTION_CONTINUE_SEARCH ) {
|
||
|
//
|
||
|
// Unfortunately, a number of things assume that
|
||
|
// RtlAcquirePebLock can't fail. So we need to loop and
|
||
|
// try again.
|
||
|
//
|
||
|
Timeout.QuadPart = UInt32x32To64( 10 /* Milliseconds to sleep */,
|
||
|
10000 /* Milliseconds to 100 Nanoseconds) */);
|
||
|
Timeout.QuadPart *= -1; /* Make it a relative time */
|
||
|
NtDelayExecution(FALSE, &Timeout);
|
||
|
continue;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
VOID
|
||
|
RtlReleasePebLock( VOID )
|
||
|
{
|
||
|
PEB_LOCK_ROUTINE LockRoutine;
|
||
|
PPEB Peb;
|
||
|
|
||
|
RTL_PAGED_CODE();
|
||
|
|
||
|
Peb = NtCurrentPeb();
|
||
|
|
||
|
LockRoutine = (PEB_LOCK_ROUTINE)Peb->FastPebUnlockRoutine;
|
||
|
ASSERT(LockRoutine);
|
||
|
(LockRoutine)(Peb->FastPebLock);
|
||
|
}
|