есть структурка из DDK: Код (Text): typedef struct _SCSI_BUS_DATA { UCHAR NumberOfLogicalUnits; UCHAR InitiatorBusId; ULONG InquiryDataOffset; }SCSI_BUS_DATA, *PSCSI_BUS_DATA; понять не мог - почему в ней данные кривые... глянул в ольку - оказалось что каждое поле этой стр-ры должно выравниваться на 4б, то есть Код (Text): db NumberOfLogicalUnits rb 3 db InitiatorBusId rb 3 dd InquiryDataOffset как заставить VC делать такое чудо?
Код (Text): #include <pshpack1.h> #include <pshpack2.h> #include <pshpack4.h> #include <pshpack8.h> #include <poppack.h> Без выравнивания, выравнивание на 2 байта, на 4, на 8 и восстановление предыдущего режима соответственно. Если хочется, можно то же самое через #pragma pack, но первый способ лучше.
хм.. Всё-равно какой-то бред генерирует: Код (Text): #include <pshpack8.h> typedef struct _SCSI_INQUIRY_DATA { UCHAR PathId; UCHAR TargetId; UCHAR Lun; BOOLEAN DeviceClaimed; ULONG InquiryDataLength; ULONG NextInquiryDataOffset; UCHAR InquiryData[1]; }SCSI_INQUIRY_DATA, *PSCSI_INQUIRY_DATA; typedef struct _SCSI_BUS_DATA { UCHAR NumberOfLogicalUnits; UCHAR InitiatorBusId; ULONG InquiryDataOffset; }SCSI_BUS_DATA, *PSCSI_BUS_DATA; #include <poppack.h> ... pScsiInqueryData = (PSCSI_INQUIRY_DATA)((PCHAR)pScsiBusData + pScsiBusData->InquiryDataOffset); /* 00401091 |. 8B7E 04 MOV EDI,DWORD PTR DS:[ESI+4] ; тут esi = pScsiBusData 00401094 |. 03FE ADD EDI,ESI */ Почему [esi+4], когда должен быть [esi+0C]
Quark Потому, что все эти pshpack относятся к выравниванию размера структуры, а поля внутри структуры выравниваются на размер полей, т.е. однобайтные uchar мог иметь любое смещение, а смещение 4-байтного ulong должно быть кратно 4-м - так оно и получается А чтобы повторить супервыравненную структуру из DDK можно наоборот отключить выравнивание (pshpack1) и добавить выравнивающие байты\ворды вручную (типа unused или padd)
а кто мешает написать не UCHAR а ULONG? typedef struct _SCSI_BUS_DATA { ULONG NumberOfLogicalUnits; ULONG InitiatorBusId; ULONG InquiryDataOffset; }SCSI_BUS_DATA, *PSCSI_BUS_DATA; или так: typedef struct _SCSI_BUS_DATA { union { UCHAR NumberOfLogicalUnits; ULONG dummy1; }; union { UCHAR InitiatorBusId; ULONG dummy2; }; ULONG InquiryDataOffset; }SCSI_BUS_DATA, *PSCSI_BUS_DATA;
Зотелось бы как и в DDK её описать, хотя, сделаю как Great, а то с этими выравниваниями чёрт ногу сломит.