ShellExecute 에러 질문
-
2011년 10월 13일 목요일 오전 11:11
Mpeg2DecFilter.ax 필터를 CoCreateInstance()를 통해 생성하고 나서 ShellExecute()를 실행해 폴더를 열고자 하면 0xC0000096: Privileged instruction 에러가 발생합니다.
팟플레이어에서 해당 필터를 연결하고 로고 폴더 열기를 실행 할 경우 같은 에러가 발생합니다. kernel32.dll의 0x76197dd4 위치에서 Exception이 발생합니다.
그런데 64비트 운영체제나 CreateProcess()를 통해 폴더를 열면 문제가 발생하지 않습니다.
SHFileOperation()을 통한 폴더 복사도 정상 작동 하는 것으로 보아 ShellExecute()내부에 원인이 있을 것 같아 질문 올립니다.
모든 응답
-
2011년 10월 14일 금요일 오전 4:43중재자
안녕하십니까? hyun6님
Microsoft MSDN의 Forum 사이트를 방문해 주셔서 감사합니다.
문의 하신 “ShellExecute 에러 질문”에 대한 답변을 드리겠습니다.
0xC0000096: Privileged instruction 에러가 발생하는 것으로 보아, 정상적으로 실행되는 상황은 아닌 것으로 보여집니다. 즉, 중간에 hooking 모듈이 끼어있다거나 malware의 간섭으로 그러한 현상이 일어나는 것이 아닐까 의심이 됩니다.
exception시에 발생하는 덤프 파일을 공유해 주시거나, visual C++이나 windbg와 같은 보조툴을 이용해서, 예외가 발생하는 시점의 call stack의 정보 또는 assembly instruction codes를 보여주시면 해결에 도움이 될 것입니다.
제가 문제에 대해 더 알아야 할 것이 있다면 응답 주시면 감사하겠습니다.
제시해 드린 답변이 도움이 되었기를 바랍니다.
-
2011년 10월 18일 화요일 오전 5:58
안녕하세요.
Exception 발생 시 어셈 코드와 콜스택 정보 올려 드립니다.
. 어셈 코드
77037CDD ret 20h
77037CE0 mov eax,dword ptr [ebp-0DC4h]
77037CE6 mov ecx,dword ptr [ebp-0DA0h]
77037CEC dec eax
77037CED cmp dword ptr [ecx+0E4h],1
77037CF4 mov ecx,dword ptr [ebp-0DE4h]
77037CFA jne 77037D01
77037CFC jmp 770672D5
77037D01 cmp eax,ecx
77037D03 jb 77037D0D
77037D05 cmp byte ptr [eax],2
77037D08 ja 77037D0D
77037D0A dec eax
77037D0B jmp 77037D01
77037D0D mov ebx,dword ptr [ebp-0D88h]
77037D13 mov edx,eax
77037D15 sub edx,ecx
77037D17 add edx,4
77037D1A sub ebx,esi
77037D1C cmp ebx,edx
77037D1E jle 770672EC
77037D24 cmp ecx,eax
77037D26 jbe 77054FE8
77037D2C mov ebx,dword ptr [ebp-0DE8h]
77037D32 jmp 77037C4E
77037D37 movzx eax,dl
77037D3A cmp eax,4
77037D3D jle 770388D9
77037D43 cmp eax,5
77037D46 je 770551BE
77037D4C cmp eax,6
77037D4F je 770246D6
77037D55 jle 77037BDF
77037D5B cmp eax,0Ch
77037D5E jg 77037BDF
77037D64 cmp dword ptr [ebp-0DFCh],0
77037D6B jne 77037BDF
77037D71 mov edi,dword ptr [ebp-0DB0h]
77037D77 movzx eax,word ptr [edi]
77037D7A mov ecx,dword ptr [ebp-0DC8h]
77037D80 mov edx,eax
77037D82 shr edx,8
77037D85 mov byte ptr [ecx],dl
77037D87 mov byte ptr [ecx+1],al
77037D8A mov al,byte ptr [edi+2]
77037D8D add ecx,2
77037D90 mov dword ptr [ebp-0DC8h],ecx
77037D96 mov ecx,dword ptr [ebp-0DC4h]
77037D9C mov byte ptr [ecx],al
77037D9E mov al,byte ptr [edi+3]
77037DA1 and al,byte ptr [ebp-0E04h]
77037DA7 and al,3Fh
77037DA9 mov ecx,dword ptr [ebp-0DC0h]
77037DAF mov byte ptr [ecx],al
77037DB1 inc dword ptr [ebp-0DC4h]
77037DB7 inc dword ptr [ebp-0DC0h]
77037DBD jmp 77037BDF
77037DC2 nop
77037DC3 nop
77037DC4 nop
77037DC5 nop
77037DC6 nop
77037DC7 jmp dword ptr ds:[76FF1DA0h]
77037DCD nop
77037DCE nop
77037DCF nop
77037DD0 nop
77037DD1 nop
77037DD2 db e9h
77037DD3 db a9h
77037DD4 in al,dx <= Exception 발생 위치
77037DD5 pop ecx
77037DD6 mov word ptr [ebp-40161883h],cs
77037DDC pop ebx
. 콜 스택 정보> kernel32.dll!77037dd4()
[아래 프레임은 올바르지 않거나 누락되었거나 kernel32.dll에 대해 로드된 기호가 없음]
kernel32.dll!7703d93e()
shlwapi.dll!770eae73()
shlwapi.dll!770eae52()
shell32.dll!761b4ef8()
shell32.dll!7613f97f()
shell32.dll!761bef19()
shell32.dll!7613f9e3()
shell32.dll!761b4f76()
shell32.dll!761ae670()
shell32.dll!761b4f53()
shell32.dll!76124b3b()
shell32.dll!7612519b()
shell32.dll!76132260()
shell32.dll!76132387()
shlwapi.dll!770e43c0()
kernel32.dll!7703ed6c()
ntdll.dll!779c37f5()
ntdll.dll!779c37c8() -
2011년 10월 21일 금요일 오전 9:31중재자
안녕하십니까? hyun6님
Microsoft MSDN의 Forum 사이트를 방문해 주셔서 감사합니다.
적어주신 에러가 발생한 코드를 살펴보면, 전혀 정상적인 코드가 아님을 알 수 있습니다.
77037DD2 db e9h
77037DD3 db a9h
77037DD4 in al,dx <= Exception 발생 위치
77037DD5 pop ecx
77037DD6 mov word ptr [ebp-40161883h],cs
77037DDC pop ebx
즉, 타 위치의 코드에서 0x77037dd4 주소로 call이나 jmp가 이루어졌지만, 이것은 정상적인 함수 호출의 결과가 아니라 알수없는 이유 때문입니다. Call stack에서도 의미있는 정보를 얻을 수는 없어 보입니다. 따라서 다음과 같은 접근이 필요합니다.
- 개발PC가 아닌, 타 PC에서 코드를 테스트 하여 동일한 문제가 재현되는지를 확인합니다
- Mpeg2DecFilter 필터 자체의 문제일 수 있으므로, 해당 포럼을 검색해 봅니다. 실제로Mpeg2DecFilter exception 과 관련한 여러 검색 결과를 확인할 수 있었습니다.
- Windbg, Debugdiag와 같은 툴을 사용하여 문제가 발생할 당시의 dump 파일을 수집할 수 있다면, 덤프 분석을 의뢰합니다.
제가 문제에 대해 더 알아야 할 것이 있다면 응답 주시면 감사하겠습니다.
제시해 드린 답변이 도움이 되었기를 바랍니다.

