📄 usb_wirlessadapter.cpp
字号:
//
// 如果不能成功地完成初始化的工作,那么就要清除掉所有已分配的资源
//
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 + -