선언:
C#
[DllImport("ntdll")]
public static extern Int32 NtQueryInformationProcess(IntPtr Handle, Int32 ProcessInformationClass, IntPtr ProcessInformation, Int32 InformationLength, out Int32 ReturnLength);
VB.NET
<DllImport("ntdll")> _
Public Shared Function NtQueryInformationProcess(Handle As IntPtr, ProcessInformationClass As Int32, ProcessInformation As IntPtr, InformationLength As Int32, ByRef ReturnLength As Int32) As Int32
End Function
사용 예제:
C#
using System;
using System.Runtime.InteropServices;
namespace ApiReference {
class ApiExample {
[DllImport("ntdll")]
public static extern Int32 NtQueryInformationProcess(IntPtr Handle, Int32 ProcessInformationClass, IntPtr ProcessInformation, Int32 InformationLength, out Int32 ReturnLength);
[StructLayout(LayoutKind.Sequential)]
public struct ProcessBasicInformation
{
public IntPtr ExitStatus;
public IntPtr PebBaseAddress;
public UIntPtr AffinityMask;
public UIntPtr BasePriority;
public UIntPtr UniqueProcessId;
public UIntPtr InheritedFromUniqueProcessId;
public static Int32 Size
{
get
{
return Marshal.SizeOf(typeof(ProcessBasicInformation));
}
}
}
public static void Main(String[] args)
{
Console.Write("프로세스의 핸들을 입력하세요: ");
// 프로세스 핸들을 받아오고,
// ProcessBasicInformation 구조체의 정보를 받아올 포인터를 선언한다.
IntPtr pHandle = new IntPtr(Convert.ToInt32(Console.ReadLine()));
IntPtr pPbi = Marshal.AllocHGlobal(ProcessBasicInformation.Size);
Int32 nRetLen;
if (NtQueryInformationProcess(pHandle, 0, pPbi, ProcessBasicInformation.Size, out nRetLen) != 0)
{
Console.WriteLine("NtQueryInformationProcess API 호출에 실패했습니다.");
}
else
{
Console.WriteLine("NtQueryInformationProcess API 호출에 성공했습니다.");
// 포인터를 ProcessBasicInformation 구조체로 변환한다.
ProcessBasicInformation Pbi = (ProcessBasicInformation) Marshal.PtrToStructure(pPbi, typeof(ProcessBasicInformation));
Console.WriteLine("핸들로부터 얻어온 PID: {0}", Pbi.UniqueProcessId);
}
// 사용한 포인터를 메모리에서 해제한다.
Marshal.FreeHGlobal(pPbi);
Console.ReadKey(true);
}
}
}
VB.NET
Imports System
Imports System.Runtime.InteropServices
Namespace ApiReference
Class ApiExample
<DllImport("ntdll")> _
Public Shared Function NtQueryInformationProcess(Handle As IntPtr, ProcessInformationClass As Int32, ProcessInformation As IntPtr, InformationLength As Int32, ByRef ReturnLength As Int32) As Int32
End Function
<StructLayout(LayoutKind.Sequential)> _
Public Structure ProcessBasicInformation
Public ExitStatus As IntPtr
Public PebBaseAddress As IntPtr
Public AffinityMask As UIntPtr
Public BasePriority As UIntPtr
Public UniqueProcessId As UIntPtr
Public InheritedFromUniqueProcessId As UIntPtr
Public Shared ReadOnly Property Size() As Int32
Get
Return Marshal.SizeOf(GetType(ProcessBasicInformation))
End Get
End Property
End Structure
Public Shared Sub Main(args As String())
Console.Write("프로세스의 핸들을 입력하세요: ")
' 프로세스 핸들을 받아오고,
' ProcessBasicInformation 구조체의 정보를 받아올 포인터를 선언한다.
Dim pHandle As New IntPtr(Convert.ToInt32(Console.ReadLine()))
Dim pPbi As IntPtr = Marshal.AllocHGlobal(ProcessBasicInformation.Size)
Dim nRetLen As Int32
If NtQueryInformationProcess(pHandle, 0, pPbi, ProcessBasicInformation.Size, nRetLen) <> 0 Then
Console.WriteLine("NtQueryInformationProcess API 호출에 실패했습니다.")
Else
Console.WriteLine("NtQueryInformationProcess API 호출에 성공했습니다.")
' 포인터를 ProcessBasicInformation 구조체로 변환한다.
Dim Pbi As ProcessBasicInformation = CType(Marshal.PtrToStructure(pPbi, GetType(ProcessBasicInformation)), ProcessBasicInformation)
Console.WriteLine("핸들로부터 얻어온 PID: {0}", Pbi.UniqueProcessId)
End If
' 사용한 포인터를 메모리에서 해제한다.
Marshal.FreeHGlobal(pPbi)
Console.ReadKey(True)
End Sub
End Class
End Namespace
예제 실행 결과:
매개 변수 설명:
Handle - 정보를 질의할 프로세스의 핸들을 입력합니다.
ProcessInformationClass - 질의할 정보의 유형을 입력합니다.
ProcessInformation - 정보가 저장될 버퍼를 입력합니다.
InformationLength - 정보의 길이를 입력합니다.
ReturnLength - 정보의 길이가 저장될 변수를 입력합니다.
API 설명:
프로세스의 정보를 질의합니다.
참고:
NtQueryInformationProcess (MSDN)
비고:
이 API를 사용해 프로세스의 PROCESS_BASIC_INFORMATION 구조체를 가져오려는 경우, Marshal.AllocHGlobal 메서드를 사용하여 메모리 공간을 할당받은 포인터 변수를 ProcessInformation 매개변수에 넣어주시면 됩니다.
API의 반환 값이 STATUS_SUCCESS 인 경우, Marshal.PtrToStructure 메서드를 사용해 포인터 변수를 구조체로 변환할 수 있습니다.
* Marshal.AllocHGlobal 메서드를 사용해 메모리 공간을 할당받은 경우, Marshal.FreeHGlobal 메서드를 사용하여 할당받은 메모리 공간을 해제하시기 바랍니다.
'API Reference' 카테고리의 다른 글
6. IsWow64Process (0) | 2014.09.10 |
---|---|
5. TerminateProcess (0) | 2014.09.09 |
4. OpenProcess (0) | 2013.12.12 |
2. RemoveDirectory (0) | 2013.12.04 |
1. CreateDirectory (0) | 2013.12.04 |