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

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

?? driver.cpp

?? 這是一本介紹WIN2000環境下用WDM進行板卡驅動程序的編寫書籍
?? CPP
?? 第 1 頁 / 共 2 頁
字號:
#if DBG>=1
	DbgPrint("WMIEX: DpWmiQuueryRegInfo\n");
#endif
	PDEVICE_EXTENSION pDevExt = (PDEVICE_EXTENSION)
		pDevObj->DeviceExtension;

	*pRegFlags = WMIREG_FLAG_INSTANCE_PDO;
	*pRegistryPath = &regPath;
	
	// MofResourceName is whatever name was used in the
	//	Resource (.rc) file for the driver project
	RtlInitUnicodeString(MofResourceName, L"MofResource");

	// Returning the PDO (Physical Device Object) is needed
	// since we are requesting auto-naming based on the PDO
	*pPdo = pDevExt->pPDO;

	return STATUS_SUCCESS;
}

NTSTATUS
  DpWmiQueryDataBlock(
    IN PDEVICE_OBJECT pDevObj,
    IN PIRP pIrp,
    IN ULONG GuidIndex,
    IN ULONG InstanceIndex,
    IN ULONG InstanceCount,
    IN OUT PULONG InstanceLengthArray,
    IN ULONG BufferAvail,
    OUT PUCHAR pBuffer
    ) {

#if DBG>=1
	DbgPrint("WMIEX: DpWmiQueryDataBlock\n");
	DbgPrint("WMIEX: GuidIndex = %d, InstanceIndex = %d\n", GuidIndex, InstanceIndex);
	DbgPrint("WMIEX: InstanceCount = %d, InstanceLengthArray = %d\n", InstanceCount, InstanceLengthArray);
	DbgPrint("WMIEX: BufferAvail = %d, MOF_DATA_SIZE = %d\n", BufferAvail, MOF_DATA_SIZE);
#endif
	PDEVICE_EXTENSION pDevExt = (PDEVICE_EXTENSION)
		pDevObj->DeviceExtension;

	// Do we have enough room for the MOF data?
	if ( MOF_DATA_SIZE > BufferAvail )
		return WmiCompleteRequest( pDevObj,
									pIrp,
									STATUS_BUFFER_TOO_SMALL,
									MOF_DATA_SIZE,
									IO_NO_INCREMENT );

	// Stuff Buffer with gathered MOF data (3 ULONGS)
	// Simply cast Buffer as MofData structure
	// Then let the compiler copy everything
	*(PMOFDATA)pBuffer = pDevExt->mofData;

	return WmiCompleteRequest( pDevObj,
								pIrp,
								STATUS_SUCCESS,
								MOF_DATA_SIZE,
								IO_NO_INCREMENT );
}

//++
// Function:	DispatchCreate
//
// Description:
//		Handles call from Win32 CreateFile request
//		For this driver, does nothing
//
// Arguments:
//		pDevObj - Passed from I/O Manager
//		pIrp - Passed from I/O Manager
//
// Return value:
//		NTSTATUS - success or failure code
//--

NTSTATUS DispatchCreate (
		IN PDEVICE_OBJECT	pDevObj,
		IN PIRP				pIrp			) {
#if DBG>=1
	DbgPrint("WMIEX: 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("WMIEX: 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("WMIEX: 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, starts the device by indirectly
//		invoking 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("WMIEX: Write Operation requested (DispatchWrite)\n");
#endif
	// Update MOF data
	PDEVICE_EXTENSION pDevExt = (PDEVICE_EXTENSION)
		pDevObj->DeviceExtension;
	pDevExt->mofData.totalWrites++;
	
	// 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("WMIEX: Read Operation requested (DispatchRead)\n");
#endif
	// Update MOF data
	PDEVICE_EXTENSION pDevExt = (PDEVICE_EXTENSION)
		pDevObj->DeviceExtension;
	pDevExt->mofData.totalReads++;
	
	NTSTATUS status = STATUS_SUCCESS;
	PVOID userBuffer;
	ULONG xferSize;
	// The stack location contains the user buffer info
	PIO_STACK_LOCATION pIrpStack =
		IoGetCurrentIrpStackLocation( pIrp );
	// 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;
}

//++
// Function:
//		TransmitByte
//
// Description:
//		This function sends one character to the device
//		The polling timer is then started which will
//		eventually invoke the PollingTimerDpc.
//		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>=1
	DbgPrint("WMIEX: TransmitByte: Sending 0x%02X to port %X\n",
				nextByte, pDevExt->portBase);
#endif
	// Update MOF data
	pDevExt->mofData.totalTransfers++;

	// 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>=1
	DbgPrint("WMIEX: TransmitByte read character: 0x%03X\n",
				readByte);
#endif

	// Update MOF data
	pDevExt->mofData.totalTransfers++;

	// Start the polling timer
#if DBG>=2
	DbgPrint("WMIEX: TransmitByte starting timer\n");
#endif
	KeSetTimer(
		&pDevExt->pollingTimer,
		pDevExt->pollingInterval,
		&pDevExt->pollingDPC );


	return TRUE;
}

//++
// Function:
//		StartIo
//
// Description:
//		This function is responsible initiating the
//		actual data transfer. The ultimate result
//		should be a started Timer object.
//
// 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("WMIEX: 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 DBG>=1
	DbgPrint("WMIEX: StartIO: Transmitting first byte of %d\n", pDevExt->deviceBufferSize);
#endif
			TransmitByte( 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:
//		PollingTimerDpc
//
// Description:
//		This function is the DPC routine called
//		each time the timer "ticks".
//		The routine checks on the device - 
//		if room available, more data is sent
//
// Arguments:
//		Pointer to the Device object
//		Pointer to the IRP for this request
//
// Return Value:
//		(None)
//--
VOID PollingTimerDpc( IN PKDPC pDpc,
					  IN PVOID pContext,
					  IN PVOID SysArg1,
					  IN PVOID SysArg2 ) {

#if DBG>=1
	DbgPrint("WMIEX: PollingTimerDpc Fired\n");
#endif
	PDEVICE_OBJECT pDevObj = (PDEVICE_OBJECT)
		pContext;
	PDEVICE_EXTENSION pDevExt = (PDEVICE_EXTENSION)
		pDevObj->DeviceExtension;

	// Try to send more data
	if (!TransmitByte( pDevExt ) ) {
		// Transfer complete (normal or error)
		// Complete the IRP appropriately
#if DBG>=1
	DbgPrint("WMIEX: PollingTimerDpc Completing IRP\n");
#endif
		PIRP pIrp = pDevObj->CurrentIrp;
		pIrp->IoStatus.Information =
			pDevExt->xferCount;

		// Figure out what the final status should be
		pIrp->IoStatus.Status = STATUS_SUCCESS;
		// If an error occurred, Status would change

		// Now Complete the IRP
		IoCompleteRequest( pIrp, IO_PARALLEL_INCREMENT );

		// And request another IRP
		IoStartNextPacket( pDevObj, FALSE);
	}
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
久久天堂av综合合色蜜桃网| 国产永久精品大片wwwapp| 日韩激情一区二区| 99视频一区二区| 精品三级在线观看| 午夜一区二区三区在线观看| 丁香一区二区三区| 久久这里只有精品视频网| 亚洲第一成人在线| 色婷婷综合视频在线观看| 久久久亚洲午夜电影| 狂野欧美性猛交blacked| 欧美在线视频全部完| 亚洲欧洲无码一区二区三区| 国产精品一区二区视频| 精品国产91乱码一区二区三区| 亚洲午夜久久久久久久久电影院 | 久久欧美中文字幕| 日本亚洲欧美天堂免费| 欧美日韩免费电影| 午夜精品一区在线观看| 欧美三级在线视频| 亚洲第一福利一区| 精品视频在线免费观看| 亚洲自拍与偷拍| 91麻豆精品秘密| 综合在线观看色| 91亚洲大成网污www| 中文字幕在线观看不卡视频| 国产成a人亚洲精品| 国产精品久久久久久久久晋中 | 蜜桃在线一区二区三区| 欧美精品v日韩精品v韩国精品v| 一区二区三区蜜桃网| 色欧美片视频在线观看在线视频| 亚洲国产精品成人综合色在线婷婷| 国产传媒日韩欧美成人| 国产欧美日韩不卡免费| 成人国产精品免费观看视频| 国产精品欧美久久久久一区二区| 99热精品国产| 亚洲综合视频在线| 91麻豆精品国产91久久久久久 | 26uuu亚洲婷婷狠狠天堂| 精品一区二区三区视频在线观看 | 亚洲精品乱码久久久久久久久| 91啪亚洲精品| 亚洲成人av福利| 欧美一级免费观看| 国产一区二区视频在线| 亚洲人123区| 欧美精品日韩综合在线| 国产美女娇喘av呻吟久久| 国产精品久久一卡二卡| 欧美视频在线不卡| 久久电影网站中文字幕| 国产精品色噜噜| 欧美日韩视频不卡| 国产一区中文字幕| 亚洲精品欧美综合四区| 日韩欧美一级二级三级久久久| 国产主播一区二区三区| 亚洲欧美日韩中文字幕一区二区三区| 欧美性视频一区二区三区| 国精产品一区一区三区mba视频| 国产精品色在线| 欧美久久婷婷综合色| 高清日韩电视剧大全免费| 亚洲午夜电影网| 欧美韩国日本不卡| 91精品国产综合久久小美女| 成人综合婷婷国产精品久久蜜臀| 亚洲成人精品影院| 国产日韩综合av| 欧美日韩在线精品一区二区三区激情| 精品在线播放免费| 亚洲成a人片综合在线| 久久精品欧美日韩| 欧美一二三在线| 色屁屁一区二区| 国产99久久久精品| 蜜臀av国产精品久久久久| 亚洲综合激情另类小说区| 欧美韩日一区二区三区四区| 欧美一区二区日韩一区二区| 色天天综合色天天久久| 风间由美中文字幕在线看视频国产欧美| 亚洲 欧美综合在线网络| 国产精品美女久久久久久2018 | 色婷婷久久久综合中文字幕| 国产精品一区二区久激情瑜伽| 亚洲第一主播视频| 中文字幕不卡一区| www国产亚洲精品久久麻豆| 在线播放91灌醉迷j高跟美女| 不卡一区二区在线| 国产99久久久国产精品潘金| 美美哒免费高清在线观看视频一区二区| 亚洲欧美日本韩国| 国产精品不卡在线观看| 国产日产欧美精品一区二区三区| 日韩欧美国产一二三区| 91精品国产全国免费观看| 欧美午夜精品一区| 在线看日本不卡| 色婷婷激情一区二区三区| 99久久久精品| 99久久婷婷国产综合精品| 99免费精品视频| 成人在线视频一区| 成av人片一区二区| 色综合天天综合在线视频| 一本久道久久综合中文字幕| 国产成人免费视频网站| 国产高清在线观看免费不卡| 国产精品白丝av| 高清成人在线观看| 91亚洲精品久久久蜜桃| 在线亚洲精品福利网址导航| 欧美日韩视频第一区| 欧美精品色综合| 日韩三级电影网址| 久久久久久电影| 国产精品你懂的| 亚洲日本丝袜连裤袜办公室| 夜夜操天天操亚洲| 日日摸夜夜添夜夜添国产精品 | 天天色天天操综合| 日日夜夜精品视频天天综合网| 日本人妖一区二区| 国产精品99久久久| 99视频精品在线| 欧美日韩精品一区二区三区| 欧美一区二区精品久久911| 精品日韩99亚洲| 中文字幕视频一区二区三区久| 亚洲乱码精品一二三四区日韩在线 | 日韩欧美高清一区| 久久免费看少妇高潮| 中文字幕一区二区视频| 亚洲福利电影网| 激情亚洲综合在线| 99久久久免费精品国产一区二区| 欧美日韩视频在线第一区| 久久午夜电影网| 一区二区三区不卡视频在线观看| 三级欧美韩日大片在线看| 国产成人在线影院| 欧美性猛交xxxxxxxx| 久久久亚洲精品石原莉奈| 亚洲综合久久av| 国产一区二区主播在线| 欧美亚洲精品一区| 欧美国产欧美综合| 视频在线在亚洲| 99在线精品免费| 日韩一区二区麻豆国产| 中文字幕一区二区三区色视频| 欧美96一区二区免费视频| 成人视屏免费看| 在线播放一区二区三区| 亚洲欧洲日韩一区二区三区| 美国毛片一区二区| 在线一区二区观看| 国产午夜精品久久久久久免费视| 亚洲一本大道在线| 成人黄色片在线观看| 欧美一区二视频| 亚洲精品成人悠悠色影视| 国产精品中文有码| 欧美日韩精品久久久| 亚洲欧美另类在线| 国产精品一色哟哟哟| 欧美一区二区三区日韩| 亚洲精品日日夜夜| 成人黄色在线网站| 久久久亚洲高清| 韩国午夜理伦三级不卡影院| 7777精品久久久大香线蕉| 亚洲人成人一区二区在线观看| 精品制服美女丁香| 日韩欧美亚洲国产另类| 石原莉奈在线亚洲三区| 欧美色精品在线视频| 一区二区三区高清| 91蝌蚪porny成人天涯| 国产欧美视频一区二区三区| 韩国三级在线一区| 日韩欧美的一区二区| 美女国产一区二区| 91精品黄色片免费大全| 日日骚欧美日韩| 91麻豆精品91久久久久久清纯| 亚洲国产精品久久久久婷婷884 | 亚洲一区在线看| 日本道精品一区二区三区| ●精品国产综合乱码久久久久 | 亚洲精品国产精品乱码不99 | 欧美变态口味重另类| 日本一道高清亚洲日美韩|