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
勘違いしてました。以下の修正でいける様です。
> 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
ツイート | ![]() |