wdynasty
驱动大牛
驱动大牛
  • 注册日期2003-10-10
  • 最后登录2011-04-07
  • 粉丝0
  • 关注0
  • 积分627分
  • 威望199点
  • 贡献值0点
  • 好评度34点
  • 原创分0分
  • 专家分0分
阅读:1159回复:4

一个问题,大家帮忙

楼主#
更多 发布于:2005-06-10 16:19
我定义了一个结构
typedef struct _WRITE_CMD
{
unsigned char cmd_id;
unsigned long start_lba;
unsigned long write_len;
unsigned char sector[512];

} WRITE_CMD, *PWRITE_CMD;
但由于想把sector定义的大一点,想用ExAllocatePool分配那么结构是不是应该定义为typedef struct _WRITE_CMD
{
unsigned char cmd_id;
unsigned long start_lba;
unsigned long write_len;
unsigned char sector;

} WRITE_CMD, *PWRITE_CMD;

我这样分配了一下
dBufferSize = sizeof (unsigned char) + sizeof(unsigned long) * 2+ sizeof(unsigned char) *56*1024;
        
        write_cmd = (PWRITE_CMD)ExAllocatePool (
                                             NonPagedPool,
                                             dBufferSize );

write_cmd->cmd_id = 0x2a;
write_cmd->start_lba = htonl(StartLBA);
write_cmd->write_len = htonl(left);

RtlCopyMemory((void*)write_cmd->sector, (UCHAR *)(pSrb->DataBuffer), left);
最后这一句好像有问题,老是兰频,大家帮忙
21世纪是搜索的世界,看看BAIDU的股票就知道了。
looluo
驱动牛犊
驱动牛犊
  • 注册日期2001-09-15
  • 最后登录2018-05-29
  • 粉丝0
  • 关注0
  • 积分3分
  • 威望11点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
  • 社区居民
沙发#
发布于:2005-06-10 17:27
定义成这样
{
unsigned char cmd_id;
unsigned long start_lba;
unsigned long write_len;
unsigned char sector[1];

} WRITE_CMD, *PWRITE_CMD;
znsoft
管理员
管理员
  • 注册日期2001-03-23
  • 最后登录2023-10-25
  • 粉丝300
  • 关注6
  • 积分910分
  • 威望14796点
  • 贡献值7点
  • 好评度2410点
  • 原创分5分
  • 专家分100分
  • 社区居民
  • 最爱沙发
  • 社区明星
板凳#
发布于:2005-06-10 23:58
对,应该象楼上说的那样定义,这样可以不受长度了限制,而且直接可以用结构成员变量访问你的不定长成员变量sector.

http://www.zndev.com 免费源码交换网 ----------------------------- 软件创造价值,驱动提供力量! 淡泊以明志,宁静以致远。 ---------------------------------- 勤用搜索,多查资料,先搜再问。
wdynasty
驱动大牛
驱动大牛
  • 注册日期2003-10-10
  • 最后登录2011-04-07
  • 粉丝0
  • 关注0
  • 积分627分
  • 威望199点
  • 贡献值0点
  • 好评度34点
  • 原创分0分
  • 专家分0分
地板#
发布于:2005-06-11 16:07
我这样分配以后,通过write_cmd->cmd_id 得到的值怎么不正确啊
21世纪是搜索的世界,看看BAIDU的股票就知道了。
wdynasty
驱动大牛
驱动大牛
  • 注册日期2003-10-10
  • 最后登录2011-04-07
  • 粉丝0
  • 关注0
  • 积分627分
  • 威望199点
  • 贡献值0点
  • 好评度34点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2005-06-11 17:41
结构如下定义
typedef struct _WRITE_CMD
{
unsigned long cmd_id;
unsigned long start_lba;
unsigned long write_len;
unsigned char sector[1];

} WRITE_CMD, *PWRITE_CMD;

通过如下方式分配


ULONG dBufferSize;  
dBufferSize =  sizeof(unsigned long) * 3+ sizeof(unsigned char) *left;
        
        write_cmd = (PWRITE_CMD)ExAllocatePool (
                                             NonPagedPool,
                                             dBufferSize+1);
                                            
write_cmd->cmd_id = htonl(42);

write_cmd->start_lba = htonl(StartLBA);
write_cmd->write_len = htonl(left);

RtlCopyMemory((void*)write_cmd->sector, (UCHAR *)(pSrb->DataBuffer), left);

len = sizeof(write_cmd);
dStatus = TdiSendDatagram ( // send datagram
pTdiTransportObject, // to transport
MY_PORT, // port
dTdiRemoteAddress, // address
&write_cmd, // data
len ); // size
if ( !NT_SUCCESS ( dStatus ) )
DbgPrint ( \"ERROR: writing sending %X\\n\", dStatus );
else
DbgPrint ( \"writing send success\\n\" );
发到Server端以后
通过
iRtn = recvfrom( s, (char *)buf, sizeof(buf), 0, (struct sockaddr *)&from, &len);接收数据
后,发现buf[0]不是42,不知道啥原因。
21世纪是搜索的世界,看看BAIDU的股票就知道了。
游客

返回顶部