diff options
author | Adam <you@example.com> | 2020-05-17 05:51:50 +0200 |
---|---|---|
committer | Adam <you@example.com> | 2020-05-17 05:51:50 +0200 |
commit | e611b132f9b8abe35b362e5870b74bce94a1e58e (patch) | |
tree | a5781d2ec0e085eeca33cf350cf878f2efea6fe5 /private/nw/rdr/lockcode.c | |
download | NT4.0-e611b132f9b8abe35b362e5870b74bce94a1e58e.tar NT4.0-e611b132f9b8abe35b362e5870b74bce94a1e58e.tar.gz NT4.0-e611b132f9b8abe35b362e5870b74bce94a1e58e.tar.bz2 NT4.0-e611b132f9b8abe35b362e5870b74bce94a1e58e.tar.lz NT4.0-e611b132f9b8abe35b362e5870b74bce94a1e58e.tar.xz NT4.0-e611b132f9b8abe35b362e5870b74bce94a1e58e.tar.zst NT4.0-e611b132f9b8abe35b362e5870b74bce94a1e58e.zip |
Diffstat (limited to 'private/nw/rdr/lockcode.c')
-rw-r--r-- | private/nw/rdr/lockcode.c | 168 |
1 files changed, 168 insertions, 0 deletions
diff --git a/private/nw/rdr/lockcode.c b/private/nw/rdr/lockcode.c new file mode 100644 index 000000000..1a2941c2d --- /dev/null +++ b/private/nw/rdr/lockcode.c @@ -0,0 +1,168 @@ + +/*++ + +Copyright (c) 1994 Microsoft Corporation + +Module Name: + + lockcode.c + +Abstract: + +Author: + + Chuck Lenzmeier (chuckl) 30-Jan-1994 + Manny Weiser (mannyw) 17-May-1994 + +Revision History: + +--*/ + +#include "Procs.h" + + +#ifndef QFE_BUILD + +#ifdef ALLOC_PRAGMA +#pragma alloc_text( PAGE, NwReferenceUnlockableCodeSection ) +#pragma alloc_text( PAGE, NwDereferenceUnlockableCodeSection ) +#endif + +extern BOOLEAN TimerStop; // From Timer.c + +// +// The debug trace level +// + +#define Dbg (DEBUG_TRACE_CREATE) + + +VOID +NwReferenceUnlockableCodeSection ( + VOID + ) +{ + ULONG oldCount; + + // + // Lock the lockable code database. + // + + ExAcquireResourceExclusive( &NwUnlockableCodeResource, TRUE ); + + // + // Increment the reference count for the section. + // + + oldCount = NwSectionDescriptor.ReferenceCount++; + + if ( oldCount == 0 && NwSectionDescriptor.Handle == NULL ) { + + // + // This is the first reference to the section. Start the timer. + // Lock our code. + // + + NwSectionDescriptor.Handle = MmLockPagableCodeSection( NwSectionDescriptor.Base ); + StartTimer( ); + + } else { + + // + // This is not the first reference to the section. The section + // had better be locked! + // + + ASSERT( NwSectionDescriptor.Handle != NULL ); + + // + // Restart the timer if the rdr was stopped but didn't unload. + // + + if (TimerStop == TRUE) { + StartTimer(); + } + + } + + DebugTrace(+0, Dbg, "NwReferenceCodeSection %d\n", NwSectionDescriptor.ReferenceCount ); + + ExReleaseResource( &NwUnlockableCodeResource ); + + return; + +} // NwReferenceUnlockableCodeSection + + +VOID +NwDereferenceUnlockableCodeSection ( + VOID + ) +{ + ULONG newCount; + + // + // Lock the lockable code database. + // + + ExAcquireResourceExclusive( &NwUnlockableCodeResource, TRUE ); + + ASSERT( NwSectionDescriptor.Handle != NULL ); + ASSERT( NwSectionDescriptor.ReferenceCount > 0 && + NwSectionDescriptor.ReferenceCount < 0x7FFF ); + + // + // Decrement the reference count for the section. + // + + newCount = --NwSectionDescriptor.ReferenceCount; + + DebugTrace(+0, Dbg, "NwDereferenceCodeSection %d\n", NwSectionDescriptor.ReferenceCount ); + + ExReleaseResource( &NwUnlockableCodeResource ); + + return; + +} // NwDereferenceUnlockableCodeSection + +BOOLEAN +NwUnlockCodeSections( + IN BOOLEAN BlockIndefinitely + ) +{ + // + // Lock the lockable code database. + // + + if (!ExAcquireResourceExclusive( &NwUnlockableCodeResource, BlockIndefinitely )) { + return FALSE; // Avoid potential deadlock in timer.c + } + + DebugTrace(+0, Dbg, "NwUnlockCodeSections %d\n", NwSectionDescriptor.ReferenceCount ); + + if ( NwSectionDescriptor.ReferenceCount == 0 ) { + + if ( NwSectionDescriptor.Handle != NULL ) { + + // + // This is the last reference to the section. Stop the timer and + // unlock the code. + // + + StopTimer(); + + MmUnlockPagableImageSection( NwSectionDescriptor.Handle ); + NwSectionDescriptor.Handle = NULL; + + } + + ExReleaseResource( &NwUnlockableCodeResource ); + return TRUE; + } + + ExReleaseResource( &NwUnlockableCodeResource ); + return FALSE; + +} + +#endif |