FindResource и RT_ICON

Тема в разделе "WASM.BEGINNERS", создана пользователем _nic, 22 июн 2011.

  1. _nic

    _nic New Member

    Публикаций:
    0
    Регистрация:
    4 фев 2007
    Сообщения:
    372
    Пытаюсь добратся до списка иконок в экзешники.
    Код (Text):
    1. HMODULE lib=LoadLibraryW(OpenDialog1->FileName.c_str());
    2.     if(lib==NULL){ShowMessage("PE load fail");}
    3.     HRSRC res;
    4.     AnsiString str;
    5.     TStream *sm;
    6.     for(int i=0;i<100;i++)
    7.     {
    8.         str="#"+AnsiString(i);
    9.         res=FindResource(lib,str.c_str(),RT_ICON);
    10.         if(res!=NULL)
    11.         {
    12.             /*SetLastError(0);
    13.             HGLOBAL dat=LoadResource(lib,res);
    14.             void *resmem=LockResource(dat);
    15.             //Form1->Memo1->Lines->Add(GetLastError());
    16.             HANDLE f=CreateFileA("test.ico",GENERIC_WRITE,FILE_SHARE_WRITE,0,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,0);
    17.             DWORD w=0;
    18.             WriteFile(f,resmem,SizeofResource(lib,res),&w,0);
    19.             CloseHandle(f);
    20.             //sm->ReadBuffer(resmem,SizeofResource(lib,res));
    21.             break;  */
    22.             Form1->Memo1->Lines->Add(str+"sz:"+AnsiString(SizeofResource(lib,res)).c_str());
    23.         }
    24.     }
    Вроде бы по началу все ОК.Результаты того что возвращяет FindResource,совпадает с тем что отображает reshacker.Но прочитать содержимое по указателю от FindResource невыходит.GetLastError() возвращяет ERROR_ACCESS_DENIED.Почему нельзя считать содержимое иконки,по её имени?
     
  2. Sunzer

    Sunzer Member

    Публикаций:
    0
    Регистрация:
    25 май 2008
    Сообщения:
    256
    Прикрипите еще скомпилированый фаел

    http://msdn.microsoft.com/en-us/library/ms648047(v=vs.85).aspx

     
  3. _nic

    _nic New Member

    Публикаций:
    0
    Регистрация:
    4 фев 2007
    Сообщения:
    372
    Чего то я непонял...Мой инглишь не совсем ок.Что значит "lock"? Использование ф-ции LockResource,или выдергивание данных по указателю FindResource.Но в последнем случае мне не понятно,какого тогда надо это FindResource ???
     
  4. dinoweb

    dinoweb Дмитрий

    Публикаций:
    0
    Регистрация:
    12 окт 2005
    Сообщения:
    129
    Адрес:
    Россия. Красноярск
    Иконки редко имеют имена, обычно номер. Пробовали загружать по номерам?
    Код (Text):
    1.         res = FindResource(lib, (LPCWSTR) i, (LPCWSTR)RT_ICON);
    С таким изменением ваш код у меня работает.
    Кстати, в ресурсах не хранятся заголовки иконок, поэтому писать вот так:
    Код (Text):
    1.  HANDLE f=CreateFileA("test.ico",GENERIC_WRITE,FILE_SHARE_WRITE,0,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,0);
    2.  DWORD w = 0;
    3.  WriteFile(f, resmem, SizeofResource(lib,res), &w, 0);
    не корректно. вы не увидите значок.
    заголовки иконок хранятся отдельно, в ресурсе RT_GROUP_ICON, (и имеют почти идентичную структуру что и в файле ICO)
     
  5. Sunzer

    Sunzer Member

    Публикаций:
    0
    Регистрация:
    25 май 2008
    Сообщения:
    256
    Загружаем RT_ICON_GROUP, и парсим его, читая иконки на которые он ссылкается, делаем в хидере маленьний фикс, и по порядку дописываем RT_ICON

    Код (Text):
    1. int ResourceKit::ExtractMainIcon(char *IconPath, bool SaveToFile, byte **DataPointer, DWORD *DataSizePointer)
    2. {
    3.  int i;
    4.  WORD IconNum;
    5.  DWORD GROUP_ICON_Pointer,IconSize;
    6.  struct struct_RT_GROUP_ICON *Icons;
    7.  struct IcoStruct *NewIcons;
    8.  byte *VirtualIcon;
    9.  
    10.  GetResourceInfo(RT_GROUP_ICON, NULL, 0);
    11.  
    12.  /* Если в файле нет RT_GROUP_ICON */
    13.  if(GetResourceInfo_Result.RvaOffset == 0) return RK_FAIL;
    14.  
    15.  GROUP_ICON_Pointer = RVA2RAW(GetResourceInfo_Result.RvaOffset);
    16.  IconNum  = *(PWORD) &VirtualFile[GROUP_ICON_Pointer+4];
    17.  Icons    = (struct struct_RT_GROUP_ICON*) calloc(IconNum, sizeof(struct struct_RT_GROUP_ICON));
    18.  NewIcons = (struct IcoStruct*) calloc(IconNum, sizeof(struct IcoStruct));
    19.  
    20.  for(i=0;i<IconNum;i++)
    21.  {
    22.   memcpy(&Icons[i],&VirtualFile[GROUP_ICON_Pointer+6+sizeof(struct struct_RT_GROUP_ICON)*i], sizeof(struct struct_RT_GROUP_ICON));
    23.   memcpy(&NewIcons[i], &Icons[i], sizeof(struct IcoStruct));
    24.   NewIcons[i].ImageOffset = 0;
    25.  }
    26.  
    27.  IconSize = 6+sizeof(IcoStruct)*IconNum; // DWORD константа, WORD кол-во иконок
    28.  VirtualIcon = (byte*) malloc(IconSize);
    29.  *(PWORD) &VirtualIcon[0] = 0x0000;
    30.  *(PWORD) &VirtualIcon[2] = 0x0001;
    31.  *(PWORD) &VirtualIcon[4] = IconNum;
    32.  
    33.  for(i=0;i<IconNum;i++)
    34.  {
    35.   memcpy(&VirtualIcon[6+sizeof(struct IcoStruct)*i], &NewIcons[i], sizeof(struct IcoStruct));
    36.   GetResourceInfo(RT_ICON, NULL, Icons[i].RT_ICON_ORD-1);
    37.   IconSize += GetResourceInfo_Result.RawSize;
    38.   VirtualIcon = (byte*) realloc(VirtualIcon, IconSize);
    39.   memcpy(&VirtualIcon[IconSize - GetResourceInfo_Result.RawSize], &VirtualFile[RVA2RAW(GetResourceInfo_Result.RvaOffset)], GetResourceInfo_Result.RawSize);
    40.   *(PDWORD) &VirtualIcon[6+sizeof(IcoStruct)*(i+1)-4] = IconSize - GetResourceInfo_Result.RawSize;
    41.  }
    42.  
    43.  /* Сохраняем в файл ICO файл, или передаем указатель на массив в памяти */
    44.  if(SaveToFile)
    45.  {
    46.   SaveMemoryToFile(IconPath, VirtualIcon, IconSize);
    47.   free(Icons);
    48.   free(NewIcons);
    49.   free(VirtualIcon);
    50.  }
    51.   else
    52.  {
    53.   *DataPointer = VirtualIcon;
    54.   *DataSizePointer = IconSize;
    55.  }
    56.  
    57.  return RK_SUCCESS;
    58. }
     
  6. dinoweb

    dinoweb Дмитрий

    Публикаций:
    0
    Регистрация:
    12 окт 2005
    Сообщения:
    129
    Адрес:
    Россия. Красноярск
    И я примером поделюсь (создание файла иконки, без использования RT_GROUP_ICON. такой способ не вполне правильный (правильный способ приведён выше), но юзабельный)

    Код (Text):
    1. QByteArray icon_data;
    2. QByteArray icon_bmp;
    3.  
    4. uint bmp_width = 0;
    5. uint bmp_height = 0;
    6. uint bmp_planes = 0;
    7. uint bmp_colors = 0;
    8. uint bmp_bpp = 0;
    9.  
    10. // my_object - хранит данные ресурса RT_ICON
    11. icon_bmp = my_object->readAll();
    12. bmp_width = my_object->readDword(0x04);
    13. bmp_height = my_object->readDword(0x08);
    14. bmp_planes = my_object->readWord(0x0C);
    15. bmp_bpp = my_object->readWord(0x0E);
    16. bmp_colors = my_object->readDword(0x20);
    17.  
    18. struct
    19. {
    20.     ushort sign;
    21.     ushort type;
    22.     ushort count;
    23. } icon_header;
    24.  
    25. icon_header.sign = 0;
    26. icon_header.type = 1;
    27. icon_header.count = 1;
    28.  
    29. struct
    30. {
    31.     uchar width;
    32.     uchar height;
    33.     uchar colors;
    34.     uchar reserved;
    35.     ushort planes;
    36.     ushort bpp;
    37.     uint size;
    38.     uint offset;
    39. } icon_item;
    40.  
    41. icon_item.width = bmp_width;
    42. icon_item.height = bmp_height >> 1;
    43. icon_item.colors = bmp_colors;
    44. icon_item.reserved = 0;
    45. icon_item.planes = bmp_planes;
    46. icon_item.bpp = bmp_bpp;
    47. icon_item.size = icon_bmp.size();
    48. icon_item.offset = 0x16;
    49.  
    50. icon_data.append((char*)&icon_header, 0x06);
    51. icon_data.append((char*)&icon_item, 0x10);
    52. icon_data.append(icon_bmp, icon_item.size);
    53.  
    54. // Далее записываем icon_data в файл, и видим иконку. профит.
     
  7. _nic

    _nic New Member

    Публикаций:
    0
    Регистрация:
    4 фев 2007
    Сообщения:
    372
    Это откудого такой код?
     
  8. Sunzer

    Sunzer Member

    Публикаций:
    0
    Регистрация:
    25 май 2008
    Сообщения:
    256
    Из головы, откуда же еще.