/*
 *  segment.c - Segment functions of DBG DLL.
 *
 */
#include <precomp.h>
#pragma hdrstop

void
SegmentLoad(
    LPSTR   lpModuleName,
    LPSTR   lpPathName,
    WORD    Selector,
    WORD    Segment,
    BOOL    fData
    )
{

    if ( fDebugged ) {
        SEGMENT_NOTE    se;

        DbgGetContext();

        RtlFillMemory( &se, sizeof(se), (UCHAR)0 );

        se.Selector1 = Selector;
        se.Segment   = Segment+1;       // make it one-based
        se.Type      = fData ? SN_DATA : SN_CODE;

        strncpy(se.FileName, lpPathName,
                min(strlen(lpPathName), MAX_PATH16-1) );

        strncpy(se.Module, lpModuleName,
                min(strlen(lpModuleName), MAX_MODULE-1) );

        EventParams[2] = (DWORD)&se;

        SendVDMEvent(DBG_SEGLOAD);
    }
}

void
SegmentMove(
    WORD    OldSelector,
    WORD    NewSelector
    )
{

    if ( fDebugged ) {
        SEGMENT_NOTE    se;

        DbgGetContext();

        RtlFillMemory( &se, sizeof(se), (UCHAR)0 );

        se.Selector1   = OldSelector;
        se.Selector2   = NewSelector;

        EventParams[2] = (DWORD)&se;

        SendVDMEvent(DBG_SEGMOVE);
    }
}

void
SegmentFree(
    WORD    Selector,
    BOOL    fBPRelease
    )
{

    if ( fDebugged ) {
        SEGMENT_NOTE    se;

        DbgGetContext();

        RtlFillMemory( &se, sizeof(se), (UCHAR)0 );

        se.Selector1   = Selector;
        se.Type        = (WORD)fBPRelease;

        EventParams[2] = (DWORD)&se;

        SendVDMEvent(DBG_SEGFREE);
    }
}

void
ModuleLoad(
    LPSTR   lpModuleName,
    LPSTR   lpPathName,
    WORD    Segment,
    DWORD   Length
    )
{

    if ( fDebugged ) {
        SEGMENT_NOTE    se;

        DbgGetContext();

        RtlFillMemory( &se, sizeof(se), (UCHAR)0 );

        se.Selector1 = Segment;
        se.Length  = Length;

        strncpy(se.FileName, lpPathName,
                min(strlen(lpPathName), MAX_PATH16-1) );

        strncpy(se.Module, lpModuleName,
                min(strlen(lpModuleName), MAX_MODULE-1) );

        EventParams[2] = (DWORD)&se;

        SendVDMEvent(DBG_MODLOAD);
    }
}

void
ModuleSegmentMove(
    LPSTR   lpModuleName,
    LPSTR   lpPathName,
    WORD    ModuleSegment,
    WORD    OldSelector,
    WORD    NewSelector,
    DWORD   Length
    )
{

    if ( fDebugged ) {
        SEGMENT_NOTE    se;

        DbgGetContext();

        RtlFillMemory( &se, sizeof(se), (UCHAR)0 );

        se.Segment     = ModuleSegment;
        se.Selector1   = OldSelector;
        se.Selector2   = NewSelector;
        se.Type        = SN_V86;
        se.Length      = Length;

        strncpy(se.FileName, lpPathName,
                min(strlen(lpPathName), MAX_PATH16-1) );

        strncpy(se.Module, lpModuleName,
                min(strlen(lpModuleName), MAX_MODULE-1) );

        EventParams[2] = (DWORD)&se;

        SendVDMEvent(DBG_SEGMOVE);
    }
}

void
ModuleFree(
    LPSTR   lpModuleName,
    LPSTR   lpPathName
    )
{

    if ( fDebugged ) {
        SEGMENT_NOTE    se;

        DbgGetContext();

        RtlFillMemory( &se, sizeof(se), (UCHAR)0 );

        strncpy(se.FileName, lpPathName,
                min(strlen(lpPathName), MAX_PATH16-1) );

        strncpy(se.Module, lpModuleName,
                min(strlen(lpModuleName), MAX_MODULE-1) );

        EventParams[2] = (DWORD)&se;

        SendVDMEvent(DBG_MODFREE);
    }
}

void
xxxDbgSegmentNotice(
    WORD wType,
    WORD  wModuleSeg,
    WORD  wLoadSeg,
    WORD  wNewSeg,
    LPSTR lpModuleName,
    LPSTR lpModulePath,
    DWORD dwImageLen )

/* DbgSegmentNotice
 *
 * packs up the data and raises STATUS_SEGMENT_NOTIFICATION
 *
 * Entry - WORD  wType     - DBG_MODLOAD, DBG_MODFREE
 *         WORD  wModuleSeg- segment number within module (1 based)
 *         WORD  wLoadSeg  - Starting Segment (reloc factor)
 *         LPSTR lpName    - ptr to Name of Image
 *         DWORD dwModLen  - Length of module
 *
 *
 *         if wType ==DBG_MODLOAD wOldLoadSeg is unused
 *         if wType ==DBG_MODFREE wLoadSeg,dwImageLen,wOldLoadSeg are unused
 *
 *         Use 0 or NULL for unused parameters
 *
 * Exit  - void
 *
 */

{
    if (!fDebugged) {
         return;
         }

    if (wType == DBG_MODLOAD) {
        ModuleLoad(lpModuleName, lpModulePath, wLoadSeg, dwImageLen);
    } else if (wType == DBG_MODFREE) {
        ModuleFree(lpModuleName, lpModulePath);
    } else if (wType == DBG_SEGMOVE) {
        ModuleSegmentMove(lpModuleName, lpModulePath, wModuleSeg, wLoadSeg, wNewSeg, dwImageLen);
    }
}