Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[52.14.126.74] |
|
Сообщ.
#1
,
|
|
|
Не могу разобраться в простейшем коде. Требуется включить сразу две привилегии, делаю так:
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 и подобное ПО показывает, что включается только первая (в списке) привилегия. Если менять местами- аналогично, первая включается, иные игнорятся. Почему так?? Да, если по одной все работает, но хочу тут разобраться. Запускаю, ясное дело, от админа у которого эти привилегии есть. |
Сообщ.
#2
,
|
|
|
TOKEN_PRIVILEGES structure (winnt.h)
Добавлено Цитата sizeof(TOKEN_PRIVILEGES) естественно включает лишь первый элемент Privileges[] 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. |
Сообщ.
#3
,
|
|
|
Пишу
sizeof(TOKEN_PRIVILEGES) * 2 sizeof(TOKEN_PRIVILEGES) * tp.PrivilegeCount |
Сообщ.
#4
,
|
|
|
Естественно. Память под tp.Privileges[1] есть? Или трётся?
Добавлено P.S. Размер можно вообще в 0 поставить, коли далее NULL. Я привёл цитату не для этого. |
Сообщ.
#5
,
|
|
|
Спасибо, все получилось. не знаю, правильно или нет, но короче так
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; |
Сообщ.
#6
,
|
|
|
Почему 512?
PTOKEN_PRIVILEGES tp = malloc(sizeof(*tp) + sizeof(tp->Privileges[0])); Вообще, этот т.н. POSIX style структур с переменным размером лично меня напрягает. Но уж так повелось. Добавлено P.S. Можно накидать макрос, чтоб каждый раз портянки не писать. Что-то типа #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 плюсовое :: не работает, не помню, то вот так должно: #define GET_VARIADIC_ARRAY_SIZE(str, field, num) (sizeof(str) - sizeof(((str*)0)->field) + sizeof(((str*)0)->field[0]) * (num)) |
Сообщ.
#7
,
|
|
|
Вроде обращение к nullptr даже внутри sizeof - это UB. В исходниках линуха это везде и был лютый срач на эту тему.
|
Сообщ.
#8
,
|
|
|
Не-а. По современному Стандарту к UB ведёт не разыменование nullptr, а использование разыменования. По Стандарту же sizeof обязан отрабатывать на этапе компиляции, поэтому в исполняемом образе будет уже готовый результат sizeof. Из чего следует, что результат разыменования не используется.
|