当时做一个软件的副产品,贴出来,供有需要的参考(VB代码)。
代码:
' PE 文件资源部分结构 Private Type IMAGE_RESOURCE_DIRECTORY Characteristics As Long TimeDateStamp As Long MajorVersion As Integer MinorVersion As Integer NumberOfNamedEntries As Integer NumberOfIdEntries As Integer End Type Private Type IMAGE_RESOURCE_DIRECTORY_ENTRY Name As Long OffsetToData As Long End Type Private Type IMAGE_RESOURCE_DATA_ENTRY OffsetToData As Long Size As Long CodePage As Long Reserved As Long End Type '资源数据结构 Private Type ResourceLeafInfo nTypeID As Long '资源类型 pStructRA As Long '此资源的 IMAGE_RESOURCE_DATA_ENTRY 结构相对地址(从资源段算起) pDataAA As Long '此资源的绝对地址(从文件首部算起) cbSize As Long '资源大小 End Type '递归遍历资源树,获得叶节点相关数据 Private Sub PickLeaves(hFile As Long, _ pResOffset As Long, _ pNodeEntry As Long, _ nTypeID As Long, _ tResLeafInfo() As ResourceLeafInfo) Dim tResDir As IMAGE_RESOURCE_DIRECTORY Dim tResDirEntry As IMAGE_RESOURCE_DIRECTORY_ENTRY Dim tResDataEntry As IMAGE_RESOURCE_DATA_ENTRY Dim i As Long Call llseek(hFile, pResOffset + pNodeEntry, FILE_BEGIN) Call lread(hFile, tResDir, Len(tResDir)) For i = 0 To tResDir.NumberOfIdEntries + tResDir.NumberOfNamedEntries - 1 Call llseek(hFile, pResOffset + pNodeEntry + Len(tResDir) + Len(tResDirEntry) * i, FILE_BEGIN) Call lread(hFile, tResDirEntry, Len(tResDirEntry)) If CBool(tResDirEntry.OffsetToData And &H80000000) Then '指向下一个目录节点 Call PickLeaves(hFile, pResOffset, tResDirEntry.OffsetToData And &H7FFFFFFF, nTypeID, tResLeafInfo()) Else '指向数据入口 Call llseek(hFile, pResOffset + tResDirEntry.OffsetToData, FILE_BEGIN) Call lread(hFile, tResDataEntry, Len(tResDataEntry)) ReDim Preserve tResLeafInfo(UBound(tResLeafInfo) + 1) As ResourceLeafInfo With tResLeafInfo(UBound(tResLeafInfo)) .nTypeID = nTypeID .pStructRA = tResDirEntry.OffsetToData .pDataAA = tResDataEntry.OffsetToData .cbSize = tResDataEntry.Size End With End If Next i End Sub