阅读:1783回复:1
求助:NdisSend在adsl下出现死机现象,请高人指点
这是个SendHandler的处理函数,在原来的系统没问题,在新的笔记本下出现的问题,而且只是在adsl拨号情况下NdisSend函数出现死机现象,,不知是跟硬件有关还是系统有关,新笔记本是compag presario b1900双内核系统,有哪位高人知道或者碰见这种问题请指点一下,代码其实很简单,如下:
NDIS_STATUS MPTest( IN NDIS_HANDLE MiniportAdapterContext, IN PNDIS_PACKET Packet, IN UINT Flags ) { PADAPT pAdapt = (PADAPT)MiniportAdapterContext; NDIS_STATUS Status; PNDIS_PACKET MyPacket; PNDIS_BUFFER buffer, new_buffer = NULL; PNDIS_PACKET new_packet = NULL; struct protocol_reserved *pr; PUCHAR data,dataptr ; ULONG size,offsize,tmpsize; PNDIS_BUFFER Mdl_Buf,Mdl_Next; PUCHAR pointer; UINT buf_len; KIRQL irql; KeAcquireSpinLock(&guard, &irql); NdisQueryPacket(Packet, NULL, NULL, &Mdl_Next, NULL); size=0; while(Mdl_Next) { Mdl_Buf=Mdl_Next; NdisGetNextBuffer(Mdl_Next,&Mdl_Next); NdisQueryBuffer(Mdl_Buf,&pointer,&buf_len); size+=buf_len; } MyDbgPrint(("size=%d!\n",size)); data= ExAllocatePool(NonPagedPool, (size)); if (data == NULL) { KdPrint(("[ndis_hk] send_out_packet: malloc_np!\n")); return STATUS_INSUFFICIENT_RESOURCES; } NdisQueryPacket(Packet, NULL, NULL, &Mdl_Next, NULL); dataptr=data; while(Mdl_Next) { Mdl_Buf=Mdl_Next; NdisGetNextBuffer(Mdl_Next,&Mdl_Next); NdisQueryBuffer(Mdl_Buf,&pointer,&buf_len); RtlCopyMemory(dataptr,pointer,buf_len); dataptr=dataptr+buf_len; } // now create our own new_packet NdisAllocateBuffer(&Status, &new_buffer, g_buffer_pool, data, size); if (Status != NDIS_STATUS_SUCCESS) { KdPrint(("[ndis_hk] send_out_packet: NdisAllocateBuffer: 0x%x\n", Status)); Status=STATUS_INSUFFICIENT_RESOURCES; } NdisAllocatePacket(&Status, &new_packet, g_packet_pool); if (Status != NDIS_STATUS_SUCCESS) { KdPrint(("[ndis_hk] send_out_packet: NdisAllocatePacket: 0x%x\n", Status)); Status=STATUS_INSUFFICIENT_RESOURCES; } NdisChainBufferAtFront(new_packet, new_buffer); // setup ProtocolReserved for completion pr = PROTOCOL_RESERVED(new_packet); pr->magic = send_out_packet; pr->buffer = new_buffer; pr->data = data; pr->pkt=Packet; NdisSend(&Status, pAdapt->BindingHandle, new_packet); if (Status != NDIS_STATUS_PENDING) { NdisIMCopySendCompletePerPacketInfo (Packet, new_packet); ExFreePool(data); NdisFreeBuffer(new_buffer); NdisFreePacket(new_packet); } KeReleaseSpinLock(&guard, irql); return Status; } |
|
沙发#
发布于:2009-04-09 15:46
操作系统式什么系统,你可以用windbg跟踪一下,看看运行到哪里就死机了。这样可以缩小问题的范围
|
|