예제 #1
0
 private WIN32.SERVICE_TABLE_ENTRY GetEntry()
 {
     WIN32.SERVICE_TABLE_ENTRY service_table_entry = new WIN32.SERVICE_TABLE_ENTRY();
     this.nameFrozen = true;
     service_table_entry.callback = this.mainCallback;
     service_table_entry.name = this.handleName;
     return service_table_entry;
 }
예제 #2
0
 public static void Run(DecompiledServiceBase[] services)
 {
     if ((services == null) || (services.Length == 0))
         {
         throw new ArgumentException(Res.GetString("NoServices"));
         }
     if (Environment.OSVersion.Platform != PlatformID.Win32NT)
         {
         string message = Res.GetString("CantRunOnWin9x");
         string title = Res.GetString("CantRunOnWin9xTitle");
         LateBoundMessageBoxShow(message, title);
         }
     else
         {
         IntPtr entry = Marshal.AllocHGlobal((IntPtr)((services.Length + 1) * Marshal.SizeOf(typeof(WIN32.SERVICE_TABLE_ENTRY))));
         WIN32.SERVICE_TABLE_ENTRY[] service_table_entryArray = new WIN32.SERVICE_TABLE_ENTRY[services.Length];
         bool multipleServices = services.Length > 1;
         IntPtr zero = IntPtr.Zero;
         for (int i = 0; i < services.Length; i++)
             {
             services[i].Initialize(multipleServices);
             service_table_entryArray[i] = services[i].GetEntry();
             zero = (IntPtr)(((long)entry) + (Marshal.SizeOf(typeof(WIN32.SERVICE_TABLE_ENTRY)) * i));
             Marshal.StructureToPtr(service_table_entryArray[i], zero, true);
             }
         WIN32.SERVICE_TABLE_ENTRY structure = new WIN32.SERVICE_TABLE_ENTRY
             {
             callback = null,
             name = IntPtr.Zero
             };
         zero = (IntPtr)(((long)entry) + (Marshal.SizeOf(typeof(WIN32.SERVICE_TABLE_ENTRY)) * services.Length));
         Marshal.StructureToPtr(structure, zero, true);
         bool flag2 = WIN32.StartServiceCtrlDispatcher(entry);
         string exceptionMessage = "";
         if (!flag2)
             {
             exceptionMessage = new Win32Exception().Message;
             string str4 = Res.GetString("CantStartFromCommandLine");
             if (Environment.UserInteractive)
                 {
                 string str5 = Res.GetString("CantStartFromCommandLineTitle");
                 LateBoundMessageBoxShow(str4, str5);
                 }
             else
                 {
                 Console.WriteLine(str4);
                 }
             }
         foreach (DecompiledServiceBase base2 in services)
             {
             base2.Dispose();
             if (!flag2 && (base2.EventLog.Source.Length != 0))
                 {
                 base2.WriteEventLogEntry(Res.GetString("StartFailed", new object[] { exceptionMessage }), EventLogEntryType.Error);
                 }
             }
         }
 }