Структура является blitable. Код Pinvoke и структура генерируются с помощью CsWin32. Спасибо за любую помощь, связанную с этим
Код: Выделить всё
internal static unsafe IEnumerable GetAllServices(this CloseServiceHandleSafeHandle serviceManagerHandle, string? group)
{
ArgumentNullException.ThrowIfNull(serviceManagerHandle);
var data = new List();
var serviceManagerHandleAddRef = false;
try
{
serviceManagerHandle.DangerousAddRef(ref serviceManagerHandleAddRef);
bool moreData;
uint bytesNeeded = 0, resumeHandle = 0, servicesReturned = 0;
do
{
moreData = false;
var bufferData = new byte[bytesNeeded];
fixed (byte* ptrBufferData = bufferData)
{
fixed (char* ptrGroup = group)
{
if (!PInvokeCore.EnumServicesStatusEx((SC_HANDLE)serviceManagerHandle.DangerousGetHandle(), SC_ENUM_TYPE.SC_ENUM_PROCESS_INFO, ENUM_SERVICE_TYPE.SERVICE_WIN32_OWN_PROCESS, ENUM_SERVICE_STATE.SERVICE_STATE_ALL, ptrBufferData, (uint)bufferData.Length, &bytesNeeded, &servicesReturned, &resumeHandle, ptrGroup))
{
if (Marshal.GetLastPInvokeError() != (uint)WIN32_ERROR.ERROR_MORE_DATA)
throw new Exception($"Could not enumerate services. {Marshal.GetLastPInvokeErrorMessage()}");
else
moreData = true;
}
}
for (var i = 0; i < servicesReturned; i++)
{
ENUM_SERVICE_STATUS_PROCESSW element = ((ENUM_SERVICE_STATUS_PROCESSW*)ptrBufferData)[i];
data.Add(element);
}
}
} while (moreData);
}
finally
{
if (serviceManagerHandleAddRef)
serviceManagerHandle.DangerousRelease();
}
return data;
}
Подробнее здесь: https://stackoverflow.com/questions/791 ... in-c-sharp
Мобильная версия