MCPcopy Create free account
hub / github.com/PowerShell/DSC / enumerate_services

Function enumerate_services

resources/windows_service/src/service.rs:434–509  ·  view source on GitHub ↗

Enumerate all Win32 services using `EnumServicesStatusExW`, handling pagination. Returns a list of `(service_name, current_state)` tuples.

(scm: SC_HANDLE)

Source from the content-addressed store, hash-verified

432/// Enumerate all Win32 services using `EnumServicesStatusExW`, handling pagination.
433/// Returns a list of `(service_name, current_state)` tuples.
434unsafe fn enumerate_services(scm: SC_HANDLE) -> Result<Vec<(String, SERVICE_STATUS_CURRENT_STATE)>, ServiceError> {
435 unsafe {
436 let mut all_services = Vec::new();
437 let mut bytes_needed: u32 = 0;
438 let mut services_returned: u32 = 0;
439 let mut resume_handle: u32 = 0;
440
441 // Sizing call to determine required buffer size
442 let sizing_result = EnumServicesStatusExW(
443 scm,
444 SC_ENUM_PROCESS_INFO,
445 SERVICE_WIN32,
446 SERVICE_STATE_ALL,
447 None,
448 &mut bytes_needed,
449 &mut services_returned,
450 Some(&mut resume_handle),
451 None,
452 );
453
454 if let Err(e) = sizing_result
455 && e.code() != ERROR_MORE_DATA.to_hresult()
456 && e.code() != ERROR_INSUFFICIENT_BUFFER.to_hresult() {
457 return Err(t!("export.enumServicesFailed", error = e.to_string()).to_string().into());
458 }
459
460 if bytes_needed == 0 {
461 return Ok(Vec::new());
462 }
463
464 resume_handle = 0;
465
466 loop {
467 let mut buffer = vec![0u8; bytes_needed as usize];
468 services_returned = 0;
469
470 let result = EnumServicesStatusExW(
471 scm,
472 SC_ENUM_PROCESS_INFO,
473 SERVICE_WIN32,
474 SERVICE_STATE_ALL,
475 Some(&mut buffer),
476 &mut bytes_needed,
477 &mut services_returned,
478 Some(&mut resume_handle),
479 None,
480 );
481
482 if services_returned > 0 {
483 let entries = std::slice::from_raw_parts(
484 buffer.as_ptr().cast::<ENUM_SERVICE_STATUS_PROCESSW>(),
485 services_returned as usize,
486 );
487
488 for entry in entries {
489 if let Ok(name) = entry.lpServiceName.to_string() {
490 all_services.push((name, entry.ServiceStatusProcess.dwCurrentState));
491 }

Callers 1

export_servicesFunction · 0.85

Calls 1

newFunction · 0.50

Tested by

no test coverage detected