Ресуры поиск icon group по идентификатору icon

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
ALX_2002
Мега гуру
Мега гуру
 
Сообщения: 2054
Зарегистрирован: 25.11.2002 (Пн) 20:03

Ресуры поиск icon group по идентификатору icon

Сообщение ALX_2002 » 12.02.2017 (Вс) 21:30

Доброго времени суток всем. Сейчас ковыряюсь с чтением данных из ресурсов через res протокол. Возник вопрос - есть ли алгоритм поиска группы иконок (ICON GROUP), которой принадлежит иконка (ICON) по идентификатору иконки ?

На примере: Если открыть файл shell32.dll в любом менджере ресуросов(PE Explorer / Resource Hacker), то можно увидеть, что иконки с идентификаторами (1-8) принадлежат группе (62998)
256 × 256 (16.8mil colors) - Ordinal name: 1
64 × 64 (16.8mil colors) - Ordinal name: 2
48 × 48 (16.8mil colors) - Ordinal name: 3
40 × 40 (16.8mil colors) - Ordinal name: 4
32 × 32 (16.8mil colors) - Ordinal name: 5
24 × 24 (16.8mil colors) - Ordinal name: 6
20 × 20 (16.8mil colors) - Ordinal name: 7
16 × 16 (16.8mil colors) - Ordinal name: 8


Для чего мне это нужно ? Пытаюсь допилить загрузчик иконок через res протокол не используя сторонние COM объекты и соответствено API функции.

Беда в том, что иконки хранящиеся как PNG (Например ICON 203) выгружаются нормально, а иконки формата ICO выгружаются без заголовков, из-за этого не отображаются нормально при просмотре. Пример можно наблюдать в простой HTML странице:

Код: Выделить всё
<!DOCTYPE html>
<html>
   <head>
      <title>trouble sample</title>
   </head>
   <body>
      <img src="res://shell32.dll/3/203">
      <img src="res://shell32.dll/3/204">
   </body>
</html>


Пошарив в гугле и почитав MSDN, выяснил, что для выгрузки иконки в полноценном виде, нужно найти её ICON GROUP, в нём можно найти информацию о размере, цветности и т.п параметрах изображения. Тогда можно собрать заголовок, "прицепить" к выгруженным данным и получить нормальную просматриваемую иконку.

Пока разобрался, что ресурс ICON GROUP содержит всю информацию о хранимых иконках:
Код: Выделить всё
Dim oReader
Dim oStream
Dim i
Dim sTmp

Set oReader = CreateObject("MSXML2.XMLHTTP")
oReader.Open "?","res://shell32.dll/14/62998"
oReader.Send

Dim imgCount, nImg

print("Reserved: " & GetBytes(2))
print("Type: " & GetBytes(2))
imgCount = GetBytes(2)
print("ImageCount:" & imgCount)

For nImg = 1 to ImgCount
   print("Width: " & GetBytes(1))
   print("Height: " & GetBytes(1))
   print("Colors: " & GetBytes(1))
   print("Reserved: " & GetBytes(1))
   print("Planes: " & GetBytes(2))
   print("BitsPerPixel: " & GetBytes(2))
   print("ImageSize: " & GetBytes(4))
   print("ImageOffset: " & GetBytes(2))
   print("-----------------------------")
Next

MsgBox sTmp

Function print(text)
   sTmp = sTmp & text & vbCrlf
End Function

Function GetBytes(n)
   GetBytes = AscB(MidB(oReader.ResponseBody,i+1,n))
   i = i + n
End Function


Но пока никак не могу найти информацию о том, как (и можно ли) найти обратную связь от идентификатора иконки к её группе.

Если я правильно понял, то API функция FindResource как раз позволяет это сделать.
Вопрос в том как она работает. Неужели шерстит перебором все группы иконок и ищет совпадение с идентификатором искомой иконки ? Не может же быть такого ?

P.S Если алгоритм существует, поделитесь пожалуйста описанием / ссылкой / т.п. Заранее благодарю. :roll:

Teranas
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 224
Зарегистрирован: 13.12.2008 (Сб) 4:26
Откуда: Новосибирск

Re: Ресуры поиск icon group по идентификатору icon

Сообщение Teranas » 14.02.2017 (Вт) 4:01

Функция FindResource

Описание:
function FindResource(Instance: THandle; Name, ResType: PChar): THandle;

Находит pесуpс в файле pесуpсов.

Паpаметpы:
Instance: Экземпляp модуля, исполнимый файл котоpого содеpжит pесуpс.
Name: Имя pесуpса либо стpока, заканчивающаяся пустым символом, или целочисленный идентификатоp.
ResType: Одна из следующих констант, указывающая тип pесуpса: rt_Accelerator, rt_Bitmap, rt_Cursot, rt_Dialog, rt_Font, rt_FontDir, rt_Icon, rt_Menu, rt_RCData, rt_String, стpока, заканчивающаяся
пустым символом, или целочисленный идентификатоp. См. pаздел "Типы pесуpсов, rt_" в главе 1.

Возвpащаемое значение:
Идентификатоp pесуpса; 0 - если pесуpс не найден.

функция находится в файле kernel32.dll

Код: Выделить всё
Private Declare Function FindResource Lib "kernel32" Alias "FindResourceA" (ByVal hInstance As Long, ByVal lpName As String, ByVal lpType As String) As Long
Private Declare Function FindResourceEx Lib "kernel32" Alias "FindResourceExA" (ByVal hModule As Long, ByVal lpType As String, ByVal lpName As String, ByVal wLanguage As Long) As Long
Private Declare Function BeginUpdateResource Lib "kernel32" Alias "BeginUpdateResourceA" (ByVal pFileName As String, ByVal bDeleteExistingResources As Long) As Long
Private Declare Function UpdateResource Lib "kernel32" Alias "UpdateResourceA" (ByVal hUpdate As Long, ByVal lpType As String, ByVal lpName As String, ByVal wLanguage As Long, lpData As Any, ByVal cbData As Long) As Long
Private Declare Function EndUpdateResource Lib "kernel32" Alias "EndUpdateResourceA" (ByVal hUpdate As Long, ByVal fDiscard As Long) As Long
Private Declare Function LoadResource Lib "kernel32" Alias "LoadResource" (ByVal hInstance As Long, ByVal hResInfo As Long) As Long
Private Declare Function LockResource Lib "kernel32" Alias "LockResource" (ByVal hResData As Long) As Long
Private Declare Function SizeofResource Lib "kernel32" Alias "SizeofResource" (ByVal hInstance As Long, ByVal hResInfo As Long) As Long
С уважением, Андрей.

ALX_2002
Мега гуру
Мега гуру
 
Сообщения: 2054
Зарегистрирован: 25.11.2002 (Пн) 20:03

Re: Ресуры поиск icon group по идентификатору icon

Сообщение ALX_2002 » 14.02.2017 (Вт) 10:43

Teranas, перевод это конечно очень хорошо :roll:, но я английский знаю на достаточном уровне, чтобы прочитать и понять описание функции. Если Вы внимательно прочитали моё сообщение, то наверное заметили, что меня интересует не описание функции, а механизм её работы внутри. Так как я планировал найти способ реализовать её функционал в VBScript.

neit95
Начинающий
Начинающий
Аватара пользователя
 
Сообщения: 14
Зарегистрирован: 10.03.2013 (Вс) 22:05
Откуда: Калининград

Re: Ресуры поиск icon group по идентификатору icon

Сообщение neit95 » 03.03.2017 (Пт) 21:55

Не по теме:
VBScript могёт работать с бинарниками? Если да, то поясните как. Последний раз, когда я им пользовался, на нём читали только текстовые файлы, да и то не совсем "из коробки".

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Re: Ресуры поиск icon group по идентификатору icon

Сообщение alibek » 04.03.2017 (Сб) 10:37

neit95 писал(а):Последний раз, когда я им пользовался, на нём читали только текстовые файлы

И как это было?
Lasciate ogni speranza, voi ch'entrate.

ALX_2002
Мега гуру
Мега гуру
 
Сообщения: 2054
Зарегистрирован: 25.11.2002 (Пн) 20:03

Re: Ресуры поиск icon group по идентификатору icon

Сообщение ALX_2002 » 08.03.2017 (Ср) 12:32

neit95, Да, для работы в binary mode подойдут SAPI.spFileStream / ADODB.Stream и в принципе даже Scripting.FileSystemObject при должной конвертации данных подойдёт.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Ресуры поиск icon group по идентификатору icon

Сообщение Хакер » 08.03.2017 (Ср) 17:14

Всё никак не могу добраться до темы. На обработке ресурсов PE съел собаку. Вопрос всё ещё актуален?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

The trick
Постоялец
Постоялец
 
Сообщения: 781
Зарегистрирован: 26.06.2010 (Сб) 23:08

Re: Ресуры поиск icon group по идентификатору icon

Сообщение The trick » 08.03.2017 (Ср) 17:47

viewtopic.php?f=99&t=52469 там есть небольшое описание ресурсов, а также код извлечения всех ресурсов.
UA6527P

ALX_2002
Мега гуру
Мега гуру
 
Сообщения: 2054
Зарегистрирован: 25.11.2002 (Пн) 20:03

Re: Ресуры поиск icon group по идентификатору icon

Сообщение ALX_2002 » 09.03.2017 (Чт) 19:26

The trick, благодарю :) ! Буду вникать
Хакер, да. Ещё актуально )

neit95
Начинающий
Начинающий
Аватара пользователя
 
Сообщения: 14
Зарегистрирован: 10.03.2013 (Вс) 22:05
Откуда: Калининград

Re: Ресуры поиск icon group по идентификатору icon

Сообщение neit95 » 18.03.2017 (Сб) 22:48

alibek писал(а):И как это было?

FSO разумеется.

ALX_2002, спасибо, гляну на досуге.


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: Google-бот, Yandex-бот и гости: 28

    TopList