Windows/Windows Programming 13

잡 (Job) - 프로세스 제약사항 설정 2

잡에 대한 프로세스 제약사항 설정 방법 중- JobObjectExtendedLimitInformation- JobObjectBasicUIRestrictions- JobObjectSecurityLimitInformation에 대해 알아보도록 하겠습니다. JobObjectExtendedLimitInformation     멤버기능  BasicLimitInformationBasicLimitInformation 구조체- 이전 포스팅 참고 IoInfo사용하지 않음  ProcessMemoryLimit잡 내의 한 프로세스가 사용할 수 있는 최대 메모리 사용량을 결정- BasicLimitInformation 구조체의 LimitFlag에 JOB_OBJECT_LIMIT_PROCESS_MEMORY 플래그가 세팅되어 있어야 ..

잡 (Job) - 프로세스 제약사항 설정 1

잡을 생성하고 나면 잡에서 수행할 프로세스들에 대한 제약사항을 설정할 수 있습니다.설정 할 수 있는 제약사항으로는 아래와 같은 내용들이 있습니다.- 기본 제약사항과 확장 제약사항은 잡 내 프로세스가 시스템 리소스를 독점하지 못하게 합니다.- 기본 UI 제약사항은 잡 내의 프로세스가 사용자 인터페이스를 사용하지 못하도록 합니다.- 보안 제약사항은 잡 내의 프로세스가 보안 자원(파일, 레지스트리 등)에 접근하지 못하도록 한다. 잡에 대한 내용은 아래 포스팅 참고- 잡 (Job) : http://wonjayk.tistory.com/287 이러한 제약사항들은 아래 함수로 설정할 수 있습니다.  - hJob : CreeateJobObject로 생성한 잡의 핸들로 제약사항을 설정할 잡의 핸들을 설정하면 됩니다.- ..

잡 (Job)

잡(Job)은 간단하게 설명드리면 여러 개의 프로세스들을 하나로 묶은 그룹입니다. 잡이 필요한 이유- Windows는 프로세스의 부모/자식 관계를 항상 유지하지는 않습니다. (실행되고 종료됨에 따라 프로세스 트리는 끊어질 수 있습니다.)- 특정 프로세스가 수행되는데에 여러 개의 프로세스를 거쳐서 수행되었다고 가정했을 때, 앞서 수행된 특정 프로세스가 종료됨으로 인해 이전에 수행된 여러 개의 프로세스들이 모두 종료되어야 한다고 하면, 이 프로세스들을 모두 관리하기 위함입니다.- 여러 개의 프로세스의 데이터들(클라이언트)을 종합해 수행되는 프로세스(서버)라고 가정한다면, 특정 프로세스(클라이언트)가 과도하게 리소스를 점유하지 못하도록 제어할 필요도 있습니다. (이럴 땐 잡을 이용해 최대 CPU 점유 시간 제..

프로세스 권한 상승 - ShellExecuteEx()

윈도우에는 사용자 권한 상승(사용자 계정 컨트롤 : UAC - User Account Control)이라는 기능이 있습니다.이 기능은 윈도우 사용자에게 보다 높은 수준의 보안성을 제공하는 역할을 하는데요. 짧게 요약하자면, 관리자 권한과 일반 사용자 권한의 차등을 두어 관리자 권한을 갖지 않았다면 접근할 수 있는 리소스를 제한해 보안성을 높이는 방법입니다. - 요런거 많이 보셨을거에요~ 프로세스가 수행되려면 때때로 관리자 권한이 필요한 경우도 있을텐데 앞서 포스팅한 CreateProcess 함수를 보면 권한 상승과 관련된 플래그나 인자는 없습니다. 그럼, 어떻게 코드 레벨에서 권한 상승(관리자 권한)된 프로세스로 실행을 시킬 수 있을까요? 이럴 때에는 CreateProcess 대신 ShellExecute..

자식 프로세스

자식 프로세스는 현재 수행중이던 프로세스에서 새로운 프로세스를 실행시키는 것을 말합니다. 예를들어 아래 그림을 보면......explorer.exe 아래 KakaoTalk.exe, PotPlayerMini.exe, Procexp.exe 등등이 수행되고 있음을 알 수 있는데요바로 explorer.exe가 부모 프로세스그 explorer.exe가 실행시킨 KakaoTalk.exe, PotPlayerMini.exe, Procexp.exe들이 자식 프로세스라고 볼 수 있습니다.여기서 부모/자식간의 연관관계와 독립관계가 있는데요.- 연관관계 : procexp.exe => procexp64.exe- 독립관계 : explorer.exe => 하위 자식 프로세스들 연관관계와 독립관계는 프로세스간 공유하는 자료가 있고 ..

프로세스의 종료

프로세스는 4가지 형태로 종료될 수 있습니다. - 주 스레드의 진입점 함수가 반환될 때 (가장 아름다운 방법)- 프로세스 내 스레드 중 하나가 ExitProcess 함수를 호출 (좋지 못한 방법)- 다른 프로세스의 스레드가 TerminateProcess 함수를 호출 (역시 좋지 못한 방법)- 프로세스 내 모든 스레드가 전부 종료될 때  1. 주 스레드 진입점 함수(Entry-point Function)의 반환"주 스레드 진입점 함수의 반환"은 프로세스가 종료되는 조건 중 하나입니다.진입점 함수가 리턴된다는 뜻은 종료 함수를 거친다라는 의미로 보셔도 좋은데요, 이렇게 종료되어야 스레드들이 가지고 있던 리소스들이 제대로 해제가 됩니다.- 스레드가 가지고 있던 C++ 오브젝트들이 Destroyer를 통해 해제..

파일/디렉토리 접근 권한 (FILE_READ_DATA, FILE_WRITE_DATA ......)

파일/디렉토리 접근 권한에 대해 알아보겠습니다.+ Access Mask라고도 합니다. 요 접근 권한은 말 그대로 파일이나 디렉토리에 해당 프로세스가 어떠한 동작을 수행할 수 있는지를 나타내기도 합니다. 그림판에서 그림파일을 Open하는 동작을 예로들어보면..   1. wonjayk.png 라는 그림 파일을 열기 위해서 CreateFile 호출2. 접근 권한을 Generic Read 로 wonjayk.png 오픈 요러한 동작을 수행하게 되는데요 CreateFile 함수를 다시 살펴보면..- 윈도우 핸들 : http://wonjayk.tistory.com/270 CreateFile 함수를 호출하게 되면 lpFileName으로 호출된 파일의 핸들을 얻어오게 됩니다.여기서 두 번째 인자를 통해서 파일에 대한 접..

프로세스의 생성 2 - CreateProcess()

CreateProcess()의 두 번째 포스팅으로 STARTUPINFO 파라미터에 대해 알아보도록 하겠습니다. 프로세스가 생성될 때 이 STARTUPINFO or STARTUPINFOEX 구조체를 참조하여 프로세스의 속성들을 설정해줄 수 있습니다.CreateProcess()를 호출할 때 이 STARTUPINFO는 반드시 0으로 초기화 되어 있어야 합니다. 예를 들면,,,STARTUPINFO lpStartInfo = { sizeof(lpStartInfo) };CreateProcess(......, lpStartInfo, ......); 이런 식의 초기화가 필요합니다.- STARTUPINFO를 초기화 하지 않으면 쓰레기 값들이 들어가있기 때문에 오동작 가능성이 생기게 됩니다.  1. STARTUPINFO 구..

프로세스의 생성 1 - CreateProcess()

CreateProcess()는 프로세스를 생성하는 함수입니다.msdn을 참고해보면......- https://msdn.microsoft.com/en-us/library/windows/desktop/ms682425(v=vs.85).aspx  CreateProcess 함수가 호출되면 프로세스 커널 오브젝트를 생성하고 실행 파일의 코드와 구동에 필요한 DLL들을 프로세스 주소 공간으로 로드합니다. 그 후 스레드 커널 오브젝트를 생성해 Main 함수를 실행시키면서 TRUE를 리턴하게 됩니다.  이번 포스팅에서는 CreateProcess 함수의 파라미터들에 대해서 알아보도록 하겠습니다.- 9번째 파라미터인 lpStartupInfo는 다음 포스팅에서 따로 언급하도록 하겠습니다. (양이 많아요~)- lpStartup..

프로세스간 커널 오브젝트 공유

프로세스들 사이에서 커널 오브젝트를 공유하는 방법은 세가지가 있습니다. 1. 핸들 상속2. 네임드 오브젝트3. 오브젝트 핸들 복사 핸들 값이 프로세스별로 고유하게 설계된 이유는 바로 안정성 때문입니다.만약, 프로세스 핸들 값이 전역적으로 설계되어 있었다면 관련 없는 프로세스의 핸들 값을 가져와 다른 프로세스를 오동작시킬 수 있는 가능성들이 있기 때문입니다.그럼에도 불구하고, 프로세스 사이에서 커널 오브젝트를 공유하려고 하는 이유는 바로 연관성 있는 프로세스들이 동작 할 수 있게 하기 위함입니다.  1. 핸들 상속핸들 상속은 핸들 값을 공유하려고 하는 프로세스들이 부모-자식 관계를 이루어야 가능합니다.커널 오브젝트 핸들이 부모 프로세스에서 사용되고 있고, 이 부모 프로세스가 새로운 자식 프로세스를 생성하게..