首页
论坛
课程
招聘
[原创]今天看NT内核源码,有点小小心得,分享一下
2010-6-4 17:52 7639

[原创]今天看NT内核源码,有点小小心得,分享一下

2010-6-4 17:52
7639
今天看NT内核源码,有点小小心得,分享一下

===========================
我们都知道,驱动程序的入口DriverEntry是在SYSTEM进程环境中执行的,不知大家注意过没有:
第一,DriverEntry问什么要在SYSTEM中运行
第二,DriverEntry是如何实现在SYSTEM中运行的呢?

要回答者两个问题,先请大家看NtLoadDriver中的一段代码:
   

    //
    // Because drivers may wish to create a system thread and execute in
    // its context, the remainder of this service must be executed in the
    // context of the primary system process.  This is accomplished by
    // queueing a request to one of the EX worker threads and having it
    // invoke the I/O system routine to complete this work.
    //
    // Fill in a request packet and queue it to the worker thread then, so
    // that it can actually do the load.
    //

    KeInitializeEvent( &loadPacket.Event, NotificationEvent, FALSE );
    loadPacket.DriverObject = (PDRIVER_OBJECT) NULL;
    loadPacket.DriverServiceName = &driverServiceName;

    if (PsGetCurrentProcessByThread(CurrentThread) == PsInitialSystemProcess) {

        //
        // If we are already in the system process, just use this thread.
        //

        IopLoadUnloadDriver(&loadPacket);

    } else {

        ExInitializeWorkItem( &loadPacket.WorkQueueItem,
                              IopLoadUnloadDriver,
                              &loadPacket );

        ExQueueWorkItem( &loadPacket.WorkQueueItem, DelayedWorkQueue );

        KeWaitForSingleObject( &loadPacket.Event,
                               UserRequest,
                               KernelMode,
                               FALSE,
                               (PLARGE_INTEGER) NULL );

    }



对这两个问题,程序解释的很清楚,由于驱动程序在初始化时有可能要创建在SYSTEM进程环境中运行的系统线程,所以DriverEntry必须运行在SYSTEM进程环境中,

由于NtLoadDriver既可能在SYSTEM进程中调用,也可能在其他进程中调用,所以NtLoadDriver会判断当前进程是否是SYSTEM进程,如果不是,就将 IopLoadUnloadDriver例程的调用任务封装成一个任务包,通过ExQueueWorkItem加入了一个队列 ExWorkerQueue[DelayedWorkQueue] 中,SYSTEM进程中有一个工作线程,会周期查看该队列,如果不空,就一个一个任务包取出来处理,每处理完一个任务包会将其中的event对象设置为有效,NtLoadDriver就通过任务包中的event得到IopLoadUnloadDriver处理完的通知。

内核进程通信也太容易了哈,反正大家都是相同地址空间,一个全局变量,一个同步变量搞定哈。

看雪2022 KCTF 秋季赛 防守篇规则,征题截止日期11月12日!(iPhone 14等你拿!)

收藏
点赞0
打赏
分享
最新回复 (3)
雪    币: 23
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
patterns 活跃值 2010-6-4 17:55
2
0
顶一个、、、
雪    币: 83
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
cyberbill 活跃值 2010-6-7 09:36
3
0
问一下楼猪,NT4的代码编译出来的内核能启动到桌面吗?
雪    币: 148
活跃值: 活跃值 (11)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
xxxDebug 活跃值 2010-6-7 14:53
4
0
首先我没有编译过nt4内核

我认为nt4的代码编译出来的内核如果和你的操作系统版本没有冲突,应该是能够启动到桌面的

我一般所说的nt内核是指nt体系结构的内核,如nt4、2k、xp等的内核结构是一样的,实现上基本是大同小异。

水平有限,错误之处请谅解!
游客
登录 | 注册 方可回帖
返回