Это отлично работает для меня в Windows 7 x64. Поскольку вы не отправляли никаких кодов, я понятия не имею, что вы делаете по-другому. Функция SetPrivilege
была скопирована с этой страницы MSDN: http://msdn.microsoft.com/en-us/library/windows/desktop/aa446619%28v=vs.85%29.aspx
Я запускаю shutdown, набрав это в командной строке: «shutdown/s/t 500000» и запуск программы отменяет ее.
#include <Windows.h>
#include <stdio.h>
BOOL SetPrivilege(HANDLE hToken, LPCTSTR lpszPrivilege, BOOL bEnablePrivilege)
{
TOKEN_PRIVILEGES tp;
LUID luid;
if (!LookupPrivilegeValue(NULL, lpszPrivilege, &luid))
{
printf("LookupPrivilegeValue error: %u\n", GetLastError());
return FALSE;
}
tp.PrivilegeCount = 1;
tp.Privileges[0].Luid = luid;
tp.Privileges[0].Attributes = bEnablePrivilege ? SE_PRIVILEGE_ENABLED : 0;
if (!AdjustTokenPrivileges(hToken, FALSE, &tp, sizeof(TOKEN_PRIVILEGES), (PTOKEN_PRIVILEGES) NULL, (PDWORD) NULL))
{
printf("AdjustTokenPrivileges error: %u\n", GetLastError());
return FALSE;
}
if (GetLastError() == ERROR_NOT_ALL_ASSIGNED)
{
printf("The token does not have the specified privilege. \n");
return FALSE;
}
return TRUE;
}
int main()
{
HANDLE hToken;
OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, &hToken);
if(!SetPrivilege(hToken, SE_SHUTDOWN_NAME, TRUE))
{
printf("Could not adjust privileges\n");
}
if(!AbortSystemShutdown(NULL))
{
printf("AbortSystemShutdown failed (%08x)", GetLastError());
}
CloseHandle(hToken);
return 0;
}
Вы проверяете, что возвращает GetLastError(), когда AbortSystemShutdown() возвращает 0? –
Я получаю 0x0000045C Я думаю, что это «Невозможно прервать выключение системы, потому что не было выключения». Черт, я был уверен, что у меня это работает до победы 7 .... – VisaToHell
Может быть, я могу заставить его работать с некоторыми настройка ключей реестра? – VisaToHell