На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Обратите внимание:
1. Прежде чем начать новую тему или отправить сообщение, убедитесь, что вы не нарушаете правил форума!
2. Обязательно воспользуйтесь поиском. Возможно, Ваш вопрос уже обсуждали. Полезные ссылки приведены ниже.
3. Темы с просьбой выполнить какую-либо работу за автора в этом разделе не обсуждаются.
4. Используйте теги [ code=cpp ] ...текст программы... [ /code ] для выделения текста программы подсветкой.
5. Помните, здесь телепатов нет. Старайтесь формулировать свой вопрос максимально грамотно и чётко: Как правильно задавать вопросы
6. Запрещено отвечать в темы месячной и более давности без веских на то причин.

Полезные ссылки:
user posted image FAQ Сайта (C++) user posted image FAQ Форума user posted image Наши Исходники user posted image Поиск по Разделу user posted image MSDN Library Online (Windows Driver Kit) user posted image Google

Ваше мнение о модераторах: user posted image B.V.
Модераторы: B.V.
  
> Как включить 2 и больше привилегии сразу? , Winapi, не получается включить 2 привилегии токена и больше
    Не могу разобраться в простейшем коде. Требуется включить сразу две привилегии, делаю так:

    ExpandedWrap disabled
      void err(char *errM,DWORD errC)
      {
      printf("%s %d\n",errM,errC);
      }
       
       
      BOOL SetPrivileges()
      {
          HANDLE hToken;
          BOOL bRet = FALSE;
          do
          {
              if (!OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, &hToken))
              {
                  err("OpenThreadToken: %u\n", GetLastError());
                  break;
              }
       
              TOKEN_PRIVILEGES tp;
              LUID luid0, luid1;
       
              if (!LookupPrivilegeValueA(NULL, SE_TAKE_OWNERSHIP_NAME, &luid0))
              {
                  err("LookupPrivilegeValue SE_TAKE_OWNERSHIP_NAME error: %u\n", GetLastError());
                  break;
              }
              if (!LookupPrivilegeValueA(NULL, SE_DEBUG_NAME, &luid1))
              {
                  err("LookupPrivilegeValue SE_DEBUG_NAME error: %u\n", GetLastError());
                  break;
              }
       
       
       
              tp.PrivilegeCount = 2;
              tp.Privileges[0].Attributes = tp.Privileges[1].Attributes = SE_PRIVILEGE_ENABLED;
              tp.Privileges[0].Luid = luid0;
              tp.Privileges[1].Luid = luid1;
       
       
              if (!AdjustTokenPrivileges(hToken, FALSE, &tp, sizeof(TOKEN_PRIVILEGES), NULL, NULL))
              {
                  err("AdjustTokenPrivileges error: %u\n", GetLastError());
                  break;
              }
              else
                  bRet = TRUE;
          } while (0);
       
          CloseHandle(hToken);
          return bRet;
      }


    Ошибок никаких нет, но Process Haker и подобное ПО показывает, что включается только первая (в списке) привилегия. Если менять местами- аналогично, первая включается, иные игнорятся. Почему так?? Да, если по одной все работает, но хочу тут разобраться.
    Запускаю, ясное дело, от админа у которого эти привилегии есть.
      TOKEN_PRIVILEGES structure (winnt.h)

      Добавлено
      Цитата
      Important The constant ANYSIZE_ARRAY is defined as 1 in the public header Winnt.h. To create this array with more than one element, you must allocate sufficient memory for the structure to take into account additional elements.
      sizeof(TOKEN_PRIVILEGES) естественно включает лишь первый элемент Privileges[]
        Пишу
        ExpandedWrap disabled
          sizeof(TOKEN_PRIVILEGES) * 2
        или
        ExpandedWrap disabled
          sizeof(TOKEN_PRIVILEGES) * tp.PrivilegeCount
        , все равно вторая привилегия не добавляется :wall:
          Естественно. Память под tp.Privileges[1] есть? Или трётся?

          Добавлено
          P.S. Размер можно вообще в 0 поставить, коли далее NULL. Я привёл цитату не для этого.
            Спасибо, все получилось. не знаю, правильно или нет, но короче так

            ExpandedWrap disabled
              PTOKEN_PRIVILEGES tp = malloc(512);
              LUID luid0, luid1;
              tp->PrivilegeCount = 2;
              tp->Privileges[0].Attributes = tp->Privileges[1].Attributes = SE_PRIVILEGE_ENABLED;
              tp->Privileges[0].Luid = luid0;
              tp->Privileges[1].Luid = luid1;
              Почему 512?
              ExpandedWrap disabled
                PTOKEN_PRIVILEGES tp = malloc(sizeof(*tp) + sizeof(tp->Privileges[0]));

              Вообще, этот т.н. POSIX style структур с переменным размером лично меня напрягает. Но уж так повелось.

              Добавлено
              P.S. Можно накидать макрос, чтоб каждый раз портянки не писать. Что-то типа
              ExpandedWrap disabled
                #define GET_VARIADIC_ARRAY_SIZE(str, field, num) (sizeof(str)-sizeof(str::field) + sizeof(str::field[0])*(num))
                 
                /* ... */
                 
                PTOKEN_PRIVILEGES tp = malloc(GET_VARIADIC_ARRAY_SIZE(TOKEN_PRIVILEGES, Privileges, 2);
              Не тестировал.

              Добавлено
              P.P.S. Если так не зайдёт, возможно, в чистом C плюсовое :: не работает, не помню, то вот так должно:
              ExpandedWrap disabled
                #define GET_VARIADIC_ARRAY_SIZE(str, field, num) (sizeof(str) - sizeof(((str*)0)->field) + sizeof(((str*)0)->field[0]) * (num))
              Но как-то криво выглядит.
                Вроде обращение к nullptr даже внутри sizeof - это UB. В исходниках линуха это везде и был лютый срач на эту тему.
                  Не-а. По современному Стандарту к UB ведёт не разыменование nullptr, а использование разыменования. По Стандарту же sizeof обязан отрабатывать на этапе компиляции, поэтому в исполняемом образе будет уже готовый результат sizeof. Из чего следует, что результат разыменования не используется.
                  0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                  0 пользователей:


                  Рейтинг@Mail.ru
                  [ Script execution time: 0,0401 ]   [ 17 queries used ]   [ Generated: 23.04.24, 18:40 GMT ]