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

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

?? readwrite.cpp

?? 一本在講述USB驅動程式的書 及其范例原碼
?? CPP
字號:
// Read/Write request processors for pci42 driver
// Copyright (C) 1999 by Walter Oney
// All rights reserved

#include "stddcls.h"
#include "driver.h"

VOID OnCancelReadWrite(PDEVICE_OBJECT fdo, PIRP Irp);
VOID TransferFirst(PDEVICE_EXTENSION pdx);

///////////////////////////////////////////////////////////////////////////////

#pragma PAGEDCODE

NTSTATUS DispatchCleanup(PDEVICE_OBJECT fdo, PIRP Irp)
	{							// DispatchCleanup
	PAGED_CODE();
	KdPrint((DRIVERNAME " - IRP_MJ_CLEANUP\n"));
	PDEVICE_EXTENSION pdx = (PDEVICE_EXTENSION) fdo->DeviceExtension;
	PIO_STACK_LOCATION stack = IoGetCurrentIrpStackLocation(Irp);
	CleanupRequests(&pdx->dqReadWrite, stack->FileObject, STATUS_CANCELLED);
	return CompleteRequest(Irp, STATUS_SUCCESS, 0);
	}							// DispatchCleanup

///////////////////////////////////////////////////////////////////////////////

#pragma PAGEDCODE

NTSTATUS DispatchCreate(PDEVICE_OBJECT fdo, PIRP Irp)
	{							// DispatchCreate
	PAGED_CODE();
	KdPrint((DRIVERNAME " - IRP_MJ_CREATE\n"));
	PDEVICE_EXTENSION pdx = (PDEVICE_EXTENSION) fdo->DeviceExtension;

	PIO_STACK_LOCATION stack = IoGetCurrentIrpStackLocation(Irp);

	NTSTATUS status = STATUS_SUCCESS;
	InterlockedIncrement(&pdx->handles);
	return CompleteRequest(Irp, status, 0);
	}							// DispatchCreate


///////////////////////////////////////////////////////////////////////////////

#pragma PAGEDCODE

NTSTATUS DispatchClose(PDEVICE_OBJECT fdo, PIRP Irp)
	{							// DispatchClose
	PAGED_CODE();
	KdPrint((DRIVERNAME " - IRP_MJ_CLOSE\n"));
	PDEVICE_EXTENSION pdx = (PDEVICE_EXTENSION) fdo->DeviceExtension;
	PIO_STACK_LOCATION stack = IoGetCurrentIrpStackLocation(Irp);
	InterlockedDecrement(&pdx->handles);
	return CompleteRequest(Irp, STATUS_SUCCESS, 0);
	}							// DispatchClose

///////////////////////////////////////////////////////////////////////////////

#pragma PAGEDCODE

NTSTATUS DispatchReadWrite(PDEVICE_OBJECT fdo, PIRP Irp)
	{							// DispatchReadWrite
	PAGED_CODE();
	PDEVICE_EXTENSION pdx = (PDEVICE_EXTENSION) fdo->DeviceExtension;

	IoMarkIrpPending(Irp);
	StartPacket(&pdx->dqReadWrite, fdo, Irp, OnCancelReadWrite);
	return STATUS_PENDING;
	}							// DispatchReadWrite

#pragma LOCKEDCODE

VOID OnCancelReadWrite(IN PDEVICE_OBJECT fdo, IN PIRP Irp)
	{							// OnCancelReadWrite
	PDEVICE_EXTENSION pdx = (PDEVICE_EXTENSION) fdo->DeviceExtension;
	CancelRequest(&pdx->dqReadWrite, Irp);
	}							// OnCancelReadWrite

///////////////////////////////////////////////////////////////////////////////

#pragma LOCKEDCODE

VOID DpcForIsr(PKDPC Dpc, PDEVICE_OBJECT fdo, PIRP junk, PDEVICE_EXTENSION pdx)
	{							// DpcForIsr
	PIRP Irp = GetCurrentIrp(&pdx->dqReadWrite);
	StartNextPacket(&pdx->dqReadWrite, fdo);
	IoCompleteRequest(Irp, IO_NO_INCREMENT);
	IoReleaseRemoveLock(&pdx->RemoveLock, Irp);
	}							// DpcForIsr

///////////////////////////////////////////////////////////////////////////////

#pragma LOCKEDCODE

BOOLEAN OnInterrupt(PKINTERRUPT InterruptObject, PDEVICE_EXTENSION pdx)
	{							// OnInterrupt

	// Read interrupt control/status register and see if an interrupt is pending.
	// If not, return FALSE immediately.

	ULONG intcsr = READ_PORT_ULONG((PULONG) (pdx->portbase + INTCSR));
	if (!(intcsr & INTCSR_INTERRUPT_PENDING))
		return FALSE;

	// See if we're really processing an IRP or if new requests are now being rejected
	// because of some PnP event or another

	BOOLEAN dpc = FALSE;		// assume no DPC needed

	PIRP Irp = GetCurrentIrp(&pdx->dqReadWrite);
	NTSTATUS status = -1;

	if (pdx->busy)
		{						// see if we need to terminate this IRP
		ASSERT(Irp);
		
		if (Irp->Cancel)
			status = STATUS_CANCELLED;
		else
			status = AreRequestsBeingAborted(&pdx->dqReadWrite);

		if (!NT_SUCCESS(status))
			dpc = TRUE, pdx->nbytes = 0; // terminate IRP after clearing interrupt
		}						// see if we need to terminate this IRP

	// Process pending interrupts. This particular sample driver is only looking
	// for an incoming mailbox interrupt caused by the addon-simulator putting
	// a data byte into byte-0 of mailbox 1

	while (intcsr & INTCSR_INTERRUPT_PENDING)
		{						// clear all interrupts

		// Process incoming mailbox interrupt by reading a data byte

		if ((intcsr & INTCSR_IMBI) && pdx->nbytes && pdx->busy)
			{					// incoming mailbox interrupt
			*pdx->buffer = READ_PORT_UCHAR(pdx->portbase + IMB1);
			++pdx->buffer;
			++pdx->numxfer;
			if (!--pdx->nbytes)
				{			// request finished
				Irp->IoStatus.Information = pdx->numxfer;
				dpc = TRUE;
				status = STATUS_SUCCESS;
				}			// request finished
			}					// incoming mailbox interrupt

		// Interrupt flags on the S5933 are cleared by writing a "1" bit to them,
		// so clear all the interrupts we just examined.

		WRITE_PORT_ULONG((PULONG) (pdx->portbase + INTCSR), intcsr);

		// Check for additional interrupts
		
		intcsr = READ_PORT_ULONG((PULONG) (pdx->portbase + INTCSR));
		}						// clear all interrupts

	// Request a DPC if necessary

	if (dpc)
		{						// request DPC
		pdx->busy = FALSE;
		ASSERT(Irp);
		ASSERT(status != -1);
		Irp->IoStatus.Status = status;
		IoRequestDpc(pdx->DeviceObject, NULL, pdx);
		}						// request DPC

	return TRUE;
	}							// OnInterrupt

///////////////////////////////////////////////////////////////////////////////

#pragma PAGEDCODE

VOID ResetDevice(PDEVICE_EXTENSION pdx)
	{							// ResetDevice
	PAGED_CODE();

	// Reset the device

	WRITE_PORT_ULONG((PULONG) (pdx->portbase + MCSR), MCSR_RESET);

	// Reset signals to the S5933 itself don't need to be written back as zero. The
	// add-on function reset flag must, however, be cleared. Delay a short period of
	// time to allow the reset to occur, then write back a zero to the add-on reset bit

	LARGE_INTEGER timeout;
	timeout.QuadPart = -10 * 10000; // i.e., 10 milliseconds

	KeDelayExecutionThread(KernelMode, FALSE, &timeout);
	WRITE_PORT_ULONG((PULONG) (pdx->portbase + MCSR), 0);

	// Clear any pending interrupts by writing 1's

	WRITE_PORT_ULONG((PULONG) (pdx->portbase + INTCSR), INTCSR_INTERRUPT_MASK);
	}							// ResetDevice

///////////////////////////////////////////////////////////////////////////////

#pragma LOCKEDCODE

VOID SetupDevice(PDEVICE_EXTENSION pdx)
	{							// SetupDevice
	WRITE_PORT_ULONG((PULONG) (pdx->portbase + INTCSR),
		  INTCSR_IMBI_ENABLE									// enable incoming mailbox interrupt
		| (INTCSR_MB1 << INTCSR_IMBI_REG_SELECT_SHIFT)			// namely, on mailbox 1
		| (INTCSR_BYTE0 << INTCSR_IMBI_BYTE_SELECT_SHIFT)		// specifically, when byte 0 fills
		);
	}							// SetupDevice

///////////////////////////////////////////////////////////////////////////////

#pragma PAGEDCODE

NTSTATUS StartDevice(PDEVICE_OBJECT fdo, PCM_PARTIAL_RESOURCE_LIST raw, PCM_PARTIAL_RESOURCE_LIST translated)
	{							// StartDevice
	NTSTATUS status;
	PDEVICE_EXTENSION pdx = (PDEVICE_EXTENSION) fdo->DeviceExtension;

	// Identify the I/O resources we're supposed to use.
	
	ULONG vector;
	KIRQL irql;
	KINTERRUPT_MODE mode;
	KAFFINITY affinity;
	BOOLEAN irqshare;
	BOOLEAN gotinterrupt = FALSE;

	PHYSICAL_ADDRESS portbase;
	BOOLEAN gotport = FALSE;
	
	if (!translated)
		return STATUS_DEVICE_CONFIGURATION_ERROR;		// no resources assigned??

	PCM_PARTIAL_RESOURCE_DESCRIPTOR resource = translated->PartialDescriptors;
	ULONG nres = translated->Count;
	for (ULONG i = 0; i < nres; ++i, ++resource)
		{						// for each resource
		switch (resource->Type)
			{					// switch on resource type

		case CmResourceTypePort:
			portbase = resource->u.Port.Start;
			pdx->nports = resource->u.Port.Length;
			pdx->mappedport = (resource->Flags & CM_RESOURCE_PORT_IO) == 0;
			gotport = TRUE;
			break;
	
		case CmResourceTypeInterrupt:
			irql = (KIRQL) resource->u.Interrupt.Level;
			vector = resource->u.Interrupt.Vector;
			affinity = resource->u.Interrupt.Affinity;
			mode = (resource->Flags == CM_RESOURCE_INTERRUPT_LATCHED)
				? Latched : LevelSensitive;
			irqshare = resource->ShareDisposition == CmResourceShareShared;
			gotinterrupt = TRUE;
			break;

		default:
			KdPrint((DRIVERNAME " - Unexpected I/O resource type %d\n", resource->Type));
			break;
			}					// switch on resource type
		}						// for each resource

	if (!(TRUE
		&& gotport
		&& gotinterrupt
		))
		{
		KdPrint((DRIVERNAME " - Didn't get expected I/O resources\n"));
		return STATUS_DEVICE_CONFIGURATION_ERROR;
		}

	if (pdx->mappedport)
		{						// map port address for RISC platform
		pdx->portbase = (PUCHAR) MmMapIoSpace(portbase, pdx->nports, MmNonCached);
		if (!pdx->portbase)
			{
			KdPrint((DRIVERNAME " - Unable to map port range %I64X, length %X\n", portbase, pdx->nports));
			return STATUS_INSUFFICIENT_RESOURCES;
			}
		}						// map port address for RISC platform
	else
		pdx->portbase = (PUCHAR) portbase.QuadPart;

	ResetDevice(pdx);			// reset the device

	status = IoConnectInterrupt(&pdx->InterruptObject, (PKSERVICE_ROUTINE) OnInterrupt,
		(PVOID) pdx, NULL, vector, irql, irql, mode, irqshare, affinity, FALSE);
	if (!NT_SUCCESS(status))
		{
		KdPrint((DRIVERNAME " - IoConnectInterrupt failed - %X\n", status));
		if (pdx->portbase && pdx->mappedport)
			MmUnmapIoSpace(pdx->portbase, pdx->nports);
		pdx->portbase = NULL;
		return status;
		}

	// Initialize the device

	KeSynchronizeExecution(pdx->InterruptObject, (PKSYNCHRONIZE_ROUTINE) SetupDevice, pdx);

	return STATUS_SUCCESS;
	}							// StartDevice

///////////////////////////////////////////////////////////////////////////////

#pragma LOCKEDCODE

VOID StartIo(IN PDEVICE_OBJECT fdo, IN PIRP Irp)
	{							// StartIo
	PDEVICE_EXTENSION pdx = (PDEVICE_EXTENSION) fdo->DeviceExtension;
	PIO_STACK_LOCATION stack = IoGetCurrentIrpStackLocation(Irp);
	NTSTATUS status = IoAcquireRemoveLock(&pdx->RemoveLock, Irp);
	if (!NT_SUCCESS(status))
		{
		CompleteRequest(Irp, status, 0);
		return;
		}

	// Short-circuit a read for zero bytes

	if (!stack->Parameters.Read.Length)
		{						// nothing to do
		StartNextPacket(&pdx->dqReadWrite, fdo);
		CompleteRequest(Irp, STATUS_SUCCESS, 0);
		IoReleaseRemoveLock(&pdx->RemoveLock, Irp);
		return;
		}						// nothing to do

	// Save description of current request in the device extension

	pdx->buffer = (PUCHAR) Irp->AssociatedIrp.SystemBuffer;
	pdx->nbytes = stack->Parameters.Read.Length;
	pdx->numxfer = 0;

	// See if an input byte is already available. After this first byte, we wait for
	// an interrupt to tell us the next byte is available.

	KeSynchronizeExecution(pdx->InterruptObject, (PKSYNCHRONIZE_ROUTINE) TransferFirst, pdx);
	}							// StartIo

///////////////////////////////////////////////////////////////////////////////

#pragma PAGEDCODE

VOID StopDevice(IN PDEVICE_OBJECT fdo, BOOLEAN oktouch /* = FALSE */)
	{							// StopDevice
	PDEVICE_EXTENSION pdx = (PDEVICE_EXTENSION) fdo->DeviceExtension;

	if (pdx->InterruptObject)
		{						// disconnect interrupt
		if (oktouch)
			ResetDevice(pdx);

		IoDisconnectInterrupt(pdx->InterruptObject);
		pdx->InterruptObject = NULL;
		}						// disconnect interrupt

	if (pdx->portbase && pdx->mappedport)
		MmUnmapIoSpace(pdx->portbase, pdx->nports);
	pdx->portbase = NULL;
	}							// StopDevice

///////////////////////////////////////////////////////////////////////////////

#pragma LOCKEDCODE

VOID TransferFirst(PDEVICE_EXTENSION pdx)
	{							// TransferFirst

	pdx->busy = TRUE;

	// See if a data byte is already pending in the incoming mailbox

	ULONG mbef = READ_PORT_ULONG((PULONG) (pdx->portbase + MBEF));
	if (!(mbef & MBEF_IN1_0))
		return;					// no pending input byte

	*pdx->buffer = READ_PORT_UCHAR(pdx->portbase + IMB1);
	++pdx->buffer;
	++pdx->numxfer;
	if (--pdx->nbytes != 0)
		return;

	pdx->busy = FALSE;
	PIRP Irp = GetCurrentIrp(&pdx->dqReadWrite);
	ASSERT(Irp);
	Irp->IoStatus.Status = STATUS_SUCCESS;
	Irp->IoStatus.Information = pdx->numxfer;
	IoRequestDpc(pdx->DeviceObject, NULL, pdx);
	}							// TransferFirst

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
26uuu亚洲| 欧亚一区二区三区| 天堂影院一区二区| 国产精品无遮挡| 666欧美在线视频| 91黄色免费观看| 成人一区二区三区中文字幕| 日韩国产精品大片| 国产精品欧美综合在线| 欧洲一区在线电影| 九一九一国产精品| 亚洲综合色婷婷| 国产日韩欧美精品一区| 制服丝袜亚洲色图| 欧美午夜精品免费| 日本女优在线视频一区二区| 国产精品国产三级国产普通话99| 欧美日韩aaaaaa| 91黄色在线观看| 丁香婷婷综合色啪| 国产一区二区在线看| 天天色综合成人网| 国产精品理伦片| 国产亚洲欧美日韩在线一区| 5月丁香婷婷综合| 欧美日韩成人在线| 91精品福利视频| 99久久亚洲一区二区三区青草 | 在线免费精品视频| 99久久精品免费观看| 国产精品1024| 国产超碰在线一区| 日韩vs国产vs欧美| 秋霞午夜鲁丝一区二区老狼| 毛片av中文字幕一区二区| 亚洲成人动漫精品| 天涯成人国产亚洲精品一区av| 亚洲人成伊人成综合网小说| 国产欧美一区二区精品婷婷| 久久久久久久久久久久久夜| 国产精品网站导航| 亚洲色图20p| 日韩精品一级二级| 裸体歌舞表演一区二区| 国产精品99久久久久久久女警| 国产一二三精品| 99免费精品在线观看| 在线观看视频91| 欧美精品 日韩| 国产亚洲va综合人人澡精品| 亚洲视频网在线直播| 日韩精品欧美精品| 成人精品高清在线| 91精品国产综合久久精品app| 91精品国产乱码久久蜜臀| 国产亚洲美州欧州综合国| 亚洲综合自拍偷拍| 国内成+人亚洲+欧美+综合在线| 成人aaaa免费全部观看| 欧美性大战久久久久久久 | 国产一区二区三区在线观看免费视频| 成人精品一区二区三区中文字幕| 在线观看亚洲a| 国产精品入口麻豆九色| 亚洲成人免费电影| 91丨九色丨蝌蚪丨老版| 在线免费观看成人短视频| 2021中文字幕一区亚洲| 日韩黄色在线观看| 91视频.com| 国产精品日韩成人| 成人av集中营| 日韩午夜av电影| 亚洲欧洲日韩一区二区三区| 五月天视频一区| 欧美日韩中字一区| 亚洲靠逼com| 在线亚洲精品福利网址导航| 亚洲视频在线一区观看| 日韩精品免费专区| 在线免费观看成人短视频| 17c精品麻豆一区二区免费| www.成人在线| 综合激情成人伊人| 日本久久电影网| 丝袜美腿亚洲一区| 91精品国产一区二区| 国模娜娜一区二区三区| 精品国产乱码久久久久久蜜臀| 国产一区二区三区在线观看免费| 日韩精品资源二区在线| 国产在线麻豆精品观看| 久久久久久久电影| av激情成人网| 亚洲成av人片一区二区三区| 欧美一级电影网站| 国产成人aaaa| 亚洲综合免费观看高清完整版| 欧美色视频在线| 三级精品在线观看| 国产精品日日摸夜夜摸av| 成人在线视频一区| 五月天婷婷综合| 国产欧美一区二区精品久导航 | 亚洲一区在线观看免费观看电影高清| 欧美午夜精品久久久久久孕妇 | 亚洲成人在线免费| 欧美成人女星排行榜| 成人高清视频在线观看| 天堂成人国产精品一区| 国产精品国产三级国产有无不卡| 91国产成人在线| 国产一区二区在线视频| 亚洲在线视频一区| 久久人人超碰精品| 欧美另类久久久品| 色视频欧美一区二区三区| 精品在线一区二区| 视频一区二区欧美| 亚洲三级免费电影| 国产成人夜色高潮福利影视| 性做久久久久久久久| 亚洲一卡二卡三卡四卡五卡| 亚洲精品久久久蜜桃| 亚洲欧美国产高清| 一区二区三区四区激情| 亚洲乱码中文字幕| 一区二区国产视频| 亚洲va国产天堂va久久en| 婷婷夜色潮精品综合在线| 婷婷国产在线综合| 日本一区中文字幕| 久久精品99国产精品日本| 精品一区二区三区在线播放| 国产综合色在线| 色综合一个色综合亚洲| 欧美日韩一卡二卡三卡| 欧美成人官网二区| 国产午夜精品福利| 18成人在线观看| 日韩精品国产精品| 国产69精品久久99不卡| 久久久亚洲高清| 中文字幕视频一区二区三区久| 日韩美女视频一区二区 | 91视频精品在这里| 国产99久久久国产精品潘金 | 精品国产一区久久| 中日韩免费视频中文字幕| 日韩一区欧美一区| 免费国产亚洲视频| 91网站黄www| 久久精品男人的天堂| 亚洲国产日韩a在线播放| 国产精品456露脸| 在线不卡中文字幕播放| 国产精品三级在线观看| 五月天激情综合| 免费欧美日韩国产三级电影| 色婷婷亚洲综合| 日韩欧美国产一二三区| 国产精品国产三级国产aⅴ原创| 日韩精品免费专区| 欧美色老头old∨ideo| 中文字幕+乱码+中文字幕一区| 日本伊人色综合网| 日韩限制级电影在线观看| 亚洲视频在线一区观看| 国产成人小视频| 久久亚洲精精品中文字幕早川悠里 | 久久精品亚洲国产奇米99| 奇米色一区二区| 日本丶国产丶欧美色综合| 一区在线中文字幕| 国产成a人无v码亚洲福利| 久久免费国产精品| 久久精品av麻豆的观看方式| 欧美一区午夜精品| 亚洲va欧美va人人爽午夜| 欧美日韩成人高清| 日本欧美一区二区| 日韩欧美第一区| 黄色资源网久久资源365| 精品福利一区二区三区免费视频| 麻豆免费看一区二区三区| 欧美一级片免费看| 极品美女销魂一区二区三区 | 国产日韩高清在线| 成人av在线网| 午夜在线成人av| 精品福利在线导航| 97aⅴ精品视频一二三区| 亚洲国产日日夜夜| 制服丝袜日韩国产| 国产成人激情av| 亚洲狠狠丁香婷婷综合久久久| 欧美四级电影在线观看| 经典三级在线一区| 一二三四区精品视频| 6080亚洲精品一区二区|