From b223ed233e897bff211b905d871603b7e51e9c98 Mon Sep 17 00:00:00 2001 From: hakril Date: Tue, 5 Jun 2018 11:59:06 +0200 Subject: [PATCH] Fix stuff in service.py + update test --- tests/test_evtlog.py | 2 -- tests/test_service.py | 21 +++++++++++++++++++++ tests/test_system.py | 6 ------ windows/winobject/service.py | 36 ++++++++++++++++-------------------- 4 files changed, 37 insertions(+), 28 deletions(-) create mode 100644 tests/test_service.py diff --git a/tests/test_evtlog.py b/tests/test_evtlog.py index f8480a3..bdc7fd3 100644 --- a/tests/test_evtlog.py +++ b/tests/test_evtlog.py @@ -1,6 +1,4 @@ import pytest -import subprocess -import os.path import windows import windows.generated_def as gdef diff --git a/tests/test_service.py b/tests/test_service.py new file mode 100644 index 0000000..828d017 --- /dev/null +++ b/tests/test_service.py @@ -0,0 +1,21 @@ +import pytest + +import windows +import windows.generated_def as gdef + + +def test_services_process(): + services_with_process = [s for s in windows.system.services if s.ServiceStatusProcess.dwProcessId] + service = services_with_process[0] + proc = service.process + assert proc.pid == service.ServiceStatusProcess.dwProcessId + + +def test_service_appinfo(): + appinfos = [x for x in windows.system.services if x.name == "Appinfo"] + assert len(appinfos) == 1 + appinfo = appinfos[0] + assert appinfo.status.type & gdef.SERVICE_WIN32_OWN_PROCESS + # Check other fields + assert appinfo.name == "Appinfo" + assert appinfo.description == "Application Information" \ No newline at end of file diff --git a/tests/test_system.py b/tests/test_system.py index 5340f2e..49df96c 100644 --- a/tests/test_system.py +++ b/tests/test_system.py @@ -17,12 +17,6 @@ class TestSystemWithCheckGarbage(object): def test_services(self): return windows.system.services - def test_services_process(self): - services_with_process = [s for s in windows.system.services if s.ServiceStatusProcess.dwProcessId] - service = services_with_process[0] - proc = service.process - assert proc.pid == service.ServiceStatusProcess.dwProcessId - def test_logicaldrives(self): return windows.system.logicaldrives diff --git a/windows/winobject/service.py b/windows/winobject/service.py index e7e5475..3f15367 100644 --- a/windows/winobject/service.py +++ b/windows/winobject/service.py @@ -112,25 +112,21 @@ def scmanagera(access): windows.winproxy.CloseServiceHandle(scmanager) def enumerate_services(): - # TODO: fix this so we don't have a scmanager leak.. - scmanager = windows.winproxy.OpenSCManagerA(dwDesiredAccess=SC_MANAGER_ENUMERATE_SERVICE) - - size_needed = DWORD() - nb_services = DWORD() - counter = DWORD() - try: - windows.winproxy.EnumServicesStatusExA(scmanager, SC_ENUM_PROCESS_INFO, SERVICE_TYPE_ALL, SERVICE_STATE_ALL, None, 0, ctypes.byref(size_needed), ctypes.byref(nb_services), byref(counter), None) - except WindowsError: - pass - - while True: - size = size_needed.value - buffer = (BYTE * size)() - + with scmanagera(SC_MANAGER_ENUMERATE_SERVICE) as scm: + size_needed = DWORD() + nb_services = DWORD() + counter = DWORD() try: - windows.winproxy.EnumServicesStatusExA(scmanager, SC_ENUM_PROCESS_INFO, SERVICE_TYPE_ALL, SERVICE_STATE_ALL, buffer, size, ctypes.byref(size_needed), ctypes.byref(nb_services), byref(counter), None) - except WindowsError as e: - continue + windows.winproxy.EnumServicesStatusExA(scm, SC_ENUM_PROCESS_INFO, SERVICE_TYPE_ALL, SERVICE_STATE_ALL, None, 0, ctypes.byref(size_needed), ctypes.byref(nb_services), byref(counter), None) + except WindowsError: + pass - return_type = (ServiceA * nb_services.value) - return list(return_type.from_buffer(buffer)) \ No newline at end of file + while True: + size = size_needed.value + buffer = (BYTE * size)() + try: + windows.winproxy.EnumServicesStatusExA(scm, SC_ENUM_PROCESS_INFO, SERVICE_TYPE_ALL, SERVICE_STATE_ALL, buffer, size, ctypes.byref(size_needed), ctypes.byref(nb_services), byref(counter), None) + except WindowsError as e: + continue + return_type = (ServiceA * nb_services.value) + return list(return_type.from_buffer(buffer)) \ No newline at end of file