阅读:1486回复:6
我要看截获的数据包,用SOFTICE
本人学习NDIS将近2个月了,没有经验,完全自学,看代码
现在进行到了一个关键的地方,我想用softice查看数据包啊, 可能对于高手你们完全没问题,可真把我难住了, 我的网卡是用PtReceive的,看下面: NDIS_STATUS PtReceive( IN NDIS_HANDLE ProtocolBindingContext, IN NDIS_HANDLE MacReceiveContext, IN PVOID HeaderBuffer, IN UINT HeaderBufferSize, IN PVOID LookAheadBuffer, IN UINT LookAheadBufferSize, IN UINT PacketSize ) { PADAPT OutAdapt, pAdapt =(PADAPT)ProtocolBindingContext; PNDIS_PACKET MyPacket, Packet, MyPacket1; NDIS_STATUS Status = NDIS_STATUS_SUCCESS; PNDIS_BUFFER pPacketBuffer, pBakBuffer; PUCHAR pPacketContent, pBakContent; UINT PacketLen; UINT OffsetSize; UINT BytesTransferred; PRSVD Rsvd = NULL; PVOID MediaSpecificInfo = NULL; ULONG MediaSpecificSize= 0; DBGPRINT((\"In PtReceive\\n\")); if(!pAdapt->MiniportHandle) { Status = NDIS_STATUS_FAILURE; } else do { // We should not be getting Receives on a Secondary, this is just specific to our LBFO driver if(pAdapt->isSecondary) { DbgPrint(\"PASSTHRU GETTING RECIEVES ON SECONDARY\\n\"); ASSERT(0); } if(FALSE){} else if(PacketSize <= LookAheadBufferSize) { Status = NdisAllocateMemory(&pPacketContent, BUFFER_SIZE, 0, HighestAcceptableMax); if(Status != NDIS_STATUS_SUCCESS) { DbgPrint(\"PTReceive:NdisAllocateMemory Failed\\n\"); return(NDIS_STATUS_NOT_ACCEPTED); } if(pPacketContent == NULL) { DbgPrint(\"PTReceive:pPacketContent==NULL\\n\"); return(NDIS_STATUS_NOT_ACCEPTED); } NdisZeroMemory(pPacketContent, BUFFER_SIZE); NdisMoveMemory(pPacketContent, HeaderBuffer, HeaderBufferSize); NdisMoveMemory(pPacketContent+ HeaderBufferSize, LookAheadBuffer, LookAheadBufferSize); PacketLen = PacketSize+HeaderBufferSize; if(Monitor_flag) { if(Check_Packet((char*)pPacketContent)) { return NDIS_STATUS_NOT_ACCEPTED; } } else {} NdisDprAllocatePacket(&Status, &MyPacket, pAdapt->RecvPacketPoolHandle); if(Status == NDIS_STATUS_SUCCESS) { NdisAllocateBuffer(&Status, &pPacketBuffer, pAdapt->RecvBufferPoolHandle, pPacketContent, PacketLen); NdisChainBufferAtFront(MyPacket, pPacketBuffer); MyPacket->Private.Head->Next = NULL; MyPacket->Private.Tail = NULL; Rsvd=(PRSVD)(MyPacket->MiniportReserved); Rsvd->OriginalPkt = NULL; NDIS_SET_PACKET_HEADER_SIZE(MyPacket, HeaderBufferSize); NdisMIndicateReceivePacket(pAdapt->MiniportHandle, &MyPacket, 1); if(NDIS_GET_PACKET_STATUS(MyPacket) != NDIS_STATUS_PENDING) { DBGPRINT((\"In PtReceive And Free Memory\\n\")); NdisFreeBuffer(pPacketBuffer); NdisFreeMemory(pPacketContent, BUFFER_SIZE, 0); NdisDprFreePacket(MyPacket); } } break; } else { Status = NdisAllocateMemory(&pPacketContent, BUFFER_SIZE, 0, HighestAcceptableMax); if(Status != NDIS_STATUS_SUCCESS) { DbgPrint(\"PtReceive:NdisAllocateMemory Failed.\\n\"); return(NDIS_STATUS_NOT_ACCEPTED); } if(pPacketContent==NULL) { DbgPrint(\"PTReceive:pPacketContent==NULL\\n\"); return(NDIS_STATUS_NOT_ACCEPTED); } NdisZeroMemory(pPacketContent,BUFFER_SIZE); NdisDprAllocatePacket(&Status, &MyPacket, pAdapt->RecvPacketPoolHandle); Status = NdisAllocateMemory(&pBakContent, BUFFER_SIZE, 0, HighestAcceptableMax); if(Status != NDIS_STATUS_SUCCESS) { DbgPrint(\"PtReceive:NdisAllocateMemory Failed.\\n\"); return(NDIS_STATUS_NOT_ACCEPTED); } if(pBakContent == NULL) { DbgPrint(\"PTReceive:pPacketContent==NULL\\n\"); return(NDIS_STATUS_NOT_ACCEPTED); } NdisZeroMemory(pBakContent, BUFFER_SIZE); NdisMoveMemory(pBakContent, HeaderBuffer, HeaderBufferSize); NdisMoveMemory(pBakContent+HeaderBufferSize, LookAheadBuffer, LookAheadBufferSize); PacketLen = HeaderBufferSize + PacketSize; NdisAllocateBuffer(&Status, &pPacketBuffer, pAdapt->RecvBufferPoolHandle, pPacketContent, PacketSize-LookAheadBufferSize); NdisChainBufferAtFront(MyPacket, pPacketBuffer); MyPacket->Private.Head->Next=NULL; MyPacket->Private.Tail=NULL; OffsetSize = HeaderBufferSize + LookAheadBufferSize; NdisDprAllocatePacket(&Status, &MyPacket1, pAdapt->RecvPacketPoolHandle); NdisAllocateBuffer(&Status, &pBakBuffer, pAdapt->RecvBufferPoolHandle, pBakContent, OffsetSize); NdisChainBufferAtFront(MyPacket1, pBakBuffer); Rsvd = (PRSVD)(MyPacket->MiniportReserved); Rsvd->OriginalPkt = (PNDIS_PACKET)MyPacket1; NDIS_SET_PACKET_HEADER_SIZE(MyPacket, HeaderBufferSize); NdisTransferData(&Status, pAdapt->BindingHandle, MacReceiveContext, LookAheadBufferSize, PacketSize-LookAheadBufferSize, MyPacket, &BytesTransferred); if(Status != NDIS_STATUS_PENDING) { PtTransferDataComplete((NDIS_HANDLE)pAdapt, MyPacket, Status, BytesTransferred); } break; } pAdapt->IndicateRcvComplete = TRUE; } while(FALSE); return Status; } |
|
沙发#
发布于:2005-05-15 14:25
用softice在PtReceive下个断点,看看参数就好了
|
|
板凳#
发布于:2005-05-15 15:04
在研究中
其实我用wl也能看到变量的值,但是问题是 dd pPacketContent, 看到的东西是: 0010:81202828 FFFFFFF ........ ........ 0010:81202838 ........ ........ ....... 0010:81202848 ........ ........ ....... 0010:81202858 ........ ........ ....... 0010:81202868 ........ ........ ....... 0010:81202878 ........ ........ ....... 0010:81202888 ........ ........ ....... 这个就是数据包吗?怎么判断是什么类型的?? |
|
地板#
发布于:2005-05-17 19:53
建议你找个TCP/IP协议方面的书看看吧,NDIS只是一个软件的接口标准,它和通信协议是两回事情。
|
|
|
地下室#
发布于:2005-05-17 23:42
各位大虾,我想请问一下,如何触发数据接收中断从而进行处理呢.我的网卡驱动还不能连通网络,在这种情况下该如何测试比较好呢?
本来我是想通过FIRMWARE发虚拟数据,但那样更麻烦.楼主,能介绍介绍您的方法么 |
|
5楼#
发布于:2005-05-18 09:54
各位大虾,我想请问一下,如何触发数据接收中断从而进行处理呢.我的网卡驱动还不能连通网络,在这种情况下该如何测试比较好呢? 什么意思?你的网卡驱动还不能工作吗?如果能工作,安装了中断处理函数,由数据来了以后,就会触发,就会通知上层的协议驱动了? 你做的是什么驱动?miniport 还是 im ?如果不是做的miniport那 就先把你的网卡驱动配置好,使它能工作了,再往下做吧。 |
|
6楼#
发布于:2005-05-19 01:30
首先非常感谢您频繁为大家解决问题.我写的是无线网卡的miniport driver,因为这张网卡是张测试卡(目前只有MAC芯片,没有RF芯片),所以不可能正常连通网络.在这样一种情况下,我想知道,用writefile(),readfile()测试行吗>?我测过没成功,您认为这样具有可行性吗?
|
|