Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Листинги / Листинги / 43-05-SetThreadToken

.cpp
Скачиваний:
4
Добавлен:
24.03.2016
Размер:
2.26 Кб
Скачать
#include <windows.h>
#include <stdio.h>

volatile UINT count;
volatile BOOL flag = TRUE;

void thread()
{
  while(flag)
  {
    count++;
    printf("count = %u\n", count);
    Sleep(500);
  }
}

int main()
{
  HANDLE hThread;
  DWORD IDThread;

  HANDLE hProcess;     // дескриптор процесса
  HANDLE hToken;       // дескриптор маркера доступа
  HANDLE hDuplicate;   // дескриптор дубликата маркера доступа

  DWORD dwRetCode;     // код возврата

  // запускаем поток
  hThread = CreateThread(
    NULL,          // защита по умолчанию
    0,             // размер стека по умолчанию
    (LPTHREAD_START_ROUTINE)thread,  // адрес программы потока
    NULL,          // параметров нет
    CREATE_SUSPENDED,    // подвешенное состояние потока
    &IDThread);    // идентификатор потока
  if (hThread == NULL)
  {
    printf("Create thread failed.\n");
    return GetLastError();
  }

  // получаем дескриптор процесса
  hProcess = GetCurrentProcess();
  
  // получаем маркер доступа потока
  if (!OpenProcessToken(
    hProcess,          // дескриптор процесса
    TOKEN_DUPLICATE,   // дублирование маркера доступа
    &hToken))          // дескриптор маркера
  {
    dwRetCode = GetLastError();
    printf( "Open process token failed: %u\n", dwRetCode);
    
    return dwRetCode;
  }

  // дублируем маркер доступа
  if (!DuplicateToken(
    hToken,                  // маркер доступа
    SecurityImpersonation,   // уровень замещения
    &hDuplicate))            // адрес дубликата маркера доступа
  {
    dwRetCode = GetLastError();
    printf( "Duplicate token failed: %u\n", dwRetCode);
    
    return dwRetCode;
  }

  // устанавливаем замещающий маркер доступа для потока
  if (!SetThreadToken(
    &hThread,      // адрес дескриптора потока
    hDuplicate))   // дубликат маркера доступа
  {
    dwRetCode = GetLastError();
    printf( "Set thread token failed: %u\n", dwRetCode);
    
    return dwRetCode;
  }

  printf("Press any key to exit.\n");

  // возобновляем поток
  ResumeThread(hThread);

  // ждем команду на завершение потока
  getchar();

  flag = FALSE;    // завершить поток

  CloseHandle(hThread);
  CloseHandle(hToken);

  return 0;
}
Соседние файлы в папке Листинги