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

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

TestProject.zip
0.00MB

▶ Program.cs

using System.Diagnostics;
using System.Runtime.InteropServices;

namespace TestProject;

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

    #region WOW 64비트 프로세스 여부 대리자 - IsWOW64ProcessDelegate(processHandle, isWOW64BitProcess)

    /// <summary>
    /// WOW 64비트 프로세스 여부 대리자
    /// </summary>
    /// <param name="processHandle">프로세스 핸들</param>
    /// <param name="isWOW64BitProcess">WOW 64비트 프로세스 여부</param>
    /// <returns>WOW 64비트 프로세스 여부</returns>
    private delegate bool IsWOW64ProcessDelegate([In] IntPtr processHandle, [Out] out bool isWOW64BitProcess);

    #endregion

    //////////////////////////////////////////////////////////////////////////////////////////////////// Import
    ////////////////////////////////////////////////////////////////////////////////////////// Static
    //////////////////////////////////////////////////////////////////////////////// Private

    #region 라이브러리 로드하기 - LoadLibrary(filePath)

    /// <summary>
    /// 라이브러리 로드하기
    /// </summary>
    /// <param name="filePath">파일 경로</param>
    /// <returns>처리 결과</returns>
    [DllImport("kernel32", SetLastError = true, CallingConvention = CallingConvention.Winapi)]
    private extern static IntPtr LoadLibrary(string filePath);

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

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

    #endregion

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

    #region WOW 64비트 프로세스 여부 대리자 구하기 - GetIsWOW64ProcessDelegate()

    /// <summary>
    /// WOW 64비트 프로세스 여부 대리자 구하기
    /// </summary>
    /// <returns>WOW 64비트 프로세스 여부 대리자</returns>
    private static IsWOW64ProcessDelegate GetIsWOW64ProcessDelegate()
    {
        IntPtr moduleHandle = LoadLibrary("kernel32");

        if(moduleHandle != IntPtr.Zero)
        {
            IntPtr procedureHandle = GetProcAddress(moduleHandle, "IsWow64Process");

            if(procedureHandle != IntPtr.Zero)
            {
                return (IsWOW64ProcessDelegate)Marshal.GetDelegateForFunctionPointer
                (
                    procedureHandle,
                    typeof(IsWOW64ProcessDelegate)
                );
            }
        }

        return null;
    }

    #endregion
    #region 64비트 프로세스 상에서 32비트 프로세스 여부 구하기 - Is32BitProcessOn64BitProcessor()

    /// <summary>
    /// 64비트 프로세스 상에서 32비트 프로세스 여부 구하기
    /// </summary>
    /// <returns>64비트 프로세스 상에서 32비트 프로세스 여부</returns>
    private static bool Is32BitProcessOn64BitProcessor()
    {
        IsWOW64ProcessDelegate isWOW64ProcessDelegate = GetIsWOW64ProcessDelegate();

        if(isWOW64ProcessDelegate == null)
        {
            return false;
        }

        bool isWOW64BitProcess;

        bool result = isWOW64ProcessDelegate.Invoke(Process.GetCurrentProcess().Handle, out isWOW64BitProcess);

        if(result == false)
        {
            return false;
        }

        return isWOW64BitProcess;
    }

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

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

    #endregion

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

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

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

댓글을 달아 주세요