예제 #1
0
        internal static int TransformStringValue(Win32Api.RegValueType type,
                                                 IntPtr pSrcData, int cbSrcData,
                                                 Data dst, StringTransformer transformer, StringFormat dstFormat)
        {
            string value = "";

            if (pSrcData != IntPtr.Zero)
            {
                value = PtrToString(pSrcData, cbSrcData / Data.BytesPerChar(dstFormat));
            }

            bool removedNullChar = false;

            if ((type == Win32Api.RegValueType.REG_SZ ||
                 type == Win32Api.RegValueType.REG_EXPAND_SZ) &&
                value.EndsWith("\0"))
            {
                value           = value.Remove(value.Length - 1);
                removedNullChar = true;
            }

            value = transformer(value);

            if (removedNullChar)
            {
                value += "\0";
            }

            return(dst.FillWithString(new ManagedString(value), dstFormat,
                                      Data.NullCharHandling.NotAddingIfNotPresent));
        }
예제 #2
0
        public void SetValue(
            string lpValueName,
            Win32Api.RegValueType dwType,
            IntPtr lpData,
            int cbData)
        {
            int result;

            if (!DoUni2AnsiConversion ||
                !DataTransformer.IsStringType(dwType))
            {
                result = OffRegHive.CatchException(() =>
                                                   key_.SetValueUnmanaged(lpValueName, (OffregLib.RegValueType)dwType, lpData, cbData));
                hive_.MarkAsModified();
                Win32Exception.CheckResult(result);
                return;
            }
            string str = Marshal.PtrToStringAnsi(lpData, cbData);

            using (HGlobalPtr pStr =
                       new HGlobalPtr(Marshal.StringToHGlobalUni(str)))
            {
                result = OffRegHive.CatchException(() =>
                                                   key_.SetValueUnmanaged(lpValueName, (OffregLib.RegValueType)dwType,
                                                                          pStr.Ptr, cbData * sizeof(char)));
                hive_.MarkAsModified();
                Win32Exception.CheckResult(result);
            }
        }
예제 #3
0
        internal static void CopyValues(this VirtualRegistry virtualRegistry, VirtualKey sourceKey, KeyInfo sourceKeyInfo, VirtualKey destinationKey)
        {
            using (HGlobalPtr lpValueName = new HGlobalPtr((sourceKeyInfo.MaxValueNameLength + 1) * sizeof(char)),
                   lpcValueName = new HGlobalPtr(sizeof(int)),
                   lpReserved = new HGlobalPtr(IntPtr.Zero),
                   lpdwType = new HGlobalPtr(sizeof(int)),
                   lpvData = new HGlobalPtr(sourceKeyInfo.MaxValueLength),
                   lpcData = new HGlobalPtr(sizeof(int)))
            {
                for (uint i = 0; i < sourceKeyInfo.ValuesNumber; ++i)
                {
                    Marshal.WriteInt32(lpcValueName.Ptr, unchecked ((int)sourceKeyInfo.MaxValueNameLength) + 1);
                    Marshal.WriteInt32(lpcData.Ptr, unchecked ((int)sourceKeyInfo.MaxValueLength));
                    sourceKey.EnumValue(i, lpValueName.Ptr, lpcValueName.Ptr, lpReserved.Ptr, lpdwType.Ptr, lpvData.Ptr,
                                        lpcData.Ptr);

                    Win32Api.RegValueType valueType = (Win32Api.RegValueType)Marshal.ReadInt32(lpdwType.Ptr);

                    int currentValueLength     = Marshal.ReadInt32(lpcData.Ptr);
                    int currentValueNameLength = Marshal.ReadInt32(lpcValueName.Ptr);

                    string currentValueName = Marshal.PtrToStringUni(lpValueName.Ptr, currentValueNameLength);

                    destinationKey.SetValue(null, currentValueName, 0, valueType, lpvData.Ptr, currentValueLength);
                }
            }
        }
예제 #4
0
 public void SetValue(
     string lpValueName,
     Win32Api.RegValueType dwType,
     IntPtr lpData,
     int cbData)
 {
     SetValue(null, lpValueName, 0, dwType, lpData, cbData);
 }
예제 #5
0
 public void SetValue(
     string lpValueName,
     Win32Api.RegValueType dwType,
     IntPtr lpData,
     int cbData)
 {
     Win32Exception.CheckResult(
         Win32Api.RegSetKeyValue(handle_, null, lpValueName, dwType, lpData, cbData));
 }
예제 #6
0
 internal void SetValue(
     string lpSubKey,
     string lpValueName,
     int Reserved,
     Win32Api.RegValueType dwType,
     IntPtr lpData,
     int cbData)
 {
     ApplyNotOnlyReadOperation(lpSubKey, new KeySecurity(Win32Api.KeySecurity.KEY_SET_VALUE),
                               keyImpl =>
     {
         keyImpl.SetValue(lpValueName, dwType, lpData, cbData);
         return(true);
     });
 }
예제 #7
0
파일: OffReg.cs 프로젝트: rwrc/OpenSandbox
 internal static extern Int32 ORSetValue(
     IntPtr hKey,
     String lpValueName,
     Win32Api.RegValueType dwType,
     IntPtr lpData,
     int cbData);
예제 #8
0
 internal static bool IsStringType(Win32Api.RegValueType type)
 {
     return(type == Win32Api.RegValueType.REG_SZ ||
            type == Win32Api.RegValueType.REG_MULTI_SZ ||
            type == Win32Api.RegValueType.REG_EXPAND_SZ);
 }
예제 #9
0
 public void SetValue(string lpValueName, Win32Api.RegValueType dwType, IntPtr lpData, int cbData)
 {
     decorated_.SetValue(lpValueName, dwType, lpData, cbData);
 }