CのサンプルをVB6に


ロート  2006-02-18 01:29:43  No: 94255

http://nienie.com/~masapico/api_ImageDirectoryEntryToData.html
Cのサンプル2:
user32.dllが(非遅延)インポートしている関数のリストを表示する。

をVB6に移植しているんですが、序数、ヒント、関数名が取得できません。
Cは超初心者クラスなので解読できていないためと思います。
気が付いた点がありましたらご教示お願いします。
以下は、現状のコードです。

Option Explicit
Private Declare Function LoadLibrary Lib "kernel32" Alias "LoadLibraryA" (ByVal lpLibFileName As String) As Long
Private Declare Function FreeLibrary Lib "kernel32" (ByVal hLibModule As Long) As Long
Private Type IMAGE_IMPORT_DESCRIPTOR
    OriginalFirstThunk As Long
    TimeDateStamp As Long
    ForwarderChain As Long
    Name As Long
    FirstThunk As Long
End Type
Private Declare Function ImageDirectoryEntryToData Lib "imagehlp" (ByVal Base As Long, ByVal MappedAsImage As Byte, ByVal DirectoryEntry As Integer, Size As Long) As Long
Private Declare Sub MoveMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)
Const IMAGE_ORDINAL_FLAG = &H80000000

Sub DispImportFuncs()
    Dim BaseAddress As Long
    Dim Size As Long
    Dim ImportDescriptor As IMAGE_IMPORT_DESCRIPTOR
    Dim pImpDesc As Long
    Dim pThunkData As Long
    Dim pImportByName As Long
    Dim s As String
    Dim u1Ordinal As Long
    Dim u1AddressOfData As Long
    Dim iHint As Integer
    '/* user32.dllを読み込み */
    BaseAddress = LoadLibrary("user32.dll")
    '/* インポートディレクトリを取得 */
    pImpDesc = ImageDirectoryEntryToData(BaseAddress, 0, IMAGE_DIRECTORY_ENTRY_IMPORT, Size)
    Call MoveMemory(ImportDescriptor, ByVal pImpDesc, Len(ImportDescriptor))
    '/* 各インポート関数名を表示 */
    While (ImportDescriptor.OriginalFirstThunk <> 0)
        s = String(260, 0)
        Call MoveMemory(ByVal s, ByVal BaseAddress + ImportDescriptor.Name, Len(s))
        Debug.Print "DLL名: "; Left(s, InStr(s, vbNullChar) - 1)
        pThunkData = BaseAddress + ImportDescriptor.OriginalFirstThunk
        Call MoveMemory(u1Ordinal, ByVal pThunkData, 4)
        While (u1Ordinal <> 0)
            If (u1Ordinal And IMAGE_ORDINAL_FLAG) Then
                Debug.Print "    序数: "; u1Ordinal And &HFFFF&
            Else
                u1AddressOfData = BaseAddress + u1Ordinal
                Call MoveMemory(pImportByName, ByVal u1AddressOfData, 4)
                Call MoveMemory(iHint, ByVal pImportByName, 2)
                s = String(260, 0)
                Call MoveMemory(ByVal s, ByVal pImportByName + 2, Len(s))
                Debug.Print "    ヒント: "; iHint, "関数名: "; Left(s, InStr(s, vbNullChar) - 1)
            End If
            pThunkData = pThunkData + 4
            Call MoveMemory(u1Ordinal, ByVal pThunkData, 4)
        Wend
        pImpDesc = pImpDesc + Len(ImportDescriptor)
        Call MoveMemory(ImportDescriptor, ByVal pImpDesc, Len(ImportDescriptor))
    Wend
    '/* 後処理 */
    Call FreeLibrary(BaseAddress)
End Sub


ロート  2006-02-18 03:20:20  No: 94256

勘違いしてました。以下の修正でいける様です。

>            If (u1Ordinal And IMAGE_ORDINAL_FLAG) Then
>                Debug.Print "    序数: "; u1Ordinal And &HFFFF&
>            Else
>                u1AddressOfData = BaseAddress + u1Ordinal
>                Call MoveMemory(pImportByName, ByVal u1AddressOfData, 4)
>                Call MoveMemory(iHint, ByVal pImportByName, 2)
>                s = String(260, 0)
>                Call MoveMemory(ByVal s, ByVal pImportByName + 2, Len(s))
>                Debug.Print "    ヒント: "; iHint, "関数名: "; Left(s, InStr(s, vbNullChar) - 1)
>            End If

[修正後]
            If (u1Ordinal And IMAGE_ORDINAL_FLAG) Then
                Debug.Print "    序数: "; Hex(u1Ordinal And &HFFFF&)
            Else
                u1AddressOfData = u1Ordinal
                pImportByName = BaseAddress + u1AddressOfData
                Call MoveMemory(iHint, ByVal pImportByName, 2)
                s = String(260, 0)
                Call MoveMemory(ByVal s, ByVal pImportByName + 2, Len(s))
                Debug.Print "    ヒント: "; Hex(iHint), "関数名: "; Left(s, InStr(s, vbNullChar) - 1)
            End If


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加