⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 usb_wirlessadapter.cpp

📁 一个无线网卡的驱动程序,基于win2
💻 CPP
📖 第 1 页 / 共 2 页
字号:
    //
    // 如果不能成功地完成初始化的工作,那么就要清除掉所有已分配的资源
    //

    if (status != NDIS_STATUS_SUCCESS)
    {
        DeinitializeDevice(Adapter);
    }
    else
    {
    }

    return status;
}

	

/*****************************************************************************
//
// 释放为适配器分配的资源
//
*****************************************************************************/

NDIS_STATUS

DeinitializeDevice( 
			IN OUT PUSB_DEVICE Adapter)
{
	UINT           i;
	NDIS_STATUS    status;
	NTSTATUS       ntstatus;

	status=NDIS_STATUS_SUCCESS;

	//
	// 释放所有接收缓冲队列的资源
	//

	for (i=0;i<NUM_RCV_BUFS;i++)
	{
		PNDIS_BUFFER   PBuffer=NULL;
		PRCV_BUFFER    PReceiveBuffer=&Adapter->rcvBufs[i];

		if (PReceiveBuffer->Packet!=NULL)
		{
			NdisFreePacket((PNDIS_PACKET) PReceiveBuffer->packet);
			PReceiveBuffer->Packet=NULL;
		}

		if (PReceiveBuffer->dataBuf!=NULL)
		{
			MemFree(PReceiveBuffer->dataBuf,MAX_PACKET_SIZE);
			PReceiveBuffer->dataBuf=NULL;
		}

		if (PReceiveBuffer->Urb!=NULL)
		{
            FreeXferUrb(PReceiveBuffer->Urb);
			PReceiveBuffer->Urb=NULL;
		}

	    PReceiveBuffer->dataLen = 0;
	}
		//
		// 释放掉该设备的所有包池和缓冲区池的句柄
		//

		if (Adapter->PacketPoolHandle)
		{
			NdisFreePacketPool(Adapter->PacketPoolHandle);
			Adapter->PacketPoolHandle=NULL;
		}

		if (Adapter->BufferPoolHandle)
		{
			NdisFreePacketPool(Adapter->BufferPoolHandle);
			Adapter->BufferPoolHandle=NULL;
		}

		if (Adapter->fDeviceStarted)
		{
			ntstatus=StopDevice(Adapter);
		}


		FreeWdmStuff( Adapter );
	
		return status;
}



/*****************************************************************************
//
// 终止该微端口NIC驱动程序,该函数释放由微端口所声明的系统资源
//
*****************************************************************************/

VOID
MiniportHalt(
		IN NDIS_HANDLE  MiniportAdapterContex)
{
	PUSB_DEVICE     Adapter;
	NDIS_STATUS     status;
	NTSTATUS        ntstatus;

	Adapter=CONTEX_TO_DEV(MiniportAdapterContex);

	if (TURE==Adapter->fPendingHalt)
	{
		goto release;
	}

	//
	// 让接收和发送完成例程明确有一个挂起重启
	//

	Adapter->fPendingHalt=TRUE;
    
	UsbCommonShutdown( Adapter );  // 停止任何正在进行的数据传输并且将NIC置为初始状态

	//
	// 判断是否没有任何剩下或被挂起的Read、Write、Control IRP
	//

	ASSERT(0==Adapter->PendingIrpCount);
    
	ASSERT(FALSE==Adapter->fSetpending);

	ASSERT(0==Adapter->fQuerypending);

	// 
	// 释放设备及其分配的资源
	//

	MemFree(Adapter,sizeof(USB_DEVICE));

release:
	
	
	return;

}




/*****************************************************************************
//
// 当微端口NIC删除或终止USB设备时,我们要释放为设备分配的系统资源
//
*****************************************************************************/


VOID	
UsbCommonShutdown(
			IN PUSB_DEVICE Adapter)

{
	NTSTATUS    ntstatus;

	//
	// 延迟50毫秒,以便挂起的I/O操作能够完成
	//

	NdisMSleep(50000);   // 引起调用者的线程在指定的间隔内阻塞

	//
	// 清除Device设备上的所有IRP,停止USB设备上的I/O操作
	//

	CancelPendingIo(Adapter);


    
	Adapter->fKillPassiveLevelThread=TRUE;

	KeSetEvent(&Adapter->EventPassiveThread, 0, FALSE);
	DbgPrint("Halt");

	while (Adapter->hPassiveThread!=NULL)
	{
		//
		// 延迟50毫秒
		//

	NdisMSleep(50000);
	
	}

	Adapter->fKillPollingThread=TURE;

   
	while (Device->hPollingThread != NULL)
    {
        //
        // 延迟50毫秒
        //

        NdisMSleep(50000);
    }

  
	DeinitializeDevice(Adapter);

	Adapter->fDeviceStarted=FALSE;

	Adapter->NumDataErrors=0; // 重新设置控制字记数器,用来判断是否重新启动设备


	return;
}


/*****************************************************************************
//
// 对NIC发出一个硬件复位命令
//
*****************************************************************************/

NDIS_STATUS
MiniportReset(
		OUT PBOOLEAN     AddressingReset,
        IN NDIS_HANDLE   MiniportAdapterHandle)

{

	PUSB_DEVICE   Adapter;
	NDIS_STATUS   status=NDIS_STATUS_SUCCESS;
	NDIS_PHYSICAL_ADDRESS  MaxAddr = NDIS_PHYSICAL_ADDRESS_CONST(-1,-1);

	Adapter=CONTEX_TO_DEV(MiniportAdapterHandle);

	if (TURE==Adapter->fPendingReset)
	{
		
        status = NDIS_STATUS_RESET_IN_PROGRESS ;

		goto release;
	}


	//
	// 让发送和接收完成例程明确有一个挂起重启
	//
	
	device->fPendingReset = TRUE;

    *AddressingReset = TRUE;

	if (FALSE==ScheduleWorkItem(
		                   Adapter,
						   ResetUsbDevice,
						   NULL,
						   0))
	{
		status=NDIS_STATUS_FAILURE;
	}

release:


	return status;

}





/*****************************************************************************
//
// NIC对底层USB设备发出一个硬件复位命令
//
*****************************************************************************/

PVOID
ResetUsbDevice(
		IN PUSB_WORK_ITEM   PWorkItem)

{
	NDIS_STATUS   status=NDIS_STATUS_FAILURE;

	PUSB_DEVICE   Adapter=(PUSB_DEVICE)pWorkItem->pDevice;

	FreeWorkItem(pWorkItem);

	UsbCommonShutdown(Adapter);// 停止任何正在进行的数据传输并且将NIC置为初始状态

	status=InitializeDevice(Adapter); // 初始化适配器,次操作必须成功

	if (status!=NDIS_STATUS_SUCCESS)
	{
		status=NDIS_STATUS_FAILURE;
	    
		goto release;
	
	}

	//
	// 初始化设备的接收
	//

	status=InitializeReceive(Adapter);

	if (status!=NDIS_STATUS_SUCCESS)
	{
		status=NDIS_STATUS_FAILURE;

		goto release;
	}
	 
	if (status!=NDIS_STATUS_SUCCESS)
	{
		NdisWriteErrorLogEntry(              // 向系统I/O出错日志文件写入一个条目
			          Adapter->MiniportHandle,
					  NDIS_ERROR_CODE_ADAPTER_NOT_FOUND,
		              1,
					  status);
		
		status=NDIS_STATUS_HARD_ERRORS;
	
		goto release;
	
	
	}


release:

	NdisMResetComplete(
		       Adapter->MiniportHandle,
			   (NDIS_STATUS)status,
			   TRUE);

	
    Adapter->fPendingReset    = FALSE;


}


/*****************************************************************************
//
// 通过NIC传递一个包到网络上
//
*****************************************************************************/

NDIS_STATUS
MiniportSend(
		IN NDIS_HANDLE     MiniportAdapterContext, //就是初始化时用SetAttributEx的USB_DEVICE device
        IN PNDIS_PACKET    hPacketToSend,
		IN UINT            Flags)
{
	NDIS_STATUS status;
	PUSB_DEVICE Adapter=(PUSB_DEVICE)MiniportAdapterContext;

	if (Adapter->RcvBuffersInUse>=(NUM_RCV_BUFS -2)) // 已用于接收的缓冲个数大于或等于14
	{
		status=NDIS_STATUS_FAILURE;

		goto release;
	}

	//
	// 如果端点为Stall状态
    //

	if (TURE==Adapter->fPendingWriteClearStall)
	{
		status=NDIS_STATUS_FAILURE;

		goto release;
	}

	status=(NDIS_STATUS)SendPacket(
		                       Adapter,
							   pPacketToSend,
							   Flags,
							   CONTEXT_NDIS_PACKET);

release: 

	return status;


}


/*****************************************************************************
//
// 确定接收缓冲是否为满
//
*****************************************************************************/

VOID
IndicateMediaBusy(IN PUSB_DEVICE Adapter)
{
	NdisMIndicateStatus(          // 向NDIS库指示NIC状态已变化
		          Adapter->MiniportHandle,
				  NDIS_STATUS_MEDIA_BUSY,
				  NULL,
				  0);
	  
	NdisMIndicateStatusComplete(
                  Adapter->MiniportHandle);

}
			 

/*****************************************************************************
//
// 开辟一块内存缓冲区
//
*****************************************************************************/

PVOID MemAlloc(UINT size)
{
    PVOID                 memptr;
    NDIS_PHYSICAL_ADDRESS noMaxAddr = NDIS_PHYSICAL_ADDRESS_CONST(-1,-1);
    NDIS_STATUS           status;


    status = NdisAllocateMemoryWithTag(&memptr, size, USB_TAG);

    if (status != NDIS_STATUS_SUCCESS)
    {
        memptr = NULL;
    }


    return memptr;
}


/*****************************************************************************
//
// 释放开辟的内存缓冲区
//
*****************************************************************************/

MemFree(
            PVOID memptr,
            UINT size
            )
{

    NdisFreeMemory(memptr, size, 0);

}































    



    



⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -