亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? ezusbdevice.cpp

?? DriverStdio的一個USB驅動程序
?? CPP
?? 第 1 頁 / 共 4 頁
字號:
//
//		This routine will set or clear the 8051 reset bit on the EZUSB chip.
//		It issues the vendor command EZUSB_LOAD_INTERNAL.  byResetBit = 1 will
//		set the bit which will hold the 8051 in reset.  byResetBit = 0 will
//		clear the bit which will start the 8051 running again.
//
NTSTATUS EzUsbDevice::Reset8051(UCHAR byResetBit)
{
	t << "Entering Reset8051\n";

	NTSTATUS status = STATUS_SUCCESS;

	PURB pUrb = m_Lower.BuildVendorRequest(
							&byResetBit,
							1,
							0,
							EZUSB_LOAD_INTERNAL,
							EZUSB_CPU_CONTROL_STATUS_REG,
							FALSE,						//default
							FALSE,						//default
							NULL,						//default
							0,							//default
							URB_FUNCTION_VENDOR_DEVICE	//default
							);

	if( NULL == pUrb )
	{
		return STATUS_NO_MEMORY;
	}

	status = m_Lower.SubmitUrb(pUrb);

	delete pUrb;

	return status;
}

//=============================================================================
// EzUsbDevice::DownloadRAM
//
//		This routine will download firmware to internal or external RAM of the
//		EZUSB.  It uses vendor commands EZUSB_LOAD_EXTERNAL or 
//		EZUSB_LOAD_INTERNAL.
//
NTSTATUS EzUsbDevice::DownloadRAM(PINTEL_HEX_RECORD pHexRecord, bool fExternal)
{
	t << "Entering DownloadRAM\n";

	NTSTATUS status = STATUS_SUCCESS;
	URB Urb;

	while( 0 == pHexRecord->Type )
	{
		if( fExternal ? 
						(! EZUSB_INTERNAL_RAM( pHexRecord->Address )) : 
						(EZUSB_INTERNAL_RAM( pHexRecord->Address ))  
		  )
		{
			m_Lower.BuildVendorRequest(
				pHexRecord->Data,
				pHexRecord->Length,
				0,
				static_cast<UCHAR>( 
					fExternal ? EZUSB_LOAD_EXTERNAL : EZUSB_LOAD_INTERNAL),
				pHexRecord->Address,
				FALSE,						//default
				FALSE,						//default
				NULL,						//default
				0,							//default
				URB_FUNCTION_VENDOR_DEVICE,	//default
				&Urb
				);

			status = m_Lower.SubmitUrb(&Urb);

			if( !NT_SUCCESS(status) )
			{
				break;
			}
		}

		pHexRecord++;
	}

	return status;
}

//=============================================================================
// EzUsbDevice::DownloadIntelHex
//
//		This routine will download firmware to the EZUSB.  
//
NTSTATUS EzUsbDevice::DownloadIntelHex(PINTEL_HEX_RECORD pHexRecord)
{
	t << "Entering DownloadIntelHex\n";

	NTSTATUS status = STATUS_SUCCESS;

	// Download external RAM 
	status = DownloadRAM(pHexRecord, true);

	if( !NT_SUCCESS(status) )
		return status;

	Reset8051(1);

	// Download internal RAM 
	status = DownloadRAM(pHexRecord, false);

	return status;
}

//=============================================================================
// EzUsbDevice::AnchorDownload
//
//		This routine will download firmware to the EZUSB.  The download is
//		accomplished by issuing an _URB_CONTROL_VENDOR_OR_CLASS_REQUEST with
//		vendor specific command EZUSB_LOAD_INTERNAL.  The buffer of firmware
//		to download (pDownloadBuffer) will be split into nTransferLength 
//		requests of size nDownloadSize.
//
NTSTATUS EzUsbDevice::AnchorDownload(
   USHORT wOffset,
   PUCHAR pDownloadBuffer,
   ULONG nDownloadSize,
   ULONG nTransferLength,
   ULONG nTransferCount
   )
{
	t << "Entering AnchorDownload\n";

	NTSTATUS status = STATUS_SUCCESS;
	URB u;
	RtlZeroMemory(&u, sizeof(URB));

	for (ULONG i = 0; i < nTransferCount; i++)
	{
		//Initialize the URB
		 m_Lower.BuildVendorRequest(
			pDownloadBuffer,
			( (i == (nTransferCount - 1)) && 
			  (nDownloadSize % nTransferLength) ) ?
			  (nDownloadSize % nTransferLength) :
			   nTransferLength,
			0,
			static_cast<UCHAR>( EZUSB_LOAD_INTERNAL ),
			static_cast<USHORT>( (i * nTransferLength) + wOffset ),
			FALSE,						//default
			FALSE,						//default
			NULL,						//default
			0,							//default
			URB_FUNCTION_VENDOR_DEVICE,	//default
			&u
			);

		status = m_Lower.SubmitUrb(&u);

		if( !NT_SUCCESS(status) )
		{
			break;
		}

		pDownloadBuffer += nTransferLength;
	}

	return status;
}

//=============================================================================
// EzUsbDevice::InternalDeviceControl - Handler for IRP_MJ_INTERNAL_DEVICE_CONTROL
//
//		This handler is implemented in case there is an upper filter driver
//		which submits URBs to USBD for this USB device.  
//
NTSTATUS EzUsbDevice::InternalDeviceControl(KIrp I)
{ 
	t << "Entering InternalDeviceControl\n";

	I.ForceReuseOfCurrentStackLocationInCalldown();
	return m_Lower.PnpCall(this, I);
}

//=============================================================================
// EzUsbDevice::OnStopDevice - Handler for IRP_MJ_PNP / IRP_MN_STOP_DEVICE
//
//		The system calls this when the device is stopped.  The driver should 
//		unconfigure the USB device. 
//
NTSTATUS EzUsbDevice::OnStopDevice(KIrp I)
{
	NTSTATUS status = STATUS_SUCCESS;

	t << "Entering OnStopDevice\n";

	m_IntXfer.StopPolling();

	m_Lower.DeActivateConfiguration();

	return status;
	
	UNREFERENCED_PARAMETER(I);
}

//=============================================================================
// EzUsbDevice::OnRemoveDevice - Handler for IRP_MJ_PNP / IRP_MN_REMOVE_DEVICE
//
//		The system calls this when the device is removed.
//
NTSTATUS EzUsbDevice::OnRemoveDevice(KIrp I)
{
	t << "Entering OnRemoveDevice\n";

	m_IntXfer.StopPolling();

	return STATUS_SUCCESS;

	UNREFERENCED_PARAMETER(I);
}

//=============================================================================
// EzUsbDevice::Create - Handler for IRP_MJ_CREATE
//
NTSTATUS EzUsbDevice::Create(KIrp I)
{
	t << "Entering Create\n";

	I.ForceReuseOfCurrentStackLocationInCalldown();
	return m_Lower.PnpCall(this, I);
}

//=============================================================================
// EzUsbDevice::Close - Handler for IRP_MJ_CLOSE
//
NTSTATUS EzUsbDevice::Close(KIrp I)
{
	t << "Entering Close\n";

	I.ForceReuseOfCurrentStackLocationInCalldown();
	return m_Lower.PnpCall(this, I);
}

//=============================================================================
// EzUsbDevice::DeviceControl - Handler for IRP_MJ_DEVICE_CONTROL
//
//		The system calls this when an application issues DeviceIoControl
//
NTSTATUS EzUsbDevice::DeviceControl(KIrp I) 
{
	t << "Entering DeviceControl\n";

	NTSTATUS status = STATUS_SUCCESS;
	PVOID pBuffer = I.IoctlBuffer();
	ULONG dwInputBufferSize = I.IoctlInputBufferSize();
	ULONG dwOutputBufferSize = I.IoctlOutputBufferSize();

	I.Information() = 0;
	I.Status() = STATUS_SUCCESS;

	switch( I.IoctlCode() )
	{

///////////////////////////////////////////////////////////////////////////////////////////////////

	case IOCTL_EZUSB_GET_PIPE_INFO:

		t << "IOCTL_EZUSB_GET_PIPE_INFO \n";

		if( m_UsbInterface.m_Information )
		{
			//Copy the USBD_INTERFACE_INFORMATION structure stored in the KUsbInterface object
			//to the user's buffer
			RtlCopyMemory(
				reinterpret_cast<PUCHAR>( pBuffer ),
				reinterpret_cast<PUCHAR>( m_UsbInterface.m_Information ),
				m_UsbInterface.m_Information->Length
				);

			I.Information() = m_UsbInterface.m_Information->Length;
			status = STATUS_SUCCESS;
		}
		else
		{
			status = STATUS_UNSUCCESSFUL;
		}

		break;

///////////////////////////////////////////////////////////////////////////////////////////////////

	case IOCTL_EZUSB_GET_DEVICE_DESCRIPTOR:
	{
		t << "IOCTL_EZUSB_GET_DEVICE_DESCRIPTOR \n";

		status = m_Lower.GetDeviceDescriptor( PUSB_DEVICE_DESCRIPTOR(pBuffer) );

		if( NT_SUCCESS(status) )
		{
			I.Information() = PUSB_DEVICE_DESCRIPTOR(pBuffer)->bLength;
		}

		break;
	}

///////////////////////////////////////////////////////////////////////////////////////////////////
		
	case IOCTL_EZUSB_GET_CONFIG_DESCRIPTOR:
	{
		t << "IOCTL_EZUSB_GET_CONFIG_DESCRIPTOR \n";

		// The KUsbLowerDevice object contains a pointer to the configuration descriptor.
		// We simply copy the requested number of bytes from it to the IRP buffer.
		RtlCopyMemory(pBuffer, m_Lower.m_Config, dwOutputBufferSize);
		I.Information() = dwOutputBufferSize;

		break;
	}

///////////////////////////////////////////////////////////////////////////////////////////////////
		
	case IOCTL_EZUSB_VENDOR_REQUEST:
	
		t << "IOCTL_EZUSB_VENDOR_REQUEST \n";

		VendorRequest( 
			reinterpret_cast<PVENDOR_REQUEST_IN>(pBuffer), 
			I.Information()
			);

		status = STATUS_SUCCESS; // This prevents error messages in EzMr when downloading firmware
		
		break;

///////////////////////////////////////////////////////////////////////////////////////////////////
		
	case IOCTL_EZUSB_ANCHOR_DOWNLOAD2:

		t << "IOCTL_EZUSB_ANCHOR_DOWNLOAD2 \n";

		status = AnchorDownload(
					0,
					reinterpret_cast<PUCHAR>(pBuffer),
					dwInputBufferSize,
					EZUSB_ANCHOR_DOWNLOAD2_SEGMENT_SIZE,
					dwInputBufferSize / EZUSB_ANCHOR_DOWNLOAD2_SEGMENT_SIZE
					);

		break;

///////////////////////////////////////////////////////////////////////////////////////////////////
		
	case IOCTL_EZUSB_RESET:
	{
		t << "IOCTL_EZUSB_RESET \n";

		ULONG_PTR nInfo = NULL;

		status = m_Lower.DeviceIoControl(
							IOCTL_INTERNAL_USB_RESET_PORT,
							NULL,
							0,
							NULL,
							0,
							TRUE,
							&nInfo
							);
	
		break;
	}

///////////////////////////////////////////////////////////////////////////////////////////////////

	case IOCTL_EZUSB_RESETPIPE:
	{
		t << "IOCTL_EZUSB_RESETPIPE \n";

		ULONG dwPipeNum = *( reinterpret_cast<PULONG>(pBuffer) );

		KUsbPipe* pipe = FindPipe(dwPipeNum);

		if(NULL == pipe)
		{
			status = STATUS_INVALID_PARAMETER;
		}
		else
		{
			status = pipe->Reset();
		}

		break;
	}

///////////////////////////////////////////////////////////////////////////////////////////////////
		
	case IOCTL_EZUSB_ABORTPIPE:
	{
		t << "IOCTL_EZUSB_ABORTPIPE \n";

		ULONG dwPipeNum = *( reinterpret_cast<PULONG>(pBuffer) );

		KUsbPipe* pipe = FindPipe(dwPipeNum);

		if(NULL == pipe)
		{
			status = STATUS_INVALID_PARAMETER;
		}
		else
		{
			status = pipe->Abort();
		}

		break;
	}

///////////////////////////////////////////////////////////////////////////////////////////////////
		
	case IOCTL_EZUSB_SETINTERFACE:
	{
		t << "IOCTL_EZUSB_SETINTERFACE \n";

		PSET_INTERFACE_IN p = reinterpret_cast<PSET_INTERFACE_IN>(pBuffer);

		SA_STATUS saStatus = m_UsbInterface.SelectAlternate(p->alternateSetting);

		if( SA_SUCCESS != saStatus )
		{
			t << "Error SelectAlternate returns " << static_cast<ULONG>(saStatus) << "\n";
			status = STATUS_UNSUCCESSFUL;
		}
		else
		{
			status = STATUS_SUCCESS;
		}

		break;
	}

///////////////////////////////////////////////////////////////////////////////////////////////////

	case IOCTL_EZUSB_GET_STRING_DESCRIPTOR:

		t << "IOCTL_EZUSB_GET_STRING_DESCRIPTOR \n";

		if( (dwInputBufferSize >= sizeof(GET_STRING_DESCRIPTOR_IN)) &&
			(dwOutputBufferSize > 0)
		  )
		{
			PGET_STRING_DESCRIPTOR_IN p = reinterpret_cast<PGET_STRING_DESCRIPTOR_IN>(pBuffer);
			URB u;

			UsbBuildGetDescriptorRequest(
				&u,
				sizeof(_URB_CONTROL_DESCRIPTOR_REQUEST),
				USB_STRING_DESCRIPTOR_TYPE,
				p->Index,
				p->LanguageId,
				p,
				PMDL(0),
				dwOutputBufferSize,
				NULL
				);

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产丝袜美腿一区二区三区| 亚洲国产精品成人综合色在线婷婷| 日韩美女在线视频| 亚洲国产成人在线| 日韩精品久久理论片| 国产综合久久久久影院| 色88888久久久久久影院按摩| 欧美精品一区二区三区蜜桃| 性久久久久久久| 成人免费毛片a| 欧美sm极限捆绑bd| 亚洲电影一区二区三区| 成人开心网精品视频| 欧美电视剧免费全集观看| 亚洲一区自拍偷拍| 成a人片亚洲日本久久| 国产色一区二区| 国产真实乱对白精彩久久| 欧美主播一区二区三区| 亚洲欧美日本韩国| 国产69精品久久777的优势| 欧美成人r级一区二区三区| 婷婷夜色潮精品综合在线| 色婷婷香蕉在线一区二区| 国产欧美日产一区| 国产在线精品免费av| 日韩亚洲欧美在线观看| 亚洲成av人片一区二区三区| 色综合网站在线| ㊣最新国产の精品bt伙计久久| 成人三级伦理片| 久久久精品蜜桃| 国产aⅴ综合色| 国产欧美日韩视频在线观看| 成人免费高清视频在线观看| 欧美国产精品v| 丁香婷婷综合激情五月色| 久久久国产综合精品女国产盗摄| 精品一区二区在线视频| 精品理论电影在线| 国产精品一区一区| 欧美激情资源网| 91在线你懂得| 一区二区三区在线视频观看| 在线一区二区三区| 亚洲.国产.中文慕字在线| 欧美二区乱c少妇| 麻豆国产精品一区二区三区 | 欧美tickling挠脚心丨vk| 美女一区二区视频| 欧美精品一区二区三区蜜臀| 国产精品一区专区| 亚洲欧美日韩国产中文在线| 在线免费观看日韩欧美| 日本va欧美va欧美va精品| 久久综合狠狠综合| 91视频国产资源| 视频一区二区三区中文字幕| 日韩一级二级三级精品视频| 国产一区 二区| 亚洲素人一区二区| 欧美三日本三级三级在线播放| 日日嗨av一区二区三区四区| 2021国产精品久久精品| 99免费精品视频| 亚洲成人资源网| 久久影院视频免费| 欧美做爰猛烈大尺度电影无法无天| 日本不卡一区二区三区高清视频| 国产日韩欧美亚洲| 欧美精选午夜久久久乱码6080| 国产一区二区三区最好精华液| 中文字幕一区二区三中文字幕| 欧美人与性动xxxx| 国产成人精品三级| 天天做天天摸天天爽国产一区 | 亚洲视频免费看| 日韩欧美一级二级| 在线观看视频一区二区| 国产成人欧美日韩在线电影| 天堂成人国产精品一区| 国产精品美女久久久久久久久| 日韩一区二区在线看片| 色婷婷综合久久久久中文一区二区| 国产综合色产在线精品| 亚洲va韩国va欧美va| 亚洲三级在线看| 久久久久久9999| 精品人在线二区三区| 欧美三级电影在线看| 成人av片在线观看| 国产精品99久久不卡二区| 日本不卡不码高清免费观看| 一区二区三区久久| 国产精品久久久久久久久久免费看 | 成人免费看片app下载| 日本午夜一区二区| 亚洲成人黄色影院| 亚洲精品免费在线观看| 中文在线免费一区三区高中清不卡| 日韩一二三区视频| 欧美午夜电影在线播放| 91麻豆国产精品久久| av一区二区三区四区| 成人高清免费观看| 国产夫妻精品视频| 国产精品一区久久久久| 国产一区二区三区精品视频| 看国产成人h片视频| 久久激情综合网| 久久99蜜桃精品| 久久疯狂做爰流白浆xx| 久久精品国产网站| 久久66热偷产精品| 经典三级视频一区| 久久机这里只有精品| 国产一区二区视频在线播放| 国产.欧美.日韩| 成人av集中营| 色香蕉久久蜜桃| 欧美亚洲综合久久| 欧美一区二区私人影院日本| 日韩欧美国产一区二区在线播放| 日韩精品资源二区在线| 欧美精品一区二区三区高清aⅴ| 精品国产一区二区三区久久影院| 精品国产露脸精彩对白| 精品国产一区二区三区av性色| 久久婷婷综合激情| 国产精品网曝门| 亚洲少妇中出一区| 亚洲国产成人av| 美女久久久精品| 丁香激情综合国产| 色婷婷一区二区三区四区| 欧美久久一二区| 亚洲精品一线二线三线| 国产精品伦理一区二区| 亚洲精品视频观看| 九一久久久久久| 91亚洲资源网| 欧美一区二区成人| 国产亚洲成av人在线观看导航| 亚洲视频资源在线| 日韩avvvv在线播放| 国产麻豆一精品一av一免费| av在线不卡电影| 日韩视频免费观看高清完整版| 日本一区二区免费在线| 一区二区三区成人| 国产真实乱子伦精品视频| 色婷婷久久99综合精品jk白丝 | 91久久一区二区| 精品日本一线二线三线不卡| 亚洲三级在线免费观看| 精品一区二区久久| 欧美无乱码久久久免费午夜一区| 欧美成人高清电影在线| 亚洲女女做受ⅹxx高潮| 国产一区二区视频在线| 欧美日韩激情在线| 中文字幕一区av| 久久国产精品99久久人人澡| 欧美亚洲免费在线一区| 国产日韩视频一区二区三区| 天堂资源在线中文精品| 风间由美一区二区av101| 欧美一区午夜精品| 亚洲品质自拍视频网站| 国产一区啦啦啦在线观看| 欧美色国产精品| 亚洲视频小说图片| 国产老妇另类xxxxx| 日韩欧美一区二区免费| 亚洲最快最全在线视频| 丁香网亚洲国际| 精品欧美一区二区久久| 日韩激情av在线| 欧美情侣在线播放| 亚洲激情在线激情| 99久久精品免费看| 中文字幕av一区二区三区高| 玖玖九九国产精品| 欧美一卡二卡三卡| 日本麻豆一区二区三区视频| 欧美日韩精品一区二区三区蜜桃| 亚洲免费在线观看| 成人18视频日本| 综合网在线视频| 91免费国产视频网站| 中文字幕一区二区不卡| 成人不卡免费av| 中文av字幕一区| 成人精品视频一区二区三区尤物| 久久久久国产成人精品亚洲午夜| 国产一区中文字幕| 精品99久久久久久| 久久99国产精品免费网站| 精品国产麻豆免费人成网站| 久久99热国产|