какип бывают типы имён ресурсов?

Тема в разделе "WASM.BEGINNERS", создана пользователем amvoz, 31 янв 2012.

  1. amvoz

    amvoz Member

    Публикаций:
    0
    Регистрация:
    12 ноя 2008
    Сообщения:
    640
    Друзья! Вот, допустим, мне нужны имена ресурсов экзешника, я использую эту функцию и она возвращает мне их числовые тык скыть идентификаторы:
    http://msdn.microsoft.com/en-us/library/windows/desktop/ms648034(v=vs.85).aspxА вот если чё код, вот тут ищутся имена типов ресурсов, имена ресурсов и имена языка ресурсов.

    Код (Text):
    1. #include <windows.h>
    2. #include <stdio.h>
    3.  
    4. // Объявление функций повторного вызова.
    5. BOOL EnumTypesFunc(HANDLE hModule, LPTSTR  lpType, LONG lParam);
    6. BOOL EnumNamesFunc(HANDLE hModule, LPCTSTR lpType, LPTSTR lpName, LONG lParam);
    7. BOOL EnumLangsFunc(HANDLE hModule, LPCTSTR lpType, LPCTSTR lpName, WORD wLang, LONG lParam);
    8.  
    9. int main () {
    10.  SetConsoleCP (1251);
    11.  SetConsoleOutputCP (1251);
    12.  
    13.  
    14.  HANDLE hExe = LoadLibrary("notepad.exe");
    15.  EnumResourceTypes((HMODULE)hExe,(ENUMRESTYPEPROC)EnumTypesFunc, 0);
    16.  FreeLibrary((HMODULE)hExe);
    17.  getchar ();
    18. }
    19.  
    20. //    ФУНКЦИЯ: EnumTypesFunc(HANDLE, LPSTR, LONG)
    21. //    ПРЕДНАЗНАЧЕНИЕ:  Повторный вызов типа ресурса
    22. BOOL EnumTypesFunc(HANDLE hModule, LPTSTR lpType, LONG lParam) {
    23.      
    24.  //if ((ULONG)lpType & 0xFFFF0000){
    25.  if (!(IS_INTRESOURCE(lpType)))
    26.     printf("Имя типа строчное %s\n", lpType);    
    27.  else          
    28.     printf("Имя типа в виде числа %d\n", lpType);    
    29.  
    30.  EnumResourceNames((HMODULE)hModule, lpType, (ENUMRESNAMEPROC)EnumNamesFunc, 0);
    31.  
    32.  return TRUE;
    33. }
    34.  
    35.  
    36. //    ФУНКЦИЯ: EnumNamesFunc(HANDLE, LPSTR, LPSTR, LONG)
    37. //    ПРЕДНАЗНАЧЕНИЕ: повторный вызов имени ресурса
    38. BOOL EnumNamesFunc(HANDLE hModule, LPCTSTR lpType, LPTSTR lpName, LONG lParam) {
    39.    
    40.  //if ((ULONG)lpType & 0xFFFF0000){
    41.  if (!(IS_INTRESOURCE(lpType)))
    42.     printf("Имя ресурса строчное %s\n", lpName);    
    43.  else          
    44.     printf("Имя ресурса в виде числа %d\n", lpName);    
    45.  
    46.  // Найдем языки всех ресурсов типа lpType и имени lpName.
    47.  EnumResourceLanguages((HMODULE)hModule, lpType, lpName, (ENUMRESLANGPROC)EnumLangsFunc, 0);
    48.  return TRUE;
    49. }
    50.  
    51.  
    52.  
    53.  
    54. //    ФУНКЦИЯ: EnumLangsFunc(HANDLE, LPSTR, LPSTR, WORD, LONG)
    55. //    ПРЕДНАЗНАЧЕНИЕ: Повторный вызов языка Ресурса
    56. BOOL EnumLangsFunc(HANDLE hModule, LPCTSTR lpType, LPCTSTR lpName, WORD wLang, LONG lParam) {
    57.  //if ((ULONG)lpType & 0xFFFF0000){
    58.  if (!(IS_INTRESOURCE(lpType)))
    59.     printf("Имя языка в виде числа %s\n", wLang);    
    60.  else          
    61.     printf("Имя языка в виде числа %d\n\n", wLang);    
    62.     return TRUE;
    63. }
    Как-то так уж получилось что для первого и последнего задания есть помощь, для первого это куча макросров
    http://msdn.microsoft.com/en-us/library/windows/desktop/ms648009(v=vs.85).aspx
    для последнего какой-то MAKELANGID непонятный, ещё не разбирался

    А как узнать имя ресурса по его числу, получается у меня нет шанса вообще, так? Спасибо, кто откликнется!
     
  2. Ursus

    Ursus Member

    Публикаций:
    0
    Регистрация:
    15 мар 2006
    Сообщения:
    238
    Адрес:
    Russia
    нет никагого "имени по числу".
    ресурс может иметь либо целочисленный идентификатор, либо строковый. но не оба сразу.
     
  3. amvoz

    amvoz Member

    Публикаций:
    0
    Регистрация:
    12 ноя 2008
    Сообщения:
    640
    Допустим, тип имеет числовой идентификатор. Чтобы узнать что из себя представляет этот тип (не строковое представление, а просто что он такое- икона или ещё что) я обращусь к этой таблице:

    http://msdn.microsoft.com/en-us/library/windows/desktop/ms648009(v=vs.85).aspx
    (это я и называю "узнать имя по числу" и сдаётся мне, вы поняли, о чём речь )

    Вот как мне сделать нечто подобное с числовым идентификаторо имени ресурса?
     
  4. Ursus

    Ursus Member

    Публикаций:
    0
    Регистрация:
    15 мар 2006
    Сообщения:
    238
    Адрес:
    Russia
    А никак. Число и число.
     
  5. amvoz

    amvoz Member

    Публикаций:
    0
    Регистрация:
    12 ноя 2008
    Сообщения:
    640
    Если бы всё было так просто, я бы этим ограничился, но, майкрософтцы предлагают определять имя ресурса, пользуясь таблицей имён типов
    http://msdn.microsoft.com/en-us/library/windows/desktop/ms648034(v=vs.85).aspx

    "lpszName [in]

    Type: LPTSTR

    The name of a resource of the type being enumerated. Alternately, rather than a pointer, this parameter can be MAKEINTRESOURCE(ID), where ID is the integer identifier of the resource. For more information, see the Remarks section below.
    "

    Имя типа есть имя ресурса что ли?
     
  6. Sunzer

    Sunzer Member

    Публикаций:
    0
    Регистрация:
    25 май 2008
    Сообщения:
    256
    MAKEINTRESOURCE(RT_VERSION);

    RT_VERSION это именованная константа

    RT_VERSION = 16

    При возведенном 31 бите в имени, это строковое имя (RVA указатель на UNICODE строку, имя\тип ресурса), иначе это числовое значение ресурса.

    Список стандартных типов ресурсов приведен на сайте ms.

    Можно создавать и свои (именованные\числовые).

    Или я вопроса не понял?

    Код (Text):
    1. void ResourceKit::GetResourceType(DWORD Num)
    2. {
    3.  int i; short int WStringLen;
    4.  
    5.  GetResourceType_Result.iName = *(PDWORD) &VirtualFile[PE.ResourceTable+sizeof(ResourceDirectory)+sizeof(struct _ResourceDirectoryEntry)*Num];
    6.  
    7.  /* Используется указатель на UNICODE тип ресурса */
    8.  if(NameBitUnset(&GetResourceType_Result.iName) == 1)
    9.  {
    10.   WStringLen = *(PWORD) &VirtualFile[PE.ResourceTable+GetResourceType_Result.iName];
    11.   for(i=0;i<WStringLen;i++) cResourceType_tmp[i] = VirtualFile[PE.ResourceTable+GetResourceType_Result.iName+2+i*2];
    12.   cResourceType_tmp[WStringLen] = 0x0000; // Нультирминированая строка
    13.   GetResourceType_Result.cName = &cResourceType_tmp[0];
    14.   NameBitSet(&GetResourceType_Result.iName);
    15.  } else GetResourceType_Result.cName = NULL;
    16. }
     
  7. amvoz

    amvoz Member

    Публикаций:
    0
    Регистрация:
    12 ноя 2008
    Сообщения:
    640
    С типами понятно.
    Если бы всё было так просто, я бы этим ограничился, но, майкрософтцы предлагают определять имя ресурса, пользуясь таблицей имён типов


    "lpszName [in]

    Type: LPTSTR

    The name of a resource of the type being enumerated. Alternately, rather than a pointer, this parameter can be MAKEINTRESOURCE(ID), where ID is the integer identifier of the resource. For more information, see the Remarks section below.
    "

    Имя типа есть имя ресурса что ли?
     
  8. Sunzer

    Sunzer Member

    Публикаций:
    0
    Регистрация:
    25 май 2008
    Сообщения:
    256
    Ресурсы это дерево, с вложенностью до 2^31, но практически используется только три уровня:

    Главная директория:
    Типы ресурсов:
    Имя ресурса
    Язык ресурса

    Каждая директория описывается одной структурой, после которой идут вторые типы структур.

    Стандартные типы ресурсов RT_ICON RT_VERSION RT_BITMAP это числовое представление типов.

    Код (Text):
    1.  typedef struct _ResourceDirectory {
    2.   DWORD Flags;
    3.   DWORD TimeDateStamp;
    4.   WORD MajorVersion;
    5.   WORD MinorVersion;
    6.   WORD NumOfNameEntry;
    7.   WORD NumOfIdEntry;
    8.  } ResourceDirectory, *pResourceDirectory;
    9.  
    10.  typedef struct _ResourceDirectoryEntry {
    11.   DWORD Name;
    12.   DWORD OffsetToData;
    13.  } ResourceDirectoryEntry, *pResourceDirectoryEntry;
    14.  
    15.  typedef struct _ResourceDataEntry {
    16.   DWORD OffsetToData;
    17.   DWORD Size;
    18.   DWORD CodePage;
    19.   DWORD Reserved;
    20.  } ResourceDataEntry, *pResourceDataEntry;
     
  9. Ursus

    Ursus Member

    Публикаций:
    0
    Регистрация:
    15 мар 2006
    Сообщения:
    238
    Адрес:
    Russia
    Русским по белому написано "Alternately, rather than a pointer, this parameter can be MAKEINTRESOURCE(ID), where ID is the integer identifier of the resource."
    То есть, ресурс может иметь имя в виде строки, а может и нихрена не иметь имени, а вовсе даже просто числовой ID.
    Ето зависит только от фантазии программиста: захочет он - даст ресурсу имя, не захочет - будет у ресурса числовой ID.