Форум: "WinAPI";
Текущий архив: 2002.11.18;
Скачать: [xml.tar.bz2];
ВнизКак выключить блок АТХ под Windows XP Найти похожие ветки
← →
@lexey (2002-09-23 22:44) [0]Вот так я пытаюсь перезагрузить или выключить компьютер в Windows XP. Работает на ура! НО! Не могу выключить блок ATX!!!
Кто знает прошу помощи. Заранее спасибо!
procedure Shutdown(Name:String; // Имя машины (\\SERVER)
msg:String; // Сообщение
Delay:Integer; // Задержка перед рестартом
CloseAll,
Restart:Boolean);
var
ph:THandle;
tp,prevst:TTokenPrivileges;
results:Cardinal;
begin
OpenProcessToken(GetCurrentProcess,TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY,ph);
LookupPrivilegeValue(nil,"SeShutdownPrivilege",tp.Privileges[0].Luid);
tp.PrivilegeCount:=1;
tp.Privileges[0].Attributes:=2;
AdjustTokenPrivileges(ph,FALSE,tp,SizeOf(prevst),prevst,results);
InitiateSystemShutdown(PChar(name),PChar(msg),Delay,CloseAll,Restart);
end;
← →
Song (2002-09-24 09:04) [1]Чтобы выключить локальную машину надо использовать ExitWindowsEx()
← →
@lexey (2002-09-24 23:59) [2]ExitWindowsEx работает только в Win32, а под NT или XP не работает, много раз пробовал.
← →
Song (2002-09-25 13:58) [3]Чтобы работал надо получить соответтсвующие привелегии. Подробности в FAQ.
← →
NeyroSpace (2002-09-25 17:35) [4]Есть API библ. для управлением питанием (винч, монитор, комп)
← →
@lexey (2002-09-26 23:10) [5]NeyroSpace, а не подскажешь какая? И где найти ее заголовочный файл?
Заранее спасибо!
Song, помоему я получил все привелегии. И еще раз повторяю функция ExitWindowsEx() не станет работать в NT.
← →
Song (2002-09-27 08:38) [6]2@lexey © (26.09.02 23:10)
А я Вам говорю, что работает.
← →
Vladimir Gorkov (2002-10-02 08:14) [7]Вот полностью рабочий код под все ОС.
Другое дело если имеется ввиду именно NT 4.0 то там нужно менять hal.dll
#define chINITSTRUCT(structure, fInitSize) \
(ZeroMemory(&(structure), sizeof(structure)), \
fInitSize ? (*(int*) &(structure) = sizeof(structure)) : 0)
#define STRICT
//#include <vcl\Condefs.h>
#include <windows.h>
//---------------------------------------------------------------------------
void ShowLastError();
int WINAPI WinMain (HINSTANCE , HINSTANCE , PSTR , int )
{
bool result;
LUID Luid; // address of locally unique identifier
HANDLE hToken;
HANDLE hProcess = GetCurrentProcess();
// Нужно сперва определить операционную систему.
// Если это NT то необходимо будет этому процессу получить привилегии
// для завершения работы системы. А если это клон 95 то можно сразу
// вызывать функцию завершения.
OSVERSIONINFO VerInfo; \
chINITSTRUCT(VerInfo, TRUE); \
GetVersionEx(&VerInfo); \
// Если это NT то получить права доступа
if (VerInfo.dwPlatformId == VER_PLATFORM_WIN32_NT)
{
result = OpenProcessToken(hProcess, TOKEN_ADJUST_PRIVILEGES, &hToken);
if (!result)
{
ShowLastError();
return 0;
}
result = LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME, &Luid);
if (!result)
{
ShowLastError();
return 0;
}
LUID_AND_ATTRIBUTES Privileges[1];
Privileges[0].Luid = Luid;
Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
TOKEN_PRIVILEGES tp;
tp.PrivilegeCount = 1;
tp.Privileges[0] = Privileges[0];
result = AdjustTokenPrivileges(
hToken, // handle to token that contains privileges
false, // flag for disabling all privileges
&tp, // pointer to new privilege information
NULL, // size, in bytes, of the PreviousState buffer
NULL, // receives original state of changed privileges
NULL // receives required size of the PreviousState buffer
);
if (!result)
{
ShowLastError();
return 0;
}
} // if (VerInfo.dwPlatformId == VER_PLATFORM_WIN32_NT)
result = ExitWindowsEx (EWX_POWEROFF, NULL);
if (!result)
{
ShowLastError();
} // if (!result)
return 0;
}
//--------------------------------------------------------------------
void ShowLastError()
{
LPVOID lpMsgBuf;
FormatMessage(
FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,
NULL,
GetLastError(),
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language
(LPTSTR) &lpMsgBuf,
0,
NULL );
// Display the string.
MessageBox( NULL, (LPTSTR)lpMsgBuf, "Error", MB_OK|MB_ICONINFORMATION );
// Free the buffer.
LocalFree( lpMsgBuf );
}
← →
han_malign (2002-10-02 10:11) [8]
;[ HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\Winlogon ]
;" PowerdownAfterShutdown "="1"
http://www.wintoun.fromru.com
← →
Udjin (2002-10-02 16:43) [9]Можно и так
procedure shutdown;
var
hToken:THandle;
tkp,PrevState:_TOKEN_PRIVILEGES;
k:DWORD;
begin
OpenProcessToken(GetCurrentProcess, TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY,hToken);
LookupPrivilegeValue(nil, "SeShutdownPrivilege", tkp.Privileges[0].Luid);
tkp.PrivilegeCount:=1;
tkp.Privileges[0].Attributes:=SE_PRIVILEGE_ENABLED;
AdjustTokenPrivileges(hToken, FALSE, tkp, SizeOf(PrevState), PrevState, k);
ExitWindowsEx(EWX_FORCE+EWX_SHUTDOWN,0);
end;
← →
vidiv (2002-10-08 09:05) [10]А я видал где-то код на асме, там блок просто берет и выключается, как будто из розетки выдернули, если кто знает дайте...
← →
biocron (2002-10-08 09:43) [11]ЕСть компонент AHM юзай его, там есть перезагрузка, работает под 2000 и 98, и скорее всего будет под XP
Страницы: 1 вся ветка
Форум: "WinAPI";
Текущий архив: 2002.11.18;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.007 c