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;
|
|||
|
}
|