Есть, к примеру, такой код Код (ASM): invoke WTSShutdownSystem,0,WTS_WSD_REBOOT т.е. ребут сервера. Работает через раз, на некоторых машинах прога завершается с эксепшном 0x6ba, гугл говорит что это RPC_S_Server_Unavailable. Мсдн говорит, что для этих апи нужна запущена служба терминалов. Но как именно она называется?? Пробовал вручную включать все службы со словом терминал rdp и прочее, все равно ошибка остается. Если потрейсить функцию WTSShutdownSystem , то видно что она подгружает winsta.dll. Вспомнив советы Indy_ , что надо юзать натив, переписал код на invoke WinStationShutdownSystem (параметры те же), и чудо, все заработало. Но все таки интересно разобраться, почему винапи не работает.
Параметры не те же (как минимум в Win7 x64): Код (C): BOOL __stdcall WTSShutdownSystem(HANDLE hServer, DWORD ShutdownFlag) { DWORD dwNativeFlags; // eax MAPDST if ( hServer || CheckShutdownPrivilege() ) { dwNativeFlags = ShutdownFlag; if ( ShutdownFlag != WTS_WSD_LOGOFF ) { switch ( ShutdownFlag ) { case WTS_WSD_SHUTDOWN: dwNativeFlags = 3; break; case WTS_WSD_REBOOT: dwNativeFlags = 7; break; case WTS_WSD_POWEROFF: dwNativeFlags = 11; break; case WTS_WSD_FASTREBOOT: dwNativeFlags = 20; break; default: SetLastError(ERROR_INVALID_PARAMETER); return 0; } } return (unsigned __int8)WinStationShutdownSystem(hServer, dwNativeFlags); } SetLastError(ERROR_PRIVILEGE_NOT_HELD); return 0; } --- Сообщение объединено, 28 мар 2021 --- Ctx_WinStation_API_serviceTerminal Services remote managementtermsrv.exe5ca4a760-ebb1-11cf-8611-00a0245420ed
M0rg0t, Я бы такое не юзал, сомнительная не надёжная апи. Для поддержки нужна куча условий служб всяких, не годится. Да и вообще это всё столь нестабильно из за толщины эти RPC интерфейсы, отвалиться оно может в любой момент на чём угодно.
Thetrik, откуда ты это взял? Просто я смотрел сорцы процесс хакера, и там Код (Text): // Flags for WinStationShutdownSystem #define WSD_LOGOFF 0x1 #define WSD_SHUTDOWN 0x2 #define WSD_REBOOT 0x4 #define WSD_POWEROFF 0x8 Indy_, по свисте - это какой-то бред, ошибка мсдн, т.к. апи есть на ХР (по крайней мере, на вин2к3 отрабатывает). Но вообще да, вижу что лучше юзать натив, тем более что тут он дублируется. Странно, что натив апи Winsta не документированы вообще.
Я взял это из декомпилированного кода функции WTSShutdownSystem. Функция модифицирует просто флаги (к примеру когда вызываешь WTS_WSD_SHUTDOWN то она устанавливает WSD_LOGOFF | WSD_SHUTDOWN . WinStationShutdownSystem в свою очередь коннектится к службе termsrv и вызывает RpcWinStationShutdownSystem с флагами dwNativeFlags, где вызывает InitiateSystemShutdownEx.
Потратил вместе с Thetrik весь день, но разобрался. Спасибо. Дело не в натив апи. Если кто будет гуглить - нужно поменять в реестре параметр AllowRemoteRPC на 1, на 2к8 поменять еще и StartRCM на 1, и запускать от админа. Должна быть запущена служба termsvc. --- Сообщение объединено, 29 мар 2021 --- винда тогда создает пайп \PIPE\TermSrv_API_service , куда все эти WTS апи походу отправляют RPC запросы