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

📄 usbwirelessdevice.cpp

📁 该程序实现了d12芯片和计算机的驱动连接
💻 CPP
📖 第 1 页 / 共 2 页
字号:
//	Return Value:
//		NTSTATUS - Result code
//
//	Comments:
//

NTSTATUS USBWirelessDevice::Close(KIrp I)
{
	NTSTATUS status;

	t << "现在进入USBWirelessDevice::Close\n ";

// TODO: Add driver specific close handling code here

	// Generally a close IRP is targeted at our FDO, so we don't need
	// to pass it down to the PDO.  We have found for some devices, the
	// PDO is not expecting this Irp and returns an error code.
	// The default wizard code, therefore completes the Irp here using
	// PnpComplete().  The following commented code could be used instead
	// of PnpComplete() to pass the Irp to the PDO, which would complete it.
	//
//	I.ForceReuseOfCurrentStackLocationInCalldown();
//	status = m_Lower.PnpCall(this, I);

	status = I.PnpComplete(this, STATUS_SUCCESS, IO_NO_INCREMENT);

	t << "USBWirelessDevice::Close Status " << (ULONG)status << EOL;

    return status;
}

////////////////////////////////////////////////////////////////////////
//  USBWirelessDevice::DeviceControl
//
//	Routine Description:
//		Handler for IRP_MJ_DEVICE_CONTROL
//
//	Parameters:
//		I - Current IRP
// 
//	Return Value:
//		None
//
//	Comments:
//		This routine is the first handler for Device Control requests.
//		The KPnpDevice class handles restricting IRP flow
//		if the device is stopping or being removed.
//

NTSTATUS USBWirelessDevice::DeviceControl(KIrp I) 
{
	NTSTATUS status;

	t << "现在进入USBWirelessDevice::Device Control\n ";
	switch (I.IoctlCode())
	{
		case USBWIRELESS_IOCTL_800_1IN:
			status = USBWIRELESS_IOCTL_800_1IN_Handler(I);
			break;

		case USBWIRELESS_IOCTL_801_1OUT:
			status = USBWIRELESS_IOCTL_801_1OUT_Handler(I);
			break;

		default:
			// Unrecognized IOCTL request
			status = STATUS_INVALID_PARAMETER;
			break;
	}

	// If the IRP's IOCTL handler deferred processing using some driver
	// specific scheme, the status variable is set to STATUS_PENDING.
	// In this case we simply return that status, and the IRP will be
	// completed later.  Otherwise, complete the IRP using the status
	// returned by the IOCTL handler.
	if (status == STATUS_PENDING)
	{
		return status;
	}
	else
	{
		return I.PnpComplete(this, status);
	}
}

////////////////////////////////////////////////////////////////////////
//  USBWirelessDevice::USBWIRELESS_IOCTL_800_1IN_Handler
//
//	Routine Description:
//		Handler for IO Control Code USBWIRELESS_IOCTL_800_1IN
//
//	Parameters:
//		I - IRP containing IOCTL request
//
//	Return Value:
//		NTSTATUS - Status code indicating success or failure
//
//	Comments:
//		This routine implements the USBWIRELESS_IOCTL_800_1IN function.
//		This routine runs at passive level.
//

NTSTATUS USBWirelessDevice::USBWIRELESS_IOCTL_800_1IN_Handler(KIrp I)
{
	NTSTATUS status = STATUS_SUCCESS;

	t << "现在进入USBWirelessDevice::USBWIRELESS_IOCTL_800_1IN_Handler	1\n" ;
// TODO:	Verify that the input parameters are correct
//			If not, return STATUS_INVALID_PARAMETER

// TODO:	Handle the the RWB_IOCTL_800 request, or 
//			defer the processing of the IRP (i.e. by queuing) and set
//			status to STATUS_PENDING.



// TODO:	Assuming that the request was handled here. Set I.Information
//			to indicate how much data to copy back to the user.
	I.Information() = 0;

	t << "USBWIRELESS_IOCTL_800_1IN_Handler:将要获取应用程序传过来的数据\n" ;

	PUCHAR IrpBuffer = PUCHAR (I.IoctlBuffer());

    for(char i=0;i<16;i++) m_bufferOUT[i] = IrpBuffer[i];

	t << "USBWIRELESS_IOCTL_800_1IN_Handler:已经获取应用程序传过来的数据\n" ;

	//m_bufferOUT 里面的数据将会传送给单片机,所以应用程序传过来的数据应该赋给m_bufferOUT
	////////////////////////////////////////////////////
	//自己添加的

	m_pUrbOUT = m_Endpoint1OUT.BuildInterruptTransfer(
				m_bufferOUT,						// transfer buffer
				16,								// transfer buffer size
				TRUE,							// Short Ok
				NULL,							// link urb
				m_pUrbOUT//,							// urb
				//FALSE
				);	//创建中断传输URB,原来的m_pUrbOUT


	if ( m_pUrbOUT == NULL )
	{
		return STATUS_INSUFFICIENT_RESOURCES;;
	}

	PVOID CI = InterlockedCompareExchangePointer( (PVOID*)&CurrentIrp(), PVOID( PIRP(I)), NULL);

	// Allow only one request at a time	
	if ( CI != NULL ) return STATUS_DEVICE_BUSY;

	CancelSpinLock::Acquire();
	if ( I.WasCanceled() )
	{
		CurrentIrp() = NULL;
		CancelSpinLock::Release();
		return STATUS_CANCELLED;
	}

	I.SetCancelRoutine( LinkTo(Cancel) );
	CancelSpinLock::Release();
	I.MarkPending();

	t << "Submit OUT URB\n";
	// submit the URB to USBD
	m_Endpoint1OUT.SubmitUrb(m_kIrp, m_pUrbOUT, LinkTo(USBWIRELESS_IOCTL_800_HandlerComplete), this);
	//将URB发送给系统USB总线驱动程序进行处理,并设置完成例程
	
//	m_Endpoint1OUT.SubmitUrb(m_pUrbOUT);
	////////////////////////////////////////////////////

	return STATUS_PENDING;
}

NTSTATUS USBWirelessDevice::USBWIRELESS_IOCTL_800_HandlerComplete(KIrp I)
{
	NTSTATUS status;

	t << "现在进入USBWIRELESS_IOCTL_800_HandlerComplete例程e\n";

	KIrp Current( CurrentIrp() );

	// If there is no current IRP, just release resources and return
	if ( !Current.IsNull() )
	{
		CancelSpinLock::Acquire();
		if ( Current.WasCanceled() )
		{
			CancelSpinLock::Release();
		}
		else
		{
			Current.SetCancelRoutine(NULL);
			CancelSpinLock::Release();
			CurrentIrp() = NULL;

			if ( I.Status() != STATUS_SUCCESS )
			{	//URB传输错误
				t << "URB传输错误\n";
				status = I.Status();
			}
			else
			{	//URB传输正确
				t << "800 URB传输正确\n";
				status = STATUS_SUCCESS;
				// find the buffer pointer in the URB
 				//PUCHAR buffer = (PUCHAR)m_pUrb->UrbBulkOrInterruptTransfer.TransferBuffer;
				//源数据

				// Dump the buffer		
				//PUCHAR IrpBuffer = PUCHAR(Current.IoctlBuffer());
				//目的数据
				//IrpBuffer[0] = buffer[0];	//拷贝数据
				Current.Information() = 16;
			}
			Current.PnpComplete(this, status);
		}
	}

		t << "现在跳出800 Complete例程\n";

	//DecrementOutstandingRequestCount();
	// return indicates that system is to quit processing IRP completion
	return STATUS_MORE_PROCESSING_REQUIRED;
	
}

////////////////////////////////////////////////////////////////////////
//  USBWirelessDevice::USBWIRELESS_IOCTL_801_1OUT_Handler
//
//	Routine Description:
//		Handler for IO Control Code USBWIRELESS_IOCTL_801_1OUT
//
//	Parameters:
//		I - IRP containing IOCTL request
//
//	Return Value:
//		NTSTATUS - Status code indicating success or failure
//
//	Comments:
//		This routine implements the USBWIRELESS_IOCTL_801_1OUT function.
//		This routine runs at passive level.
//

NTSTATUS USBWirelessDevice::USBWIRELESS_IOCTL_801_1OUT_Handler(KIrp I)
{
	NTSTATUS status = STATUS_SUCCESS;

	t << "现在进入USBWirelessDevice::USBWIRELESS_IOCTL_801_1OUT_Handler\n" ;
// TODO:	Verify that the input parameters are correct
//			If not, return STATUS_INVALID_PARAMETER

// TODO:	Handle the the USBWIRELESS_IOCTL_801_1OUT request, or 
//			defer the processing of the IRP (i.e. by queuing) and set
//			status to STATUS_PENDING.

// TODO:	Assuming that the request was handled here. Set I.Information
//			to indicate how much data to copy back to the user.
	I.Information() = 0;

////////////////////////////////////////////////////
	//自己添加的

	m_pUrbIN = m_Endpoint1IN.BuildInterruptTransfer(
				m_bufferIN,						// transfer buffer
				16,								// transfer buffer size
				TRUE,							// Short Ok
				NULL,							// link urb
				m_pUrbIN//,							// urb
				//FALSE
				);	//创建中断传输URB,原来的m_pUrbOUT


	if ( m_pUrbIN == NULL )
	{
		return STATUS_INSUFFICIENT_RESOURCES;;
	}
	t << "现在m_pUrbIN被创建了\n" ;

	PVOID CI = InterlockedCompareExchangePointer( (PVOID*)&CurrentIrp(), PVOID( PIRP(I)), NULL);

	// Allow only one request at a time	
	if ( CI != NULL ) return STATUS_DEVICE_BUSY;

	CancelSpinLock::Acquire();
	if ( I.WasCanceled() )
	{
		CurrentIrp() = NULL;
		CancelSpinLock::Release();
		return STATUS_CANCELLED;
	}

	I.SetCancelRoutine( LinkTo(Cancel) );
	CancelSpinLock::Release();
	I.MarkPending();

	t << "Submit IN URB\n";
	// submit the URB to USBD
	m_Endpoint1IN.SubmitUrb(m_kIrp, m_pUrbIN, LinkTo(USBWIRELESS_IOCTL_801_HandlerComplete), this);
	//将URB发送给系统USB总线驱动程序进行处理,并设置完成例程
	
//	m_Endpoint1OUT.SubmitUrb(m_pUrbOUT);
	////////////////////////////////////////////////////
	t << "现在跳出USBWirelessDevice::USBWIRELESS_IOCTL_801_1OUT_Handler\n" ;

	return STATUS_PENDING;
}


NTSTATUS USBWirelessDevice::USBWIRELESS_IOCTL_801_HandlerComplete(KIrp I)
{
NTSTATUS status;

	t << "进入 801 Completion例程\n";

	KIrp Current( CurrentIrp() );

	// If there is no current IRP, just release resources and return
	if ( !Current.IsNull() )
	{
		CancelSpinLock::Acquire();
		if ( Current.WasCanceled() )
		{
			CancelSpinLock::Release();
		}
		else
		{
			Current.SetCancelRoutine(NULL);
			CancelSpinLock::Release();
			CurrentIrp() = NULL;

			if ( I.Status() != STATUS_SUCCESS )
			{	//URB传输错误
				t << "URB传输错误\n";
				status = I.Status();
			}
			else
			{	//URB传输正确
				t << "801 URB传输正确\n";
				status = STATUS_SUCCESS;
			///*	// find the buffer pointer in the URB
 				PUCHAR buffer = (PUCHAR)m_pUrbIN->UrbBulkOrInterruptTransfer.TransferBuffer;
				//源数据

				// Dump the buffer		
				PUCHAR IrpBuffer = PUCHAR(Current.IoctlBuffer());
				//目的数据
				//IrpBuffer[0] = buffer[0];	//拷贝数据*/
				for(char i=0;i<16;i++)  IrpBuffer[i] = buffer[i];
				Current.Information() = 16;
			}
			Current.PnpComplete(this, status);
		}
	}

	t << "跳出801 Complete例程\n";

	//DecrementOutstandingRequestCount();
	// return indicates that system is to quit processing IRP completion
	return STATUS_MORE_PROCESSING_REQUIRED;
	
}


////////////////////自己加载的函数///////////////////
VOID USBWirelessDevice::Cancel(KIrp I)
{
	if ( (PIRP)I == CurrentIrp() )
	{
		CurrentIrp() = NULL;
		CancelSpinLock::Release(I.CancelIrql());
		I.Information() = 0;
		I.PnpComplete(this, STATUS_CANCELLED);
		IncrementOutstandingRequestCount();
		m_pItem.Queue(LinkTo(Workitem), this);	//排队工作项
	}
	else
		CancelSpinLock::Release(I.CancelIrql());
}

void USBWirelessDevice::GetStringDescriptors(void)
{
	NTSTATUS status = STATUS_SUCCESS;

	//PWCHAR String = (PWCHAR) new (NonPagedPool) WCHAR[MAXIMUM_USB_STRING_LENGTH];

//	if(NULL == String)
//	{
		//error during allocation
	//	t << "ERROR: Memory allocation error in GetStringDescriptors().\n";
	//	return;
//	}

	USB_DEVICE_DESCRIPTOR desc;
	status = m_Lower.GetDeviceDescriptor( &desc );	//获取设备描述符
	if ( !NT_SUCCESS(status) )
	{
		t << "ERROR: Could not get Device Descriptor.\n";
		//delete String;
		return;
	}

	//下面显示设备描述符信息
	t << "idVendor = "	<< desc.idVendor 		<< "\n";
	t << "idProduct = "	<< desc.idProduct 			<< "\n";
	t << "DeviceProtocol = " << desc.bDeviceProtocol		<< "\n";
	t << "Number of configurations = "		<< desc.bNumConfigurations	<< "\n";
	//t << "Index of configuration string = " << m_Lower.m_Config->iConfiguration << "\n";

/*	t << "*****  USB Counter String Descriptors  *****\n";

	for(UCHAR i = 0; i <= NUM_STRING_DESCRIPTORS; i++)
	{
		RtlZeroMemory(String, MAXIMUM_USB_STRING_LENGTH * sizeof(WCHAR));

		if(NT_SUCCESS(status = m_Lower.GetStringDescriptor(
														i, 
														String, 
														MAXIMUM_USB_STRING_LENGTH, 
														0x109)))
		{
			if (i==0)
			{
				PUSHORT languageid = (PUSHORT)String;
				t << "String " << i << ": " << *languageid << "\n";
			}
			else
				t << "String " << i << ": " << String << "\n";
		}
		else
		{
			t << "GetStringDescriptor returns status = " << ULONG(status) << "\n";
		}
	}*/

	//delete String;
}

NTSTATUS USBWirelessDevice::OnQueryCapabilities(KIrp I)
{
	I.CopyParametersDown();
	I.SetCompletionRoutine(LinkTo(OnQueryCapabilitiesComplete), this);
	return m_Lower.PnpCall(this, I);
}

NTSTATUS USBWirelessDevice::OnQueryCapabilitiesComplete(KIrp I)
{
	if (I->PendingReturned)	I.MarkPending();
  	I.DeviceCapabilities()->SurpriseRemovalOK = TRUE;
	//当USB设备被意外拔去后,系统便不再出现警示界面提示

	return STATUS_SUCCESS;
}

VOID USBWirelessDevice::Workitem()
{
	m_Endpoint1IN.Abort();	//放弃中断传输
	DecrementOutstandingRequestCount();
	m_Endpoint1OUT.Abort();	//放弃中断传输
	DecrementOutstandingRequestCount();

}

⌨️ 快捷键说明

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