• 【旧文章搬运】Windows内核常见数据结构(驱动相关)


    原文发表于百度空间,2008-7-24
    ==========================================================================

    这些是驱动中相关的数据结构.

    驱动对象,由I/O管理器创建,用于管理设备(Device):
    lkd> dt _DRIVER_OBJECT
    ntdll!_DRIVER_OBJECT
       +0x000 Type             : Int2B                                         
       +0x002 Size             : Int2B
       +0x004 DeviceObject     : Ptr32 _DEVICE_OBJECT     //设备对象
       +0x008 Flags            : Uint4B
       +0x00c DriverStart      : Ptr32 Void
       +0x010 DriverSize       : Uint4B
       +0x014 DriverSection    : Ptr32 Void
       +0x018 DriverExtension : Ptr32 _DRIVER_EXTENSION       //指向
       +0x01c DriverName       : _UNICODE_STRING        //驱动名称
       +0x024 HardwareDatabase : Ptr32 _UNICODE_STRING //指向一个存储在注册表中的硬件描述
       +0x028 FastIoDispatch   : Ptr32 _FAST_IO_DISPATCH //快速IO派遣,还不太懂
       +0x02c DriverInit       : Ptr32     long  //初始化例程
       +0x030 DriverStartIo    : Ptr32     void //
       +0x034 DriverUnload     : Ptr32     void //卸载例程
       +0x038 MajorFunction    : [28] Ptr32     long   //各派遣例程指针,即IRP_MJ_XXX等

    关于派遣例程:
    [00] IRP_MJ_CREATE
    [01] IRP_MJ_CREATE_NAMED_PIPE
    [02] IRP_MJ_CLOSE
    [03] IRP_MJ_READ
    [04] IRP_MJ_WRITE
    [05] IRP_MJ_QUERY_INFORMATION
    [06] IRP_MJ_SET_INFORMATION
    [07] IRP_MJ_QUERY_EA
    [08] IRP_MJ_SET_EA
    [09] IRP_MJ_FLUSH_BUFFERS
    [0a] IRP_MJ_QUERY_VOLUME_INFORMATION
    [0b] IRP_MJ_SET_VOLUME_INFORMATION
    [0c] IRP_MJ_DIRECTORY_CONTROL
    [0d] IRP_MJ_FILE_SYSTEM_CONTROL
    [0e] IRP_MJ_DEVICE_CONTROL
    [0f] IRP_MJ_INTERNAL_DEVICE_CONTROL
    [10] IRP_MJ_SHUTDOWN
    [11] IRP_MJ_LOCK_CONTROL
    [12] IRP_MJ_CLEANUP
    [13] IRP_MJ_CREATE_MAILSLOT
    [14] IRP_MJ_QUERY_SECURITY
    [15] IRP_MJ_SET_SECURITY
    [16] IRP_MJ_POWER
    [17] IRP_MJ_SYSTEM_CONTROL
    [18] IRP_MJ_DEVICE_CHANGE
    [19] IRP_MJ_QUERY_QUOTA
    [1a] IRP_MJ_SET_QUOTA
    [1b] IRP_MJ_PNP

    驱动扩展:
    lkd> dt _DRIVER_EXTENSION       
    ntdll!_DRIVER_EXTENSION
       +0x000 DriverObject     : Ptr32 _DRIVER_OBJECT
       +0x004 AddDevice        : Ptr32     long 
       +0x008 Count            : Uint4B
       +0x00c ServiceKeyName   : _UNICODE_STRING
       +0x014 ClientDriverExtension : Ptr32 _IO_CLIENT_EXTENSION
       +0x018 FsFilterCallbacks : Ptr32 _FS_FILTER_CALLBACKS

    设备对象:
    lkd> dt _DEVICE_OBJECT
    ntdll!_DEVICE_OBJECT
       +0x000 Type             : Int2B
       +0x002 Size             : Uint2B
       +0x004 ReferenceCount   : Int4B
       +0x008 DriverObject     : Ptr32 _DRIVER_OBJECT
       +0x00c NextDevice       : Ptr32 _DEVICE_OBJECT   //从这儿看设备对象也是成链
       +0x010 AttachedDevice   : Ptr32 _DEVICE_OBJECT
       +0x014 CurrentIrp       : Ptr32 _IRP
       +0x018 Timer            : Ptr32 _IO_TIMER
       +0x01c Flags            : Uint4B
       +0x020 Characteristics : Uint4B
       +0x024 Vpb              : Ptr32 _VPB
       +0x028 DeviceExtension : Ptr32 Void
       +0x02c DeviceType       : Uint4B
       +0x030 StackSize        : Char
       +0x034 Queue            : __unnamed
       +0x05c AlignmentRequirement : Uint4B
       +0x060 DeviceQueue      : _KDEVICE_QUEUE
       +0x074 Dpc              : _KDPC
       +0x094 ActiveThreadCount : Uint4B
       +0x098 SecurityDescriptor : Ptr32 Void
       +0x09c DeviceLock       : _KEVENT
       +0x0ac SectorSize       : Uint2B
       +0x0ae Spare1           : Uint2B
       +0x0b0 DeviceObjectExtension : Ptr32 _DEVOBJ_EXTENSION
       +0x0b4 Reserved         : Ptr32 Void

    设备对象扩展:
    lkd> dt _DEVOBJ_EXTENSION
    ntdll!_DEVOBJ_EXTENSION
       +0x000 Type             : Int2B
       +0x002 Size             : Uint2B
       +0x004 DeviceObject     : Ptr32 _DEVICE_OBJECT
       +0x008 PowerFlags       : Uint4B
       +0x00c Dope             : Ptr32 _DEVICE_OBJECT_POWER_EXTENSION
       +0x010 ExtensionFlags   : Uint4B
       +0x014 DeviceNode       : Ptr32 Void
       +0x018 AttachedTo       : Ptr32 _DEVICE_OBJECT
       +0x01c StartIoCount     : Int4B
       +0x020 StartIoKey       : Int4B
       +0x024 StartIoFlags     : Uint4B
       +0x028 Vpb              : Ptr32 _VPB

    IRP(相当重要):
    lkd> dt _IRP
    ntdll!_IRP
       +0x000 Type             : Int2B
       +0x002 Size             : Uint2B
       +0x004 MdlAddress       : Ptr32 _MDL
       +0x008 Flags            : Uint4B
       +0x00c AssociatedIrp    : __unnamed
       +0x010 ThreadListEntry : _LIST_ENTRY
       +0x018 IoStatus         : _IO_STATUS_BLOCK
       +0x020 RequestorMode    : Char
       +0x021 PendingReturned : UChar
       +0x022 StackCount       : Char
       +0x023 CurrentLocation : Char
       +0x024 Cancel           : UChar
       +0x025 CancelIrql       : UChar
       +0x026 ApcEnvironment   : Char
       +0x027 AllocationFlags : UChar
       +0x028 UserIosb         : Ptr32 _IO_STATUS_BLOCK
       +0x02c UserEvent        : Ptr32 _KEVENT
       +0x030 Overlay          : __unnamed
       +0x038 CancelRoutine    : Ptr32     void 
       +0x03c UserBuffer       : Ptr32 Void                //用户的输入缓冲区指针
       +0x040 Tail             : __unnamed

    lkd> dt _IO_STATUS_BLOCK
    ntdll!_IO_STATUS_BLOCK
       +0x000 Status           : Int4B
       +0x000 Pointer          : Ptr32 Void
       +0x004 Information      : Uint4B

  • 相关阅读:
    U盘安装CentOS 7系统
    生产库中遇到mysql的子查询
    mysql 储存类型自增主键区别
    MySQL主从数据库同步延迟问题解决
    MySQL 加锁处理分析
    120篇精华文章打包送,干货慎入!
    mysql批量删除相同前缀的表和修改表名
    用pt-online-schema-change给大表在线加字段的时候导致从库数据丢失的问题
    【MySQL】online ddl 工具之pt-online-schema-change
    互联网公司为啥不使用mysql分区表?
  • 原文地址:https://www.cnblogs.com/achillis/p/10178327.html
Copyright © 2020-2023  润新知