zoukankan      html  css  js  c++  java
  • 2、从汇编语言到Windows内核编程笔记(2)

    内核线程

    在驱动中生成的线程一般是系统线程。系统线程所在的进程名为“System”

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

    线程的结束应该在线程中自己调用PsTerminateSystemThread来完成。此外得到的句柄也必须要用ZwClose来关闭。关闭句柄并不结束线程。

    睡眠

    #define DELAY_ONE_MICROSECOND (-10)

    #define DELAY_ONE_MILLISECOND (DELAY_ONE_MICROSECOND*1000)

    VOID MySleep(LONG msec)

    {

    LARGE_INTEGER my_interval;

    my_interval.QuadPart = DELAY_ONE_MILLISECOND;

    my_interval.QuadPart *= msec;

    KeDelayExecutionThread(KernelMode,0,&my_interval);

    }

    内核中的事件是一个数据结构。这个结构的指针可以当作一个参数传入一个等待函数中。如果这个事件不被设置,则这个等待函数不会返回,这个线程被阻塞。如果这个事件被设置,则等待结束,可以继续下去。

    事件不需要销毁。

    可以发现,关于事件的操作这一部分(如事件的重设,同步等),其原理和MFC中是很类似的,只是MFC中封封装了更好处理的API函数而已。

    实际上等待线程结束并不一定要用事件。线程本身也可以当作一个事件来等待。

    驱动与设备和请求处理

    #include <ntddk.h>

    NTSTATUS

    DriverEntry (

    IN PDRIVER_OBJECT DriverObject,

    IN PUNICODE_STRING RegistryPath

    )

    {

    NTSTATUS status = STATUS_UNSUCCESSFUL;

    return status;

    }

    函数DriverEntry是每个驱动程序中必须的。如同Win32应用程序里的WinMainDriverEntry的第一个参数就是一个 DRIVER_OBJECT的指针。这个DRIVER_OBJECT结构就对应当前编写的驱动程序。其内存是Windows系统已经分配的。

    第二个参数RegistryPath是一个字符串。代表一个注册表子键。这个子键是专门分配给这个驱动程序使用的。用于保存驱动配置信息到注册表中。

    DRIVER_OBJECT中含有分发函数指针。这些函数用来处理发到这个驱动的各种请求。Windows总是自己调用DRIVER_OBJECT下的分发函数来处理这些请求。所以编写一个驱动程序,本质就是自己编写这些处理请求的分发函数。

    NTSTATUS

    DriverEntry (

    IN PDRIVER_OBJECT DriverObject,

    IN PUNICODE_STRING RegistryPath

    )

    {

    ULONG i;

    for(i=0;i<IRP_MJ_MAXIMUM_FUNCTION;++i)

    {

    DriverObject->MajorFunctions[i] = MyDispatchFunction;

    }

    }

    NTSTATUS MyDispatchFunction(PDEVICE_OBJECT device,PIRP irp)

    {

    ……

    }

    VOID MyDriverUnload(PDRIVER_OBJECT driver)

    {

    ……

    }

    这个函数的地址设置到DriverObject->DriverUnload即可。

    如果驱动程序要和应用程序之间通信,则应该生成设备。此外还必须为设备生成应用程序可以访问的符号链接。

    “\\.\”意味后面是一个符号链接名。 目前生成设备,请总是生成在\Device\目录下。

    应用程序为了和驱动通信,首先必须打开设备。然后发送或者接收信息。最后关闭它。这至少需要三个IRP:第一个是打开请求。第二个发送或者接收信息。第三个是关闭请求。

    应用层调用的API 驱动层收到的IRP主功能号

    CreateFile IRP_MJ_CREATE

    CloseHandle IRP_MJ_CLOSE

    DeviceIoControl IRP_MJ_DEVICE_CONTROL

    ReadFile IRP_MJ_READ

    WriteFile IRP_MJ_WRITE

    关于上述几项内容的专题论述,请参见相关文档。[5,6]

    参考
    [1] http://www.cnblogs.com/phinecos/archive/2009/02/19/1393803.html
    [2] http://www.cnblogs.com/qsilence/archive/2009/06/11/1501511.html
    [3 http://msdn.microsoft.com/en-us/library/ff557565%28VS.85%29.aspx
    [4] http://www.cnblogs.com/wanghao111/archive/2009/05/25/1489041.html
    [5] Windows驱动编程基础教程.doc
    [6] 天书夜读-从汇编语言到windows内核编程()
    [7] Windows DDK

    [8] 天书夜读——从汇编语言到Windows内核编程
    http://download.csdn.net/source/2754275
    http://msdn.microsoft.com/en-us/library/ff557573%28VS.85%29.aspx

  • 相关阅读:
    程序员修炼之道——从小工到专家 读书笔记
    Spring5 IOC原理
    2021下期末总结
    十年风雨,一个普通程序员的成长之路(五) 成长:得到与教训
    UmbracoXslDevelopmentTemplate CQ
    Asp.net中的数据绑定 CQ
    Building the DotNetNuke Module in Normal Asp.net Application CQ
    UmbracoDataTypeFirstGlance CQ
    Umbraco Home CQ
    UmbracoColor Picker–Demo CQ
  • 原文地址:https://www.cnblogs.com/mydomain/p/1850686.html
Copyright © 2011-2022 走看看