dpc.cpp
来自「武安河书第一版(vxd)Windows 驱动例子」· C++ 代码 · 共 68 行
CPP
68 行
#include "co_proc.h"
#include "Ioctl.h"
NTSTATUS Co_procCreate(IN PDEVICE_OBJECT fdo,IN PIRP Irp){
PCO_PROC_DEVICE_EXTENSION dx=(PCO_PROC_DEVICE_EXTENSION)fdo->DeviceExtension;
PIO_STACK_LOCATION IrpStack=IoGetCurrentIrpStackLocation(Irp);
if(dx->PnpState<Stopped) return CompleteIrp(Irp,STATUS_DEVICE_NOT_CONNECTED,0);
InterlockedIncrement(&dx->OpenHandle);
return CompleteIrp(Irp,STATUS_SUCCESS,0);
}
NTSTATUS Co_procClose(IN PDEVICE_OBJECT fdo,IN PIRP Irp){
PCO_PROC_DEVICE_EXTENSION dx=(PCO_PROC_DEVICE_EXTENSION)fdo->DeviceExtension;
InterlockedDecrement(&dx->OpenHandle);
return CompleteIrp(Irp,STATUS_SUCCESS,0);
}
NTSTATUS Co_procRead(IN PDEVICE_OBJECT fdo,IN PIRP Irp){
PCO_PROC_DEVICE_EXTENSION dx=(PCO_PROC_DEVICE_EXTENSION)fdo->DeviceExtension;
if(dx->PnpState<Started) return CompleteIrp(Irp,STATUS_DEVICE_NOT_CONNECTED,0);
NTSTATUS status=IoAcquireRemoveLock(&dx->CountOfUse,Irp);
if(!NT_SUCCESS(status)) return CompleteIrp(Irp,STATUS_DELETE_PENDING,0);
IoSkipCurrentIrpStackLocation(Irp);
status=IoCallDriver(dx->NextStackDevice,Irp);
IoReleaseRemoveLock(&dx->CountOfUse,Irp);
return status;
}
NTSTATUS Co_procWrite(IN PDEVICE_OBJECT fdo,IN PIRP Irp){
PCO_PROC_DEVICE_EXTENSION dx=(PCO_PROC_DEVICE_EXTENSION)fdo->DeviceExtension;
if(dx->PnpState<Started) return CompleteIrp(Irp,STATUS_DEVICE_NOT_CONNECTED,0);
NTSTATUS status=IoAcquireRemoveLock(&dx->CountOfUse,Irp);
if(!NT_SUCCESS(status)) return CompleteIrp(Irp,STATUS_DELETE_PENDING,0);
IoSkipCurrentIrpStackLocation(Irp);
status=IoCallDriver(dx->NextStackDevice,Irp);
IoReleaseRemoveLock(&dx->CountOfUse,Irp);
return status;
}
NTSTATUS Co_procDeviceControl(IN PDEVICE_OBJECT fdo,IN PIRP Irp){
PCO_PROC_DEVICE_EXTENSION dx=(PCO_PROC_DEVICE_EXTENSION)fdo->DeviceExtension;
if(dx->PnpState<Started) return CompleteIrp(Irp,STATUS_DEVICE_NOT_CONNECTED,0);
NTSTATUS status=IoAcquireRemoveLock(&dx->CountOfUse,Irp);
if(!NT_SUCCESS(status)) return CompleteIrp(Irp,STATUS_DELETE_PENDING,0);
IoMarkIrpPending(Irp);
IoStartPacket(fdo,Irp,0,Co_procCancelIrp);
return STATUS_PENDING;
}
NTSTATUS Co_procSystemControl(IN PDEVICE_OBJECT fdo,IN PIRP Irp){
PCO_PROC_DEVICE_EXTENSION dx=(PCO_PROC_DEVICE_EXTENSION)fdo->DeviceExtension;
if(dx->PnpState<Stopped) return CompleteIrp(Irp,STATUS_DEVICE_NOT_CONNECTED,0);
NTSTATUS status=IoAcquireRemoveLock(&dx->CountOfUse,Irp);
if(!NT_SUCCESS(status)) return CompleteIrp(Irp,STATUS_DELETE_PENDING,0);
IoSkipCurrentIrpStackLocation(Irp);
status=IoCallDriver(dx->NextStackDevice,Irp);
IoReleaseRemoveLock(&dx->CountOfUse,Irp);
return status;
}
NTSTATUS CompleteIrp(IN PIRP Irp,IN NTSTATUS status,IN ULONG info){
Irp->IoStatus.Status=status;
Irp->IoStatus.Information=info;
IoCompleteRequest(Irp,IO_NO_INCREMENT);
return status;
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?