Windows 内核下的多线程开发

来源:互联网 发布:映客刷人气软件 编辑:程序博客网 时间:2024/06/11 15:51

预备知识:

    1.PsCreateSystemThread

    PsCreateSystemThread例程创建一个在内核模式下运行的系统线程,并为线程返回一个句柄。NTSTATUS 
    PsCreateSystemThread(
        OUT PHANDLE  ThreadHandle,
        IN ULONG  DesiredAccess,
        IN POBJECT_ATTRIBUTES  ObjectAttributes  OPTIONAL,
        IN HANDLE  ProcessHandle  OPTIONAL,
        OUT PCLIENT_ID  ClientId  OPTIONAL,
        IN PKSTART_ROUTINE  StartRoutine,
        IN PVOID  StartContext
    );

     ThreadHandle指向接收句柄的变量。一旦该句柄不在使用,驱动必须使用ZwClose关闭该句柄。

     StartRoutine是驱动线程入口点

     StartContext 当线程被创建时,提供传递给线程的唯一参数。

     当驱动初始化或I/O请求进入驱动的分发例程时,驱动调用此例程创建设备独立线程。例如,当驱动接收到一个一部设备控制请求时,驱动可能创建该线程。

    2.内核下事件对象

    KeWaitForSingleObject:

    keWaitForSingleObject例程将当前线程至于等待状态,知道分发器对象被设置为信号状态或等待超时。

    NTSTATUS 
    KeWaitForSingleObject(
        IN PVOID  Object,
        IN KWAIT_REASON  WaitReason,
        IN KPROCESSOR_MODE  WaitMode,
        IN BOOLEAN  Alertable,
        IN PLARGE_INTEGER  Timeout  OPTIONAL
        );

参数:

        Object:指向被初始化的分发器对象(事件,互斥,信号量,线程,定时器),由调用者提供存储。

        WaitReason:指定等待的原因。驱动程序应当将该值设置为Executive。若驱动代表User工作,或工作在用户线程上下文中,这种情况下,应当设置为UserRequest

        WaitMode:指定调用者是否允许在KernelMode或UserMode。

        Alertable:如果等待是alertable,设置布尔型变量为TRUE,否则为FALSE。

        TimeOut:指定超时。

    KeSetEvent:

    KeSetEvent例程,如果时间不处于信号状态,设置事件对象为信号状态,并返回时间对象先前的状态。

    LONG 
    KeSetEvent(
        IN PRKEVENT  Event,
        IN KPRIORITY  Increment,
        IN BOOLEAN  Wait
    );

    调用KeSetEvent使得事件能获取有信号状态。如果事件为通知事件,系统尝试满足尽可能多等待该事件的对象。事件保持为信号状态直到调用KeClearEvent或KeResetEvent清楚它。

  • 通常在Driver初始化例程中,进行内核系统独立线程的初始化,有独立线程的完成函数。
  • 有时需要跳过独立线程;
  • 有时需要重启线程
  • 终止线程   

  

原创粉丝点击