266 lines
5.5 KiB
C
266 lines
5.5 KiB
C
#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 LPV OmfTemp = NULL;
|
||
static CHAR OmfBuff[256] = {0};
|
||
|
||
/*
|
||
* Da Code
|
||
*/
|
||
|
||
|
||
/*** MH_OmfSetupLocal
|
||
**
|
||
** Synopsis:
|
||
** LPV MH_OmfSetupLocal( HDEP handle);
|
||
**
|
||
** Entry:
|
||
** handle - Handle to the local hsym
|
||
**
|
||
** Returns:
|
||
** Returns a pointer to void of the OMF record
|
||
**
|
||
** Description:
|
||
** Creates an BPREL32 omf record and returns the address.
|
||
**
|
||
*/
|
||
|
||
LPV MH_OmfSetupLocal(HDEP handle)
|
||
{
|
||
int length;
|
||
PLOCAL pLocal = (PLOCAL)handle;
|
||
BPRELSYM32 *Omf;
|
||
|
||
MEMSET( OmfBuff, 0, sizeof(OmfBuff) ); // Zero the name buffer
|
||
SHGetSymName( (HSYM)handle, OmfBuff); // Get the Symbol's name
|
||
length = STRLEN(OmfBuff);
|
||
|
||
OmfTemp = malloc( sizeof(BPRELSYM32) + length + 1);
|
||
Omf = (BPRELSYM32 *)OmfTemp;
|
||
|
||
if ( Omf ) {
|
||
Omf->name[0] = (UCHAR)length;
|
||
STRNCPY( &Omf->name[1], OmfBuff, Omf->name[0]);
|
||
Omf->reclen = (short)(sizeof(BPRELSYM32) + length);
|
||
Omf->rectyp = S_BPREL32;
|
||
Omf->off = (LONG)pLocal->value;
|
||
Omf->typind = pLocal->cvtype;
|
||
}
|
||
return OmfTemp;
|
||
}
|
||
|
||
|
||
|
||
/*** MH_OmfSetupProc
|
||
**
|
||
** Synopsis:
|
||
** LPV MH_OmfSetupProc( HDEP handle);
|
||
**
|
||
** Entry:
|
||
** handle - Handle to the proc hsym
|
||
**
|
||
** Returns:
|
||
** Returns a pointer to void of the OMF record
|
||
**
|
||
** Description:
|
||
** Creates an PROCSYM32 omf record and returns the address.
|
||
**
|
||
*/
|
||
|
||
LPV MH_OmfSetupProc(HDEP handle)
|
||
{
|
||
int i,length;
|
||
PSYMBOL pProc = (PSYMBOL)handle;
|
||
ULONG offset;
|
||
PIMAGE_INFO pImage;
|
||
PROCSYM32 * Omf;
|
||
|
||
pImage = pImageFromIndex( pProc->modIndex );
|
||
assert( pImage );
|
||
|
||
offset = pProc->offset - (ULONG)pImage->lpBaseOfImage;
|
||
|
||
MEMSET( OmfBuff, 0, sizeof(OmfBuff) ); // Zero the name buffer
|
||
SHGetSymName( (HSYM)handle, OmfBuff); // Get the Symbol's name
|
||
length = STRLEN(OmfBuff);
|
||
|
||
OmfTemp = malloc( sizeof(PROCSYM32) + length + 1);
|
||
Omf = (PROCSYM32 *)OmfTemp;
|
||
|
||
if ( Omf ) {
|
||
for ( i=1; i < pImage->ObjectCount; i++)
|
||
if ( pImage->pRVA[i] <= offset && offset <= pImage->pRVA[i+1] )
|
||
break;
|
||
|
||
Omf->name[0] = (UCHAR)length;
|
||
STRNCPY( &Omf->name[1], OmfBuff, Omf->name[0]);
|
||
|
||
Omf->reclen = (short)(sizeof(DATASYM32) + length);
|
||
Omf->rectyp = S_GPROC32;
|
||
Omf->off = offset - pImage->pRVA[i];
|
||
Omf->seg = (SEGMENT)i;
|
||
Omf->typind = pProc->cvtype;
|
||
|
||
Omf->pParent = 0;
|
||
Omf->pEnd = 0;
|
||
Omf->pNext = 0;
|
||
Omf->len = 0;
|
||
Omf->DbgStart = 0;
|
||
Omf->DbgEnd = 0xffffffff;
|
||
Omf->rtntyp = 0;
|
||
}
|
||
return (LPV)Omf;
|
||
}
|
||
|
||
|
||
/*** MH_OmfSetupPublic
|
||
**
|
||
** Synopsis:
|
||
** LPV MH_OmfSetupPublic( HDEP handle);
|
||
**
|
||
** Entry:
|
||
** handle - Handle to the proc hsym
|
||
**
|
||
** Returns:
|
||
** Returns a pointer to void of the OMF record
|
||
**
|
||
** Description:
|
||
** Creates an DATASYM32 omf record and returns the address.
|
||
**
|
||
*/
|
||
|
||
LPV MH_OmfSetupPublic(HDEP handle)
|
||
{
|
||
int i,length;
|
||
PSYMBOL pSymbol = (PSYMBOL)handle;
|
||
ULONG offset;
|
||
PIMAGE_INFO pImage;
|
||
DATASYM32 *Omf;
|
||
|
||
pImage = pImageFromIndex( pSymbol->modIndex );
|
||
assert( pImage );
|
||
|
||
offset = pSymbol->offset - (ULONG)pImage->lpBaseOfImage;
|
||
|
||
MEMSET( OmfBuff, 0, sizeof(OmfBuff) ); // Zero the name buffer
|
||
SHGetSymName( (HSYM)handle, OmfBuff); // Get the Symbol's name
|
||
length = STRLEN(OmfBuff);
|
||
|
||
OmfTemp = malloc( sizeof(DATASYM32) + length + 1);
|
||
Omf = (DATASYM32 *)OmfTemp;
|
||
|
||
if ( Omf ) {
|
||
for ( i=1; i < pImage->ObjectCount; i++)
|
||
if ( pImage->pRVA[i] <= offset && offset <= pImage->pRVA[i+1] )
|
||
break;
|
||
|
||
Omf->name[0] = (UCHAR)length;
|
||
STRNCPY( &Omf->name[1], OmfBuff, Omf->name[0]);
|
||
Omf->reclen = (short)(sizeof(DATASYM32) + length);
|
||
Omf->rectyp = S_PUB32;
|
||
Omf->off = offset - pImage->pRVA[i];
|
||
Omf->seg = (SEGMENT)i;
|
||
Omf->typind = pSymbol->cvtype;
|
||
}
|
||
return OmfTemp;
|
||
}
|
||
|
||
|
||
/*** MHOmfLock
|
||
**
|
||
** Synopsis:
|
||
** LPV MHOmfLock( HDEP handle);
|
||
**
|
||
** Entry:
|
||
** handle - Handle to the an hsym
|
||
**
|
||
** Returns:
|
||
** Returns a pointer to void of the OMF record that was created
|
||
**
|
||
** Description:
|
||
** Creates an approriate OMF record for the kind of hsym we're passed,\
|
||
** and returns a pointer to the record.
|
||
**
|
||
** WARNING: THE CURRENT SYSTEM ONLY ALLOWS ONE HSYM TO BE LOCKED DOWN
|
||
** AT ONE TIME.
|
||
**
|
||
*/
|
||
|
||
LPV LOADDS PASCAL MHOmfLock( HDEP handle)
|
||
{
|
||
PUSHORT kind = (PUSHORT)handle;
|
||
LPV point;
|
||
|
||
assert( OmfTemp == NULL);
|
||
assert( handle );
|
||
|
||
switch ( *kind ) {
|
||
|
||
case K_PUBLIC: point = MH_OmfSetupPublic(handle);
|
||
break;
|
||
|
||
case K_LOCAL: point = MH_OmfSetupLocal(handle);
|
||
break;
|
||
|
||
case K_PROC: point = MH_OmfSetupProc(handle);
|
||
break;
|
||
|
||
case K_TYPE: OmfTemp = (LPV)-1;
|
||
point = (LPV)(handle + sizeof(LONG));
|
||
break;
|
||
|
||
default: assert( FALSE );
|
||
point = NULL;
|
||
}
|
||
|
||
return point;
|
||
}
|
||
|
||
|
||
/*** MHOmfUnlock
|
||
**
|
||
** Synopsis:
|
||
** LPV MHOmfunlock( HDEP handle);
|
||
**
|
||
** Entry:
|
||
** handle - Not Referenced
|
||
**
|
||
** Returns:
|
||
**
|
||
** Description:
|
||
** Releases the OMF record that was created by a MHOmfLock() call
|
||
**
|
||
** WARNING: THE CURRENT SYSTEM ONLY ALLOWS ONE HSYM TO BE LOCKED DOWN
|
||
** AT ONE TIME.
|
||
**
|
||
*/
|
||
|
||
void LOADDS PASCAL MHOmfUnLock(HDEP handle)
|
||
{
|
||
Unreferenced(handle);
|
||
assert( OmfTemp != NULL);
|
||
|
||
if ( OmfTemp != (LPV)-1) free(OmfTemp);
|
||
OmfTemp = NULL;
|
||
}
|