Сейчас на форуме: zds (+6 невидимых)

 eXeL@B —› Программирование —› Ошибка получения токена
Посл.ответ Сообщение

Ранг: 10.0 (новичок)
Активность: 0.010
Статус: Участник

Создано: 27 апреля 2014 18:20 · Поправил: KillerX
· Личное сообщение · #1

Здрасьте всем)

Пытаюсь получить токен для процесса,

Code:
  1.                            DWORD dwSize = 0, dwResult = 0;
  2.                            HANDLE hToken;
  3.  
  4.                            OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken);
  5.  
  6.  
  7.                            if (!GetTokenInformation(hToken, TokenGroups, NULL, dwSize, &dwSize))
  8.                            {
  9.                                  dwResult = GetLastError();
  10.                                  if (dwResult != ERROR_INSUFFICIENT_BUFFER) {
  11.                                       printf("GetTokenInformation Error %u\n", GetLastError());
  12.                                     
  13.                                 }
  14.                                 else puts("GetTokenInformation success Pass1");
  15.                           }
  16.  
  17.                            ZeroMemory(&dwSize, dwSize);
  18.  
  19.                            if (!GetTokenInformation(hToken, TokenGroups, NULL, dwSize, &dwSize))
  20.                                    printf("GetTokenInformation Error %u\n", GetLastError());
  21.                                    else puts("GetTokenInformation success Pass2");


на втором проходе(Pass2) выдает код ошибки 6, ERROR_INVALID_HANDLE. Если просто написать
Code:
  1.                            DWORD dwSize = 1000, dwResult = 0;
  2.                            HANDLE hToken;
  3.  
  4.                            OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken);
  5.  
  6. if (!GetTokenInformation(hToken, TokenGroups, NULL, dwSize, &dwSize))
  7.                            {
  8.                                  dwResult = GetLastError();
  9.                                  if (dwResult != ERROR_INSUFFICIENT_BUFFER) {
  10.                                       printf("GetTokenInformation Error %u\n", GetLastError());
  11.                                     
  12.                                 }
  13.                                 else puts("GetTokenInformation success");
  14.                           }


выдает 998 ошибку ERROR_NOACCESS.

Как же правильно получить токен?




Ранг: 2014.5 (!!!!), 1278thx
Активность: 1.340.25
Статус: Модератор
retired

Создано: 27 апреля 2014 18:30
· Личное сообщение · #2

Прочитать например мсдн про GetTokenInformation. Учитывая, что там даже примеры есть. А не передавать везде нулл вместо буфера и писать фееричную гадость типа ZeroMemory(&dwSize, dwSize);



Ранг: 10.0 (новичок)
Активность: 0.010
Статус: Участник

Создано: 27 апреля 2014 18:34 · Поправил: KillerX
· Личное сообщение · #3

Ммммм... А чем вам не понравилось ZeroMemory(&dwSize, dwSize); ?

upd

TokenInformation [out, optional]
A pointer to a buffer the function fills with the requested information. The structure put into this buffer depends upon the type of information specified by the TokenInformationClass parameter.

Понял, здесь передается указатель на буфер. Но говорится, что тип данных указывается во 2 параметре, у меня там TokenGroups. И как же эти данные обработать?




Ранг: 2014.5 (!!!!), 1278thx
Активность: 1.340.25
Статус: Модератор
retired

Создано: 27 апреля 2014 19:05
· Личное сообщение · #4

KillerX пишет:
чем вам не понравилось ZeroMemory(&dwSize, dwSize); ?

Тонко поясняю. Это ДВОРД, 4 байта. После работы 1 прохода он получит размер буфера, скажем, 100. После чего по адресу переменной в 4 байта будет попытка записать 100 байтов нулей.

Действительно, как же эти данные обработать... Совсем лень мсдн полистать? http://msdn.microsoft.com/en-us/library/windows/desktop/aa379554(v=vs.85).aspx

| Сообщение посчитали полезным: KillerX


Ранг: 72.3 (постоянный), 133thx
Активность: 0.380
Статус: Участник

Создано: 27 апреля 2014 19:50
· Личное сообщение · #5

KillerX

> ERROR_NOACCESS

Ядерные коды ошибок(статусы, NTSTATUS) транслируются в винапи коды, при этом используется обобщение, из за чего бывает сложно понять суть. Тот же ERROR_NOACCESS может возвращаться при не выравненном стеке.

В файле generr содержится отображение статусов на апи, например:

Code:
  1.     STATUS_DATATYPE_MISALIGNMENT, ERROR_NOACCESS,
  2.     STATUS_ACCESS_VIOLATION, ERROR_NOACCESS,
  3.     STATUS_DATATYPE_MISALIGNMENT_ERROR, ERROR_NOACCESS,


Вывод - не использовать виапи коды, а юзать нэйтивные.

2781_27.04.2014_EXELAB.rU.tgz - generr.c

| Сообщение посчитали полезным: KillerX

Ранг: 10.0 (новичок)
Активность: 0.010
Статус: Участник

Создано: 27 апреля 2014 22:13
· Личное сообщение · #6

Огромное всем спасибо, буду копать дальше!


 eXeL@B —› Программирование —› Ошибка получения токена
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


Максимальный размер аттача: 500KB.
Ваш логин: german1505 » Выход » ЛС
   Для печати Для печати