Как задать смещение поля в структуре.

Тема в разделе "LANGS.C", создана пользователем asd, 13 май 2009.

  1. asd

    asd New Member

    Публикаций:
    0
    Регистрация:
    12 мар 2005
    Сообщения:
    952
    Адрес:
    Russia
    есть программа, у неё есть свои внутренние структуры. В определённый момент управление попадает на пой код и в esi лежит адрес почти полностью неизвестной мне структуры. Чтобы нормально работать с известными мне полями объявляю её таким образом:
    Код (Text):
    1. typedef struct{
    2.     char    unknown[0x20];
    3.     int SomeField1;
    4.     char    unknown2[0x30];
    5.     int SomeField2;
    6. }SOME_STRUCT,*PSOME_STRUCT;
    можно как-нибудь сказать компилятору, что SomeField1 имеет смещение 0x20, а SomeField2 0x54 и обойтись без всяких unknownX
     
  2. TSS

    TSS New Member

    Публикаций:
    0
    Регистрация:
    13 апр 2009
    Сообщения:
    494
    Если я правильно понял вопрос, то:
    Код (Text):
    1. #pragma pack(1)
    2.  
    3. typedef struct{
    4.     char    unknown[0x20];
    5.     int SomeField1;
    6.     char    unknown2[0x30];
    7.     int SomeField2;
    8. }SOME_STRUCT,*PSOME_STRUCT;
    9.  
    10. #pragma pack()
     
  3. iZzz32

    iZzz32 Sergey Sfeli

    Публикаций:
    0
    Регистрация:
    3 сен 2006
    Сообщения:
    355
    Никак.
     
  4. asd

    asd New Member

    Публикаций:
    0
    Регистрация:
    12 мар 2005
    Сообщения:
    952
    Адрес:
    Russia
    TSS нет не правильно.
    iZzz32 жаль:dntknw:

    Ещё мнения будут?:)
     
  5. GoldFinch

    GoldFinch New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2008
    Сообщения:
    1.775
    используя #define можно свернуть
    char unknown2[0x30]; int SomeField2;
    в макрос, но необходимо считать текущее смещение, значит это будет 1 большой макрос со многими параметрами
     
  6. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    #define STRUCT_FIELD(instance,field_offset,type) (*(type*)((UCHAR*)(instance) + (ULONG)(field_offset)))
     
  7. asd

    asd New Member

    Публикаций:
    0
    Регистрация:
    12 мар 2005
    Сообщения:
    952
    Адрес:
    Russia
    Great
    Предлагаешь создавать свою структуру и выдёргивать нужные поля твоим макросом? Не вариант - структура большая, и сколько мне потребуется полей из нею я пока не знаю. Но вероятно больше нескольких десятков.

    Мне нужно что-то типа:
    Код (Text):
    1. typedef struct _SOME_STRUCT{
    2.     char    unknownX[0x3c - offsetof(_SOME_STRUCT,  unknownX)];
    3.     int SomeField1;
    4. }SOME_STRUCT,*PSOME_STRUCT;
    Но это нифига не компилится, и думается никак не скомпилится.
     
  8. TSS

    TSS New Member

    Публикаций:
    0
    Регистрация:
    13 апр 2009
    Сообщения:
    494
    asd
    >Чтобы нормально работать с известными мне полями объявляю её таким образом
    Что означает "нормально работать" с известными полями? И чем всеже мешают остальные поля?
     
  9. asd

    asd New Member

    Публикаций:
    0
    Регистрация:
    12 мар 2005
    Сообщения:
    952
    Адрес:
    Russia
    TSS
    нормально работать означает обращатьчя через xxx->SomeField1
    А остальные поля мне совсем не мешают, а вот вычислять их размер руками лень. А ещё когда где-то внутри unknownX появляется известное поле, то unknownX надо разбить на 2(перед и после появившегося поля) -> опять вычислять их размеры.
     
  10. r90

    r90 New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2005
    Сообщения:
    898
    asd
    делай как Great говорит. Это наименее геморный способ. Надо просто завести enum в котором перечислить все смещения полей, и использовать предложенный макрос.
    Или напиши препроцессор для своего заголовка, который будет править запись вида (например):
    Код (Text):
    1. struct
    2. {
    3.  @offset 0x37 int field1;
    4.  @offset 0x92 char field2[12];
    5. };
    Править и приводить к
    Код (Text):
    1. struct
    2. {
    3.     char unknown01[0x37];
    4.     int field1;
    5.     char unknown02[0x92-0x37-sizeof(int)*12];
    6.     char field2[12];
    7. };
    Средствами C всё равно не удастся объявить структурку так, чтобы потом с ней было бы удобно работать.
     
  11. GoldFinch

    GoldFinch New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2008
    Сообщения:
    1.775
    Код (Text):
    1. #define STRUCT(name,t1,n1,o1,t2,n2,o2,t3,n3,o3,......) \
    2. struct name { \
    3. char unk1[o1]; t1 n1; \
    4. char unk2[o2-o1-sizeof(t1)]; t2 n2; \
    5. char unk3[o3-o2-sizeof(t2)]; t3 n3; \
    6. char unk4[o4-o3-sizeof(t3)]; t4 n4; \
    7. .....
    8. };
    9.  
    10. //использование:
    11. STRUCT( Foo,
    12.   int,field1,0x20,
    13.   char,field2,0x54,
    14.   int,field3,0x78
    15. )
    однако в этом случае нельзя объявить поле-массив "type name[size];"