Microsoft MVP성태의 닷넷 이야기
.NET Framework: 509. ELEMENT_TYPE_MODIFIER의 조합 [링크 복사], [링크+제목 복사],
조회: 21035
글쓴 사람
정성태 (techsharer at outlook.com)
홈페이지
첨부 파일
 

(시리즈 글이 9개 있습니다.)
.NET Framework: 491. 닷넷 Generic 타입의 메타 데이터 토큰 값 알아내는 방법
; https://www.sysnet.pe.kr/2/0/1848

.NET Framework: 494. 값(struct) 형식의 제네릭(Generic) 타입이 박싱되는 경우의 메타데이터 토큰 값
; https://www.sysnet.pe.kr/2/0/1857

.NET Framework: 495. CorElementType의 요소 값 설명
; https://www.sysnet.pe.kr/2/0/1860

.NET Framework: 509. ELEMENT_TYPE_MODIFIER의 조합
; https://www.sysnet.pe.kr/2/0/2894

.NET Framework: 510. 제네릭(Generic) 인자에 대한 메타데이터 등록 확인
; https://www.sysnet.pe.kr/2/0/2907

.NET Framework: 844. C# - 박싱과 언박싱
; https://www.sysnet.pe.kr/2/0/11943

.NET Framework: 955.  .NET 메서드의 Signature 바이트 코드 분석
; https://www.sysnet.pe.kr/2/0/12379

.NET Framework: 1130. C# - ELEMENT_TYPE_INTERNAL 유형의 사용 예
; https://www.sysnet.pe.kr/2/0/12903

.NET Framework: 1174. C# - ELEMENT_TYPE_FNPTR 유형의 사용 예
; https://www.sysnet.pe.kr/2/0/12998




ELEMENT_TYPE_MODIFIER의 조합

ELEMENT_TYPE_MODIFIER 조합을 알다가도 모르겠군요. ^^;

지난 글에서는 SNINativeMethodWrapper.MarshalConsumerInfo 메서드의 signature가 "SIG: 00 02 01 12 20 20 45 0f 11 30" 값이었고, 그중 0x45가 ELEMENT_TYPE_MODIFIER | ELEMENT_TYPE_PINNED의 조합인 것을 알 수 있었습니다.

그런데, .NET 2.0에 정의된 SNINativeMethodWrapper.MarshalConsumerInfo는 signature가 다릅니다.

.method private hidebysig static void  MarshalConsumerInfo(class SNINativeMethodWrapper/ConsumerInfo consumerInfo,
                                                           valuetype SNI_CONSUMER_INFO* modopt([mscorlib]System.Runtime.CompilerServices.IsImplicitlyDereferenced) native_consumerInfo) cil managed
// SIG: 00 02 01 12 1C 20 39 0F 11 28

00 IMAGE_CEE_CS_CALLCONV_DEFAULT (static method)
02 # of arg(s)
01 ELEMENT_TYPE_VOID (return)
12 ELEMENT_TYPE_CLASS (1st arg type)
  1C (1byte - type token)
  20 ELEMENT_TYPE_CMOD_OPT
  39 ????
  0F ELEMENT_TYPE_PTR
11 ELEMENT_TYPE_VALUETYPE (2nd arg type)
  28 (1byte - type token) 

0x39라니...? ELEMENT_TYPE_MODIFIER의 값이 0x40이기 때문에 .NET 2.0 시절에는 ELEMENT_TYPE_MODIFIER로 분류되지도 않았다는 의미가 됩니다. 알수는 없지만, 억지로 조합해보면 다음과 같이 0x39를 만들 수 있습니다.

ELEMENT_TYPE_VALUETYPE = 0x11
ELEMENT_TYPE_PTR = 0x0f
                 == 20
ELEMENT_TYPE_U == 0x19

ELEMENT_TYPE_VALUETYPE | ELEMENT_TYPE_PTR | ELEMENT_TYPE_U

그런데, ".NET 4.0 (x64)"에서는 또 다른 조합이 나옵니다.

.method private hidebysig static void  MarshalConsumerInfo(class SNINativeMethodWrapper/ConsumerInfo consumerInfo,
                                                           valuetype Sni_Consumer_Info* modopt([mscorlib]System.Runtime.CompilerServices.IsImplicitlyDereferenced) native_consumerInfo) cil managed
SIG: 00 02 01 12 20 20 49 0F 11 38

0x49입니다. ELEMENT_TYPE_MODIFIER의 조합을 corhdr.h에서 보면,

ELEMENT_TYPE_MODIFIER       = 0x40,
ELEMENT_TYPE_SENTINEL       = 0x01 | ELEMENT_TYPE_MODIFIER, // sentinel for varargs
ELEMENT_TYPE_PINNED         = 0x05 | ELEMENT_TYPE_MODIFIER,
ELEMENT_TYPE_R4_HFA         = 0x06 | ELEMENT_TYPE_MODIFIER, // used only internally for R4 HFA types
ELEMENT_TYPE_R8_HFA         = 0x07 | ELEMENT_TYPE_MODIFIER, // used only internally for R8 HFA types

0x49는 도저히 나올 수 없는 조합입니다. 게다가, 이번에 공개된 .NET 4.6 Preview의 corhdr.h에 보면 ELEMENT_TYPE_R4_HFA, ELEMENT_TYPE_R8_HFA는 아예 삭제된 것을 볼 수 있습니다.

// C:\Program Files (x86)\Windows Kits\NETFXSDK\4.6\Include\um\corhdr.h

ELEMENT_TYPE_MODIFIER       = 0x40,
ELEMENT_TYPE_SENTINEL       = 0x01 | ELEMENT_TYPE_MODIFIER, // sentinel for varargs
ELEMENT_TYPE_PINNED         = 0x05 | ELEMENT_TYPE_MODIFIER,

도대체 어떻게 0x49가 나올 수 있을까 싶어 무작위로 검색해 보니, coreclr에 힌트가 나옵니다.

// https://github.com/dotnet/coreclr/blob/master/src/vm/compactlayoutwriter.h

178     enum CorElementTypeMDIL 
179     { 
180         ELEMENT_TYPE_NATIVE_VALUETYPE = 0x08 | ELEMENT_TYPE_MODIFIER 
181     }; 

위의 값을 기반으로 만들어 보면, 0x49를 이렇게 만들어 볼 수 있습니다.

0x49 == ELEMENT_TYPE_MODIFIER | 0x08 | 0x01
     == ELEMENT_TYPE_NATIVE_VALUETYPE | ELEMENT_TYPE_SENTINEL

00 IMAGE_CEE_CS_CALLCONV_DEFAULT (static method)
02 # of arg(s)
01 ELEMENT_TYPE_VOID (return)
12 ELEMENT_TYPE_CLASS (1st arg type)
  20 (1byte - type token)
  20 ELEMENT_TYPE_CMOD_OPT
  49 ELEMENT_TYPE_NATIVE_VALUETYPE | ELEMENT_TYPE_SENTINEL 
  0F ELEMENT_TYPE_PTR
11 ELEMENT_TYPE_VALUETYPE (2nd arg type)
  38 (1byte - type token)

물론, 위의 가정은 어디까지나 제 개인적인 가정입니다. ^^




[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]







[최초 등록일: ]
[최종 수정일: 10/24/2018]

Creative Commons License
이 저작물은 크리에이티브 커먼즈 코리아 저작자표시-비영리-변경금지 2.0 대한민국 라이센스에 따라 이용하실 수 있습니다.
by SeongTae Jeong, mailto:techsharer at outlook.com

비밀번호

댓글 작성자
 




... 181  182  183  184  185  186  187  188  [189]  190  191  192  193  194  195  ...
NoWriterDateCnt.TitleFile(s)
227정성태4/13/200617381Team Foundation Server: 2. TFS 빌드 오류 유형 - MSBUILD: warning : Specified cast is not valid
226정성태4/13/200615363Team Foundation Server: 1. TFS 오류 유형 - TF50608: Unable to retrieve information for security object
225정성태10/17/200614909.NET Framework: 67. VS.NET 2005 도구 상자에 있는 Workflow Activity 항목의 아이콘 변경
223정성태4/13/200626177.NET Framework: 66. Microsoft .NET Framework 2.0 Configuration 수동 설치파일 다운로드1
224정성태4/13/200619737    답변글 .NET Framework: 66.1. "Microsoft .NET Framework 2.0 Configuration" MSI 설치 파일 버전파일 다운로드1
222정성태4/13/200618740.NET Framework: 65. VS.NET 2005: 파일 기반 웹 프로젝트의 "Virtual Path" 제거
220정성태4/13/200616471.NET Framework: 64. ClickOnce - 배포 시 오류 : "Error: An unexpected error occurred -- The parameter is incorrect."
219정성태4/13/200631286.NET Framework: 63. ClickOnce - 최초 실행 시 보안 경고창 없애는 방법 [1]
216정성태4/13/200618338스크립트: 8. 3월 1일 ActiveX Patch 적용 후, JS 로 수정한 임베딩 컨트롤이 여전히 비활성화 되는 문제 [2]
215정성태4/13/200619683.NET Framework: 62. ASP.NET 웹 컨트롤 렌더링 가로채기
214정성태4/13/200619022.NET Framework: 61. DateTime - DateTime = 사이의 "Month" 수 계산 [2]
213정성태4/13/200621282.NET Framework: 60. localhost 이외의 컴퓨터에서 asmx 테스트 페이지 호출 [1]
218정성태4/13/200619645    답변글 .NET Framework: 60.1. asmx 테스트 페이지를 보여주고 싶지 않을 때
211정성태4/13/200617520VS.NET IDE: 38. VS.NET 2005 - "Export Template" 메뉴
210정성태4/13/200616989.NET Framework: 59. EXE 참조 가능 - VS.NET 2005 [2]
209정성태4/13/200616483스크립트: 7. 4월 12일 ActiveX 패치 문제를 해결할 수 있는 가장 간단한 방법 [6]파일 다운로드1
208정성태10/21/200616213Windows: 1. 성태도 ^^ Vista 설치 해봤습니다.
212정성태10/20/200615757    답변글 Windows: 1.1. Vista 에서 WinFX 런타임 구동
207정성태4/13/200624779VC++: 23. VC++ RGS 파일에 사용자 정의 파라미터 추가
205정성태4/13/200621815VS.NET IDE: 37. devenv.exe를 이용한 Command Line 컴파일 [1]
204정성태5/8/200617022웹: 2. Server Unavailable - Server Application Unavailable
203정성태4/13/200615896웹: 1. IIS 설정 옵션: Verify(Check) that file exists
202정성태4/13/200615614VS.NET IDE: 36. Automatically synchronize with an Internet time server
201정성태4/13/200618668기타: 12. XMLHTTP Failure and SUS Admin
200정성태4/13/200618040.NET Framework: 58. 웹 서비스 메서드 호출 오류 유형 - text/html; charset=xxx, but expected 'text/xml'
199정성태4/13/200619379스크립트: 6. XHTML or HTML 4.01 표준 준수
... 181  182  183  184  185  186  187  188  [189]  190  191  192  193  194  195  ...