성태의 닷넷 이야기
홈 주인
모아 놓은 자료
프로그래밍
질문/답변
사용자 관리
사용자
메뉴
아티클
외부 아티클
유용한 코드
온라인 기능
MathJax 입력기
최근 덧글
[정성태] Java - How to use the Foreign Funct...
[정성태] 제가 큰 실수를 했군요. ^^; Delegate를 통한 Bein...
[정성태] Working with Rust Libraries from C#...
[정성태] Detecting blocking calls using asyn...
[정성태] 아쉽게도, 커뮤니티는 아니고 개인 블로그입니다. ^^
[정성태] 질문이 잘 이해가 안 됩니다. 우선, 해당 소스코드에서 ILis...
[양승조
] var대신 dinamic으로 선언해서 해결은 했습니다. 맞는 해...
[양승조
] 또 막혔습니다. ㅠㅠ var list = props[i].Ge...
[양승조
] 아. 감사합니다. 어제는 안됐던것 같은데....정신을 차려야겠네...
[정성태] "props[i].GetValue(props[i])" 코드에서 ...
글쓰기
제목
이름
암호
전자우편
HTML
홈페이지
유형
제니퍼 .NET
닷넷
COM 개체 관련
스크립트
VC++
VS.NET IDE
Windows
Team Foundation Server
디버깅 기술
오류 유형
개발 환경 구성
웹
기타
Linux
Java
DDK
Math
Phone
Graphics
사물인터넷
부모글 보이기/감추기
내용
<div style='display: inline'> <h1 style='font-family: Malgun Gothic, Consolas; font-size: 20pt; color: #006699; text-align: center; font-weight: bold'>.NET Thread 인스턴스로부터 COM Apartment 유형 확인하는 방법</h1> <p> <br /> 예전의 글에서는 x86 프로세스에 대해서 살펴보았는데요.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > windbg - .NET Framework 스레드 개체의 COM Apartment 유형 확인하는 방법 ; <a target='tab' href='http://www.sysnet.pe.kr/2/0/1351'>http://www.sysnet.pe.kr/2/0/1351</a> </pre> <br /> 이번에 x64 프로세스에 대해서도 동일한 작업을 했는데, 이에 대한 기록을 남겨 봅니다.<br /> <br /> 지난 번에는 "attach to process"로 디버거 연결을 했지만, 이번에는 작업 관리자에서 프로세스 덤프를 뜬 파일을 windbg로 열어서 작업해 봤는데, 활성 프로세스는 아니었지만 결과가 정상적으로 출력되었습니다.<br /> <br /> <hr style='width: 50%' /><br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > 0:024> <span style='color: blue; font-weight: bold'>!teb</span> TEB at <span style='color: blue; font-weight: bold'>000007ffffebe000</span> ExceptionList: 0000000000000000 StackBase: 0000000007aa0000 StackLimit: 0000000007a8f000 SubSystemTib: 0000000000000000 FiberData: 0000000000001e00 ArbitraryUserPointer: 0000000000000000 Self: 000007ffffebe000 EnvironmentPointer: 0000000000000000 ClientId: 0000000000001934 . 00000000000005fc RpcHandle: 0000000000000000 Tls Storage: 000007ffffebe058 PEB Address: 000007fffffdf000 LastErrorValue: 0 LastStatusValue: 0 Count Owned Locks: 0 HardErrorMode: 0 0:024> <span style='color: blue; font-weight: bold'>dt _TEB 000007ffffebe000</span> ntdll!_TEB +0x000 NtTib : _NT_TIB +0x038 EnvironmentPointer : (null) ...[생략]... +0x1750 ReservedForPerf : (null) <span style='color: blue; font-weight: bold'>+0x1758 ReservedForOle : 0x00000000`026dea90 Void</span> +0x1760 WaitingOnLoaderLock : 0 ...[생략]... +0x1810 ResourceRetValue : 0x00000000`06c38ca0 Void 0:024> <span style='color: blue; font-weight: bold'>dt ole32!SOleTlsData 0x00000000`026dea90</span> +0x000 pvThreadBase : (null) ...[생략]... +0x078 ContextId : 0xe <span style='color: blue; font-weight: bold'>+0x080 pNativeApt : 0x00000000`026e6b00 CComApartment</span> +0x088 pCallContext : (null) +0x090 pCtxCall : (null) ...[생략]... +0x1b8 outgoingActivationData : tagOutgoingActivationData +0x1c8 cReentrancyFromUserAPC : 0 0:024> <span style='color: blue; font-weight: bold'>dt CComApartment 0x00000000`026e6b00</span> ole32!CComApartment +0x000 __VFN_table : 0x000007fe`fe3466f8 +0x008 _cRefs : 3 +0x00c _dwState : 3 <span style='color: blue; font-weight: bold'>+0x010 _AptKind : 4 ( APTKIND_APARTMENTTHREADED )</span> +0x014 _AptId : 0x5fc +0x018 _pOXIDEntry : 0x00000000`04d5f9c8 OXIDEntry +0x020 _pRemUnk : 0x00000000`06fbead0 CRemoteUnknown +0x028 _cWaiters : 0n0 +0x030 _hEventOID : (null) +0x038 _cPreRegOidsAvail : 0 +0x040 _arPreRegOids : [20] 0xfebf9af3`eb76af7f +0x0e0 _cOidsReturn : 0 +0x0e8 _arOidsReturn : [20] 0x00630069`004d005c +0x188 _arMessageParams : [8] CComApartment::MessageListHead +0x208 _fInitializedCS : 0n1 +0x210 _csMessageParams : _RTL_CRITICAL_SECTION </pre> <br /> _AptKind 필드의 값이 4인 것으로 해당 스레드는 APARTMENT_THREADED 임을 알 수 있습니다.<br /> <br /> <hr style='width: 50%' /><br /> <br /> 닷넷 코드로 이를 확인해 보려면 다음의 TEB 구하는 코드를 참조해서,<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > .NET x64 응용 프로그램에서 Teb 주소를 구하는 방법 ; <a target='tab' href='http://www.sysnet.pe.kr/2/0/1388'>http://www.sysnet.pe.kr/2/0/1388</a> </pre> <br /> 이렇게 만들 수 있습니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > IntPtr reservedForOle = new IntPtr(teb.ToInt64() + 0x1758); long ReservedForOle = Marshal.ReadInt64(reservedForOle); // TEB.ReservedForOle Console.WriteLine("TEB.ReservedForOle: " + ReservedForOle.ToString("x")); Console.WriteLine("dt ole32!SOleTlsData " + ReservedForOle.ToString("x")); IntPtr pNativeApt = new IntPtr(ReservedForOle + 0x80); long NativeApt = Marshal.ReadInt64(pNativeApt); // SOleTlsData.pNativeApt Console.WriteLine("SOleTlsData.pNativeApt: " + NativeApt.ToString("x")); Console.WriteLine("dt CComApartment " + NativeApt.ToString("x")); IntPtr pAptKind = new IntPtr(NativeApt + 0x10); int AptKind = Marshal.ReadInt32(pAptKind); // CComApartment._AptKind Console.WriteLine("CComApartment._AptKind: " + AptKind.ToString("x")); </pre> <br /> <a target='tab' href='http://www.sysnet.pe.kr/bbs/DownloadAttachment.aspx?fid=755&boardid=331301885'>첨부한 파일</a>은 "<a target='tab' href='http://www.sysnet.pe.kr/2/0/1388'>.NET x64 응용 프로그램에서 Teb 주소를 구하는 방법</a>" 예제에 위의 코드를 추가한 것입니다.<br /> </p><br /> <br /><hr /><span style='color: Maroon'>[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]</span> </div>
첨부파일
스팸 방지용 인증 번호
6813
(왼쪽의 숫자를 입력해야 합니다.)