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

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

?? ezusbisotransfer.h

?? DriverStdio的一個USB驅動程序
?? H
?? 第 1 頁 / 共 2 頁
字號:
	if( (USB_STREAM_STATUS_CONTINUE == StreamStatus) && !StopRequested() )
	{
// handle stream continuation
		I.Reuse();

		m_pDev->SubmitUrb(I, pUrb, IsoTransferComplete, pContext);
		return STATUS_MORE_PROCESSING_REQUIRED;
	}

// The stream has been stopped (This URB was not re-submitted)
	if(! --m_PendingIrpCount)
	{
		//for synchronous starts, set event that StartStream is waiting on
		m_pIsoXferDoneEvent->Set();
		
		//for asynchronous starts, call client callback routine
		if( pContext->m_pfnClientCallback )
		{
			pContext->m_pfnClientCallback(
				pContext->m_pClientContext
				);
		}

		delete m_pContext;
		m_bStarted = FALSE;
	}

	return STATUS_MORE_PROCESSING_REQUIRED;
}

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

	ULONGLONG TimeOut100nSec;
	PLARGE_INTEGER pTimeOut;
	NTSTATUS status = STATUS_SUCCESS;

	if( 0 != mSecTimeOut )
	{
		// it's positive, and then convert to negative afterwards.
		LONG mSecTimeOutSigned = LONG(mSecTimeOut);
		
		if(mSecTimeOutSigned < 0) 
		{
			mSecTimeOutSigned = -mSecTimeOutSigned;
		}

		mSecTimeOut = ULONG(mSecTimeOutSigned);

		// Calculate wait as 100ns intervals.  Negative is relative
		TimeOut100nSec = mSecTimeOut;
		TimeOut100nSec *= -10000;	// convert units
		pTimeOut = PLARGE_INTEGER(&TimeOut100nSec);		
	}			
	else
	{
		pTimeOut = NULL;
	}

	status = m_pIsoXferDoneEvent->Wait(KernelMode, FALSE, pTimeOut, Executive); 

	return status;
}



//=============================================================================
// class EzUsbIsoTransferBase
//
// This class is a base class for EzUsbIsoTransfer and EzUsbDriverManagedIsoTransfer.
// 
class EzUsbIsoTransferBase
{
//Construction/Destruction
protected:
	EzUsbIsoTransferBase(
		KUsbPipe& pipe,
		USHORT PacketSize=0,
		UCHAR PacketsPerUrb=0,
		UCHAR NumUrbs=2
		);

	SAFE_DESTRUCTORS

	~EzUsbIsoTransferBase(void);

private:
	EzUsbIsoTransferBase(void);
	EzUsbIsoTransferBase(EzUsbIsoTransferBase&);
	EzUsbIsoTransferBase& operator=(EzUsbIsoTransferBase&);

//Methods
public:
	PURB GetUrb(UCHAR index);
	UCHAR NumberOfUrbs(void)	{return m_NumUrbs;}
	NTSTATUS Status(void)		{return m_ConstructorStatus;}
	ULONG TotalPackets(void)	{return m_dwTotalPacketsProcessed;}
	ULONG TotalBytes(void)		{return m_dwTotalBytesProcessed;}
	ULONG ErrorPackets(void)	{return m_dwErrorPacketCount;}

//Data Members
protected:
	KUsbPipe& m_Pipe;
	//pointer to an array of PMDLs
	MDL** m_ppMdl;	 
	//pointer to an array of PURBs
	PVOID m_pUrb;	 
	//size in bytes of an URB
	ULONG m_UrbSize; 
	//number of packets per URB
	UCHAR m_PacketsPerUrb;
	//size of data payload in one packet
	USHORT m_PacketSize;
	//Direction of transfer TRUE if its an IN(read from device), FALSE if its an OUT(write to device)
	bool m_bRead;
	NTSTATUS m_ConstructorStatus;
	//Number of URBs to use for transfers
	UCHAR m_NumUrbs;
	//Size of the TransferBuffer
	ULONG m_TransferSize;
	//total number of packets processed
	ULONG m_dwTotalPacketsProcessed;
	//total number of successful bytes processed
	ULONG m_dwTotalBytesProcessed;
	//total number of packets with bad status
	ULONG m_dwErrorPacketCount;
};

inline PURB EzUsbIsoTransferBase::GetUrb(UCHAR index)
{
	return reinterpret_cast<PURB>(reinterpret_cast<PUCHAR>(m_pUrb) + m_UrbSize * index);
}



//=============================================================================
// class EzUsbIsoTransfer
//
// This class abstracts an isochronous transfer.  It can be used for reads 
// and writes.  The class accepts a KMemory object that models a locked buffer
// to use in the transfer.  The class will segment the buffer into URB's.  
// After constructing an instance with a valid KMemory object with a resident
// locked buffer, drivers call method Start to begin isochronous transfers.
// The tranfer will be stopped on failure or by calling method Stop.
// 
class EzUsbIsoTransfer : public EzUsbIsoTransferBase
{
//Construction/Destruction
public:
	EzUsbIsoTransfer(
		KMemory& Mdl,			//Data Buffer
		ULONG Length,			//Size of Data Buffer in bytes
		KUsbPipe& pipe,			//Pipe to perform the isochronous transfer
		USHORT PacketSize=0,	//Iso Packet Size to use in the transfer (default is max for the pipe)
		UCHAR PacketsPerUrb=0,	//Number of packets per urb (max of 255)
		PVOID pDescBuffer=NULL,	//Optional pointer to packet buffer
		UCHAR NumUrbs=2			//Number of queued transfers at a time
		);

	SAFE_DESTRUCTORS;

	~EzUsbIsoTransfer(void);

private:
	EzUsbIsoTransfer(void);
	EzUsbIsoTransfer(EzUsbIsoTransfer&);
	EzUsbIsoTransfer& operator=(EzUsbIsoTransfer&);

//Methods
public:
	//Initiate continuous isoch xfers (asynchronous form)
	NTSTATUS Start(
		PISO_TRANSFER_COMPLETE_CALLBACK pfnCallback, //Callback when operation is complete
		PVOID pClientContext=NULL					 //context for callback
		);
	//Initiate continuous isoch xfers (synchronous form)
	NTSTATUS Start(ULONG mSecTimeOut=0);
	//stop isoch xfers   
	NTSTATUS Stop(
		BOOLEAN bWait = TRUE, 
		ULONG mSecTimeOut = 100
		);
	//This Method is called by KUsbIsochStream<EzUsbIsoTransfer> 
	USB_STREAM_STATUS OnCompletedUrb(PURB pUrb, NTSTATUS status);

//Data members
protected:

	//Client buffer
	KMemory m_Mem;
	//Buffer base address
	PVOID m_VirtualAddress;
	//Offset into buffer
	ULONG m_dwOffset;
	//Length of user supplied buffer
	ULONG m_Length;
	//Optional pointer to a buffer to hold USBD_ISO_PACKET_DESCRIPTOR's (client provides storage)
    PVOID m_pDescriptorBuffer;
	//Offset into descriptor buffer
	ULONG m_dwDescrOffset;
	//This object abstracts IRP processing
	KUsbIsochStream<EzUsbIsoTransfer> stream;
};


inline NTSTATUS EzUsbIsoTransfer::Start(
	PISO_TRANSFER_COMPLETE_CALLBACK pfnCallback,
	PVOID pClientContext
	)
{
	return stream.StartStream(pfnCallback,pClientContext);
}


inline NTSTATUS EzUsbIsoTransfer::Start(ULONG mSecTimeOut)
{
	return stream.StartStream(mSecTimeOut);
}


inline NTSTATUS EzUsbIsoTransfer::Stop(
	BOOLEAN bWait, 
	ULONG mSecTimeOut
	)
{
	return stream.StopStream(bWait,mSecTimeOut);
}



//=============================================================================
// class EzUsbDriverManagedIsoTransfer
//
// This class abstracts isochronous transfers.  The class provides a buffer for
// performing Isochronous reads from a USB device.  After constructing an 
// instance, drivers call method Start to begin continuous isochronous transfers
// from the USB device.  Drivers call method ReadBuffer to obtain data from 
// the buffer. Iso Packet Descriptors are optionally saved by the object.  
// Method ReadDescriptors can be used to obtain them.  The continuous tranfers
// will be stopped on failure or by calling method Stop.
//
class EzUsbDriverManagedIsoTransfer : public EzUsbIsoTransferBase, protected KLockableFifo<UCHAR>
{
//Construction/Destruction
public:
	EzUsbDriverManagedIsoTransfer(
		KUsbPipe& pipe,		//Pipe to perform iso transfers
		ULONG Length,		//Size of Data Buffer in bytes
		USHORT PacketSize,  //Size of packet to use
		UCHAR PacketsPerUrb,//Number of packets per URB (max 255)
		UCHAR NumUrbs=2,	//Number of queued URB's at a time
		ULONG NumPackets=0,	//Optional Number of Packets to save in a buffer
		PVOID pBuffer=NULL	//Optional pointer to a data buffer
		);

	SAFE_DESTRUCTORS
	~EzUsbDriverManagedIsoTransfer(void);

private:
	EzUsbDriverManagedIsoTransfer(void);
	EzUsbDriverManagedIsoTransfer(EzUsbDriverManagedIsoTransfer&);
	EzUsbDriverManagedIsoTransfer& operator=(EzUsbDriverManagedIsoTransfer&);

//Methods 
public:
	//clients use this copy data from the data buffer
	ULONG ReadBuffer(PVOID ptr, ULONG len);

	//clients use this to copy USBD_ISO_PACKET_DESCRIPTORS from the buffer 
	ULONG ReadDescriptorBuffer(PVOID pBuff, ULONG dwNumDescriptorsToRead);

	//Initiate continuous isoch xfers (asynchronous form)
	NTSTATUS Start(
		PISO_TRANSFER_COMPLETE_CALLBACK pfnCallback,
		PVOID pClientContext=NULL
		);

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

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

	BOOLEAN IsStarted(void){ return stream.IsStarted(); }

	//This method is called by KUsbIsochStream<EzUsbDriverManagedIsoTransfer> 
	USB_STREAM_STATUS OnCompletedUrb(PURB pUrb, NTSTATUS status);

protected:

	ULONG WriteBuffer(PURB);

	ULONG WriteDescriptorBuffer(PUSBD_ISO_PACKET_DESCRIPTOR ptr, ULONG dwNumDescriptorsToPutInBuffer);

//Data members
protected:
	//Optional USBD_ISO_PACKET_DESCRIPTOR buffer
    KLockableFifo<USBD_ISO_PACKET_DESCRIPTOR>* m_pDescriptorBuffer;
	//Temporary buffers
	PVOID m_TransferBuffers;
	//Object that manages the recycling IRPs to perform the transfer
	KUsbIsochStream<EzUsbDriverManagedIsoTransfer> stream;
};


inline NTSTATUS EzUsbDriverManagedIsoTransfer::Start(
	PISO_TRANSFER_COMPLETE_CALLBACK pfnCallback,
	PVOID pClientContext
	)
{
	return stream.StartStream(pfnCallback,pClientContext);
}


inline NTSTATUS EzUsbDriverManagedIsoTransfer::Start(ULONG mSecTimeOut)
{
	return stream.StartStream(mSecTimeOut);
}


inline NTSTATUS EzUsbDriverManagedIsoTransfer::Stop(
	BOOLEAN bWait, 
	ULONG mSecTimeOut
	)
{
	return stream.StopStream(bWait,mSecTimeOut);
}

#endif // #ifndef __EzUsbIsoTransfer__h__

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲在线一区二区三区| 日日摸夜夜添夜夜添亚洲女人| 亚洲高清中文字幕| www久久精品| 国内外精品视频| 国产午夜精品福利| 成人免费看的视频| 亚洲麻豆国产自偷在线| 欧美专区日韩专区| 蜜桃视频免费观看一区| 久久久欧美精品sm网站| 色美美综合视频| 精品一区二区三区欧美| 亚洲男人天堂一区| 亚洲综合成人在线视频| 亚洲高清不卡在线| 九色|91porny| 成人小视频免费在线观看| av成人动漫在线观看| 天堂在线亚洲视频| 国精产品一区一区三区mba桃花| 九色综合国产一区二区三区| 国产成人精品综合在线观看| 首页综合国产亚洲丝袜| 久久精品国产久精国产| 午夜私人影院久久久久| 国产精品久久看| 精品久久久久久久久久久院品网| 播五月开心婷婷综合| 老司机精品视频导航| 国产精品一级片在线观看| 天堂成人国产精品一区| 国产精品一区二区黑丝| 欧美亚洲丝袜传媒另类| 91免费国产在线观看| 成人妖精视频yjsp地址| 欧美日韩高清影院| 欧美日韩激情一区二区三区| 久久久久99精品一区| 一区二区三区四区在线| 亚洲色图丝袜美腿| 国产精品色婷婷久久58| 中文幕一区二区三区久久蜜桃| 尤物视频一区二区| 亚洲夂夂婷婷色拍ww47 | 欧美日韩精品欧美日韩精品一综合| 日韩欧美国产精品| 日韩一区二区免费在线观看| 欧美三级电影精品| 欧美三片在线视频观看| 日本一区二区三区免费乱视频| 国产婷婷一区二区| 日韩精品视频网站| 在线欧美日韩精品| 国产精品美女久久久久aⅴ| 美女一区二区久久| 欧美午夜精品久久久| 亚洲欧洲日韩综合一区二区| 最新热久久免费视频| 精品一区二区三区香蕉蜜桃| 777欧美精品| 亚洲精品一区二区在线观看| 国产亚洲精品aa| 久久国产成人午夜av影院| 亚洲欧洲精品成人久久奇米网| 男女男精品网站| 国内精品第一页| 欧美精品久久99久久在免费线| 精品欧美乱码久久久久久1区2区| 亚洲国产精品久久人人爱蜜臀| 91免费国产在线| 一区二区三区四区视频精品免费 | 国产一区二区三区四区在线观看| 国产精品99久久久久久有的能看| 6080亚洲精品一区二区| 亚洲成av人片在www色猫咪| 蜜桃久久精品一区二区| 91精品国产高清一区二区三区| 国产视频不卡一区| 国产自产2019最新不卡| 久久色.com| av午夜一区麻豆| 亚洲乱码国产乱码精品精的特点 | 亚洲成av人影院在线观看网| 在线观看国产日韩| 性欧美大战久久久久久久久| 欧美日韩一区二区三区四区 | 久久草av在线| 亚洲精品在线三区| 不卡视频一二三| 亚洲激情第一区| 欧美日韩国产小视频在线观看| 天天综合色天天综合| 日韩午夜在线播放| 高清在线不卡av| 7777精品伊人久久久大香线蕉的 | 日本精品视频一区二区三区| 亚洲一二三区在线观看| 日韩欧美成人一区二区| 国产乱码精品一区二区三区五月婷| 欧美激情中文字幕| 美国十次了思思久久精品导航| 精品国一区二区三区| 成人精品视频一区二区三区| 亚洲免费三区一区二区| 欧美一二区视频| 丁香婷婷综合色啪| 婷婷开心激情综合| 欧美国产综合色视频| 欧美艳星brazzers| 精品一区二区av| 亚洲国产成人va在线观看天堂| 欧美成人猛片aaaaaaa| 91亚洲男人天堂| 精品污污网站免费看| 国产乱一区二区| 亚洲自拍偷拍综合| 国产亚洲一本大道中文在线| 色94色欧美sute亚洲线路二| 韩国三级电影一区二区| 午夜伦欧美伦电影理论片| 国产精品视频一二三| 日韩精品中午字幕| 欧美日韩在线播放一区| av一二三不卡影片| 久久99久国产精品黄毛片色诱| 亚洲精品成人悠悠色影视| 国产欧美日韩卡一| 欧美成人aa大片| 欧美一区二区在线观看| 91视频国产观看| 懂色av一区二区在线播放| 久88久久88久久久| 日韩精品亚洲专区| 亚洲高清视频在线| ㊣最新国产の精品bt伙计久久| 久久久www成人免费无遮挡大片| 欧美疯狂性受xxxxx喷水图片| 欧洲精品一区二区| 波多野结衣中文字幕一区| 麻豆成人久久精品二区三区红 | 成人免费视频免费观看| 看电视剧不卡顿的网站| 日韩精品亚洲一区二区三区免费| 亚洲人成网站在线| 亚洲另类中文字| 亚洲精品欧美二区三区中文字幕| 国产精品毛片a∨一区二区三区| 久久久影院官网| 精品91自产拍在线观看一区| 日韩视频一区二区在线观看| 51精品久久久久久久蜜臀| 欧美日韩一二三| 日韩av一区二区在线影视| 国产最新精品精品你懂的| 日韩亚洲欧美中文三级| 欧美美女网站色| 91.com视频| 日韩欧美一区在线| 日韩免费视频一区二区| 日韩美女主播在线视频一区二区三区| 欧美精品v国产精品v日韩精品 | 亚洲国产日韩综合久久精品| 亚洲狼人国产精品| 夜夜爽夜夜爽精品视频| 亚洲成人一区二区在线观看| 亚洲电影第三页| 免费在线看一区| 国产精品自在在线| 成人免费的视频| 91久久精品一区二区三| 欧美日韩一区二区三区在线| 51久久夜色精品国产麻豆| 欧美精品一区二区久久久| www.爱久久.com| 欧美一区二区三区视频在线观看| 久久久亚洲国产美女国产盗摄| 成人av在线电影| 色一情一乱一乱一91av| 亚洲色图欧美偷拍| 亚洲欧美日韩精品久久久久| 国产在线国偷精品免费看| 成人午夜免费视频| 欧美天天综合网| 久久久精品综合| 亚洲一级二级三级在线免费观看| 日本中文字幕不卡| 久久er99热精品一区二区| 亚洲另类在线视频| 欧美亚洲丝袜传媒另类| 9l国产精品久久久久麻豆| 69堂精品视频| 国产精品久久综合| 久久国产精品一区二区| 91黄视频在线观看| 精品国产乱码久久久久久闺蜜| 亚洲欧美另类图片小说| 激情图片小说一区| 在线播放中文一区| 最好看的中文字幕久久|