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);