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

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

?? driver.cpp

?? 這是一本介紹WIN2000環境下用WDM進行板卡驅動程序的編寫書籍
?? CPP
字號:
//
// Driver.c - Chapter 7 - Loopback Driver
//
// Copyright (C) 2000 by Jerry Lozano
//

#include "Driver.h"

// Forward declarations
//
static NTSTATUS CreateDevice (
		IN PDRIVER_OBJECT	pDriverObject,
		IN ULONG			DeviceNumber	);

static VOID DriverUnload (
		IN PDRIVER_OBJECT	pDriverObject	);

static NTSTATUS DispatchCreate (
		IN PDEVICE_OBJECT	pDevObj,
		IN PIRP				pIrp			);

static NTSTATUS DispatchClose (
		IN PDEVICE_OBJECT	pDevObj,
		IN PIRP				pIrp			);

static NTSTATUS DispatchWrite (
		IN PDEVICE_OBJECT	pDevObj,
		IN PIRP				pIrp			);

static NTSTATUS DispatchRead (
		IN PDEVICE_OBJECT	pDevObj,
		IN PIRP				pIrp			);


//++
// Function:	DriverEntry
//
// Description:
//		Initializes the driver, locating and claiming
//		hardware resources.  Creates the kernel objects
//		needed to process I/O requests.
//
// Arguments:
//		pDriverObject - Passed from I/O Manager
//		pRegistryPath - UNICODE_STRING pointer to
//						registry info (service key)
//						for this driver
//
// Return value:
//		NTSTATUS signaling success or failure
//--
extern "C" NTSTATUS DriverEntry (
			IN PDRIVER_OBJECT pDriverObject,
			IN PUNICODE_STRING pRegistryPath	) {
	ULONG ulDeviceNumber = 0;
	NTSTATUS status;

	// If this driver controlled real hardware,
	// code would be placed here to locate it.
	// Using IoReportDetectedDevice, the ports,
	// IRQs, and DMA channels would be "marked"
	// as "in use" and under the control of this driver.
	// This Loopback driver has no HW, so...

	// Announce other driver entry points
	pDriverObject->DriverUnload = DriverUnload;
	// This includes Dispatch routines for Create, Write & Read
	pDriverObject->MajorFunction[IRP_MJ_CREATE] =
				DispatchCreate;
	pDriverObject->MajorFunction[IRP_MJ_CLOSE] =
				DispatchClose;
	pDriverObject->MajorFunction[IRP_MJ_WRITE] =
				DispatchWrite;
	pDriverObject->MajorFunction[IRP_MJ_READ] =
				DispatchRead;
	
	// For each physical or logical device detected
	// that will be under this Driver's control,
	// a new Device object must be created.
	status =
		CreateDevice(pDriverObject, ulDeviceNumber);
	// This call would be repeated until all devices are created
	//ulDeviceNumber++;
	//status =
	//	CreateDevice(pDriverObject, ulDeviceNumber);

	return status;
}

//++
// Function:	CreateDevice
//
// Description:
//		Adds a new device
//
// Arguments:
//		pDriverObject - Passed from I/O Manager
//		ulDeviceNumber - Logical device number (zero-based)
//
// Return value:
//		None
//--
NTSTATUS CreateDevice (
		IN PDRIVER_OBJECT	pDriverObject,
		IN ULONG			ulDeviceNumber	) {

	NTSTATUS status;
	PDEVICE_OBJECT pDevObj;
	PDEVICE_EXTENSION pDevExt;
	
	// Form the internal Device Name
	CUString devName("\\Device\\LOOPBACK");	// for "loopback" device
	devName += CUString(ulDeviceNumber);

	// Now create the device
	status =
		IoCreateDevice( pDriverObject,
						sizeof(DEVICE_EXTENSION),
						&(UNICODE_STRING)devName,
						FILE_DEVICE_UNKNOWN,
						0, TRUE,
						&pDevObj );
	if (!NT_SUCCESS(status))
		return status;

	// Announce that we will be working with a copy of the user's buffer
	pDevObj->Flags |= DO_BUFFERED_IO;

	// Initialize the Device Extension
	pDevExt = (PDEVICE_EXTENSION)pDevObj->DeviceExtension;

	pDevExt->pDevice = pDevObj;	// back pointer
	pDevExt->DeviceNumber = ulDeviceNumber;
	pDevExt->ustrDeviceName = devName;
	pDevExt->deviceBuffer = NULL;
	pDevExt->deviceBufferSize = 0;

	// Form the symbolic link name
	CUString symLinkName("\\??\\LBK");
	symLinkName += CUString(ulDeviceNumber+1);	// 1 based
	pDevExt->ustrSymLinkName = symLinkName;

	// Now create the link name
	status = 
		IoCreateSymbolicLink( &(UNICODE_STRING)symLinkName,
							  &(UNICODE_STRING)devName );
	if (!NT_SUCCESS(status)) {
		// if it fails now, must delete Device object
		IoDeleteDevice( pDevObj );
		return status;
	}

	// Made it
	return STATUS_SUCCESS;
}

//++
// Function:	DriverUnload
//
// Description:
//		Stops & Deletes devices controlled by this driver.
//		Stops interrupt processing (if any)
//		Releases kernel resources consumed by driver
//
// Arguments:
//		pDriverObject - Passed from I/O Manager
//
// Return value:
//		None
//--

VOID DriverUnload (
		IN PDRIVER_OBJECT	pDriverObject	) {

	PDEVICE_OBJECT	pNextObj;

	// Loop through each device controlled by Driver
	pNextObj = pDriverObject->DeviceObject;
	while (pNextObj != NULL) {
		// Dig out the Device Extension from the
		// Device Object
		PDEVICE_EXTENSION pDevExt = (PDEVICE_EXTENSION)
			pNextObj->DeviceExtension;
		// Free up any buffer still held by this device
		if (pDevExt->deviceBuffer != NULL) {
			ExFreePool(pDevExt->deviceBuffer);
			pDevExt->deviceBuffer = NULL;
			pDevExt->deviceBufferSize = 0;
		}
		// DevExt also holds the symbolic link name
		UNICODE_STRING pLinkName =
			pDevExt->ustrSymLinkName;
		// ... which can now be deleted
		IoDeleteSymbolicLink(&pLinkName);
		// a little trickery... 
		// we need to delete the device object, BUT
		// the Device object is pointed to by pNextObj
		// If we delete the device object first,
		// we can't traverse to the next Device in the list
		// Rather than create another pointer, we can
		// use the DeviceExtension's back pointer to the device
		// So, first update the next pointer...
		pNextObj = pNextObj->NextDevice;
		// then delete the device using the Extension
		IoDeleteDevice( pDevExt->pDevice );
	}
	// Finally, hardware that was allocated in DriverEntry
	// would be released here using
	// IoReportResourceUsage
}

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

NTSTATUS DispatchCreate (
		IN PDEVICE_OBJECT	pDevObj,
		IN PIRP				pIrp			) {

	pIrp->IoStatus.Status = STATUS_SUCCESS;
	pIrp->IoStatus.Information = 0;	// no bytes xfered
	IoCompleteRequest( pIrp, IO_NO_INCREMENT );
	return STATUS_SUCCESS;
}

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

NTSTATUS DispatchClose (
		IN PDEVICE_OBJECT	pDevObj,
		IN PIRP				pIrp			) {
	
	// 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:	DispatchWrite
//
// Description:
//		Handles call from Win32 WriteFile request
//		For loopback driver, allocates new pool buffer
//			then xfers user buffer to pool buffer
//
// 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			) {
	
	
	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;
	// 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 = pIrp->AssociatedIrp.SystemBuffer;

	// Allocate the new buffer
	pDevExt->deviceBuffer =
		ExAllocatePool( PagedPool, xferSize );
	if (pDevExt->deviceBuffer == NULL) {
		// buffer didn't allocate???
		status = STATUS_INSUFFICIENT_RESOURCES;
		xferSize = 0;
	} else {
		// copy the buffer
		pDevExt->deviceBufferSize = xferSize;
		RtlCopyMemory( pDevExt->deviceBuffer, userBuffer,
							xferSize );
	}

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

//++
// Function:	DispatchRead
//
// Description:
//		Handles call from Win32 ReadFile request
//		For loopback 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			) {
	
	
	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;
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产女同互慰高潮91漫画| 亚洲欧美国产三级| 中文字幕在线不卡国产视频| 亚洲福利电影网| 国产精品66部| 91精品在线麻豆| 亚洲欧美一区二区三区孕妇| 久久99精品久久久久婷婷| 91成人免费在线| 欧美国产精品久久| 青青国产91久久久久久| 色婷婷综合久久久久中文一区二区 | 亚洲国产精品久久不卡毛片| 精品一区二区三区在线播放视频| 日本道色综合久久| 中文字幕电影一区| 国产乱人伦精品一区二区在线观看| 欧美亚洲国产一区在线观看网站| 亚洲国产精品成人综合| 精东粉嫩av免费一区二区三区| 在线免费不卡电影| 亚洲欧洲韩国日本视频| 国产精品一区二区91| 欧美成人三级在线| 人人精品人人爱| 欧美精品黑人性xxxx| 亚洲永久精品国产| 色成人在线视频| 亚洲天堂网中文字| 99re亚洲国产精品| 亚洲欧美日韩精品久久久久| www.久久精品| ...xxx性欧美| a4yy欧美一区二区三区| 国产精品麻豆欧美日韩ww| 成人午夜视频网站| 中文av一区二区| 99天天综合性| 一区二区三区成人| 精品视频资源站| 亚洲不卡av一区二区三区| 欧美日韩视频在线观看一区二区三区| 亚洲精品视频观看| 欧美揉bbbbb揉bbbbb| 天天色 色综合| 欧美一级视频精品观看| 久久99国产精品麻豆| 日韩精品一区二区在线| 国产精品91一区二区| 国产精品久久综合| 欧美中文字幕一区| 91精品国产入口在线| 青娱乐精品视频在线| www国产精品av| 不卡一区在线观看| 亚洲影院免费观看| 日韩欧美高清dvd碟片| 国产一区二区三区四区五区美女 | 欧美在线一区二区三区| 亚洲mv大片欧洲mv大片精品| 欧美一二三区在线| 欧美日韩免费高清一区色橹橹| 亚洲国产美国国产综合一区二区| 欧美一区二区三区视频免费| 精品亚洲porn| 亚洲欧洲日本在线| 欧美一区二区在线视频| 国产一区二区在线影院| 亚洲视频网在线直播| 91精品国产综合久久国产大片| 国内久久婷婷综合| 一区二区欧美视频| 欧美www视频| 91片黄在线观看| 麻豆精品一区二区| 一区二区三区在线看| 日韩午夜小视频| av高清不卡在线| 蜜臀久久99精品久久久久久9 | 国产精品久久久久四虎| 欧美日韩在线免费视频| 丁香六月综合激情| 日韩精品色哟哟| 中文字幕在线不卡| 精品国一区二区三区| 欧美三级电影在线看| 成人妖精视频yjsp地址| 免费成人美女在线观看.| 亚洲日本va在线观看| 精品久久久久一区| 欧美美女激情18p| 99久久精品费精品国产一区二区| 久久国产精品色婷婷| 五月激情综合婷婷| 亚洲一卡二卡三卡四卡| 中文字幕在线视频一区| 26uuu久久天堂性欧美| 欧美日韩亚洲不卡| 在线观看不卡一区| 91在线免费视频观看| 国产凹凸在线观看一区二区| 麻豆一区二区三| 午夜伊人狠狠久久| 亚洲黄色尤物视频| 亚洲欧洲av色图| 国产精品美女久久久久aⅴ国产馆| 日韩一级片网址| 91精品综合久久久久久| 欧美熟乱第一页| 在线观看视频91| 91热门视频在线观看| 91丝袜国产在线播放| av电影在线观看完整版一区二区| 成人一级片在线观看| 国产aⅴ综合色| 国产69精品久久久久毛片| 极品少妇一区二区| 精品亚洲aⅴ乱码一区二区三区| 成人精品视频一区二区三区| 久久精品国产亚洲aⅴ| 美女脱光内衣内裤视频久久网站| 日韩国产欧美视频| 男男视频亚洲欧美| 美国毛片一区二区三区| 韩国精品主播一区二区在线观看| 久久精品99久久久| 国产成人亚洲综合色影视| 黑人巨大精品欧美一区| 国产一区二区三区| 大桥未久av一区二区三区中文| 粉嫩一区二区三区在线看| yourporn久久国产精品| 91久久国产最好的精华液| 欧美天天综合网| 日韩精品一区二区三区四区| 久久久久久久电影| 国产精品女人毛片| 一区二区三区自拍| 丝袜诱惑制服诱惑色一区在线观看| 日本 国产 欧美色综合| 国产乱对白刺激视频不卡| av综合在线播放| 91成人免费在线| 日韩欧美区一区二| 中文字幕第一区| 亚洲免费看黄网站| 久久精工是国产品牌吗| 成人不卡免费av| 欧美日韩免费一区二区三区| 久久综合九色综合欧美亚洲| 最新国产精品久久精品| 午夜久久电影网| 国产成人av福利| 欧美色综合网站| 国产欧美一区二区三区在线老狼| 一区二区三区日韩精品视频| 毛片av一区二区三区| 99久久精品久久久久久清纯| 91精品国产欧美一区二区| 国产精品无遮挡| 日韩综合一区二区| 99久久亚洲一区二区三区青草| 欧美日本视频在线| 欧美国产欧美亚州国产日韩mv天天看完整| 精品无码三级在线观看视频| 91福利国产精品| 欧美激情一区在线| 麻豆精品国产91久久久久久| 91看片淫黄大片一级在线观看| 日韩欧美美女一区二区三区| 亚洲男人的天堂av| 国产九色sp调教91| 欧美日本视频在线| 亚洲精品视频免费观看| 成人综合婷婷国产精品久久| 欧美日韩成人综合天天影院| 亚洲欧美综合另类在线卡通| 久久 天天综合| 欧美一区二区三区在线电影 | 亚洲精品视频在线观看网站| 狠狠色伊人亚洲综合成人| 欧美精品自拍偷拍| 亚洲欧美日韩一区二区| 丰满岳乱妇一区二区三区| 精品国产sm最大网站| 日本中文字幕一区二区视频 | 韩国欧美国产1区| 欧美电影免费观看高清完整版| 亚洲国产成人va在线观看天堂| 91在线无精精品入口| 欧美激情综合在线| 国产成a人无v码亚洲福利| 精品久久久久久综合日本欧美| 热久久一区二区| 欧美一区二区三区爱爱| 视频在线观看91| 在线电影一区二区三区| 天天综合日日夜夜精品| 欧美日韩一级二级三级| 亚洲成av人片一区二区三区|