##三 线程相关函数
###2.PspExitThread(未导出)
###4.KiSwapContext(未导出)
##四 进程挂靠
###1.KeStackAttachProcess
##其它
###1.MmGetSystemRoutineAddress
原型:PVOID NTAPI ExAllocatePoolWithTag (
_In_ __drv_strictTypeMatch(__drv_typeExpr) POOL_TYPE PoolType,
_In_ SIZE_T NumberOfBytes,
_In_ ULONG Tag
);
参数:
1)虚拟内存页类型,分页还是非分页
2)大小
3)随便写,自定义一个TAG
返回值:
成功,返回内存指针
失败,返回NULL
作用:
申请内存
原型:
参数:
返回值:
作用:
初始化内存
原型:
参数:
返回值:
作用:
复制内存
原型:VOID ExFreePoolWithTag (
_Pre_notnull_ __drv_freesMem(Mem) PVOID P,
_In_ ULONG Tag
);
参数:
返回值:
作用:
释放内存
导出函数
原型:NTSTATUS ObReferenceObjectByHandle(
_In_ HANDLE Handle,
_In_ ACCESS_MASK DesiredAccess,
_In_opt_ POBJECT_TYPE ObjectType,
_In_ KPROCESSOR_MODE AccessMode,
_Out_ PVOID *Object,
_Out_opt_ POBJECT_HANDLE_INFORMATION HandleInformation
);
参数:
1)对象的句柄
2)访问权限,GENERIC_ALL
3)指向对象类型的指针。如果ObjectType不为NULL,则操作系统将验证提供的对象类型是否与Handle指定的对象的对象类型匹配。
4)指定先前模式,UserMode或KernelMode
5)返回句柄对应的内核对象的指针
6)设置为NULL,即可
返回值:
成功,返回STATUS_SUCCESS
失败,返回
STATUS_OBJECT_TYPE_MISMATCH 的对象类型参数指定要由所标识的对象的错误的对象类型句柄参数。
STATUS_ACCESS_DENIED 无法授予调用方请求的对象访问权限。
STATUS_INVALID_HANDLE 该句柄参数是不是有效的对象句柄。
作用:
根据句柄找到相应的内核对象地址
原型:NTSTATUS ObReferenceObjectByHandleWithTag(
_In_ HANDLE Handle,
_In_ ACCESS_MASK DesiredAccess,
_In_opt_ POBJECT_TYPE ObjectType,
_In_ KPROCESSOR_MODE AccessMode,
_In_ ULONG Tag,
_Out_ PVOID *Object,
_Out_opt_ POBJECT_HANDLE_INFORMATION HandleInformation
);
参数:
除了多了一个自定义的标签值外,其它参数和ObReferenceObjectByHandle一样
5)指定一个四字节的自定义标签值
返回值:
和ObReferenceObjectByHandle一样
作用:
和ObReferenceObjectByHandle一样
原型:NTSTATUS __fastcall PspTerminateThreadByPointer(
_In_ PETHREAD Thread,
_In_ NTSTATUS ExitStatus,
_In_ BOOLEAN DirectTerminate
);
参数:
1)要结束的线程结构体地址
2)自定义退出码
3) 第一个参数是当前线程,则使用TRUE。
第一个参数不是当前线程,则使用FALSE
返回值:
成功,返回STATUS_SUCCESS
失败
作用:
结束线程
当第一个参数是当前线程,并使用TRUE时,会调用PspExitThread函数来结束线程
当第一个参数是当前线程,但强行使用FALSE时,会调用KeRequestTerminationThread函数,往当前线程插入APC
当第一个参数是其它线程,无论使用TRUE和FALSE,都会调用KeRequestTerminationThread函数,往目标线程插入
APC
原型:__fastcall PspExitThread(
In_ NTSTATUS ExitStatus,
)
参数:
自定义退出码
返回值:
作用:
用来结束当前线程
原型:VOID __fastcall PspClearProcessThreadCidRefs(
_In_ PETHREAD pEThread,
_In_ UINT TID,
_In_ PETHREAD pEThread
)
返回值:
无
作用:
未知,其中有可能处理内核APC机会
原型:BOOL __fastcall KiSwapContext(
_In_ PETHREAD pEThread,
_In_ PETHREAD pEThread,
_In_ UCHAR irql
)
参数:
1)当前线程ETHREAD
2)目标线程ETHREAD
3)当前线程的IRQL
返回值:
0 表示正常返回
非0 表示有内核APC需要处理
作用:
线程切换函数
原型:VOID KeStackAttachProcess (
_Inout_ PRKPROCESS PROCESS,
_Out_ PRKAPC_STATE ApcState
);
参数:
1)目标进程_KPROCESS地址
2)KAPC_STATE结构体地址,必须把此结构体放到非分页内存或线程栈中
返回:
无
作用:
将当前线程挂靠到其它进程中,会调用KiAttachProcess
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课