[Tizen] Unify dnetmemoryenumlib terms to match the codebase (#291)
[platform/upstream/coreclr.git] / src / utilcode / peinformation.cpp
1 // Licensed to the .NET Foundation under one or more agreements.
2 // The .NET Foundation licenses this file to you under the MIT license.
3 // See the LICENSE file in the project root for more information.
4 // --------------------------------------------------------------------------------
5 // PEInformation.cpp
6 //
7
8 // --------------------------------------------------------------------------------
9
10 #include "stdafx.h"
11 #include "utilcode.h"
12 #include "peinformation.h"
13
14
15 HRESULT TranslatePEToArchitectureType(CorPEKind CLRPeKind, DWORD dwImageType, PEKIND * pPeKind)
16 {
17     return TranslatePEToArchitectureType(CLRPeKind, dwImageType, 0, pPeKind);
18 }
19
20 HRESULT TranslatePEToArchitectureType(CorPEKind CLRPeKind, DWORD dwImageType, DWORD dwAssemblyFlags, PEKIND * pPeKind)
21 {
22     HRESULT hr = S_OK;
23     
24     _ASSERTE(pPeKind != NULL);
25     
26     if (CLRPeKind == peNot)
27     {   // Not a PE. Shouldn't ever get here.
28         *pPeKind = peInvalid;
29         hr = HRESULT_FROM_WIN32(ERROR_BAD_FORMAT);
30         goto Exit;
31     }
32     else if (IsAfPA_NoPlatform(dwAssemblyFlags))
33     {
34         *pPeKind = peNone;
35         goto Exit;
36     }
37     else
38     {
39         if ((CLRPeKind & peILonly) && 
40             !(CLRPeKind & pe32Plus) && 
41             !(CLRPeKind & pe32BitRequired) && 
42             (dwImageType == IMAGE_FILE_MACHINE_I386))
43         {
44             // Processor-agnostic (MSIL)
45             *pPeKind = peMSIL;
46         }
47         else if (CLRPeKind & pe32Plus)
48         {
49             // 64-bit
50
51             if (CLRPeKind & pe32BitRequired)
52             {
53                 *pPeKind = peInvalid;
54                 hr = HRESULT_FROM_WIN32(ERROR_BAD_FORMAT);
55                 goto Exit;
56             }
57
58             // Regardless of whether ILONLY is set or not, the architecture
59             // is the machine type.
60
61             if (dwImageType == IMAGE_FILE_MACHINE_IA64)
62             {
63                 *pPeKind = peIA64;
64             }
65             else if (dwImageType == IMAGE_FILE_MACHINE_AMD64)
66             {
67                 *pPeKind = peAMD64;
68             }
69             else
70             {   // We don't support other architectures
71                 *pPeKind = peInvalid;
72                 hr = HRESULT_FROM_WIN32(ERROR_BAD_FORMAT);
73                 goto Exit;
74             }
75         }
76         else
77         {
78             // 32-bit, non-agnostic
79
80             if (dwImageType == IMAGE_FILE_MACHINE_I386)
81             {
82                 *pPeKind = peI386;
83             }
84             else if (dwImageType == IMAGE_FILE_MACHINE_ARMNT)
85             {
86                 *pPeKind = peARM;
87             }
88             else
89             {   // Not supported
90                 *pPeKind = peInvalid;
91                 hr = HRESULT_FROM_WIN32(ERROR_BAD_FORMAT);
92                 goto Exit;
93             }
94         }
95     }
96
97 Exit:
98     return hr;
99 }