2014-03-27 4 views
1

user32.dll의 TranslateMessage() API에서 예외가 발생합니다. windbg 명령에서! analyze -v를 사용하여 예외를 분석하려고하면 다음 정보가 표시됩니다. 누구든지 오류 디코딩을 도울 수 있습니까?translateemessage()에서 첫 번째 기회가 throw 됨 window32의 user32.dll의 api가 64 비트로

FAULTING_IP: 
+0 
ffffffff`e85b6720 ??    ??? 

EXCEPTION_RECORD: ffffffffffffffff -- (.exr 0xffffffffffffffff) 
ExceptionAddress: ffffffffe85b6720 
    ExceptionCode: c0000005 (Access violation) 
    ExceptionFlags: 00000000 
NumberParameters: 2 
    Parameter[0]: 0000000000000008 
    Parameter[1]: ffffffffe85b6720 
Attempt to execute non-executable address ffffffffe85b6720 

FAULTING_THREAD: 000000000000642c 

DEFAULT_BUCKET_ID: WRONG_SYMBOLS 

PROCESS_NAME: CapGM.exe 

ADDITIONAL_DEBUG_TEXT: 
You can run '.symfix; .reload' to try to fix the symbol path and load symbols. 

MODULE_NAME: mfc100u 

FAULTING_MODULE: 0000000077720000 ntdll 

DEBUG_FLR_IMAGE_TIMESTAMP: 4df2cfdb 

ERROR_CODE: (NTSTATUS) 0xc0000005 - The instruction at 0x%08lx referenced memory at 0x%08lx. The memory could not be %s. 

EXCEPTION_CODE: (NTSTATUS) 0xc0000005 - The instruction at 0x%08lx referenced memory at 0x%08lx. The memory could not be %s. 

EXCEPTION_PARAMETER1: 0000000000000008 

EXCEPTION_PARAMETER2: ffffffffe85b6720 

WRITE_ADDRESS: ffffffffe85b6720 

FOLLOWUP_IP: 
mfc100u+2745a8 
00000000`74eb45a8 488bf0   mov  rsi,rax 

FAILED_INSTRUCTION_ADDRESS: 
+2745a8 
ffffffff`e85b6720 ??    ??? 

APP: capgm.exe 

IP_ON_HEAP: ffffffffe85b6720 
The fault address in not in any loaded module, please check your build's rebase 
log at <releasedir>\bin\build_logs\timebuild\ntrebase.log for module which may 
contain the address if it were loaded. 

PRIMARY_PROBLEM_CLASS: WRONG_SYMBOLS 

BUGCHECK_STR: APPLICATION_FAULT_WRONG_SYMBOLS 

LAST_CONTROL_TRANSFER: from 0000000077519bd1 to ffffffffe85b6720 

STACK_TEXT: 
00000000`003bbb68 00000000`77519bd1 : 00000000`00000000 00000000`00000000 00000000`00000000 00000000`775172cb : 0xffffffff`e85b6720 
00000000`003bbb70 00000000`775172cb : 00000000`00000000 ffffffff`e85b6720 00000000`00000000 00000000`00000000 : USER32!TranslateMessageEx+0x2a1 
00000000`003bbc30 00000000`77516829 : 00000000`00000000 00000000`003bbd78 000007fe`ecfede14 00000018`000000c8 : USER32!SetWindowTextW+0x277 
00000000`003bbc90 00000000`777711f5 : 00000000`00000000 000007fe`ecfb0000 00000000`000003e9 00000000`0055055c : USER32!IsDialogMessageW+0x169 
00000000`003bbcf0 00000000`7751041a : 00000000`77510397 00000000`003bc1a8 00000000`00000000 00000000`003bc1a8 : ntdll!KiUserCallbackDispatcher+0x1f 
00000000`003bbd78 00000000`77510397 : 00000000`003bc1a8 00000000`00000000 00000000`003bc1a8 00000000`003bc1a8 : USER32!SendMessageTimeoutW+0x95a 
00000000`003bbd80 00000000`775105d8 : 00000000`00000000 00000000`00000002 00000000`00000000 00000000`56000000 : USER32!SendMessageTimeoutW+0x8d7 
00000000`003bc0f0 00000000`77510880 : 00000000`00000148 00000000`56000000 00000000`003bc3d9 00000000`74f0c6b0 : USER32!SendMessageTimeoutW+0xb18 
00000000`003bc240 00000000`74eb45a8 : 00000000`00582960 00000000`00000000 00000000`00000320 00000000`00900000 : USER32!CreateWindowExW+0x70 
00000000`003bc2c0 00000000`74eac377 : 00000000`0c07e510 00000000`0c07e510 00000000`00000000 00000000`00900000 : mfc100u+0x2745a8 
00000000`003bc340 00000000`74eac4b6 : 00000000`0055055c 00000000`0c07e510 00000000`56000000 00000000`00000318 : mfc100u+0x26c377 
00000000`003bc400 000007fe`e8ba1316 : 00000000`00000000 00000000`003be330 00000000`0bee1a80 00000000`0c07e510 : mfc100u+0x26c4b6 
00000000`003bc470 000007fe`ecfdaab6 : ffffffff`ffffffff 00000000`00000000 ffffffff`ffffffff 00000000`00000000 : FrontEnd!FrontWindowFactory<dFrontWindow>::create+0x136 

번역 할 메시지가 잘못된 주소에 액세스하려고 시도하지만 어떻게 수정합니까?

+0

에 대한

감사합니다; 즉,이 더 나은 그림을 얻을 수있는 배선 기호 – WhozCraig

+0

나는 user32.pdb 파일이 필요하다고 생각한다. 기본적으로 나는 윈도우 PDB가 없다. 다른 모든 pdbs는 이미로드되었습니다 – user3462791

+1

user32.pdb의 심볼이 더 좋습니다. 이 경우 WinDbg를 사용하는 경우 MS 심볼 저장소가 심볼 경로에 있는지 확인하십시오. 이를 수행하는 방법에 대한 정보는 여기에서 찾을 수 있습니다. ** (http://msdn.microsoft.com/en-us/library/windows/hardware/ff558829 (v = vs.85) .aspx). – WhozCraig

답변

0

다른 사람들이 위에서 언급 한 것처럼 - 먼저 할 일은 올바른 기호를 얻는 것입니다.

Microsoft는 Windows 바이너리에 공용 기호를 노출합니다. 그게 잘못 될지 훨씬 더 잘 알 수있을거야.

이제, 공유 한! analyze 출력과 TranslateMessage의 서명을 살펴보십시오.

BOOL WINAPI TranslateMessage( _In_ const MSG *lpMsg );

내 추측은 lpMsg 정품 입력 된 것을 검증되지 않는다는 것입니다. 입력을 붙여 넣을 수 있습니까?

일반적으로 잠시 동안 있었던 엄지 손가락 공개 API는 매우 잘 테스트되었습니다. 그래서 뭔가 잘못되었을 때, 우리 프로그램이 어떤 입력을 전달하는지 확인하는 것이 좋습니다.

1

문제가 해결되었습니다. SetWindowLongPtr() 오류가 발생했습니다. 이것은 SetWindowLong()의 64 비트 변형입니다. 함수는 변경되었지만 wriiten의 값은 여전히 ​​long 변수에 캡처되었습니다. LONG_PTR로 변경하면 문제가 해결되었습니다. 이제 주소가 잘리지 않고 해당 사용자 루틴이 호출됩니다. 모든 사람의 도움 :) 이것은 실제로 덤프 여러 번 주어진 조언을 따른다면 해부하는 것이 훨씬 쉬울 것

+0

어떻게 문제의 원인을 찾았습니까? –