Code: Select all
#include "hmg.ch"
Function Main
DEFINE WINDOW Form_1 ;
AT 0,0 ;
WIDTH 700 ;
HEIGHT 700 ;
MAIN
aRows1 := HMG_GetHBSymbols()
@ 10,10 GRID Grid_1 ;
WIDTH 620 ;
HEIGHT 300 ;
HEADERS {'Index','Symbol','Type'} ;
WIDTHS {140,240,140} ;
ITEMS aRows1
aRows2 := {}
aData := HMG_GetDLLFunctions ("user32.dll")
FOR i := 1 TO HMG_LEN (aData)
AAdd(aRows2, { str( i ), aData[ i ] } )
NEXT
@ 350,10 GRID Grid_2 ;
WIDTH 620 ;
HEIGHT 300 ;
HEADERS {'Index','Function'} ;
WIDTHS {140, 240} ;
ITEMS aRows2
END WINDOW
MAXIMIZE WINDOW Form_1
ACTIVATE WINDOW Form_1
Return
FUNCTION HMG_GetHBSymbols()
LOCAL cSymName, aSym := {}
/*
__DYNSCOUNT() // How much symbols do we have: dsCount = __dynsCount()
__DYNSGETNAME() // Get name of symbol: cSymbol = __dynsGetName( dsIndex )
__DYNSGETINDEX() // Get index number of symbol: dsIndex = __dynsGetIndex( cSymbol )
__DYNSISFUN() // returns .T. if a symbol has a function/procedure pointer given its symbol index or name: __DynsIsFun( cSymbol | dsIndex )
HB_ISFUNCTION() // returns .T. if a symbol has a function/procedure pointer: hb_IsFunction( cSymbol )
*/
FOR i := 1 TO __DYNSCOUNT()
cSymName := __DYNSGETNAME( i )
AAdd( aSym, { str( i ), cSymName, IIF( __DYNSISFUN( cSymName ), "FUNC/PROC","" ) } )
NEXT
RETURN aSym
#pragma BEGINDUMP
#include "SET_COMPILE_HMG_UNICODE.ch"
#include "HMG_UNICODE.h"
#include <windows.h>
#include <imagehlp.h>
#include "hbapi.h"
HMG_DEFINE_DLL_FUNC ( win_MapAndLoad, // user function name
"Imagehlp.dll", // dll name
WINBOOL, // function return type
WINAPI, // function type
"MapAndLoad", // dll function name
(PCSTR ImageName, PCSTR DllPath, PLOADED_IMAGE LoadedImage, WINBOOL DotDll, WINBOOL ReadOnly), // dll function parameters (types and names)
(ImageName, DllPath, LoadedImage, DotDll, ReadOnly), // function parameters (only names)
FALSE // return value if fail call function of dll
)
HMG_DEFINE_DLL_FUNC ( win_UnMapAndLoad, // user function name
"Imagehlp.dll", // dll name
WINBOOL, // function return type
WINAPI, // function type
"UnMapAndLoad", // dll function name
(PLOADED_IMAGE LoadedImage), // dll function parameters (types and names)
(LoadedImage), // function parameters (only names)
FALSE // return value if fail call function of dll
)
HMG_DEFINE_DLL_FUNC ( win_ImageDirectoryEntryToData, // user function name
"Dbghelp.dll", // dll name
PVOID, // function return type
WINAPI, // function type
"ImageDirectoryEntryToData", // dll function name
(PVOID Base, BOOLEAN MappedAsImage, USHORT DirectoryEntry, PULONG Size), // dll function parameters (types and names)
(Base, MappedAsImage, DirectoryEntry, Size), // function parameters (only names)
NULL // return value if fail call function of dll
)
HMG_DEFINE_DLL_FUNC ( win_ImageRvaToVa, // user function name
"Dbghelp.dll", // dll name
PVOID, // function return type
WINAPI, // function type
"ImageRvaToVa", // dll function name
(PIMAGE_NT_HEADERS NtHeaders,PVOID Base,ULONG Rva,PIMAGE_SECTION_HEADER *LastRvaSection), // dll function parameters (types and names)
(NtHeaders, Base, Rva, LastRvaSection), // function parameters (only names)
NULL // return value if fail call function of dll
)
HB_FUNC ( HMG_GETDLLFUNCTIONS )
{
CHAR *cDllName = (CHAR *) hb_parc (1);
DWORD *dNameRVAs = NULL;
LOADED_IMAGE LI;
IMAGE_EXPORT_DIRECTORY *IED;
ULONG DirSize;
CHAR *cName;
if ( win_MapAndLoad (cDllName, NULL, &LI, TRUE, TRUE) )
{
IED = (IMAGE_EXPORT_DIRECTORY *) win_ImageDirectoryEntryToData (LI.MappedAddress, FALSE, IMAGE_DIRECTORY_ENTRY_EXPORT, &DirSize);
if (IED != NULL)
{
dNameRVAs = (DWORD *) win_ImageRvaToVa (LI.FileHeader, LI.MappedAddress, IED->AddressOfNames, NULL);
ULONG i;
hb_reta ( IED->NumberOfNames );
for(i = 0; i < IED->NumberOfNames; i++)
{
cName = (CHAR *) win_ImageRvaToVa (LI.FileHeader, LI.MappedAddress, dNameRVAs[i], NULL);
hb_storvc ( cName, -1, i + 1 );
}
}
win_UnMapAndLoad (&LI);
}
}
#pragma ENDDUMP