| | @@ -158,20 +166,61 @@ |
158 | 166 | // Register all exception handlers.
|
159 | 167 | #ifdef _M_AMD64
|
160 | 168 | {
|
161 | | - for ( const PEFile::PERuntimeFunction& rtFunc : fixedExec.exceptRFs )
|
| 169 | + PEFileDetails::PEFunctionRegistryX64 *rtFuncs = dynamic_cast <PEFileDetails::PEFunctionRegistryX64*> ( fixedExec.genDataDirs.entries.FindOrDefault( IMAGE_DIRECTORY_ENTRY_EXCEPTION ) );
|
| 170 | +
|
| 171 | + if ( rtFuncs != nullptr )
|
162 | 172 | {
|
163 | | - RUNTIME_FUNCTION nativeRTFunc;
|
164 | | - nativeRTFunc.BeginAddress = rtFunc.beginAddrRef.GetRVA();
|
165 | | - nativeRTFunc.EndAddress = rtFunc.endAddrRef.GetRVA();
|
166 | | - nativeRTFunc.UnwindInfoAddress = rtFunc.unwindInfoRef.GetRVA();
|
| 173 | + for ( const PEFileDetails::PERuntimeFunctionX64& rtFunc : rtFuncs->entries )
|
| 174 | + {
|
| 175 | + RUNTIME_FUNCTION nativeRTFunc;
|
| 176 | + nativeRTFunc.BeginAddress = rtFunc.beginAddrRef.GetRVA();
|
| 177 | + nativeRTFunc.EndAddress = rtFunc.endAddrRef.GetRVA();
|
| 178 | + nativeRTFunc.UnwindInfoAddress = rtFunc.unwindInfoRef.GetRVA();
|
167 | 179 |
|
168 | | - BOOLEAN success = RtlAddFunctionTable( &nativeRTFunc, 1, imageBase );
|
| 180 | + BOOLEAN success = RtlAddFunctionTable( &nativeRTFunc, 1, imageBase );
|
169 | 181 |
|
170 | | - assert( success == 1 );
|
| 182 | + assert( success == 1 );
|
| 183 | + }
|
171 | 184 | }
|
172 | 185 | }
|
173 | | -#endif
|
| 186 | +#elif defined(_M_ARM64)
|
| 187 | + {
|
| 188 | + PEFileDetails::PEFunctionRegistryARM64 *rtFuncs = dynamic_cast <PEFileDetails::PEFunctionRegistryARM64*> ( fixedExec.genDataDirs.entries.FindOrDefault( IMAGE_DIRECTORY_ENTRY_EXCEPTION ) );
|
174 | 189 |
|
| 190 | + if ( rtFuncs != nullptr )
|
| 191 | + {
|
| 192 | + for ( const PEFileDetails::PERuntimeFunctionARM64& rtFunc : rtFuncs->entries )
|
| 193 | + {
|
| 194 | + RUNTIME_FUNCTION nativeRTFunc;
|
| 195 | + nativeRTFunc.BeginAddress = rtFunc.BeginAddress.GetRVA();
|
| 196 | + nativeRTFunc.UnwindData = rtFunc.UnwindData;
|
| 197 | +
|
| 198 | + BOOLEAN success = RtlAddFunctionTable( &nativeRTFunc, 1, imageBase );
|
| 199 | +
|
| 200 | + assert( success == 1 );
|
| 201 | + }
|
| 202 | + }
|
| 203 | + }
|
| 204 | +#elif defined(_M_ARM)
|
| 205 | + {
|
| 206 | + PEFileDetails::PEFunctionRegistryARM32 *rtFuncs = dynamic_cast <PEFileDetails::PEFunctionRegistryARM32*> ( fixedExec.genDataDirs.entries.FindOrDefault( IMAGE_DIRECTORY_ENTRY_EXCEPTION ) );
|
| 207 | +
|
| 208 | + if ( rtFuncs != nullptr )
|
| 209 | + {
|
| 210 | + for ( const PEFileDetails::PERuntimeFunctionARM32& rtFunc : rtFuncs->entries )
|
| 211 | + {
|
| 212 | + RUNTIME_FUNCTION nativeRTFunc;
|
| 213 | + nativeRTFunc.BeginAddress = rtFunc.BeginAddress.GetRVA();
|
| 214 | + nativeRTFunc.UnwindData = rtFunc.UnwindData;
|
| 215 | +
|
| 216 | + BOOLEAN success = RtlAddFunctionTable( &nativeRTFunc, 1, imageBase );
|
| 217 | +
|
| 218 | + assert( success == 1 );
|
| 219 | + }
|
| 220 | + }
|
| 221 | + }
|
| 222 | +#endif //PLATFORM DEPENDANT CODE.
|
| 223 | +
|
175 | 224 | // Helpers for thunking.
|
176 | 225 | struct Helpers
|
177 | 226 | {
|