zgm78
驱动牛犊
驱动牛犊
  • 注册日期2002-11-20
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分12分
  • 威望31点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
阅读:2633回复:9

当禁用RTL8139网卡为什么就死机了呢?请看源码!

楼主#
更多 发布于:2003-06-24 23:20
我将本站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);

}

zgm78
驱动牛犊
驱动牛犊
  • 注册日期2002-11-20
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分12分
  • 威望31点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2003-06-24 23:22
搞不懂,原码斜成那个样子了,中间还有个表情符号,有趣!
大家帮忙哈!
zgm78
驱动牛犊
驱动牛犊
  • 注册日期2002-11-20
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分12分
  • 威望31点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2003-06-25 19:23
没人理我,自个顶!
zgm78
驱动牛犊
驱动牛犊
  • 注册日期2002-11-20
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分12分
  • 威望31点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
地板#
发布于:2003-06-26 01:54
看我每天晚上这个时候都还不能入睡,大家都没点同情心?
freducn2002
驱动小牛
驱动小牛
  • 注册日期2002-06-26
  • 最后登录2018-05-29
  • 粉丝0
  • 关注0
  • 积分11分
  • 威望29点
  • 贡献值0点
  • 好评度7点
  • 原创分0分
  • 专家分0分
  • 社区居民
地下室#
发布于:2003-06-27 09:54
NdisMDeregisterInterrupt((struct _NDIS_MINIPORT_INTERRUPT *)adapter->MiniportAdapterHandle);这儿错了吧,应该是:
NdisMDeregisterInterrupt(&adapter->IntObj);
zgm78
驱动牛犊
驱动牛犊
  • 注册日期2002-11-20
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分12分
  • 威望31点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2003-06-27 10:08
谢谢上面的仁兄,看了你的回答我现在对自己很生气了,居然那么信任别人的代码,自个又不仔细看,晚上试了再给仁兄敬分!
zgm78
驱动牛犊
驱动牛犊
  • 注册日期2002-11-20
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分12分
  • 威望31点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2003-06-27 18:49
仍然黑屏,救命啊!
freducn2002
驱动小牛
驱动小牛
  • 注册日期2002-06-26
  • 最后登录2018-05-29
  • 粉丝0
  • 关注0
  • 积分11分
  • 威望29点
  • 贡献值0点
  • 好评度7点
  • 原创分0分
  • 专家分0分
  • 社区居民
7楼#
发布于:2003-06-28 13:34
我这儿有无bug的源代码,还可以读取片上93c46,以及eeprom的内容,不过只能出售。
mulagi
驱动牛犊
驱动牛犊
  • 注册日期2004-08-27
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2005-04-19 15:17
有人知道么
我只擦到Freeres有两处错误
一个是INT,另一个是
if(adapter->ioaddr != 0){
NdisMDeregisterIoPortRange(
adapter->MiniportAdapterHandle,
adapter->BaseIO,
0x100,
///////////////////////////////////////
(PVOID)&adapter->ioaddr       应该是(PVOID)adapter->ioaddr
/////////////////////////////////////
);
}
labbyshiro
驱动牛犊
驱动牛犊
  • 注册日期2007-03-01
  • 最后登录2007-03-01
  • 粉丝0
  • 关注0
  • 积分70分
  • 威望8点
  • 贡献值0点
  • 好评度7点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2007-03-01 13:47
那个源码到哪里下载啊,我找了很久都没有找到
n.n
游客

返回顶部