jackieky
驱动牛犊
驱动牛犊
  • 注册日期2004-02-10
  • 最后登录2004-08-13
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:3166回复:21

装上驱动以后,系统立刻就重起,重起后说找到新硬件,卸都卸不掉,请各位大侠帮帮忙了!胡老大,各位版主帮帮我了!

楼主#
更多 发布于:2004-05-07 19:00
我想做一个基于NDIS中间驱动的网关型防火墙,基于passthru来修改的,我先修改的是mpsend函数,在发送的时候得到数据包并将其拷贝到一个缓冲区,然后修改这个缓冲区且重新封包,然后再转发出去。应该是重新封包转发这块出问题了!编译链接都没有出错,但是装上之后,系统就立刻重起,重起以后系统说找到新硬件,让我更新驱动,好像有个实设备似的,然后怎么卸也卸不掉(在设备管理器里)!卸的时候提示的错误是:未能卸载该设备,系统启动可能需要该设备。不知道是怎么回事。还请各位大侠帮帮我了!
下面是mpsend的代码:
NDIS_STATUS
MPSend(
IN NDIS_HANDLE MiniportAdapterContext,
IN PNDIS_PACKET Packet,
IN UINT Flags
)
{
DbgPrint(\"MPSend\\n\");
NdisQueryPacket(Packet,NULL,NULL,NULL,&PacketSize);
ntStatus = NdisAllocateMemory(&pPacketContent,2000,0,HighestAcceptableMax);//存放包的缓冲区
if(ntStatus != NDIS_STATUS_SUCCESS)
{
return ntStatus;
}
NdisZeroMemory(pPacketContent,2000);
NdisQueryBufferSafe(Packet->Private.Head,&pBuf,&BufLength,32);
NdisMoveMemory(pPacketContent,pBuf,BufLength);
i = BufLength;
pNext = Packet->Private.Head;
for(;
{
if(pNext == Packet->Private.Tail)
break;
pNext = pNext->Next;
if(pNext == NULL)
break;
NdisQueryBufferSafe(pNext,&pBuf,&BufLength,32);
NdisMoveMemory(pPacketContent+i,pBuf,BufLength);
i+=BufLength;
}
PacketBuffer=pPacketContent;
PacketBufferLen=i;
DbgPrint(\"包大小%d\\n\",i);

memset(buffer,0,256);
sprintf(buffer,\"对方MAC %02X-%02X-%02X-%02X-%02X-%02X\\n\",
((PETHHDR)pPacketContent)->eh_dst[0],
((PETHHDR)pPacketContent)->eh_dst[1],
((PETHHDR)pPacketContent)->eh_dst[2],
((PETHHDR)pPacketContent)->eh_dst[3],
((PETHHDR)pPacketContent)->eh_dst[4],
((PETHHDR)pPacketContent)->eh_dst[5]);
DbgPrint(buffer);

memset(buffer,0,256);
sprintf(buffer,\"本地MAC %02X-%02X-%02X-%02X-%02X-%02X\\n\",
((PETHHDR)pPacketContent)->eh_src[0],
((PETHHDR)pPacketContent)->eh_src[1],
((PETHHDR)pPacketContent)->eh_src[2],
((PETHHDR)pPacketContent)->eh_src[3],
((PETHHDR)pPacketContent)->eh_src[4],
((PETHHDR)pPacketContent)->eh_src[5]);

DbgPrint(buffer);
memset(buffer,0,256);
sprintf(buffer,\"0x%02X%02X\",((PETHHDR)pPacketContent)->eh_type[0],((PETHHDR)pPacketContent)->eh_type[1]);
DbgPrint(\"%s\",buffer);
if(strcmp(buffer,IP)==0)//IP数据包
{
DbgPrint(\"IP GET!\\n\");
pIPHeader=(PIPHeader)((PCHAR)pPacketContent+14);
{
memset(buffer,0,256);
sprintf(buffer,\" IPv %d \",(pIPHeader->ver_len>>4)&15);
DbgPrint(\"\\n%s\", buffer);
memset(buffer,0,256);
//发送端地址
memset(buffer,0,256);
sprintf(buffer,\" 源地址:%d.%d.%d.%d \",pIPHeader->src_addr[0],pIPHeader->src_addr[1],pIPHeader->src_addr[2],pIPHeader->src_addr[3]);
DbgPrint(\"%s\", buffer);
//接收端地址
memset(buffer,0,256);
sprintf(buffer,\" 目标地址:%d.%d.%d.%d \",pIPHeader->des_addr[0],pIPHeader->des_addr[1],pIPHeader->des_addr[2],pIPHeader->des_addr[3]);
DbgPrint(\"%s\", buffer);
}
switch(pIPHeader->protocol)
{
case PROT_ICMP:
DbgPrint(\"ICMP\\n\");
break;
case PROT_IGMP:
DbgPrint(\"IGMP\\n\");
break;
case PROT_TCP:
DbgPrint(\"TCP\\n\");
{
pTCPHeader=(PTCPHeader)((PCHAR)pIPHeader+((pIPHeader->ver_len&15)*32/8));
//发送端端口
memset(buffer,0,256);
sprintf(buffer,\" 发送端端口:%d \",pTCPHeader->src_port[0]*0x100+pTCPHeader->src_port[1]);
DbgPrint(\"%s\",buffer);
//接收端端口
memset(buffer,0,256);
sprintf(buffer,\" 接收端端口:%d \",pTCPHeader->des_port[0]*0x100+pTCPHeader->des_port[1]);
DbgPrint(\"%s\",buffer);
//以上为包的分析部分
//以下为包的重新封装与转发部分
NdisAllocatePacket(&Status, &MyPacket, pAdapt->SendPacketPoolHandle);

if (Status == NDIS_STATUS_SUCCESS)
{
NdisAllocateBuffer(&Status,
          &pPacketBuffer,
          pAdapt->SendPacketPoolHandle,
          pPacketContent,
          PacketBufferLen);
         if (Status == NDIS_STATUS_SUCCESS)
        {  
MyPacket->Private.Head = NULL;
MyPacket->Private.Tail = NULL;
          NdisChainBufferAtBack(MyPacket,pPacketBuffer);

          NdisSend(&Status, pAdapt->BindingHandle, MyPacket);
      if (Status != NDIS_STATUS_PENDING)
     {
  NdisIMCopySendCompletePerPacketInfo (Packet, MyPacket);
  NdisFreeBuffer(pPacketBuffer);
               NdisFreeMemory(pPacketContent, 2000, 0);
  NdisFreePacket(MyPacket);
     }
         }

return(Status);
}



[编辑 -  5/9/04 by  jackieky]
root60931
驱动大牛
驱动大牛
  • 注册日期2002-10-25
  • 最后登录2023-10-29
  • 粉丝2
  • 关注0
  • 积分1013分
  • 威望432点
  • 贡献值0点
  • 好评度311点
  • 原创分0分
  • 专家分0分
  • 社区居民
沙发#
发布于:2004-05-08 15:26
在netsf_m.inf中找到下面的部分

[PassthruMP.ndi]
Characteristics = 0x29 ;NCF_NOT_USER_REMOVABLE | NCF_VIRTUAL | NCF_HIDDEN
CopyFiles =

将Characteristics 中NCF_NOT_USER_REMOVABLE对应的标志为置0再重新安装试一下。

好好学习,天天向上! root60931@gmail.com
jackieky
驱动牛犊
驱动牛犊
  • 注册日期2004-02-10
  • 最后登录2004-08-13
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2004-05-08 16:24
是这样改吗?
[xfilterMP.ndi]
Characteristics = 0x0 ;NCF_NOT_USER_REMOVABLE=0 | NCF_VIRTUAL | NCF_HIDDEN
CopyFiles =
我重新安装后,发现依然是那样的问题。系统重起,然后就检测到新硬件。
不过我认为可能不是这个文件的问题,我以前测试过几个经过我修改的驱动,都没有问题,用的就是这个安装文件,只是把重新编译的*.sys文件代替原来的就可以了,没有出现过重起的现象,系统运行正常,收发包的分析也很正常。这次我是测试上面给出的那个程序,我想将内存中的内容经过修改后重新封包,然后再转发出去,于是我就先修改了发送部分,加了这段代码:
NdisAllocatePacket(&Status, &MyPacket, pAdapt->SendPacketPoolHandle);

if (Status == NDIS_STATUS_SUCCESS)
{
NdisAllocateBuffer(&Status,
&pPacketBuffer,
pAdapt->SendPacketPoolHandle,
pPacketContent,
PacketBufferLen);
if (Status == NDIS_STATUS_SUCCESS)
{
MyPacket->Private.Head = NULL;
MyPacket->Private.Tail = NULL;
NdisChainBufferAtBack(MyPacket,pPacketBuffer);

NdisSend(&Status, pAdapt->BindingHandle, MyPacket);
if (Status != NDIS_STATUS_PENDING)
{
NdisIMCopySendCompletePerPacketInfo (Packet, MyPacket);
NdisFreeBuffer(pPacketBuffer);
NdisFreeMemory(pPacketContent, 2000, 0);
NdisFreePacket(MyPacket);
}
}

return(Status);
经过编译和连接,无错。
但是安装上去之后就发现,我说的那种情况,系统重起,然后就说检测到新硬件,想卸都卸不掉,我修改注册表时,发现HKEY_LOCAL_MACHINE\\SYSTEM\\ControlSet001\\Enum\\Root\\XFILTERMP
这个项怎么也删不掉!说是写入注册表出错!
我想应该就是这段代码的问题了,还请各位高手帮帮忙了!
darkread
驱动牛犊
驱动牛犊
  • 注册日期2003-01-13
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
地板#
发布于:2004-05-09 09:03
你找到Passthru的原始文件,编译后拷贝到system32\\drivers下面覆盖原来的文件后重启就行了
jackieky
驱动牛犊
驱动牛犊
  • 注册日期2004-02-10
  • 最后登录2004-08-13
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2004-05-09 09:47
我以前试过但是不行,不过我昨晚把那个卸载的问题解决了,只有修改注册表。我把权限改一下就可以修改那个键值了,只有这样才可能卸调!
我想应该是程序的问题
NdisAllocateBuffer(&Status,
&pPacketBuffer,
pAdapt->SendPacketPoolHandle,
pPacketContent,
PacketBufferLen);
这个函数的pndi_handle句柄也是ndisallocatepacket这个函数的句柄pAdapt->SendPacketPoolHandle一样??我以前用过胡老大的那段源码NdisAllocateBuffer(&Status,&pPacketBuffer,pAdapt->RecvBufferPoolHandle,pPacketContent,PacketLen);他用的是pAdapt->RecvBufferPoolHandle
但是发现编译的时候出现错误:
c:\\xpassthru\\RECV.C(389) : error C2039: \'RecvBufferPoolHandle\' : is not a member of \'_ADAPT\'
c:\\xpassthru\\xpassthru.h(54) : see declaration of \'_ADAPT\'
c:\\xpassthru\\RECV.C(389) : warning C4022: \'NdisAllocateBuffer\' : pointer mismatch for actual parameter 4
c:\\xpassthru\\RECV.C(389) : error C2198: \'NdisAllocateBuffer\' : too few actual parameters
重起的问题不知道是不是这个引起的?
asmsys
驱动老牛
驱动老牛
  • 注册日期2002-03-29
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分5分
  • 威望17点
  • 贡献值0点
  • 好评度8点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2004-05-10 09:12
c:\\xpassthru\\RECV.C(389) : error C2039: c:\\xpassthru\\RECV.C(389) : error C2039: \'RecvBufferPoolHandle\' : is not a member of \'_ADAPT\'
: is not a member of \'_ADAPT\'
说的很明白呀,你让\'RecvBufferPoolHandle\' 成为ADAPT的一个成员不就得了。
asmsys
驱动老牛
驱动老牛
  • 注册日期2002-03-29
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分5分
  • 威望17点
  • 贡献值0点
  • 好评度8点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2004-05-10 09:17
NdisQueryBufferSafe(Packet->Private.Head,&pBuf,&BufLength,32);
NdisMoveMemory(pPacketContent,pBuf,BufLength);
i = BufLength;
pNext = Packet->Private.Head;
这种处理方法很危险,也是为软不提倡的。本站贴了很多正确的代码,找吧。
jackieky
驱动牛犊
驱动牛犊
  • 注册日期2004-02-10
  • 最后登录2004-08-13
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2004-05-10 10:50
谢谢了asmsys :) 我是初学的,我就试试
jackieky
驱动牛犊
驱动牛犊
  • 注册日期2004-02-10
  • 最后登录2004-08-13
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2004-05-10 12:48
asmsys 我刚才改掉了,在ADAPT加了。
这样一来就没有编译错误了,但是安装完驱动后系统就立刻重新启动!我想是这段代码出的问题,就是重新封包这部分(将pPacketContent缓冲区的内容重新封包到MyPacket),请问这样操作错在什么地方:
if (Status == NDIS_STATUS_SUCCESS)
{
NdisAllocateBuffer(&Status,
&pPacketBuffer,
pAdapt->SendBufferPoolHandle,
pPacketContent,
PacketBufferLen);
if (Status == NDIS_STATUS_SUCCESS)
{
MyPacket->Private.Head = NULL;
MyPacket->Private.Tail = NULL;
NdisChainBufferAtBack(MyPacket,pPacketBuffer);

NdisSend(&Status, pAdapt->BindingHandle, MyPacket);
if (Status != NDIS_STATUS_PENDING)
{
NdisIMCopySendCompletePerPacketInfo (Packet, MyPacket);
NdisFreeBuffer(pPacketBuffer);
NdisFreeMemory(pPacketContent, 2000, 0);
NdisFreePacket(MyPacket);
}
}
asmsys
驱动老牛
驱动老牛
  • 注册日期2002-03-29
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分5分
  • 威望17点
  • 贡献值0点
  • 好评度8点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2004-05-10 13:17
不知从那里抄来的代码,同样的问题我说过几次了,说多了,显的我是在卖弄。
NdisChainBufferAtFront(MyPacket,pPacketBuffer);
MyPacket->Private.Head->Next=NULL;
MyPacket->Private.Tail=NULL;
NDIS_SET_PACKET_HEADER_SIZE(MyPacket,14);
BTW:除非你的数据都在一个缓冲区内,否则不可以这样,这不是MICROSOFT推荐的。如果数据都在一个缓冲区内,那和MICROSOFT的方法结果一样。
jackieky
驱动牛犊
驱动牛犊
  • 注册日期2004-02-10
  • 最后登录2004-08-13
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2004-05-10 13:59
asmsys,不好意思了,那段代码是我自己写的.我刚才找到了你以前的一段代码,我用了你的处理方法加到了我的程序中,下面这是重新封包部分:
NdisAllocatePacket(&Status, &MyPacket, pAdapt->SendPacketPoolHandle);
if (Status == NDIS_STATUS_SUCCESS)
{
NdisAllocateBuffer(&Status,
&pPacketBuffer,
pAdapt->SendBufferPoolHandle,
pPacketContent,
PacketBufferLen
);
if (Status == NDIS_STATUS_SUCCESS)
        {   DbgPrint(\"\\n copy packet\\n\");
NdisChainBufferAtFront(MyPacket,pPacketBuffer);
MyPacket->Private.Head->Next=NULL;
MyPacket->Private.Tail=NULL;
NDIS_SET_PACKET_HEADER_SIZE(MyPacket,14);
NdisSetPacketFlags(MyPacket, NDIS_FLAGS_DONT_LOOPBACK);
NdisSend(&Status,pAdapt->BindingHandle,MyPacket);
NdisFreeMemory(pPacketContent, 2000, 0);
NdisFreePacket(MyPacket);
  NdisFreeBuffer(pPacketBuffer);

  PrintPacket(Packet);
}
编译无错误,但是装上去之后,就发现情况还是像以前那样!系统重起!然后就找到新硬件.不知道问题出在什么地方.
还有关于数据是否在一个缓冲区内的问题,我用的程序段为:
NdisQueryPacket(Packet,NULL,NULL,NULL,&PacketSize);
ntStatus = NdisAllocateMemory(&pPacketContent,2000,0,HighestAcceptableMax);
if(ntStatus != NDIS_STATUS_SUCCESS)
{
return ntStatus;
}
NdisZeroMemory(pPacketContent,2000);
NdisQueryBufferSafe(Packet->Private.Head,&pBuf,&BufLength,32);
NdisMoveMemory(pPacketContent,pBuf,BufLength);
i = BufLength;
pNext = Packet->Private.Head;
for(;;)
{
if(pNext == Packet->Private.Tail)
break;
pNext = pNext->Next;
if(pNext == NULL)
break;
NdisQueryBufferSafe(pNext,&pBuf,&BufLength,32);
NdisMoveMemory(pPacketContent+i,pBuf,BufLength);
i+=BufLength;
}
这样做了以后数据应该是在pPacketContent这个缓冲区中了吧?
谢谢!
asmsys
驱动老牛
驱动老牛
  • 注册日期2002-03-29
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分5分
  • 威望17点
  • 贡献值0点
  • 好评度8点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2004-05-10 14:50
NdisSend(&Status,pAdapt->BindingHandle,MyPacket);
NdisFreeMemory(pPacketContent, 2000, 0);
NdisFreePacket(MyPacket);
NdisFreeBuffer(pPacketBuffer);
原来的if(status != NDIS_STATUS_PENDING)去哪了?一定要。
另外我忘了说了,如果status != NDIS_STATUS_PENDING就释放资源。
如果status == NDIS_STATUS_PENDING就要在PtSendCopmlete中释放资源。切记。


\"然后就找到新硬件.\"
2k系统吧!一定要把winnt\\system32\\drivers\\yourdriver.sys删除,把相关的组册表清干净。
然后REBOOT,然后在安装新的,否则一安装就加载原来的*.sys.

做好事情做到底了。
VOID
CopyPacket2Buffer(
IN PNDIS_PACKET pPacket,
IN OUT PUCHAR pBuff,
IN OUT PUINT pLength
)
{
PNDIS_BUFFER BuffDT;
PUCHAR BuffVA;
UINT BuffLen;

*pLength=0;
BuffLen=0;

NdisQueryPacket(pPacket,NULL,NULL,&BuffDT,NULL);

while(BuffDT!=(PNDIS_BUFFER)NULL)
{
// NdisQueryBuffer(BuffDT,&BuffVA,&BuffLen);
NdisQueryBufferSafe(BuffDT,&BuffVA,&BuffLen,16);
NdisMoveMemory(pBuff,BuffVA,BuffLen);
pBuff=pBuff+BuffLen;
*pLength+=BuffLen;
NdisGetNextBuffer(BuffDT,&BuffDT);
}
return;
}
jackieky
驱动牛犊
驱动牛犊
  • 注册日期2004-02-10
  • 最后登录2004-08-13
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
12楼#
发布于:2004-05-10 20:49
asmsys,我是初学的,不好意思麻烦了!不过现在正在做毕业设计:(
我刚用了这种方法拷贝packet到缓冲区,还有其他的。毛病还是照旧。我想可能是资源引起的问题,我先调试一下。先谢了!
asmsys
驱动老牛
驱动老牛
  • 注册日期2002-03-29
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分5分
  • 威望17点
  • 贡献值0点
  • 好评度8点
  • 原创分0分
  • 专家分0分
13楼#
发布于:2004-05-11 08:56
那我也无能为力了,各个回调函数之间的关系,不是一两句话能说清楚的,你用SICE跟一下吧,这也许是最好的方法了。
jackieky
驱动牛犊
驱动牛犊
  • 注册日期2004-02-10
  • 最后登录2004-08-13
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
14楼#
发布于:2004-05-11 21:40
asmsys,先感谢您给我的帮助!不过不好意思,又要麻烦您了:).重起的问题是解决了,应该是资源的使用与回收引起的.但是现在又碰到一个新的问题了.
我们上网是通过802.1X 实达的一个认证程序上网的.我装上驱动以后就发现,认证不上了!一直在寻找认证服务器,我跟踪了代码.好像一直在向默认网关和DNS服务器发包和收包,以下是LOG的一部分,我用sniffer监控得到的结果也是一样。
包大小73
00006146 12.02951018 对方MAC 00-08-A4-56-CF-FC
00006147 12.02951828 本地MAC 52-54-AB-32-0E-F4
00006148 12.02952219 0x0800
00006149 12.02952582 IP GET!
00006150 12.02953001
00006151 12.02953141 IPv 4
00006152 12.02953532 版本:4
00006153 12.02953951 报头长:20字节
00006154 12.02954426 服务类型:0x00
00006155 12.02954649 普通
00006156 12.02955040 普通服务
00006157 12.02955599 数据报长度:59字节
00006158 12.02956018 标识:36097
00006159 12.02956353 标志:0
00006160 12.02956661 预约固定
00006161 12.02956884 有碎块
00006162 12.02957136 最后的碎块
00006163 12.02957611 \'数据块偏移\':0
00006164 12.02958030 生存时间TTL:128
00006165 12.02958393 协议:UDP
00006166 12.02958951 报头校验码:0x17d1
00006167 12.02959594 源地址:218.197.193.227
00006168 12.02960209 目标地址:202.114.0.242 //这是我的默认DNS
00006169 12.02960572 UDP
00006170 12.02961354 //以下为我下面要贴的代码产生的
00006171 12.02961466 copy packet
00006172 12.02962918
00006173 12.02963030 copy packet over //到此处好像MPSEND就执行完毕了!
00006174 12.03368920 *** XPASSHTRU.SYS ***
。。。。。

相关代码:(重新封包部分)
NdisAllocatePacket(&Status, &MyPacket, pAdapt->SendPacketPoolHandle);
if (Status == NDIS_STATUS_SUCCESS)
{
NdisAllocateBuffer(&bStatus,
&pPacketBuffer,
pAdapt->SendBufferPoolHandle,
pPacketContent,
PacketBufferLen
);

         if (bStatus != NDIS_STATUS_SUCCESS)
{return(bStatus);
}
else
        {  
DbgPrint(\"\\n copy packet\\n\");
NdisChainBufferAtFront(MyPacket,pPacketBuffer);
MyPacket->Private.Head->Next=NULL;
MyPacket->Private.Tail=NULL;
NDIS_SET_PACKET_HEADER_SIZE(MyPacket,14);
//NdisSetPacketFlags(MyPacket, NDIS_FLAGS_DONT_LOOPBACK);
NdisSend(&Status,pAdapt->BindingHandle,MyPacket);
             
                       DbgPrint(\"\\n copy packet over\\n\");
          NdisSend(&Status, pAdapt->BindingHandle, MyPacket);
      if (Status != NDIS_STATUS_PENDING)
     {DbgPrint(\"\\n Status != NDIS_STATUS_PENDING\\n\");
  NdisIMCopySendCompletePerPacketInfo (Packet, MyPacket);
  NdisFreePacket(MyPacket);
  NdisFreeBuffer(pPacketBuffer);
  NdisFreeMemory(pPacketContent, 2000, 0);

  PrintPacket(Packet);
     }
         }
}
return(Status);
程序的其它部分,比如包的接收什么的应该没有什么问题,因为在我修改这部分程序之前我测试过。程序运行正常。可以认证,可以上网。所以我想应该就是这段代码的问题了。好像在NdisSend(&Status, pAdapt->BindingHandle, MyPacket);之后status一直返回的是Status == NDIS_STATUS_PENDING,我看了所有的包,好像这个程序段if (Status != NDIS_STATUS_PENDING)
     {DbgPrint(\"\\n Status != NDIS_STATUS_PENDING\\n\");   NdisIMCopySendCompletePerPacketInfo (Packet, MyPacket);
  NdisFreePacket(MyPacket);
  NdisFreeBuffer(pPacketBuffer);
一直都没有进去过。
请问当Status == NDIS_STATUS_PENDING后,系统会在执行什么?
就只是执行return(Status);??
那我申请的那些资源怎么回收?如NDIS_BUFFER pPacketBuffer;pPacketContent,mypacket等
asmsys
驱动老牛
驱动老牛
  • 注册日期2002-03-29
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分5分
  • 威望17点
  • 贡献值0点
  • 好评度8点
  • 原创分0分
  • 专家分0分
15楼#
发布于:2004-05-12 09:50
如果返回NDIS_STATUS_PENDING,ndis会调用PtSendComplete,你应当在这个函数只释放资源。
jackieky
驱动牛犊
驱动牛犊
  • 注册日期2004-02-10
  • 最后登录2004-08-13
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
16楼#
发布于:2004-05-12 12:10
这是我的PtSendComplete函数:
VOID
PtSendComplete(
IN NDIS_HANDLE ProtocolBindingContext,
IN  PNDIS_PACKET Packet,
IN  NDIS_STATUS Status
)
{
PADAPT pAdapt =(PADAPT)ProtocolBindingContext;
PNDIS_PACKET Pkt;
PRSVD Rsvd;

DBGPRINT(\"==> Passthru Protocol PtSendComplete\\n\");

PrintPacket(Packet);

pAdapt = pAdapt->pPrimaryAdapt;
Rsvd = (PRSVD)(Packet->ProtocolReserved);
Pkt = Rsvd->OriginalPkt;

NdisIMCopySendCompletePerPacketInfo (Pkt, Packet);
NdisDprFreePacket(Packet);
NdisMSendComplete(pAdapt->MiniportHandle, Pkt, Status);
DBGPRINT(\"<== Passthru Protocol PtSendComplete\\n\");
}
但是在LOG文件里根本就没有看到==> Passthru Protocol PtSendComplete!好像从来就没有进入这个函数过!是不是return(Status);就完了?然后什么都不做??那我的资源怎么释放呀?

另外我今天刚又加了一段测试代码,比较packet和我重新封的包mypacket有什么不同,我打印了packet和mypacket,比如PhysicalBufferCount,BufferCountTotalPacketLenth,HeaderSize,PacketSize等等下面是我测试的代码:
NDIS_STATUS
MPSendOnePacket(
IN NDIS_HANDLE MiniportAdapterContext,
IN PNDIS_PACKET Packet,
IN UINT Flags
)

......
//在程序进入时我调用了PrintPacket(Packet)来打印原packet内容
PrintPacket(Packet);
......
//下面是重新封包和测试mypacket内容部分
NdisAllocateBuffer(&bStatus,
&pPacketBuffer,
pAdapt->SendBufferPoolHandle,
pPacketContent,
PacketBufferLen
);

         if (bStatus != NDIS_STATUS_SUCCESS)
{return(bStatus);
}
else
        {  
DbgPrint(\"\\n copy packet\\n\");
NdisChainBufferAtFront(MyPacket,pPacketBuffer);
MyPacket->Private.Head->Next=NULL;
MyPacket->Private.Tail=NULL;
NDIS_SET_PACKET_HEADER_SIZE(MyPacket,14);
//NdisSetPacketFlags(MyPacket, NDIS_FLAGS_DONT_LOOPBACK);
NdisSend(&Status,pAdapt->BindingHandle,MyPacket);
//下面就是我打印的mypacket代码
PrintPacket(MyPacket);            
             DbgPrint(\"\\n copy packet over\\n\");
 
      if (Status != NDIS_STATUS_PENDING)
     {DbgPrint(\"\\n Status != NDIS_STATUS_PENDING\\n\");
  NdisIMCopySendCompletePerPacketInfo (Packet, MyPacket);
  NdisFreePacket(MyPacket);
  NdisFreeBuffer(pPacketBuffer);
  NdisFreeMemory(pPacketContent, 2000, 0);
  PrintPacket(Packet);
     }
         }

下面是包的打印函数VOID PrintPacket打印包的相关信息:
VOID PrintPacket(
IN PNDIS_PACKET packet
)
{
UINT PhysicalBufferCount;
UINT BufferCount;
PNDIS_BUFFER  FirstBuffer;
UINT TotalPacketLength;

NdisQueryPacket(packet
, &PhysicalBufferCount
, &BufferCount
, &FirstBuffer
, &TotalPacketLength
);

DbgPrint(\"    PacketPointer: %u.\\n\", (VOID*)packet);
DbgPrint(\"    PhysicalBufferCount: %u.\\n\", PhysicalBufferCount);
DbgPrint(\"    BufferCount: %u.\\n\", BufferCount);
DbgPrint(\"    FirstBufferPointer: %u.\\n\", FirstBuffer);
DbgPrint(\"    TotalPacketLenth: %u.\\n\", TotalPacketLength);
PrintHeaderSize(packet);
PrintProtocol(packet);
PrintPacketStatus(packet);
}

UINT
PrintHeaderSize(
IN PNDIS_PACKET packet
)
{
UINT HeaderSize = NDIS_GET_PACKET_HEADER_SIZE(packet);
DbgPrint(\"    HeaderSize: %u.\\n\", HeaderSize);
return HeaderSize;
}
然后我测试的时候就发现一个很奇怪的现象!
下面就是LOG的一部分:
00006767 24.31880504 MPSend
//原来的包packet的PacketPointer,PhysicalBufferCount,BufferCount,TotalPacketLenth信息:
00006768 24.31883717    PacketPointer: 4264328792.
00006769 24.31884220    PhysicalBufferCount: 2.
00006770 24.31884583    BufferCount: 1.
00006771 24.31885086    FirstBufferPointer: 4267804360.
00006772 24.31885505    TotalPacketLenth: 1000.
00006773 24.31885868    HeaderSize: 0.
00006774 24.31886790    Protocol: DEFAULT.
00006775 24.31887293    Status: NDIS_STATUS_SUCCESS.
00006776 24.31888634 包大小1000
00006777 24.31889528 对方MAC 01-80-C2-00-00-03
00006778 24.31890282 本地MAC 00-E0-4C-A0-D6-87
00006779 24.31890673 0x888E
00006780 24.31891372
00006781 24.31891483 copy packet

//下面是mypacet的PacketPointer,PhysicalBufferCount,BufferCount,TotalPacketLenth信息:
00006782 24.31893104    PacketPointer: 4264490776.
00006783 24.31893495    PhysicalBufferCount: 1.
00006784 24.31893914    BufferCount: 1.
00006785 24.31894389    FirstBufferPointer: 4267800424.
00006786 24.31894836    TotalPacketLenth: 1000.
00006787 24.31895171    HeaderSize: 14.
00006788 24.31895562    Protocol: DEFAULT.
00006789 24.31895981    Status: NDIS_STATUS_SUCCESS.
00006790 24.31896316
00006791 24.31896456 copy packet over
比较一下mypacket和packet就不难发现这两者之间的区别:
packet的headersize是0!!!然后 PhysicalBufferCount也不相同!不知为何。我把NDIS_SET_PACKET_HEADER_SIZE(MyPacket,14);
这个改为NDIS_SET_PACKET_HEADER_SIZE(MyPacket,0);之后,编译连接,然后安装上去之后,系统就立刻重新启动!但是重新启动后,发现认证竟然可以通过!可以上网,但是debugview查看运行结果,看不到任何东东!nothing ,莫名其妙:)
asmsys
驱动老牛
驱动老牛
  • 注册日期2002-03-29
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分5分
  • 威望17点
  • 贡献值0点
  • 好评度8点
  • 原创分0分
  • 专家分0分
17楼#
发布于:2004-05-12 13:28
如果PENDING了,PtSendCopmlete肯定被调用,否则,肯定蓝屏。仔细看看吧。至于那个不同之处,因为你重新做了包,肯定不同。安装是REBOOT,肯定是没有安装成功,所以没有DBG输出。
jackieky
驱动牛犊
驱动牛犊
  • 注册日期2004-02-10
  • 最后登录2004-08-13
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
18楼#
发布于:2004-05-12 17:12
但是我重新启动后,发现网络连接属性里有我装上去的这个服务。这样也不能算是安装上去了?
还有为什么UINT HeaderSize = NDIS_GET_PACKET_HEADER_SIZE(packet);
DbgPrint(\" HeaderSize: %u.\\n\", HeaderSize);
这个得到packet的headersize为0?
能不能把mypacket的headersize设置为0?这样的包能发送出去吗?

[编辑 -  5/12/04 by  jackieky]
baoyibao99
禁止发言
禁止发言
  • 注册日期2003-05-07
  • 最后登录2016-04-11
  • 粉丝0
  • 关注0
  • 积分894分
  • 威望8415点
  • 贡献值0点
  • 好评度4点
  • 原创分0分
  • 专家分0分
19楼#
发布于:2004-05-14 14:19
用户被禁言,该主题自动屏蔽!
上一页
游客

返回顶部