首页
社区
课程
招聘
4
[原创]Windows内核学习笔记之I/O系统
发表于: 2022-1-5 11:33 13416

[原创]Windows内核学习笔记之I/O系统

2022-1-5 11:33
13416

下图显示了Windows操作系统的I/O系统结构。Windows的I/O系统由5个部分组成:

I/O管理器

即插即用管理器

电源管理器

WMI例程

设备驱动程序

其中,I/O管理器是整个I/O系统的核心,它定义了一个非常通用的框架,允许各种功能的设备驱动程序容纳于其中。

avatar

I/O管理器除了支持与设备驱动相关的驱动程序以外,它也允许与设备无关的驱动程序加入到内核中。这一类驱动程序并不操纵任何硬件设备,它们直接进入到内核后,将变成内核的一部分,一旦经过I/O管理器的初始化,便与内核融为一体。因此,设备驱动程序也是内核扩展的一种形式。

在I/O系统中,有三种基本内核对象:

驱动程序对象:一个设备驱动程序被加载到系统中以后的内部表示

设备对象:系统中的一个设备,它即可以是物理设备,也可以是逻辑设备

文件对象:一个设备被打开后的实例

I/O管理器负责管理和协调这三种对象,并建立它们之间的关系。

当I/O管理器加载一个设备驱动程序时,它会创建一个驱动程序对象,该对象在对象管理器目录中的路径为:\Driver\DriverName或\FileSystem\DriverName。如果是文件系统类型的驱动程序,则该对象应该放置在"\FileSystem"目录下,否则放在"Driver"目录下。

驱动对象的定义如下:

其中的扩展部分DriverExtension的定义如下:

创建驱动对象的API是IoCreateDriver,该函数首先会判断传入的参数是否指定了驱动名称

如果传入了驱动名称,将其赋值到局部变量中

调用ObCreateObject创建驱动对象

将保存驱动对象的内存空间清0

为驱动的扩展部分赋值,这里可以看出驱动的扩展部分的内存就紧跟在驱动对象后面

为类型和标记赋值,由于前面执行了push 4,因此此时的eax为4

MajorFunction数组和驱动初始化例程DriverInit赋值为IopInvalidDeviceRequest函数地址

申请一块内存空间,将驱动名复制进去,并为扩展对象赋值

调用ObInsertObject函数将驱动对象插入句柄表

调用ObReferenceObjectByHandle来获取驱动对象并关闭句柄

为驱动对象的DriverName赋值

调用InitializationFunction,此时ebx保存的是创建的驱动对象的地址

与驱动对象相关的另一种对象是设备对象。每个设备对象代表了系统中的一个设备,包括逻辑设备和物理设备。正常情况下,有两种途径可以创建设备对象:

即插即用管理器在检测到设备时,通过调用驱动程序的AddDevice例程来创建设备对象

非即插即用驱动程序在它们的初始化例程中创建设备对象

每个设备对象都必定有一个为它负责的驱动程序。对设备对象的各种操作实际上是由为它负责的驱动程序中的例程来完成的。一个驱动程序可以支持多个设备对象,所以,一个驱动对象中有一个链表记录了它负责的所有设备对象。

设备对象结构如下:

设备扩展的定义如下:

设备对象指向的有两个扩展空间,一个是留给用户定义的空间,称为设备扩展,由成员DeviceExtension指向;另一个是内建的固定空间,称为设备对象扩展空间,由成员DeviceObjectExtension指向。紧跟着设备对象空间的是用户定义设备扩展空间,之后是设备对象扩展空间。用户定义的设备扩展空间可以不存在,但是内建的设备对象扩展空间一定存在。用户定义的设备扩展空间如果存在,是8字节对齐的。

创建设备由函数IoCreateDevice,函数原型如下:

其中第一个参数指定了创建的设备对象要关联的驱动对象,而最后一个参数则作为输出参数获取创建的设备对象。

函数主要的几个功能如下:

首先,函数会创建一个设备对象,大小是设备对象的大小加上设备对象扩展大小以及用户定义设备扩展大小,创建完成后就对创建的设备对象进行赋值

赋值完成后,将创建的设备对象插入到句柄表中

指定创建的设备对象的DriverObject,也就是指定设备对象的相关联的驱动对象

调用IopInsertRemoveDevice来将设备链接到驱动对象中

IoInsertRemoveDevice的代码很简单,就只是通过设备对象的NextDevice加入到驱动对象的DeviceObject链表的第一个驱动对象中

IRP是Windows系统中用于表达一个I/O请求的核心数据结构,当内核模式代码要发起一个I/O请求时,它会构造一个IRP,用于在处理该I/O请求的过程中代表该请求。IRP的结构如下:

IRP对象从一个I/O请求被发起时开始存在,一直到该I/O请求被完成时或者取消为止,在此过程中,会有多方操作此IRP对象,包括I/O管理器,即插即用管理器,电源管理器以及一个或多个驱动程序等。Windows I/O系统本质上支持异步I/O请求,所以,IRP对象必须携带足够多得环境信息,以便能够描述一个I/O请求的所有状态。

IRP对象有如下的设计特点:

所有I/O请求都被抽象成针对文件对象的操作,OriginalFileObject成员记录了该文件对象,代表一个I/O请求的目标

栈单元。由于可能有多个驱动程序依次参与到一个I/O请求的处理过程中,所以,一个IRP对象除了以上列出的IRP数据结构,其后还有一个称为栈单元的数组。每个参与处理的驱动程序都可以有它自己的栈单元

支持取消。这是一个显示的通知,当一个驱动程序的分发例程认为它以及完成了该I/O请求时,它会显式地告诉I/O管理器,此I/O请求已完成。参与处理的驱动程序可以为I/O请求注册一个完成例程,从而当它的下级驱动程序完成了该I/O请求时,此完成例程会被调用

在Windows中,I/O请求的目标是一个目标设备,但IRP并不能直接指向该设备对象。IRP对象记录了I/O请求的目标是一个文件对象,即它的OriginalFileObject域。I/O管理器通过函数IoGetRelatedDeviceObject可以定位到与该文件对象关联的设备对象,而且,如果目标设备对象位于一个设备栈中,那么该函数得到的是栈顶处的设备对象。

一旦定位到设备对象,接下来就可以进一步定位到驱动程序对象,因而,I/O管理器可以将I/O请求传递给驱动程序中的例程,交由驱动程序来处理。然而,从IRP的数据结构定义中,并没有看到I/O请求与驱动程序分发例程之间的关系。换句话说,从IRP的定义,看不出一个I/O请求对应于驱动程序中的哪个分发例程。事实上,IRP结构仅仅是一个I/O请求的固定描述部分,另一部分是一个或者多个栈单元。每个栈单元针对单个驱动程序,I/O管理器在处理一个I/O请求时,在调用驱动程序的分发例程以前,必须准备好一个栈单元空间,IRP结构中的成员CurrentLocation指明了供驱动程序使用的栈单元位置。栈单元数组依附在IRP数据结构的尾部。内核模式代码在发起一个I/O请求时,根据目标设备对象的StackSize域,可以知道最多有多少个驱动程序需要参与到该I/O请求的处理过程中,所以,它在分配IRP对象时,能够清楚地指示应该分配多少个栈单元。设备栈_IO_STACK_LOCATION结构定义如下:

下图显示了IRP与文件对象,设备对象和驱动程序之间的关系。I/O请求的发起者负责创建IRP对象,包括紧跟在后面的栈单元数组,然后初始化第一个栈单元。由于栈单元按照栈的方式来工作,所以,第一个栈单元即数组的最后一个元素。栈单元中的文件对象指向它的目标设备对象,设备对象包含了指向驱动程序对象的指针,而驱动程序对象则包含了一组分发例程,因此,基于这样的数据结构关系,I/O管理器可以将I/O请求转发给相应驱动程序的分发例程。

avatar

不难理解,一个IRP对象的栈单元所指的这些设备对象正是前面讲述的设备栈。I/O请求的发起者在构造IRP对象时,根据OriginalFileObject所指设备对象的栈深度,即DEVICE_OBJECT数据结构的StackSize成员,来决定应该为该IRP对象分配多少个栈单元。值得一提的是,IRP对象总是从非换页内存池中分配的,所以,即使处理I/O请求的驱动程序代码允许在DISPATCH_LEVEL或更高的IRQL上,也可以安全地访问IRP对象中的信息

在Windows中,IRP对象是通过IoAllocateIrp函数来分配的,该函数的代码如下,它仅仅将函数调用转发给pIoAllocateIrp函数指针。pIoAllocateIrp是一个全局变量,在I/O系统初始化过程中被设置为指向IopAllocateIrpPrivate函数,所以IRP对象的分配工作实际上是在函数IopAllocatePrivate中完成的。

I/O管理器维护两个快查表IopLargeIrpLookasideList和IopSmallIrpLookasideList。前者链表中的IRP对象包含IopLargeIrpStackLocations个栈单元,IopLargeIrpStackLocations的默认值是8;后者链表中的IRP对象包含一个栈单元。这两个快查表记录在处理器KPRCB结构体的快查数组成员PPLookasideList中。快查表中的IRP对象是系统资源,而并非属于某个进程。每个处理器KPRCB结构中的LookasideIrpFloat成员记录了当前允许快查表提供给进程的IRP对象的数量,LookasideIrpFloat成员的初始值是在IoInitSystem函数中设置,其大小取决于当前系统内存以及处理器的数量。

在IopAllocateIrpPrivate函数中,首先判断栈大小是否小于IopLargeIrpStackLocations且配额是否为0或LookasideIrpFloat是否大于0

如果满足条件,接下来判断栈大小是否等于1来判断从哪个快表中分配IRP对象

随后调用ExInterlockedPopEntrySList从P备份链表中分配IRP对象

如果从P备份链表中分配失败,则尝试从L备份链表中分配

判断IRP对象是否分配成功,此时edx指向的就是从快表中分配的IRP对象

如果分配不成功,根据配额是否为0,来分配IRP对象。如果配额不为0,则调用函数ExAllocatePoolWithQuotaTag来分配IRP对象

如果配额为0,则调用ExAllocatePoolWithTag来分配IRP对象

成功分配IRP对象以后,接着就对IRP对象进行赋值

IRP的释放通过IoFreeIrp来实现,但是和分配IRP对象类型,该函数只是用来实现函数的转发,真正释放IRP对象是在IopFreeIrp中实现

在IopFreeIrp中会对IRP对象的AllocationFlags进行判断

如果是从池内存中分配的IRP对象,调用ExFreePoolWithTag来释放IRP对象

否则就在释放内存以后,将其归还到备份链表中

IoCallDriver函数可以发送IRP对象到一个指定对象相关的驱动程序。和上面的函数一样,该函数只是实现了函数的转发。真正函数的实现是在IofCallDriver中实现的

IofCallDriver函数则再次转发函数,将函数指向IopfCallDriver

IopfCallDriver首先是获取下一设备栈,从中获取主请求码,也就是要执行的驱动对象例程的函数下标。从设备对象中获取驱动对象,在从驱动对象中获取执行例程,根据获取的下标执行函数

《Windows内核原理与实现》

《Windows内核设计思想》

 
 
 
 
kd> dt _DRIVER_OBJECT
nt!_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
   +0x02c DriverInit       : Ptr32     long
   +0x030 DriverStartIo    : Ptr32     void
   +0x034 DriverUnload     : Ptr32     void
   +0x038 MajorFunction    : [28] Ptr32     long
kd> dt _DRIVER_OBJECT
nt!_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
   +0x02c DriverInit       : Ptr32     long
   +0x030 DriverStartIo    : Ptr32     void
   +0x034 DriverUnload     : Ptr32     void
   +0x038 MajorFunction    : [28] Ptr32     long
名称 作用
Type 对象类型
Size 对象大小
DeviceObject 指向设备对象,所有设备对象构成一个链表
Flags 驱动程序标志
DriverStart 驱动程序映像起始地址
DriverSize 驱动程序映像的的大小
DriverSection 指向驱动程序映像的内存区对象
DriverExtension 指向驱动对象的扩展部分
DriverName 驱动程序名称
HardwareDatabase 指向注册表中包含硬件信息的路径
FastIoDispatch 指向快速I/O的分发结构
DriverInit 驱动程序的初始化例程
DriverStartIo 驱动程序的启动I/O例程
DriverUnLoad 驱动程序的卸载例程
MajorFunction 包含了一组例程,当I/O管理器接收到一个I/O请求时,它会根据I/O请求中的相关信息,找到设备对象的驱动程序对象,并调用驱动程序中相应的例程来处理该I/O请求
 
kd> dt _DRIVER_EXTENSION
nt!_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
kd> dt _DRIVER_EXTENSION
nt!_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
名称 作用
DriverObject 指向驱动程序
AddDevice 函数指针,当即插即用管理器检测到一个新的设备由该驱动程序负责时,调用该函数,以便通知该驱动程序
Count 记录了重新初始化调用的次数
ServiceKeyName 驱动程序的服务名称
ClientDriverExtension 指向驱动程序的客户扩展部分
FsFilterCallbacks 用于文件系统过滤驱动程序
 
PAGE:004DEBD6 ; int __stdcall IoCreateDriver(PUNICODE_STRING DriverName, PDRIVER_INITIALIZE InitializationFunction)
PAGE:004DEBD6                 public _IoCreateDriver@8
PAGE:004DEBD6 _IoCreateDriver@8 proc near             ; CODE XREF: VfDriverAttachFilter(x,x)+28↓p
PAGE:004DEBD6                                         ; WMIInitialize(x,x)+28↓p ...
PAGE:004DEBD6
PAGE:004DEBD6 ObjectAttributes= _OBJECT_ATTRIBUTES ptr -0B0h
PAGE:004DEBD6 var_serviceName = UNICODE_STRING ptr -98h
PAGE:004DEBD6 var_InitializationFunction= dword ptr -90h
PAGE:004DEBD6 Object          = dword ptr -8Ch
PAGE:004DEBD6 Handle          = dword ptr -88h
PAGE:004DEBD6 var_DriverName  = UNICODE_STRING ptr -84h
PAGE:004DEBD6 var_Cookie      = dword ptr -4
PAGE:004DEBD6 DriverName      = dword ptr  8
PAGE:004DEBD6 InitializationFunction= dword ptr  0Ch
PAGE:004DEBD6
PAGE:004DEBD6 ; FUNCTION CHUNK AT PAGE:00517964 SIZE 00000015 BYTES
PAGE:004DEBD6 ; FUNCTION CHUNK AT PAGE:0051797B SIZE 00000017 BYTES
PAGE:004DEBD6
PAGE:004DEBD6                 mov     edi, edi
PAGE:004DEBD8                 push    ebp
PAGE:004DEBD9                 mov     ebp, esp
PAGE:004DEBDB                 sub     esp, 0B0h
PAGE:004DEBE1                 mov     eax, ___security_cookie
PAGE:004DEBE6                 mov     ecx, [ebp+InitializationFunction]
PAGE:004DEBE9                 push    ebx
PAGE:004DEBEA                 mov     [ebp+var_Cookie], eax
PAGE:004DEBED                 mov     eax, [ebp+DriverName] ; 将要创建的设备名赋值给eax
PAGE:004DEBF0                 xor     ebx, ebx
PAGE:004DEBF2                 cmp     eax, ebx        ; 是否传入了驱动名称
PAGE:004DEBF4                 push    esi
PAGE:004DEBF5                 push    edi
PAGE:004DEBF6                 mov     [ebp+var_InitializationFunction], ecx
PAGE:004DEBFC                 jz      sub_517923
PAGE:004DEBD6 ; int __stdcall IoCreateDriver(PUNICODE_STRING DriverName, PDRIVER_INITIALIZE InitializationFunction)
PAGE:004DEBD6                 public _IoCreateDriver@8
PAGE:004DEBD6 _IoCreateDriver@8 proc near             ; CODE XREF: VfDriverAttachFilter(x,x)+28↓p
PAGE:004DEBD6                                         ; WMIInitialize(x,x)+28↓p ...
PAGE:004DEBD6
PAGE:004DEBD6 ObjectAttributes= _OBJECT_ATTRIBUTES ptr -0B0h
PAGE:004DEBD6 var_serviceName = UNICODE_STRING ptr -98h
PAGE:004DEBD6 var_InitializationFunction= dword ptr -90h
PAGE:004DEBD6 Object          = dword ptr -8Ch
PAGE:004DEBD6 Handle          = dword ptr -88h
PAGE:004DEBD6 var_DriverName  = UNICODE_STRING ptr -84h
PAGE:004DEBD6 var_Cookie      = dword ptr -4
PAGE:004DEBD6 DriverName      = dword ptr  8
PAGE:004DEBD6 InitializationFunction= dword ptr  0Ch
PAGE:004DEBD6
PAGE:004DEBD6 ; FUNCTION CHUNK AT PAGE:00517964 SIZE 00000015 BYTES
PAGE:004DEBD6 ; FUNCTION CHUNK AT PAGE:0051797B SIZE 00000017 BYTES
PAGE:004DEBD6
PAGE:004DEBD6                 mov     edi, edi
PAGE:004DEBD8                 push    ebp
PAGE:004DEBD9                 mov     ebp, esp
PAGE:004DEBDB                 sub     esp, 0B0h
PAGE:004DEBE1                 mov     eax, ___security_cookie
PAGE:004DEBE6                 mov     ecx, [ebp+InitializationFunction]
PAGE:004DEBE9                 push    ebx
PAGE:004DEBEA                 mov     [ebp+var_Cookie], eax
PAGE:004DEBED                 mov     eax, [ebp+DriverName] ; 将要创建的设备名赋值给eax
PAGE:004DEBF0                 xor     ebx, ebx
PAGE:004DEBF2                 cmp     eax, ebx        ; 是否传入了驱动名称
PAGE:004DEBF4                 push    esi
PAGE:004DEBF5                 push    edi
PAGE:004DEBF6                 mov     [ebp+var_InitializationFunction], ecx
PAGE:004DEBFC                 jz      sub_517923
PAGE:004DEC02                 mov     ecx, dword ptr [eax+UNICODE_STRING.Length]
PAGE:004DEC04                 mov     eax, [eax+UNICODE_STRING.Buffer]
PAGE:004DEC07                 mov     dword ptr [ebp+var_DriverName.Length], ecx
PAGE:004DEC0D
PAGE:004DEC0D loc_4DEC0D:                             ; CODE XREF: sub_517923+3C↓j
PAGE:004DEC0D                 mov     [ebp+var_DriverName.Buffer], eax
PAGE:004DEC10                 lea     eax, [ebp+var_DriverName]
PAGE:004DEC16                 mov     [ebp+ObjectAttributes.ObjectName], eax
PAGE:004DEC02                 mov     ecx, dword ptr [eax+UNICODE_STRING.Length]
PAGE:004DEC04                 mov     eax, [eax+UNICODE_STRING.Buffer]
PAGE:004DEC07                 mov     dword ptr [ebp+var_DriverName.Length], ecx
PAGE:004DEC0D
PAGE:004DEC0D loc_4DEC0D:                             ; CODE XREF: sub_517923+3C↓j
PAGE:004DEC0D                 mov     [ebp+var_DriverName.Buffer], eax
PAGE:004DEC10                 lea     eax, [ebp+var_DriverName]
PAGE:004DEC16                 mov     [ebp+ObjectAttributes.ObjectName], eax
PAGE:004DEC1C                 lea     eax, [ebp+Object]
PAGE:004DEC22                 push    eax             ; Object
PAGE:004DEC23                 push    ebx             ; NonPagedPoolCharge
PAGE:004DEC24                 push    ebx             ; PagePoolCharge
PAGE:004DEC25                 push    0C4h            ; ObjectBodySize
PAGE:004DEC2A                 push    ebx             ; ParentContext
PAGE:004DEC2B                 push    ebx             ; OwnershipMode
PAGE:004DEC2C                 lea     eax, [ebp+ObjectAttributes]
PAGE:004DEC32                 push    eax             ; ObjectAttributes
PAGE:004DEC33                 push    _IoDriverObjectType ; ObjectType
PAGE:004DEC39                 mov     [ebp+ObjectAttributes.Length], 18h
PAGE:004DEC43                 push    ebx             ; PreviousMode
PAGE:004DEC44                 mov     [ebp+ObjectAttributes.RootDirectory], ebx
PAGE:004DEC4A                 mov     [ebp+ObjectAttributes.Attributes], 50h
PAGE:004DEC54                 mov     [ebp+ObjectAttributes.SecurityDescriptor], ebx
PAGE:004DEC5A                 mov     [ebp+ObjectAttributes.SecurityQualityOfService], ebx
PAGE:004DEC60                 call    _ObCreateObject@36 ; ObCreateObject(x,x,x,x,x,x,x,x,x)
PAGE:004DEC65                 test    eax, eax
PAGE:004DEC67                 mov     ebx, [ebp+Object] ; 将创建的设备对象赋给ebx
PAGE:004DEC6D                 jl      loc_4DEDD8
PAGE:004DEC1C                 lea     eax, [ebp+Object]
PAGE:004DEC22                 push    eax             ; Object
PAGE:004DEC23                 push    ebx             ; NonPagedPoolCharge
PAGE:004DEC24                 push    ebx             ; PagePoolCharge
PAGE:004DEC25                 push    0C4h            ; ObjectBodySize
PAGE:004DEC2A                 push    ebx             ; ParentContext
PAGE:004DEC2B                 push    ebx             ; OwnershipMode
PAGE:004DEC2C                 lea     eax, [ebp+ObjectAttributes]
PAGE:004DEC32                 push    eax             ; ObjectAttributes
PAGE:004DEC33                 push    _IoDriverObjectType ; ObjectType
PAGE:004DEC39                 mov     [ebp+ObjectAttributes.Length], 18h
PAGE:004DEC43                 push    ebx             ; PreviousMode
PAGE:004DEC44                 mov     [ebp+ObjectAttributes.RootDirectory], ebx
PAGE:004DEC4A                 mov     [ebp+ObjectAttributes.Attributes], 50h
PAGE:004DEC54                 mov     [ebp+ObjectAttributes.SecurityDescriptor], ebx
PAGE:004DEC5A                 mov     [ebp+ObjectAttributes.SecurityQualityOfService], ebx
PAGE:004DEC60                 call    _ObCreateObject@36 ; ObCreateObject(x,x,x,x,x,x,x,x,x)
PAGE:004DEC65                 test    eax, eax
PAGE:004DEC67                 mov     ebx, [ebp+Object] ; 将创建的设备对象赋给ebx
PAGE:004DEC6D                 jl      loc_4DEDD8
PAGE:004DEC73                 push    31h
PAGE:004DEC75                 pop     ecx
PAGE:004DEC76                 xor     eax, eax
PAGE:004DEC78                 push    4
PAGE:004DEC7A                 mov     edi, ebx
PAGE:004DEC7C                 rep stosd               ; 创建的驱动对象的内存清0
PAGE:004DEC73                 push    31h
PAGE:004DEC75                 pop     ecx
PAGE:004DEC76                 xor     eax, eax
PAGE:004DEC78                 push    4
PAGE:004DEC7A                 mov     edi, ebx
PAGE:004DEC7C                 rep stosd               ; 创建的驱动对象的内存清0
PAGE:004DEC7E                 lea     eax, [ebx+(size _DRIVER_OBJECT)] ; eax指向驱动的扩展部分(DriverExtension)
PAGE:004DEC84                 mov     [ebx+_DRIVER_OBJECT.DriverExtension], eax
PAGE:004DEC87                 mov     [eax+_DRIVER_EXTENSION.DriverObject], ebx
PAGE:004DEC7E                 lea     eax, [ebx+(size _DRIVER_OBJECT)] ; eax指向驱动的扩展部分(DriverExtension)
PAGE:004DEC84                 mov     [ebx+_DRIVER_OBJECT.DriverExtension], eax
PAGE:004DEC87                 mov     [eax+_DRIVER_EXTENSION.DriverObject], ebx
PAGE:004DEC89                 pop     eax
PAGE:004DEC8A                 mov     [ebx+_DRIVER_OBJECT.Type], ax
PAGE:004DEC8D                 mov     [ebx+_DRIVER_OBJECT.Flags], eax
PAGE:004DEC89                 pop     eax
PAGE:004DEC8A                 mov     [ebx+_DRIVER_OBJECT.Type], ax
PAGE:004DEC8D                 mov     [ebx+_DRIVER_OBJECT.Flags], eax
PAGE:004DEC90                 push    1Ch
PAGE:004DEC92                 pop     ecx
PAGE:004DEC93                 mov     [ebx+_DRIVER_OBJECT.Size], 0A8h
PAGE:004DEC99                 mov     eax, offset _IopInvalidDeviceRequest@8 ; IopInvalidDeviceRequest(x,x)
PAGE:004DEC9E                 lea     edi, [ebx+_DRIVER_OBJECT.MajorFunction]
PAGE:004DECA1                 rep stosd               ; 为MajorFunction数组赋值
PAGE:004DECA3                 mov     eax, [ebp+var_InitializationFunction]
PAGE:004DECA9                 mov     [ebx+_DRIVER_OBJECT.DriverInit], eax
PAGE:004DEC90                 push    1Ch
PAGE:004DEC92                 pop     ecx
PAGE:004DEC93                 mov     [ebx+_DRIVER_OBJECT.Size], 0A8h
PAGE:004DEC99                 mov     eax, offset _IopInvalidDeviceRequest@8 ; IopInvalidDeviceRequest(x,x)
PAGE:004DEC9E                 lea     edi, [ebx+_DRIVER_OBJECT.MajorFunction]
PAGE:004DECA1                 rep stosd               ; 为MajorFunction数组赋值
PAGE:004DECA3                 mov     eax, [ebp+var_InitializationFunction]
PAGE:004DECA9                 mov     [ebx+_DRIVER_OBJECT.DriverInit], eax
PAGE:004DECAC                 movzx   eax, [ebp+var_DriverName.Length]
PAGE:004DECB3                 inc     eax
PAGE:004DECB4                 push    '  oI'          ; Tag
PAGE:004DECB9                 inc     eax
PAGE:004DECBA                 push    eax             ; NumberOfBytes
PAGE:004DECBB                 push    PagedPool       ; PoolType
PAGE:004DECBD                 call    _ExAllocatePoolWithTag@12 ; ExAllocatePoolWithTag(x,x,x)
PAGE:004DECC2                 mov     edi, eax
PAGE:004DECC4                 test    edi, edi
PAGE:004DECC6                 mov     [ebp+var_serviceName.Buffer], edi
PAGE:004DECCC                 jz      loc_51797B
PAGE:004DECD2                 mov     eax, dword ptr [ebp+var_DriverName.Length]
PAGE:004DECD8                 mov     esi, [ebp+var_DriverName.Buffer]
PAGE:004DECDB                 add     eax, 2
PAGE:004DECDE                 mov     [ebp+var_serviceName.MaximumLength], ax
PAGE:004DECE5                 mov     ax, [ebp+var_DriverName.Length]
PAGE:004DECEC                 movzx   edx, ax
PAGE:004DECEF                 mov     [ebp+var_serviceName.Length], ax
PAGE:004DECF6                 mov     ecx, edx
PAGE:004DECF8                 mov     eax, ecx
PAGE:004DECFA                 shr     ecx, 2
PAGE:004DECFD                 rep movsd
PAGE:004DECFF                 mov     ecx, eax
PAGE:004DED01                 mov     eax, [ebp+var_serviceName.Buffer]
PAGE:004DED07                 and     ecx, 3
PAGE:004DED0A                 rep movsb
PAGE:004DED0C                 xor     edi, edi
PAGE:004DED0E                 shr     edx, 1
PAGE:004DED10                 mov     [eax+edx*2], di
PAGE:004DED14                 mov     ecx, [ebx+_DRIVER_OBJECT.DriverExtension]
PAGE:004DED17                 mov     edx, dword ptr [ebp+var_serviceName.Length]
PAGE:004DED1D                 mov     dword ptr [ecx+_DRIVER_EXTENSION.ServiceKeyName.Length], edx
PAGE:004DED20                 mov     [ecx+_DRIVER_EXTENSION.ServiceKeyName.Buffer], eax
PAGE:004DECAC                 movzx   eax, [ebp+var_DriverName.Length]
PAGE:004DECB3                 inc     eax
PAGE:004DECB4                 push    '  oI'          ; Tag
PAGE:004DECB9                 inc     eax
PAGE:004DECBA                 push    eax             ; NumberOfBytes
PAGE:004DECBB                 push    PagedPool       ; PoolType
PAGE:004DECBD                 call    _ExAllocatePoolWithTag@12 ; ExAllocatePoolWithTag(x,x,x)
PAGE:004DECC2                 mov     edi, eax
PAGE:004DECC4                 test    edi, edi
PAGE:004DECC6                 mov     [ebp+var_serviceName.Buffer], edi
PAGE:004DECCC                 jz      loc_51797B
PAGE:004DECD2                 mov     eax, dword ptr [ebp+var_DriverName.Length]
PAGE:004DECD8                 mov     esi, [ebp+var_DriverName.Buffer]
PAGE:004DECDB                 add     eax, 2
PAGE:004DECDE                 mov     [ebp+var_serviceName.MaximumLength], ax
PAGE:004DECE5                 mov     ax, [ebp+var_DriverName.Length]
PAGE:004DECEC                 movzx   edx, ax
PAGE:004DECEF                 mov     [ebp+var_serviceName.Length], ax
PAGE:004DECF6                 mov     ecx, edx
PAGE:004DECF8                 mov     eax, ecx
PAGE:004DECFA                 shr     ecx, 2
PAGE:004DECFD                 rep movsd
PAGE:004DECFF                 mov     ecx, eax
PAGE:004DED01                 mov     eax, [ebp+var_serviceName.Buffer]
PAGE:004DED07                 and     ecx, 3
PAGE:004DED0A                 rep movsb
PAGE:004DED0C                 xor     edi, edi
PAGE:004DED0E                 shr     edx, 1
PAGE:004DED10                 mov     [eax+edx*2], di
PAGE:004DED14                 mov     ecx, [ebx+_DRIVER_OBJECT.DriverExtension]
PAGE:004DED17                 mov     edx, dword ptr [ebp+var_serviceName.Length]
PAGE:004DED1D                 mov     dword ptr [ecx+_DRIVER_EXTENSION.ServiceKeyName.Length], edx
PAGE:004DED20                 mov     [ecx+_DRIVER_EXTENSION.ServiceKeyName.Buffer], eax
PAGE:004DED23                 lea     eax, [ebp+Handle]
PAGE:004DED29                 push    eax             ; Handle
PAGE:004DED2A                 push    edi             ; NewObject
PAGE:004DED2B                 push    edi             ; ObjectPointerBias
PAGE:004DED2C                 push    1               ; DesiredAccess
PAGE:004DED2E                 push    edi             ; PACCESS_STATE
PAGE:004DED2F                 push    ebx             ; Object
PAGE:004DED30                 call    _ObInsertObject@24 ; ObInsertObject(x,x,x,x,x,x)
PAGE:004DED35                 mov     esi, eax
PAGE:004DED37                 cmp     esi, edi
PAGE:004DED39                 jl      loc_4DEDD6
PAGE:004DED23                 lea     eax, [ebp+Handle]
PAGE:004DED29                 push    eax             ; Handle
PAGE:004DED2A                 push    edi             ; NewObject
PAGE:004DED2B                 push    edi             ; ObjectPointerBias
PAGE:004DED2C                 push    1               ; DesiredAccess
PAGE:004DED2E                 push    edi             ; PACCESS_STATE
PAGE:004DED2F                 push    ebx             ; Object
PAGE:004DED30                 call    _ObInsertObject@24 ; ObInsertObject(x,x,x,x,x,x)
PAGE:004DED35                 mov     esi, eax
PAGE:004DED37                 cmp     esi, edi
PAGE:004DED39                 jl      loc_4DEDD6
PAGE:004DED3F                 push    edi             ; HandleInformation
PAGE:004DED40                 lea     eax, [ebp+Object]
PAGE:004DED46                 push    eax             ; Object
PAGE:004DED47                 push    edi             ; AccessMode
PAGE:004DED48                 push    _IoDriverObjectType ; ObjectType
PAGE:004DED4E                 push    edi             ; DesiredAccess
PAGE:004DED4F                 push    [ebp+Handle]    ; Handle
PAGE:004DED55                 call    _ObReferenceObjectByHandle@24 ; ObReferenceObjectByHandle(x,x,x,x,x,x)
PAGE:004DED5A                 cmp     eax, edi
PAGE:004DED5C                 mov     ebx, [ebp+Object]
PAGE:004DED62                 push    [ebp+Handle]    ; Handle
PAGE:004DED68                 mov     esi, eax
PAGE:004DED6A                 jl      loc_517964
PAGE:004DED70                 call    _ZwClose@4
PAGE:004DED3F                 push    edi             ; HandleInformation
PAGE:004DED40                 lea     eax, [ebp+Object]
PAGE:004DED46                 push    eax             ; Object
PAGE:004DED47                 push    edi             ; AccessMode
PAGE:004DED48                 push    _IoDriverObjectType ; ObjectType
PAGE:004DED4E                 push    edi             ; DesiredAccess
PAGE:004DED4F                 push    [ebp+Handle]    ; Handle
PAGE:004DED55                 call    _ObReferenceObjectByHandle@24 ; ObReferenceObjectByHandle(x,x,x,x,x,x)
PAGE:004DED5A                 cmp     eax, edi
PAGE:004DED5C                 mov     ebx, [ebp+Object]
PAGE:004DED62                 push    [ebp+Handle]    ; Handle
PAGE:004DED68                 mov     esi, eax
PAGE:004DED6A                 jl      loc_517964
PAGE:004DED70                 call    _ZwClose@4
PAGE:004DED75                 movzx   eax, [ebp+var_DriverName.MaximumLength]
PAGE:004DED7C                 push    '  oI'          ; Tag
PAGE:004DED81                 push    eax             ; NumberOfBytes
PAGE:004DED82                 push    PagedPool       ; PoolType
PAGE:004DED84                 lea     esi, [ebx+_DRIVER_OBJECT.DriverName.Buffer]
PAGE:004DED87                 call    _ExAllocatePoolWithTag@12 ; ExAllocatePoolWithTag(x,x,x)
PAGE:004DED8C                 cmp     eax, edi
PAGE:004DED8E                 mov     [esi], eax
PAGE:004DED90                 jz      short loc_4DEDC4
PAGE:004DED92                 mov     cx, [ebp+var_DriverName.MaximumLength]
PAGE:004DED99                 mov     [ebx+_DRIVER_OBJECT.DriverName.MaximumLength], cx
PAGE:004DED9D                 mov     cx, [ebp+var_DriverName.Length]
PAGE:004DEDA4                 mov     [ebx+_DRIVER_OBJECT.DriverName.Length], cx
PAGE:004DEDA8                 movzx   ecx, [ebp+var_DriverName.MaximumLength]
PAGE:004DEDAF                 mov     esi, [ebp+var_DriverName.Buffer]
PAGE:004DEDB2                 mov     edi, eax
PAGE:004DEDB4                 mov     eax, ecx
PAGE:004DEDB6                 shr     ecx, 2
PAGE:004DEDB9                 rep movsd
PAGE:004DEDBB                 mov     ecx, eax
PAGE:004DEDBD                 and     ecx, 3
PAGE:004DEDC0                 rep movsb
PAGE:004DED75                 movzx   eax, [ebp+var_DriverName.MaximumLength]
PAGE:004DED7C                 push    '  oI'          ; Tag
PAGE:004DED81                 push    eax             ; NumberOfBytes
PAGE:004DED82                 push    PagedPool       ; PoolType
PAGE:004DED84                 lea     esi, [ebx+_DRIVER_OBJECT.DriverName.Buffer]
PAGE:004DED87                 call    _ExAllocatePoolWithTag@12 ; ExAllocatePoolWithTag(x,x,x)
PAGE:004DED8C                 cmp     eax, edi
PAGE:004DED8E                 mov     [esi], eax
PAGE:004DED90                 jz      short loc_4DEDC4
PAGE:004DED92                 mov     cx, [ebp+var_DriverName.MaximumLength]
PAGE:004DED99                 mov     [ebx+_DRIVER_OBJECT.DriverName.MaximumLength], cx
PAGE:004DED9D                 mov     cx, [ebp+var_DriverName.Length]
PAGE:004DEDA4                 mov     [ebx+_DRIVER_OBJECT.DriverName.Length], cx
PAGE:004DEDA8                 movzx   ecx, [ebp+var_DriverName.MaximumLength]
PAGE:004DEDAF                 mov     esi, [ebp+var_DriverName.Buffer]
PAGE:004DEDB2                 mov     edi, eax
PAGE:004DEDB4                 mov     eax, ecx
PAGE:004DEDB6                 shr     ecx, 2
PAGE:004DEDB9                 rep movsd
PAGE:004DEDBB                 mov     ecx, eax
PAGE:004DEDBD                 and     ecx, 3
PAGE:004DEDC0                 rep movsb
AGE:004DEDC2                 xor     edi, edi
PAGE:004DEDC4
PAGE:004DEDC4 loc_4DEDC4:                             ; CODE XREF: IoCreateDriver(x,x)+1BA↑j
PAGE:004DEDC4                 push    edi
PAGE:004DEDC5                 push    ebx
PAGE:004DEDC6                 call    [ebp+var_InitializationFunction]
PAGE:004DEDCC                 mov     esi, eax
PAGE:004DEDCE                 cmp     esi, edi
PAGE:004DEDD0                 jl      loc_517980
AGE:004DEDC2                 xor     edi, edi
PAGE:004DEDC4
PAGE:004DEDC4 loc_4DEDC4:                             ; CODE XREF: IoCreateDriver(x,x)+1BA↑j
PAGE:004DEDC4                 push    edi
PAGE:004DEDC5                 push    ebx
PAGE:004DEDC6                 call    [ebp+var_InitializationFunction]
PAGE:004DEDCC                 mov     esi, eax
PAGE:004DEDCE                 cmp     esi, edi
PAGE:004DEDD0                 jl      loc_517980
 
kd> dt _DEVICE_OBJECT
nt!_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
kd> dt _DEVICE_OBJECT
nt!_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
名称 作用
Type 对象类型
Size 对象大小
ReferenceCount 引用计数值
DriverObject 指向关联的驱动程序对象
NextDevice 指向关联同一驱动对象的下一个设备对象
AttachDevice 附载的设备,与AttachTo域构成双向链表
CurrentIrp 当前正在处理的I/O请求包
Timer 设备对象定时器
Flags 设备对象标志,以DO_作为前缀的一组常量
Characteristics 设备的特征,以FILE_作为前缀的一组常量
Vpb 指向设备的卷参数块
DeviceExtension 指向设备对象的扩展部分
DeviceType 设备类型
StackSize 设备栈的大小
Queue 用于文件系统的设备对象,形成一个链表
AlignmentRequirement 缓冲区的对齐要求,其值等于对齐边界减一
DeviceQueue 设备队列,存放针对该设备的I/O请求
ActiveThreadCount 用于文件系统:使用此设备对象的线程数
SecurityDescriptor 设备的安全描述符
DeviceLock 设备锁
SectorSize 扇区大小
DeviceOjectExtension 指向设备扩展部分
 
kd> dt _DEVOBJ_EXTENSION
nt!_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
kd> dt _DEVOBJ_EXTENSION
nt!_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
名称 作用
Type 对象类型
Size 对象大小
DeviceObject 指向关联的设备对象
PowerFlags 电源标志
Dope 设备对象的电源扩展部分
ExtensionFlags 设备对象扩展标志
DeviceNode 设备节点域,由即插即用管理器使用
AttachedTo 当前设备对象被附载到此设备对象
StartIoCount 已启动但未完成的I/O数量
StartIoKey 下一个启动的I/O的键
StartIoFlags 启动I/O标志
Vpb 已挂载卷的VPB,用于文件系统的卷设备对象
 
 
NTSTATUS
  IoCreateDevice(
    IN PDRIVER_OBJECT  DriverObject,
    IN ULONG  DeviceExtensionSize,
    IN PUNICODE_STRING  DeviceName  OPTIONAL,
    IN DEVICE_TYPE  DeviceType,
    IN ULONG  DeviceCharacteristics,
    IN BOOLEAN  Exclusive,
    OUT PDEVICE_OBJECT  *DeviceObject
    );
NTSTATUS
  IoCreateDevice(
    IN PDRIVER_OBJECT  DriverObject,
    IN ULONG  DeviceExtensionSize,
    IN PUNICODE_STRING  DeviceName  OPTIONAL,
    IN DEVICE_TYPE  DeviceType,
    IN ULONG  DeviceCharacteristics,
    IN BOOLEAN  Exclusive,
    OUT PDEVICE_OBJECT  *DeviceObject
    );
 
 
PAGE:004CAF25                 lea     eax, [ebp+var_deviceObject]
PAGE:004CAF28                 push    eax             ; Object
PAGE:004CAF29                 push    ebx             ; NonPagedPoolCharge
PAGE:004CAF2A                 push    ebx             ; PagePoolCharge
PAGE:004CAF2B                 lea     eax, [esi+0E4h]
PAGE:004CAF31                 push    eax             ; ObjectBodySize
PAGE:004CAF32                 push    ebx             ; ParentContext
PAGE:004CAF33                 push    ebx             ; OwnershipMode
PAGE:004CAF34                 lea     eax, [ebp+ObjectAttributes]
PAGE:004CAF3A                 push    eax             ; ObjectAttributes
PAGE:004CAF3B                 push    _IoDeviceObjectType ; ObjectType
PAGE:004CAF41                 push    ebx             ; PreviousMode
PAGE:004CAF42                 call    _ObCreateObject@36 ; ObCreateObject(x,x,x,x,x,x,x,x,x)
PAGE:004CAF47                 cmp     eax, STATUS_OBJECT_NAME_COLLISION
PAGE:004CAF4C                 mov     edx, [ebp+var_deviceObject]
PAGE:004CAF4F                 mov     [ebp+var_NewDeviceObject], edx
PAGE:004CAF52                 mov     [ebp+var_Res], eax
PAGE:004CAF55                 jz      loc_517A06
PAGE:004CAF25                 lea     eax, [ebp+var_deviceObject]
PAGE:004CAF28                 push    eax             ; Object
PAGE:004CAF29                 push    ebx             ; NonPagedPoolCharge
PAGE:004CAF2A                 push    ebx             ; PagePoolCharge
PAGE:004CAF2B                 lea     eax, [esi+0E4h]
PAGE:004CAF31                 push    eax             ; ObjectBodySize
PAGE:004CAF32                 push    ebx             ; ParentContext
PAGE:004CAF33                 push    ebx             ; OwnershipMode
PAGE:004CAF34                 lea     eax, [ebp+ObjectAttributes]
PAGE:004CAF3A                 push    eax             ; ObjectAttributes
PAGE:004CAF3B                 push    _IoDeviceObjectType ; ObjectType
PAGE:004CAF41                 push    ebx             ; PreviousMode
PAGE:004CAF42                 call    _ObCreateObject@36 ; ObCreateObject(x,x,x,x,x,x,x,x,x)
PAGE:004CAF47                 cmp     eax, STATUS_OBJECT_NAME_COLLISION
PAGE:004CAF4C                 mov     edx, [ebp+var_deviceObject]
PAGE:004CAF4F                 mov     [ebp+var_NewDeviceObject], edx
PAGE:004CAF52                 mov     [ebp+var_Res], eax
PAGE:004CAF55                 jz      loc_517A06
PAGE:004CB07A                 lea     eax, [ebp+Handle]
PAGE:004CB07D                 push    eax             ; Handle
PAGE:004CB07E                 lea     eax, [ebp+var_NewDeviceObject]
PAGE:004CB081                 push    eax             ; NewObject
PAGE:004CB082                 push    1               ; ObjectPointerBias
PAGE:004CB084                 push    3               ; DesiredAccess
PAGE:004CB086                 push    ebx             ; PACCESS_STATE
PAGE:004CB087                 push    [ebp+var_NewDeviceObject] ; Object
PAGE:004CB08A                 call    _ObInsertObject@24 ; ObInsertObject(x,x,x,x,x,x)
PAGE:004CB08F                 cmp     eax, ebx
PAGE:004CB091                 mov     [ebp+var_Res], eax
PAGE:004CB094                 jl      loc_4E5CE6
PAGE:004CB07A                 lea     eax, [ebp+Handle]
PAGE:004CB07D                 push    eax             ; Handle
PAGE:004CB07E                 lea     eax, [ebp+var_NewDeviceObject]
PAGE:004CB081                 push    eax             ; NewObject
PAGE:004CB082                 push    1               ; ObjectPointerBias
PAGE:004CB084                 push    3               ; DesiredAccess

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

最后于 2022-1-5 11:36 被1900编辑 ,原因:
收藏
免费 4
支持
分享
赞赏记录
参与人
雪币
留言
时间
Ally Switch
+1
感谢你的积极参与,期待更多精彩内容!
2024-7-4 10:34
伟叔叔
为你点赞~
2023-3-18 04:37
shen97
为你点赞~
2023-2-27 16:18
PLEBFE
为你点赞~
2022-7-27 23:52
最新回复 (0)
游客
登录 | 注册 方可回帖
返回

账号登录
验证码登录

忘记密码?
没有账号?立即免费注册