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

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

?? ch375wdm.c

?? 這是USB接口芯片CH372上位機和下位機的測試程序
?? C
?? 第 1 頁 / 共 3 頁
字號:
			mCompletion = 1;  // 操作已經完成
			break;
		case IRP_MN_QUERY_STOP_DEVICE:  // 將要停止設備
			if ( mDeviceExtension -> mExtIoCount != 0 ) {  // 當前正在操作
				mStatus = STATUS_UNSUCCESSFUL;  // 無法停止,操作失敗
				iIrp -> IoStatus.Information = 0;
				mCompletion = 1;  // 強制操作完成
			}
			else mDeviceExtension -> mExtDeviceStart = FALSE;  // 清除設備啟動標志
			break;
		case IRP_MN_CANCEL_STOP_DEVICE:  // 取消停止設備
			mDeviceExtension -> mExtDeviceStart = TRUE;  // 恢復設備啟動標志
			break;
		case IRP_MN_STOP_DEVICE:  // 停止設備
			mDeviceExtension -> mExtDeviceStart = FALSE;  // 清除設備啟動標志
			mDeactiveConfig( iDeviceObject, iIrp );  // 去除配置
			break;
		case IRP_MN_QUERY_REMOVE_DEVICE:  // 將要移除設備
			if ( mDeviceExtension -> mExtDeviceOpen != 0 ||  // 打開計數不為0則尚未關閉
				 mDeviceExtension -> mExtIoCount != 0 ) {  // 或者當前正在操作
				mStatus = STATUS_UNSUCCESSFUL;  // 無法移除,操作失敗
				iIrp -> IoStatus.Information = 0;
				mCompletion = 1;  // 強制操作完成
			}
			else {  // 尚未打開且設備空閑
				mDeviceExtension -> mExtDeviceRemove = TRUE;  // 置設備移除標志
				IoSetDeviceInterfaceState( & mDeviceExtension -> mExtDeviceName, FALSE );  // 禁用設備接口
			}
			break;
		case IRP_MN_CANCEL_REMOVE_DEVICE:  // 取消移除設備
			mDeviceExtension -> mExtDeviceRemove = FALSE;  // 清設備移除標志
			IoSetDeviceInterfaceState( & mDeviceExtension -> mExtDeviceName, TRUE );  // 恢復設備接口
			break;
		case IRP_MN_SURPRISE_REMOVAL:  // 意外地移除設備
			mDeviceExtension -> mExtDeviceRemove = TRUE;  // 置設備移除標志
			IoSetDeviceInterfaceState( & mDeviceExtension -> mExtDeviceName, FALSE );  // 禁用設備接口
			break;
		case IRP_MN_REMOVE_DEVICE:  // 移除設備
			mDeviceExtension -> mExtDeviceRemove = TRUE;  // 置設備移除標志
			IoSetDeviceInterfaceState( & mDeviceExtension -> mExtDeviceName, FALSE );  // 禁用設備接口
			mDeviceExtension -> mExtDeviceStart = FALSE;  // 清除設備啟動標志
			mRequestPipe( iDeviceObject, URB_FUNCTION_ABORT_PIPE, mPipeAuxDown );  // 在輔助下傳管道執行取消請求
			mRequestPipe( iDeviceObject, URB_FUNCTION_ABORT_PIPE, mPipeDataDown );  // 在下傳管道執行取消請求
			mRequestPipe( iDeviceObject, URB_FUNCTION_ABORT_PIPE, mPipeDataUp );  // 在上傳管道執行取消請求
			mDeactiveConfig( iDeviceObject, iIrp );  // 去除配置
			mRemoveDevice( iDeviceObject );  // 移除設備操作
			break;
		default:
			break;
	}
	if ( mCompletion == 0 ) {  // 操作尚未完成則繼續下傳
		IoSkipCurrentIrpStackLocation( iIrp );  // 直接傳送當前棧
		mStatus = IoCallDriver( mNextDeviceObject, iIrp );  // 傳送至下級設備
	}
	else if ( mCompletion == 1 ) {  // 操作已經完成
		iIrp -> IoStatus.Status = mStatus;  // 置完成狀態
		IoCompleteRequest( iIrp, IO_NO_INCREMENT );  // 完成當前IRP
	}
	return( mStatus );
}

NTSTATUS	mWaitCompletion(  // 等待IRP操作完成
	PDEVICE_OBJECT	iDeviceObject,
	PIRP			iIrp )
{
	KEVENT				mEvent;
	NTSTATUS			mStatus;
	mPDEVICE_EXTENSION	mDeviceExtension = iDeviceObject -> DeviceExtension;  // 設備擴展
	KeInitializeEvent( &mEvent, NotificationEvent, FALSE );  // 初始化IRP完成事件為無效
	IoCopyCurrentIrpStackLocationToNext( iIrp );  // 復制當前棧單元
	IoSetCompletionRoutine( iIrp, mCompletionRoutine, &mEvent, TRUE, TRUE, TRUE );  // 設置設定完成例程
	mStatus = IoCallDriver( mDeviceExtension -> mExtNextLowerDevice, iIrp );  // 傳送至下級設備
	if ( mStatus == STATUS_PENDING ) {  // 等待被懸掛的IO請求完成
		KeWaitForSingleObject( &mEvent, Executive, KernelMode, FALSE, NULL );  // 掛起等待IRP完成
		mStatus = iIrp -> IoStatus.Status;  // 取完成狀態
	}
	return( mStatus );  // 返回狀態
}

NTSTATUS	mCompletionRoutine(  // 操作完成例程
	PDEVICE_OBJECT	iDeviceObject,
	PIRP			iIrp,
	PVOID			iContext )  // 輸入參數,完成事件
{
	KeSetEvent( (PKEVENT)iContext, IO_NO_INCREMENT, FALSE );  // 置操作完成事件
	return( STATUS_MORE_PROCESSING_REQUIRED );  // 阻止繼續處理當前IRP
}

NTSTATUS	mActiveConfig(  // 激活配置
	PDEVICE_OBJECT	iDeviceObject,
	PIRP			iIrp )
{
	ULONG							i;
	PURB							mUrb;
	NTSTATUS						mStatus;
	PUSB_CONFIGURATION_DESCRIPTOR	mConfigDescriptor;
	PUSB_INTERFACE_DESCRIPTOR		mInterfaceDescriptor;
	USBD_INTERFACE_LIST_ENTRY		mInterfaceList[2];
	PUSBD_INTERFACE_INFORMATION		mInterface;
	PUSBD_PIPE_INFORMATION			mPipe;
	mPDEVICE_EXTENSION				mDeviceExtension = iDeviceObject -> DeviceExtension;  // 設備擴展
	mStatus = STATUS_INSUFFICIENT_RESOURCES;  // 預置操作失敗
	mDeviceExtension -> mExtInterUpPipe = NULL;
	mDeviceExtension -> mExtAuxDownPipe = NULL;
	mDeviceExtension -> mExtDataUpPipe = NULL;
	mDeviceExtension -> mExtDataDownPipe = NULL;
	mConfigDescriptor = ExAllocatePool( NonPagedPool,  // 分配內存作為配置描述符區域和URB請求塊
										256 + sizeof( URB ) );
	if ( mConfigDescriptor != NULL ) {  // 分配了內存
		mUrb = (PURB) ( (PUCHAR)mConfigDescriptor + 256 );  // 指向URB請求塊,前256字節保留給配置描述符
		UsbBuildGetDescriptorRequest( mUrb, sizeof( struct _URB_CONTROL_DESCRIPTOR_REQUEST ),  // 構造獲取配置描述符的URB
									  USB_CONFIGURATION_DESCRIPTOR_TYPE, 0, 0, mConfigDescriptor, NULL,  // 緩沖區
									  sizeof( USB_CONFIGURATION_DESCRIPTOR ), NULL );  // 配置描述符長度
		mStatus = mUsbSubmitUrb( iDeviceObject, mUrb );  // 提交URB
		if ( NT_SUCCESS( mStatus ) ) {  // 獲取了配置描述符
			UsbBuildGetDescriptorRequest( mUrb, sizeof(struct _URB_CONTROL_DESCRIPTOR_REQUEST ),  // 構造獲取配置描述符的URB
										  USB_CONFIGURATION_DESCRIPTOR_TYPE, 0, 0, mConfigDescriptor, NULL,  // 緩沖區
										  (ULONG)( mConfigDescriptor -> wTotalLength ), NULL );  // 配置描述符和配置信息的總長度
			mStatus = mUsbSubmitUrb( iDeviceObject, mUrb );  // 提交URB
			if ( NT_SUCCESS( mStatus ) && mConfigDescriptor -> bNumInterfaces == 0 )  // 獲取了配置描述符但是不完整
				mStatus = STATUS_DEVICE_DATA_ERROR;  // 接口描述符無效
			if ( NT_SUCCESS( mStatus ) ) {  // 獲取了配置描述符且接口描述符有效
				mInterfaceDescriptor = USBD_ParseConfigurationDescriptorEx( mConfigDescriptor, mConfigDescriptor, -1, -1, -1, -1, -1 );
				mInterfaceList[0].InterfaceDescriptor = mInterfaceDescriptor;
				mInterfaceList[0].Interface = NULL;
				mInterfaceList[1].InterfaceDescriptor = NULL;
				mInterfaceList[1].Interface = NULL;
				mUrb = USBD_CreateConfigurationRequestEx( mConfigDescriptor, mInterfaceList );  // 構造配置請求的URB
				if ( mUrb != NULL ) {  // 生成了URB
					mInterface = & mUrb -> UrbSelectConfiguration.Interface;  // 當前接口的信息
					for ( i = 0; i < mInterface -> NumberOfPipes; ++i ) {  // 檢查所有端點/管道
						mPipe = & mInterface -> Pipes[ i ];  // 指向管道
						if ( mPipe -> MaximumTransferSize > mMAX_BUFFER_LENGTH ) mPipe -> MaximumTransferSize = mMAX_BUFFER_LENGTH;
					}
					mStatus = mUsbSubmitUrb( iDeviceObject, mUrb );  // 提交URB
					if ( NT_SUCCESS( mStatus ) ) {  // 配置CH375芯片完成
						mInterface = & mUrb -> UrbSelectConfiguration.Interface;  // 當前接口的信息
						for ( i = 0; i < mInterface -> NumberOfPipes; ++i ) {  // 檢查所有端點/管道
							mPipe = & mInterface -> Pipes[ i ];  // 指向管道
							if ( mPipe -> MaximumTransferSize > mMAX_BUFFER_LENGTH ) mPipe -> MaximumTransferSize = mMAX_BUFFER_LENGTH;
							switch( mPipe -> EndpointAddress ) {  // 比較端點地址,以確定管道功能
								case 0x81: mDeviceExtension -> mExtInterUpPipe = mPipe -> PipeHandle; break;  // 保存中斷數據上傳管道的句柄
								case 0x01: mDeviceExtension -> mExtAuxDownPipe = mPipe -> PipeHandle; break;  // 保存輔助數據下傳管道的句柄
								case 0x82: mDeviceExtension -> mExtDataUpPipe = mPipe -> PipeHandle; break;  // 保存數據塊上傳管道的句柄
								case 0x02: mDeviceExtension -> mExtDataDownPipe = mPipe -> PipeHandle; break;  // 保存數據塊下傳管道的句柄
							}
						}
					}
					ExFreePool( mUrb );  // 釋放URB內存
				}
				else mStatus = STATUS_INSUFFICIENT_RESOURCES;  // 無法構造URB
			}
		}
		ExFreePool( mConfigDescriptor );  // 釋放配置描述符內存
	}
	return( mStatus );  // 返回狀態
}

NTSTATUS	mDeactiveConfig(  // 去除配置
	PDEVICE_OBJECT	iDeviceObject,
	PIRP			iIrp )
{
	ULONG				mPortStatus;
	PURB				mUrb;
	mPDEVICE_EXTENSION	mDeviceExtension;
	NTSTATUS			mStatus = STATUS_INSUFFICIENT_RESOURCES;  // 預置操作失敗
	mUrb = ExAllocatePool( NonPagedPool, sizeof( URB ) );  // 分配USB請求塊
	if ( mUrb != NULL ) {  // 分配了USB請求塊
		UsbBuildSelectConfigurationRequest( mUrb, sizeof( struct _URB_SELECT_CONFIGURATION ), NULL );  // 構造URB請求配置
		mStatus = mUsbSubmitUrb( iDeviceObject, mUrb );  // 提交URB
		ExFreePool( mUrb );  // 釋放URB
		mDeviceExtension = iDeviceObject -> DeviceExtension;  // 設備擴展
		mDeviceExtension -> mExtInterUpPipe = NULL;
		mDeviceExtension -> mExtAuxDownPipe = NULL;
		mDeviceExtension -> mExtDataUpPipe = NULL;
		mDeviceExtension -> mExtDataDownPipe = NULL;
	}
	return( mStatus );  // 返回狀態
}

NTSTATUS	mUsbSubmitUrb(  // 提交URB請求
	PDEVICE_OBJECT	iDeviceObject,
	PURB			iUrb )
{
	PIRP				mIrp;
	KEVENT				mEvent;
	mPDEVICE_EXTENSION	mDeviceExtension;
	IO_STATUS_BLOCK		mIoStatusBlock;
	NTSTATUS			mStatus = STATUS_INSUFFICIENT_RESOURCES;  // 預置操作失敗
	mDeviceExtension = iDeviceObject -> DeviceExtension;  // 設備擴展
	InterlockedIncrement( & mDeviceExtension -> mExtIoCount );  // 操作計數增量,阻止中途停止或者移除設備
	KeInitializeEvent( &mEvent, NotificationEvent, FALSE );  // 初始化IRP完成事件信號為無效
	mIrp = IoBuildDeviceIoControlRequest( IOCTL_INTERNAL_USB_SUBMIT_URB, mDeviceExtension -> mExtNextLowerDevice,
										  NULL, 0, NULL, 0, TRUE, &mEvent, &mIoStatusBlock );  // 構造IRP提交URB
	if ( mIrp != NULL ) {  // IRP有效
		IoGetNextIrpStackLocation( mIrp ) -> Parameters.Others.Argument1 = iUrb;  // 將URB作為參數傳遞給下級設備
		mStatus = IoCallDriver( mDeviceExtension -> mExtNextLowerDevice, mIrp );  // 向下級設備發送IO請求
		if ( mStatus == STATUS_PENDING ) {  // 等待被懸掛的IO請求完成
			KeWaitForSingleObject( &mEvent, Executive, KernelMode, FALSE, NULL );  // 掛起等待IRP完成
			mStatus = mIoStatusBlock.Status;  // 取完成狀態
		}
		if ( mStatus == STATUS_TIMEOUT ) mStatus = STATUS_IO_TIMEOUT;  // 轉換出錯代碼
	}
	InterlockedDecrement( & mDeviceExtension -> mExtIoCount );  // 操作計數減量
	return( mStatus );  // 返回狀態
}


// end

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美在线观看18| 捆绑调教一区二区三区| 成人免费视频app| 国产欧美一区二区三区在线老狼| 九色porny丨国产精品| 精品剧情v国产在线观看在线| 蜜桃视频在线一区| ww久久中文字幕| 国产69精品久久777的优势| 欧美激情在线观看视频免费| 成人开心网精品视频| 最新国产の精品合集bt伙计| 日本韩国一区二区三区视频| 天天操天天干天天综合网| 欧美大片一区二区三区| 国产成人午夜高潮毛片| 亚洲色图视频网站| 欧美性极品少妇| 日韩不卡一区二区三区 | 日韩有码一区二区三区| 精品日韩一区二区三区免费视频| 国产精品亚洲专一区二区三区 | 日韩一区二区三区四区五区六区| 久久99国产精品久久99果冻传媒| 日本一区二区三区四区| 91国在线观看| 九色综合国产一区二区三区| 亚洲欧美色图小说| 欧美大片免费久久精品三p| av激情成人网| 老色鬼精品视频在线观看播放| 国产精品国产三级国产普通话蜜臀| 欧美日韩国产大片| 成人永久看片免费视频天堂| 亚洲国产精品久久人人爱蜜臀 | 天天综合色天天| 中文欧美字幕免费| 欧美四级电影在线观看| 国产精品亚洲人在线观看| 亚洲第一搞黄网站| 国产精品久线观看视频| 日韩欧美一二三四区| 色婷婷精品大在线视频| 国产九色sp调教91| 日本不卡123| 一区二区三区日韩在线观看| 久久先锋影音av| 欧美一区二区三区小说| 色又黄又爽网站www久久| 经典三级在线一区| 五月婷婷欧美视频| 亚洲精品视频在线| 日本一区二区不卡视频| www国产成人免费观看视频 深夜成人网| 在线视频国内自拍亚洲视频| a亚洲天堂av| 成人性视频免费网站| 久久国产生活片100| 视频一区免费在线观看| 一区二区三区国产| 亚洲欧洲一区二区三区| 国产女人18毛片水真多成人如厕 | 国产亚洲欧美日韩在线一区| 欧美疯狂做受xxxx富婆| 91香蕉国产在线观看软件| 高潮精品一区videoshd| 久久国产免费看| 美女精品一区二区| 日韩电影在线看| 日韩va欧美va亚洲va久久| 午夜视黄欧洲亚洲| 天堂午夜影视日韩欧美一区二区| 一区二区三区在线影院| 亚洲一区在线看| 亚洲国产日韩综合久久精品| 一区二区三区加勒比av| 亚洲综合精品自拍| 夜夜精品视频一区二区| 亚洲中国最大av网站| 亚洲宅男天堂在线观看无病毒| 亚洲欧美区自拍先锋| 亚洲黄色小视频| 亚洲电影你懂得| 日韩中文字幕麻豆| 蜜桃一区二区三区在线| 韩国精品久久久| 成人午夜在线播放| 99re热这里只有精品免费视频 | 国产乱淫av一区二区三区| 国产美女精品人人做人人爽| 国产精品羞羞答答xxdd| 99视频精品在线| 91国偷自产一区二区三区观看| 欧美熟乱第一页| 日韩美女在线视频| 国产欧美一区在线| 一区二区在线免费观看| 丝袜美腿亚洲综合| 国内精品久久久久影院一蜜桃| 国产成人在线网站| 色94色欧美sute亚洲线路一久| 欧美日韩国产高清一区二区| 精品少妇一区二区三区免费观看| 国产日韩av一区| 亚洲欧洲精品天堂一级 | 日本不卡一二三区黄网| 国内不卡的二区三区中文字幕| 成人午夜av电影| 欧美电影一区二区三区| 精品国产不卡一区二区三区| 国产精品少妇自拍| 香蕉成人啪国产精品视频综合网| 国产不卡免费视频| 91极品视觉盛宴| 久久综合久久久久88| 亚洲精品久久嫩草网站秘色| 久久精品理论片| 91啦中文在线观看| 日韩一二三区视频| 中文字幕在线观看一区二区| 免费一级欧美片在线观看| 成人网在线播放| 日韩西西人体444www| 国产精品传媒入口麻豆| 老司机免费视频一区二区| 91免费在线看| 久久久久99精品国产片| 亚洲小说欧美激情另类| 成人美女视频在线观看18| 欧美一区二区精品久久911| 国产精品网曝门| 久久精品国产99国产| 在线看日本不卡| 国产欧美精品一区二区色综合朱莉| 亚洲成人自拍一区| 不卡视频免费播放| 久久久久久综合| 三级欧美在线一区| 91九色最新地址| 国产精品情趣视频| 韩国一区二区三区| 3d成人h动漫网站入口| 亚洲一区精品在线| 91在线小视频| 中文字幕精品综合| 国产精品一区三区| 日韩三级视频在线看| 亚洲高清在线视频| 91浏览器打开| 亚洲视频资源在线| 不卡av在线网| 中文在线资源观看网站视频免费不卡| 久久99久久久欧美国产| 51精品国自产在线| 五月婷婷激情综合网| 91福利社在线观看| 亚洲免费高清视频在线| 波多野结衣欧美| 国产精品成人免费精品自在线观看| 国产成人av电影在线| 久久九九99视频| 国产二区国产一区在线观看| 欧美精品一区二区三区蜜臀| 久久成人免费网| 欧美精品一区二区在线播放| 久久99精品国产| 久久你懂得1024| 丁香一区二区三区| 国产精品国产精品国产专区不片| 成人av电影在线观看| 亚洲天堂成人网| 在线这里只有精品| 亚洲国产一区在线观看| 欧美日韩一级二级三级| 天堂va蜜桃一区二区三区| 日韩欧美国产小视频| 韩日欧美一区二区三区| 中文字幕亚洲不卡| 色婷婷久久久久swag精品 | 欧美日韩一卡二卡三卡| 亚洲午夜三级在线| 3atv一区二区三区| 九九视频精品免费| 国产精品丝袜一区| 色菇凉天天综合网| 五月综合激情网| 精品国产凹凸成av人导航| 成人性视频网站| 亚洲成av人片在线| 日韩视频在线一区二区| 国产精华液一区二区三区| 日韩一区在线看| 欧美日韩免费在线视频| 精品中文字幕一区二区| 中文字幕免费不卡| 欧美在线视频你懂得| 精品在线观看免费| 国产精品传媒在线| 欧美日韩的一区二区| 国产精品一区二区在线观看网站|