/*++

Copyright (c) 1994  Microsoft Corporation

Module Name:

    lockcode.c

Abstract:

Author:

    Chuck Lenzmeier (chuckl) 30-Jan-1994

Revision History:

--*/

#include "precomp.h"
#pragma hdrstop

#define BugCheckFileId SRV_FILE_LOCKCODE

#ifdef ALLOC_PRAGMA
#pragma alloc_text( PAGE, SrvReferenceUnlockableCodeSection )
#pragma alloc_text( PAGE, SrvDereferenceUnlockableCodeSection )
#endif


VOID
SrvReferenceUnlockableCodeSection (
    IN ULONG CodeSection
    )
{
    PSECTION_DESCRIPTOR section = &SrvSectionInfo[CodeSection];
    ULONG oldCount;

    //
    // Lock the lockable code database.
    //

    ACQUIRE_LOCK( &SrvUnlockableCodeLock );

    //
    // Increment the reference count for the section.
    //

    oldCount = section->ReferenceCount++;

    if ( oldCount == 0 ) {

        //
        // This is the first reference to the section.  Lock it.
        //

        ASSERT( section->Handle == NULL );
        section->Handle = MmLockPagableCodeSection( section->Base );

    } else {

        //
        // This is not the first reference to the section.  The section
        // had better be locked!
        //

        ASSERT( section->Handle != NULL );

    }

    RELEASE_LOCK( &SrvUnlockableCodeLock );

    return;

} // SrvReferenceUnlockableCodeSection


VOID
SrvDereferenceUnlockableCodeSection (
    IN ULONG CodeSection
    )
{
    PSECTION_DESCRIPTOR section = &SrvSectionInfo[CodeSection];
    ULONG newCount;

    //
    // Lock the lockable code database.
    //

    ACQUIRE_LOCK( &SrvUnlockableCodeLock );

    ASSERT( section->Handle != NULL );

    //
    // Decrement the reference count for the section.
    //

    newCount = --section->ReferenceCount;

    if ( newCount == 0 ) {

        //
        // This is the last reference to the section.  Unlock it.
        //

        MmUnlockPagableImageSection( section->Handle );
        section->Handle = NULL;

    }

    RELEASE_LOCK( &SrvUnlockableCodeLock );

    return;

} // SrvDereferenceUnlockableCodeSection