Получение названия экспортированных функций из DLL

Данный пример вытаскивает все (даже недокументированные) экспортируемые названия функций из файла библиотеки DLL. Для примера взят файл User32.DLL
Платформы: Windows
Автор: Станислав Будинов, создано в 2011 году.

получение функций dll

#INCLUDE "windows.bi"
#DEFINE NTSIGNATURE(a) (Cast(Byte Ptr,a) + (Cast(PIMAGE_DOS_HEADER,a)->e_lfanew))
#DEFINE MakePtr(Type_, Base, Offset) (Cast(Type_,(Cast(Uinteger,Base) + Cast(Uinteger,Offset))))

Dim As HMODULE hUser32
Dim As PIMAGE_DOS_HEADER pDOSHead
Dim As PIMAGE_NT_HEADERS pPEHeader
Dim As IMAGE_FILE_HEADER FileHeader
Dim As PIMAGE_EXPORT_DIRECTORY pImportDesc
Dim As IMAGE_OPTIONAL_HEADER Ptr OptionHeader
Dim As Integer TMem

Sub Error_Dll(Byval Er As String)
    MessageBox(0,Er,"Error",0)
    End
End Sub

hUser32=GetModuleHandle("user32")
If hUser32=0 Then Error_Dll("Error Load User32")
pDOSHead = Cast(PIMAGE_DOS_HEADER,hUser32)
If pDOSHead->e_magic <> IMAGE_DOS_SIGNATURE Then Error_Dll("Error Dos Header signature MZ")
pPEHeader=Cast(PIMAGE_NT_HEADERS,NTSIGNATURE(pDOSHead))
If pPEHeader->Signature <> IMAGE_NT_SIGNATURE Then Error_Dll("Error PE Header signature PE")
FileHeader=Cast(IMAGE_FILE_HEADER,pPEHeader->FileHeader)
If FileHeader.Machine<>IMAGE_FILE_MACHINE_I386 Then Error_Dll("Error Not 386 Proccesor")
OptionHeader=cast(IMAGE_OPTIONAL_HEADER Ptr,@pPEHeader->OptionalHeader)
pImportDesc=MakePtr(PIMAGE_EXPORT_DIRECTORY,hUser32,OptionHeader->DataDirectory(0).VirtualAddress)

For i As Integer=0 To pImportDesc->NumberOfNames-1
    Tmem = Cast(Integer,(Cast(Integer Ptr ,pImportDesc->AddressOfNames)+i))
    Dim As Zstring Ptr Ptr ST = (MakePtr(Zstring Ptr Ptr,hUser32,Tmem))
    Dim As Zstring Ptr pszST = MakePtr(Zstring Ptr,hUser32,*ST)
    ? i+1 & "   "& *pszSt
Next
Sleep