📄 pnp.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 + -