阅读:3166回复:21
装上驱动以后,系统立刻就重起,重起后说找到新硬件,卸都卸不掉,请各位大侠帮帮忙了!胡老大,各位版主帮帮我了!
我想做一个基于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] |
|
沙发#
发布于: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再重新安装试一下。 |
|
|
板凳#
发布于: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 这个项怎么也删不掉!说是写入注册表出错! 我想应该就是这段代码的问题了,还请各位高手帮帮忙了! |
|
地板#
发布于:2004-05-09 09:03
你找到Passthru的原始文件,编译后拷贝到system32\\drivers下面覆盖原来的文件后重启就行了
|
|
地下室#
发布于: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 重起的问题不知道是不是这个引起的? |
|
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的一个成员不就得了。 |
|
6楼#
发布于:2004-05-10 09:17
NdisQueryBufferSafe(Packet->Private.Head,&pBuf,&BufLength,32);
NdisMoveMemory(pPacketContent,pBuf,BufLength); i = BufLength; pNext = Packet->Private.Head; 这种处理方法很危险,也是为软不提倡的。本站贴了很多正确的代码,找吧。 |
|
7楼#
发布于:2004-05-10 10:50
谢谢了asmsys :) 我是初学的,我就试试
|
|
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); } } |
|
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的方法结果一样。 |
|
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这个缓冲区中了吧? 谢谢! |
|
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; } |
|
12楼#
发布于:2004-05-10 20:49
asmsys,我是初学的,不好意思麻烦了!不过现在正在做毕业设计:(
我刚用了这种方法拷贝packet到缓冲区,还有其他的。毛病还是照旧。我想可能是资源引起的问题,我先调试一下。先谢了! |
|
13楼#
发布于:2004-05-11 08:56
那我也无能为力了,各个回调函数之间的关系,不是一两句话能说清楚的,你用SICE跟一下吧,这也许是最好的方法了。
|
|
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等 |
|
15楼#
发布于:2004-05-12 09:50
如果返回NDIS_STATUS_PENDING,ndis会调用PtSendComplete,你应当在这个函数只释放资源。
|
|
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 ,莫名其妙:) |
|
17楼#
发布于:2004-05-12 13:28
如果PENDING了,PtSendCopmlete肯定被调用,否则,肯定蓝屏。仔细看看吧。至于那个不同之处,因为你重新做了包,肯定不同。安装是REBOOT,肯定是没有安装成功,所以没有DBG输出。
|
|
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] |
|
19楼#
发布于:2004-05-14 14:19
用户被禁言,该主题自动屏蔽! |
|
上一页
下一页