[DllImport("advapi32.dll", ExactSpelling = true, SetLastError = true)] internal static extern bool AdjustTokenPrivileges(IntPtr htok, bool disall, ref TokPriv1Luid newst, int len, IntPtr prev, IntPtr relen); [DllImport("kernel32.dll", ExactSpelling = true)] internal static extern IntPtr GetCurrentProcess(); [DllImport("advapi32.dll", ExactSpelling = true, SetLastError = true)] internal static extern bool OpenProcessToken(IntPtr h, int acc, ref IntPtr phtok); [DllImport("advapi32.dll", SetLastError = true)] internal static extern bool LookupPrivilegeValue(string host, string name, ref long pluid); [StructLayout(LayoutKind.Sequential, Pack = 1)] internal struct TokPriv1Luid { public int Count; public long Luid; public int Attr; } internal const int SE_PRIVILEGE_ENABLED = 0x00000002; internal const int TOKEN_QUERY = 0x00000008; internal const int TOKEN_ADJUST_PRIVILEGES = 0x00000020; internal const string SE_SYSTEM_ENVIRONMENT_NAME = "SeSystemEnvironmentPrivilege"; //http://msdn.microsoft.com/en-us/library/bb530716(VS.85).aspx [DllImport("kernel32.dll", EntryPoint = "SetFirmwareEnvironmentVariableEx", SetLastError = true)] [return: MarshalAs(UnmanagedType.Bool)] static unsafe extern bool SetFirmwareEnvironmentVariableEx(string lpName, string lpGuid, IntPtr pValue, int nSize, int Attributes); [DllImport("kernel32.dll", SetLastError = true)] static extern UInt32 GetFirmwareEnvironmentVariable(string lpName, string lpGuid, UINT8[] pBuffer, int nSize);In this step we declare function:
public static void SetVariable(string GUID, string NAME, int ATTRIBUTES, byte VALUE) { byte[] Data = new byte[1]; //size Data[0] = VALUE; // value IntPtr unmanagedPointer = IntPtr.Zero; unmanagedPointer = Marshal.AllocHGlobal(Data.Length); Marshal.Copy(Data, 0, unmanagedPointer, Data.Length); var ResultsANSII = SetFirmwareEnvironmentVariableEx(NAME, GUID, unmanagedPointer, sizeof(byte) * Data.Length, ATTRIBUTES); Marshal.FreeHGlobal(unmanagedPointer); }Get Variable and Delete Variable:
public static void SetVariable(string GUID, string NAME, int ATTRIBUTES, ListDataList) { byte[] Data = new byte[DataList.Count]; int i = 0; foreach (byte by in DataList) { Data[i] = by; i++; } IntPtr unmanagedPointer = IntPtr.Zero; unmanagedPointer = Marshal.AllocHGlobal(Data.Length); Marshal.Copy(Data, 0, unmanagedPointer, Data.Length); var ResultsANSII = SetFirmwareEnvironmentVariableEx(NAME, GUID, unmanagedPointer, sizeof(byte) * Data.Length, ATTRIBUTES); Marshal.FreeHGlobal(unmanagedPointer); }
public static void DelVariable(string GUID, string NAME) { byte[] Data = new byte[1]; IntPtr unmanagedPointer = IntPtr.Zero; unmanagedPointer = Marshal.AllocHGlobal(Data.Length); Marshal.Copy(Data, 0, unmanagedPointer, Data.Length); var ResultsANSII = SetFirmwareEnvironmentVariableEx(NAME, GUID, unmanagedPointer, 0, 7); Marshal.FreeHGlobal(unmanagedPointer); }
Reference :https://docs.microsoft.com/en-us/windows/desktop/api/winbase/nf-winbase-setfirmwareenvironmentvariableexa
update:
I made a small tool to get/set/del variable with those functions by C#.
download link(Google Drive):
https://bit.ly/2HNjJ35
Icon made by Smashicons from www.flaticon.com
Here's the source code on github
沒有留言:
張貼留言