/// <summary>
        /// 遍历从属服务
        /// </summary>
        /// <param name="serviceHandle"></param>
        /// <param name="state">选择性遍历(活动、非活动、全部)</param>
        private static string[] EnumDependentServices(IntPtr serviceHandle, EnumServiceState state)
        {
            int bytesNeeded   = 0; //存放从属服务的空间大小,由API返回
            int numEnumerated = 0; //从属服务数,由API返回

            //先尝试以空结构获取,如获取成功说明从属服务为空,否则拿到上述俩值
            if (Win32Class.EnumDependentServices(serviceHandle, state, IntPtr.Zero, 0, ref bytesNeeded, ref numEnumerated))
            {
                return(new string[0]);
            }
            if (Marshal.GetLastWin32Error() != 0xEA) //仅当错误值不是大小不够(ERROR_MORE_DATA)时才抛异常
            {
                throw new Win32Exception();
            }

            //在非托管区域创建指针
            IntPtr structsStart = Marshal.AllocHGlobal(new IntPtr(bytesNeeded));

            try
            {
                //往上述指针处塞存放从属服务的结构组,每个从属服务是一个结构
                if (!Win32Class.EnumDependentServices(serviceHandle, state, structsStart, bytesNeeded, ref bytesNeeded, ref numEnumerated))
                {
                    throw new Win32Exception();
                }

                string[] dependentServices   = new string[numEnumerated];
                int      sizeOfStruct        = Marshal.SizeOf(typeof(Win32Class.ENUM_SERVICE_STATUS)); //每个结构的大小
                long     structsStartAsInt64 = structsStart.ToInt64();
                for (int i = 0; i < numEnumerated; i++)
                {
                    Win32Class.ENUM_SERVICE_STATUS structure = new Win32Class.ENUM_SERVICE_STATUS();
                    IntPtr ptr = new IntPtr(structsStartAsInt64 + i * sizeOfStruct); //根据起始指针、结构次序和结构大小推算各结构起始指针
                    Marshal.PtrToStructure(ptr, structure);                          //根据指针拿到结构
                    dependentServices[i] = structure.serviceName;                    //从结构中拿到服务名
                }

                return(dependentServices);
            }
            finally
            {
                Marshal.FreeHGlobal(structsStart);
            }
        }
示例#2
0
 /// <summary>
 /// 遍历从属服务
 /// </summary>
 /// <param name="serviceHandle"></param>
 /// <param name="state">选择性遍历(活动、非活动、全部)</param>
 private static string[] EnumDependentServices(IntPtr serviceHandle, EnumServiceState state)
 {
     int bytesNeeded = 0; //存放从属服务的空间大小,由API返回
     int numEnumerated = 0; //从属服务数,由API返回
     //先尝试以空结构获取,如获取成功说明从属服务为空,否则拿到上述俩值
     if (Win32Class.EnumDependentServices(serviceHandle, state, IntPtr.Zero, 0, ref bytesNeeded, ref numEnumerated))
     {
         return new string[0];
     }
     if (Marshal.GetLastWin32Error() != 0xEA) //仅当错误值不是大小不够(ERROR_MORE_DATA)时才抛异常
     {
         throw new Win32Exception();
     }
     //在非托管区域创建指针
     IntPtr structsStart = Marshal.AllocHGlobal(new IntPtr(bytesNeeded));
     try
     {
         //往上述指针处塞存放从属服务的结构组,每个从属服务是一个结构
         if (!Win32Class.EnumDependentServices(serviceHandle, state, structsStart, bytesNeeded, ref bytesNeeded, ref numEnumerated))
         {
             throw new Win32Exception();
         }
         string[] dependentServices = new string[numEnumerated];
         int sizeOfStruct = Marshal.SizeOf(typeof(Win32Class.ENUM_SERVICE_STATUS)); //每个结构的大小
         long structsStartAsInt64 = structsStart.ToInt64();
         for (int i = 0; i < numEnumerated; i++)
         {
             Win32Class.ENUM_SERVICE_STATUS structure = new Win32Class.ENUM_SERVICE_STATUS();
             IntPtr ptr = new IntPtr(structsStartAsInt64 + i * sizeOfStruct); //根据起始指针、结构次序和结构大小推算各结构起始指针
             Marshal.PtrToStructure(ptr, structure); //根据指针拿到结构
             dependentServices[i] = structure.serviceName; //从结构中拿到服务名
         }
         return dependentServices;
     }
     finally
     {
         Marshal.FreeHGlobal(structsStart);
     }
 }