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

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

?? comfilntdevice.cpp

?? 一個2000系統上的虛擬串口驅動程序
?? CPP
?? 第 1 頁 / 共 3 頁
字號:
// ComfilntDevice.cpp
// Implementation of ComfilntDevice device class
//
// Generated by DriverWizard version DriverStudio 2.5.0 (Build 240)
// Requires Compuware's DriverWorks classes
//

#include <vdw.h>
//#include "ntddser.h"
#include <kfifo.h>
#include "Comfilnt.h"
#include "ComfilntDevice.h"

#pragma warning(disable:4065) // Allow switch statement with no cases

extern	KTrace	t;			// Global driver trace object	

////////////////////////////////////////////////////////////////////////
// ComfilntDevice::~ComfilntDevice
//
//	Routine Description:
//		This is the destructor for the ComfilntDevice
//
//	Parameters:
//		None
//
//	Return Value:
//		None
//
//	Comments:
//		Disconnect and release resources here.
//
//		Although the use of SAFE_DESTRUCTORS in the class definition cures
//		improper emission of the destructor into the INIT section most of the
//		time, certain rare cases can still cause improper behavior.  To avoid
//		these cases, the destructor	must preceed the INIT section, causing it
//		to be referenced first by the default compiler section.
//

ComfilntDevice::~ComfilntDevice()
{
	delete m_RegPath;
}

#pragma code_seg("INIT")

////////////////////////////////////////////////////////////////////////////////
//  ComfilntDevice::ComfilntDevice
//
//	Routine Description:
//		The device constructor is typically responsible for allocating
//		any physical resources that are associated with the device.
//
//	Parameters:
//		Unit - Unit number. This is a number to append to the device's
//			base device name to distinguish multiple units of this
//			device type.
//
//	Return Value:
//		None
//
//	Comments:
//		The device constructor often reads the registry to setup
//		various configurable parameters.

ComfilntDevice::ComfilntDevice(ULONG Unit,PRW pRW) :
	KDevice()
{
	t << "Enter ComfilntDevice: unit number= " << Unit << "; status= " << (ULONG) m_ConstructorStatus << EOL;
	if ( ! NT_SUCCESS(m_ConstructorStatus) )
	{
		t << "Failed to create device ComfilntDevice unit number " << Unit << " status " << (ULONG) m_ConstructorStatus << EOL;
		return;
	}
	m_Unit = Unit;
	m_IsOpened=0;
	m_pRW=pRW;
//	t << (ULONG) pRW <<EOL;
	m_RegPath = CreateRegistryPath(L"ComfilntDevice", Unit);
	if (m_RegPath == NULL)
	{
		// Error, cannot allocate memory for registry path
		t << "Failed to create registry path\n";
		m_ConstructorStatus = STATUS_INSUFFICIENT_RESOURCES;
		return;
	}

}
#pragma code_seg()

////////////////////////////////////////////////////////////////////////
//  ComfilntDevice::Read
//
//	Routine Description:
//		Handler for IRP_MJ_READ
//
//	Parameters:
//		I - Current IRP
//
//	Return Value:
//		NTSTATUS - Result code
//
//	Comments:
//		This routine handles read requests.

NTSTATUS ComfilntDevice::Read(KIrp I)
{
	ULONG Count=0;
	ULONG ReadedBytes=0;
	t << "== Read == " << m_Unit << EOL;
//	t << "Irp=" << I ;
//	t << "COM=" <<m_Unit << EOL;
// TODO:	Check the incoming request.  Replace "FALSE" in the following
//			line with a check that returns TRUE if the request is not valid.
    if (FALSE)
	{
		I.Information() = 0;
		return I.Complete(STATUS_INVALID_PARAMETER);
	}
	CancelSpinLock::Acquire();

	// Always ok to read 0 elements
	if (I.ReadSize() == 0)
	{
		I.Information() = 0;
		return I.Complete(STATUS_SUCCESS);
	}
	NTSTATUS status		= STATUS_SUCCESS;

	KMemory Mem(I.Mdl());						// Declare a memory object
	// Use the memory object to create a pointer to the caller's buffer
	PUCHAR	pBuffer		= (PUCHAR) Mem.VirtualAddress();

	ULONG   dwTotalSize = I.ReadSize(CURRENT);	// Requested read size
	ULONG   dwBytesRead = 0;					// Count of bytes read

// TODO:	If the read can be satisfied immediately, set the Information
//			and Status fields now, then call NextIrp to complete this IRP
//			and start processing the next IRP in the queue.

// TODO:	If the data is not yet available, initiate a request to the
//			physical device here, and defer the Information, Status,
//			and NextIrp handling until the hardware indicates that the
//			read is complete.  Typically, this might be handled in a
//			DPC that is called after the hardware finishes transferring
//			the data.

// TODO:	To satisfy the read now, transfer data from the device to
//			caller's buffer at "pBuffer".  Then, indicate how much data was
//			transferred:
//	RtlCopyMemory( pBuffer, TEXT("1234567890"), 11);
//	pBuffer=(unsigned char*)TEXT("1234567890");
/*	
	int Count=BytePipe.NumberOfItemsAvailableForRead();
	int ReadedBytes=0;
	t <<(ULONG) Count << EOL;
	if(Count==0)
		m_EvenMask=(ULONG)0;

	for(int i=0;i<Count;i++){
		dwBytesRead=BytePipe.Read(pBuffer,dwTotalSize);
		pBuffer+=dwBytesRead;
		ReadedBytes+=dwBytesRead;
	}
*/
	if((m_Unit&1)==0){
		Count=m_pRW->PipeB.NumberOfItemsAvailableForRead();
		//if(Count>dwTotalSize)

		ReadedBytes=0;
		if(Count==0)
			m_pRW->MaskB &=~SERIAL_EV_RXCHAR;

			dwBytesRead=m_pRW->PipeB.Read(pBuffer,dwTotalSize);
			ReadedBytes=dwBytesRead;
		
	}else{
		Count=m_pRW->PipeA.NumberOfItemsAvailableForRead();
		ReadedBytes=0;
		if(Count==0)
			m_pRW->MaskA &=~SERIAL_EV_RXCHAR;

			dwBytesRead=m_pRW->PipeA.Read(pBuffer,dwTotalSize);
			ReadedBytes=dwBytesRead;
		
	}
//	t << "Read Buffer=" << (TCHAR*)pBuffer <<EOL;
//	m_EvenMask=(ULONG)0;
	if((m_Unit&1)==0){
		m_pRW->MaskB &=~SERIAL_EV_RXCHAR;
//		m_pRW->WriteCountB=(ULONG)0;
	}else{
		m_pRW->MaskA &=~SERIAL_EV_RXCHAR;
//		m_pRW->WriteCountA=(ULONG)0;
	}
	if(Count <= ReadedBytes)
	m_WaitMask &= ~EV_RXFLAG;

	I.Information() = ReadedBytes;
	status = STATUS_SUCCESS;
	CancelSpinLock::Release();
	return I.Complete(status);
}


////////////////////////////////////////////////////////////////////////
//  ComfilntDevice::Write
//
//	Routine Description:
//		Handler for IRP_MJ_WRITE
//
//	Parameters:
//		I - Current IRP
//
//	Return Value:
//		NTSTATUS - Result code
//
//	Comments:
//		This routine handles write requests.

NTSTATUS ComfilntDevice::Write(KIrp I)
{
	t << "--- Write " <<m_Unit << EOL;
//	t << "Irp=" << I ;
//	t << "COM=" <<m_Unit << EOL;
// TODO:	Check the incoming request.  Replace "FALSE" in the following
//			line with a check that returns TRUE if the request is not valid.
    if (FALSE)
	{
		I.Information() = 0;
		return I.Complete(STATUS_INVALID_PARAMETER);
	}
	CancelSpinLock::Acquire();

	// Always ok to write 0 elements
	if (I.WriteSize() == 0)
	{
		I.Information() = 0;
		return I.Complete(STATUS_SUCCESS);
	}
	NTSTATUS status		= STATUS_SUCCESS;

	KMemory Mem(I.Mdl());						// Declare a memory object
	// Use the memory object to create a pointer to the caller's buffer
	PUCHAR	pBuffer		= (PUCHAR) Mem.VirtualAddress();

	ULONG   dwTotalSize = I.WriteSize(CURRENT);
	ULONG   dwBytesSent = 0;
	if(dwTotalSize>0x100)
		dwTotalSize=0x100;
	
	if((m_Unit&1)==0){
		if(m_pRW->PipeA.IsFull()==FALSE){
			dwBytesSent=m_pRW->PipeA.Write(pBuffer,dwTotalSize);
			m_pRW->WriteCountA=dwBytesSent;
//			t<<"Write PipeA,CountA="<<(ULONG)m_pRW->WriteCountA<<EOL;
			m_pRW->MaskA=SERIAL_EV_RXCHAR;
//			t <<"MaskA"<<(ULONG)m_pRW->MaskA<< EOL;
		}else{
//			t <<"Pending(A),COM="<<(ULONG)m_Unit<< EOL;
			dwBytesSent=0;
			status	= STATUS_PENDING;
		}
	}else{
		if(m_pRW->PipeB.IsFull()==FALSE){
			dwBytesSent=m_pRW->PipeB.Write(pBuffer,dwTotalSize);
			m_pRW->WriteCountB=dwBytesSent;
			t<<"Write PipeB,CountB="<<(ULONG)m_pRW->PipeB.NumberOfItemsAvailableForRead()<<EOL;
//			t <<"MaskB"<<(ULONG)m_pRW->MaskB<< EOL;
			m_pRW->MaskB=SERIAL_EV_RXCHAR;
		}else{
//			t <<"Pending (B),COM="<<(ULONG)m_Unit<< EOL;
			dwBytesSent = 0;
			status	= STATUS_PENDING;
		}
	}

//	t << "****Write Buffer=" <<(char*)wkBuffer <<EOL;
//	t << "****Write Bytes=" <<dwBytesSent <<EOL;
	I.Information() = dwBytesSent;
	m_WaitMask|=EV_RXFLAG;
//	status		= STATUS_SUCCESS;
//	if((m_Unit&1)==0){
//
//		m_pRW->MaskA|=SERIAL_EV_RXCHAR;
//		t <<"MaskA"<<(ULONG)m_pRW->MaskA<< EOL;
//	}else{
//		t <<"MaskB"<<(ULONG)m_pRW->MaskB<< EOL;
//		m_pRW->MaskB|=SERIAL_EV_RXCHAR;
//	}
	CancelSpinLock::Release();
	return I.Complete(status);
}

////////////////////////////////////////////////////////////////////////
//  ComfilntDevice::DeviceControl
//
//	Routine Description:
//		Handler for IRP_MJ_DEVICE_CONTROL
//
//	Parameters:
//		I - Current IRP
// 
//	Return Value:
//		NTSTATUS - Result code
//
//	Comments:
//		This routine is the first handler for Device Control requests.

NTSTATUS ComfilntDevice::DeviceControl(KIrp I) 
{
	NTSTATUS status;
	ULONG Mask;
//	t << "<<Device Control>>" <<EOL;
//t << (ULONG)m_pRW <<EOL;
//	t << "Irp=" << I ;
	CancelSpinLock::Acquire();
	ULONG code=I.IoctlCode();
//	t << "COM=" <<m_Unit << " Code=" << (unsigned long) code << EOL;

	I.Information() = 0;

	switch (I.IoctlCode())
	{
	///////////////////////////////////////////////////////////////////
	// Set Baud Rate
	//(4h--1)
	case IOCTL_SERIAL_SET_BAUD_RATE:
	{
		PSERIAL_BAUD_RATE pBR;

		pBR = PSERIAL_BAUD_RATE(I.IoctlBuffer());

//		GTRACE( (TLEVEL,"--IOCTL_SERIAL_SET_BAUD_RATE, rate=%d\n", pBR->BaudRate) ); 
			
		if (I.IoctlInputBufferSize() < sizeof(SERIAL_BAUD_RATE) )
			status = STATUS_BUFFER_TOO_SMALL;
		else
		{
			IoctlSetBaudRate( *pBR );
			I.Information() = 0;
			status = STATUS_SUCCESS;
		}
		break;
	}
	///////////////////////////////////////////////////////////////////
	// Get Baud Rate
	//(50h--20)
	case IOCTL_SERIAL_GET_BAUD_RATE:

//		GTRACE((TLEVEL,"--IOCTL_SERIAL_GET_BAUD_RATE\n")); 

		if (I.IoctlOutputBufferSize() < sizeof(SERIAL_BAUD_RATE) )
			status = STATUS_BUFFER_TOO_SMALL;
		else
		{
			IoctlGetBaudRate(*(SERIAL_BAUD_RATE*)I.IoctlBuffer());
			I.Information() = sizeof(SERIAL_BAUD_RATE);
			status = STATUS_SUCCESS;
		}			
		break;

	///////////////////////////////////////////////////////////////////
	// Set Line Control (parity, data bits, stop bits)
	//(0ch--3)
	case IOCTL_SERIAL_SET_LINE_CONTROL:
		t <<"SetLineControl" << EOL;
//		GTRACE((TLEVEL,"--IOCTL_SERIAL_SET_LINE_CONTROL: %x\n", *(UCHAR*)I.IoctlBuffer())); 
		if (I.IoctlInputBufferSize() < sizeof(SERIAL_LINE_CONTROL) )
			status = STATUS_BUFFER_TOO_SMALL;
		else
			status = IoctlSetLineControl(*(SERIAL_LINE_CONTROL*)I.IoctlBuffer());
			I.Information() = 0;
			status = STATUS_SUCCESS;

		break;		

	///////////////////////////////////////////////////////////////////
	// Get Line Control (parity, data bits, stop bits)
	//(54h--21)
	case IOCTL_SERIAL_GET_LINE_CONTROL:
		t <<"GetLineControl" << EOL;

//		GTRACE((TLEVEL,"--IOCTL_SERIAL_GET_LINE_CONTROL\n")); 

		if (I.IoctlOutputBufferSize() < sizeof(SERIAL_LINE_CONTROL) )
			status = STATUS_INVALID_PARAMETER;
		else
		{
			IoctlGetLineControl(*(SERIAL_LINE_CONTROL*)I.IoctlBuffer());
			I.Information() = sizeof (SERIAL_LINE_CONTROL);
			status = STATUS_SUCCESS;
		}
		break;

	///////////////////////////////////////////////////////////////////
	// Reset device
	//(2ch--11)
	case IOCTL_SERIAL_RESET_DEVICE:
		t <<"ReSetDevice" << EOL;
//		IoctlReset();
		I.Information() = 0;
		status = STATUS_SUCCESS;
		break;

	///////////////////////////////////////////////////////////////////
	// Set Handshake / Flow control
	//(60h--24)
	case IOCTL_SERIAL_GET_HANDFLOW:
		t <<"GetHandFlow" << EOL;

//		GTRACE((TLEVEL,"--IOCTL_SERIAL_GET_HANDFLOW\n"));

		if (I.IoctlOutputBufferSize() < sizeof SERIAL_HANDFLOW)
			status = STATUS_BUFFER_TOO_SMALL;
		else
		{			
			IoctlGetHandFlow(*(SERIAL_HANDFLOW*)I.IoctlBuffer());
			I.Information() = sizeof(SERIAL_HANDFLOW);
			status = STATUS_SUCCESS;
		}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
777色狠狠一区二区三区| 欧美日韩小视频| 日本电影亚洲天堂一区| 日韩女优毛片在线| 一区二区高清免费观看影视大全| 日韩av不卡在线观看| 94-欧美-setu| 精品国产1区2区3区| 亚洲不卡一区二区三区| av电影一区二区| 久久久久久**毛片大全| 丝袜美腿一区二区三区| av高清久久久| 国产精品人妖ts系列视频| 热久久国产精品| 欧美三级资源在线| 一区二区三区 在线观看视频| 成人一区二区视频| 亚洲一区免费观看| 99久久er热在这里只有精品15| 精品久久99ma| 九九国产精品视频| 欧美一区二区三区免费在线看 | 日韩限制级电影在线观看| 一区二区久久久久| 欧美主播一区二区三区| 亚洲卡通欧美制服中文| 成人app在线观看| 国产精品美女久久久久aⅴ国产馆| 国模套图日韩精品一区二区 | 欧美日韩国产综合一区二区三区| 亚洲日本在线观看| 色香色香欲天天天影视综合网| 国产精品久久久久久久久免费相片 | 欧美成人video| 久久99国产精品久久99| 精品福利av导航| 国产成人午夜99999| 国产精品视频麻豆| 成人av电影免费观看| 久久蜜桃一区二区| 成人免费看的视频| 亚洲欧美日韩人成在线播放| 欧美亚洲动漫另类| 免费看黄色91| 国产欧美日韩在线| 精品免费视频.| 成人丝袜18视频在线观看| ㊣最新国产の精品bt伙计久久| 日本精品裸体写真集在线观看| 五月开心婷婷久久| 久久久综合激的五月天| av日韩在线网站| 视频一区在线视频| 久久久精品tv| 色综合久久综合网欧美综合网| 亚洲成人激情自拍| 国产亚洲精品bt天堂精选| 97se狠狠狠综合亚洲狠狠| 亚洲成在线观看| 久久人人超碰精品| 欧美三级电影一区| 久久激情五月激情| 国产精品久久久久久久久晋中| 欧洲精品中文字幕| 国产一区二区三区黄视频 | 老司机精品视频线观看86 | 国产亚洲成年网址在线观看| 91免费小视频| 狠狠狠色丁香婷婷综合激情| 中文字幕日韩精品一区| 91精品福利在线一区二区三区| 丰满少妇久久久久久久| 亚洲18影院在线观看| 国产欧美久久久精品影院| 国产女同性恋一区二区| 在线视频一区二区三区| 国产一区二区主播在线| 亚洲午夜精品网| 国产精品人成在线观看免费| 欧美电影免费观看高清完整版在线 | 国产一区二区在线电影| 亚洲自拍偷拍麻豆| 国产精品网站在线观看| 日韩欧美国产1| 欧美性极品少妇| eeuss影院一区二区三区| 久久国产福利国产秒拍| 亚洲图片欧美色图| 亚洲欧美成aⅴ人在线观看 | 国产真实精品久久二三区| 亚洲精品美国一| 亚洲国产精品成人综合色在线婷婷| 宅男在线国产精品| 欧美午夜电影网| 日本道色综合久久| av不卡在线观看| 国产成人免费网站| 国产麻豆成人精品| 狠狠色丁香婷婷综合久久片| 日韩精彩视频在线观看| 一区二区三区欧美亚洲| 日韩理论电影院| 国产精品不卡视频| 国产亚洲成aⅴ人片在线观看| 欧美大片一区二区三区| 欧美一区二区三区视频在线| 欧美军同video69gay| 欧美探花视频资源| 欧美视频精品在线| 欧美综合天天夜夜久久| 91黄色免费看| 欧美午夜影院一区| 欧美日韩不卡在线| 欧美一级生活片| 日韩欧美国产电影| 精品久久久久久久人人人人传媒| 日韩精品在线看片z| 日韩精品中文字幕一区| 国产三级久久久| 亚洲欧洲国产日本综合| 中文字幕一区在线观看| 亚洲区小说区图片区qvod| 亚洲精品国产第一综合99久久 | 色综合久久久久久久久| 一本到一区二区三区| 欧美在线一区二区| 欧美丰满嫩嫩电影| 日韩一级完整毛片| 国产欧美一区二区三区在线看蜜臀| 国产日韩欧美麻豆| 亚洲免费在线视频一区 二区| 亚洲一本大道在线| 久久99精品国产麻豆不卡| 国产剧情av麻豆香蕉精品| 波多野结衣中文一区| 欧美怡红院视频| 日韩欧美国产麻豆| 亚洲人吸女人奶水| 日韩高清不卡在线| 国产成人aaaa| 欧美日韩中字一区| 久久一日本道色综合| 亚洲男人天堂av| 乱中年女人伦av一区二区| 成人一区在线观看| 91精品国产综合久久香蕉麻豆| 精品国产亚洲在线| 亚洲综合在线电影| 国精产品一区一区三区mba桃花| 99久精品国产| 欧美一级日韩不卡播放免费| 亚洲欧洲精品一区二区三区 | 日本午夜一区二区| 成人免费电影视频| 欧美精品vⅰdeose4hd| 国产欧美日韩综合精品一区二区 | 国产传媒久久文化传媒| 在线精品视频免费播放| 精品粉嫩aⅴ一区二区三区四区| 亚洲午夜日本在线观看| 国产99精品国产| 51精品久久久久久久蜜臀| 国产精品美女视频| 麻豆精品国产传媒mv男同| 91一区一区三区| 精品日韩成人av| 午夜av区久久| 色综合网色综合| 亚洲国产精华液网站w| 另类人妖一区二区av| 欧美色视频在线观看| 亚洲欧洲精品天堂一级| 国产一区二区三区观看| 欧美一区二区三区思思人| 亚洲综合精品自拍| av成人老司机| 国产精品人成在线观看免费| 蜜臀a∨国产成人精品| 欧美手机在线视频| 亚洲乱码日产精品bd| 丁香啪啪综合成人亚洲小说| 欧美日韩黄色一区二区| 亚洲一区二区成人在线观看| 91亚洲永久精品| 亚洲欧洲色图综合| va亚洲va日韩不卡在线观看| 精品99久久久久久| 日韩成人精品在线观看| 欧美片网站yy| 亚洲成av人片在线| 欧美三级视频在线| 亚洲午夜精品17c| 欧美日韩在线一区二区| 亚洲精品你懂的| 欧美中文字幕久久| 亚洲午夜精品一区二区三区他趣| 欧美专区在线观看一区| 亚洲一区二区三区小说| 欧美少妇xxx|