Windows 19

강제 BSOD로 전체덤프 저장하기

Process Hang이나 Application Error가 발생했을 때 Hang/Error가 발생한 프로세스의 덤프만으로도 해결이 가능한 경우들이 있지만, 간혹 다른 프로세스에 의해 발생한 경우라면 프로세스 덤프 만으로는 원인을 찾기가 어려워집니다. 이럴 때, 문제 원인을 찾기 위해 전체 덤프가 필요한데요 전체 덤프를 얻기 위해 BSOD(블루스크린)를 발생시키는 방법은 아래와 같습니다.1. 키보드 이용2. OSRonline의 BANG! 활용- https://www.osronline.com/article.cfm?article=1533. Sysinternals의 Not My Fault 활용- http://download.sysinternals.com/files/notmyfault.zip 이 중 2번 방법인..

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

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

윈도우 핸들 (Windows Handle Object)

핸들(Handle)이란 무엇인가? 우리가 흔히 핸들이라고 생각하면 자동차의 핸들(Steering Wheel)을 떠올리기 마련인데요,자동차 바퀴의 방향을 제어하기 위해 이 핸들을 사용하게 됩니다. 윈도우의 핸들이 바로 이 자동차의 핸들과 개념이 유사합니다. (갖다 붙이기 나름이죠?) 좌회전을 한다고 가정해봅시다.그러면 운전자는 바퀴를 움직이기 위해 직접 손으로 바퀴를 움켜잡고 돌리지 않고 핸들이라는 조향 장치를 이용해 간접적으로 바퀴의 방향을 제어하게 됩니다. 마찬가지로 윈도우의 핸들도 커널 오브젝트(혹은 GDI, 사용자 오브젝트)를 사용하기 위해 필요한 하나의 장치라고 보시면 됩니다. 프로세스가 초기화되면 운영체제는 프로세스가 커널 오브젝트를 사용할 수 있게 하려고 핸들 테이블을 할당하게 됩니다.(GDI..

에러 핸들링

에러 핸들링은 말 그대로 윈도우 프로그램이 내부 함수들을 진행하면서 발생시킬 수 있는 에러들을 제어하는 것을 말합니다.윈도우 프로그램 뿐만 아니라 기본적으로 모든 애플리케이션에서는 에러를 잘 처리해줘야 예기치 못한 기능 실패시에 프로그램이 Crash 되는 것을 막아줄 수 있습니다. (기능은 처리되지 못할 지라도 프로그램은 계속 동작할 수 있도록) 아래는 윈도우 함수들이 사용하고 있는 리턴형들입니다. 자료형 실패  VOID 실패하지 않음, 리턴형 없음  - 필요 외 프로그래밍시에 VOID형 함수 설계는 피하는것이 좋습니다. BOOL 실패시 0 리턴, 성공시 0이 아닌 값 - 때문에 TRUE(1)를 비교하면 성공했더라도 제대로 된 결과를 얻지 못할 수 있습니다. - 함수 내에서 명시적으로 TRUE를 리턴하는..

Filter Manager - FLT_IO_PARAMETER_BLOCK

FLT_IO_PARAMETER_BLOCK은 FLT_CALLBACK_DATA 구조체의 Iopb 부분으로 I/O 오퍼레이션의 파라미터들을 담고 있습니다.  https://msdn.microsoft.com/en-us/library/windows/hardware/ff544638(v=vs.85).aspx IrpFlags : 어떤 I/O 오퍼레이션인지 표시하는 플래그 MajorFunction : I/O 오퍼레이션의 Major IRPMinorFunction : I/O 오퍼레이션의 Minor IRPOperationFlags : I/O 오퍼레이션의 동작 내용을 표시하는 플래그로 IO_STACK_LOCATION의 Flags를 복사해 표시  Reserved : 사용안함TargetFileObject : 구조체의 I/O 오퍼레..

Filter Manager - FLT_CALLBACK_DATA

필터매니저를 공부하다보니 미니필터와 필터매니저에서 사용하는 FLT_CALLBACK_DATA 구조체를 다루게 되었습니다.  FLT_CALLBACK_DATA 구조체는 I/O 오퍼레이션의 정보들을 담고 있습니다.요렇게 구성되어 있습니다.- https://msdn.microsoft.com/en-us/library/windows/hardware/ff544620(v=vs.85).aspx Flags : 비트마스크로 표현되는 IO 입출력 동작을 담는 공간아래는 미니필터에서만 사용되는 플래그- FLTFL_CALLBACK_DATA_DIRTY : 구조체의 값이 변경된 적이 있으면 세팅 아래는 필터매니저에서만 사용되는 플래그로 필터링 할 I/O 동작의 콜백 구조체를 가리키는 플래그들입니다.- FLTFL_CALLBACK_DAT..

!analyze -v

제 컴퓨터에서 잠자고 있는 덤프 파일을 하나 열어보도록 하겠습니다. 덤프 파일을 열어보면 가장 먼저 보이는 화면은 아래와 유사합니다.  - 덤프 파일의 위치, 덤프 종류 (위 예제에서는 커널덤프 입니다.)- 덤프가 발생한 OS- 덤프 발생 시점의 시간 (4월 19일 13시 24분 41초)- 부팅 이후 동작시간 (2시간 32분)- 버그체크 번호 (BugCheck 3B, BSOD의 종류) 위 화면을 보면, !analyze -v 가 하늘색으로 써져있음을 확인할 수 있습니다.BSOD에 대한 자세한 정보를 확인할 수 있는 명령어입니다. 눌러보죠  내용들이 길기 때문에 우선 여기까지만 자르고 요런 내용들이 나오게 됩니다.가장 먼저 나타나는 부분은 버그체크 번호에 대한 설명입니다.- 시스템 서비스 루틴이 실행 중에 ..

덤프파일 위치

윈도우 디버깅을 하는 방법은 크게 두 가지로 라이브 디버깅과 크래시 덤프 디버깅이 있습니다.- 라이브 디버깅 : 코드를 실행시키면서 디버깅을 동시에 진행하는 방법- 크래시 덤프 디버깅 : 윈도우가 스스로 BSOD(Blue Screen of Death)가 발생한 시점에 덤프 파일을 생성(커널모드)하거나 유저모드 오류가 발생했을 때 생성한 덤프 파일을 디버깅 하는 방법 이 포스트에서는 크래시 덤프 디버깅을 위한 크래시 덤프를 수집하는 방법을 설명하도록 하겠습니다.  유저모드 덤프 수집 방법프로세스 익스플로러를 이용해 덤프를 수집하는 방법입니다. - 프로세스 우클릭 -> Create Dump -> Create Mini or Full Dump를 클릭- 프로세스 익스플로러가 존재하는 폴더에 덤프 파일이 생성됩니다..

윈도우 메세지

윈도우 메세지윈도우는 메세지 기반 구동 방식의 운영체제입니다.윈도우 메세지는 마우스를 움직인다거나 키보드를 입력하는 등의 이벤트들이나 윈도우 크기 변화 색깔의 변화 등과 같은 시스템적 상태 변화에 의해 발생합니다.윈도우 메세지가 발생하면 윈도우는 두 가지 방법으로 메세지를 전달합니다. 1. 각 어플리케이션 마다 가지고 있는 메세지 큐에 메세지를 추가하는 방법 - 사용자 요구에 따른 키보드/마우스 이벤트 등2. 빠른 처리를 위해 어플리케이션의 윈도우 프로시저에 직접 메세지를 전달하는 방법 - 특정 윈도우에 어떠한 작업을 지시하기 위한 메세지이 있습니다.    이벤트 발생 -> 시스템 메세지 큐 -> 응용 프로그램 메세지 큐 -> 메세지 루프 -> 윈도우 프로시저이러한 처리 과정을 가지고 있습니다. 메세지 ..