过滤串口

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);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值