阅读:2633回复:9
当禁用RTL8139网卡为什么就死机了呢?请看源码!
我将本站RTL8139网卡原码编译后,替换原驱动程序,上网一切正常,但一禁用,系统黑屏,重启,是什么原因呢?我将启动时资源分配,禁用时资源释放,及UNLOAD例程(禁用时应该还没有调用这里吧,因为有两块这样的网卡,发现驱动装载时只进入一次DriverEntry,执行两次InitializeHandler例程)贴上,供大家分析,如有用8139网卡的希望能下载驱动原码试一下看看是怎么回事!
//IRQL:PASSIVE_LEVEL //USED BY RInit //#pragma PAGE_CODE NDIS_STATUS AllocRes( PADAPTER adapter ) { // PUCHAR Addr; // UINT bufsize; NDIS_STATUS Status; UINT i; // PVOID VirtualAddress; NDIS_PHYSICAL_ADDRESS PhysicalAddress; // ULONG phy; //rx_ring NdisMAllocateSharedMemory( adapter->MiniportAdapterHandle, RING_BUF_SIZE + RING_BUF_PAD, FALSE,//not cached (void **)&adapter->rx_ring, //虚拟地址 &PhysicalAddress //物理地址 ); if(adapter->rx_ring == NULL) return STATUS_INSUFFICIENT_RESOURCES; adapter->rx_ring_dma = PhysicalAddress; //align to 32? DbgPrint(\"rx_ring=%x, rx_ring_dma=%x \\n\",adapter->rx_ring,NdisGetPhysicalAddressLow(PhysicalAddress)); //tx_bufs NdisMAllocateSharedMemory( adapter->MiniportAdapterHandle, TX_BUF_SIZE * NUM_OF_DESC, FALSE,//not cached (void **)&adapter->tx_bufs, //虚拟地址 &PhysicalAddress //物理地址 ); if(adapter->tx_bufs == NULL) return STATUS_INSUFFICIENT_RESOURCES; adapter->tx_bufs_dma = PhysicalAddress; //align to 32 DbgPrint(\"tx_bufs=%x, tx_bufs_dma=%x \\n\",adapter->tx_bufs,NdisGetPhysicalAddressLow(PhysicalAddress)); //rx_bufs NdisMAllocateSharedMemory( adapter->MiniportAdapterHandle, RX_BUF_SIZE * NUM_OF_PACKETS, FALSE,//not cached (void **)&adapter->rx_bufs, //虚拟地址 &PhysicalAddress //物理地址 ); if(adapter->rx_bufs == NULL) return STATUS_INSUFFICIENT_RESOURCES; adapter->rx_bufs_dma = PhysicalAddress; //align to 32 DbgPrint(\"rx_bufs=%x, rx_bufs_dma=%x \\n\",adapter->rx_bufs,NdisGetPhysicalAddressLow(PhysicalAddress)); //分配 Packet pool,Buffer pool to rx NdisAllocatePacketPool( &Status, &adapter->pkt_pool, NUM_OF_PACKETS, 16 ); if(Status != NDIS_STATUS_SUCCESS) return STATUS_INSUFFICIENT_RESOURCES; DbgPrint(\"pkt_pool = %x \\n\", adapter->pkt_pool); NdisAllocateBufferPool( &Status, &adapter->buf_pool, NUM_OF_PACKETS ); if(Status != NDIS_STATUS_SUCCESS) return STATUS_INSUFFICIENT_RESOURCES; DbgPrint(\"buf_pool = %x \\n\", adapter->buf_pool); for(i = 0; i < NUM_OF_PACKETS; i ++){ NdisAllocatePacket( &Status, &adapter->pkt_desc, adapter->pkt_pool ); if(Status != NDIS_STATUS_SUCCESS) return STATUS_INSUFFICIENT_RESOURCES; NdisAllocateBuffer( &Status, &adapter->buf_desc, adapter->buf_pool, adapter->rx_bufs + (i * RX_BUF_SIZE), RX_BUF_SIZE ); //connection buf_desc->pkt_desc NdisChainBufferAtBack( adapter->pkt_desc, adapter->buf_desc ); } adapter->read_ptr = 0; adapter->FreeRxPkt = NUM_OF_PACKETS; adapter->cur_rx = 0; adapter->dirty_rx = 0; adapter->FreeTxDesc = NUM_OF_DESC; adapter->cur_tx = 0; adapter->dirty_tx = 0; return NDIS_STATUS_SUCCESS; } //IRQL:PASSIVE_LEVEL //USED BY RHalt //#pragma PAGE_CODE VOID FreeRes( PADAPTER adapter ) { // int i; //free i/o if(adapter->ioaddr != 0){ NdisMDeregisterIoPortRange( adapter->MiniportAdapterHandle, adapter->BaseIO, 0x100, (PVOID)&adapter->ioaddr ); } //free dma if(adapter){ NdisMFreeMapRegisters(adapter->MiniportAdapterHandle); } //free interrupt if(adapter->IRQVector > 0){ NdisMDeregisterInterrupt((struct _NDIS_MINIPORT_INTERRUPT *)adapter->MiniportAdapterHandle); } //free tx_bufs if(adapter->tx_bufs != NULL) NdisMFreeSharedMemory( adapter->MiniportAdapterHandle, TX_BUF_SIZE * NUM_OF_DESC, FALSE,//not cached adapter->tx_bufs, adapter->tx_bufs_dma ); //free tx_bufs if(adapter->rx_bufs != NULL) NdisMFreeSharedMemory( adapter->MiniportAdapterHandle, RX_BUF_SIZE * NUM_OF_PACKETS, FALSE,//not cached adapter->rx_bufs, adapter->rx_bufs_dma ); //free rx_ring if(adapter->rx_ring != NULL) NdisMFreeSharedMemory( adapter->MiniportAdapterHandle, RING_BUF_SIZE + RING_BUF_PAD, FALSE,//not cached adapter->rx_ring, adapter->rx_ring_dma ); if(adapter->buf_pool != NULL) NdisFreeBufferPool(adapter->buf_pool); if(adapter->pkt_pool != NULL) NdisFreeBufferPool(adapter->pkt_pool); //free adapter mem NdisFreeMemory( (PVOID)adapter, sizeof(ADAPTER), 0 ); } VOID RHalt( IN NDIS_HANDLE MiniportAdapterContext ) { PADAPTER adapter = (PADAPTER)MiniportAdapterContext; DbgPrint(\"RHalt \\n\"); while(adapter->FreeRxPkt != NUM_OF_PACKETS) DbgPrint(\"RHalt: FreeRxPkt=%x \\n\", adapter->FreeRxPkt); while(adapter->FreeTxDesc != NUM_OF_DESC) DbgPrint(\"RHalt: FreeTxDesc=%x \\n\", adapter->FreeTxDesc); NdisRawWritePortUshort(adapter->ioaddr + IntrMask, 0); NdisRawWritePortUchar(adapter->ioaddr + ChipCmd, 0); FreeRes((PADAPTER)MiniportAdapterContext); } VOID RUnload( IN PDRIVER_OBJECT DriverObject ) { // NDIS_STATUS status; UNICODE_STRING win32DeviceName; // DbgPrint((\"Unload Enter\\n\")); RtlInitUnicodeString(&win32DeviceName, L\"\\\\DosDevices\\\\miniport-rtl\"); IoDeleteSymbolicLink(&win32DeviceName); if(g_deviceObject) IoDeleteDevice(g_deviceObject); } |
|
沙发#
发布于:2003-06-24 23:22
搞不懂,原码斜成那个样子了,中间还有个表情符号,有趣!
大家帮忙哈! |
|
板凳#
发布于:2003-06-25 19:23
没人理我,自个顶!
|
|
地板#
发布于:2003-06-26 01:54
看我每天晚上这个时候都还不能入睡,大家都没点同情心?
|
|
地下室#
发布于:2003-06-27 09:54
NdisMDeregisterInterrupt((struct _NDIS_MINIPORT_INTERRUPT *)adapter->MiniportAdapterHandle);这儿错了吧,应该是:
NdisMDeregisterInterrupt(&adapter->IntObj); |
|
5楼#
发布于:2003-06-27 10:08
谢谢上面的仁兄,看了你的回答我现在对自己很生气了,居然那么信任别人的代码,自个又不仔细看,晚上试了再给仁兄敬分!
|
|
6楼#
发布于:2003-06-27 18:49
仍然黑屏,救命啊!
|
|
7楼#
发布于:2003-06-28 13:34
我这儿有无bug的源代码,还可以读取片上93c46,以及eeprom的内容,不过只能出售。
|
|
8楼#
发布于:2005-04-19 15:17
有人知道么
我只擦到Freeres有两处错误 一个是INT,另一个是 if(adapter->ioaddr != 0){ NdisMDeregisterIoPortRange( adapter->MiniportAdapterHandle, adapter->BaseIO, 0x100, /////////////////////////////////////// (PVOID)&adapter->ioaddr 应该是(PVOID)adapter->ioaddr ///////////////////////////////////// ); } |
|
9楼#
发布于:2007-03-01 13:47
那个源码到哪里下载啊,我找了很久都没有找到
|
|
|