Как анализировать DWORDs в JNA

#java #winapi #jna

#java #winapi #jna

Вопрос:

Я пытаюсь запросить статус службы Windows на Java, используя JNA. Я использую следующую функцию Windows API:

 QuerySerivceStatusEx( SC_HANDLE hService, SC_STATUS_TYPE InfoLevel, LPBYTE lpBuffer, DWORD cbBufSize, LPDWORD pcbBytesNeeded)
  

Внутри LPBYTE lpBuffer находится указатель на структуру. И внутри структуры он сохраняет текущее состояние как DWORD . Согласно документации JNA, DWORDs map into ints в Java, и согласно WinSvc.h, DWORD связанный с запуском, 0x00000004 поэтому в моем коде я определил окончательный int со значением 0x00000004 , подобным

 public static final int SERVICE_RUNNING = 0x00000004
  

Когда я запускаю код и служба, к которой я обращаюсь, запущена, я получаю обратно значение 16 , которое вообще не определено в WinSvc.h. Есть ли какой-то перевод, которого мне не хватает?

РЕДАКТИРОВАТЬ: Для ясности здесь приведены все состояния, в которых может находиться служба, и связанные с ними значения:

    public static final int SERVICE_STOPPED            = 0x00000001;
   public static final int SERVICE_START_PENDING      = 0x00000002;
   public static final int SERVICE_STOP_PENDING       = 0x00000003;
   public static final int SERVICE_RUNNING            = 0x00000004;
   public static final int SERVICE_CONTINUE_PENDING   = 0x00000005;
   public static final int SERVICE_PAUSE_PENDING      = 0x00000006;
   public static final int SERVICE_PAUSED             = 0x00000007;
  

Ответ №1:

В итоге я решил свою проблему. возвращалось 16 независимо от того, была ли запущена служба или остановлена. Как оказалось, у меня не было возвращаемой структуры, SERVICE_STATUS_PROCESS, определенной в том же порядке, в котором она определена в собственной библиотеке. Я не знал, что это необходимо сделать, но вам нужно определить свои структуры в том же порядке, в котором они находятся в машинном коде.

Ответ №2:

Подобные значения часто представляют собой множество значений флага или, объединенных вместе. например, чтобы указать как 4 , так и 2 флаг, вы получите 4 | 2 или 6 . Затем вы могли бы выяснить, какие флаги установлены, сопоставив результат ( 6 ) с каждым из флагов и посмотрев, верно ли это ( 6 amp; 4 или 6 amp; 2 было бы верно, но 6 amp; 1 не было бы, так что вы знаете, что флаги 4 и 2 установлены, но не 1 ).).

При этом 16 будет базовым значением (это степень 2), поэтому я не уверен.

Комментарии:

1. Я не думаю, что это имеет значение, поскольку в данном случае. Значения для состояний равны 1,2,3,4,5,6,7, что не помогло бы этой работе. Я отредактирую вопрос, чтобы уточнить

2. какая структура возвращается? можете ли вы дать ссылку на документы winapi?