.NET 3.x Чтение Windows key CD - C#

Узнай цену своей работы

Формулировка задачи:

Пытаюсь вывести информацию о Windows key, пробую так:
static string GetWindowsCDKey(bool bUseFormat)
{
    int pos, start, value;
    char[] sBuffer;
    byte[] sRawData = (byte[])Registry.GetValue(
        "HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion",
            "DigitalProductId", null);
    if(sRawData == null)
        return null;
 
    sBuffer = new char[32];
    start = (bUseFormat) ? 28 : 24;
    for(pos = 52; pos <= 66; pos++)
        sRawData[pos - 52] = sRawData[pos];
    
    for(pos = 24; pos >= 0; pos--){
        value = 0;
        for(int c = 14; c > -1; c--){
            value = value * 256;
            value ^= sRawData[c];
            sRawData[c] = (byte)(value / 24);
            value %= 24;
        }
        sBuffer[start--] = "BCDFGHJKMPQRTVWXY2346789"[value];
        if(bUseFormat && pos > 0 && (pos % 5) == 0)
            sBuffer[start--] = '-';
    }
 
    return new string(sBuffer);
}
вызываю
string sCDKey = GetWindowsCDKey(true);
Но ничего не показывает Как вывести ключ?

Решение задачи: «.NET 3.x Чтение Windows key CD»

textual
Листинг программы
using System.Reflection;
using System.Runtime.InteropServices;
using Microsoft.Win32;
using Microsoft.Win32.SafeHandles;
 
public static class Registry64Helper
{
    enum RegWow64Options
    {
        None = 0,
        KEY_WOW64_64KEY = 0x0100,
        KEY_WOW64_32KEY = 0x0200
    }
 
    enum RegistryRights
    {
        ReadKey = 131097,
        WriteKey = 131078
    }
 
    /// <summary>
    /// Open a registry key using the Wow64 node instead of the default 32-bit node.
    /// </summary>
    /// <param name="parentKey">Parent key to the key to be opened.</param>
    /// <param name="subKeyName">Name of the key to be opened</param>
    /// <param name="writable">Whether or not this key is writable</param>
    /// <returns></returns>
    public static RegistryKey OpenSubKey(RegistryKey parentKey, string subKeyName, bool writable)
    {
        if (parentKey == null || GetRegistryKeyHandle(parentKey) == IntPtr.Zero)
        {
            return null;
        }
 
        int rights = (int)RegistryRights.ReadKey;
        if (writable) rights = (int)RegistryRights.WriteKey;
 
        int subKeyHandle;
        int result = RegOpenKeyEx(GetRegistryKeyHandle(parentKey), subKeyName, 0, rights | (int)RegWow64Options.KEY_WOW64_64KEY, out subKeyHandle);
        if (result != 0) return null;
 
        return CreateRegistryKeyFromIntPtr((IntPtr)subKeyHandle, writable, false);
    }
 
    static IntPtr GetRegistryKeyHandle(RegistryKey registryKey)
    {
        Type registryKeyType = typeof(RegistryKey);
        FieldInfo fieldInfo = registryKeyType.GetField("hkey", BindingFlags.NonPublic | BindingFlags.Instance);
        SafeHandle handle = (SafeHandle)fieldInfo.GetValue(registryKey);
        return handle.DangerousGetHandle();
    }
 
    static RegistryKey CreateRegistryKeyFromIntPtr(IntPtr hKey, bool writable, bool ownsHandle)
    {
        BindingFlags privateConstructors = BindingFlags.Instance | BindingFlags.NonPublic;
        Type safeRegistryHandleType = typeof(SafeHandleZeroOrMinusOneIsInvalid).Assembly.GetType("Microsoft.Win32.SafeHandles.SafeRegistryHandle");
        Type[] safeRegistryHandleCtorTypes = { typeof(IntPtr), typeof(bool) };
        ConstructorInfo safeRegistryHandleCtorInfo = safeRegistryHandleType.GetConstructor(privateConstructors, null, safeRegistryHandleCtorTypes, null);
        object safeHandle = safeRegistryHandleCtorInfo.Invoke(new object[] { hKey, ownsHandle });
 
        Type registryKeyType = typeof(RegistryKey);
        Type[] registryKeyConstructorTypes = { safeRegistryHandleType, typeof(bool) };
        ConstructorInfo registryKeyCtorInfo = registryKeyType.GetConstructor(privateConstructors, null, registryKeyConstructorTypes, null);
        return (RegistryKey)registryKeyCtorInfo.Invoke(new[] { safeHandle, writable });
    }
 
    [DllImport("advapi32.dll", CharSet = CharSet.Auto)]
    public static extern int RegOpenKeyEx(IntPtr hKey, string subKey, int ulOptions, int samDesired, out int phkResult);
}

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

8   голосов , оценка 4.25 из 5
Похожие ответы