есть программа, у неё есть свои внутренние структуры. В определённый момент управление попадает на пой код и в esi лежит адрес почти полностью неизвестной мне структуры. Чтобы нормально работать с известными мне полями объявляю её таким образом: Код (Text): typedef struct{ char unknown[0x20]; int SomeField1; char unknown2[0x30]; int SomeField2; }SOME_STRUCT,*PSOME_STRUCT; можно как-нибудь сказать компилятору, что SomeField1 имеет смещение 0x20, а SomeField2 0x54 и обойтись без всяких unknownX
Если я правильно понял вопрос, то: Код (Text): #pragma pack(1) typedef struct{ char unknown[0x20]; int SomeField1; char unknown2[0x30]; int SomeField2; }SOME_STRUCT,*PSOME_STRUCT; #pragma pack()
используя #define можно свернуть char unknown2[0x30]; int SomeField2; в макрос, но необходимо считать текущее смещение, значит это будет 1 большой макрос со многими параметрами
#define STRUCT_FIELD(instance,field_offset,type) (*(type*)((UCHAR*)(instance) + (ULONG)(field_offset)))
Great Предлагаешь создавать свою структуру и выдёргивать нужные поля твоим макросом? Не вариант - структура большая, и сколько мне потребуется полей из нею я пока не знаю. Но вероятно больше нескольких десятков. Мне нужно что-то типа: Код (Text): typedef struct _SOME_STRUCT{ char unknownX[0x3c - offsetof(_SOME_STRUCT, unknownX)]; int SomeField1; }SOME_STRUCT,*PSOME_STRUCT; Но это нифига не компилится, и думается никак не скомпилится.
asd >Чтобы нормально работать с известными мне полями объявляю её таким образом Что означает "нормально работать" с известными полями? И чем всеже мешают остальные поля?
TSS нормально работать означает обращатьчя через xxx->SomeField1 А остальные поля мне совсем не мешают, а вот вычислять их размер руками лень. А ещё когда где-то внутри unknownX появляется известное поле, то unknownX надо разбить на 2(перед и после появившегося поля) -> опять вычислять их размеры.
asd делай как Great говорит. Это наименее геморный способ. Надо просто завести enum в котором перечислить все смещения полей, и использовать предложенный макрос. Или напиши препроцессор для своего заголовка, который будет править запись вида (например): Код (Text): struct { @offset 0x37 int field1; @offset 0x92 char field2[12]; }; Править и приводить к Код (Text): struct { char unknown01[0x37]; int field1; char unknown02[0x92-0x37-sizeof(int)*12]; char field2[12]; }; Средствами C всё равно не удастся объявить структурку так, чтобы потом с ней было бы удобно работать.
Код (Text): #define STRUCT(name,t1,n1,o1,t2,n2,o2,t3,n3,o3,......) \ struct name { \ char unk1[o1]; t1 n1; \ char unk2[o2-o1-sizeof(t1)]; t2 n2; \ char unk3[o3-o2-sizeof(t2)]; t3 n3; \ char unk4[o4-o3-sizeof(t3)]; t4 n4; \ ..... }; //использование: STRUCT( Foo, int,field1,0x20, char,field2,0x54, int,field3,0x78 ) однако в этом случае нельзя объявить поле-массив "type name[size];"