driver-online
  log-inmypagesitemap
top
   자유게시판
   로그북
    견우일지
    시스템팀 개발일지
    Beginning Driver
   유용한 팁&강좌
   CrashDump분석(beta)
   개발QnA
    WDM 입문
    USB
    NDIS
    File System
    Debugging 관련
    그 외
 
개발자 포럼 > 유용한 팁&강좌
[정보] 재미로 보는 Kernel Dump File Structure
 ·작성일 2008.07.17:18.04 (목)  · 작성자 제라툴  · 조 회 7,341


재미 삼아 만들어본 프로그램인데 자료실에 업로드가 되지 않아 이곳에 글을 남깁니다.

윈도우즈에서 기본적으로 제공 되는 Kernel Dump는 크게 3가지가 있습니다. Mini Dump, Summary Dump, Complete Dump… 이 3가지 덤프는 기본적으로 동일한 Header를 가지고 있으며 각 Dump File 마다 조금씩 다른 Sub Header를 가지고 있습니다

typedef struct _DUMP_HEADER
{
CHAR szSignature[4];
CHAR szValidDump[4];
DWORD dwMajorVersion;
DWORD dwMinorVersion;
DWORD dwDirectoryTableBase;
PULONG pPfnDataBase;
PLIST_ENTRY pPsLoadedModuleList;
PLIST_ENTRY pPsActiveProcessHead;
DWORD dwMachineImageType;
DWORD dwNumberProcessors;
DWORD dwBugCheckCode;
DWORD dwBugCheckParameter1;
DWORD dwBugCheckParameter2;
DWORD dwBugCheckParameter3;
DWORD dwBugCheckParameter4;
CHAR dwVersionUser[32];
DWORD dwPaeEnabled:1;
PVOID pKdDebuggerDataBlock;
} DUMP_HEADER, *PDUMP_HEADER;

덤프 Header 부분에는 OS Version , Bugcheck 정도 , Active Thread Link, Loaded Module 등 여러가지 정보가 있지요. Windbg와 함께 설치되는 dumpchk 툴을 사용하면 쉽게 이러한 내용들을 볼 수 있습니다. (직접 확인해 보시길.. ) Summary Dump와 Mini Dump의 경우 이러한 header외에 각각의 Sub Header를 가지고 있습니다.

typedef struct _MINI_DUMP_HEADER
{
DWORD dwServicePackBuild;
DWORD dwSizeOfDump;
DWORD dwValidOffset;
DWORD dwContextOffset;
DWORD dwExceptionOffset;
DWORD dwMmOffset;
DWORD dwPrcbOffset;
DWORD dwProcessOffset;
DWORD dwThreadOffset;
DWORD Unknown[2];
DWORD dwDriverListOffset;
DWORD dwDriverCount
DWORD dwTriageOptions;
} MINI_DUMP_HEADER, *PMINI_DUMP_HEADER;

typedef struct _SUMMARY_DUMP_HEADER
{
DWORD dwUnkown1;
DWORD dwValidDump;
DWORD dwUnkown2;
DWORD dwHeaderSize;
DWORD dwBitmapSize;
DWORD dwPages;
DWORD dwUnknown3;
DWORD dwUnknown4;
}
SUMMARY_DUMP_HEADER, *PSUMMARY_DUMP_HEADER;;

이러한 Sub Header의 역할은 덤프에 포한된 Memory의 Access를 위해서 필요한 정보들을 담고 있지요 . Complete Dump의 경우는 PHYSICAL_MEMORY_DESCRIPTOR 정보를 통해서 Virtual Memory 또는 Physical Memory를 Access 하지만 Summery Dump의 경우는 Kernel Mode Memory Bitmap Block이라는 것을 사용해서 Virtual Memory와 Physical Memory를 Access 하게되죠 ..( Physical Memory와 Virtual Memory간 상호 변환에 대한 것은 Windows Internals를 참고 하시길 )..

// Physical Memory Discriptor for Complete Dump
typedef struct _PHYSICAL_MEMORY_RUN
{
PFN_NUMBER BasePage;
PFN_NUMBER PageCount;
} PHYSICAL_MEMORY_RUN, *PPHYSICAL_MEMORY_RUN;

typedef struct _PHYSICAL_MEMORY_DESCRIPTOR
{
PFN_NUMBER NumberOfRuns;
PFN_NUMBER NumberOfPages;
PHYSICAL_MEMORY_RUN Run[1];
}
PHYSICAL_MEMORY_DESCRIPTOR, *PPHYSICAL_MEMORY_DESCRIPTOR;

// Kernel Mode Memory Bitmap for Summery Dump
typedef struct _RTL_BITMAP
{
DWORD dwSizeOfBitMap;
PULONG pBuffer;
}
RTL_BITMAP, *PRTL_BITMAP ;

이러한 구조를 잘 이해 하면 간단한 덤프 Analysis가 가능합니다. 사실 이러한 구조를 이해하고 Windbg와 같은 멋진 툴을 만들어 보면 좋겠지만 .. 사실 Windbg의 막강함을 구현하기는 쉽지 않죠 . 그래서 제가 할 수 있는 것을 해보았지요 .



   

*답변을 받은 후 감사의 글을 남기는 것은 꼭 지켜야할 네티켓입니다.
    

이 전 : 사용자에 의해 특정 시점에 강제로 Dump file 만들기

다 음 : [정보] Organization of Wdm.h, Ntddk.h, and Ntifs.h


·레오 예술이네요...완전 멋져요...^^* 2009.02.16 코멘트 삭제
·somma 와~~ 멋지세요~ 2008.07.31 코멘트 삭제
·미친감자 오~ dmp파일이 이런식으로 되어 있었던거였군요.. 2008.07.28 코멘트 삭제
·제라툴 그냥 삽질일뿐 ㅜ.ㅜ 말그대로 재미로만....
Section이 나누어진 dumptopicture 같은 걸 만드는게 지금
현재 목표 ㅋㅋㅋ
2008.07.18 코멘트 삭제
·견우 우아~ 멋지네용~~~~ 2008.07.17 코멘트 삭제
 
quick-menu
event
study
QnA
pds
family-site concert used used2 intro
address
address