Accessing 64 bit registry from a 32 bit process
As you may know, Windows is virtualizing some parts of the registry under 64 bit. So if you try to open, for example, this key : “HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\90″, from a 32 bit C# application running on a 6
As you may know, Windows is virtualizing some parts of the registry under 64 bit.
So if you try to open, for example, this key : “HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\90″, from a 32 bit C# application running on a 64 bit system, you will be redirected to : “HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Microsoft SQL Server\90″
Why ? Because Windows uses the Wow6432Node registry entry to present a separate view of HKEY_LOCAL_MACHINE\SOFTWARE for 32 bit applications that runs on a 64 bit systems.
If you want to explicitly open the 64 bit view of the registry, here is what you have to perform :
You are using VS 2010 and version 4.x of the .NET framework
It’s really simple, all you need to do is, instead of doing :
//Will redirect you to the 32 bit view
RegistryKey sqlsrvKey = Registry.LocalMachine.OpenSubKey(
@"SOFTWARE\Microsoft\Microsoft SQL Server\90"
);
do the following :
RegistryKey localMachineX64View = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry64);
RegistryKey sqlsrvKey = localMachineX64View.OpenSubKey(
@"SOFTWARE\Microsoft\Microsoft SQL Server\90"
);
Prior versions of the .NET framework
For the prior versions of the framework, we have to use P/Invoke and call the function RegOpenKeyExW with parameter KEY_WOW64_64KEY
enum
RegWow64Options
{
None = 0,
KEY_WOW64_64KEY = 0x0100,
KEY_WOW64_32KEY = 0x0200
}
enum
RegistryRights
{
ReadKey = 131097,
WriteKey = 131078
}
/// <summary></summary>
/// Open a registry key using the Wow64 node instead of the default 32-bit node.
///
/// <param name="parentKey">Parent key to the key to be opened.
/// <param name="subKeyName">Name of the key to be opened
/// <param name="writable">Whether or not this key is writable
/// <param name="options">32-bit node or 64-bit node
/// <returns></returns>
static
RegistryKey _openSubKey(RegistryKey parentKey,
string
subKeyName,
bool
writable, RegWow64Options options)
{
//Sanity check
if
(parentKey ==
null
|| _getRegistryKeyHandle(parentKey) == IntPtr.Zero)
{
return
null
;
}
//Set rights
int
rights = (
int
)RegistryRights.ReadKey;
if
(writable)
rights = (
int
)RegistryRights.WriteKey;
//Call the native function >.
int
subKeyHandle, result = RegOpenKeyEx(_getRegistryKeyHandle(parentKey), subKeyName, 0, rights | (
int
)options,
out
subKeyHandle);
//If we errored, return null
if
(result != 0)
{
return
null
;
}
//Get the key represented by the pointer returned by RegOpenKeyEx
RegistryKey subKey = _pointerToRegistryKey((IntPtr)subKeyHandle, writable,
false
);
return
subKey;
}
/// <summary></summary>
/// Get a pointer to a registry key.
///
/// <param name="registryKey">Registry key to obtain the pointer of.
/// <returns>Pointer to the given registry key.</returns>
static
IntPtr _getRegistryKeyHandle(RegistryKey registryKey)
{
//Get the type of the RegistryKey
Type registryKeyType =
typeof
(RegistryKey);
//Get the FieldInfo of the 'hkey' member of RegistryKey
System.Reflection.FieldInfo fieldInfo =
registryKeyType.GetField(
"hkey"
, System.Reflection.BindingFlags.NonPublic
| System.Reflection.BindingFlags.Instance);
//Get the handle held by hkey
SafeHandle handle = (SafeHandle)fieldInfo.GetValue(registryKey);
//Get the unsafe handle
IntPtr dangerousHandle = handle.DangerousGetHandle();
return
dangerousHandle;
}
/// <summary></summary>
/// Get a registry key from a pointer.
///
/// <param name="hKey">Pointer to the registry key
/// <param name="writable">Whether or not the key is writable.
/// <param name="ownsHandle">Whether or not we own the handle.
/// <returns>Registry key pointed to by the given pointer.</returns>
static
RegistryKey _pointerToRegistryKey(IntPtr hKey,
bool
writable,
bool
ownsHandle)
{
//Get the BindingFlags for private contructors
System.Reflection.BindingFlags privateConstructors = System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic;
//Get the Type for the SafeRegistryHandle
Type safeRegistryHandleType =
typeof
(Microsoft.Win32.SafeHandles.SafeHandleZeroOrMinusOneIsInvalid).Assembly.GetType(
"Microsoft.Win32.SafeHandles.SafeRegistryHandle"
);
//Get the array of types matching the args of the ctor we want
Type[] safeRegistryHandleCtorTypes =
new
Type[] {
typeof
(IntPtr),
typeof
(
bool
) };
//Get the constructorinfo for our object
System.Reflection.ConstructorInfo safeRegistryHandleCtorInfo = safeRegistryHandleType.GetConstructor(
privateConstructors,
null
, safeRegistryHandleCtorTypes,
null
);
//Invoke the constructor, getting us a SafeRegistryHandle
Object safeHandle = safeRegistryHandleCtorInfo.Invoke(
new
Object[] { hKey, ownsHandle });
//Get the type of a RegistryKey
Type registryKeyType =
typeof
(RegistryKey);
//Get the array of types matching the args of the ctor we want
Type[] registryKeyConstructorTypes =
new
Type[] { safeRegistryHandleType,
typeof
(
bool
) };
//Get the constructorinfo for our object
System.Reflection.ConstructorInfo registryKeyCtorInfo = registryKeyType.GetConstructor(
privateConstructors,
null
, registryKeyConstructorTypes,
null
);
//Invoke the constructor, getting us a RegistryKey
RegistryKey resultKey = (RegistryKey)registryKeyCtorInfo.Invoke(
new
Object[] { safeHandle, writable });
//return the resulting key
return
resultKey;
}
[DllImport(
"advapi32.dll"
, CharSet = CharSet.Auto)]
public
static
extern
int
RegOpenKeyEx(IntPtr hKey,
string
subKey,
int
ulOptions,
int
samDesired,
out
int
phkResult);
Then we can open our registry key like this :
RegistryKey sqlsrvKey = _openSubKey(Registry.LocalMachine,
@"SOFTWARE\Microsoft\Microsoft SQL Server\90"
,
false
, RegWow64Options.KEY_WOW64_64KEY);
As you can see, the framework 4 make our life easier.
Referenced from: http://dotnetgalactics.wordpress.com/2010/05/10/accessing-64-bit-registry-from-a-32-bit-process/

Alat AI Hot

Undresser.AI Undress
Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover
Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool
Gambar buka pakaian secara percuma

Clothoff.io
Penyingkiran pakaian AI

AI Hentai Generator
Menjana ai hentai secara percuma.

Artikel Panas

Alat panas

Notepad++7.3.1
Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina
Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1
Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6
Alat pembangunan web visual

SublimeText3 versi Mac
Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Topik panas

Nama penuh PR ialah "Adobe Premiere Pro"; PR ialah perisian penyuntingan video yang dibangunkan oleh Adobe. Ia mempunyai keserasian yang baik dan boleh bekerjasama dengan perisian lain yang dilancarkan oleh Adobe. Ia digunakan secara meluas dalam pengeluaran pengiklanan.

PR mempunyai trek audio tetapi tiada bunyi Penyelesaian: 1. Dalam aplikasi PR, seret bahan ke dalam garis masa 2. Dalam menu edit, buka pilihan 3. Dalam tetingkap pilihan, buka bar item perkakasan audio cari Kotak pilihan output lalai; 4. Dalam kotak pilihan, cari pilihan pembesar suara dan klik butang OK 5. Kembali ke aplikasi PR, mainkannya dalam tetingkap pratonton video, dan bunyi akan disiarkan.

Sebab dan penyelesaian untuk jenis pemampatan fail PR yang tidak disokong: 1. Versi PR yang diperkemas telah menyelaraskan banyak pengekod video dan menggunakan versi penuh Premiere 2. Disebabkan oleh pengekodan video yang tidak teratur, anda boleh menggunakan kilang format untuk Menukar video ke format WMV.

1 bit adalah sama dengan satu perlapan daripada bait. Dalam sistem nombor binari, setiap 0 atau 1 ialah bit (bit), dan bit ialah unit terkecil storan data setiap 8 bit (bit, disingkat b) membentuk bait (Byte), jadi "1 bait (; Bait) = 8 bit”. Dalam kebanyakan sistem komputer, bait ialah unit data panjang 8-bit (bit) Kebanyakan komputer menggunakan bait untuk mewakili aksara, nombor atau aksara lain.

Kaedah untuk sarikata pr muncul secara verbatim: 1. Buat trek sari kata; 3. Laraskan tempohnya; sari kata; 7. Pratonton dan eksport video.

Penyelesaian kepada ralat semasa menyusun video dalam PR: 1. Buka perisian pasca pengeditan Premiere pada komputer, dan kemudian pilih "Umum" dalam bar menu kanan tetapan projek 2. Masukkan tetingkap tetapan umum Premiere dan pilih "Mercury only" Playback Engine Software" 3. Klik "Confirm" untuk menyelesaikan ralat semasa menyusun video dalam PR.

PR, singkatan untuk Perhubungan Awam, ialah alat pengurusan organisasi penting yang direka untuk meningkatkan reputasi dan kepercayaan organisasi dengan mewujudkan dan mengekalkan hubungan baik. Ia memerlukan ketelusan, ketulenan dan konsistensi, sambil disepadukan rapat dengan media baharu dan sosial. Melalui amalan PR yang berkesan, organisasi boleh mendapat pengiktirafan dan sokongan yang lebih luas, meningkatkan daya saing dan keupayaan pembangunan mampan mereka.

Penyelesaian mengapa bahan PR tidak boleh diseret ke garis masa: 1. Format tidak serasi Anda perlu mengesahkan format yang disokong oleh bahan PR dan menukarnya kepada format yang disokong oleh perisian 2. Untuk isu hak cipta, gunakan bahan yang dibenarkan atau hubungi pemegang hak cipta Jika seseorang telah memperoleh lesen 3. Masalah perisian, kemas kini perisian atau gunakan perisian lain yang disokong untuk cuba menyeret dan menjatuhkan bahan ke garis masa selesai, dan cuba muat turun semula atau pulihkan fail yang hilang.
