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

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

?? ezusbisotransfer.h

?? DriverStdio的一個USB驅動程序
?? H
?? 第 1 頁 / 共 2 頁
字號:
// EzUsbIsoTransfer.h
//=============================================================================
//
// Compuware Corporation
// NuMega Lab
// 9 Townsend West
// Nashua, NH 03060  USA
//
// Copyright (c) 1999 Compuware Corporation. All Rights Reserved.
// Unpublished - rights reserved under the Copyright laws of the
// United States.
//
//=============================================================================

#ifndef __EzUsbIsoTransfer__h__
#define __EzUsbIsoTransfer__h__


#define USB_MAX_NUM_ISO_PACKETS_IN_AN_URB	255

//MACROs for iso packets
#define ISO_PKT_STATUS(pUrb, i) pUrb->UrbIsochronousTransfer.IsoPacket[i].Status
#define ISO_PKT_LENGTH(pUrb, i) pUrb->UrbIsochronousTransfer.IsoPacket[i].Length


//This is the typedef for client callback function
typedef 
VOID (*PISO_TRANSFER_COMPLETE_CALLBACK)(
			PVOID pContext
			);


//This is context for completion routine 
typedef struct _ISOCH_COMPLETION_INFO
{
	PVOID m_pClass;
	PURB m_pUrb;
	PVOID m_pClientContext;
	PISO_TRANSFER_COMPLETE_CALLBACK m_pfnClientCallback;

} ISOCH_COMPLETION_INFO, *PISOCH_COMPLETION_INFO;


//This is the return value status codes
//for client's callback function
enum USB_STREAM_STATUS 
{
	USB_STREAM_STATUS_CONTINUE = 0,
	USB_STREAM_STATUS_STOP
};


//=============================================================================
// template< class D >
// class KUsbIsochStream
//
//	This class abstracts a continuous stream of IRP's from a driver to USBD.
//
template< class D >
class KUsbIsochStream 
{

//Constructors/Destructors
public:

	KUsbIsochStream<D>(void) 	
	{
		Data = NULL;
		m_bStopTheStream = FALSE;
		m_bStarted = FALSE;
		m_NumIrps = 0; 
		m_ConstructorStatus = STATUS_SUCCESS;
		m_pIsoXferDoneEvent = NULL;
		m_ppIrp = NULL;
		m_pDev = NULL;
		m_pContext = NULL;
	}

	NTSTATUS Initialize(
		D* d,
		KUsbLowerDevice* dev
		);

	SAFE_DESTRUCTORS;

	~KUsbIsochStream<D>(void);

	void Invalidate(void);

	BOOLEAN IsValid(void) { return NULL != Data;}


//Methods
public:
	//Initiate continuous isoch xfers (asynchronous form)
	NTSTATUS StartStream(
		PISO_TRANSFER_COMPLETE_CALLBACK pfnCallback,
		PVOID pClientContext=NULL
		);

	//Initiate continuous isoch xfers (synchronous form)
	NTSTATUS StartStream(ULONG mSecTimeOut=0);

	//stop isoch xfers (eventually)  
	NTSTATUS StopStream(
		BOOLEAN bWait = TRUE, 
		ULONG mSecTimeOut = 100
		);

	BOOLEAN IsStarted(void){ return m_bStarted; }
	BOOLEAN StopRequested(void){ return m_bStopTheStream; }

protected:
	//used by synch form of Start to wait for completion routine to signal event
	NTSTATUS WaitForTransferToFinish(ULONG mSecTimeOut);  

	//completion routine(s)
	NTSTATUS IsoTransferCompletionRoutine(KIrp I, PISOCH_COMPLETION_INFO pContext);	
	static NTSTATUS __stdcall IsoTransferComplete(			
		PDEVICE_OBJECT pDevObj,						
		PIRP pIrp,									
		PVOID context
		)								
	{												
		KIrp I(pIrp);								
		return reinterpret_cast<KUsbIsochStream<D>*>(((PISOCH_COMPLETION_INFO)context)->m_pClass)	
			->IsoTransferCompletionRoutine(I, (PISOCH_COMPLETION_INFO)context);		
		UNREFERENCED_PARAMETER(pDevObj);			
	}

//Data members
protected:

	D* Data;
	KUsbLowerDevice* m_pDev;

	//Count of IRPs in use. 
	KInterlockedCounter m_PendingIrpCount;
	//event set in completion routine 
	KEvent* m_pIsoXferDoneEvent;
	//Pointer to IRPs
	PIRP* m_ppIrp;
	//Pointer to completion routine context
	PISOCH_COMPLETION_INFO m_pContext;
	//flag to stop the stream
	BOOLEAN m_bStopTheStream;
	//flag indicating that the stream has been started
	BOOLEAN m_bStarted;
	NTSTATUS m_ConstructorStatus;
	//Total number of IRPs sent
	ULONG m_dwTotalTransfers;
	//this is how many IRPs are used
	UCHAR m_NumIrps; 
};

template <class D>
NTSTATUS KUsbIsochStream<D>::Initialize(
	D* pD,
	KUsbLowerDevice* pDev
	)
{
	ASSERT( pDev );
	ASSERT( pD );

//Initialize data members
	m_pDev = pDev;
	Data = pD;
	m_dwTotalTransfers = 0;
	m_bStopTheStream = FALSE;
	m_NumIrps = pD->NumberOfUrbs();

	ASSERT(m_NumIrps);

	m_pIsoXferDoneEvent = new (NonPagedPool) KEvent(SynchronizationEvent, FALSE);

	if( NULL == m_pIsoXferDoneEvent )
	{
		return m_ConstructorStatus = STATUS_INSUFFICIENT_RESOURCES;
	}

	m_ppIrp = new (NonPagedPool) PIRP[m_NumIrps];

	if( NULL == m_ppIrp )
	{
		delete m_pIsoXferDoneEvent;
		m_pIsoXferDoneEvent = NULL;
		return m_ConstructorStatus = STATUS_INSUFFICIENT_RESOURCES;
	}

	CCHAR stacks = static_cast<UCHAR>(pDev->StackRequirement());
	ASSERT( stacks );

	for( UCHAR i = 0; i < m_NumIrps; i++)
	{
		m_ppIrp[i] = IoAllocateIrp(stacks, FALSE);

		if( NULL == m_ppIrp[i] )
		{
			m_ConstructorStatus = STATUS_INSUFFICIENT_RESOURCES;
			break;
		}
	}

	//check for successful completion of the above loop
	if( STATUS_INSUFFICIENT_RESOURCES == m_ConstructorStatus )
	{
		for( UCHAR j = 0; j < i; j++ )
		{
			IoFreeIrp( m_ppIrp[j] );
		}
	
		delete m_pIsoXferDoneEvent;
		m_pIsoXferDoneEvent = NULL;
		delete m_ppIrp;
		m_ppIrp = NULL;
	}

	return m_ConstructorStatus;
}

template <class D>
KUsbIsochStream<D>::~KUsbIsochStream<D>(void)
{
	if( IsValid() )
		Invalidate();
}

template <class D>
void KUsbIsochStream<D>::Invalidate(void)
{

	for( UCHAR k = 0; k < m_NumIrps; k++)
	{
		if( m_ppIrp[k] )
			IoFreeIrp( m_ppIrp[k] );
	}

	delete m_ppIrp;
	m_ppIrp = NULL;

	delete m_pIsoXferDoneEvent;
	m_pIsoXferDoneEvent = NULL;

	Data = NULL;
	m_bStopTheStream = FALSE;
	m_bStarted = FALSE;
	m_NumIrps = 0; 
	m_ConstructorStatus = STATUS_SUCCESS;
}

template <class D>
NTSTATUS KUsbIsochStream<D>::StartStream(ULONG mSecTimeOut)
{
	ASSERT( KeGetCurrentIrql() < DISPATCH_LEVEL );

	NTSTATUS status = StartStream(PISO_TRANSFER_COMPLETE_CALLBACK(NULL));

	if( STATUS_SUCCESS == status )
	{
		status = WaitForTransferToFinish(mSecTimeOut);
	}

	return status;
}

template <class D>
NTSTATUS KUsbIsochStream<D>::StartStream(
	PISO_TRANSFER_COMPLETE_CALLBACK pfnCallback,
	PVOID pClientContext
	)
{
	NTSTATUS status = STATUS_SUCCESS;
	m_pContext = new (NonPagedPool) ISOCH_COMPLETION_INFO[m_NumIrps];

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

	for( UCHAR i = 0; i < m_NumIrps; i++ )
	{

		PURB pUrb = Data->GetUrb(i);

		if( pUrb )
		{
			m_pContext[i].m_pClass = this;
			m_pContext[i].m_pUrb = pUrb;
			m_pContext[i].m_pClientContext = pClientContext;
			m_pContext[i].m_pfnClientCallback = pfnCallback;

			++m_PendingIrpCount;
			status = m_pDev->SubmitUrb(m_ppIrp[i], pUrb, IsoTransferComplete, &m_pContext[i]);
		}
	}

	m_bStarted = TRUE;

	return STATUS_SUCCESS;
}

template <class D>
NTSTATUS KUsbIsochStream<D>::StopStream(BOOLEAN bWait, ULONG mSecTimeOut)
{
	NTSTATUS status = STATUS_SUCCESS;

	m_bStopTheStream = TRUE;

	if(bWait)
	{
		ASSERT( KeGetCurrentIrql() < DISPATCH_LEVEL );
		status = WaitForTransferToFinish(mSecTimeOut);  
	}

	m_bStarted = FALSE;

	return status;
}

template <class D>
NTSTATUS KUsbIsochStream<D>::IsoTransferCompletionRoutine(
	KIrp I, 
	PISOCH_COMPLETION_INFO pContext
	)
{
	ASSERT( pContext );
	PURB pUrb = pContext->m_pUrb;
	ASSERT( pUrb );

	m_dwTotalTransfers++;

	BOUNDS_CHECKER(COMPLETED_URB, (m_pDev, pUrb, I, I.Status()) );

	USB_STREAM_STATUS StreamStatus = Data->OnCompletedUrb(pUrb, I.Status());

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
日韩和欧美的一区| 亚洲大型综合色站| 亚洲一区二区三区激情| 亚洲同性gay激情无套| 北条麻妃国产九九精品视频| 亚洲精品一区二区在线观看| 亚洲一区二区在线免费观看视频| 国产乱码精品一区二区三区忘忧草 | 欧美一区二区网站| 国产亚洲欧美在线| 狠狠色2019综合网| 中文字幕成人在线观看| 香蕉加勒比综合久久| 91精品国产品国语在线不卡 | 欧美日韩精品欧美日韩精品 | 成人涩涩免费视频| 精品成人佐山爱一区二区| 免费在线视频一区| 欧美日韩国产免费| 一区av在线播放| 欧美日韩精品欧美日韩精品一综合| 亚洲欧洲精品一区二区三区不卡| 成人精品在线视频观看| 亚洲日本一区二区三区| 色狠狠综合天天综合综合| 日韩一级高清毛片| 国产在线精品视频| 精品对白一区国产伦| 日本午夜一区二区| 国产清纯美女被跳蛋高潮一区二区久久w| 久久99精品国产麻豆婷婷洗澡| 欧美日本高清视频在线观看| 日韩av网站免费在线| 国产精品天干天干在线综合| 在线观看一区二区视频| 国产激情91久久精品导航| 亚洲国产精品高清| 91精品在线一区二区| 99久久婷婷国产综合精品| 亚洲综合色网站| 国产精品久久久一区麻豆最新章节| 99re这里只有精品6| 亚洲午夜电影网| 视频一区国产视频| 国产精品一区二区三区乱码| 香蕉久久一区二区不卡无毒影院| 国产裸体歌舞团一区二区| 亚洲欧洲日韩一区二区三区| 91精品国产麻豆| 色婷婷综合五月| 99re热这里只有精品视频| 亚洲国产精品久久人人爱| 亚洲色图丝袜美腿| 久久久国产午夜精品| 26uuu国产在线精品一区二区| 日韩一二三区不卡| 精品国一区二区三区| 7777精品久久久大香线蕉| 欧美精品黑人性xxxx| 欧美另类z0zxhd电影| 精品视频在线免费看| 91在线国产福利| 欧美午夜不卡视频| 精品国产成人系列| 欧美日韩电影在线播放| 欧美电影免费提供在线观看| 亚洲精品在线观看视频| 亚洲精品视频在线| 午夜精品久久久久久久| 一区二区三区四区乱视频| 免费在线观看一区| 蜜臀精品一区二区三区在线观看| 亚洲乱码国产乱码精品精98午夜 | 一本大道久久精品懂色aⅴ| 91尤物视频在线观看| 欧美日韩日本视频| 国产精品午夜春色av| 亚洲国产精品成人久久综合一区| 亚洲一区中文日韩| 欧洲av在线精品| 精品成人一区二区三区| 一区二区免费在线播放| 日韩成人午夜精品| av网站一区二区三区| 欧美成人精品3d动漫h| 亚洲一区影音先锋| 东方aⅴ免费观看久久av| 欧美日韩精品欧美日韩精品一综合| 国产精品伦一区二区三级视频| 亚洲激情第一区| 国产精品综合二区| 欧美人狂配大交3d怪物一区| 精品精品欲导航| 久久国产精品99久久久久久老狼| 欧美群妇大交群中文字幕| 欧美一级日韩免费不卡| 日韩av电影天堂| 欧美日韩高清在线| 亚洲人成精品久久久久| 成人黄色片在线观看| 久久精品欧美一区二区三区不卡 | 精品亚洲成a人| 555夜色666亚洲国产免| 美女诱惑一区二区| 欧美中文字幕亚洲一区二区va在线| 欧美成人精品1314www| 国产成人精品免费在线| 中文字幕欧美国产| 欧美无砖砖区免费| 亚洲 欧美综合在线网络| 91精品国产麻豆国产自产在线| 国产尤物一区二区| 中文字幕在线一区免费| 97精品久久久久中文字幕| 亚洲欧美日韩一区二区三区在线观看| 色综合欧美在线| 久久激情五月激情| 一区二区三区四区视频精品免费 | 国产精品久久久久久久第一福利 | 国产毛片精品国产一区二区三区| 久久网站热最新地址| 欧洲中文字幕精品| 色综合色综合色综合 | 成人av资源下载| 波多野洁衣一区| 在线免费不卡视频| 欧美日产在线观看| 久久久久久久久伊人| 中文字幕一区二区三区av| 亚洲欧美国产三级| 青娱乐精品在线视频| 国产高清不卡二三区| www..com久久爱| 日韩免费观看2025年上映的电影| 国产性色一区二区| 亚洲成a人片在线观看中文| 九九精品一区二区| 91在线观看污| 日韩一二三四区| 亚洲一区国产视频| 国产不卡视频在线播放| 制服丝袜激情欧洲亚洲| 国产精品国产三级国产aⅴ原创| 日韩精品一二三| 97久久人人超碰| 欧美国产欧美亚州国产日韩mv天天看完整| 1024成人网色www| 国产电影一区二区三区| 91精品综合久久久久久| 亚洲国产精品影院| 91香蕉视频在线| 最新国产成人在线观看| 福利视频网站一区二区三区| 精品国产麻豆免费人成网站| 亚洲午夜国产一区99re久久| 在线播放中文一区| 亚洲图片有声小说| 欧美色图天堂网| 亚洲国产aⅴ成人精品无吗| 97精品久久久午夜一区二区三区| 久久综合久久久久88| 国内外成人在线| 国产欧美日韩中文久久| 成人动漫一区二区三区| 亚洲老妇xxxxxx| 欧美性极品少妇| 日韩精品乱码av一区二区| 欧美老年两性高潮| 免费观看在线综合色| 日韩欧美中文字幕一区| 韩国一区二区三区| 国产精品欧美久久久久一区二区| 国产精品1区2区3区在线观看| 国产欧美精品一区二区色综合朱莉| 国产成人欧美日韩在线电影| 亚洲男女毛片无遮挡| 91精品国产综合久久蜜臀| 国产精品亚洲专一区二区三区| 久久精品视频在线看| 欧美日韩一区二区三区不卡| 国产一区二区成人久久免费影院| 国产精品久久久久久一区二区三区| 欧洲视频一区二区| 国产激情精品久久久第一区二区 | 国产呦精品一区二区三区网站| 成人精品一区二区三区中文字幕 | 亚洲欧美色一区| 欧美一区二区三级| 色av综合在线| 成人av在线资源| 懂色av一区二区夜夜嗨| 日韩激情视频网站| 亚洲成a人在线观看| 亚洲免费三区一区二区| 国产精品久久久久久久裸模| 日韩网站在线看片你懂的| 91精品国产综合久久久久| 欧美性欧美巨大黑白大战| caoporn国产精品| 成人免费毛片嘿嘿连载视频|