获取当前进程.线程。过程一探。
2011-09-25 16:07
281 查看
PsGetCurrentProcess
PsGetCurrentThread
这2个函数
前者是获取当前进程
后者是获取当前线程。
--------
他们的反汇编代码如下
lkd> u IoGetCurrentProcess
nt!PsGetCurrentProcess:
8052c2ee 64a124010000 mov eax,dword ptr fs:[00000124h]
8052c2f4 8b4044 mov eax,dword ptr [eax+44h]
8052c2f7 c3 ret
lkd> u PsGetCurrentThread
nt!PsGetCurrentThread:
8052c312 64a124010000 mov eax,dword ptr fs:[00000124h]
8052c318 c3 ret
------------------------
可以看出都操作了FS寄存器。
而FS寄存器其实就是
_KPCR
结构
这个结构如下:
lkd> dt _kpcr
nt!_KPCR
+0x000 NtTib : _NT_TIB
+0x01c SelfPcr : Ptr32 _KPCR
+0x020 Prcb : Ptr32 _KPRCB
+0x024 Irql : UChar
+0x028 IRR : Uint4B
+0x02c IrrActive : Uint4B
+0x030 IDR : Uint4B
+0x034 KdVersionBlock : Ptr32 Void
+0x038 IDT : Ptr32 _KIDTENTRY
+0x03c GDT : Ptr32 _KGDTENTRY
+0x040 TSS : Ptr32 _KTSS
+0x044 MajorVersion : Uint2B
+0x046 MinorVersion : Uint2B
+0x048 SetMember : Uint4B
+0x04c StallScaleFactor : Uint4B
+0x050 DebugActive : UChar
+0x051 Number : UChar
+0x052 Spare0 : UChar
+0x053 SecondLevelCacheAssociativity : UChar
+0x054 VdmAlert : Uint4B
+0x058 KernelReserved : [14] Uint4B
+0x090 SecondLevelCacheSize : Uint4B
+0x094 HalReserved : [16] Uint4B
+0x0d4 InterruptMode : Uint4B
+0x0d8 Spare1 : UChar
+0x0dc KernelReserved2 : [17] Uint4B
+0x120 PrcbData : _KPRCB
----------
+0x120 PrcbData : _KPRCB
+0x000 MinorVersion : Uint2B
+0x002 MajorVersion : Uint2B
+0x004 CurrentThread : Ptr32 _KTHREAD //后者就是根据该成员取得当前线程的
+0x008 NextThread : Ptr32 _KTHREAD
+0x00c IdleThread : Ptr32 _KTHREAD
-------
那么前者呢。
lkd> dt _KTHREAD -r1
ntdll!_KTHREAD
.............省略..............
+0x034 ApcState : _KAPC_STATE
+0x000 ApcListHead : [2] _LIST_ENTRY
+0x010 Process : Ptr32 _KPROCESS //就是这个位置
PsGetCurrentThread
这2个函数
前者是获取当前进程
后者是获取当前线程。
--------
他们的反汇编代码如下
lkd> u IoGetCurrentProcess
nt!PsGetCurrentProcess:
8052c2ee 64a124010000 mov eax,dword ptr fs:[00000124h]
8052c2f4 8b4044 mov eax,dword ptr [eax+44h]
8052c2f7 c3 ret
lkd> u PsGetCurrentThread
nt!PsGetCurrentThread:
8052c312 64a124010000 mov eax,dword ptr fs:[00000124h]
8052c318 c3 ret
------------------------
可以看出都操作了FS寄存器。
而FS寄存器其实就是
_KPCR
结构
这个结构如下:
lkd> dt _kpcr
nt!_KPCR
+0x000 NtTib : _NT_TIB
+0x01c SelfPcr : Ptr32 _KPCR
+0x020 Prcb : Ptr32 _KPRCB
+0x024 Irql : UChar
+0x028 IRR : Uint4B
+0x02c IrrActive : Uint4B
+0x030 IDR : Uint4B
+0x034 KdVersionBlock : Ptr32 Void
+0x038 IDT : Ptr32 _KIDTENTRY
+0x03c GDT : Ptr32 _KGDTENTRY
+0x040 TSS : Ptr32 _KTSS
+0x044 MajorVersion : Uint2B
+0x046 MinorVersion : Uint2B
+0x048 SetMember : Uint4B
+0x04c StallScaleFactor : Uint4B
+0x050 DebugActive : UChar
+0x051 Number : UChar
+0x052 Spare0 : UChar
+0x053 SecondLevelCacheAssociativity : UChar
+0x054 VdmAlert : Uint4B
+0x058 KernelReserved : [14] Uint4B
+0x090 SecondLevelCacheSize : Uint4B
+0x094 HalReserved : [16] Uint4B
+0x0d4 InterruptMode : Uint4B
+0x0d8 Spare1 : UChar
+0x0dc KernelReserved2 : [17] Uint4B
+0x120 PrcbData : _KPRCB
----------
+0x120 PrcbData : _KPRCB
+0x000 MinorVersion : Uint2B
+0x002 MajorVersion : Uint2B
+0x004 CurrentThread : Ptr32 _KTHREAD //后者就是根据该成员取得当前线程的
+0x008 NextThread : Ptr32 _KTHREAD
+0x00c IdleThread : Ptr32 _KTHREAD
-------
那么前者呢。
lkd> dt _KTHREAD -r1
ntdll!_KTHREAD
.............省略..............
+0x034 ApcState : _KAPC_STATE
+0x000 ApcListHead : [2] _LIST_ENTRY
+0x010 Process : Ptr32 _KPROCESS //就是这个位置
相关文章推荐
- 获取当前进程ID和子线程的线程ID
- windows 下获取当前进程的线程数量
- rt-thread线程调度器获取当前最高优先级线程算法过程分析
- rt-thread线程调度器获取当前最高优先级线程算法过程分析
- windows应用开发由浅入深(五)关于进程和线程--获取当前进程信息
- 获取指定进程所有线程的当前执行模块
- 获取当前进程/线程的ID、句柄和内核地址
- 根据当前进程号,获取进程下线程数目
- 获取当前进程/线程的ID、句柄和内核地址
- Java获取当前进程的所有线程
- 获取当前进程/线程的ID、句柄和内核地址
- C++获取当前进程的进程号方法
- 进程和线程的创建过程
- 【API】获取当前进程的用户对象和GDI对象
- 获取内核当前执行模块和当前发生异常地址和线程异常Handler调用步骤
- linux驱动程序中怎样获取当前进程信息
- 存储过程调用过程中,获取当前正在执行的过程的信息
- 获取当前进程描述符地址 -- current
- 获取当前进程的CPU使用率和内存使用
- WinAPI: GetWindowThreadProcessId - 获取指定窗口的进程 ID 或线程 ID