CodeFile1.cs
上传用户:tomsong001
上传日期:2022-03-19
资源大小:31k
文件大小:3k
源码类别:

钩子与API截获

开发平台:

C#

  1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel;
  4. using System.Data;
  5. using System.Drawing;
  6. using System.Linq;
  7. using System.Text;
  8. using System.Windows.Forms;
  9. using System.Runtime.InteropServices;
  10. public class WindowsExit
  11. {
  12.     [StructLayout(LayoutKind.Sequential, Pack = 1)]
  13.     internal struct TokPriv1Luid
  14.     {
  15.         public int Count;
  16.         public long Luid;
  17.         public int Attr;
  18.     }
  19.     [DllImport("kernel32.dll", ExactSpelling = true)]
  20.     internal static extern IntPtr GetCurrentProcess();
  21.     [DllImport("advapi32.dll", ExactSpelling = true, SetLastError = true)]
  22.     internal static extern bool OpenProcessToken(IntPtr h, int acc, ref   IntPtr phtok);
  23.     [DllImport("advapi32.dll", SetLastError = true)]
  24.     internal static extern bool LookupPrivilegeValue(string host, string name, ref   long pluid);
  25.     [DllImport("advapi32.dll", ExactSpelling = true, SetLastError = true)]
  26.     internal static extern bool AdjustTokenPrivileges(IntPtr htok, bool disall,
  27.     ref   TokPriv1Luid newst, int len, IntPtr prev, IntPtr relen);
  28.     [DllImport("user32.dll", ExactSpelling = true, SetLastError = true)]
  29.     internal static extern bool ExitWindowsEx(int flg, int rea);
  30.     internal const int SE_PRIVILEGE_ENABLED = 0x00000002;
  31.     internal const int TOKEN_QUERY = 0x00000008;
  32.     internal const int TOKEN_ADJUST_PRIVILEGES = 0x00000020;
  33.     internal const string SE_SHUTDOWN_NAME = "SeShutdownPrivilege";
  34.     internal const int EWX_LOGOFF = 0x00000000;
  35.     internal const int EWX_SHUTDOWN = 0x00000001;
  36.     internal const int EWX_REBOOT = 0x00000002;
  37.     internal const int EWX_FORCE = 0x00000004;
  38.     internal const int EWX_POWEROFF = 0x00000008;
  39.     internal const int EWX_FORCEIFHUNG = 0x00000010;
  40.     private static void DoExitWin(int flg)
  41.     {
  42.         bool ok;
  43.         TokPriv1Luid tp;
  44.         IntPtr hproc = GetCurrentProcess();
  45.         IntPtr htok = IntPtr.Zero;
  46.         ok = OpenProcessToken(hproc, TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, ref   htok);
  47.         tp.Count = 1;
  48.         tp.Luid = 0;
  49.         tp.Attr = SE_PRIVILEGE_ENABLED;
  50.         ok = LookupPrivilegeValue(null, SE_SHUTDOWN_NAME, ref   tp.Luid);
  51.         ok = AdjustTokenPrivileges(htok, false, ref   tp, 0, IntPtr.Zero, IntPtr.Zero);
  52.         ok = ExitWindowsEx(flg, 0);
  53.     }
  54.     public static void Reboot()
  55.     {
  56.         DoExitWin(EWX_FORCE | EWX_REBOOT);
  57.     }
  58.     public static void PowerOff()
  59.     {
  60.         DoExitWin(EWX_FORCE | EWX_POWEROFF);
  61.     }
  62.     public static void LogoOff()
  63.     {
  64.         DoExitWin(EWX_FORCE | EWX_LOGOFF);
  65.     }
  66. }