선언:
C#
[DllImport("kernel32")]
public static extern Int32 IsWow64Process(IntPtr hProcess, out Boolean bWow64Process);
VB.NET
<DllImport("kernel32")> _
Public Shared Function IsWow64Process(ByVal hProcess As IntPtr, ByRef bWow64Process As Boolean) As Int32
End Function
사용 예제:
C#
using System;
using System.Runtime.InteropServices;
namespace ApiReference {
class ApiExample {
[DllImport("kernel32")]
public static extern Int32 IsWow64Process(IntPtr hProcess, out Boolean bWow64Process);
[DllImport("kernel32")]
public static extern void CloseHandle(IntPtr hProcess);
[DllImport("kernel32")]
public static extern IntPtr OpenProcess(Int32 Access, Boolean InheritHandle, Int32 ProcessId);
public const Int32 PROCESS_QUERY_INFORMATION = 0x400;
public const Int32 PROCESS_QUERY_LIMITED_INFORMATION = 0x1000;
public static void Main(string[] args) {
EnterPID:
Int32 ProcessId;
Console.Write("확인할 프로세스의 식별자(PID)를 입력하세요: ");
try {
ProcessId = Int32.Parse(Console.ReadLine());
} catch (Exception) {
Console.WriteLine("다시 입력하세요");
goto EnterPID;
}
IntPtr hProcess = OpenProcess(PROCESS_QUERY_INFORMATION, false, ProcessId);
if ( hProcess == IntPtr.Zero )
hProcess = OpenProcess(PROCESS_QUERY_LIMITED_INFORMATION, false, ProcessId);
if ( hProcess == IntPtr.Zero ) {
Console.WriteLine("프로세스 핸들 열기 실패!");
return;
}
Boolean result = false;
if ( IsWow64Process(hProcess, out result) != 0 ) {
if ( !result )
Console.WriteLine("32비트 프로세스입니다.");
else
Console.WriteLine("64비트 프로세스입니다.");
} else
Console.WriteLine("정보 확인 실패!");
CloseHandle(hProcess);
Console.ReadKey(true);
}
}
}
VB.NET
Imports System
Imports System.Runtime.InteropServices
Namespace ApiReference
Class ApiExample
<DllImport("kernel32")> _
Public Shared Function IsWow64Process(hProcess As IntPtr, ByRef bWow64Process As [Boolean]) As Int32
End Function
<DllImport("kernel32")> _
Public Shared Sub CloseHandle(hProcess As IntPtr)
End Sub
<DllImport("kernel32")> _
Public Shared Function OpenProcess(Access As Int32, InheritHandle As [Boolean], ProcessId As Int32) As IntPtr
End Function
Public Const PROCESS_QUERY_INFORMATION As Int32 = &H400
Public Const PROCESS_QUERY_LIMITED_INFORMATION As Int32 = &H1000
Public Shared Sub Main(args As String())
EnterPID:
Dim ProcessId As Int32
Console.Write("확인할 프로세스의 식별자(PID)를 입력하세요: ")
Try
ProcessId = Int32.Parse(Console.ReadLine())
Catch generatedExceptionName As Exception
Console.WriteLine("다시 입력하세요")
GoTo EnterPID
End Try
Dim hProcess As IntPtr = OpenProcess(PROCESS_QUERY_INFORMATION, False, ProcessId)
If hProcess = IntPtr.Zero Then
hProcess = OpenProcess(PROCESS_QUERY_LIMITED_INFORMATION, False, ProcessId)
End If
If hProcess = IntPtr.Zero Then
Console.WriteLine("프로세스 핸들 열기 실패!")
Return
End If
Dim result As [Boolean] = False
If IsWow64Process(hProcess, result) <> 0 Then
If Not result Then
Console.WriteLine("32비트 프로세스입니다.")
Else
Console.WriteLine("64비트 프로세스입니다.")
End If
Else
Console.WriteLine("정보 확인 실패!")
End If
CloseHandle(hProcess)
Console.ReadKey(True)
End Sub
End Class
End Namespace
예제 실행 결과:
매개 변수 설명:
hProcess - WOW64 환경에서 실행되고 있는지를 확인할 프로세스의 핸들을 입력합니다.
bWow64Process - 정보가 저장될 변수를 입력합니다.
API 설명:
프로세스가 WOW64(Windows 32-Bit on Windows 64-Bit) 환경에서 실행되고 있는지를 확인합니다.
WOW64 환경이란, 64비트 윈도우 환경에서 32비트 프로세스가 실행되는 것을 지칭합니다.
참고:
IsWow64Process (MSDN)
비고:
이 API는 Windows XP Service Pack 2 이상, Windows Vista 이상인 운영체제에서 사용할 수 있습니다.
그렇기 때문에 예제 코드에 API 호출 부분을 Try ~ Catch 로 감싸주었습니다.
추가로, Windows XP 환경에서는 PROCESS_QUERY_LIMITED_INFORMATION 권한이 없으므로,
Windows XP 환경 사용자분은 PROCESS_QUERY_LIMITED_INFORMATION 상수를 과감하게 지워주시면 됩니다.
Windows Vista 이상 환경에서는 PROCESS_QUERY_INFORMATION 이나 PROCESS_QUERY_LIMITED_INFORMATION
둘 중 하나를 사용하여 정보를 받아올 수 있습니다.
'API Reference' 카테고리의 다른 글
8. CreateToolhelp32Snapshot (0) | 2014.09.16 |
---|---|
7. CloseHandle (0) | 2014.09.11 |
5. TerminateProcess (0) | 2014.09.09 |
4. OpenProcess (0) | 2013.12.12 |
3. NtQueryInformationProcess (0) | 2013.12.06 |