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

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

?? driver.cpp

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

#include "Driver.h"

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

static VOID DriverUnload (
		IN PDRIVER_OBJECT	pDriverObject	);

NTSTATUS ClaimHardware(	PDRIVER_OBJECT pDriverObj,
						PDEVICE_OBJECT pDevObj,
						ULONG portBase, 
						ULONG portSpan, 
						ULONG Irq);

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

		// 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;
	pDriverObject->DriverStartIo = StartIo;
	
	// 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,
					0x378, 0x7);
	// This call would be repeated until all devices are created

	return status;
}

//++
// Function:	CreateDevice
//
// Description:
//		Adds a new device
//
// Arguments:
//		pDriverObject - Passed from I/O Manager
//		ulDeviceNumber - Logical device number (zero-based)
//		portBase - Base Address of Parallel Port Register
//		Irq - Interrupt Request Level for Parallel Port
//
// Return value:
//		NTSTATUS - Success or Failure code
//--
NTSTATUS CreateDevice (
		IN PDRIVER_OBJECT	pDriverObject,
		IN ULONG			ulDeviceNumber,
		IN ULONG			portBase,
		IN ULONG			Irq		) {

	NTSTATUS status;
	PDEVICE_OBJECT pDevObj;
	PDEVICE_EXTENSION pDevExt;

	// Form the internal Device Name
	CUString devName("\\Device\\PPORT");	// for "Parallel Port" 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;

	// Choose to use BUFFERED_IO
	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->Irq = Irq;
	pDevExt->portBase = (PUCHAR)portBase;
	pDevExt->pIntObj = NULL;

	// Since this driver controlls real hardware,
	// the hardware controlled must be "discovered."
	// Chapter 9 will discuss auto-detection,
	// but for now we will hard-code the hardware
	// resource for the common printer port.
	// We use IoReportResourceForDetection to mark
	// PORTs and IRQs as "in use."
	// This call will fail if another driver
	// (such as the standard parallel driver(s))
	// already control the hardware
	/* status =
		ClaimHardware(pDriverObject,
					  pDevObj,
					  portBase,	// fixed port address
					  PPORT_REG_LENGTH,
					  Irq);		// fixed irq

	if (!NT_SUCCESS(status)) {
		// if it fails now, must delete Device object
		IoDeleteDevice( pDevObj );
		return status;
	}
	*/

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

	// Create & connect to an Interrupt object
	// To make interrupts real, we must translate irq into
	// a HAL irq and vector (with processor affinity)
	KIRQL kIrql;
	KAFFINITY kAffinity;
	ULONG kVector =
		HalGetInterruptVector(Isa, 0, pDevExt->Irq, 0,
							&kIrql, &kAffinity);

#if DBG==1
	DbgPrint("PPORT: Interrupt %X converted to kIrql = %X, kAffinity = %X, kVector = %X\n",
				pDevExt->Irq, kIrql, kAffinity, kVector);
#endif
	
	status =
		IoConnectInterrupt(
			&pDevExt->pIntObj,	// the Interrupt object
			Isr,			// our ISR
			pDevExt,		// Service Context
			NULL,			// no spin lock
			kVector,			// vector
			kIrql,		// DIRQL
			kIrql,		// DIRQL
			Latched,	// Latched or LevelSensitive
			TRUE,			// Shared?
			kAffinity,		// processors in an MP set
			FALSE );		// save FP registers?
	if (!NT_SUCCESS(status)) {
		// if it fails now, must delete Device object
		IoDeleteDevice( pDevObj );
		return status;
	}
	
#if DBG==1
	DbgPrint("PPORT: Interrupt successfully connected\n");
#endif
	
	// Form the symbolic link name
	CUString symLinkName("\\??\\PPT");
	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;

		// 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: Object %ws deleted\n",
				(PWSTR)pDevExt->ustrSymLinkName);
#endif
	
		// 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
}

NTSTATUS ClaimHardware(	PDRIVER_OBJECT pDriverObj,
						PDEVICE_OBJECT pDevObj,
						ULONG portBase, 
						ULONG portSpan, 
						ULONG Irq) {

	NTSTATUS status;
	PHYSICAL_ADDRESS maxPortAddr;
	PIO_RESOURCE_REQUIREMENTS_LIST  pRRList;
	// This size is a headache.  The RRLIST already includes
	// 1 Resource List plus 1 Resource Descriptor
	// we need 1 additional Resource Descriptor (2 total)
	int rrSize = sizeof(IO_RESOURCE_REQUIREMENTS_LIST) +
				 sizeof(IO_RESOURCE_DESCRIPTOR);
	pRRList = (PIO_RESOURCE_REQUIREMENTS_LIST)
		ExAllocatePool(PagedPool, rrSize);

	RtlZeroMemory(pRRList, rrSize);
	pRRList->ListSize = rrSize;
	pRRList->AlternativeLists = 1;	// only 1 Resource List

	pRRList->InterfaceType = Isa;
	pRRList->List[0].Version = 1;
	pRRList->List[0].Revision = 1;
	pRRList->List[0].Count = 2;	// 2 Resource Descriptors: port & irq

	pRRList->List[0].Descriptors[0].Type = CmResourceTypePort;
	pRRList->List[0].Descriptors[0].ShareDisposition = CmResourceShareDeviceExclusive;
	pRRList->List[0].Descriptors[0].Flags = CM_RESOURCE_PORT_IO;
	pRRList->List[0].Descriptors[0].u.Port.Length = portSpan;
	pRRList->List[0].Descriptors[0].u.Port.Alignment = FILE_WORD_ALIGNMENT;
	maxPortAddr.QuadPart = portBase;
	pRRList->List[0].Descriptors[0].u.Port.MinimumAddress = maxPortAddr;
	maxPortAddr.LowPart += portSpan-1;
	pRRList->List[0].Descriptors[0].u.Port.MaximumAddress = maxPortAddr;

	pRRList->List[0].Descriptors[1].Type = CmResourceTypeInterrupt;
	pRRList->List[0].Descriptors[1].ShareDisposition = CmResourceShareDeviceExclusive;
	pRRList->List[0].Descriptors[1].Flags = CM_RESOURCE_INTERRUPT_LATCHED;
	pRRList->List[0].Descriptors[1].u.Interrupt.MinimumVector = Irq;
	pRRList->List[0].Descriptors[1].u.Interrupt.MaximumVector = Irq;

	status =
		IoReportDetectedDevice(
			pDriverObj,		// DriverObject
			Isa,			// Bus type
			-1,				// Bus number
			-1,				// SlotNumber
			NULL,			// Driver RESOURCE_LIST
			pRRList,		// Device Resource List
			FALSE,			// Already claimed?
			&pDevObj );		// device object

	ExFreePool(pRRList);
	return status;
}

//++
// 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			) {

	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 PPort 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			) {
	
	// Dig out the Device Extension from the Device object
	PDEVICE_EXTENSION pDevExt = (PDEVICE_EXTENSION)
		pDevObj->DeviceExtension;
	if (pDevExt->deviceBuffer != NULL) {

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
日本一二三四高清不卡| 蜜臀久久久99精品久久久久久| 亚洲一线二线三线久久久| 蜜臀av国产精品久久久久| 91麻豆精品秘密| 久久久91精品国产一区二区精品 | 色综合久久久久| 精品国产乱码久久久久久影片| 夜夜精品浪潮av一区二区三区| 国产91在线看| 久久毛片高清国产| 水蜜桃久久夜色精品一区的特点| 成人app软件下载大全免费| 欧美大尺度电影在线| 亚洲一线二线三线视频| av中文字幕一区| 欧美国产成人在线| 国产伦精品一区二区三区视频青涩| 欧美日韩成人综合| 一区二区在线看| 91在线国产福利| 中文av一区二区| 丁香亚洲综合激情啪啪综合| 久久亚洲精精品中文字幕早川悠里| 亚洲成人动漫精品| 欧美男人的天堂一二区| 亚洲影院在线观看| 欧美午夜电影一区| 一区二区三区色| 99re视频精品| 中文字幕亚洲一区二区va在线| 国产精品一二三区| 欧美经典一区二区| 国产91在线观看丝袜| 中文字幕乱码一区二区免费| 成人黄色小视频| 国产精品免费观看视频| 91一区二区三区在线播放| 综合亚洲深深色噜噜狠狠网站| 成人av网站免费| 国产精品毛片久久久久久久| fc2成人免费人成在线观看播放| 欧美高清在线一区二区| 91免费视频观看| 一区二区三区资源| 欧美久久久久免费| 麻豆精品国产传媒mv男同| 久久久久久久性| 成人动漫视频在线| 亚洲精品亚洲人成人网| 欧美日韩精品一区二区| 精品亚洲成a人在线观看| 久久精品视频一区二区三区| 99久久婷婷国产综合精品电影| 亚洲免费资源在线播放| 欧美久久久久久久久| 国产一区不卡精品| 亚洲免费观看高清在线观看| 欧美视频中文字幕| 韩国欧美一区二区| 中文字幕一区二区三区四区| 欧美军同video69gay| 国产成人一区在线| 亚洲国产色一区| 欧美xxxxx牲另类人与| av不卡一区二区三区| 水野朝阳av一区二区三区| 亚洲国产精品ⅴa在线观看| 欧美无砖砖区免费| 国产精品一区二区久激情瑜伽| 亚洲欧美一区二区久久| 欧美mv日韩mv亚洲| 色综合久久九月婷婷色综合| 九九精品视频在线看| 亚洲欧美一区二区三区国产精品 | 毛片一区二区三区| 国产精品久久久久久久第一福利| 欧美自拍偷拍一区| 国产成人小视频| 日韩激情av在线| 中文成人av在线| 欧美videossexotv100| 99精品黄色片免费大全| 久久99精品视频| 亚洲午夜在线电影| 国产精品天天看| 欧美变态tickle挠乳网站| 在线免费视频一区二区| 顶级嫩模精品视频在线看| 捆绑变态av一区二区三区| 亚洲精品视频在线看| 国产网站一区二区| 91精品国产品国语在线不卡| 日本韩国一区二区| av亚洲产国偷v产偷v自拍| 久久66热re国产| 丝袜国产日韩另类美女| 一区二区三区 在线观看视频| 国产婷婷色一区二区三区在线| 在线综合+亚洲+欧美中文字幕| 91在线码无精品| 成人av影视在线观看| 国产精品综合久久| 久久99国内精品| 老汉av免费一区二区三区| 日韩福利视频导航| 亚洲自拍都市欧美小说| 亚洲色图在线看| 亚洲欧美怡红院| 国产精品久久久久影院亚瑟 | 国产精品一区在线观看你懂的| 日韩二区在线观看| 日韩中文字幕区一区有砖一区 | 欧美系列一区二区| 91免费视频大全| 欧美亚洲精品一区| 欧美日韩国产一级片| 91精品国产综合久久精品app | 懂色av中文一区二区三区| 福利一区二区在线观看| 成人av免费网站| 91偷拍与自偷拍精品| 色狠狠色噜噜噜综合网| 欧美在线视频你懂得| 欧美美女一区二区| 欧美成人三级在线| 久久久久久夜精品精品免费| 亚洲国产成人私人影院tom| 国产精品久久久久久久久免费丝袜| 欧美国产精品一区| 亚洲男同性视频| 水野朝阳av一区二区三区| 久久精品国产亚洲5555| 国产精品1区二区.| 99免费精品视频| 欧美三级韩国三级日本三斤 | 91福利区一区二区三区| 欧美三级中文字幕| 精品国产亚洲在线| 国产精品免费视频网站| 一区二区国产盗摄色噜噜| 婷婷开心激情综合| 精品一区二区三区香蕉蜜桃| 成人精品视频网站| 欧美中文字幕久久| 精品成人佐山爱一区二区| 国产精品萝li| 天天av天天翘天天综合网 | 99re66热这里只有精品3直播| 色综合久久综合网欧美综合网 | 视频一区中文字幕| 韩国成人福利片在线播放| 国产成人精品免费一区二区| 成人免费观看av| 在线电影国产精品| 国产精品乱码妇女bbbb| 亚洲成av人片在线观看| 国产成人午夜电影网| 欧美色区777第一页| 中文久久乱码一区二区| 日本特黄久久久高潮| 91色在线porny| 欧美不卡视频一区| 亚洲主播在线观看| 国产成人精品免费一区二区| 欧美高清激情brazzers| 国产精品久久久久久久浪潮网站| 免费看日韩精品| 色哟哟一区二区三区| 久久一区二区视频| 日本中文字幕不卡| 在线观看免费一区| 亚洲色图在线播放| 国产不卡在线一区| 欧美tickling挠脚心丨vk| 一个色在线综合| 成人av手机在线观看| 精品免费一区二区三区| 午夜久久久久久电影| 91麻豆国产在线观看| 国产精品久久久99| 国产精品一区三区| 欧美mv日韩mv| 美国十次了思思久久精品导航| 欧美在线观看视频一区二区三区 | 婷婷国产v国产偷v亚洲高清| 色婷婷综合视频在线观看| 国产精品久久久久久久久久久免费看 | 国产精品久久久久桃色tv| 国产一区二区不卡老阿姨| 欧美一级国产精品| 性久久久久久久久| 91国产精品成人| 一区二区久久久久久| 91色.com| 亚洲欧美自拍偷拍色图| av一区二区三区四区| 51久久夜色精品国产麻豆| 亚洲第一会所有码转帖| 欧美色成人综合|