Listing the exported functions of a DLL
Asked Answered
T

2

7

I'm looking for a way (in C++/Windows) to list the exported functions of a DLL (and maybe even methods which are not exported) using dbgHelp.
Does anybody know which method can do it?

Tract answered 4/12, 2010 at 10:39 Comment(4)
possible duplicate of Win32 API to enumerate dll export functions?Arlenarlena
A debugger doesn't care whether a function is exported or not. Code sample is here: msdn.microsoft.com/en-us/library/ms679318%28VS.85%29.aspxPiste
but I'm looking at a case in which I don't have the PDBs. Will SymLoadModuleEx help me here?Tract
hmm... "SymEnumSymbols", not SymLoadModuleEx, I don't know why I wrote it...Tract
D
10

There is code here to do this. I have cleaned it up a bit and it worked in the scenario shown below, retrieving function names from Kernel32.Dll.

#include "imagehlp.h"

void ListDLLFunctions(string sADllName, vector<string>& slListOfDllFunctions)
{
    DWORD *dNameRVAs(0);
    _IMAGE_EXPORT_DIRECTORY *ImageExportDirectory;
    unsigned long cDirSize;
    _LOADED_IMAGE LoadedImage;
    string sName;
    slListOfDllFunctions.clear();
    if (MapAndLoad(sADllName.c_str(), NULL, &LoadedImage, TRUE, TRUE))
    {
        ImageExportDirectory = (_IMAGE_EXPORT_DIRECTORY*)
            ImageDirectoryEntryToData(LoadedImage.MappedAddress,
            false, IMAGE_DIRECTORY_ENTRY_EXPORT, &cDirSize);
        if (ImageExportDirectory != NULL)
        {
            dNameRVAs = (DWORD *)ImageRvaToVa(LoadedImage.FileHeader, 
                LoadedImage.MappedAddress,
            ImageExportDirectory->AddressOfNames, NULL);
            for(size_t i = 0; i < ImageExportDirectory->NumberOfNames; i++)
            {
                sName = (char *)ImageRvaToVa(LoadedImage.FileHeader, 
                        LoadedImage.MappedAddress,
                       dNameRVAs[i], NULL);
             slListOfDllFunctions.push_back(sName);
            }
        }
        UnMapAndLoad(&LoadedImage);
    }
}

int main(int argc, char* argv[])
{
    vector<string> names;
    ListDLLFunctions("KERNEL32.DLL", names);

    return 0;   
}
Dinitrobenzene answered 4/12, 2010 at 17:17 Comment(1)
The OP is asking for a dbghelp-based solution, which would include non-exported symbols...Epicedium
E
11

If you're content with other tools then there are a number that do list exported functions. One is Microsoft's dumpbin, use the /exports option.

Evetteevey answered 4/12, 2010 at 11:2 Comment(1)
The query is about using dbgHelp Apis.Mucous
D
10

There is code here to do this. I have cleaned it up a bit and it worked in the scenario shown below, retrieving function names from Kernel32.Dll.

#include "imagehlp.h"

void ListDLLFunctions(string sADllName, vector<string>& slListOfDllFunctions)
{
    DWORD *dNameRVAs(0);
    _IMAGE_EXPORT_DIRECTORY *ImageExportDirectory;
    unsigned long cDirSize;
    _LOADED_IMAGE LoadedImage;
    string sName;
    slListOfDllFunctions.clear();
    if (MapAndLoad(sADllName.c_str(), NULL, &LoadedImage, TRUE, TRUE))
    {
        ImageExportDirectory = (_IMAGE_EXPORT_DIRECTORY*)
            ImageDirectoryEntryToData(LoadedImage.MappedAddress,
            false, IMAGE_DIRECTORY_ENTRY_EXPORT, &cDirSize);
        if (ImageExportDirectory != NULL)
        {
            dNameRVAs = (DWORD *)ImageRvaToVa(LoadedImage.FileHeader, 
                LoadedImage.MappedAddress,
            ImageExportDirectory->AddressOfNames, NULL);
            for(size_t i = 0; i < ImageExportDirectory->NumberOfNames; i++)
            {
                sName = (char *)ImageRvaToVa(LoadedImage.FileHeader, 
                        LoadedImage.MappedAddress,
                       dNameRVAs[i], NULL);
             slListOfDllFunctions.push_back(sName);
            }
        }
        UnMapAndLoad(&LoadedImage);
    }
}

int main(int argc, char* argv[])
{
    vector<string> names;
    ListDLLFunctions("KERNEL32.DLL", names);

    return 0;   
}
Dinitrobenzene answered 4/12, 2010 at 17:17 Comment(1)
The OP is asking for a dbghelp-based solution, which would include non-exported symbols...Epicedium

© 2022 - 2024 — McMap. All rights reserved.