百度空间 | 百度首页 
 
查看文章
 
[note]嗯,PspTerminateThreadByPointer没有改变
2008年02月02日 星期六 13:06

用Windbg看了遍PspTerminateThreadByPointer,发现和WRK上的一样.哈哈,没有任何出入.这样自己实现起来就方便咯.

btw: XP SP2下是2个参数

NTSTATUS
PspTerminateThreadByPointer(
     IN PETHREAD Thread,
     IN NTSTATUS ExitStatus,
     IN BOOLEAN DirectTerminate
     )
{
     NTSTATUS Status;
     PKAPC     ExitApc=NULL;
    ULONG     OldMask;

     PAGED_CODE();

    if (Thread->CrossThreadFlags
     & PS_CROSS_THREAD_FLAGS_BREAK_ON_TERMINATION) {
       PspCatchCriticalBreak("Terminating critical thread 0x%p (in %s)\n",
                 Thread,
                 THREAD_TO_PROCESS(Thread)->ImageFileName);
     }

    if (DirectTerminate && Thread == PsGetCurrentThread()) {

        ASSERT (KeGetCurrentIrql() < APC_LEVEL);

         PS_SET_BITS (&Thread->CrossThreadFlags, PS_CROSS_THREAD_FLAGS_TERMINATED);

        PspExitThread (ExitStatus);

     } else {
        // 10h
        // 嘿嘿,若thread的flag中有PS_CROSS_THREAD_FLAGS_SYSTEM, 就pass了. =。=||
        if (IS_SYSTEM_THREAD (Thread)) {
            return STATUS_ACCESS_DENIED;
         }

         Status = STATUS_SUCCESS;

        while (1) {
             ExitApc = (PKAPC) ExAllocatePoolWithTag (NonPagedPool,
                                                     sizeof(KAPC),
                                                      'xEsP');
            if (ExitApc != NULL) {
                break;
             }
             KeDelayExecutionThread(KernelMode, FALSE, &ShortTime);
         }

        // Mark the thread as terminating and call the exit function.
        OldMask = PS_TEST_SET_BITS (&Thread->CrossThreadFlags, PS_CROSS_THREAD_FLAGS_TERMINATED);// 01h

        // 若之前没有设置过关闭标志,那就插个APC
        if ((OldMask & PS_CROSS_THREAD_FLAGS_TERMINATED) == 0) {

             KeInitializeApc (ExitApc,
                              PsGetKernelThread (Thread),
                              OriginalApcEnvironment,
                              PsExitSpecialApc,
                              PspExitApcRundown,
                              PspExitNormalApc,
                              KernelMode,
                              ULongToPtr (ExitStatus));

            if (!KeInsertQueueApc (ExitApc, ExitApc, NULL, 2)) {
                // 看来可以在KeInsertQueueApc上做手脚啦。
                 ExFreePool (ExitApc);
                 Status = STATUS_UNSUCCESSFUL;
             } else {
      
                KeForceResumeThread (&Thread->Tcb);
             }
         } else {
             ExFreePool (ExitApc);
         }
     }

    return Status;
}

是自身线程就直接调用PspExitThread,其他情况就插APC。。。

btw:炉子半年前就把这些弄透了,俺现在才开始学习。差距啊

PspTerminateThreadByPointer.txt (6.37 KB)


类别:Note | 浏览() | 评论 (5)
 
最近读者:
 
网友评论:
1
2008年02月02日 星期六 18:40
仔细再往里看,最终调用的还是XXX...
 
2
2008年02月02日 星期六 19:26
KeInsetQueueApc就是kv2008做手脚的地方
 
3
2008年02月02日 星期六 22:44
sudami不老实哦。。 你去看看WRK的license.txt 里面有一段: You may distribute snippets of this software in research papers, books or other teaching materials, or publish snippets of the software on websites or on-line community forums that are intended for teaching and research. The total amount of source code in each of your snippets should not exceed 50 lines. If you wish to use a larger portion of the software, please contact compsci@microsoft.com.
 
4
2008年02月03日 星期日 09:43
should not exceed 50 lines........... =.=! 真邪恶
 
5
2008年02月03日 星期日 20:06
MS啊MS
 
本篇日志被作者设置为禁止发表新评论

     

©2009 Baidu