⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pnp.cpp

📁 这是一个人精简的1394设备驱动程序
💻 CPP
字号:
#define INITGUID

#include "amc2102.h"

//HANDLE hEvent = NULL;
//PKEVENT pEvent = NULL;
//WCHAR NameBuffer[128]=L"\\BaseNamedObjects\\v1394";
//UNICODE_STRING EventName;

#pragma code_seg("PAGE")
NTSTATUS v1394AddDevice(IN PDRIVER_OBJECT DriverObject,
						IN PDEVICE_OBJECT pdo)
{
	DebugPrintMsg("v1394 AddDevice");
	NTSTATUS status=STATUS_SUCCESS;
	PDEVICE_OBJECT fdo;

	//创建设备对象
	status=IoCreateDevice(DriverObject,
		sizeof(V1394_DEVICE_EXTENSION),
		NULL,                  //设备名称
		FILE_DEVICE_UNKNOWN,   //设备类型在NTDDK.H或WDM.H中列出
		0,                     //各种常量组合表示
		FALSE,                 //not exclusive,可以被多个线程访问
		&fdo);                 //设备对象指针
	if(!NT_SUCCESS(status))
		return status;

	PV1394_DEVICE_EXTENSION dx=(PV1394_DEVICE_EXTENSION)fdo->DeviceExtension;
	dx->fdo=fdo;
	
	//用设备名注册设备接口,以便用户应用
	status=IoRegisterDeviceInterface(pdo,&V1394_GUID,NULL,&dx->ifSymLinkName);
	if(!NT_SUCCESS(status))
	{
		IoDeleteDevice(fdo);
		return status;
	}

	//挂设备到设备栈
	dx->NextStackDevice=IoAttachDeviceToDeviceStack(fdo,pdo);
	dx->nProcess=0;
	dx->interrupt=NULL;
	dx->fAlloc=FALSE;
	dx->NodeID=0;
	dx->pEvent=NULL;
	dx->hEvent=NULL;
	dx->WorkItem=NULL;
	(dx->EventName).Buffer=NULL;
	KeInitializeEvent(&(dx->Event),SynchronizationEvent,FALSE);
	fdo->Flags&=~DO_DEVICE_INITIALIZING;
	fdo->Flags|=DO_BUFFERED_IO;

	return status;
}

NTSTATUS v1394Pnp(IN PDEVICE_OBJECT fdo,
				  IN PIRP Irp)
{
	NTSTATUS status=STATUS_SUCCESS;

	PV1394_DEVICE_EXTENSION dx=(PV1394_DEVICE_EXTENSION)fdo->DeviceExtension;

	PIO_STACK_LOCATION IrpStack=IoGetCurrentIrpStackLocation(Irp);
	ULONG MinorFunction=IrpStack->MinorFunction;

	switch(MinorFunction)
	{
	case IRP_MN_START_DEVICE:
		status=ForwardIrpAndWait(fdo,Irp,0);
		DebugPrint("IRP_MN_START_DEVICE:%x",status);

		if(NT_SUCCESS(status))
		{
			IoSetDeviceInterfaceState(&dx->ifSymLinkName,TRUE);
			v1394GetGenCount(fdo,Irp,&(dx->Generation));

		}
	DebugPrint("Generation:%x",dx->Generation);
		
		break;
	case IRP_MN_BUS_RESET:
		status=ForwardIrpAndWait(fdo,Irp,0);
		DebugPrint("IRP_MN_BUS_RESET:%x",status);

		if(NT_SUCCESS(status))
			v1394GetGenCount(fdo,Irp,&(dx->Generation));
		DebugPrint("Generation:%x",dx->Generation);

		break;
	case IRP_MN_SURPRISE_REMOVAL:
	case IRP_MN_REMOVE_DEVICE:
		status=ForwardIrpAndWait(fdo,Irp,0);
		DebugPrint("IRP_MN_REMOVE_DEVICE(SURPRISE_REMOVAL):%x",status);

		if(NT_SUCCESS(status))
		{
			IoSetDeviceInterfaceState(&dx->ifSymLinkName,FALSE);
			RtlFreeUnicodeString(&dx->ifSymLinkName);
			if(dx->NextStackDevice)
				IoDetachDevice(dx->NextStackDevice);
			IoDeleteDevice(fdo);
		}
	break;
	default:
		status=ForwardIrpAndWait(fdo,Irp,0);
		DebugPrint("PNP IRP Default:%x",status);
	}
	
	return CompleteIrp(Irp,status,0);
}

NTSTATUS v1394GetGenCount(IN PDEVICE_OBJECT fdo,
				  IN PIRP Irp,
				  IN OUT PULONG Count)
{
	NTSTATUS status=STATUS_SUCCESS;
	PV1394_DEVICE_EXTENSION dx=(PV1394_DEVICE_EXTENSION)fdo->DeviceExtension;

	PIRB pIrb=(PIRB)ExAllocatePool(NonPagedPool,sizeof(IRB));
	if(pIrb==NULL)
		status=STATUS_INSUFFICIENT_RESOURCES;
	else
	{
		pIrb->FunctionNumber=REQUEST_GET_GENERATION_COUNT;
		pIrb->Flags=0;
	}

	status=ForwardIrpAndWait(fdo,Irp,pIrb);
	if(NT_SUCCESS(status))
		*Count=pIrb->u.GetGenerationCount.GenerationCount;

	ExFreePool(pIrb);
	DebugPrint("v1394GetGenCount:%x",status);
	DebugPrint("Generation Count:%x",*Count);

	return status;
}

NTSTATUS v1394Power(IN PDEVICE_OBJECT fdo,
					IN PIRP Irp)
{
	DebugPrintMsg("v1394 Power");
	NTSTATUS status=STATUS_SUCCESS;

	PV1394_DEVICE_EXTENSION dx=(PV1394_DEVICE_EXTENSION)fdo->DeviceExtension;

	PoStartNextPowerIrp(Irp);
	IoSkipCurrentIrpStackLocation(Irp);

	status=PoCallDriver(dx->NextStackDevice,Irp);

	return status;
}
#pragma code_seg()

/////////////////////////////////////////////////////////////////////////////
//	WdmIoStartIo:	Process an IRP from the head of the device IRP queue.
//				1	Only IOCTL, Read and Write IRPs get here.
//				2	The IRP is either completed here, or completed once the
//					interrupt driven read or writes completes, times out
//					or is cancelled.
//				3	Note that IRP may be cancelled at any time during this
//					processing, so we check IRP's Cancel flag when appropriate.
//				4	The Irp parameter is equal to fdo->CurrentIrp until it
//					is completed and IoStartNextPacket called.

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -