mirror of https://github.com/lianthony/NT4.0
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
336 lines
7.6 KiB
336 lines
7.6 KiB
#include <string.h>
|
|
|
|
#include "ntsdp.h"
|
|
#include "types.h"
|
|
#include "cvtypes.h"
|
|
#include "shapi.h"
|
|
#include "cvproto.h"
|
|
#include "cvinfo.h"
|
|
#include "sapi.h"
|
|
#include "shiproto.h"
|
|
#include "ntempd.h"
|
|
#include "ntimage.h"
|
|
#include "ntsapi.h"
|
|
|
|
/*
|
|
* Function Prototypes
|
|
*/
|
|
|
|
PIMAGE_INFO pImageFromIndex( UCHAR); // NTSYM.C
|
|
|
|
/*
|
|
* Global Memory (File)
|
|
*/
|
|
|
|
|
|
static char chName[512];
|
|
|
|
|
|
/*
|
|
* Da Code
|
|
*/
|
|
|
|
|
|
/*** SL_GetBytesGenerated
|
|
**
|
|
** Synopsis:
|
|
** SHOFF SL_GetBytesGenerated( PSYMFILE pSymfile, PLINENO pLineno);
|
|
**
|
|
** Entry:
|
|
** pSymfile - Pointer to the Symfile entry.
|
|
** pLineno - Pointer to the Line number entry
|
|
**
|
|
** Returns:
|
|
** Returns the number of bytes generated.
|
|
**
|
|
** Description:
|
|
** Given a pointer to a Symfile and a corresponding linenumber, return
|
|
** the number of bytes generated.
|
|
**
|
|
*/
|
|
|
|
SHOFF SL_GetBytesGenerated( PSYMFILE pSymfile, PLINENO pLineno )
|
|
{
|
|
ULONG MemoryLow;
|
|
ULONG MemoryHigh;
|
|
|
|
MemoryLow = pLineno->memoryOffset;
|
|
|
|
if (pLineno == (pSymfile->pLineno + pSymfile->cLineno))
|
|
MemoryHigh = pSymfile->endOffset;
|
|
else
|
|
MemoryHigh = (pLineno + 1)->memoryOffset;
|
|
|
|
return (SHOFF)(MemoryHigh-MemoryLow-1);
|
|
}
|
|
|
|
|
|
/*** SL_GetLineAbove
|
|
**
|
|
** Synopsis:
|
|
** WORD SL_GetLineAbove( PSYMFILE pSymfile, PLINENO pLineno);
|
|
**
|
|
** Entry:
|
|
** pSymfile - Pointer to the Symfile entry.
|
|
** pLineno - Pointer to the Line number entry
|
|
**
|
|
** Returns:
|
|
** Returns next line number for the given file, or zero if at the
|
|
** last line of the file.
|
|
**
|
|
** Description:
|
|
** Given a pointer to a Symfile and a corresponding linenumber entry,
|
|
** return the line number for the next line that generated code.
|
|
** Returns zero if at the last line of the file.
|
|
**
|
|
*/
|
|
|
|
WORD SL_GetLineAbove( PSYMFILE pSymfile, PLINENO pLineno )
|
|
{
|
|
if (pLineno == (pSymfile->pLineno + pSymfile->cLineno))
|
|
return 0;
|
|
else
|
|
return (pLineno + 1)->breakLineNumber;
|
|
}
|
|
|
|
|
|
/*** SL_GetLineBelow
|
|
**
|
|
** Synopsis:
|
|
** WORD SL_GetLineBelow( PSYMFILE pSymfile, PLINENO pLineno);
|
|
**
|
|
** Entry:
|
|
** pSymfile - Pointer to the Symfile entry.
|
|
** pLineno - Pointer to the Line number entry
|
|
**
|
|
** Returns:
|
|
** Returns previous line number for the given file, or zero if at the
|
|
** first line of the file.
|
|
**
|
|
** Description:
|
|
** Given a pointer to a Symfile and a corresponding linenumber entry,
|
|
** return the line number for the previous line that generated code.
|
|
** Returns zero if at the first line of the file.
|
|
**
|
|
*/
|
|
|
|
WORD SL_GetLineBelow( PSYMFILE pSymfile, PLINENO pLineno )
|
|
{
|
|
if ( pLineno == pSymfile->pLineno )
|
|
return 0;
|
|
else
|
|
return (pLineno - 1)->breakLineNumber;
|
|
}
|
|
|
|
|
|
|
|
/*** SLFLineToAddr
|
|
**
|
|
** Synopsis:
|
|
** BOOLEAN SLFLineToAddr (HSF hsf, WORD line, LPADDR lpaddr,
|
|
** SHOFF FAR * lpcbLn, WORD FAR *lpNear);
|
|
** Entry:
|
|
** hsf - handle to the source file.
|
|
** line - Source line (One-based).
|
|
** *lpaddr - Address for this source line.
|
|
** *lpcbLn - Bytes of code that were generated for this source line.
|
|
** *lpNear - The nearest line below ([0]) and above ([1]) which
|
|
** generated code.
|
|
**
|
|
** Returns:
|
|
** TRUE for success, FALSE for failure.
|
|
**
|
|
** Description:
|
|
** Given an filename and a line number, return the address for the line.
|
|
** Returns TRUE or FALSE, and when successful the address and the number
|
|
** of bytes of code generated for the line.
|
|
**
|
|
*/
|
|
|
|
BOOL LOADDS PASCAL SLFLineToAddr (HSF hsf, WORD line, LPADDR lpaddr,
|
|
SHOFF FAR * lpcb, WORD FAR * lpNearest)
|
|
{
|
|
PLINENO pLineno;
|
|
PSYMFILE pSymfile = (PSYMFILE)hsf;
|
|
PIMAGE_INFO pImage = pImageFromIndex( pSymfile->modIndex);
|
|
|
|
pLineno = GetLinenoFromFilename( pSymfile->pchName, &pSymfile,
|
|
line, pImage->index);
|
|
|
|
if ( pLineno && pLineno->breakLineNumber == line) {
|
|
SH_SetAddr(lpaddr,pLineno->memoryOffset,(HEXE)pImage);
|
|
*lpcb = SL_GetBytesGenerated(pSymfile,pLineno);
|
|
|
|
if ( lpNearest ) {
|
|
*lpNearest++ = SL_GetLineBelow(pSymfile,pLineno);
|
|
*lpNearest = SL_GetLineAbove(pSymfile,pLineno);
|
|
}
|
|
|
|
if ( line == 1 && pLineno->memoryOffset == 0)
|
|
return(FALSE);
|
|
else
|
|
return(TRUE);
|
|
|
|
}
|
|
|
|
else {
|
|
// dprintf("KD: SLFLineToAddr(), %s!%d is unknown\n",
|
|
// pSymfile->pchName,line);
|
|
return(FALSE);
|
|
}
|
|
}
|
|
|
|
|
|
/*** SLHsfFromFile
|
|
**
|
|
** Synopsis:
|
|
** HSF SLHsfFromFile ( HMOD hmod, LSZ File );
|
|
**
|
|
** Entry:
|
|
** hmod - Module to check for this filename
|
|
** File - Filename
|
|
**
|
|
** Returns:
|
|
** Handle to the Source File or NULL if not found.
|
|
**
|
|
** Description:
|
|
** Given a module and a source filename, return the HSF
|
|
** that corresponds. The path and extension on the file
|
|
** name will be ignored.
|
|
**
|
|
**
|
|
*/
|
|
|
|
HSF LOADDS PASCAL SLHsfFromFile ( HMOD hmod, LSZ lszFile )
|
|
{
|
|
PIMAGE_INFO pImage;
|
|
PSYMFILE pSymfile;
|
|
char rgch[_MAX_CVFNAME];
|
|
|
|
if ( hmod )
|
|
pImage = (PIMAGE_INFO)SHHexeFromHmod(hmod);
|
|
else
|
|
pImage = (PIMAGE_INFO)SHGetNextExe( (HEXE)NULL);
|
|
|
|
_splitpath(lszFile, NULL, NULL, rgch, NULL);
|
|
_strlwr(rgch);
|
|
if ( GetLinenoFromFilename( rgch, &pSymfile, 1, pImage->index) )
|
|
return (HSF) (((HMOD) pSymfile == hmod) ? pSymfile : NULL);
|
|
else
|
|
return (HSF)NULL;
|
|
}
|
|
|
|
|
|
/*** SLHsfFromPcxt
|
|
**
|
|
** Synopsis:
|
|
** HSF SLHsfFromPcxt( PCXT pcxt);
|
|
**
|
|
** Entry:
|
|
** pcxt - pointer to a context block.
|
|
**
|
|
** Returns:
|
|
** Returns a handle to the source file or NULL if not found.
|
|
**
|
|
** Description:
|
|
** Given a pointer to a CXT return a handle to the source file.
|
|
**
|
|
*/
|
|
|
|
HSF LOADDS PASCAL SLHsfFromPcxt(PCXT pcxt)
|
|
{
|
|
ULONG offset;
|
|
PLINENO pLineno;
|
|
PSYMFILE pSymfile;
|
|
|
|
offset = SH_OffsetFromAddr( &pcxt->addr );
|
|
pLineno = GetLinenoFromOffset( &pSymfile, offset);
|
|
if ( pLineno )
|
|
return (HSF)pSymfile;
|
|
else
|
|
return (HSF)0;
|
|
}
|
|
|
|
|
|
|
|
/*** SLLineFromAddr
|
|
**
|
|
** Synopsis:
|
|
** BOOL SLLineFromAddr( LPADDR lpaddr,
|
|
** LPW lpwLine,
|
|
** SHOFF FAR * lpcb,
|
|
** SHOFF FAR * lpdb );
|
|
** Entry:
|
|
** lpaddr - address for which we want source line info
|
|
** *lpwLine - Line (one-based) for this address
|
|
** *lpcb - Bytes of code that were generated for this source line.
|
|
** *lpdb - Delta to start of the line.
|
|
**
|
|
** Returns:
|
|
** TRUE if source was found, FALSE if not
|
|
**
|
|
** Description:
|
|
** Given an address return the line number that corresponds.
|
|
** Also return count bytes for the given line, and the delta
|
|
** between the address that was passed in and the first byte
|
|
** corresponding to this source line.
|
|
**
|
|
*/
|
|
|
|
BOOL LOADDS PASCAL SLLineFromAddr ( LPADDR lpaddr, LPW lpwLine,
|
|
SHOFF FAR * lpcb, SHOFF FAR * lpdb)
|
|
{
|
|
ULONG offset;
|
|
PLINENO pLineno;
|
|
PSYMFILE pSymfile;
|
|
|
|
offset = SH_OffsetFromAddr( lpaddr );
|
|
|
|
pLineno = GetLinenoFromOffset( &pSymfile, offset);
|
|
if ( pLineno ) {
|
|
*lpwLine = (WORD)pLineno->breakLineNumber;
|
|
*lpcb = SL_GetBytesGenerated(pSymfile,pLineno);
|
|
*lpdb = (SHOFF)(offset - pLineno->memoryOffset);
|
|
return(TRUE);
|
|
}
|
|
|
|
else {
|
|
// dprintf("KD: SLLineFromAddr() failed for offset %x\n",offset);
|
|
return(FALSE);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
/*** SLNameFromHsf
|
|
**
|
|
** Synopsis:
|
|
** LPCH SLNameFromHsf( HSF hsf);
|
|
**
|
|
** Entry:
|
|
** hsf - Handle to a source file.
|
|
**
|
|
** Returns:
|
|
** Returns the Address of a length-prefixed string containing the
|
|
** path/filename.
|
|
**
|
|
** Description:
|
|
** Returns length-prefixed pointer to the filename associated with
|
|
** source file. Each call to this function overwrites any previous
|
|
** calls. NOTE: Length-prefixed pointer, it's NOT quaranteed to be
|
|
** null terminated!
|
|
**
|
|
*/
|
|
|
|
LPCH LOADDS PASCAL SLNameFromHsf(HSF hsf)
|
|
{
|
|
PSYMFILE pSymfile = (PSYMFILE)hsf;
|
|
|
|
strncpy(&chName[1],pSymfile->pchPath, 512);
|
|
strncat(&chName[1],pSymfile->pchName, 512);
|
|
strncat(&chName[1],pSymfile->pchExtension, 512);
|
|
chName[0] = (char)strlen(&chName[1]);
|
|
return &chName[0];
|
|
}
|
|
|
|
|