System.Data.SQLite
Hex Artifact Content
Not logged in

Artifact ed94df19ce770d954a4874c8edad8de8e1ecc226:


0000: 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /***************
0010: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0020: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0030: 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 20 2a 20 6d 65 72  *********. * mer
0040: 67 65 62 69 6e 0a 20 2a 20 57 72 69 74 74 65 6e  gebin. * Written
0050: 20 62 79 20 52 6f 62 65 72 74 20 53 69 6d 70 73   by Robert Simps
0060: 6f 6e 20 28 72 6f 62 65 72 74 40 62 6c 61 63 6b  on (robert@black
0070: 63 61 73 74 6c 65 73 6f 66 74 2e 63 6f 6d 29 0a  castlesoft.com).
0080: 20 2a 20 0a 20 2a 20 52 65 6c 65 61 73 65 64 20   * . * Released 
0090: 74 6f 20 74 68 65 20 70 75 62 6c 69 63 20 64 6f  to the public do
00a0: 6d 61 69 6e 2c 20 75 73 65 20 61 74 20 79 6f 75  main, use at you
00b0: 72 20 6f 77 6e 20 72 69 73 6b 21 0a 20 2a 2a 2a  r own risk!. ***
00c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
00d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
00e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
00f0: 2a 2a 2a 2a 2a 2f 0a 0a 23 69 6e 63 6c 75 64 65  *****/..#include
0100: 20 22 53 74 64 41 66 78 2e 68 22 0a 23 69 6e 63   "StdAfx.h".#inc
0110: 6c 75 64 65 20 22 50 45 46 69 6c 65 2e 68 22 0a  lude "PEFile.h".
0120: 0a 23 64 65 66 69 6e 65 20 4d 61 6b 65 50 74 72  .#define MakePtr
0130: 28 20 63 61 73 74 2c 20 70 74 72 2c 20 61 64 64  ( cast, ptr, add
0140: 56 61 6c 75 65 20 29 20 28 63 61 73 74 29 28 20  Value ) (cast)( 
0150: 28 44 57 4f 52 44 5f 50 54 52 29 28 70 74 72 29  (DWORD_PTR)(ptr)
0160: 20 2b 20 28 44 57 4f 52 44 5f 50 54 52 29 28 61   + (DWORD_PTR)(a
0170: 64 64 56 61 6c 75 65 29 29 0a 0a 43 50 45 46 69  ddValue))..CPEFi
0180: 6c 65 3a 3a 43 50 45 46 69 6c 65 28 76 6f 69 64  le::CPEFile(void
0190: 29 0a 7b 0a 20 20 6d 5f 68 4d 61 70 20 3d 20 4e  ).{.  m_hMap = N
01a0: 55 4c 4c 3b 0a 20 20 6d 5f 68 46 69 6c 65 20 3d  ULL;.  m_hFile =
01b0: 20 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f   INVALID_HANDLE_
01c0: 56 41 4c 55 45 3b 0a 20 20 6d 5f 70 42 61 73 65  VALUE;.  m_pBase
01d0: 20 3d 20 4e 55 4c 4c 3b 0a 7d 0a 0a 43 50 45 46   = NULL;.}..CPEF
01e0: 69 6c 65 3a 3a 7e 43 50 45 46 69 6c 65 28 76 6f  ile::~CPEFile(vo
01f0: 69 64 29 0a 7b 0a 20 20 43 6c 6f 73 65 28 29 3b  id).{.  Close();
0200: 0a 7d 0a 0a 48 52 45 53 55 4c 54 20 43 50 45 46  .}..HRESULT CPEF
0210: 69 6c 65 3a 3a 4f 70 65 6e 28 4c 50 43 54 53 54  ile::Open(LPCTST
0220: 52 20 70 73 7a 46 69 6c 65 2c 20 42 4f 4f 4c 20  R pszFile, BOOL 
0230: 62 52 65 61 64 4f 6e 6c 79 29 0a 7b 0a 20 20 48  bReadOnly).{.  H
0240: 52 45 53 55 4c 54 20 68 72 20 3d 20 53 5f 4f 4b  RESULT hr = S_OK
0250: 3b 0a 20 20 43 6c 6f 73 65 28 29 3b 0a 0a 20 20  ;.  Close();..  
0260: 6d 5f 68 46 69 6c 65 20 3d 20 43 72 65 61 74 65  m_hFile = Create
0270: 46 69 6c 65 28 70 73 7a 46 69 6c 65 2c 20 47 45  File(pszFile, GE
0280: 4e 45 52 49 43 5f 52 45 41 44 20 7c 20 28 28 62  NERIC_READ | ((b
0290: 52 65 61 64 4f 6e 6c 79 20 3d 3d 20 46 41 4c 53  ReadOnly == FALS
02a0: 45 29 20 3f 20 47 45 4e 45 52 49 43 5f 57 52 49  E) ? GENERIC_WRI
02b0: 54 45 3a 20 30 29 2c 20 46 49 4c 45 5f 53 48 41  TE: 0), FILE_SHA
02c0: 52 45 5f 52 45 41 44 20 7c 20 46 49 4c 45 5f 53  RE_READ | FILE_S
02d0: 48 41 52 45 5f 57 52 49 54 45 2c 20 4e 55 4c 4c  HARE_WRITE, NULL
02e0: 2c 20 4f 50 45 4e 5f 45 58 49 53 54 49 4e 47 2c  , OPEN_EXISTING,
02f0: 20 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f   FILE_ATTRIBUTE_
0300: 4e 4f 52 4d 41 4c 2c 20 4e 55 4c 4c 29 3b 0a 20  NORMAL, NULL);. 
0310: 20 69 66 20 28 6d 5f 68 46 69 6c 65 20 3d 3d 20   if (m_hFile == 
0320: 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56  INVALID_HANDLE_V
0330: 41 4c 55 45 29 0a 20 20 7b 0a 20 20 20 20 68 72  ALUE).  {.    hr
0340: 20 3d 20 48 52 45 53 55 4c 54 5f 46 52 4f 4d 5f   = HRESULT_FROM_
0350: 57 49 4e 33 32 28 47 65 74 4c 61 73 74 45 72 72  WIN32(GetLastErr
0360: 6f 72 28 29 29 3b 0a 20 20 7d 0a 20 20 65 6c 73  or());.  }.  els
0370: 65 0a 20 20 7b 0a 20 20 20 20 6d 5f 68 4d 61 70  e.  {.    m_hMap
0380: 20 3d 20 43 72 65 61 74 65 46 69 6c 65 4d 61 70   = CreateFileMap
0390: 70 69 6e 67 28 6d 5f 68 46 69 6c 65 2c 20 4e 55  ping(m_hFile, NU
03a0: 4c 4c 2c 20 28 62 52 65 61 64 4f 6e 6c 79 20 3d  LL, (bReadOnly =
03b0: 3d 20 54 52 55 45 29 20 3f 20 50 41 47 45 5f 52  = TRUE) ? PAGE_R
03c0: 45 41 44 4f 4e 4c 59 3a 50 41 47 45 5f 52 45 41  EADONLY:PAGE_REA
03d0: 44 57 52 49 54 45 2c 20 30 2c 20 30 2c 20 4e 55  DWRITE, 0, 0, NU
03e0: 4c 4c 29 3b 0a 20 20 20 20 69 66 20 28 21 6d 5f  LL);.    if (!m_
03f0: 68 4d 61 70 29 0a 20 20 20 20 7b 0a 20 20 20 20  hMap).    {.    
0400: 20 20 68 72 20 3d 20 48 52 45 53 55 4c 54 5f 46    hr = HRESULT_F
0410: 52 4f 4d 5f 57 49 4e 33 32 28 47 65 74 4c 61 73  ROM_WIN32(GetLas
0420: 74 45 72 72 6f 72 28 29 29 3b 0a 20 20 20 20 7d  tError());.    }
0430: 0a 20 20 20 20 65 6c 73 65 0a 20 20 20 20 7b 0a  .    else.    {.
0440: 20 20 20 20 20 20 6d 5f 70 42 61 73 65 20 3d 20        m_pBase = 
0450: 28 50 49 4d 41 47 45 5f 44 4f 53 5f 48 45 41 44  (PIMAGE_DOS_HEAD
0460: 45 52 29 4d 61 70 56 69 65 77 4f 66 46 69 6c 65  ER)MapViewOfFile
0470: 28 6d 5f 68 4d 61 70 2c 20 46 49 4c 45 5f 4d 41  (m_hMap, FILE_MA
0480: 50 5f 52 45 41 44 20 7c 20 28 28 62 52 65 61 64  P_READ | ((bRead
0490: 4f 6e 6c 79 20 3d 3d 20 46 41 4c 53 45 29 20 3f  Only == FALSE) ?
04a0: 20 46 49 4c 45 5f 4d 41 50 5f 57 52 49 54 45 3a   FILE_MAP_WRITE:
04b0: 30 29 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20  0), 0, 0, 0);.  
04c0: 20 20 20 20 69 66 20 28 21 6d 5f 70 42 61 73 65      if (!m_pBase
04d0: 29 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20  ).      {.      
04e0: 20 20 68 72 20 3d 20 48 52 45 53 55 4c 54 5f 46    hr = HRESULT_F
04f0: 52 4f 4d 5f 57 49 4e 33 32 28 47 65 74 4c 61 73  ROM_WIN32(GetLas
0500: 74 45 72 72 6f 72 28 29 29 3b 0a 20 20 20 20 20  tError());.     
0510: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
0520: 69 66 20 28 53 55 43 43 45 45 44 45 44 28 68 72  if (SUCCEEDED(hr
0530: 29 29 0a 20 20 7b 0a 20 20 20 20 50 49 4d 41 47  )).  {.    PIMAG
0540: 45 5f 46 49 4c 45 5f 48 45 41 44 45 52 20 70 49  E_FILE_HEADER pI
0550: 6d 61 67 65 48 65 61 64 65 72 20 3d 20 28 50 49  mageHeader = (PI
0560: 4d 41 47 45 5f 46 49 4c 45 5f 48 45 41 44 45 52  MAGE_FILE_HEADER
0570: 29 6d 5f 70 42 61 73 65 3b 0a 20 20 20 20 69 66  )m_pBase;.    if
0580: 20 28 6d 5f 70 42 61 73 65 2d 3e 65 5f 6d 61 67   (m_pBase->e_mag
0590: 69 63 20 21 3d 20 49 4d 41 47 45 5f 44 4f 53 5f  ic != IMAGE_DOS_
05a0: 53 49 47 4e 41 54 55 52 45 29 0a 20 20 20 20 7b  SIGNATURE).    {
05b0: 0a 20 20 20 20 20 20 68 72 20 3d 20 48 52 45 53  .      hr = HRES
05c0: 55 4c 54 5f 46 52 4f 4d 5f 57 49 4e 33 32 28 45  ULT_FROM_WIN32(E
05d0: 52 52 4f 52 5f 42 41 44 5f 46 4f 52 4d 41 54 29  RROR_BAD_FORMAT)
05e0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6d 5f 70  ;.    }..    m_p
05f0: 4e 54 48 65 61 64 65 72 20 3d 20 4d 61 6b 65 50  NTHeader = MakeP
0600: 74 72 28 50 49 4d 41 47 45 5f 4e 54 5f 48 45 41  tr(PIMAGE_NT_HEA
0610: 44 45 52 53 2c 20 6d 5f 70 42 61 73 65 2c 20 6d  DERS, m_pBase, m
0620: 5f 70 42 61 73 65 2d 3e 65 5f 6c 66 61 6e 65 77  _pBase->e_lfanew
0630: 29 3b 0a 20 20 20 20 69 66 20 28 49 73 42 61 64  );.    if (IsBad
0640: 52 65 61 64 50 74 72 28 6d 5f 70 4e 54 48 65 61  ReadPtr(m_pNTHea
0650: 64 65 72 2c 20 73 69 7a 65 6f 66 28 6d 5f 70 4e  der, sizeof(m_pN
0660: 54 48 65 61 64 65 72 2d 3e 53 69 67 6e 61 74 75  THeader->Signatu
0670: 72 65 29 29 29 0a 20 20 20 20 7b 0a 20 20 20 20  re))).    {.    
0680: 20 20 68 72 20 3d 20 48 52 45 53 55 4c 54 5f 46    hr = HRESULT_F
0690: 52 4f 4d 5f 57 49 4e 33 32 28 45 52 52 4f 52 5f  ROM_WIN32(ERROR_
06a0: 42 41 44 5f 46 4f 52 4d 41 54 29 3b 0a 20 20 20  BAD_FORMAT);.   
06b0: 20 7d 0a 20 20 20 20 65 6c 73 65 0a 20 20 20 20   }.    else.    
06c0: 7b 0a 20 20 20 20 20 20 69 66 20 28 6d 5f 70 4e  {.      if (m_pN
06d0: 54 48 65 61 64 65 72 2d 3e 53 69 67 6e 61 74 75  THeader->Signatu
06e0: 72 65 20 21 3d 20 49 4d 41 47 45 5f 4e 54 5f 53  re != IMAGE_NT_S
06f0: 49 47 4e 41 54 55 52 45 29 0a 20 20 20 20 20 20  IGNATURE).      
0700: 7b 0a 20 20 20 20 20 20 20 20 68 72 20 3d 20 48  {.        hr = H
0710: 52 45 53 55 4c 54 5f 46 52 4f 4d 5f 57 49 4e 33  RESULT_FROM_WIN3
0720: 32 28 45 52 52 4f 52 5f 42 41 44 5f 46 4f 52 4d  2(ERROR_BAD_FORM
0730: 41 54 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  AT);.      }.   
0740: 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 20 28 46 41   }.  }..  if (FA
0750: 49 4c 45 44 28 68 72 29 29 20 43 6c 6f 73 65 28  ILED(hr)) Close(
0760: 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 68 72 3b  );..  return hr;
0770: 0a 7d 0a 0a 76 6f 69 64 20 43 50 45 46 69 6c 65  .}..void CPEFile
0780: 3a 3a 43 6c 6f 73 65 28 76 6f 69 64 29 0a 7b 0a  ::Close(void).{.
0790: 20 20 69 66 20 28 6d 5f 70 42 61 73 65 29 0a 20    if (m_pBase). 
07a0: 20 7b 0a 20 20 20 20 55 6e 6d 61 70 56 69 65 77   {.    UnmapView
07b0: 4f 66 46 69 6c 65 28 6d 5f 70 42 61 73 65 29 3b  OfFile(m_pBase);
07c0: 0a 20 20 7d 0a 0a 20 20 69 66 20 28 6d 5f 68 4d  .  }..  if (m_hM
07d0: 61 70 29 0a 20 20 20 20 43 6c 6f 73 65 48 61 6e  ap).    CloseHan
07e0: 64 6c 65 28 6d 5f 68 4d 61 70 29 3b 0a 0a 20 20  dle(m_hMap);..  
07f0: 69 66 20 28 6d 5f 68 46 69 6c 65 20 21 3d 20 49  if (m_hFile != I
0800: 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41  NVALID_HANDLE_VA
0810: 4c 55 45 29 0a 20 20 20 20 43 6c 6f 73 65 48 61  LUE).    CloseHa
0820: 6e 64 6c 65 28 6d 5f 68 46 69 6c 65 29 3b 0a 0a  ndle(m_hFile);..
0830: 20 20 6d 5f 68 4d 61 70 20 3d 20 4e 55 4c 4c 3b    m_hMap = NULL;
0840: 0a 20 20 6d 5f 68 46 69 6c 65 20 3d 20 49 4e 56  .  m_hFile = INV
0850: 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55  ALID_HANDLE_VALU
0860: 45 3b 0a 20 20 6d 5f 70 42 61 73 65 20 3d 20 4e  E;.  m_pBase = N
0870: 55 4c 4c 3b 0a 7d 0a 0a 50 49 4d 41 47 45 5f 53  ULL;.}..PIMAGE_S
0880: 45 43 54 49 4f 4e 5f 48 45 41 44 45 52 20 43 50  ECTION_HEADER CP
0890: 45 46 69 6c 65 3a 3a 47 65 74 45 6e 63 6c 6f 73  EFile::GetEnclos
08a0: 69 6e 67 53 65 63 74 69 6f 6e 48 65 61 64 65 72  ingSectionHeader
08b0: 28 44 57 4f 52 44 20 72 76 61 29 20 63 6f 6e 73  (DWORD rva) cons
08c0: 74 0a 7b 0a 20 20 50 49 4d 41 47 45 5f 53 45 43  t.{.  PIMAGE_SEC
08d0: 54 49 4f 4e 5f 48 45 41 44 45 52 20 73 65 63 74  TION_HEADER sect
08e0: 69 6f 6e 20 3d 20 49 4d 41 47 45 5f 46 49 52 53  ion = IMAGE_FIRS
08f0: 54 5f 53 45 43 54 49 4f 4e 28 6d 5f 70 4e 54 48  T_SECTION(m_pNTH
0900: 65 61 64 65 72 29 3b 0a 0a 20 20 66 6f 72 20 28  eader);..  for (
0910: 55 49 4e 54 20 69 3d 30 3b 20 69 20 3c 20 6d 5f  UINT i=0; i < m_
0920: 70 4e 54 48 65 61 64 65 72 2d 3e 46 69 6c 65 48  pNTHeader->FileH
0930: 65 61 64 65 72 2e 4e 75 6d 62 65 72 4f 66 53 65  eader.NumberOfSe
0940: 63 74 69 6f 6e 73 3b 20 69 2b 2b 2c 20 73 65 63  ctions; i++, sec
0950: 74 69 6f 6e 2b 2b 20 29 0a 20 20 7b 0a 20 20 20  tion++ ).  {.   
0960: 20 44 57 4f 52 44 20 73 69 7a 65 20 3d 20 73 65   DWORD size = se
0970: 63 74 69 6f 6e 2d 3e 4d 69 73 63 2e 56 69 72 74  ction->Misc.Virt
0980: 75 61 6c 53 69 7a 65 3b 0a 20 20 20 20 69 66 20  ualSize;.    if 
0990: 28 21 73 69 7a 65 29 0a 20 20 20 20 20 20 73 69  (!size).      si
09a0: 7a 65 20 3d 20 73 65 63 74 69 6f 6e 2d 3e 53 69  ze = section->Si
09b0: 7a 65 4f 66 52 61 77 44 61 74 61 3b 0a 0a 20 20  zeOfRawData;..  
09c0: 20 20 69 66 20 28 20 28 72 76 61 20 3e 3d 20 73    if ( (rva >= s
09d0: 65 63 74 69 6f 6e 2d 3e 56 69 72 74 75 61 6c 41  ection->VirtualA
09e0: 64 64 72 65 73 73 29 20 26 26 20 0a 20 20 20 20  ddress) && .    
09f0: 20 20 28 72 76 61 20 3c 20 28 73 65 63 74 69 6f    (rva < (sectio
0a00: 6e 2d 3e 56 69 72 74 75 61 6c 41 64 64 72 65 73  n->VirtualAddres
0a10: 73 20 2b 20 73 69 7a 65 29 29 29 0a 20 20 20 20  s + size))).    
0a20: 20 20 72 65 74 75 72 6e 20 73 65 63 74 69 6f 6e    return section
0a30: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 4e  ;.  }.  return N
0a40: 55 4c 4c 3b 0a 7d 0a 0a 4c 50 56 4f 49 44 20 43  ULL;.}..LPVOID C
0a50: 50 45 46 69 6c 65 3a 3a 47 65 74 50 74 72 46 72  PEFile::GetPtrFr
0a60: 6f 6d 52 56 41 28 44 57 4f 52 44 20 72 76 61 29  omRVA(DWORD rva)
0a70: 20 63 6f 6e 73 74 0a 7b 0a 20 20 50 49 4d 41 47   const.{.  PIMAG
0a80: 45 5f 53 45 43 54 49 4f 4e 5f 48 45 41 44 45 52  E_SECTION_HEADER
0a90: 20 70 53 65 63 74 69 6f 6e 48 64 72 3b 0a 20 20   pSectionHdr;.  
0aa0: 49 4e 54 20 64 65 6c 74 61 3b 0a 0a 20 20 70 53  INT delta;..  pS
0ab0: 65 63 74 69 6f 6e 48 64 72 20 3d 20 47 65 74 45  ectionHdr = GetE
0ac0: 6e 63 6c 6f 73 69 6e 67 53 65 63 74 69 6f 6e 48  nclosingSectionH
0ad0: 65 61 64 65 72 28 72 76 61 29 3b 0a 20 20 69 66  eader(rva);.  if
0ae0: 20 28 20 21 70 53 65 63 74 69 6f 6e 48 64 72 20   ( !pSectionHdr 
0af0: 29 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  ).    return 0;.
0b00: 0a 20 20 64 65 6c 74 61 20 3d 20 28 49 4e 54 29  .  delta = (INT)
0b10: 28 70 53 65 63 74 69 6f 6e 48 64 72 2d 3e 56 69  (pSectionHdr->Vi
0b20: 72 74 75 61 6c 41 64 64 72 65 73 73 2d 70 53 65  rtualAddress-pSe
0b30: 63 74 69 6f 6e 48 64 72 2d 3e 50 6f 69 6e 74 65  ctionHdr->Pointe
0b40: 72 54 6f 52 61 77 44 61 74 61 29 3b 0a 20 20 72  rToRawData);.  r
0b50: 65 74 75 72 6e 20 28 50 56 4f 49 44 29 20 28 28  eturn (PVOID) ((
0b60: 28 4c 50 42 59 54 45 29 6d 5f 70 42 61 73 65 29  (LPBYTE)m_pBase)
0b70: 20 2b 20 72 76 61 20 2d 20 64 65 6c 74 61 29 3b   + rva - delta);
0b80: 0a 7d 0a 0a 50 49 4d 41 47 45 5f 53 45 43 54 49  .}..PIMAGE_SECTI
0b90: 4f 4e 5f 48 45 41 44 45 52 20 43 50 45 46 69 6c  ON_HEADER CPEFil
0ba0: 65 3a 3a 47 65 74 53 65 63 74 69 6f 6e 48 65 61  e::GetSectionHea
0bb0: 64 65 72 28 4c 50 43 53 54 52 20 6e 61 6d 65 29  der(LPCSTR name)
0bc0: 20 63 6f 6e 73 74 0a 7b 0a 20 20 50 49 4d 41 47   const.{.  PIMAG
0bd0: 45 5f 53 45 43 54 49 4f 4e 5f 48 45 41 44 45 52  E_SECTION_HEADER
0be0: 20 73 65 63 74 69 6f 6e 20 3d 20 49 4d 41 47 45   section = IMAGE
0bf0: 5f 46 49 52 53 54 5f 53 45 43 54 49 4f 4e 28 6d  _FIRST_SECTION(m
0c00: 5f 70 4e 54 48 65 61 64 65 72 29 3b 0a 0a 20 20  _pNTHeader);..  
0c10: 66 6f 72 20 28 55 49 4e 54 20 69 3d 30 3b 20 69  for (UINT i=0; i
0c20: 20 3c 20 6d 5f 70 4e 54 48 65 61 64 65 72 2d 3e   < m_pNTHeader->
0c30: 46 69 6c 65 48 65 61 64 65 72 2e 4e 75 6d 62 65  FileHeader.Numbe
0c40: 72 4f 66 53 65 63 74 69 6f 6e 73 3b 20 69 2b 2b  rOfSections; i++
0c50: 2c 20 73 65 63 74 69 6f 6e 2b 2b 29 0a 20 20 7b  , section++).  {
0c60: 0a 20 20 20 20 69 66 20 28 5f 73 74 72 6e 69 63  .    if (_strnic
0c70: 6d 70 28 28 63 68 61 72 20 2a 29 73 65 63 74 69  mp((char *)secti
0c80: 6f 6e 2d 3e 4e 61 6d 65 2c 6e 61 6d 65 2c 49 4d  on->Name,name,IM
0c90: 41 47 45 5f 53 49 5a 45 4f 46 5f 53 48 4f 52 54  AGE_SIZEOF_SHORT
0ca0: 5f 4e 41 4d 45 29 20 3d 3d 20 30 29 0a 20 20 20  _NAME) == 0).   
0cb0: 20 20 20 72 65 74 75 72 6e 20 73 65 63 74 69 6f     return sectio
0cc0: 6e 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  n;.  }..  return
0cd0: 20 4e 55 4c 4c 3b 0a 7d 0a 0a 43 50 45 46 69 6c   NULL;.}..CPEFil
0ce0: 65 3a 3a 6f 70 65 72 61 74 6f 72 20 50 49 4d 41  e::operator PIMA
0cf0: 47 45 5f 4e 54 5f 48 45 41 44 45 52 53 28 29 20  GE_NT_HEADERS() 
0d00: 63 6f 6e 73 74 0a 7b 0a 20 20 69 66 20 28 21 6d  const.{.  if (!m
0d10: 5f 70 42 61 73 65 29 20 72 65 74 75 72 6e 20 4e  _pBase) return N
0d20: 55 4c 4c 3b 0a 20 20 72 65 74 75 72 6e 20 6d 5f  ULL;.  return m_
0d30: 70 4e 54 48 65 61 64 65 72 3b 0a 7d 0a 0a 43 50  pNTHeader;.}..CP
0d40: 45 46 69 6c 65 3a 3a 6f 70 65 72 61 74 6f 72 20  EFile::operator 
0d50: 50 49 4d 41 47 45 5f 44 4f 53 5f 48 45 41 44 45  PIMAGE_DOS_HEADE
0d60: 52 28 29 20 63 6f 6e 73 74 0a 7b 0a 20 20 72 65  R() const.{.  re
0d70: 74 75 72 6e 20 6d 5f 70 42 61 73 65 3b 0a 7d 0a  turn m_pBase;.}.
0d80: 0a 43 50 45 46 69 6c 65 3a 3a 6f 70 65 72 61 74  .CPEFile::operat
0d90: 6f 72 20 50 49 4d 41 47 45 5f 43 4f 52 32 30 5f  or PIMAGE_COR20_
0da0: 48 45 41 44 45 52 28 29 20 63 6f 6e 73 74 0a 7b  HEADER() const.{
0db0: 0a 20 20 69 66 20 28 21 6d 5f 70 42 61 73 65 29  .  if (!m_pBase)
0dc0: 20 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 0a 20   return NULL;.. 
0dd0: 20 44 57 4f 52 44 20 64 77 52 56 41 3b 0a 20 20   DWORD dwRVA;.  
0de0: 64 77 52 56 41 20 3d 20 6d 5f 70 4e 54 48 65 61  dwRVA = m_pNTHea
0df0: 64 65 72 2d 3e 4f 70 74 69 6f 6e 61 6c 48 65 61  der->OptionalHea
0e00: 64 65 72 2e 44 61 74 61 44 69 72 65 63 74 6f 72  der.DataDirector
0e10: 79 5b 49 4d 41 47 45 5f 44 49 52 45 43 54 4f 52  y[IMAGE_DIRECTOR
0e20: 59 5f 45 4e 54 52 59 5f 43 4f 4d 5f 44 45 53 43  Y_ENTRY_COM_DESC
0e30: 52 49 50 54 4f 52 5d 2e 56 69 72 74 75 61 6c 41  RIPTOR].VirtualA
0e40: 64 64 72 65 73 73 3b 0a 20 20 69 66 20 28 21 64  ddress;.  if (!d
0e50: 77 52 56 41 29 0a 20 20 7b 0a 20 20 20 20 72 65  wRVA).  {.    re
0e60: 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 7d 0a 0a  turn NULL;.  }..
0e70: 20 20 72 65 74 75 72 6e 20 28 28 50 49 4d 41 47    return ((PIMAG
0e80: 45 5f 43 4f 52 32 30 5f 48 45 41 44 45 52 29 47  E_COR20_HEADER)G
0e90: 65 74 50 74 72 46 72 6f 6d 52 56 41 28 64 77 52  etPtrFromRVA(dwR
0ea0: 56 41 29 29 3b 0a 7d 0a                          VA));.}.