-
-
[原创]Windows内核学习笔记之I/O系统
-
发表于: 2022-1-5 11:33 13416
-
下图显示了Windows操作系统的I/O系统结构。Windows的I/O系统由5个部分组成:
I/O管理器
即插即用管理器
电源管理器
WMI例程
设备驱动程序
其中,I/O管理器是整个I/O系统的核心,它定义了一个非常通用的框架,允许各种功能的设备驱动程序容纳于其中。
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请求转发给相应驱动程序的分发例程。
不难理解,一个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直播授课
赞赏
- [原创]CVE-2022-21882提权漏洞学习笔记 16852
- [原创]CVE-2021-1732提权漏洞学习笔记 19982
- [原创]CVE-2014-1767提权漏洞学习笔记 15526
- [原创]CVE-2018-8453提权漏洞学习笔记 18971
- [原创]CVE-2020-1054提权漏洞学习笔记 13893