본문 바로가기

My Study/etc

C0000374 예외코드

학교에서는 컴퓨터를 XP로 사용하지만 집에서는 윈7로 사용하고 있습니다. 몇몇 사람들이 윈7에서는 프로그램 안되는거 꽤 많다. 아직은 쓰지마라.. 라는 둥.. 안좋은 말들을 하더군요. 하지만 전 무시하고 계속 썼습니다. 제가 프로그램을 돌리는데 이때까지 단 하나도 에러나는 프로그램은 없습니다. 하지만! 오늘.. 드뎌 하나가 발생했습니다. 그것도 윈XP에서는 잘 돌아가지만 윈7에서는 잘 돌아가지 않은 현상이지요.

제가 자주하는 게임이 있습니다. 피카츄 배구 게임입니다. 인터넷에 찾아보면 피카츄배구 게임이라고 엄청 많이 있는데
평소대로 아무거나 다운 받아서 해보았습니다. 제 컴의 OS는 Win 7 입니다.

게임을 시작하려는 화면입니다.

해당 화면에서 혼자서로 시작하는 순간.. 에러가 퍽.. 뜨게 됩니다. 전 예외가 났을 때 바로 WinDbg로 연결되도록 해놔서 
WinDbg가 뜨더군요. 뜬 김에 WinDbg에게 분석이나 한번 해보라고 했습니다.

WinDbg가 분석해준 결과입니다.
FAULTING_IP: 
ntdll!RtlReportCriticalFailure+57
77b1283b eb12            jmp     ntdll!RtlReportCriticalFailure+0x6b (77b1284f)
EXCEPTION_RECORD:  ffffffff -- (.exr 0xffffffffffffffff)
ExceptionAddress: 77b1283b (ntdll!RtlReportCriticalFailure+0x00000057)
   ExceptionCode: c0000374
  ExceptionFlags: 00000001
NumberParameters: 1
   Parameter[0]: 77b2cdc8

FAULTING_THREAD:  000016cc
DEFAULT_BUCKET_ID:  STATUS_HEAP_CORRUPTION
PROCESS_NAME:  ¿¡·¯.exe
ERROR_CODE: (NTSTATUS) 0xc0000374 - <Unable to get error code text>
EXCEPTION_CODE: (NTSTATUS) 0xc0000374 - <Unable to get error code text>
EXCEPTION_PARAMETER1:  77b2cdc8
NTGLOBALFLAG:  0
APPLICATION_VERIFIER_FLAGS:  0
PRIMARY_PROBLEM_CLASS:  STATUS_HEAP_CORRUPTION
BUGCHECK_STR:  APPLICATION_FAULT_STATUS_HEAP_CORRUPTION
LAST_CONTROL_TRANSFER:  from 77b1376b to 77b1283b

STACK_TEXT:  
0012fbc8 77b1376b c0000374 77b2cdc8 0012fc0c ntdll!RtlReportCriticalFailure+0x57
0012fbd8 77b1384b 00000002 77600d6c 002b0000 ntdll!RtlpReportHeapFailure+0x21
0012fc0c 77adf98a 00000009 002b0000 004156bc ntdll!RtlpLogHeapFailure+0xa1
0012fc58 77a7cd89 77600df4 00000000 004156bc ntdll!RtlpProbeUserBufferSafe+0x48
0012fc94 779bd609 002b0000 00000801 004156bc ntdll!RtlGetUserInfoHeap+0x98
0012fce4 004061fc 004156bc 0012fec4 014f1c60 kernel32!GlobalHandle+0x48
WARNING: Stack unwind information not available. Following frames may be wrong.
0012fd08 77aa316f 0012fee8 77a6d74d 00d8f9d8 __+0x61fc
0012fe3c 00406acd 0012fef4 00000000 002b21f3 ntdll!RtlpFreeHeap+0xb7a
0012fe6c 00401b56 00410000 000b060c 00010005 __+0x6acd
0012fef4 0040a48d 00400000 00000000 002b21f3 __+0x1b56
0012ff88 779c1194 7ffdd000 0012ffd4 77aab3f5 __+0xa48d
0012ff94 77aab3f5 7ffdd000 77600eb4 00000000 kernel32!BaseThreadInitThunk+0xe
0012ffd4 77aab3c8 0040a350 7ffdd000 00000000 ntdll!__RtlUserThreadStart+0x70
0012ffec 00000000 0040a350 7ffdd000 00000000 ntdll!_RtlUserThreadStart+0x1b

FOLLOWUP_IP: 
__+61fc
004061fc 50              push    eax
SYMBOL_STACK_INDEX:  6
SYMBOL_NAME:  __+61fc
FOLLOWUP_NAME:  MachineOwner
MODULE_NAME: __
DEBUG_FLR_IMAGE_TIMESTAMP:  3510a3c0
STACK_COMMAND:  ~0s ; kb
BUCKET_ID:  APPLICATION_FAULT_STATUS_HEAP_CORRUPTION___+61fc
IMAGE_NAME:  C:\Users\Ezbeat\Desktop\¿¡·¯.exe
FAILURE_BUCKET_ID:  STATUS_HEAP_CORRUPTION_c0000374_C:_Users_Ezbeat_Desktop_____.exe!Unknown
Followup: MachineOwner


예외코드를 보니 c0000374 이거였습니다.

그리고 아래쪽에 콜스택을 봐보면 제가 또 빨간색으로 표시해둔 부분이 있습니다.
해당 함수들은 Win Xp에는 없는 함수들입니다. 정확히 말하면 WinXP에서와 Win7에서 ntdll.dll은 다릅니다.
용량도 무려 2배차이나 납니다.

WinXP : ntdll.dll에 있는 함수 개수 : 1316개
Win  7 : ntdll.dll에 있는 함수 개수 : 1981개

윈7로 오면서 ntdll.dll 또한 바뀌고.. 함수 개수 또한 엄청나게 추가가 됬습니다.
( 그래봤자 대부분이 문서화안된 함수들.. 치사한 MS.. )

일단 대충 예상으론 WinXP에는 없는 함수들을 ntdll.dll에서 사용하고 있으며 그로인해 예외(오류)가 나고있는거 같습니다.
즉, 어플과 ntdll.dll이 충돌나고 있다고 생각하시면 되겠습니다.

그리고 C0000374라는 예외코드는 빨간색으로 표시해 두었듯이 STATUS_HEAP_CORRUPTION 입니다.
딱 보면 힙이 손상됬다고 나옵니다.
해당 예외에 대해서 쫌더 알아보도록 하겠습니다.
관련 사이트 입니다

Windows OS에서 발생하는 C0000374 에러는 특정 응용프로그램과 관련되어 있습니다.
또한 C0000374 에러는 당신의 Windows OS에서 중요한 레지스터 값이 잘못 수정되어서 발생합니다.
만약에 특정 파일 확장자가 제대로 동작하지 않으면 인식되지 않을 것이다. 그리고 윈도우로 에러를 보고할 것입니다.

대충 위 링크의 글을 읽어보면 레지스터에 잘못된 값이 씌워졌다는 것입니다. 
그래서 레지스터를 제대로 복구시켜주는 툴도 배포를 하고있군요. 
하지만!! -_-;; 정작 스캔은 다 해주면서 치료를 하려고 하면 돈을 내라는군요..
장난하네요.. 할인 쿠폰도 준다네요.. 일단은 돈을 내야하므로 ... ^^;
구해서 써야겠네요. 

구하신 분들은 한번 해보시길 ^^;;

그리고 해당 예외에 대한 자료를 쫌 더 찾아봤더니 아직 MS에서도 특별한 대책을 내놓고 있지못하고 있다고 합니다.
해외에서도 이같은 오류가 뜬 사람들이 많은거 같은데.. IE에서도 오류가 나고 explorer.exe 에서도 오류가 난다고 합니다.
똑같은 오류이구요.
뭐.. 언젠간 업데이트 되겠지요. 

그리고 인터넷에 돌아다니는 윈7호환 피카배구를 다운받아서 XP에서만 돌아가는 피카배구와 차이점을 분석해본 결과
윈7호환용 피카배구는 GlobalHandle라는 함수를 아에 안썼더군요. 

피카배구가 플레이 될 때 돌아가는 루틴을 아에 바꿔버린듯 싶습니다.

점점 많은 툴들을 사용하다보면 왠지.. 안되는 툴들이 하나씩 나올꺼 같아서 무섭군요.