阅读:1302回复:1
内存对齐问题
我在驱动中定义了如下类型的数据,但是在应用中取数据时不对,确认应用获取的共享内存首地址正确。
我在C语言中定义了如下结构: #pragma pack( push, pack1, 1 ) typedef struct _PACKET_MAP //定义数据包映射表 { UINT Size; //内容长度 UINT Direct; //方向(IN/OUT) BOOLEAN ReadFlag; //应用程序读取标识 BOOLEAN DealFlag; //应用程序处理标识 BOOLEAN ActionFlag;//是否允许通过标识 NDIS_HANDLE ProtocolBindingContext;//绑定句柄 PNDIS_PACKET Packet; //包信息 LARGE_INTEGER BeginSysTime; //接收时间 UCHAR PacketBuf[PACKET_BUFFER_LEN];//数据包址 }PACKET_MAP,*PPACKET_MAP; #pragma pack( pop, pack1 ) 在delphi定义了结构TKER_PACKET_MAP: Type UINT = Type Cardinal;(cardianl相当于unsigned int) Type NDIS_HANDLE = Type Pointer;(Point相当于PVOID) Type PNDIS_PACKET = Type Pointer;(Point相当于PVOID) PKER_PACKET_MAP = ^TKER_PACKET_MAP; TKER_PACKET_MAP = packed Record //定义数据包映射表 Size: UINT; //内容长度 Direct: UINT; //方向(IN/OUT) ReadFlag: BOOLEAN; //应用程序读取标识 DealFlag: BOOLEAN; //应用程序处理标识 ActionFlag: BOOLEAN; //是否允许通过标识 ProtocolBindingContext:NDIS_HANDLE; //绑定句柄 Packet: PNDIS_PACKET; //包信息 BeginSysTime: LARGE_INTEGER; //接收时间 PacketBuf: Array[0..(PACKET_BUFFER_LEN - 1)] of char; end; 请问 1)这两个数据类型里面的数据存储方式是否一致? 2)存储数据时会不会系统不按顺序而是按数据类型来自动调整(若是,类型优先级如何)? 3)delphi中定义Record时,如果为packed record是否按字节(1)压栈,为Record时是否为字节(4)压栈? 4)如果我在驱动中内存往后移动n位,通过MDL映射到应用中后其地址往后移动n位是否一致? |
|
沙发#
发布于:2004-07-08 17:52
上面定义的结构没有问题,在delphi中应该加packed,此问题解决。
|
|