chili
驱动牛犊
驱动牛犊
  • 注册日期2004-03-31
  • 最后登录2011-03-29
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
阅读:1300回复:1

内存对齐问题

楼主#
更多 发布于:2004-07-07 09:47
我在驱动中定义了如下类型的数据,但是在应用中取数据时不对,确认应用获取的共享内存首地址正确。
我在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位是否一致?
chili
驱动牛犊
驱动牛犊
  • 注册日期2004-03-31
  • 最后登录2011-03-29
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2004-07-08 17:52
上面定义的结构没有问题,在delphi中应该加packed,此问题解决。
游客

返回顶部