8. [pywin32] CreateProcess 및 기타 함수

pywin32/win32process|2020. 12. 24. 00:33

1. PySTARTUPINFO = STARTUPINFO()

 

STARTUPINFO 구조체를 생성하는 함수입니다. 프로세스를 만들 때 사용하기 때문에 처음에 호출해주어야 합니다.

 

다음의 멤버를 갖고 있습니다.

 

integer dwX: 왼쪽 위의 x 좌표, dwFlags에 win32process.STARTF_USEPOSITION 을 설정해주어야 합니다.

 

integer dwY: 왼쪽 위의 y 좌표, dwFlags에 win32process.STARTF_USEPOSITION 을 설정해주어야 합니다.

 

integer dwXSize: 넓이, dwFlags에 win32process.STARTF_USESIZE을 설정해주어야 합니다.

 

integer dwYSize: 높이, dwFlags에 win32process.STARTF_USESIZE을 설정해주어야 합니다.

 

integer dwXCountChars: 콘솔 프로세스의 경우, 화면 넓이를 지정합니다. (GUI 프로세스의 경우 무시됨), dwFlags에 win32process.STARTF_USECOUNTCHARS을 설정해주어야 합니다.

 

integer dwYCountChars: 콘솔 프로세스의 경우, 화면 높이를 지정합니다. (GUI 프로세스의 경우 무시됨), dwFlags에 win32process.STARTF_USECOUNTCHARS을 설정해주어야 합니다.

 

integer dwFillAttribute: 콘솔 프로세스의 경우, 초기 텍스트와 배경 화면 색을 지정합니다. (GUI 프로세스의 경우 무시됨), dwFlags에 win32process.STARTF_USEFILLATTRIBUTE를 설정해주어야 합니다.

 

integer dwFlags: STARTUPINFO의 속성을 지정합니다. win32con.STARTF_* or win32process.STARTF_* 값을 이용합니다.

 - 자세한 속성값은 MSDN의 STARTUPINFO 구조체에 대한 설명을 참조

 

integer wShowWindow: 윈도우를 어떻게 보여줄지를 지정합니다. win32con.SW_* 값을 이용합니다. dwFlags에 win32process.STARTF_USESHOWWINDOW를 설정해주어야 합니다.

 - 자세한 속성값은 MSDN의 ShowWindow 함수에 대한 설명을 참조

 

integer/PyHANDLE hStdInput: 기본 입출력 핸들 설정과 관련있는 것 같습니다. 여기서는 None으로 설정하였습니다.

 

integer/PyHANDLE hStdOutput: 기본 입출력 핸들 설정과 관련있는 것 같습니다. 여기서는 None으로 설정하였습니다.

 

integer/PyHANDLE hStdError: 기본 입출력 핸들 설정과 관련있는 것 같습니다. 여기서는 None으로 설정하였습니다.

 

string/None lpDesktop: 프로세스가 실행될 윈도우 스테이션과 데스크탑을 지정합니다. 여기서는 None으로 설정하였습니다.

 

string/None lpTitle: 윈도우의 제목을 설정해줍니다.

 

 

2. PyHANDLE, PyHANDLE, int, int = CreateProcess(appName, commandLine , processAttributes , threadAttributes , bInheritHandles , dwCreationFlags , newEnvironment , currentDirectory , startupinfo )

 

프로세스를 생성하는 함수입니다. exe 확장자로 끝나는 프로그램만 실행시킬 수 있는 듯 합니다.

 

인자로는 appName : string, commandLine : string, processAttributes : PySECURITY_ATTRIBUTES, threadAttributes : PySECURITY_ATTRIBUTES, bInheritHandles : int, dwCreationFlags : int, newEnvironment : dictionary/None, currentDirectory : string, startupinfo : PySTARTUPINFO 가 있습니다.

 

appName: 실행할 프로그램(exe)의 절대경로입니다.

 

commandLine: appName과 관련된 명령어입니다. 혹은 appName을 None으로 두고 여기서 프로그램 절대경로 까지 넣는 방법도 있습니다.(이 경우 경로를 \\으로 감싸주어야 합니다.)

 

processAttributes: 프로세스의 보안 속성으로 여기서는 None으로 설정하였습니다.

 

threadAttributes: 프로세스 내 쓰레드의 보안 속성으로 여기서는 None으로 설정하였습니다.

 

bInheritHandles: 부모 프로세스의 보안 속성을 상속할지를 정하는 값입니다. win32con.TRUE/win32con.FALSE 2가지 값이 있습니다.

 

dwCreationFlag: 프로세스 생성 시 조건을 설정합니다. 여기서는 win32con.CREATE_NEW_CONSOLE으로 설정하였습니다.(기본값)

 - 자세한 속성값은 MSDN의 Process Creation Flags에 대한 설명을 참조

 

newEnvironment: 프로세스의 환경 구성을 설정합니다. 여기서는 None으로 설정하였습니다.(부모 프로세스의 환경 구성 사용)

 

currentDirectory: 프로세스의 현재 폴더 경로를 적어줍니다. 여기서는 None으로 설정하였습니다.(부모 프로세스의 폴더 사용)

 

startupinfo: 위에서 만든 STARTUPINFO 구조체 변수를 넣어줍니다.

 

 

3. PySTARTUPINFO = GetStartupInfo()

 

해당 함수를 호출한 프로세스의 STARTUPINFO 구조체를 반환합니다.

 

이건 특정 프로세스를 타겟으로 호출할 수는 없나 봅니다.(무조건 해당 프로세스의 구조체를 반환)

 

 

4. bool = IsWow64Process(Process)

 

해당 프로세스가 WOW64에서 실행 중인지 확인합니다. 32bit 프로세스의 경우 64bit 윈도우에서 실행되기 위해서 WOW64라는 에뮬레이터를 이용하는데 이걸 확인하는 함수입니다.

 

인자로는 Process=None : PyHANDLE가 있습니다.

 

Process: 확인할 프로세스의 핸들값입니다. 기본값은 None이며, 현재 프로세스를 뜻합니다.

 

리턴값은 True/False 입니다.

 - True: 32bit 프로세스가 64bit 윈도우에서 실행되는 경우 입니다.

 - False: True를 제외한 경우입니다.

 

 

import win32process
import win32con
import win32api
import win32event

prog = "C:/Users/admin/Downloads/ProcessExplorer/procexp.exe"
# 프로그램 경로

pinfo = win32process.STARTUPINFO()

pHandle = win32process.CreateProcess(prog, None, None, None, win32con.FALSE, \
                                     win32con.CREATE_NEW_CONSOLE, None, None, pinfo)

pinfo2 = win32process.GetStartupInfo()

isWOW64 = win32process.IsWow64Process(pHandle[0])
# 32pro on 64bit : true 

win32event.WaitForSingleObject(pHandle[0], 3000)

print(f"isWOW64 : {isWOW64}")

위에서 사용한 prog의 프로그램은 process explorer 입니다. 적절한 32bit 프로그램을 사용하기 위해서 입니다. 64bit OS에서 32bit 프로그램으로 프로세스를 생성하여 IsWow64Process가 True를 반환하였습니다. GetStartupInfo의 경우 호출한 프로세스의 STARTUPINFO 구조체를 반환하여 처음 생성한 STARTUPINFO 구조체와 다른 값이 들어가 있습니다.

 

 

 

 

반응형

댓글()