Error code 997 при присвоении привилегий процессу
От: foe  
Дата: 29.09.09 09:16
Оценка:
Доброго времени суток!
Суть проблемы — есть функция, присваивающая процессу (своему) отладочные привилегии. В процессе работы выдает вышеуказанный код ошибки. Как понимаю из описания MSDN — перекрывающаяся операция ввода-вывода. Сам код функции такой:

bool AddDebugPrivileges(bool fEnable)
{
    bool fOk = false;
    HANDLE hPrivToken;
    //отладочная переменная!!
    DWORD LastError;

    if(OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, &hPrivToken))
    {
        TOKEN_PRIVILEGES tp;
        tp.PrivilegeCount = 1;
        LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &tp.Privileges[0].Luid);//error code 997
        LastError = GetLastError();
        tp.Privileges[0].Attributes = fEnable ? SE_PRIVILEGE_ENABLED : 0;
        AdjustTokenPrivileges(&hPrivToken, FALSE, &tp, sizeof(tp), NULL, NULL);//косяк в хэндле
        LastError = GetLastError();
        fOk = (GetLastError() == ERROR_SUCCESS);
        CloseHandle(hPrivToken);
    }
    return(fOk);
};


Вызов LookupPrivilegeValue заканчивается той самой ошибкой — и, соответственно, ничего из присвоения привилегий не получается. Отсюда возникает вопрос — что может вызывать такую ошибку?

Если поможет, что вызов функции производится следующим образом:

#include <windows.h>
#include <tlhelp32.h>
#include <stdio.h>
#include <tchar.h>

#include "SysSnap.h"
#include "Output.h"


int main(int argc, CHAR* argv[])
{
    
    HANDLE hSnapHandle; //хэндл снапшота системы.
    PROCESSENTRY32 ProcEntry; //сюда бум загонять всю щнягу по процессам

    AddDebugPrivileges(true);

    if(CreateSnapshot(&hSnapHandle))
    {
        ProcEntry.dwSize = sizeof(PROCESSENTRY32);
        ListAllProcesses(hSnapHandle, &ProcEntry);
    }
    return 0;
}


29.09.09 13:21: Перенесено модератором из 'C/C++' — Кодт
cpp c++ error code 997 visual studio winapi
Re: Error code 997 при присвоении привилегий процессу
От: ABar Украина  
Дата: 29.09.09 09:32
Оценка:
Здравствуйте, foe, Вы писали:

А LookupPrivilegeValue точно вернула FALSE?
Дело в том, что GetLastError нужно смотреть обычно только если функция вернула FALSE.
Re: Error code 997 при присвоении привилегий процессу
От: Мизантроп  
Дата: 29.09.09 10:03
Оценка:
Здравствуйте, foe, Вы писали:

foe>Отсюда возникает вопрос — что может вызывать такую ошибку?


Какой-нибудь предыдущий или внутренний вызов. LookupPrivilegeValue относится к тем функциям, которые не обнуляют LastError в случае успеха, поэтому вызывать GetLastError имеет смысл только тогда, когда она вернула ноль. Впрочем, так следует поступать со всеми функциями.
"Нормальные герои всегда идут в обход!"
Re: Error code 997 при присвоении привилегий процессу
От: Мизантроп  
Дата: 30.09.09 04:26
Оценка:
Здравствуйте, foe, Вы писали:

Добавлю несколько слов, на всякий случай В Вашем коде вероятность того, что LookupPrivilegeValue завершится ошибкой не больше, чем вероятность схлопывания вселенной сегодня к обеду. Возможная причина Вашей неудачи может состоять в том, что функция AdjustTokenPrivileges не может добавить маркеру привилегий, она оперирует лишь с уже имеющими привилегиями. Привилегии маркера могут находиться в двух состояниях — включена или выключена, вот эти переключения данная функция и выполняет.

Другой причиной может быть то, что Вы выводы делаете на основании результата вызова GetLastError, а надо — на основании анализа результата самой функции. Так, как Вы поступили с OpenProcessToken.
"Нормальные герои всегда идут в обход!"
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.