728x90
728x170
[TestChild 프로젝트]
▶ ProcessInformation.cs
using System;
using System.Runtime.InteropServices;
namespace TestChild
{
/// <summary>
/// 프로세스 정보
/// </summary>
[StructLayout(LayoutKind.Sequential)]
public struct ProcessInformation
{
//////////////////////////////////////////////////////////////////////////////////////////////////// Field
////////////////////////////////////////////////////////////////////////////////////////// Public
#region Field
/// <summary>
/// 예약
/// </summary>
public IntPtr Reserved;
/// <summary>
/// PEB 기준 주소
/// </summary>
public IntPtr PEbBaseAddress;
/// <summary>
/// 예약 2-0
/// </summary>
public IntPtr Reserved2_0;
/// <summary>
/// 예약 2-1
/// </summary>
public IntPtr Reserved2_1;
/// <summary>
/// 고유 프로세스 ID
/// </summary>
public IntPtr UniqueProcessID;
/// <summary>
/// 프로세스 ID
/// </summary>
public IntPtr InheritedFromUniqueProcessID;
#endregion
}
}
728x90
▶ ProcessHelper.cs
using System;
using System.ComponentModel;
using System.Diagnostics;
using System.Runtime.InteropServices;
namespace TestChild
{
/// <summary>
/// 프로세스 헬퍼
/// </summary>
public static class ProcessHelper
{
//////////////////////////////////////////////////////////////////////////////////////////////////// Import
////////////////////////////////////////////////////////////////////////////////////////// Static
//////////////////////////////////////////////////////////////////////////////// Private
#region NT 프로세스 정보 쿼리하기 - NtQueryInformationProcess(processHandle, processInformationClass, processInformation, processInformationLength, returnLength)
/// <summary>
/// NT 프로세스 정보 쿼리하기
/// </summary>
/// <param name="processHandle">프로세스 핸들</param>
/// <param name="processInformationClass">프로세스 정보 클래스</param>
/// <param name="processInformation">프로세스 정보</param>
/// <param name="processInformationLength">프로세스 정보 길이</param>
/// <param name="returnLength">반환 길이</param>
/// <returns>처리 결과</returns>
[DllImport("ntdll")]
private static extern int NtQueryInformationProcess
(
IntPtr processHandle,
int processInformationClass,
ref ProcessInformation processInformation,
int processInformationLength,
out int returnLength
);
#endregion
//////////////////////////////////////////////////////////////////////////////////////////////////// Method
////////////////////////////////////////////////////////////////////////////////////////// Static
//////////////////////////////////////////////////////////////////////////////// Public
#region 부모 프로세스 구하기 - GetParentProcess(processHandle)
/// <summary>
/// 부모 프로세스 구하기
/// </summary>
/// <param name="processHandle">프로세스 핸들</param>
/// <returns>부모 프로세스</returns>
public static Process GetParentProcess(IntPtr processHandle)
{
ProcessInformation processInformation = new ProcessInformation();
int returnLength;
int status = NtQueryInformationProcess
(
processHandle,
0,
ref processInformation,
Marshal.SizeOf(processInformation),
out returnLength
);
if(status != 0)
{
throw new Win32Exception(status);
}
try
{
return Process.GetProcessById(processInformation.InheritedFromUniqueProcessID.ToInt32());
}
catch
{
return null;
}
}
#endregion
#region 부모 프로세스 구하기 - GetParentProcess(processID)
/// <summary>
/// 부모 프로세스 구하기
/// </summary>
/// <param name="processID">프로세스 ID</param>
/// <returns>부모 프로세스</returns>
public static Process GetParentProcess(int processID)
{
Process process = Process.GetProcessById(processID);
return GetParentProcess(process.Handle);
}
#endregion
#region 부모 프로세스 구하기 - GetParentProcess()
/// <summary>
/// 부모 프로세스 구하기
/// </summary>
/// <returns>부모 프로세스</returns>
public static Process GetParentProcess()
{
return GetParentProcess(Process.GetCurrentProcess().Handle);
}
#endregion
}
}
300x250
▶ Program.cs
using System;
using System.Diagnostics;
namespace TestChild
{
/// <summary>
/// 프로그램
/// </summary>
class Program
{
//////////////////////////////////////////////////////////////////////////////////////////////////// Method
////////////////////////////////////////////////////////////////////////////////////////// Static
//////////////////////////////////////////////////////////////////////////////// Private
#region 프로그램 시작하기 - Main()
/// <summary>
/// 프로그램 시작하기
/// </summary>
private static void Main()
{
Process process = ProcessHelper.GetParentProcess();
Console.WriteLine(process.ProcessName);
Console.ReadKey(false);
}
#endregion
}
}
[TestParent 프로젝트]
▶ Program.cs
using System.Diagnostics;
namespace TestParent
{
/// <summary>
/// 프로그램
/// </summary>
class Program
{
//////////////////////////////////////////////////////////////////////////////////////////////////// Method
////////////////////////////////////////////////////////////////////////////////////////// Static
//////////////////////////////////////////////////////////////////////////////// Private
#region 프로그램 시작하기 - Main()
/// <summary>
/// 프로그램 시작하기
/// </summary>
private static void Main()
{
Process process = new Process();
process.StartInfo.FileName = "TestChild.exe";
process.Start();
process.WaitForExit();
}
#endregion
}
}
728x90
그리드형(광고전용)
'C# > Common' 카테고리의 다른 글
[C#/COMMON] Task 클래스 : Delay 정적 메소드를 사용해 1초 대기하기 (0) | 2021.06.26 |
---|---|
[C#/COMMON] SerialPort 클래스 : 유진시스텍 YJ-730T 키오스크 프린터 사용하기 (0) | 2021.06.20 |
[C#/COMMON] SAM4S GIANT-100 감열 포스 영수증 프린터 사용하기 (0) | 2021.06.20 |
[C#/COMMON] 윈도우즈 화면 잠금 여부 구하기 (0) | 2021.06.11 |
[C#/COMMON] Process 클래스 : GetProcessesByName 정적 메소드를 사용해 윈도우즈 화면 잠금 여부 구하기 (0) | 2021.06.11 |
[C#/COMMON] Win32Exception 클래스 사용하기 (0) | 2021.05.26 |
[C#/COMMON] WIN32 API 함수 사용시 마지막 에러 메시지 구하기 (0) | 2021.05.26 |
[C#/COMMON] UWP 앱 윈도우 최소화/복원하기 (0) | 2021.05.25 |
[C#/COMMON] 카카오 API를 사용해 키워드 장소 검색하기 (0) | 2021.05.23 |
[C#/COMMON] UWP 프로세스/윈도우 리스트 구하기 (0) | 2021.05.23 |