[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
沒有留言:
張貼留言