SYMCVT.C

/*++ 


Copyright 1996 - 1997 Microsoft Corporation

Module Name:

symcvt.c

Abstract:

This module is the shell for the SYMCVT DLL. The DLL's purpose is
to convert the symbols for the specified image. The resulting
debug data must conform to the CODEVIEW spec.

Currently this DLL converts COFF symbols and C7/C8 MAPTOSYM SYM files.

Author:

Wesley A. Witt (wesw) 19-April-1993

Environment:

Win32, User Mode

--*/

#include <windows.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#define _SYMCVT_SOURCE_
#include "symcvt.h"

PUCHAR
ConvertSymbolsForImage(
HANDLE hFile,
char * fname
)
/*++

Routine Description:

Calls the appropriate conversion routine based on the file contents.


Arguments:

hFile - file handle for the image (may be NULL)
fname - file name for the image (may not have correct path)


Return Value:

NULL - could not convert the symbols
Valid Pointer - a pointer to malloc'ed memory that contains the
CODEVIEW symbols

--*/
{
POINTERS p;
char szDrive [_MAX_DRIVE];
char szDir [_MAX_DIR];
char szFname [_MAX_FNAME];
char szExt [_MAX_EXT];
char szSymName [MAX_PATH];
PUCHAR rVal;


if (!MapInputFile( &p, hFile, fname)) {

rVal = NULL;

} else if (CalculateNtImagePointers( &p.iptrs )) {

//
// we were able to compute the nt image pointers so this must be
// a nt PE image. now we must decide if there are coff symbols
// if there are then we do the cofftocv conversion.
//
// btw, this is where someone would convert some other type of
// symbols that are in a nt PE image. (party on garth..)
//

// if (!COFF_DIR(&p.iptrs)) {
if (!p.iptrs.numberOfSymbols) {
rVal = NULL;
} else {
ConvertCoffToCv( &p );
rVal = p.pCvStart.ptr;
}
UnMapInputFile( &p );

} else {

UnMapInputFile ( &p );

_splitpath( fname, szDrive, szDir, szFname, szExt );
_makepath( szSymName, szDrive, szDir, szFname, "sym" );

if (!MapInputFile( &p, NULL, szSymName)) {

rVal = NULL;

} else {

//
// must be a wow/dos app and there is a .sym file so lets to
// the symtocv conversion
//

ConvertSymToCv( &p );
UnMapInputFile( &p );

rVal = p.pCvStart.ptr;
}

}

return rVal;
}