CODE2

2017年11月1日 星期三

【C#】Set/Get firmware environment variable

Use Set/Get FirmwareEnvironmentVariable function with C#, we need load DLL .

        [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, List DataList)
        {
            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



沒有留言:

張貼留言