선언:

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

+ Recent posts