첨부 실행 코드는 나눔고딕코딩 폰트를 사용합니다.
728x90
반응형
728x170

■ WIN32 API 함수를 사용해 64비트 운영 체제 여부를 구하는 방법을 보여준다.

TestProject.zip
0.00MB

▶ Program.cs

using System.Runtime.InteropServices;

namespace TestProject;

/// <summary>
/// 프로그램
/// </summary>
class Program
{
    //////////////////////////////////////////////////////////////////////////////////////////////////// Import
    ////////////////////////////////////////////////////////////////////////////////////////// Static
    //////////////////////////////////////////////////////////////////////////////// Private

    #region 현재 프로세스 구하기 - GetCurrentProcess()

    /// <summary>
    /// 현재 프로세스 구하기
    /// </summary>
    /// <returns>현재 프로세스 핸들</returns>
    [DllImport("kernel32")]
    private static extern IntPtr GetCurrentProcess();

    #endregion
    #region 모듈 핸들 구하기 - GetModuleHandle(moduleName)

    /// <summary>
    /// 모듈 핸들 구하기
    /// </summary>
    /// <param name="moduleName">모듈명</param>
    /// <returns>모듈 핸들</returns>
    [DllImport("kernel32", CharSet = CharSet.Auto)]
    private static extern IntPtr GetModuleHandle(string moduleName);

    #endregion
    #region 프로시저 주소 구하기 - GetProcAddress(moduleHandle, procedureName)

    /// <summary>
    /// 프로시저 주소 구하기
    /// </summary>
    /// <param name="moduleHandle">모듈 핸들</param>
    /// <param name="procedureName">프로시저명</param>
    /// <returns>프로시저 핸들</returns>
    [DllImport("kernel32", CharSet = CharSet.Auto, SetLastError = true)]
    private static extern IntPtr GetProcAddress(IntPtr moduleHandle, [MarshalAs(UnmanagedType.LPStr)] string procedureName);

    #endregion
    #region WOW 64비트 프로세스 여부 구하기 - IsWow64Process(processHandle, isWOW64Process)

    /// <summary>
    /// WOW 64비트 프로세스 여부 구하기
    /// </summary>
    /// <param name="processHandle">프로세스 핸들</param>
    /// <param name="isWOW64Process">WOW 64비트 프로세스 여부</param>
    /// <returns>처리 결과</returns>
    [DllImport("kernel32", CharSet = CharSet.Auto, SetLastError = true)]
    [return: MarshalAs(UnmanagedType.Bool)]
    private static extern bool IsWow64Process(IntPtr processHandle, out bool isWOW64BitProcess);

    #endregion

    //////////////////////////////////////////////////////////////////////////////////////////////////// Method
    ////////////////////////////////////////////////////////////////////////////////////////// Static
    //////////////////////////////////////////////////////////////////////////////// Private

    #region WIN32 메소드 존재 여부 구하기 - ExistWIN32Method(moduleName, methodName)

    /// <summary>
    /// WIN32 메소드 존재 여부 구하기
    /// </summary>
    /// <param name="moduleName">모듈명</param>
    /// <param name="methodName">메소드명</param>
    /// <returns>WIN32 메소드 존재 여부</returns>
    private static bool ExistWIN32Method(string moduleName, string methodName)
    {
        IntPtr moduleHandle = GetModuleHandle(moduleName);

        if(moduleHandle == IntPtr.Zero)
        {
            return false;
        }

        return (GetProcAddress(moduleHandle, methodName) != IntPtr.Zero);
    }

    #endregion
    #region 64비트 운영 체제 여부 구하기 - Is64BitOperatingSystem()

    /// <summary>
    /// 64비트 운영 체제 여부 구하기
    /// </summary>
    /// <returns>64비트 운영 체제 여부</returns>
    private static bool Is64BitOperatingSystem()
    {
        if(IntPtr.Size == 8)
        {
            return true;
        }
        else
        {
            bool flag;

            return ((ExistWIN32Method("kernel32", "IsWow64Process") && IsWow64Process(GetCurrentProcess(), out flag)) && flag);
        }
    }

    #endregion

    #region 프로그램 시작하기 - Main()

    /// <summary>
    /// 프로그램 시작하기
    /// </summary>
    private static void Main()
    {
        Console.WriteLine($"64비트 운영 체제 여부 : {Is64BitOperatingSystem()}");
    }

    #endregion
}
728x90
반응형
그리드형(광고전용)
Posted by icodebroker

댓글을 달아 주세요