@@ -56,6 +56,156 @@ typedef struct _STORAGESTREAM
56
56
} STORAGESTREAM , * PSTORAGESTREAM ;
57
57
#include <poppack.h>
58
58
59
+ PSTORAGESIGNATURE PvpPeGetClrMetaDataHeader (
60
+ VOID
61
+ )
62
+ {
63
+ PSTORAGESIGNATURE metaData ;
64
+
65
+ metaData = PhMappedImageRvaToVa (& PvMappedImage , PvImageCor20Header -> MetaData .VirtualAddress , NULL );
66
+
67
+ if (metaData )
68
+ {
69
+ __try
70
+ {
71
+ PhProbeAddress (metaData , PvImageCor20Header -> MetaData .Size , PvMappedImage .ViewBase , PvMappedImage .Size , 4 );
72
+ }
73
+ __except (EXCEPTION_EXECUTE_HANDLER )
74
+ {
75
+ metaData = NULL ;
76
+ }
77
+ }
78
+
79
+ return metaData ;
80
+ }
81
+
82
+ PPH_STRING PvpPeGetClrFlagsText (
83
+ VOID
84
+ )
85
+ {
86
+ PH_STRING_BUILDER stringBuilder ;
87
+
88
+ PhInitializeStringBuilder (& stringBuilder , 256 );
89
+
90
+ if (PvImageCor20Header -> Flags & COMIMAGE_FLAGS_ILONLY )
91
+ PhAppendStringBuilder2 (& stringBuilder , L"IL only, " );
92
+ if (PvImageCor20Header -> Flags & COMIMAGE_FLAGS_32BITREQUIRED )
93
+ PhAppendStringBuilder2 (& stringBuilder , L"32-bit only, " );
94
+ if (PvImageCor20Header -> Flags & COMIMAGE_FLAGS_32BITPREFERRED )
95
+ PhAppendStringBuilder2 (& stringBuilder , L"32-bit preferred, " );
96
+ if (PvImageCor20Header -> Flags & COMIMAGE_FLAGS_IL_LIBRARY )
97
+ PhAppendStringBuilder2 (& stringBuilder , L"IL library, " );
98
+
99
+ if (PvImageCor20Header -> StrongNameSignature .VirtualAddress != 0 && PvImageCor20Header -> StrongNameSignature .Size != 0 )
100
+ {
101
+ if (PvImageCor20Header -> Flags & COMIMAGE_FLAGS_STRONGNAMESIGNED )
102
+ PhAppendStringBuilder2 (& stringBuilder , L"Strong-name signed, " );
103
+ else
104
+ PhAppendStringBuilder2 (& stringBuilder , L"Strong-name delay signed, " );
105
+ }
106
+
107
+ if (PvImageCor20Header -> Flags & COMIMAGE_FLAGS_NATIVE_ENTRYPOINT )
108
+ PhAppendStringBuilder2 (& stringBuilder , L"Native entry-point, " );
109
+ if (PvImageCor20Header -> Flags & COMIMAGE_FLAGS_TRACKDEBUGDATA )
110
+ PhAppendStringBuilder2 (& stringBuilder , L"Track debug data, " );
111
+
112
+ if (PhEndsWithString2 (stringBuilder .String , L", " , FALSE))
113
+ PhRemoveEndStringBuilder (& stringBuilder , 2 );
114
+
115
+ return PhFinalStringBuilderString (& stringBuilder );
116
+ }
117
+
118
+ PPH_STRING PvpPeGetClrVersionText (
119
+ VOID
120
+ )
121
+ {
122
+ return PhFormatString (
123
+ L"%hu.%hu" ,
124
+ PvImageCor20Header -> MajorRuntimeVersion ,
125
+ PvImageCor20Header -> MinorRuntimeVersion
126
+ );
127
+ }
128
+
129
+ PPH_STRING PvpPeGetClrStorageVersionText (
130
+ _In_ PSTORAGESIGNATURE ClrMetaData
131
+ )
132
+ {
133
+ if (ClrMetaData && ClrMetaData -> VersionLength != 0 )
134
+ {
135
+ return PhZeroExtendToUtf16Ex (
136
+ PTR_ADD_OFFSET (ClrMetaData , RTL_SIZEOF_THROUGH_FIELD (STORAGESIGNATURE , VersionLength )),
137
+ ClrMetaData -> VersionLength
138
+ );
139
+ }
140
+
141
+ return PhCreateString (L"N/A" );
142
+ }
143
+
144
+ PPH_STRING PvpPeClrGetMvid (
145
+ _In_ PSTORAGESIGNATURE ClrMetaData
146
+ )
147
+ {
148
+ PPH_STRING guidMvidString = NULL ;
149
+ PSTORAGEHEADER storageHeader ;
150
+ PSTORAGESTREAM streamHeader ;
151
+ USHORT i ;
152
+
153
+ storageHeader = PTR_ADD_OFFSET (ClrMetaData , sizeof (STORAGESIGNATURE ) + ClrMetaData -> VersionLength );
154
+ streamHeader = PTR_ADD_OFFSET (storageHeader , sizeof (STORAGEHEADER ));
155
+
156
+ for (i = 0 ; i < storageHeader -> Streams ; i ++ )
157
+ {
158
+ if (PhEqualBytesZ (streamHeader -> Name , "#GUID" , TRUE))
159
+ {
160
+ guidMvidString = PhFormatGuid (PTR_ADD_OFFSET (ClrMetaData , streamHeader -> Offset ));
161
+ break ;
162
+ }
163
+
164
+ streamHeader = PTR_ADD_OFFSET (streamHeader , ALIGN_UP (UFIELD_OFFSET (STORAGESTREAM , Name ) + strlen (streamHeader -> Name ) + 1 , ULONG ));
165
+ }
166
+
167
+ return guidMvidString ;
168
+ }
169
+
170
+ VOID PvpPeClrEnumSections (
171
+ _In_ PSTORAGESIGNATURE ClrMetaData ,
172
+ _In_ HWND ListViewHandle
173
+ )
174
+ {
175
+ PSTORAGEHEADER storageHeader ;
176
+ PSTORAGESTREAM streamHeader ;
177
+ USHORT i ;
178
+
179
+ storageHeader = PTR_ADD_OFFSET (ClrMetaData , sizeof (STORAGESIGNATURE ) + ClrMetaData -> VersionLength );
180
+ streamHeader = PTR_ADD_OFFSET (storageHeader , sizeof (STORAGEHEADER ));
181
+
182
+ for (i = 0 ; i < storageHeader -> Streams ; i ++ )
183
+ {
184
+ INT lvItemIndex ;
185
+ WCHAR sectionName [65 ];
186
+ WCHAR pointer [PH_PTR_STR_LEN_1 ];
187
+
188
+ if (PhCopyStringZFromBytes (
189
+ streamHeader -> Name ,
190
+ sizeof (streamHeader -> Name ),
191
+ sectionName ,
192
+ ARRAYSIZE (sectionName ),
193
+ NULL
194
+ ))
195
+ {
196
+ lvItemIndex = PhAddListViewItem (ListViewHandle , MAXINT , sectionName , NULL );
197
+ PhPrintPointer (pointer , UlongToPtr (streamHeader -> Offset ));
198
+ PhSetListViewSubItem (ListViewHandle , lvItemIndex , 1 , pointer );
199
+ PhSetListViewSubItem (ListViewHandle , lvItemIndex , 2 , PhaFormatSize (streamHeader -> Size , -1 )-> Buffer );
200
+ }
201
+
202
+ // Stream headers don't have fixed sizes...
203
+ // The size is aligned up based on a variable length string at the end.
204
+ streamHeader = PTR_ADD_OFFSET (streamHeader , ALIGN_UP (UFIELD_OFFSET (STORAGESTREAM , Name ) + strlen (streamHeader -> Name ) + 1 , ULONG ));
205
+ }
206
+ }
207
+
208
+
59
209
INT_PTR CALLBACK PvpPeClrDlgProc (
60
210
_In_ HWND hwndDlg ,
61
211
_In_ UINT uMsg ,
@@ -74,9 +224,7 @@ INT_PTR CALLBACK PvpPeClrDlgProc(
74
224
case WM_INITDIALOG :
75
225
{
76
226
HWND lvHandle ;
77
- PPH_STRING string ;
78
- PH_STRING_BUILDER stringBuilder ;
79
- PSTORAGESIGNATURE metaData ;
227
+ PSTORAGESIGNATURE clrMetaData ;
80
228
81
229
lvHandle = GetDlgItem (hwndDlg , IDC_LIST );
82
230
PhSetListViewStyle (lvHandle , TRUE, TRUE);
@@ -85,97 +233,15 @@ INT_PTR CALLBACK PvpPeClrDlgProc(
85
233
PhAddListViewColumn (lvHandle , 1 , 1 , 1 , LVCFMT_LEFT , 80 , L"VA" );
86
234
PhAddListViewColumn (lvHandle , 2 , 2 , 2 , LVCFMT_LEFT , 80 , L"Size" );
87
235
88
- string = PhaFormatString (
89
- L"%u.%u" ,
90
- PvImageCor20Header -> MajorRuntimeVersion ,
91
- PvImageCor20Header -> MinorRuntimeVersion );
92
- PhSetDialogItemText (hwndDlg , IDC_RUNTIMEVERSION , string -> Buffer );
236
+ PhSetDialogItemText (hwndDlg , IDC_RUNTIMEVERSION , PH_AUTO_T (PH_STRING , PvpPeGetClrVersionText ())-> Buffer );
237
+ PhSetDialogItemText (hwndDlg , IDC_FLAGS , PH_AUTO_T (PH_STRING , PvpPeGetClrFlagsText ())-> Buffer );
93
238
94
- PhInitializeStringBuilder (& stringBuilder , 256 );
95
-
96
- if (PvImageCor20Header -> Flags & COMIMAGE_FLAGS_ILONLY )
97
- PhAppendStringBuilder2 (& stringBuilder , L"IL only, " );
98
- if (PvImageCor20Header -> Flags & COMIMAGE_FLAGS_32BITREQUIRED )
99
- PhAppendStringBuilder2 (& stringBuilder , L"32-bit only, " );
100
- if (PvImageCor20Header -> Flags & COMIMAGE_FLAGS_32BITPREFERRED )
101
- PhAppendStringBuilder2 (& stringBuilder , L"32-bit preferred, " );
102
- if (PvImageCor20Header -> Flags & COMIMAGE_FLAGS_IL_LIBRARY )
103
- PhAppendStringBuilder2 (& stringBuilder , L"IL library, " );
104
-
105
- if (PvImageCor20Header -> StrongNameSignature .VirtualAddress != 0 && PvImageCor20Header -> StrongNameSignature .Size != 0 )
106
- {
107
- if (PvImageCor20Header -> Flags & COMIMAGE_FLAGS_STRONGNAMESIGNED )
108
- PhAppendStringBuilder2 (& stringBuilder , L"Strong-name signed, " );
109
- else
110
- PhAppendStringBuilder2 (& stringBuilder , L"Strong-name delay signed, " );
111
- }
112
-
113
- if (PvImageCor20Header -> Flags & COMIMAGE_FLAGS_NATIVE_ENTRYPOINT )
114
- PhAppendStringBuilder2 (& stringBuilder , L"Native entry-point, " );
115
- if (PvImageCor20Header -> Flags & COMIMAGE_FLAGS_TRACKDEBUGDATA )
116
- PhAppendStringBuilder2 (& stringBuilder , L"Track debug data, " );
117
-
118
- if (PhEndsWithString2 (stringBuilder .String , L", " , FALSE))
119
- PhRemoveEndStringBuilder (& stringBuilder , 2 );
120
-
121
- PhSetDialogItemText (hwndDlg , IDC_FLAGS , stringBuilder .String -> Buffer );
122
- PhDeleteStringBuilder (& stringBuilder );
123
-
124
- metaData = PhMappedImageRvaToVa (& PvMappedImage , PvImageCor20Header -> MetaData .VirtualAddress , NULL );
125
-
126
- if (metaData )
127
- {
128
- __try
129
- {
130
- PhProbeAddress (metaData , PvImageCor20Header -> MetaData .Size , PvMappedImage .ViewBase , PvMappedImage .Size , 4 );
131
- }
132
- __except (EXCEPTION_EXECUTE_HANDLER )
133
- {
134
- metaData = NULL ;
135
- }
136
- }
137
-
138
- if (metaData && metaData -> VersionLength != 0 )
239
+ if (clrMetaData = PvpPeGetClrMetaDataHeader ())
139
240
{
140
- string = PhZeroExtendToUtf16Ex (PTR_ADD_OFFSET (metaData , RTL_SIZEOF_THROUGH_FIELD (STORAGESIGNATURE , VersionLength )), metaData -> VersionLength );
141
- PhSetDialogItemText (hwndDlg , IDC_VERSIONSTRING , string -> Buffer );
142
- PhDereferenceObject (string );
241
+ PhSetDialogItemText (hwndDlg , IDC_VERSIONSTRING , PH_AUTO_T (PH_STRING , PvpPeGetClrStorageVersionText (clrMetaData ))-> Buffer );
242
+ PhSetDialogItemText (hwndDlg , IDC_MVIDSTRING , PH_AUTO_T (PH_STRING , PvpPeClrGetMvid (clrMetaData ))-> Buffer );
143
243
144
- {
145
- PSTORAGEHEADER storageHeader = PTR_ADD_OFFSET (metaData , sizeof (STORAGESIGNATURE ) + metaData -> VersionLength );
146
- PSTORAGESTREAM streamHeader = PTR_ADD_OFFSET (storageHeader , sizeof (STORAGEHEADER ));
147
-
148
- for (USHORT i = 0 ; i < storageHeader -> Streams ; i ++ )
149
- {
150
- INT lvItemIndex ;
151
- WCHAR sectionName [65 ];
152
- WCHAR pointer [PH_PTR_STR_LEN_1 ];
153
-
154
- if (PhCopyStringZFromBytes (
155
- streamHeader -> Name ,
156
- sizeof (streamHeader -> Name ),
157
- sectionName ,
158
- ARRAYSIZE (sectionName ),
159
- NULL
160
- ))
161
- {
162
- lvItemIndex = PhAddListViewItem (lvHandle , MAXINT , sectionName , NULL );
163
-
164
- PhPrintPointer (pointer , UlongToPtr (streamHeader -> Offset ));
165
-
166
- PhSetListViewSubItem (lvHandle , lvItemIndex , 1 , pointer );
167
- PhSetListViewSubItem (lvHandle , lvItemIndex , 2 , PhaFormatSize (streamHeader -> Size , -1 )-> Buffer );
168
- }
169
-
170
- // Stream headers don't have fixed sizes...
171
- // The size is aligned up based on a variable length string at the end.
172
- streamHeader = PTR_ADD_OFFSET (streamHeader , ALIGN_UP (UFIELD_OFFSET (STORAGESTREAM , Name ) + strlen (streamHeader -> Name ) + 1 , ULONG ));
173
- }
174
- }
175
- }
176
- else
177
- {
178
- PhSetDialogItemText (hwndDlg , IDC_VERSIONSTRING , L"N/A" );
244
+ PvpPeClrEnumSections (clrMetaData , lvHandle );
179
245
}
180
246
}
181
247
break ;
0 commit comments