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

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

?? dispatch.cpp

?? 這個是PCI9052芯片的驅(qū)動程序的源代碼 是用DriverStudio編寫的
?? 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.");
	//進(jìn)行處理
	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進(jìn)行串行化,交給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,進(jìn)行選擇
		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一区二区三区免费野_久草精品视频
国产日产欧美一区二区三区| 欧美剧情片在线观看| 久久久久久久综合色一本| 久久精工是国产品牌吗| 日韩欧美国产成人一区二区| 久久99精品久久久| 国产亚洲一区二区三区四区 | 欧美电影免费观看高清完整版在线| 天堂一区二区在线| 欧美精品一区二区三区蜜桃| 国产.欧美.日韩| 一二三区精品福利视频| 91精品在线麻豆| 国产高清在线精品| 一区二区三区欧美日韩| 6080日韩午夜伦伦午夜伦| 国产精品伊人色| 一区二区日韩电影| 久久婷婷国产综合精品青草| 粉嫩aⅴ一区二区三区四区五区 | 亚洲一二三四在线观看| 91精品国产免费久久综合| 国内精品久久久久影院色| 亚洲欧美日韩国产成人精品影院| 欧美三级蜜桃2在线观看| 蜜桃91丨九色丨蝌蚪91桃色| 中文字幕一区三区| 欧美一级xxx| 99v久久综合狠狠综合久久| 亚欧色一区w666天堂| 久久精品亚洲麻豆av一区二区| 欧美最猛黑人xxxxx猛交| 国内精品国产成人| 视频在线在亚洲| 中文字幕一区二区三区av| 91精品国产91久久久久久一区二区| 丰满岳乱妇一区二区三区| 香蕉成人伊视频在线观看| 中文字幕av不卡| 欧美一级片免费看| 色综合婷婷久久| 国内精品免费**视频| 亚洲成人av免费| 亚洲日本一区二区| 精品久久久久久最新网址| 在线这里只有精品| 成人av在线网站| 紧缚捆绑精品一区二区| 亚洲在线中文字幕| 亚洲欧美一区二区三区久本道91| 日韩欧美中文字幕公布| 欧美日本一道本在线视频| 91在线无精精品入口| 国产乱码字幕精品高清av| 蜜桃免费网站一区二区三区| 一区二区三区四区在线免费观看| 中文字幕乱码久久午夜不卡| 久久精品网站免费观看| 精品免费国产一区二区三区四区| 欧美日韩亚洲高清一区二区| 色综合天天综合网国产成人综合天 | 亚洲6080在线| 一区二区三区在线视频免费| 国产精品的网站| 久久精品视频免费| 精品成人一区二区三区| 欧美一卡2卡3卡4卡| 欧美久久婷婷综合色| 欧美中文字幕不卡| 欧美色视频在线观看| 欧美伊人久久久久久久久影院| 91热门视频在线观看| av不卡一区二区三区| 99国产精品久久久久久久久久久| 成人av动漫网站| 波多野结衣一区二区三区 | 一本久道中文字幕精品亚洲嫩 | 久久国产精品免费| 久久99这里只有精品| 久久99精品国产麻豆婷婷| 精品一区二区三区香蕉蜜桃| 狠狠网亚洲精品| 国产激情精品久久久第一区二区 | 日韩电影在线观看网站| 日韩精品一级二级| 美女视频黄 久久| 国产福利精品一区| av网站免费线看精品| 91久久国产最好的精华液| 欧美亚洲丝袜传媒另类| 欧美一区二区在线免费观看| 日韩免费视频一区| 国产欧美一二三区| 亚洲乱码国产乱码精品精98午夜| 亚洲综合免费观看高清完整版在线| 一区二区成人在线观看| 蜜臀精品一区二区三区在线观看| 激情六月婷婷久久| 9i在线看片成人免费| 欧美日韩美少妇| 精品国产精品网麻豆系列| 欧美国产精品久久| 亚洲午夜在线电影| 精品综合免费视频观看| 成人动漫一区二区三区| 在线观看一区二区视频| 欧美va亚洲va香蕉在线| 国产日本欧美一区二区| 亚洲一区二区三区自拍| 国内久久精品视频| 欧美亚洲高清一区| 国产亚洲欧美日韩在线一区| 悠悠色在线精品| 久久99在线观看| 色综合久久中文综合久久97| 欧美高清视频一二三区| 国产欧美视频一区二区| 天天操天天色综合| 高清国产一区二区| 777午夜精品免费视频| 国产精品国产成人国产三级| 秋霞电影网一区二区| 懂色av一区二区夜夜嗨| 欧美一区二区三区啪啪| 综合中文字幕亚洲| 韩国精品一区二区| 欧美猛男男办公室激情| 视频一区在线视频| caoporen国产精品视频| 精品国产乱码久久久久久图片| 亚洲精品乱码久久久久久日本蜜臀| 美日韩黄色大片| 欧美三级资源在线| 国产精品色哟哟| 久久精品72免费观看| 欧美日韩国产另类一区| 亚洲视频精选在线| 国产一区二区三区免费看| 欧美伊人久久久久久久久影院| 国产亚洲女人久久久久毛片| 看电视剧不卡顿的网站| 欧美日韩视频在线一区二区| 国产精品久久久久久久久久久免费看 | 亚洲精品高清视频在线观看| 国产乱码精品一区二区三区av| 欧美精品在线观看一区二区| 伊人色综合久久天天人手人婷| 国产成人精品三级麻豆| 欧美xxxxxxxx| 奇米一区二区三区av| 欧美视频一区在线观看| 国产精品你懂的在线| 国产一区二区三区四| 精品少妇一区二区三区在线播放| 偷拍亚洲欧洲综合| 欧美撒尿777hd撒尿| 亚洲免费观看高清完整版在线观看熊| 国产精品伊人色| 久久久精品蜜桃| 国产精品综合视频| 久久影院视频免费| 狠狠久久亚洲欧美| 久久久久久久久99精品| 国产精品亚洲人在线观看| 久久久噜噜噜久久中文字幕色伊伊 | 亚洲国产成人一区二区三区| 国产精品影视网| 日本一区二区高清| 成人av免费网站| 亚洲免费在线视频| 在线免费不卡视频| 亚洲成av人片在线| 欧美精品高清视频| 美女脱光内衣内裤视频久久影院| 欧美一区二区在线播放| 免费精品99久久国产综合精品| 欧美国产综合色视频| 国产精品一级片| 国产精品丝袜久久久久久app| 成人av网址在线| 一区二区激情视频| 欧美一个色资源| 国产精品一二三区| 日韩理论片网站| 欧美乱妇15p| 黄色精品一二区| 国产精品伦理在线| 欧美色涩在线第一页| 久久国产精品一区二区| 国产午夜一区二区三区| 成人短视频下载| 亚洲成精国产精品女| 日韩网站在线看片你懂的| 国产精品一品二品| 亚洲三级视频在线观看| 欧美久久久久久久久中文字幕| 久久精品av麻豆的观看方式| 国产精品久久久久影院| 欧美色视频在线观看| 国产精品一区一区|