📄 dpc.cpp
字号:
#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 + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -