extern "C"{
#include <ntddk.h>
}
PDEVICE_OBJECT g_nextdev;
PDEVICE_OBJECT g_fltdev;
NTSTATUS ccpAttachDevice(
PDRIVER_OBJECT pdri,
PDEVICE_OBJECT polddev,
PDEVICE_OBJECT *pfltdev,
PDEVICE_OBJECT *pnext);
NTSTATUS ccpDispatch(PDEVICE_OBJECT pdev, PIRP pirp);
VOID DriverUnload(IN PDRIVER_OBJECT pdri)
{
KdPrint(("Enter DriverUnload"));
IoDetachDevice(g_nextdev);
LARGE_INTEGER interval;
interval.QuadPart = -10*1000*500;
KeDelayExecutionThread(KernelMode, FALSE, &interval);
IoDeleteDevice(g_fltdev);
KdPrint(("Exit DriverUnload"));
}
extern "C" NTSTATUS DriverEntry(IN PDRIVER_OBJECT pdri,
IN PUNICODE_STRING pRegPath)
{
KdPrint(("Enter DriverEntry\n"));
pdri->DriverUnload = DriverUnload;
UNICODE_STRING comname = RTL_CONSTANT_STRING(L"\\Device\\Serial0");
NTSTATUS status;
PFILE_OBJECT pfile;
PDEVICE_OBJECT pdevcom, pfltdev;
status = IoGetDeviceObjectPointer(
&comname,
FILE_ALL_ACCESS,
&pfile,
&pdevcom);
if(!NT_SUCCESS(status))
return STATUS_UNSUCCESSFUL;
ObDereferenceObject(pfile);
status = ccpAttachDevice(
pdri,
pdevcom,
&g_fltdev,
&g_nextdev);
for(int i = 0; i < IRP_MJ_MAXIMUM_FUNCTION; i++)
pdri->MajorFunction[i] = ccpDispatch;
if(!NT_SUCCESS(status))
return STATUS_UNSUCCESSFUL;
KdPrint(("Exit DriverEntry\n"));
return STATUS_SUCCESS;
}
NTSTATUS ccpAttachDevice(
PDRIVER_OBJECT pdri,
PDEVICE_OBJECT polddev,
PDEVICE_OBJECT *pfltdev,
PDEVICE_OBJECT *pnext)
{
NTSTATUS status;
PDEVICE_OBJECT ptopdev = NULL;
status = IoCreateDevice(
pdri,
0, NULL,
polddev->DeviceType,
0, FALSE, pfltdev);
if(!NT_SUCCESS(status))
return status;
if(polddev->Flags & DO_BUFFERED_IO)
(*pfltdev)->Flags |= DO_BUFFERED_IO;
if(polddev->Flags & DO_DIRECT_IO)
(*pfltdev)->Flags |= DO_DIRECT_IO;
(*pfltdev)->Flags |= DO_POWER_PAGABLE;
if(polddev->Characteristics & FILE_DEVICE_SECURE_OPEN)
(*pfltdev)->Characteristics |= FILE_DEVICE_SECURE_OPEN;
ptopdev = IoAttachDeviceToDeviceStack(
*pfltdev, polddev);
if(ptopdev == NULL){
IoDeleteDevice(*pfltdev);
*pfltdev = NULL;
return STATUS_UNSUCCESSFUL;
}
*pnext = ptopdev;
(*pfltdev)->Flags &= ~DO_DEVICE_INITIALIZING;
return STATUS_SUCCESS;
}
NTSTATUS ccpDispatch(PDEVICE_OBJECT pdev, PIRP pirp)
{
KdPrint(("Enter ccpDispatch\n"));
PIO_STACK_LOCATION pstk = IoGetCurrentIrpStackLocation(pirp);
NTSTATUS status;
KdPrint(("%x, %x\n", pdev, g_fltdev));
if(pstk->MajorFunction == IRP_MJ_WRITE){
ULONG len = pstk->Parameters.Write.Length;
PUCHAR buf = NULL;
buf = (PUCHAR)pirp->AssociatedIrp.SystemBuffer;
for(ULONG i = 0; i < len; i++)
KdPrint(("%c", buf[i]));
KdPrint(("\n"));
}else if(pstk->MajorFunction == IRP_MJ_POWER){
//电源部分分开处理,这点很重要,
//如果不分开,将会出现POWER FAILURE蓝屏
PoStartNextPowerIrp(pirp);
IoSkipCurrentIrpStackLocation(pirp);
return PoCallDriver(g_nextdev, pirp);
}
IoSkipCurrentIrpStackLocation(pirp);
return IoCallDriver(g_nextdev, pirp);
}
过滤串口
最新推荐文章于 2021-10-27 23:20:50 发布