过滤 基础 7.1

生成过滤设备

NTSTATUS
IoCreateDevice(
        INPDRIVER_OBJECT DriverObject,
        IN ULONG DeviceExtensionSize,
        IN PUNICODE_STRING DeviceName OPTIONAL,
        IN DEVICE_TYPE DeviceType,
        IN ULONG DeviceCharacteristics,
        IN BOOLEAN Exclusive,
        OUT PDEVICE_OBJECT *DeviceObject
);

根据名字来绑定功能的内核API

NTSTATUS 
        IoAttachDevice(
            IN PDEVICE_OBJECT      SourceDevice,
            IN PUNICODE_STRING  TargetDevice,  //this string is device's name
            OUT PDEVIE_OBJECT     *AttachDevice
);

绑定串口1

UNICODE_STRING com_name = RTL_CONSTANT_STRING(L"\\Device\\Serial0");
NTSTATUS status = IoAttachDevice(
com_filter_device,
&com_device_name,
&attach_device
);

没有名字(根据指针)来绑定功能的内核API

NTSTATUS 
        IoAttachDeviceToDeviceStackSafe(
            IN PDEVICE_OBJECT      SourceDevice,
            IN PDEVICE_OBJECT  TargetDevice,  //this string is not device's name
            IN OUT PDEVIE_OBJECT     *AttachDeviceToDeviceObject
);

生成一个设备并且绑定到另一设备上

NTSTATUS 
ccpAttachDevice(
PDRIVER_OBJECT driver,
PDRIVER_OBJECT oldobj,
PDRIVER_OBJECT *fltobj,
PDRIVER_OBJECT *next)
{
    NTSTATUS status;
    PDRIVER_OBJECT topdev = NULL;
//生成设备然后绑定
status = IoCreateDevice(driver,0,NULL,oldobj->DeviceType,0,FALSE,fltobj);
if (status != STATUS_SUCCESS)
        return status;

//拷贝重要标志位
if(oldobj->Flags & DO_BUFFERED_IO)
        (*fltobj)->Flag |= DO_BUFFED_IO;
if(oldobj->Flags & DO_RIRECT_IO)
        (*fltobj)->Flag |= DO_DIRECT_IO;
}

if(oldobj->Characteristics & FILE_DEVICE_SUCURE_OPEN)
        (*fltobj)->Characteristics |= FILE_DEVICE_SUCURE_OPEN;
(*fltobj)->Flag |= DO_POWER_PAGABLE;

//将一个设备绑定到另一个设备上
topdev = IoAttachDeviceToDeviceStack(*fltobj,oldobj);
if(topdev == NULL)
{
//如果绑定失败销毁设备返回错误
IoDeleteDevice(*fltobj);
*fltobj = NULL;
status = STATUS_UNSUCESSFUL;
return status;
}
*next = topdev;

//设置这个设备已经启动
(*fltobj)-> = (*fltobj)->Flags & ~DO_DEVICE_INITIALIZING;
return STATUS_SUCCESS;
}

从名字获得设备对象指针

include

define NTSTRSAFE_LIB

include

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值