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

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? dispatch.cpp

?? PCI開發(fā)寶典隨書配套光盤
?? CPP
字號:
/******************************************************************************
 * * File Name:
 * *      Dispatch.cpp
 * * Description:
 * *      This file routes incoming I/O Request packets.
 * *		該文件是處理IRP的。
 * * Revision History:
 * *      03-3-02 : PCI9052Demo v1.00
 *******************************************************************************/

#include "PCI9052Demo.h"
#include "Ioctl.h"

/******************************************************************************
 *
 * Function   :  DispatchCreate
 *
 * Description:  Handle IRP_MJ_CREATE, which allows applications to open handles
 *               to our device, 相應(yīng)的是函數(shù)CreateFile().
 *
 ******************************************************************************/
NTSTATUS DispatchCreate(IN PDEVICE_OBJECT fdo,
						IN PIRP pIrp)
{											//DispatchCreate
    DebugPrint("PCI9052Demo: CreateFile.");
	//可以在此,做一些初始化工作
    return CompleteRequestInfo(pIrp, STATUS_SUCCESS,0);
}											//DispatchCreate
/******************************************************************************
 *
 * Function   :  DispatchCleanup
 *
 * Description:  Handle the IRP_MJ_CLEANUP IRP.
 *				 在驅(qū)動程序被暫停或卸載的時候,需要將IRP棧內(nèi)所有的IRP清除掉。
 ******************************************************************************/
NTSTATUS DispatchCleanup(IN PDEVICE_OBJECT fdo,
						 IN PIRP  pIrp)
{											//DispatchCleanup
	PDEVICE_EXTENSION pdx = (PDEVICE_EXTENSION)fdo->DeviceExtension;
	KIRQL OldIrql;

	DebugPrintMsg("DispatchCleanup Start.");

	IoAcquireCancelSpinLock(&OldIrql);

	// Cancel all IRPs in the I/O Manager maintained queue in device object
	PKDEVICE_QUEUE_ENTRY QueueEntry;
	//清除所有的IRP
	while( (QueueEntry=KeRemoveDeviceQueue(&fdo->DeviceQueue)) != NULL)
	{
		PIRP CancelIrp = CONTAINING_RECORD( QueueEntry, IRP, Tail.Overlay.DeviceQueueEntry);
		CancelIrp->Cancel = TRUE;
		CancelIrp->CancelIrql = OldIrql;
		CancelIrp->CancelRoutine = NULL;

		IoReleaseCancelSpinLock(OldIrql);
		DebugPrint("WdmIoDispatchCleanup: Cancelling %x %I",CancelIrp,CancelIrp);
		UnlockDevice(pdx);

		CancelIrp->IoStatus.Status = STATUS_CANCELLED;
		CancelIrp->IoStatus.Information = 0;
		IoCompleteRequest(CancelIrp,IO_NO_INCREMENT);

		IoAcquireCancelSpinLock(&OldIrql);
	}
	IoReleaseCancelSpinLock(OldIrql);

    return CompleteRequestInfo(pIrp,STATUS_SUCCESS,0);
}											//DispatchCleanup

/************************************************************************
 *
 * Function   :  DispatchClose
 *
 * Description:  Handle IRP_MJ_CLOSE, which allows applications to close handles
 *               to our device,相應(yīng)的是函數(shù)CloseHandle().
 *
 ******************************************************************************/
NTSTATUS DispatchClose(IN PDEVICE_OBJECT fdo,
					   IN PIRP  pIrp)
{												//DispatchClose
	DebugPrint("PCI9052Demo: CloseFile.");
	//進行處理
	PDEVICE_EXTENSION pdx = (PDEVICE_EXTENSION)fdo->DeviceExtension;
	pdx->pWaitEvent = NULL;
	pdx->bSetWaitEvent = NULL;

    return CompleteRequestInfo(pIrp,STATUS_SUCCESS,0);
}												//DispatchClose

/******************************************************************************
 *
 * Function   :  DispatchRead
 *
 * Description:  Handle IRP_MJ_READ, which is not implemented by this driver
 *					ReadFile
 ******************************************************************************/
NTSTATUS DispatchRead(IN PDEVICE_OBJECT fdo,
					  IN PIRP pIrp)
{													//DispatchRead
	DebugPrint("Read Device Start.");
	
	ULONG ReturnedValue;

	NTSTATUS status = STATUS_SUCCESS;

	PDEVICE_EXTENSION pdx = (PDEVICE_EXTENSION) fdo->DeviceExtension;
	
	ReturnedValue = 0;	//sizeof(CAN_DATA_PACKET);
	
	//將從硬件采集到的數(shù)據(jù)送給應(yīng)用程序
	
	//如果不能很快處理,將IRP進行串行化,交給StartIo處理。

	DebugPrint("Read Device End.");
    
	// Just complete the request
    return CompleteRequestInfo(pIrp,status,ReturnedValue);
}													//DispatchRead

/******************************************************************************
 *
 * Function   :  DispatchWrite
 *
 * Description:  Handle the IRP_MJ_WRITE, which is not implemented by this driver
 *					WriteFile
 ******************************************************************************/
NTSTATUS DispatchWrite(IN PDEVICE_OBJECT fdo,
					   IN PIRP pIrp)
{												//DispatchWrite
	DebugPrint("Write File Start.");
	
	PDEVICE_EXTENSION pdx = (PDEVICE_EXTENSION) fdo->DeviceExtension;


	//將應(yīng)用程序的數(shù)據(jù)送到硬件

	//如果不能一次完成或者需要中斷協(xié)助,將IRP串行化,交給StartIo處理
//	IoMarkIrpPending(pIrp);
//	IoStartPacket(fdo, pIrp, NULL, CancelIrp);
	
	DebugPrint("Write File End.");
	return STATUS_PENDING;
}												//DispatchWrite
 
/******************************************************************************
 *
 * Function   :  DispatchSystemControl
 *
 * Description:  The dispatch routine for WMI IRPs.  It does nothing except
 *               forward the IRP to the next device in the stack.
 *
 ******************************************************************************/
NTSTATUS DispatchSystemControl(IN PDEVICE_OBJECT fdo,
							   IN PIRP pIrp)
{												//DispatchSystemControl
	DebugPrint("PCI9052Demo: SystemControl.");

    IoSkipCurrentIrpStackLocation(pIrp);

    return IoCallDriver(((DEVICE_EXTENSION *)fdo->DeviceExtension)->pLowerDeviceObject,
						pIrp);
}												//DispatchSystemControl

/******************************************************************************
 *
 * Function   :  DispatchIoControl
 *
 * Description:  Processes the IOCTL IRPs sent to this device.
 *
 * Note       :  The Fast Mutex used in this routine is left here because
 *               some multi-CPU systems hang if it is removed.  As of this time
 *               the cause for this is unknown.  Once the cause is determined,
 *               the Fast Mutex will most likely be removed in a future release.
 *               Performance may improve slightly once it is removed since the
 *               DPC_LEVEL won't continuously need to go between PASSIVE and APC.
 *
 ******************************************************************************/
NTSTATUS DispatchIoControl(IN PDEVICE_OBJECT fdo,
						   IN PIRP pIrp)
{										//DispatchIoControl
    ULONG				i;
    NTSTATUS            status;
    PDEVICE_EXTENSION	pdx;
    PIO_STACK_LOCATION  pIrpStack;
	ULONG				ReturnedValue;
	ULONG				PdcAddress;		//The base address of PCI9052Demo

    pdx = (PDEVICE_EXTENSION) fdo->DeviceExtension;

    pIrpStack = IoGetCurrentIrpStackLocation(pIrp);


    // Assume a successful return status
    status = STATUS_SUCCESS;

    // Lock device to record usage
	LockDevice(pdx);

	DebugPrint("DeviceIoControl Start.");

    // Handle the PCI9052Demo specific message
	//處理DeviceIoControl。
    switch (pIrpStack->Parameters.DeviceIoControl.IoControlCode)
    {		//PCI9052Demo 
	case IOCTL_PCI9052Demo_REGISTER_EVENT:		//注冊Event變量
		status = ObReferenceObjectByHandle(*(PHANDLE)pIrp->AssociatedIrp.SystemBuffer, 
					EVENT_MODIFY_STATE, *ExEventObjectType,
					pIrp->RequestorMode, (PVOID*)&pdx->pWaitEvent, NULL);
		if (!NT_SUCCESS(status))
		{
			pdx->bSetWaitEvent = FALSE;
			DebugPrint("WARNNING - ObReferenceObjectByHandle failed");
		}
		else 
		{
			pdx->bSetWaitEvent = TRUE;
			DebugPrint("OK - ObReferenceObjectByHandle succeed");
		}
		ReturnedValue = 0;
		break;
	case IOCTL_PCI9052Demo_UNREGISTER_EVENT:	//反注冊Event變量
		pdx->pWaitEvent = NULL;
		pdx->bSetWaitEvent = FALSE;
		ReturnedValue = 0;
		break;
	case IOCTL_PCI9052Demo_READ_DATA:	
		unsigned char Num,Buffer;
		
		PdcAddress = (ULONG)pdx->PdcMemBase;

		RtlCopyMemory(&Num, pIrp->AssociatedIrp.SystemBuffer, 1);
		DebugPrint("Input Value is %x.",Num);
		Buffer = READ_REGISTER_UCHAR((unsigned char *)(PdcAddress + Num));
		DebugPrint("Read Data Value is %x.",Buffer);
		RtlCopyMemory( pIrp->AssociatedIrp.SystemBuffer,&Buffer,1);
		ReturnedValue = 1;
		break;
	case IOCTL_PCI9052Demo_WRITE_DATA:
		unsigned char WriteBuffer[2];
		
		PdcAddress = (ULONG)pdx->PdcMemBase;

		RtlCopyMemory(WriteBuffer, pIrp->AssociatedIrp.SystemBuffer, 2);

		WRITE_REGISTER_UCHAR((unsigned char *)(PdcAddress + WriteBuffer[0]), WriteBuffer[1]);
		DebugPrint("Write Data Value is %x.", WriteBuffer[1]);

		ReturnedValue = 0;
		break;
	case IOCTL_PCI9052Demo_SELECT_8155MIO:	
		//通過PCI9052的User0,進行選擇
		unsigned char Selected;
		ULONG Address;
		ULONG TempData;
		Address = (ULONG)((PDEVICE_EXTENSION)pdx)->MemBase;
		RtlCopyMemory(&Selected, pIrp->AssociatedIrp.SystemBuffer, 1);

		TempData = READ_REGISTER_ULONG((ULONG *)(Address + 0x50));
		if (Selected == 0x00)
		{
			TempData &= 0xfffffffa;
		}
		else if(Selected == 0x01)
		{
			TempData |= 0x00000006;
		}

		WRITE_REGISTER_ULONG((ULONG *)(Address + 0x50), TempData);

		ReturnedValue = 0;
		break;
	default:
        break;
    }

    UnlockDevice(pdx);

	DebugPrint("DeviceIoControl End.");

    if (status == STATUS_PENDING)
        return STATUS_PENDING;

    return CompleteRequestInfo(pIrp,status,ReturnedValue);
}												//DispatchIoControl
/******************************************************************************
 *
 * Function   :  StartIo
 *
 * Description:  The StartIo Service Routine for PCI9052Demo.
 *
 ******************************************************************************/
VOID StartIo(IN PDEVICE_OBJECT fdo,
			 IN PIRP pIrp)
{												//StartIo
	PDEVICE_EXTENSION pdx			= (PDEVICE_EXTENSION)fdo->DeviceExtension;
	PIO_STACK_LOCATION pIrpStack	= IoGetCurrentIrpStackLocation(pIrp);

	DebugPrint("StartIo Start.");

	NTSTATUS status = STATUS_SUCCESS;

	if (!LockDevice(pdx))
	{
		CompleteRequest(pIrp, STATUS_DELETE_PENDING);
	}

	// Switch on the IRP major function code
	switch(pIrpStack->MajorFunction)
	{
	case IRP_MJ_WRITE:
		
		pdx->TransmitIrpStatus = STATUS_SUCCESS;

		break;
	default:
		status = STATUS_NOT_SUPPORTED;
		break;
	}

	// Complete this IRP
	if(pIrp->Cancel) 
		status = STATUS_CANCELLED;

	// Remove cancel routine
	KIRQL OldIrql;
	IoAcquireCancelSpinLock( &OldIrql);
	IoSetCancelRoutine(pIrp, NULL);
	IoReleaseCancelSpinLock(OldIrql);

	// Unlock device, complete IRP and start next
	UnlockDevice(pdx);

	DebugPrint("StartIo End.");

	CompleteRequestInfo(pIrp, status, 10);
	IoStartNextPacket(fdo, TRUE);

}												//StartIo
/******************************************************************************
 *
 * Function   :  CancelIrp
 *
 * Description:  The CancelIrp Service Routine for PCI9052Demo.
 *
 ******************************************************************************/
VOID CancelIrp(IN PDEVICE_OBJECT fdo,
			   IN PIRP pIrp)
{												//CancelIrp
	PDEVICE_EXTENSION pdx = (PDEVICE_EXTENSION)fdo->DeviceExtension;
	DebugPrint("WdmIoCancelIrp: Cancelling %x %I",pIrp,pIrp);

	if (pIrp == fdo->CurrentIrp)
	{
		DebugPrintMsg("CancelIrp: IRP running in StartIo");
		// IRP is being processed by IoStartIo.
		// Irp->Cancel flag already set.
		// IoStartIo will detect Cancel flag and cancel IRP in due course
		IoReleaseCancelSpinLock(pIrp->CancelIrql);
	}
	else
	{
		DebugPrintMsg("CancelIrp: IRP in StartIo queue");
		// IRP is still in StartIo device queue.
		// Just dequeue and cancel it.  No need to start next IRP.
		BOOLEAN dequeued = KeRemoveEntryDeviceQueue(
								&fdo->DeviceQueue,
								&pIrp->Tail.Overlay.DeviceQueueEntry);

		IoReleaseCancelSpinLock(pIrp->CancelIrql);

		if (dequeued)
		{
			UnlockDevice(pdx);
			CompleteRequest(pIrp, STATUS_CANCELLED);
		}
	}
}												//CancelIrp
 /******************************************************************************
 *
 * Function   :  OnInterrupt
 *
 * Description:  The Interrupt Service Routine for the PLX device.
 *					//中斷處理函數(shù)
 *	注意:中斷處理函數(shù)工作在很高地級別,需要慎重處理
 ******************************************************************************/
BOOLEAN OnInterrupt(IN PKINTERRUPT pInterrupt,
					IN PDEVICE_EXTENSION pdx)//IN PVOID pdx)	
{												//OnInterrupt
    ULONG	RegisterValue;
	ULONG	Address,CanAddress;
	UCHAR	cInterrupt;
	UCHAR	cCommand;

	Address = (ULONG)((PDEVICE_EXTENSION)pdx)->MemBase;

    // Read interrupt status register
	RegisterValue = READ_REGISTER_ULONG((ULONG *)(Address + 0x4c));

    // Check for master PCI interrupt enable
	if ((RegisterValue & 0x40) == 0)
	{
		return FALSE;		//如果不是該設(shè)備的中斷,必須返回FALSE,否則系統(tǒng)會出問題。
	}

    // Check to see if an interrupt is active
	if (RegisterValue & 0x4) //Only LINTi1 is used.
    {		
		if (pdx->pWaitEvent != NULL)
			KeSetEvent(pdx->pWaitEvent, 0, FALSE);	//通知應(yīng)用程序,中斷的到來
		//在此,處理中斷

		//如果不能很快處理,則交給Dpc處理,如下:
	/*	PDEVICE_OBJECT fdo	= ((PDEVICE_EXTENSION)pdx)->pDeviceObject;
		if (fdo != NULL)
		{
			PIRP pIrp			= fdo->CurrentIrp;
			if (pIrp != NULL)
			{
				IoRequestDpc(fdo, pIrp, (PVOID)pdx);
			}
		}
	*/
        return TRUE;	//如果是該設(shè)備的中斷,必須返回TRUE。
    }

    // If we reach here, then the interrupt is not ours
	return FALSE;
}												//OnInterrupt

/******************************************************************************
 *
 * Function   :  DpcForIsr
 *
 * Description:  This routine will be triggered by the ISR to service an interrupt.
 *
 * Note       :  The 9052 supports Edge-triggerable interrupts as well as level
 *               triggered interrupts.  The 9050 only supports level triggered
 *               interrupts.  The interrupt masking code below handles both cases.
 *               If the chip is a 9050, the same code is used but should work
 *               ok since edge triggerable interrupts will always be disabled.
 *
 ******************************************************************************/
VOID DpcForIsr(IN PKDPC pDpc,
			   IN PDEVICE_OBJECT fdo,
			   IN PIRP pIrp, 
			   IN PDEVICE_EXTENSION pdx)
{												//OnInterrupt DpcForIsr
	DebugPrintMsg("DpcForIsr Start.");
	
	if (pIrp->Cancel)
		pdx->TransmitIrpStatus = STATUS_CANCELLED;

	KIRQL OldIrql;

	PIRP Irp = fdo->CurrentIrp;

	//Remove Cancel Routine.
	IoAcquireCancelSpinLock(&OldIrql);
	IoSetCancelRoutine(pIrp,NULL);
	IoReleaseCancelSpinLock(OldIrql);

	UnlockDevice(pdx);

	DebugPrintMsg("DpcForIsr End.");

	IoStartNextPacket(fdo, FALSE);

}												//OnInterrupt DpcForIsr


?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
成人一区二区三区中文字幕| 91福利在线观看| 国产一区二区三区久久久| 91小视频在线免费看| 欧美专区在线观看一区| 欧美一级在线观看| 亚洲精品国产品国语在线app| 九色|91porny| 欧美视频中文字幕| 中文字幕欧美日韩一区| 久久精品国产一区二区| av电影天堂一区二区在线观看| 717成人午夜免费福利电影| 2020国产精品自拍| 久久国产日韩欧美精品| 在线播放91灌醉迷j高跟美女| 亚洲少妇最新在线视频| 精品一区二区三区在线观看| 欧美日本在线看| 亚洲日本护士毛茸茸| eeuss鲁片一区二区三区| 中文子幕无线码一区tr| 国产一区不卡精品| 亚洲国产高清aⅴ视频| 麻豆精品久久精品色综合| 欧美综合视频在线观看| 亚洲一区二区中文在线| 在线亚洲免费视频| 亚洲一区二区欧美日韩| 一本一道综合狠狠老| 亚洲精品伦理在线| 精品伦理精品一区| 美女视频网站黄色亚洲| 精品国产污网站| 国产成人鲁色资源国产91色综| 久久综合久久99| 国产一区福利在线| 亚洲码国产岛国毛片在线| 欧美午夜精品免费| 日本中文在线一区| 久久久99精品免费观看| 国产精品综合视频| 欧美激情中文不卡| 91在线视频网址| 国产天堂亚洲国产碰碰| 欧美中文字幕一区二区三区| 另类调教123区| 成人免费在线播放视频| 欧美日韩精品一区二区三区四区| 亚洲综合一区二区| 久久视频一区二区| 成人福利在线看| 亚洲国产精品嫩草影院| 国产三级精品三级在线专区| 制服视频三区第一页精品| 国产成人在线电影| 美女视频网站久久| 亚洲女子a中天字幕| 国产午夜精品理论片a级大结局| 色999日韩国产欧美一区二区| 日韩成人午夜电影| 欧美国产欧美综合| 色欧美片视频在线观看在线视频| 日韩av成人高清| 亚洲欧洲日本在线| 色婷婷综合久久久中文字幕| 9l国产精品久久久久麻豆| 蜜臀av一区二区在线免费观看 | hitomi一区二区三区精品| 午夜精品123| 一区二区三区精品久久久| 欧美日韩国产a| 99久久免费国产| 国产一区二区在线观看视频| 一区二区三区在线视频免费观看| 中文字幕一区二区三区av| 国产亚洲精品7777| 中文字幕一区二区三区不卡在线| 26uuu亚洲综合色欧美| 国产精品色一区二区三区| 中文一区二区在线观看| 久久久国产精华| 国产精品久久久久久久久免费樱桃| 久久一留热品黄| 久久久.com| 国产欧美精品一区aⅴ影院| 久久精品一区八戒影视| 国产拍揄自揄精品视频麻豆| 国产欧美日韩综合精品一区二区| 精品久久久久久久人人人人传媒| 91超碰这里只有精品国产| 精品视频123区在线观看| 欧洲一区二区av| 欧美精品欧美精品系列| 欧美不卡一区二区| 久久久精品蜜桃| 中文字幕中文乱码欧美一区二区| 亚洲一区二区高清| 美女脱光内衣内裤视频久久影院| 日本欧美在线看| 色一区在线观看| 久久久久久亚洲综合影院红桃| 国产亚洲欧美一区在线观看| 一区二区三区美女视频| 国产最新精品精品你懂的| 一本大道久久精品懂色aⅴ| 欧美一区二区三区在线观看| 国产婷婷色一区二区三区四区| 亚洲视频香蕉人妖| 午夜a成v人精品| 麻豆精品一区二区| 国产精品综合视频| 91精品国产品国语在线不卡| 中文在线资源观看网站视频免费不卡| 午夜欧美在线一二页| 大桥未久av一区二区三区中文| 欧美视频三区在线播放| 亚洲黄色免费网站| 丁香激情综合国产| 制服.丝袜.亚洲.中文.综合| 欧美精品一区二区三区高清aⅴ| 日韩码欧中文字| 成人avav在线| 欧美一区二区在线免费播放| 欧美日韩一区二区在线观看 | 亚洲一区二区三区小说| 毛片av一区二区三区| 91丨九色porny丨蝌蚪| 欧美一级黄色录像| 亚洲激情自拍偷拍| 国产综合色在线视频区| 91黄色小视频| 中文字幕亚洲一区二区av在线| 青青草91视频| 在线视频综合导航| 精品国产一区二区三区av性色| 一区二区在线观看不卡| 国产91精品露脸国语对白| 国产98色在线|日韩| 日韩片之四级片| 亚洲午夜一区二区| 91网页版在线| 国产精品久久久久天堂| 精品一二线国产| 欧美一级二级在线观看| 最新成人av在线| 精品一区二区三区蜜桃| 在线不卡a资源高清| 亚洲午夜影视影院在线观看| av一区二区三区| 国产精品不卡视频| 91视频国产资源| 亚洲一区二区三区四区在线观看 | 欧美一区日本一区韩国一区| 一区二区三区欧美久久| 北条麻妃一区二区三区| 久久久www免费人成精品| 国产福利91精品一区二区三区| 日本一区二区三区久久久久久久久不| 国产中文字幕精品| 91精品婷婷国产综合久久性色| 一区二区三区在线影院| 在线精品视频免费观看| 亚洲精品免费在线播放| 色噜噜狠狠色综合中国| 亚洲黄色av一区| 91在线观看一区二区| 一区二区三区不卡在线观看| 91免费国产在线| 日韩成人免费电影| 国产精品嫩草99a| 欧美日韩视频在线一区二区| 欧美aaa在线| 一区二区三区国产豹纹内裤在线| thepron国产精品| 日韩精品福利网| 久久美女艺术照精彩视频福利播放| 久久超碰97人人做人人爱| 欧美一区二区不卡视频| 成人高清免费观看| 日韩在线卡一卡二| 日韩午夜激情av| 色噜噜久久综合| 狠狠v欧美v日韩v亚洲ⅴ| 亚洲福利一区二区| 国产欧美一区二区精品秋霞影院 | 日韩免费一区二区三区在线播放| 久久精品国产精品亚洲综合| 精品日韩欧美在线| 一本色道久久加勒比精品| 午夜精品久久久久久久久久| 国产女人18毛片水真多成人如厕| 欧美一区二区三区四区在线观看| 成人动漫视频在线| 亚洲午夜在线观看视频在线| 国产精品乱码人人做人人爱| 国产亚洲一区二区三区| 91啪在线观看| 国产一区二区三区在线观看精品| 综合av第一页|