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

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? driver.cpp

?? 這是一本介紹WIN2000環(huán)境下用WDM進行板卡驅(qū)動程序的編寫書籍
?? CPP
?? 第 1 頁 / 共 2 頁
字號:
	DbgPrint("MINPNP: DispatchCreate\n");
#endif

	PDEVICE_EXTENSION pDevExt = (PDEVICE_EXTENSION)
		pDevObj->DeviceExtension;
	NTSTATUS status = STATUS_SUCCESS;
	if (pDevExt->state != Started)
		status = STATUS_DEVICE_REMOVED;
	
	pIrp->IoStatus.Status = status;
	pIrp->IoStatus.Information = 0;	// no bytes xfered
	IoCompleteRequest( pIrp, IO_NO_INCREMENT );
	return status;
}

//++
// Function:	DispatchClose
//
// Description:
//		Handles call from Win32 CreateHandle request
//		For this driver, frees any buffer
//
// Arguments:
//		pDevObj - Passed from I/O Manager
//		pIrp - Passed from I/O Manager
//
// Return value:
//		NTSTATUS - success or failure code
//--

NTSTATUS DispatchClose (
		IN PDEVICE_OBJECT	pDevObj,
		IN PIRP				pIrp			) {
#if DBG>=1
	DbgPrint("MINPNP: DispatchClose\n");
#endif
	
	// Dig out the Device Extension from the Device object
	PDEVICE_EXTENSION pDevExt = (PDEVICE_EXTENSION)
		pDevObj->DeviceExtension;
	if (pDevExt->deviceBuffer != NULL) {
		ExFreePool(pDevExt->deviceBuffer);
		pDevExt->deviceBuffer = NULL;
		pDevExt->deviceBufferSize = 0;
	}
	pIrp->IoStatus.Status = STATUS_SUCCESS;
	pIrp->IoStatus.Information = 0;	// no bytes xfered
	IoCompleteRequest( pIrp, IO_NO_INCREMENT );
	return STATUS_SUCCESS;
}

//++
// Function:	DispatchCancel
//
// Description:
//		Handles canceled IRP
//
// Arguments:
//		pDevObj - Passed from I/O Manager
//		pIrp - Passed from I/O Manager
//
// Return value:
//		NTSTATUS - success or failuer code
//--

VOID DispatchCancel (
		IN PDEVICE_OBJECT	pDevObj,
		IN PIRP				pIrp			) {

#if DBG>=1
	DbgPrint("MINPNP: IRP Canceled\n");
#endif
	
	// Just complete the IRP
	pIrp->IoStatus.Status = STATUS_CANCELLED;
	pIrp->IoStatus.Information = 0;	// bytes xfered
	IoCompleteRequest( pIrp, IO_NO_INCREMENT );
	IoStartNextPacket( pDevObj, TRUE );
}


//++
// Function:	DispatchWrite
//
// Description:
//		Handles call from Win32 WriteFile request
//		For this driver, merely "starts" device
//			by indirectly calling StartIo
//
// Arguments:
//		pDevObj - Passed from I/O Manager
//		pIrp - Passed from I/O Manager
//
// Return value:
//		NTSTATUS - success or failuer code
//--

NTSTATUS DispatchWrite (
		IN PDEVICE_OBJECT	pDevObj,
		IN PIRP				pIrp			) {
#if DBG>=1
	DbgPrint("MINPNP: Write Operation requested (DispatchWrite)\n");
#endif
	
	// Start the I/O
	IoMarkIrpPending( pIrp );
	IoStartPacket( pDevObj, pIrp, 0, DispatchCancel);
	return STATUS_PENDING;
}

//++
// Function:	DispatchRead
//
// Description:
//		Handles call from Win32 ReadFile request
//		For this driver, xfers pool buffer to user
//
// Arguments:
//		pDevObj - Passed from I/O Manager
//		pIrp - Passed from I/O Manager
//
// Return value:
//		NTSTATUS - success or failuer code
//--

NTSTATUS DispatchRead (
		IN PDEVICE_OBJECT	pDevObj,
		IN PIRP				pIrp			) {
	
#if DBG>=1
	DbgPrint("MINPNP: Read Operation requested (DispatchRead)\n");
#endif
	
	NTSTATUS status = STATUS_SUCCESS;
	PVOID userBuffer;
	ULONG xferSize;
	// The stack location contains the user buffer info
	PIO_STACK_LOCATION pIrpStack =
		IoGetCurrentIrpStackLocation( pIrp );
	// Dig out the Device Extension from the Device object
	PDEVICE_EXTENSION pDevExt = (PDEVICE_EXTENSION)
		pDevObj->DeviceExtension;
	// Determine the length of the request
	xferSize = pIrpStack->Parameters.Read.Length;
	// Obtain user buffer pointer
	userBuffer = pIrp->AssociatedIrp.SystemBuffer;

	// Don't transfer more than the user's request
	xferSize = (xferSize < pDevExt->deviceBufferSize) ?
				xferSize : pDevExt->deviceBufferSize;
	// Now copy the pool buffer into user space
	RtlCopyMemory( userBuffer, pDevExt->deviceBuffer,
							xferSize );
	// Free the temporary pool buffer
	ExFreePool( pDevExt->deviceBuffer );
	pDevExt->deviceBuffer = NULL;
	pDevExt->deviceBufferSize = 0;

	// Now complete the IRP
	pIrp->IoStatus.Status = status;
	pIrp->IoStatus.Information = xferSize;	// bytes xfered
	IoCompleteRequest( pIrp, IO_NO_INCREMENT );
	return status;
}

BOOLEAN Isr (
			IN PKINTERRUPT pIntObj,
			IN PVOID pServiceContext		) {

	PDEVICE_EXTENSION pDevExt = (PDEVICE_EXTENSION)
		pServiceContext;
	PDEVICE_OBJECT pDevObj = pDevExt->pDevice;
	PIRP pIrp = pDevObj->CurrentIrp;

	UCHAR status = ReadStatus( pDevExt );
	if ((status & STS_NOT_IRQ))
		return FALSE;

	// its our interrupt, deal with it
	WriteControl( pDevExt, CTL_DEFAULT);
	// Were we expecting an interrupt?
	if (!pDevExt->bInterruptExpected)
		return TRUE;	// nope
	pDevExt->bInterruptExpected = FALSE;

	// transmit another character
	if (!TransmitByte( pDevExt ))
		// if no more bytes, complete the request
		IoRequestDpc( pDevObj, pIrp, (PVOID)pDevExt );

	return TRUE;
}

//++
// Function:
//		TransmitByte
//
// Description:
//		This function sends one character to the device
//		An interrupt is then forced from the port.
//		If no characters remain to be transmitted, return FALSE.
//
// Arguments:
//		Pointer to the Device Extension
//
// Return Value:
//		TRUE - one more byte transmitted
//		FALSE - no more bytes remain to be transmitted
//--
 BOOLEAN TransmitByte( 
		IN PVOID pArg ) {
	
	PDEVICE_EXTENSION pDevExt = (PDEVICE_EXTENSION)
		pArg;
	 // If all the bytes have been sent, just quit
	if( pDevExt->xferCount >= pDevExt->maxXferCount)
		return FALSE;

	// A transfer is happening.
	PDEVICE_OBJECT pDevObj =
		pDevExt->pDevice;
	PIRP pIrp = pDevObj->CurrentIrp;
	// Obtain user buffer pointer
	PUCHAR userBuffer = (PUCHAR)
		pIrp->AssociatedIrp.SystemBuffer;
	UCHAR nextByte =
		userBuffer[pDevExt->xferCount];

	// Now send it...
#if DBG>=2
	DbgPrint("MINPNP: TransmitByte: Sending 0x%02X to port %X\n",
				nextByte, pDevExt->portBase);
#endif
	// The loopback connector requires us to do
	// some bizzare work.
	// Bit 0 of the data is sent as bit 0 of Port data.
	WriteData( pDevExt, nextByte & 1);
	// It will be read in Status bit 3
	// Bits 1-3 of the data are sent as bits 0,1, & 3
	// of the Control register.
	// Control bits 0 & 1 are inverted.
	UCHAR bits = (nextByte & 0x8) +
				 ((nextByte & 0x6)>>1);
	bits ^= 0x3;	// Invert the 2 control bits (0 & 1)
	// These bits will be read in Status bits 4,5, & 7
	WriteControl( pDevExt, bits | CTL_DEFAULT);

	// Now read the data from the loopback
	UCHAR status =
		ReadStatus( pDevExt );

	// Format the nibble into the upper half of the byte
	UCHAR readByte =
		((status & 0x8)<< 1) |
		((status & 0x30)<<1) |
		(status & 0x80);
	pDevExt->deviceBuffer[pDevExt->xferCount++] =
		readByte;
#if DBG>=2
	DbgPrint("MINPNP: TransmitByte read character: 0x%03X\n",
				readByte);
#endif

	// Force an interrupt
#if DBG>=2
	DbgPrint("MINPNP: TransmitByte: generating interrupt.\n");
#endif
	// Tell the ISR to expect it
	pDevExt->bInterruptExpected = TRUE;
	// Enable interrupts, raise BUSY
	WriteControl( pDevExt, CTL_INTENB | CTL_SELECT | CTL_DEFAULT );
	// Lower BUSY
	WriteControl( pDevExt, CTL_INTENB | CTL_DEFAULT );
	// Pulse ACK#
	WriteControl( pDevExt, CTL_INTENB | CTL_NOT_RST | CTL_DEFAULT);
	// hold it for about 50 uS
	KeStallExecutionProcessor(50);
	WriteControl( pDevExt, CTL_INTENB | CTL_DEFAULT );

	return TRUE;
}

//++
// Function:
//		StartIo
//
// Description:
//		This function is responsible initiating the
//		actual data transfer. The ultimate result
//		should be an interrupt from the device.
//
// Arguments:
//		Pointer to the Device object
//		Pointer to the IRP for this request
//
// Return Value:
//		(None)
//--
VOID
StartIo(
	IN PDEVICE_OBJECT pDevObj,
	IN PIRP pIrp
	) {
#if DBG>=1
	DbgPrint("MINPNP: Start I/O Operation\n");
#endif
	
	PIO_STACK_LOCATION	pIrpStack = 
		IoGetCurrentIrpStackLocation( pIrp );
		
	PDEVICE_EXTENSION pDevExt = (PDEVICE_EXTENSION)
		pDevObj->DeviceExtension;
	PUCHAR userBuffer;
	ULONG xferSize;
		
	switch( pIrpStack->MajorFunction ) {
		
		// Use a SynchCritSection routine to
		// start the write operation...
		case IRP_MJ_WRITE:
			// Set up counts and byte pointer
			pDevExt->maxXferCount = 
				pIrpStack->Parameters.Write.Length;
			pDevExt->xferCount = 0;

			// Since we processing a new Write request,
			// free up any old buffer
			if (pDevExt->deviceBuffer != NULL) {
				ExFreePool(pDevExt->deviceBuffer);
				pDevExt->deviceBuffer = NULL;
				pDevExt->deviceBufferSize = 0;
			}

			// Determine the length of the request
			xferSize = 
				pIrpStack->Parameters.Write.Length;
			// Obtain user buffer pointer
			userBuffer = (PUCHAR)
				pIrp->AssociatedIrp.SystemBuffer;

			// Allocate the new buffer
			pDevExt->deviceBuffer = (PUCHAR)
				ExAllocatePool( PagedPool, xferSize );
			if (pDevExt->deviceBuffer == NULL) {
				// buffer didn't allocate???
				// fail the IRP
				pIrp->IoStatus.Status = 
					STATUS_INSUFFICIENT_RESOURCES;
				pIrp->IoStatus.Information = 0;
				IoCompleteRequest( pIrp, IO_NO_INCREMENT );
				IoStartNextPacket( pDevObj, FALSE );
			}
			pDevExt->deviceBufferSize = xferSize;

			//
			// Try to send the first byte of data.
			// If there's a problem, use
			// the DPC routine to fail the IRP.
			//
#if DBG>=1
	DbgPrint("MINPNP: StartIO: Transmitting first byte of %d\n", pDevExt->deviceBufferSize);
#endif
			if( !KeSynchronizeExecution(
					pDevExt->pIntObj,
					TransmitByte,
					pDevExt ))
			{
				DpcForIsr(
					NULL,
					pDevObj,
					pIrp,
					pDevExt );
			}
			break;
		//
		// Should never get here -- just get rid
		// of the packet...
		//	
		default:
			pIrp->IoStatus.Status =
						STATUS_NOT_SUPPORTED;
			pIrp->IoStatus.Information = 0;
			IoCompleteRequest(
				pIrp,
				IO_NO_INCREMENT );
			IoStartNextPacket( pDevObj, FALSE );
			break;
	}
}

//++
// Function:
//		DpcForIsr
//
// Description:
//		This function performs the low-IRQL
//		post-processing of I/O requests
//
// Arguments:
//		Pointer to a DPC object
//		Pointer to the Device object
//		Pointer to the IRP for this request
//		Pointer to the Device Extension
//
// Return Value:
//		(None)
//--
VOID
DpcForIsr(
	IN PKDPC pDpc,
	IN PDEVICE_OBJECT pDevObj,
	IN PIRP pIrp,
	IN PVOID pContext
	)
{
	PDEVICE_EXTENSION pDevExt = (PDEVICE_EXTENSION)
		pContext;
	
#if DBG>=1
	DbgPrint("MINPNP: DpcForIsr, xferCount = %d\n",
				pDevExt->xferCount);
#endif
	
	pIrp->IoStatus.Information =
			pDevExt->xferCount;

	// This loopback device always works
	pIrp->IoStatus.Status =	
			STATUS_SUCCESS;

	//
	// If we're being called directly from Start I/O,
	// don't give the user any priority boost.
	//
	if( pDpc == NULL )
		IoCompleteRequest( pIrp, IO_NO_INCREMENT );
	else
		IoCompleteRequest( pIrp, IO_PARALLEL_INCREMENT );

	//
	// This one's done. Begin working on the next
	//
	IoStartNextPacket( pDevObj, FALSE );
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
中文字幕不卡的av| 久久66热偷产精品| 久久精品国产**网站演员| 成人免费的视频| 在线成人免费观看| 最新中文字幕一区二区三区 | 免费观看在线色综合| www.亚洲人| 久久亚洲精品小早川怜子| 亚洲午夜私人影院| 99久久国产免费看| 久久久五月婷婷| 三级在线观看一区二区| 色欧美片视频在线观看| 国产欧美精品国产国产专区| 日韩二区三区四区| 色国产精品一区在线观看| 国产校园另类小说区| 麻豆国产精品官网| 欧美区在线观看| 伊人一区二区三区| 91女厕偷拍女厕偷拍高清| 久久综合久色欧美综合狠狠| 午夜精品免费在线观看| 欧美中文字幕一区| 亚洲精品视频在线观看免费| 成人精品国产免费网站| 国产日本欧美一区二区| 国产福利一区二区三区| 国产精品美女视频| 国产精品1区2区| 精品福利一区二区三区| 狠狠色丁香婷综合久久| 欧美成人午夜电影| 国内精品不卡在线| 久久久久国产精品免费免费搜索| 日韩国产在线一| 在线成人免费观看| 麻豆一区二区三| 欧美mv日韩mv亚洲| 国产一区二区三区免费在线观看| 26uuu亚洲婷婷狠狠天堂| 九九在线精品视频| 国产欧美日韩精品a在线观看| 国产乱人伦精品一区二区在线观看 | 欧美色网一区二区| 亚洲五码中文字幕| 91精品国产色综合久久| 蜜桃av一区二区三区| 日韩精品一区二区三区视频| 精品一区二区三区久久| 久久久久久免费| 99在线热播精品免费| 亚洲黄色免费电影| 欧美理论片在线| 精品一区二区三区不卡| 国产精品麻豆久久久| 99国内精品久久| 亚洲成人一区在线| 337p粉嫩大胆色噜噜噜噜亚洲| 国产米奇在线777精品观看| 中文字幕第一页久久| 91九色最新地址| 麻豆精品一区二区av白丝在线| 久久精品亚洲精品国产欧美kt∨| 成人av影视在线观看| 亚洲成人三级小说| 亚洲精品一区在线观看| 99re66热这里只有精品3直播 | 国产精品福利一区二区三区| 一本色道a无线码一区v| 蜜臀av亚洲一区中文字幕| 国产精品成人免费在线| 欧美理论电影在线| 成人少妇影院yyyy| 日韩电影网1区2区| 国产精品久久毛片a| 欧美精品第一页| jlzzjlzz国产精品久久| 午夜精品视频一区| 国产精品久久一级| 欧美不卡一区二区| 欧美日韩一区二区三区视频| 国产精品99久久久久| 亚洲地区一二三色| 亚洲日韩欧美一区二区在线| 欧美成人三级在线| 欧美日韩dvd在线观看| 国产成人一区在线| 麻豆一区二区在线| 亚洲va国产天堂va久久en| 国产精品美女久久福利网站| 日韩一级在线观看| 欧美视频一区二| 91视频国产观看| 色94色欧美sute亚洲线路二| 国产精品中文字幕日韩精品| 午夜伊人狠狠久久| 亚洲人123区| 国产日韩欧美精品一区| 日韩精品一区二区三区在线播放 | 亚洲一区二区美女| 国产精品久线在线观看| 久久久久久久久久看片| 日韩精品在线一区二区| 在线成人免费观看| 911国产精品| 欧美日韩美女一区二区| 在线免费av一区| 91免费国产在线观看| 不卡欧美aaaaa| 成人一级片在线观看| 成人性视频免费网站| 国产成人一级电影| 成人午夜私人影院| 成人免费视频免费观看| 国产成人在线视频网址| 丁香桃色午夜亚洲一区二区三区| 韩国视频一区二区| 国产一区在线观看视频| 激情综合亚洲精品| 国产一区视频网站| 丁香亚洲综合激情啪啪综合| 成人av中文字幕| 91在线码无精品| 色综合咪咪久久| 在线这里只有精品| 欧美精三区欧美精三区| 欧美精品日韩一本| 日韩欧美一级二级三级久久久| 欧美一区二区三区视频免费播放| 日韩一区二区精品葵司在线| 精品三级av在线| 国产亚洲欧美激情| 中文字幕一区二区在线播放| 亚洲日本一区二区| 亚洲一区二区欧美| 久久99国产精品久久99果冻传媒| 国产另类ts人妖一区二区| av一区二区三区在线| 欧美熟乱第一页| 欧美精品一区二区三区蜜桃视频 | 欧美一区二区三区四区久久| 欧美人与禽zozo性伦| 91精品国产一区二区三区蜜臀| 精品久久久久久无| 中文字幕在线不卡国产视频| 亚洲一区电影777| 精品一区二区三区在线播放| 成人午夜碰碰视频| 欧美性猛交xxxx乱大交退制版| 欧美一区日韩一区| 国产精品沙发午睡系列990531| 亚洲一区二区三区四区五区黄 | 亚洲精品第一国产综合野| 天堂在线亚洲视频| 丁香婷婷综合色啪| 制服丝袜亚洲网站| 国产精品第四页| 婷婷夜色潮精品综合在线| 国产成人在线色| 91精品一区二区三区久久久久久| 中文字幕精品三区| 不卡的电视剧免费网站有什么| 欧美色精品在线视频| 国产午夜精品一区二区| 亚洲国产成人av| 国产高清不卡一区| 这里只有精品视频在线观看| 中文字幕欧美一| 狠狠色狠狠色综合| 51精品秘密在线观看| 中文字幕中文字幕中文字幕亚洲无线| 天堂资源在线中文精品| 91美女片黄在线观看| 久久午夜老司机| 秋霞av亚洲一区二区三| 91精彩视频在线| 久久精品亚洲精品国产欧美kt∨| 丝袜国产日韩另类美女| 91黄视频在线| 国产精品久久久久一区二区三区| 老司机午夜精品| 欧美日韩视频在线一区二区| 国产精品丝袜久久久久久app| 日韩成人一区二区| 欧美日韩综合在线免费观看| 国产精品二三区| 岛国精品一区二区| 国产日韩成人精品| 国产精品996| 久久久精品综合| 国产一区91精品张津瑜| 精品第一国产综合精品aⅴ| 日本不卡一区二区| 5858s免费视频成人| 日产精品久久久久久久性色| 欧美丝袜自拍制服另类| 亚洲大尺度视频在线观看| 欧美又粗又大又爽|