All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.sun.jna.platform.win32.W32ServiceManager Maven / Gradle / Ivy

There is a newer version: 5.15.0
Show newest version
/* Copyright (c) 2010 EugineLev, All Rights Reserved
 *
 * The contents of this file is dual-licensed under 2
 * alternative Open Source/Free licenses: LGPL 2.1 or later and
 * Apache License 2.0. (starting with JNA version 4.0.0).
 *
 * You can freely decide which license you want to apply to
 * the project.
 *
 * You may obtain a copy of the LGPL License at:
 *
 * http://www.gnu.org/licenses/licenses.html
 *
 * A copy is also included in the downloadable source code package
 * containing JNA, in file "LGPL2.1".
 *
 * You may obtain a copy of the Apache License at:
 *
 * http://www.apache.org/licenses/
 *
 * A copy is also included in the downloadable source code package
 * containing JNA, in file "AL2.0".
 */

package com.sun.jna.platform.win32;

import com.sun.jna.Memory;
import com.sun.jna.Pointer;
import com.sun.jna.Structure;
import com.sun.jna.platform.win32.Winsvc.ENUM_SERVICE_STATUS_PROCESS;
import com.sun.jna.platform.win32.Winsvc.SC_HANDLE;
import com.sun.jna.ptr.IntByReference;
import java.io.Closeable;

/**
 * Win32 Service Manager wrapper
 * @author EugineLev
 */
public class W32ServiceManager implements Closeable {
    SC_HANDLE _handle = null;
    String _machineName = null;
    String _databaseName = null;

    /**
     * Instantiate a W32ServiceManager for the local computer and the
     * SERVICES_ACTIVE_DATABASE ("ServicesActive") database.
     * 

*

* The connection is not established until {@link #open(int)} is called.

*/ public W32ServiceManager() { } /** * Instantiate a W32ServiceManager for the local computer and the * SERVICES_ACTIVE_DATABASE ("ServicesActive") database. *

*

* A connection is opened directly with the requested permissions.

* * @param permissions requested permissions for access */ public W32ServiceManager(int permissions) { open(permissions); } /** * Instantiate a W32ServiceManager. * * @param machineName The name of the target computer. If the pointer is * NULL or points to an empty string, the function * connects to the service control manager on the local * computer. * @param databaseName The name of the service control manager database. * This parameter should be set to "ServicesActive". If * it is NULL, the "ServicesActive" * (SERVICES_ACTIVE_DATABASE) database is opened by * default. *

* The connection is not established until {@link #open(int)} is called.

*/ public W32ServiceManager(String machineName, String databaseName) { _machineName = machineName; _databaseName = databaseName; } /** * Instantiate a W32ServiceManager. *

*

* A connection is opened directly with the requested permissions.

* * @param machineName The name of the target computer. If the pointer is * NULL or points to an empty string, the function * connects to the service control manager on the local * computer. * @param databaseName The name of the service control manager database. * This parameter should be set to "ServicesActive". If * it is NULL, the "ServicesActive" * (SERVICES_ACTIVE_DATABASE) database is opened by * default. * @param permissions requested permissions for access */ public W32ServiceManager(String machineName, String databaseName, int permissions) { _machineName = machineName; _databaseName = databaseName; open(permissions); } /** * (Re-)Opens the Service Manager with the supplied permissions. * * @param permissions Permissions. */ public void open(int permissions) { close(); _handle = Advapi32.INSTANCE.OpenSCManager( _machineName, _databaseName, permissions); if (_handle == null) { throw new Win32Exception(Kernel32.INSTANCE.GetLastError()); } } /** * Closes the previously opened Service Manager. */ @Override public void close() { if (_handle != null) { if (!Advapi32.INSTANCE.CloseServiceHandle(_handle)) { throw new Win32Exception(Kernel32.INSTANCE.GetLastError()); } _handle = null; } } /** * Opens a Service. * * @param serviceName Service name. * @param permissions Permissions. * * @return Returns an opened service. */ public W32Service openService(String serviceName, int permissions) { SC_HANDLE serviceHandle = Advapi32.INSTANCE.OpenService( _handle, serviceName, permissions); if (serviceHandle == null) { throw new Win32Exception(Kernel32.INSTANCE.GetLastError()); } return new W32Service(serviceHandle); } /** * Gets the service manager handle. * * @return Returns the service manager handle. */ public SC_HANDLE getHandle() { return _handle; } /** * Enumerates services in the specified service control manager database. * The name and status of each service are provided, along with additional * data based on the specified information level. * * @param dwServiceType The type of services to be enumerated. This * parameter can be one or more of the following * values. * * * * * * * * * *
ValueMeaning
{@link WinNT#SERVICE_DRIVER}Services of type * {@link WinNT#SERVICE_KERNEL_DRIVER} and * {@link WinNT#SERVICE_FILE_SYSTEM_DRIVER}.
{@link WinNT#SERVICE_FILE_SYSTEM_DRIVER}File system * driver services.
{@link WinNT#SERVICE_KERNEL_DRIVER}Driver * services.
{@link WinNT#SERVICE_WIN32}Services of type * {@link WinNT#SERVICE_WIN32_OWN_PROCESS} and * {@link WinNT#SERVICE_WIN32_SHARE_PROCESS}.
{@link WinNT#SERVICE_WIN32_OWN_PROCESS}Services that run * in their own processes.
{@link WinNT#SERVICE_WIN32_SHARE_PROCESS}Services that * share a process with one or more other services. For more information, * see Service Programs.
* * @param dwServiceState The state of the services to be enumerated. This * parameter can be one of the following values. * * * * * *
ValueMeaning
{@link Winsvc#SERVICE_ACTIVE}Enumerates services that * are in the following states: * {@link Winsvc#SERVICE_START_PENDING}, {@link Winsvc#SERVICE_STOP_PENDING}, {@link Winsvc#SERVICE_RUNNING}, {@link Winsvc#SERVICE_CONTINUE_PENDING}, {@link Winsvc#SERVICE_PAUSE_PENDING}, * and {@link Winsvc#SERVICE_PAUSED}.
{@link Winsvc#SERVICE_INACTIVE}Enumerates services that * are in the {@link Winsvc#SERVICE_STOPPED} state.
{@link Winsvc#SERVICE_STATE_ALL}Combines the following * states: {@link Winsvc#SERVICE_ACTIVE} and * {@link Winsvc#SERVICE_INACTIVE}.
* @param groupName The load-order group name. If this parameter is a * string, the only services enumerated are those that * belong to the group that has the name specified by * the string. If this parameter is an empty string, * only services that do not belong to any group are * enumerated. If this parameter is NULL, group * membership is ignored and all services are * enumerated. * * @return array of ENUM_SERVICE_STATUS_PROCESS structures. */ public ENUM_SERVICE_STATUS_PROCESS[] enumServicesStatusExProcess(int dwServiceType, int dwServiceState, String groupName) { IntByReference pcbBytesNeeded = new IntByReference(0); IntByReference lpServicesReturned = new IntByReference(0); IntByReference lpResumeHandle = new IntByReference(0); Advapi32.INSTANCE.EnumServicesStatusEx(_handle, Winsvc.SC_ENUM_PROCESS_INFO, dwServiceType, dwServiceState, Pointer.NULL, 0, pcbBytesNeeded, lpServicesReturned, lpResumeHandle, groupName); int lastError = Kernel32.INSTANCE.GetLastError(); if (lastError != WinError.ERROR_MORE_DATA) { throw new Win32Exception(lastError); } Memory buffer = new Memory(pcbBytesNeeded.getValue()); boolean result = Advapi32.INSTANCE.EnumServicesStatusEx(_handle, Winsvc.SC_ENUM_PROCESS_INFO, dwServiceType, dwServiceState, buffer, (int) buffer.size(), pcbBytesNeeded, lpServicesReturned, lpResumeHandle, groupName); if (!result) { throw new Win32Exception(Kernel32.INSTANCE.GetLastError()); } if (lpServicesReturned.getValue() == 0) { return new Winsvc.ENUM_SERVICE_STATUS_PROCESS[0]; } ENUM_SERVICE_STATUS_PROCESS status = Structure.newInstance(ENUM_SERVICE_STATUS_PROCESS.class, buffer); status.read(); return (ENUM_SERVICE_STATUS_PROCESS[]) status.toArray(lpServicesReturned.getValue()); } }




© 2015 - 2024 Weber Informatics LLC | Privacy Policy