PDA

View Full Version : تشخيص سيستم عامل 32 بيتي يا 64 بيتي (os 32bit or 64bit )



hossein_1200
دوشنبه 28 شهریور 1390, 12:05 عصر
خوب اين هم 5 متد براي تشخيص 64 يا 32 بيتي بودن سيستم عامل که بر روي ويندوز هاي xp , 7 تست شده
در ضمن خود برنامه را برايتان اپلود مي کنم انشاء الله مفيد واقع بشه
لازم نيست که در برنامه خودتون از همه ي متدها استفاده کنيد فقط يک متد کافي است


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using Microsoft.Win32;
using System.Runtime.InteropServices;
using System.Diagnostics;




namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}

/// <summary>
/// /// 1. Using environment variable
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void button1_Click(object sender, EventArgs e)
{
string strProcArchi = Environment.GetEnvironmentVariable("PROCESSOR_ARCHITECTURE");

if (strProcArchi.IndexOf("64") > 0)
{
MessageBox.Show("Processor 64 bit");
}
else
{
MessageBox.Show("Processor 32 bit");
}
}

/// <summary>
/// 2. Using size of IntPtr (recommended)
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>

private void button2_Click(object sender, EventArgs e)
{

if (System.IntPtr.Size == 8)
{
MessageBox.Show("Processor 64 bit");
}
else
{
MessageBox.Show("Processor 32 bit");
}

}

/// <summary>
/// 3. Reading registry
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void button3_Click(object sender, EventArgs e)
{

RegistryKey rkIdentifier = Registry.LocalMachine.OpenSubKey("HARDWARE\\DESCRIPTION\\System\\CentralProcessor\\0");
if (rkIdentifier.GetValue("Identifier").ToString().IndexOf("64") > 0)
{
MessageBox.Show("Processor 64 bit");
}
else
{
MessageBox.Show("Processor 32 bit");
}

}


/// <summary>
/// 4. Using GetSystemInfo API
/// </summary>
/// <param name="lpSystemInfo"></param>
[DllImport("kernel32.dll")]
public static extern void GetSystemInfo([MarshalAs(UnmanagedType.Struct)] ref SYSTEM_INFO lpSystemInfo);

[StructLayout(LayoutKind.Sequential)]
public struct SYSTEM_INFO
{
internal _PROCESSOR_INFO_UNION uProcessorInfo;
public uint dwPageSize;
public IntPtr lpMinimumApplicationAddress;
public IntPtr lpMaximumApplicationAddress;
public IntPtr dwActiveProcessorMask;
public uint dwNumberOfProcessors;
public uint dwProcessorType;
public uint dwAllocationGranularity;
public ushort dwProcessorLevel;
public ushort dwProcessorRevision;
}

[StructLayout(LayoutKind.Explicit)]
public struct _PROCESSOR_INFO_UNION
{
[FieldOffset(0)]
internal uint dwOemId;
[FieldOffset(0)]
internal ushort wProcessorArchitecture;
[FieldOffset(2)]
internal ushort wReserved;
}
public enum eOperatingSystem
{
X64,
x86,
Itanium,
Unknown
}

public eOperatingSystem DeterminateOperatingSystem()
{
eOperatingSystem result = eOperatingSystem.Unknown;
SYSTEM_INFO l_System_Info = new SYSTEM_INFO();
GetSystemInfo(ref l_System_Info);

switch (l_System_Info.uProcessorInfo.wProcessorArchitectu re)
{
case 9: // PROCESSOR_ARCHITECTURE_AMD64
result = eOperatingSystem.X64;
break;
case 6: // PROCESSOR_ARCHITECTURE_IA64
result = eOperatingSystem.Itanium;
break;
case 0: // PROCESSOR_ARCHITECTURE_INTEL
result = eOperatingSystem.x86;
break;
default: // PROCESSOR_ARCHITECTURE_UNKNOWN
result = eOperatingSystem.Unknown;
break;
}
return result;
}


private void button4_Click(object sender, EventArgs e)
{
MessageBox.Show(DeterminateOperatingSystem().ToStr ing());
}


/// <summary>
/// 5. Using IsWow64Process API
/// </summary>
/// <param name="hProcess"></param>
/// <param name="lpSystemInfo"></param>
/// <returns></returns>

[DllImport("kernel32.dll", SetLastError = true, CallingConvention = CallingConvention.Winapi)]
[return: MarshalAs(UnmanagedType.Bool)]
public static extern bool IsWow64Process([In] IntPtr hProcess, [Out] out bool lpSystemInfo);

private void button5_Click(object sender, EventArgs e)
{
bool bIsWow64;
bool bSuccess = IsWow64Process(Process.GetCurrentProcess().Handle, out bIsWow64);
if (!bSuccess)
MessageBox.Show("Processor 32 bit");
else
{
if (bIsWow64)
{
MessageBox.Show("Process 32 bit runs on processor 64 bit");
}
else
{
MessageBox.Show("Process 64 bit runs on processor 64 bit");
}
}

}




}
}

f_pakzad
دوشنبه 28 شهریور 1390, 12:43 عصر
میشه کدها را تو تگ بگذارید و توضیح کوچکی هم درموردش بدید؟

joker
دوشنبه 28 شهریور 1390, 13:47 عصر
از روش آخر IsWow64Process استفاده کنید از همه مطمئنتره

hossein_1200
دوشنبه 28 شهریور 1390, 15:07 عصر
میشه کدها را تو تگ بگذارید و توضیح کوچکی هم درموردش بدید؟
ويرايش کردم يک نمونه برنامه هم نوشتم براتون اپلود کردم