/*++

Copyright (c) 1995-1997  Microsoft Corporation

Module Name:

    findmod.cxx

Abstract:

    Locates module in the debugee containing a specific address.

Author:

    Keith Moore (keithmo) 12-Nov-1997

Revision History:

--*/

#include "inetdbgp.h"

typedef struct _ENUM_CONTEXT {
    ULONG_PTR ModuleAddress;
    PMODULE_INFO ModuleInfo;
    BOOLEAN Successful;
} ENUM_CONTEXT, *PENUM_CONTEXT;


BOOLEAN
CALLBACK
FmpEnumProc(
    IN PVOID Param,
    IN PMODULE_INFO ModuleInfo
    )
{

    PENUM_CONTEXT context;

    context = (PENUM_CONTEXT)Param;

    if( context->ModuleAddress >= ModuleInfo->DllBase &&
        context->ModuleAddress < ( ModuleInfo->DllBase + ModuleInfo->SizeOfImage ) ) {

        CopyMemory(
            context->ModuleInfo,
            ModuleInfo,
            sizeof(*ModuleInfo)
            );

        context->Successful = TRUE;

    }

    return !context->Successful;

}   // FmpEnumProc


BOOLEAN
FindModuleByAddress(
    IN ULONG_PTR ModuleAddress,
    OUT PMODULE_INFO ModuleInfo
    )

/*++

Routine Description:

    Finds a module in the debugee that contains the specified address.

Arguments:

    ModuleAddress - The module address to search for.

    ModuleInfo - If successful, receives information describing the
        module found.

Return Value:

    BOOLEAN - TRUE if successful, FALSE otherwise.

--*/

{

    BOOLEAN result;
    ENUM_CONTEXT context;

    context.ModuleAddress = ModuleAddress;
    context.ModuleInfo = ModuleInfo;
    context.Successful = FALSE;

    result = EnumModules(
                 FmpEnumProc,
                 (PVOID)&context
                 );

    if( result )  {
        result = context.Successful;
    }

    return result;

}   // FindModuleByAddress
