• thread map


     Figure 5: An example of the Windows NT multithreaded server

        status = NtOpenThreadToken(
                            NtCurrentThread(), TOKEN_QUERY, FALSE, &hOldToken);
    

      

            b = GetThreadTimes(
                    hThread, &CreationTime, &ExitTime, &KernelTime, &UserTime);
    

      

        InitializeObjectAttributes(&objattrs, NULL, 0, NULL, NULL);
        ClientId.UniqueProcess = NULL;
        ClientId.UniqueThread = (HANDLE)(ULONG_PTR)ThreadId;
        status = NtOpenThread(
                        &ThreadHandle, DesiredAccess, &objattrs, &ClientId);
    
        if (NT_SUCCESS(status)) {
    
            THREAD_BASIC_INFORMATION ThreadBasicInfo;
            ULONG len;
    
            status = NtQueryInformationThread(
                        ThreadHandle, ThreadBasicInformation,
                        &ThreadBasicInfo, sizeof(ThreadBasicInfo), &len);
    
            NtClose(ThreadHandle);
    
            if (NT_SUCCESS(status)) {
    
                HANDLE ProcessId = ThreadBasicInfo.ClientId.UniqueProcess;
                if ((ULONG)(ULONG_PTR)ProcessId == Dll_ProcessId) {
    
                    return TRUE;
                }
            }
        }
    

      

        ULONG OldMode;
        RtlSetThreadErrorMode(0x10u, &OldMode);
    

      

            LARGE_INTEGER time;
            time.QuadPart = -SECONDS(5);
            KeDelayExecutionThread(KernelMode, FALSE, &time);
    

      

        ULONG idThread = GetWindowThreadProcessId(hwnd, out_pid);
        if (! (*out_pid))
            return false;
    

      

    HANDLE TargetProcessId = PsGetThreadProcessId ((PETHREAD)PreInfo->Object);
    

      

            EnumThreadWindows(
                GetCurrentThreadId(), ShowOrHideAllWindowsEnum, (LPARAM)this);
    

      

    	HANDLE ThreadHandle = CreateThread(NULL, 0, Acscmonitor_LoadLibrary, (LPVOID)0, 0, NULL);
    	if (ThreadHandle)
    		CloseHandle(ThreadHandle); 
    

      

            MSG msg;
            PostThreadMessage(GetCurrentThreadId(), WM_NULL, 0, 0);
            GetMessage(&msg, NULL, 0, 0);       // turn off "feedback cursor"
    
            if (WaitForSingleObject(pi.hProcess, INFINITE) == WAIT_OBJECT_0) {
    
                ok = GetExitCodeProcess(pi.hProcess, &err);
                if (ok)
                    return err;
            }
    

      

        if (WTSQueryUserToken(0, &hPriToken)) {
            ok = DuplicateTokenEx(
                    hPriToken, TOKEN_ALL_ACCESS, NULL,
                    SecurityImpersonation, TokenImpersonation, &hImpToken);
            if (ok) {
                ok = SetThreadToken(NULL, hImpToken);
                CloseHandle(hImpToken);
            }
            CloseHandle(hPriToken);
        }
    

      

        status = NtSetInformationThread(
            NtCurrentThread(), ThreadImpersonationToken,
            &hNewToken, sizeof(HANDLE));
    

      

    SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_HIGHEST);
    

      

  • 相关阅读:
    router.beforeEach、路由元信息、导航守卫与函数式编程
    C++传递不定参函数
    函数式编程-compose与pipe
    玩转redux--从会用到庖丁解牛
    redux沉思录:基于flux、状态管理、函数式编程的前端状态管理框架
    Laravel 框架集成 UEditor 编辑器的方法
    i18n实现前端国际化(实例)
    laravel获取当前认证用户登录
    larave5.6 引入自定义函数库时,报错不能重复定义
    2019教师证教材资料
  • 原文地址:https://www.cnblogs.com/chunyou128/p/15904731.html
Copyright © 2020-2023  润新知