WTSApi и Exception

Тема в разделе "WASM.WIN32", создана пользователем M0rg0t, 28 мар 2021.

  1. M0rg0t

    M0rg0t Well-Known Member

    Публикаций:
    0
    Регистрация:
    18 окт 2010
    Сообщения:
    1.576
    Есть, к примеру, такой код
    Код (ASM):
    1. invoke WTSShutdownSystem,0,WTS_WSD_REBOOT
    т.е. ребут сервера. Работает через раз, на некоторых машинах прога завершается с эксепшном 0x6ba, гугл говорит что это RPC_S_Server_Unavailable.

    Мсдн говорит, что для этих апи нужна запущена служба терминалов. Но как именно она называется?? Пробовал вручную включать все службы со словом терминал rdp и прочее, все равно ошибка остается.

    Если потрейсить функцию WTSShutdownSystem , то видно что она подгружает winsta.dll. Вспомнив советы Indy_ , что надо юзать натив, переписал код на invoke WinStationShutdownSystem (параметры те же), и чудо, все заработало.

    Но все таки интересно разобраться, почему винапи не работает.
     
  2. Thetrik

    Thetrik UA6527P

    Публикаций:
    0
    Регистрация:
    25 июл 2011
    Сообщения:
    875
    Параметры не те же (как минимум в Win7 x64):
    Код (C):
    1. BOOL __stdcall WTSShutdownSystem(HANDLE hServer, DWORD ShutdownFlag)
    2. {
    3.   DWORD dwNativeFlags; // eax MAPDST
    4.  
    5.   if ( hServer || CheckShutdownPrivilege() )
    6.   {
    7.     dwNativeFlags = ShutdownFlag;
    8.     if ( ShutdownFlag != WTS_WSD_LOGOFF )
    9.     {
    10.       switch ( ShutdownFlag )
    11.       {
    12.         case WTS_WSD_SHUTDOWN:
    13.           dwNativeFlags = 3;
    14.           break;
    15.         case WTS_WSD_REBOOT:
    16.           dwNativeFlags = 7;
    17.           break;
    18.         case WTS_WSD_POWEROFF:
    19.           dwNativeFlags = 11;
    20.           break;
    21.         case WTS_WSD_FASTREBOOT:
    22.           dwNativeFlags = 20;
    23.           break;
    24.         default:
    25.           SetLastError(ERROR_INVALID_PARAMETER);
    26.           return 0;
    27.       }
    28.     }
    29.     return (unsigned __int8)WinStationShutdownSystem(hServer, dwNativeFlags);
    30.   }
    31.   SetLastError(ERROR_PRIVILEGE_NOT_HELD);
    32.   return 0;
    33. }
    --- Сообщение объединено, 28 мар 2021 ---
    Ctx_WinStation_API_serviceTerminal Services remote managementtermsrv.exe5ca4a760-ebb1-11cf-8611-00a0245420ed
     
    M0rg0t нравится это.
  3. Indy_

    Indy_ Well-Known Member

    Публикаций:
    4
    Регистрация:
    29 апр 2011
    Сообщения:
    4.775
    M0rg0t,

    Я бы такое не юзал, сомнительная не надёжная апи. Для поддержки нужна куча условий служб всяких, не годится. Да и вообще это всё столь нестабильно из за толщины эти RPC интерфейсы, отвалиться оно может в любой момент на чём угодно.
     
    M0rg0t нравится это.
  4. M0rg0t

    M0rg0t Well-Known Member

    Публикаций:
    0
    Регистрация:
    18 окт 2010
    Сообщения:
    1.576
    Thetrik, откуда ты это взял? Просто я смотрел сорцы процесс хакера, и там
    Код (Text):
    1. // Flags for WinStationShutdownSystem
    2. #define WSD_LOGOFF 0x1
    3. #define WSD_SHUTDOWN 0x2
    4. #define WSD_REBOOT 0x4
    5. #define WSD_POWEROFF 0x8
    Indy_, по свисте - это какой-то бред, ошибка мсдн, т.к. апи есть на ХР (по крайней мере, на вин2к3 отрабатывает). Но вообще да, вижу что лучше юзать натив, тем более что тут он дублируется. Странно, что натив апи Winsta не документированы вообще.
     
  5. Thetrik

    Thetrik UA6527P

    Публикаций:
    0
    Регистрация:
    25 июл 2011
    Сообщения:
    875
    Я взял это из декомпилированного кода функции WTSShutdownSystem. Функция модифицирует просто флаги (к примеру когда вызываешь WTS_WSD_SHUTDOWN то она устанавливает WSD_LOGOFF | WSD_SHUTDOWN .
    WinStationShutdownSystem в свою очередь коннектится к службе termsrv и вызывает RpcWinStationShutdownSystem с флагами dwNativeFlags, где вызывает InitiateSystemShutdownEx.
     
  6. M0rg0t

    M0rg0t Well-Known Member

    Публикаций:
    0
    Регистрация:
    18 окт 2010
    Сообщения:
    1.576
    Thetrik, не могу все равно запустить службу, пишет что служба работает, а ошибка дальше есть.
     
  7. M0rg0t

    M0rg0t Well-Known Member

    Публикаций:
    0
    Регистрация:
    18 окт 2010
    Сообщения:
    1.576
    Потратил вместе с Thetrik весь день, но разобрался. Спасибо. Дело не в натив апи.
    Если кто будет гуглить - нужно поменять в реестре параметр AllowRemoteRPC на 1, на 2к8 поменять еще и StartRCM на 1, и запускать от админа. Должна быть запущена служба termsvc.
    --- Сообщение объединено, 29 мар 2021 ---
    винда тогда создает пайп \PIPE\TermSrv_API_service , куда все эти WTS апи походу отправляют RPC запросы