• Познакомьтесь с пентестом веб-приложений на практике в нашем новом бесплатном курсе

    «Анализ защищенности веб-приложений»

    🔥 Записаться бесплатно!

  • CTF с учебными материалами Codeby Games

    Обучение кибербезопасности в игровой форме. Более 200 заданий по Active Directory, OSINT, PWN, Веб, Стеганографии, Реверс-инжинирингу, Форензике и Криптографии. Школа CTF с бесплатными курсами по всем категориям.

SetSystemPowerState - в чем я неправ?

  • Автор темы vitfil
  • Дата начала
V

vitfil

Код:
#include<windows.h>

void main(){
if (SetSystemPowerState(false,true)){
  return;
}
return;
}

компилится без ошибок (компилятор от борланда). Запускаю программу - ничего не происходит. в чем я не прав?
 
A

admin

vitfil
так а привелегий хватает? и ACPI настроено нормально?
 
S

Serge

Вообще тут может следующее:
SetSystemPowerState сработает тогда, когда все задачи подтвердят о готовности прекратить работу, но если этого не происходит, то она возвращает false и посылает всем приложениям и драйверам сообщение, PBT_APMQUERYSUSPENDFAILED, уведомляющее все приложения о том, что остановка отклонена каким либо приложением или драйвером. Просто, попробуйте выполнить SetSystemPowerState(false,false), а когда она вернет истину, выполните с SetSystemPowerState(false,true). Если так не сработает, то у вас на машине висит программа, которая постоянно задействует процессор в привилегии выше средней. Думаю, что так.
 
V

vitfil

С этим уже разобрался. привелегий не хватало. кому интересно:
Код:
#include <stdio.h>
#include <windows.h>
#include <tlhelp32.h>
#include <vdmdbg.h>
#include <tchar.h>
#include <process.h> 
BOOL MySystemSleep()
{
 HANDLE hToken;
 TOKEN_PRIVILEGES tkp;

 BOOL fResult;

 if (!OpenProcessToken(GetCurrentProcess(),
   TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken))
  return FALSE;

 LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME,
   &tkp.Privileges[0].Luid);

 tkp.PrivilegeCount = 1;
 tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;

 AdjustTokenPrivileges(hToken, FALSE, &tkp, 0,
  (PTOKEN_PRIVILEGES) NULL, 0);

 if (GetLastError() != ERROR_SUCCESS)
  return FALSE;

 fResult = SetSystemPowerState(FALSE,TRUE);

 if (!fResult)
  return FALSE;

 tkp.Privileges[0].Attributes = 0;
 AdjustTokenPrivileges(hToken, FALSE, &tkp, 0,
   (PTOKEN_PRIVILEGES) NULL, 0);

 return TRUE;
}
int main(){
if (MySystemSleep())
return 0;
return 1;
}

Теперь вопрос в другом. Как обновить трей? Пробовал:
Код:
HWND
hWnd(FindWindowEx(FindWindowEx(FindWindow("Shell_TrayWnd", ""), 0, "TrayNotifyWnd", ""), 0, "ToolbarWindow32", ""));
for ( int xx(2+8), yy(2+8); xx < 1024; xx += 16 ){
 PostMessage(hWnd, WM_MOUSEMOVE, 0, MAKELPARAM(xx, yy));
}
В 2000 работает, а в ХР - нет.
 
S

Serge

Может попробовать через SendMessage, для пущей убедительности в критические секции загнать?
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!