html tool

2019年7月8日星期一

排版改进参考

排版参考
https://www.cnblogs.com/aliflycoris/p/5353269.html

better:
1. 标题,次标题 与正文 的区分
2. code 的内容分明-这个css可以all for use
3. code中的注释与正文不同区别,like


使用效果如下:
0x01   前言
  APCs(Asynchronous Procedure Calls), 在NT中,有两种类型的APCs:用户模式和内核模式。用户APCs运行在用户模式下目标线程当前上下文中,并且需要从目标线程得到许可来运行。特别是,用户模式的APCs需要目标线程处在alertable等待状态才能被成功的调度执行。通过调用下面任意一个函数,都可以让线程进入这种状态。这些函数是:KeWaitForSingleObject, KeWaitForMultipleObjects, KeWaitForMutexObject, KeDelayExecutionThread。
  对于用户模式下,可以调用函数SleepEx, SignalObjectAndWait, WaitForSingleObjectEx, WaitForMultipleObjectsEx,MsgWaitForMultipleObjectsEx 都可以使目标线程处于alertable等待状态,从而让用户模式APCs执行,原因是这些函数最终都是调用了内核中的KeWaitForSingleObject, KeWaitForMultipleObjects, KeWaitForMutexObject, KeDelayExecutionThread等函数。另外通过调用一个未公开的alert-test服务KeTestAlertThread,用户线程可以使用户模式APCs执行。

0x02   APC相关结构与位置
  系统中每一个线程都包含两个APC队列,一个为用户模式APC队列,一个为内核模式APC队列,存储在KAPC_STATE结构中。而KAPC_STATE结构指针在线程结构体ETHREAD中有两个,一个是ApcState,一个是SaveApcState,为了进程Attach准备,当A进程附加到B进程,SaveApcState保存原来A进程的Apc队列,ApcState保存被附加B进程的Apc队列。
  1.KAPC_STATE结构为
复制代码
typedef struct _KAPC_STATE {
        LIST_ENTRY ApcListHead[MaximumMode];       //线程的apc链表 只有两个 内核态和用户态
        struct _KPROCESS *Process;               //当前线程的进程体   PsGetCurrentProcess()
        BOOLEAN KernelApcInProgress;              //内核APC正在执行
        BOOLEAN KernelApcPending;                 //内核APC正在等待执行
        BOOLEAN UserApcPending;                  //用户APC正在等待执行
} KAPC_STATE, *PKAPC_STATE, *PRKAPC_STATE;
复制代码
    2.ApcStatePointer
   对于一个APC对象,决定当前APC环境的是ApcStateIndex域。ApcStateIndex域的值作为ApcStatePointer域数组的索引来得到目标APC环境指针。随后,目标APC环境指针用来在相应的队列中存放apc对象.

没有评论:

发表评论