05-12-2016 04:17 PM
Good afternoon,
I am programming a SW application which contains a List Box in its UIR that will show all the functions defined in an external DLL.
That DLL was compiled with LabWindows/CVI as debuggable DLL (32 bits) and its .lib and .h files were added to my project which will show the list of exportable functions, from that DLL, whose prototypes are defined in that .h file as:
extern void __declspec(dllexport) __stdcall FUNCTION(......)
I know that i can access those functions using LoadLibrary and GetProcAddress functions from Windows Driver Kit (WDK) but i want to "see" all those functions to list them into the List Box programmatically to be selectable by the user later on.
Thanks in advance!
Regards,
Alejandro Pinto
05-30-2016 06:45 AM
Hello
i used the following code in one of my projects using the sdk lib
you have to #include "ImageHlp.h"
and also add the lib to your prj
int GetFunctionNames (char *dllFileName , int panel , int list_ctrl)
{
int ret_val = 0 ;
char func_name[256] = {'\0'};
HANDLE hFile = NULL , hFileMapping = NULL ;
LPVOID lpFileBase = NULL ;
PIMAGE_DOS_HEADER pDOS;
PIMAGE_NT_HEADERS pNT;
DWORD i;
PIMAGE_EXPORT_DIRECTORY pED;
PDWORD *pEN;
PIMAGE_IMPORT_BY_NAME pOrdinalName;
PIMAGE_IMPORT_DESCRIPTOR pIDesc;
DWORD rvaINT;
DWORD rvaIAT;
PIMAGE_THUNK_DATA pINT;
PIMAGE_THUNK_DATA pIAT;
ULONGLONG ordinal;
hFile = CreateFile (dllFileName, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL, 0);
if (hFile == INVALID_HANDLE_VALUE)
{
MessagePopup ("", "Unable to open DLL File"); return 0 ;
}
hFileMapping = CreateFileMapping (hFile, NULL, PAGE_READONLY, 0, 0, NULL);
if (hFileMapping == 0)
goto SOF;
lpFileBase = MapViewOfFile (hFileMapping, FILE_MAP_READ, 0, 0, 0);
if (lpFileBase == 0)
goto SOF;
pDOS = (PIMAGE_DOS_HEADER)lpFileBase;
pNT = (PIMAGE_NT_HEADERS)((LONG)pDOS + (LONG)pDOS->e_lfanew);
if (IsBadReadPtr (pNT, sizeof (IMAGE_NT_HEADERS)))
goto SOF;
else
if (pNT->Signature != IMAGE_NT_SIGNATURE )
{
switch ((WORD)pNT->Signature)
{
case IMAGE_DOS_SIGNATURE: break;
case IMAGE_OS2_SIGNATURE: break;
case IMAGE_VXD_SIGNATURE: break;
}
goto SOF;
}
pED = (PIMAGE_EXPORT_DIRECTORY)pNT->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].VirtualAddress;
if (!pED)
goto SOF;
pED = (PIMAGE_EXPORT_DIRECTORY)ImageRvaToVa (pNT, pDOS, (DWORD)pED, 0);
pEN = (PDWORD*) pED->AddressOfNames;
pEN = (PDWORD*)ImageRvaToVa (pNT, pDOS, (DWORD)pEN, 0);
if(!pEN)
goto SOF;
for (i = 0; i < pED->NumberOfNames; i++)
{
sprintf (func_name, "%s", (PSTR)ImageRvaToVa (pNT, pDOS, (DWORD)*pEN, 0));
InsertListItem(panel , list_ctrl , -1 , func_name , 0) ;
pEN++;
}
pIDesc = (PIMAGE_IMPORT_DESCRIPTOR)pNT->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress;
if (!pIDesc)
goto SOF;
pIDesc = (PIMAGE_IMPORT_DESCRIPTOR)ImageRvaToVa (pNT, pDOS, (DWORD)pIDesc, 0);
while (1)
{
// See if we've reached an empty IMAGE_IMPORT_DESCRIPTOR
if ((pIDesc->TimeDateStamp == 0 ) && (pIDesc->Name == 0))
break;
sprintf (func_name, "%s", (PSTR)ImageRvaToVa (pNT, pDOS, (DWORD)pIDesc->Name, 0));
rvaINT = pIDesc->OriginalFirstThunk;
rvaIAT = pIDesc->FirstThunk;
if (rvaINT == 0 ) // No Characteristics field?
{
//FirstThunk field then.
rvaINT = rvaIAT;
if (rvaINT == 0 ) // No FirstThunk field
goto SOF;
}
pINT = (PIMAGE_THUNK_DATA)ImageRvaToVa (pNT, pDOS, rvaINT, 0);
if (!pINT )
goto SOF;
pIAT = (PIMAGE_THUNK_DATA)ImageRvaToVa (pNT, pDOS, rvaIAT, 0);
while (1)
{
if (pINT->u1.AddressOfData == 0)
break;
ordinal = -1;
if (IMAGE_SNAP_BY_ORDINAL32 (pINT->u1.Ordinal))
ordinal = IMAGE_ORDINAL32 (pINT->u1.Ordinal);
if (ordinal == -1)
{
pOrdinalName = (PIMAGE_IMPORT_BY_NAME)ImageRvaToVa (pNT, pDOS,(DWORD)(pINT->u1.AddressOfData), 0);
}
pINT++; // Advance to next thunk
pIAT++; // advance to next thunk
}
pIDesc++;
}
ret_val = 1 ;
SOF:
if(lpFileBase != NULL)
UnmapViewOfFile (lpFileBase);
if(hFileMapping != NULL)
CloseHandle (hFileMapping);
if(hFile != NULL)
CloseHandle (hFile);
return ret_val ;
}
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/