8.2.3 键盘过滤模块的DriverEntry

NTSTATUS DriverEntry(
                                        IN PDRIVER_OBJECT DriverObject,
                                        IN PUNICODE_STRING RegistryPath
                                        )
{   
        ULONG i;
        NTSTATUS status;
        KdPrint (("c2p.sys:entering DriverEntry\n"));

    //填写所有的分发函数的指针
    for(i=0;i<=IRP_MJ_MAXIMUM_FUNCTION;i++)
    {
        DriverObject->MajorFunction[i] = c2pDispatchGeneral;
    }

    //单独写一个read分发函数,因为过滤重要的是读取按键信息,所以这个函数单独写
    DriverObject->MajorFunction[IRP_MJ_READ] = c2pDispatchRead;

    //单独写一个IRP_MJ_POWER函数.因为这类请求中间要调用一个PoCallDriver和一个PoStartNextPOwerIrp
    DriverObject->MajorFunction[IRP_MJ_POWER] = c2pPower;

    //我们想知道什么时候绑定过的一个设备被卸载(比如从机器上拔掉了)所以专门写一个PNP(即插即用)分发函数
    DriverObject->MajorFunction[IRP_MJ_PNP] = c2pPnP;

    //卸载函数
    DriverObject->DriverUnload = c2pUnload;
    gDriverObject = DriverObject;

    //绑定所有的键盘设备
    status = c2pAttachDevices(DriverObject,RegisteryPath);
    return status;
    }       

实际中动态卸载的处理

VOID
c2pUnlaod(IN PDRIVER OBJECT DriverObject)
{
        PDEVICE_OBJECT DeviceObject;
        PDEVICE_OBJECT OldDeviceObject;
        PC2P_DEV_EXT devExt;

    LARGE_INTEGER lDelay;
    PRKTHREAD CurrentThread;
    //delay some time
    lDelay =     RtlConvertLongToLargeInteger(100*DELAY_ONE_MILLISECOND);
    CurrentThread = KeGetCurrentThread();
    //把当前的线程设置为低实时模式,以便让它的运行尽量少影响其他程序
    KeSetPriorittyThread(CurrentThread,LOW_REALTIME_PRIORITY);
    UNREFERENCED_PARAMETER(DriverObject);
    KdPrint(("DriverEntry unLoading...\n"));

    //遍历所有设备并一律解除绑定
    DeviceObject = DriverObject->DeviceObject;
    while(DeviceObject)
    {
        //解除绑定并且删除所有的设备
        c2pDetach(DeviceObject);
        DeviceObject = DeviceObject->NextDevice;
    }
    ASSERT(NULL == DriverObject);
//防止未决请求,gC2pKeyCount是个全局变量,每次来个请求就被加1,完成后减1,所有请求都完成才结束等待
    while(gC2pKeyCount)
    {
      KeDelayExecutionThread(KernelMode,FALSE,&lDelay);
    }
    KdPrint(("DriverEntry unLoad OK!\n"));
    return;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值