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

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

?? driver.cpp

?? 這是一本介紹WIN2000環境下用WDM進行板卡驅動程序的編寫書籍
?? CPP
?? 第 1 頁 / 共 2 頁
字號:
//
// Driver.c - Chapter 9 - Minimal PnP Parallel Port Driver
//
// Copyright (C) 2000 by Jerry Lozano
//

#include "Driver.h"

// Forward declarations
//
NTSTATUS AddDevice (
			IN PDRIVER_OBJECT pDriverObject,
			IN PDEVICE_OBJECT pdo	);

NTSTATUS DispPnp(	IN PDEVICE_OBJECT pDO,
					IN PIRP pIrp );

NTSTATUS PassDownPnP( IN PDEVICE_OBJECT pDO,
					IN PIRP pIrp );

NTSTATUS HandleStartDevice(	IN PDEVICE_OBJECT pDO,
							IN PIRP pIrp );
NTSTATUS HandleStopDevice(	IN PDEVICE_OBJECT pDO,
							IN PIRP pIrp );

NTSTATUS HandleRemoveDevice(IN PDEVICE_OBJECT pDO,
							IN PIRP pIrp );

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			);

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

static BOOLEAN TransmitByte( 
		IN PVOID pArg );

VOID StartIo(
	IN PDEVICE_OBJECT pDevObj,
	IN PIRP pIrp
	);

VOID DpcForIsr(
	IN PKDPC pDpc,
	IN PDEVICE_OBJECT pDevObj,
	IN PIRP pIrp,
	IN PVOID pContext
	);

//++
// Function:	DriverEntry
//
// Description:
//		Initializes the driver.
//
// 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	) {
#if DBG>=2
	DbgPrint("MINPNP: DriverEntry\n");
#endif
	ULONG ulDeviceNumber = 0;
	NTSTATUS status = STATUS_SUCCESS;

	// Announce other driver entry points
	pDriverObject->DriverUnload = DriverUnload;

	// Announce the PNP AddDevice entry point
	pDriverObject->DriverExtension->AddDevice =
				AddDevice;

	// Announce the PNP Major Function entry point
	pDriverObject->MajorFunction[IRP_MJ_PNP] =
				DispPnp;

	// 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;
	pDriverObject->DriverStartIo = StartIo;
	
	// Notice that no device objects are created by DriverEntry.
	// Instead, we await the PnP call to AddDevice

	return status;
}

//++
// Function:	AddDevice
//
// Description:
//	Called by the PNP Manager when a new device is
//	detected on a bus.  The responsibilities include
//	creating an FDO, device name, and symbolic link.
//
// Arguments:
//	pDriverObject - Passed from PNP Manager
//	pdo		    - pointer to Physcial Device Object
//				 passed from PNP Manager
//
// Return value:
//	NTSTATUS signaling success or failure
//--
NTSTATUS AddDevice (
			IN PDRIVER_OBJECT pDriverObject,
			IN PDEVICE_OBJECT pdo	) {
	NTSTATUS status;
	PDEVICE_OBJECT pfdo;
	PDEVICE_EXTENSION pDevExt;
	static int ulDeviceNumber = 0;
#if DBG>=2
	DbgPrint("MINPNP: AddDevice; current DeviceNumber = %d\n",
				ulDeviceNumber);
#endif
	
	// Form the internal Device Name
	CUString devName("\\Device\\MINPNP"); // for "minimal" dev
	devName += CUString(ulDeviceNumber);

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

	// Choose to use BUFFERED_IO
	pfdo->Flags |= DO_BUFFERED_IO;

	// Initialize the Device Extension
	pDevExt = (PDEVICE_EXTENSION)pfdo->DeviceExtension;
	pDevExt->pDevice = pfdo;	// back pointer
	pDevExt->DeviceNumber = ulDeviceNumber;
	pDevExt->ustrDeviceName = devName;
	pDevExt->pIntObj = NULL;
	pDevExt->bInterruptExpected = FALSE;
	pDevExt->state = Stopped;

	// Pile this new fdo on top of the existing lower stack
	pDevExt->pLowerDevice =		// downward pointer
		IoAttachDeviceToDeviceStack( pfdo, pdo);

	// This is where the upper pointer would be initialized.
	// Notice how the cast of the lower device's extension
	// must be known in order to find the offset pUpperDevice.
	// PLOWER_DEVEXT pLowerDevExt = (PLOWER_DEVEXT)
	//		pDevExt->pLowerDevice->DeviceExtension;
	// pLowerDevExt->pUpperDevice = pfdo;

	// Form the symbolic link name
	CUString symLinkName("\\??\\MPNP");
	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( pfdo );
		return status;
	}

	// We need a DpcForIsr registration
	IoInitializeDpcRequest( 
		pfdo, 
		DpcForIsr );

    //  Clear the Device Initializing bit since the FDO was created
    //  outside of DriverEntry.
    pfdo->Flags &= ~DO_DEVICE_INITIALIZING;

	// Made it
	ulDeviceNumber++;
	return STATUS_SUCCESS;
}


NTSTATUS DispPnp(	IN PDEVICE_OBJECT pDO,
					IN PIRP pIrp ) {
	// obtain current IRP stack location
	PIO_STACK_LOCATION pIrpStack;
	pIrpStack = IoGetCurrentIrpStackLocation( pIrp );
#if DBG>=2
	DbgPrint("MINPNP: Received PNP IRP: %d\n",
				pIrpStack->MinorFunction);
#endif

	switch (pIrpStack->MinorFunction) {
	case IRP_MN_START_DEVICE:
		return HandleStartDevice(pDO, pIrp );
	case IRP_MN_STOP_DEVICE:
		return HandleStopDevice( pDO, pIrp );
	case IRP_MN_REMOVE_DEVICE:
		return HandleRemoveDevice( pDO, pIrp );
	default:
		// if not supported here, just pass it down
		return PassDownPnP(pDO, pIrp);
	}

	// all paths from the switch statement will "return"
	// the results of the handler invoked
}

NTSTATUS PassDownPnP( IN PDEVICE_OBJECT pDO,
					IN PIRP pIrp ) {
	IoSkipCurrentIrpStackLocation( pIrp );
	PDEVICE_EXTENSION pDevExt = (PDEVICE_EXTENSION)
		pDO->DeviceExtension;
	return IoCallDriver(pDevExt->pLowerDevice, pIrp);
}

NTSTATUS HandleStartDevice(	IN PDEVICE_OBJECT pDO,
							IN PIRP pIrp ) {
	// The stack location contains the Parameter info
	PIO_STACK_LOCATION pIrpStack =
		IoGetCurrentIrpStackLocation( pIrp );
	PDEVICE_EXTENSION pDevExt = (PDEVICE_EXTENSION)
		pDO->DeviceExtension;
#if DBG>=2
	DbgPrint("MINPNP: StartDevice, Symbolic device #%d\n",
				pDevExt->DeviceNumber+1);
#endif

	PCM_RESOURCE_LIST pResourceList;
	PCM_FULL_RESOURCE_DESCRIPTOR pFullDescriptor;
	PCM_PARTIAL_RESOURCE_LIST pPartialList;
	PCM_PARTIAL_RESOURCE_DESCRIPTOR pPartialDescriptor;
	int i;
	NTSTATUS status;

	pResourceList =	pIrpStack->Parameters.StartDevice.AllocatedResourcesTranslated;
	pFullDescriptor =
		pResourceList->List;
	pPartialList =
		&pFullDescriptor->PartialResourceList;
	for (i=0; i<(int)pPartialList->Count; i++) {
		pPartialDescriptor =
			&pPartialList->PartialDescriptors[i];
		switch (pPartialDescriptor->Type) {
		case CmResourceTypeInterrupt:
			pDevExt->IRQL = (KIRQL)
				pPartialDescriptor->u.Interrupt.Level;
			pDevExt->Vector = 
				pPartialDescriptor->u.Interrupt.Vector;
			pDevExt->Affinity = 
				pPartialDescriptor->u.Interrupt.Affinity;
#if DBG>=2
	DbgPrint("MINPNP: Claiming Interrupt Resources: "
			 "IRQ=%d Vector=0x%03X Affinity=%X\n",
			 pDevExt->IRQL, pDevExt->Vector, pDevExt->Affinity);
#endif
			break;
		case CmResourceTypeDma:
			// We don't do DMA - ignore
			break;
		case CmResourceTypePort:
			pDevExt->portBase = (PUCHAR)
				pPartialDescriptor->u.Port.Start.LowPart;
			pDevExt->portLength =
				pPartialDescriptor->u.Port.Length;
#if DBG>=2
	DbgPrint("MINPNP: Claiming Port Resources: Base=%X Len=%d\n",
				pDevExt->portBase, pDevExt->portLength);
#endif
			break;
		case CmResourceTypeMemory:
			// We don't do memory usage
			break;
		}
	}

	// Make sure we got our interrupt (and port) resources
	// Fail this IRP if we didn't.
	// Most likely cause for no interrupt:
	//   Failure to request an interrupt resource for the
	//	 printer port from the Device Manager.
	// Be SURE to use Control Panel...
	//				  Administrative Tools...
	//				  Computer Management...
	//				  Device Manager...
	// Then select Ports...Printer Port (LPT1)
	// From the Port Settings tab,
	// select "Use any interrupt assigned to the port"
	if (pDevExt->IRQL == 0 ||
		pDevExt->portBase == 0)
		return STATUS_BIOS_FAILED_TO_CONNECT_INTERRUPT;

	// Create & connect to an Interrupt object
	status =
		IoConnectInterrupt(
			&pDevExt->pIntObj,	// the Interrupt object
			Isr,			// our ISR
			pDevExt,		// Service Context
			NULL,			// no spin lock
			pDevExt->Vector,			// vector
			pDevExt->IRQL,		// DIRQL
			pDevExt->IRQL,		// DIRQL
			Latched,	// Latched or LevelSensitive
			TRUE,			// Shared?
			pDevExt->Affinity,		// processors in an MP set
			FALSE );		// save FP registers?
	if (!NT_SUCCESS(status)) {
	#if DBG>=2
		DbgPrint("MINPNP: Interrupt connection failure: %X\n", status);
	#endif
		return status;
	}
	
	#if DBG>=2
		DbgPrint("MINPNP: Interrupt successfully connected\n");
	#endif

	pDevExt->state = Started;

	return PassDownPnP(pDO, pIrp);

}

NTSTATUS HandleStopDevice(	IN PDEVICE_OBJECT pDO,
							IN PIRP pIrp ) {
#if DBG>=1
	DbgPrint("MINPNP: StopDevice Handler\n");
#endif
	PDEVICE_EXTENSION pDevExt = (PDEVICE_EXTENSION)
		pDO->DeviceExtension;

	// Delete our Interrupt object
	if (pDevExt->pIntObj)
		IoDisconnectInterrupt( pDevExt->pIntObj );

	pDevExt->state = Stopped;

	return PassDownPnP(pDO, pIrp);
}

NTSTATUS HandleRemoveDevice(IN PDEVICE_OBJECT pDO,
							IN PIRP pIrp ) {
#if DBG>=1
	DbgPrint("MINPNP: RemoveDevice Handler\n");
#endif
	PDEVICE_EXTENSION pDevExt = (PDEVICE_EXTENSION)
		pDO->DeviceExtension;

	if (pDevExt->state == Started) {
		// Woah!  we still have an interrupt object out there!
		// Delete our Interrupt object
		if (pDevExt->pIntObj)
			IoDisconnectInterrupt( pDevExt->pIntObj );
	}

	// This will yield the symbolic link name
	UNICODE_STRING pLinkName =
		pDevExt->ustrSymLinkName;
	// ... which can now be deleted
	IoDeleteSymbolicLink(&pLinkName);
#if DBG>=1
	DbgPrint("PPORT: Symbolic Link MPMP%d Deleted\n",
				pDevExt->DeviceNumber+1);
#endif
	
	// Delete the device
	IoDeleteDevice( pDO );

	pDevExt->state = Removed;
	return PassDownPnP( pDO, pIrp );
}

//++
// 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	) {
#if DBG>=1
	DbgPrint("MINPNP: DriverUnload\n");
#endif

}

//++
// Function:	DispatchCreate
//
// Description:
//		Handles call from Win32 CreateFile request
//		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

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
不卡欧美aaaaa| 这里是久久伊人| 欧美丝袜自拍制服另类| 精品久久人人做人人爰| 亚洲日本在线看| 精品一区二区三区久久久| 一本一本久久a久久精品综合麻豆| 欧美videos中文字幕| 国产99久久久久久免费看农村| 色综合天天综合狠狠| 亚洲国产日韩a在线播放| 国产激情91久久精品导航 | 中国av一区二区三区| 天天操天天干天天综合网| 99久久免费视频.com| 亚洲国产美国国产综合一区二区| 成人h动漫精品一区二| 日韩三级视频在线看| 亚洲综合在线观看视频| 91亚洲精品乱码久久久久久蜜桃| 日韩精品自拍偷拍| 男男gaygay亚洲| 91麻豆精品国产自产在线观看一区| 黑人巨大精品欧美一区| 91精品婷婷国产综合久久| 亚洲国产一区二区a毛片| 日本韩国精品一区二区在线观看| 国产精品网站在线| 成人精品高清在线| 国产精品免费av| 成a人片国产精品| 国产精品美女久久久久aⅴ| 欧美日韩二区三区| 亚洲mv大片欧洲mv大片精品| 欧美优质美女网站| 亚洲综合免费观看高清完整版在线| 99精品视频一区二区| 亚洲天堂免费看| 91精品办公室少妇高潮对白| 亚洲美女淫视频| 欧美日韩中文国产| 美女mm1313爽爽久久久蜜臀| 国产精品久久夜| 91福利在线看| 天涯成人国产亚洲精品一区av| 欧美日韩第一区日日骚| 日本在线不卡一区| 国产亚洲一本大道中文在线| 福利91精品一区二区三区| 国产精品乱码妇女bbbb| 91亚洲国产成人精品一区二三 | 亚洲欧美一区二区三区孕妇| 91在线观看美女| 亚洲一二三级电影| 精品国产免费视频| 国产成人免费视频精品含羞草妖精| 中文幕一区二区三区久久蜜桃| 99久久精品99国产精品| 视频一区二区中文字幕| 亚洲va天堂va国产va久| 日韩一区二区不卡| 成人黄色免费短视频| 亚洲综合图片区| 精品精品国产高清a毛片牛牛 | 五月天一区二区| 久久久久久久久久久久电影| 欧美一区二区视频网站| 国产98色在线|日韩| 亚洲激情中文1区| 精品国产99国产精品| 91蜜桃网址入口| 蜜桃一区二区三区四区| 亚洲图片欧美激情| 精品久久久久久无| 在线看国产日韩| 国产原创一区二区| 麻豆成人久久精品二区三区红 | 久久99日本精品| 亚洲欧美日韩久久精品| 欧美成人午夜电影| 91福利国产成人精品照片| 国产高清不卡一区二区| 91香蕉视频mp4| 精品一区二区三区免费播放| 樱花草国产18久久久久| 久久久www成人免费毛片麻豆| 欧美天堂亚洲电影院在线播放| 国产suv精品一区二区三区| 亚洲不卡一区二区三区| 中文字幕色av一区二区三区| 欧美电影免费观看高清完整版在线观看 | 一区二区三区日韩| 国产日韩欧美精品一区| 日韩亚洲电影在线| 欧美无砖专区一中文字| av一区二区三区| 成人一道本在线| 国产成人av一区二区三区在线观看| 日韩国产在线观看| 亚洲国产精品一区二区www在线 | 亚洲愉拍自拍另类高清精品| 国产精品久久久久久久久免费樱桃| 欧美一级黄色录像| 欧美日韩一区在线观看| 在线视频一区二区三| av中文字幕亚洲| 成人网页在线观看| 东方aⅴ免费观看久久av| 欧洲一区在线电影| 色婷婷av一区二区三区gif| 成人午夜精品一区二区三区| 国内精品免费在线观看| 精久久久久久久久久久| 久久爱www久久做| 人人超碰91尤物精品国产| 秋霞午夜av一区二区三区| 日韩av二区在线播放| 美国av一区二区| 国产精品综合在线视频| 欧美日韩1区2区| 欧美一级片免费看| 精品国产髙清在线看国产毛片| 日韩精品一区二区三区四区视频 | 日韩三级伦理片妻子的秘密按摩| 制服.丝袜.亚洲.另类.中文| 欧美久久久久久久久| 1024国产精品| 亚洲久草在线视频| 亚洲成人在线网站| 日本不卡不码高清免费观看| 老司机午夜精品| 成人av免费观看| 欧美午夜不卡视频| 欧美成人video| 国产精品久久久久影院老司| 亚洲综合色视频| 久久疯狂做爰流白浆xx| 欧美一区二区视频观看视频| 欧美变态tickling挠脚心| 久久精品人人做人人爽人人| 亚洲免费观看视频| 日韩激情视频网站| 成人免费视频播放| 精品视频一区二区三区免费| 精品欧美一区二区在线观看| 国产精品嫩草影院com| 亚洲一级在线观看| 国产高清在线精品| 国产精品久久久久一区二区三区| 一区在线播放视频| 奇米一区二区三区| voyeur盗摄精品| 欧美一级片在线观看| 久久久99久久精品欧美| 亚洲欧美日韩久久| 午夜久久久久久久久| 成人精品小蝌蚪| 欧美三级日韩三级| 精品久久久久久最新网址| 一区二区三区在线观看欧美| 91在线丨porny丨国产| 欧美亚洲综合一区| 日本丶国产丶欧美色综合| 久久久五月婷婷| 自拍偷在线精品自拍偷无码专区| 性久久久久久久久久久久| 男人操女人的视频在线观看欧美 | 男女激情视频一区| 波多野结衣精品在线| 一本在线高清不卡dvd| 丝袜诱惑制服诱惑色一区在线观看| 蜜臀久久99精品久久久久宅男| 成人免费不卡视频| 欧美视频一区二| 中文字幕免费不卡| 日韩精品亚洲专区| av网站一区二区三区| 久久久国产一区二区三区四区小说| 17c精品麻豆一区二区免费| 极品美女销魂一区二区三区| 91蝌蚪porny| 国产日韩欧美在线一区| 91网站最新地址| 久久精品亚洲麻豆av一区二区| 亚洲夂夂婷婷色拍ww47| 国产999精品久久| 欧美成人a在线| 午夜精品久久久久影视| 国产成人欧美日韩在线电影| 欧美日韩一区二区在线观看 | 丁香五精品蜜臀久久久久99网站| 欧美一区二区三区思思人| 日韩av中文字幕一区二区| av欧美精品.com| 中文字幕第一页久久| 黄网站免费久久| 精品国产一区二区国模嫣然| 精品综合免费视频观看| 欧美顶级少妇做爰| 伊人婷婷欧美激情|