Lines Matching defs:pModPe

153      * @param   pModPe          Pointer to the PE loader module structure.
160 DECLCALLBACKMEMBER(int, pfnResolveImports)(PRTLDRMODPE pModPe, const void *pvBitsR, void *pvBitsW, PFNRTLDRIMPORT pfnGetImport, void *pvUser);
245 static int rtldrPEApplyFixups(PRTLDRMODPE pModPe, const void *pvBitsR, void *pvBitsW, RTUINTPTR BaseAddress, RTUINTPTR OldBaseAddress);
477 PRTLDRMODPE pModPe = (PRTLDRMODPE)pMod;
478 return pModPe->cbImage;
486 * @param pModPe The PE module.
489 static int rtldrPEGetBitsNoImportsNorFixups(PRTLDRMODPE pModPe, void *pvBits)
494 PRTLDRREADER pReader = pModPe->Core.pReader;
506 memset(pvBits, 0, pModPe->cbImage);
513 rc = pReader->pfnRead(pReader, pvBits, RT_MIN(pModPe->cbImage, cbRawImage), 0);
516 pReader->pfnLogName(pReader), RT_MIN(pModPe->cbImage, cbRawImage), 0, rc));
522 int rc = pReader->pfnRead(pReader, pvBits, pModPe->cbHeaders, 0);
528 PIMAGE_SECTION_HEADER pSH = pModPe->paSections;
529 for (unsigned cLeft = pModPe->cSections; cLeft > 0; cLeft--, pSH++)
537 pSH - pModPe->paSections, sizeof(pSH->Name), pSH->Name));
544 pReader->pfnLogName(pReader), pModPe->cbHeaders, 0, rc));
554 * @param pModPe The PE module.
556 static int rtldrPEReadBits(PRTLDRMODPE pModPe)
558 Assert(!pModPe->pvBits);
559 void *pvBitsW = RTMemAllocZ(pModPe->cbImage);
562 int rc = rtldrPEGetBitsNoImportsNorFixups(pModPe, pvBitsW);
564 pModPe->pvBits = pvBitsW;
574 PRTLDRMODPE pModPe = (PRTLDRMODPE)pMod;
579 int rc = rtldrPEGetBitsNoImportsNorFixups(pModPe, pvBits);
586 rc = ((PRTLDROPSPE)pMod->pOps)->pfnResolveImports(pModPe, pvBits, pvBits, pfnGetImport, pvUser);
592 rc = rtldrPEApplyFixups(pModPe, pvBits, pvBits, BaseAddress, pModPe->uImageBase);
605 static DECLCALLBACK(int) rtldrPEResolveImports32(PRTLDRMODPE pModPe, const void *pvBitsR, void *pvBitsW, PFNRTLDRIMPORT pfnGetImport, void *pvUser)
610 if ( !pModPe->ImportDir.VirtualAddress
611 || !pModPe->ImportDir.Size)
619 for (pImps = PE_RVA2TYPE(pvBitsR, pModPe->ImportDir.VirtualAddress, PIMAGE_IMPORT_DESCRIPTOR);
623 AssertReturn(pImps->Name < pModPe->cbImage, VERR_BAD_EXE_FORMAT);
625 AssertReturn(pImps->FirstThunk < pModPe->cbImage, VERR_BAD_EXE_FORMAT);
626 AssertReturn(pImps->u.OriginalFirstThunk < pModPe->cbImage, VERR_BAD_EXE_FORMAT);
649 rc = pfnGetImport(&pModPe->Core, pszModName, NULL, IMAGE_ORDINAL32(pThunk->u1.Ordinal), &Value, pvUser);
654 && pThunk->u1.Ordinal < pModPe->cbImage)
656 rc = pfnGetImport(&pModPe->Core, pszModName, PE_RVA2TYPE(pvBitsR, (char*)(uintptr_t)pThunk->u1.AddressOfData + 2, const char *),
682 static DECLCALLBACK(int) rtldrPEResolveImports64(PRTLDRMODPE pModPe, const void *pvBitsR, void *pvBitsW, PFNRTLDRIMPORT pfnGetImport, void *pvUser)
687 if ( !pModPe->ImportDir.VirtualAddress
688 || !pModPe->ImportDir.Size)
696 for (pImps = PE_RVA2TYPE(pvBitsR, pModPe->ImportDir.VirtualAddress, PIMAGE_IMPORT_DESCRIPTOR);
700 AssertReturn(pImps->Name < pModPe->cbImage, VERR_BAD_EXE_FORMAT);
702 AssertReturn(pImps->FirstThunk < pModPe->cbImage, VERR_BAD_EXE_FORMAT);
703 AssertReturn(pImps->u.OriginalFirstThunk < pModPe->cbImage, VERR_BAD_EXE_FORMAT);
726 rc = pfnGetImport(&pModPe->Core, pszModName, NULL, (unsigned)IMAGE_ORDINAL64(pThunk->u1.Ordinal), &Value, pvUser);
731 && pThunk->u1.Ordinal < pModPe->cbImage)
734 rc = pfnGetImport(&pModPe->Core, pszModName, PE_RVA2TYPE(pvBitsR, (uintptr_t)pThunk->u1.AddressOfData + 2, const char *),
757 static int rtldrPEApplyFixups(PRTLDRMODPE pModPe, const void *pvBitsR, void *pvBitsW, RTUINTPTR BaseAddress, RTUINTPTR OldBaseAddress)
759 if ( !pModPe->RelocDir.VirtualAddress
760 || !pModPe->RelocDir.Size)
766 PIMAGE_BASE_RELOCATION pbr = PE_RVA2TYPE(pvBitsR, pModPe->RelocDir.VirtualAddress, PIMAGE_BASE_RELOCATION);
768 unsigned cbBaseRelocs = pModPe->RelocDir.Size;
771 Log4(("RTLdrPE: BASERELOC: VirtualAddres=%RX32 Size=%RX32\n", pModPe->RelocDir.VirtualAddress, pModPe->RelocDir.Size));
883 PRTLDRMODPE pModPe = (PRTLDRMODPE)pMod;
888 if (!pModPe->pvBits)
890 int rc = rtldrPEReadBits(pModPe);
898 int rc = ((PRTLDROPSPE)pMod->pOps)->pfnResolveImports(pModPe, pModPe->pvBits, pvBits, pfnGetImport, pvUser);
904 rc = rtldrPEApplyFixups(pModPe, pModPe->pvBits, pvBits, NewBaseAddress, OldBaseAddress);
915 * @param pModPe The PE module instance.
922 static int rtLdrPE_ExportToRva(PRTLDRMODPE pModPe, uint32_t iOrdinal, const char *pszSymbol,
928 if ( !pModPe->ExportDir.VirtualAddress
929 || !pModPe->ExportDir.Size)
938 if (!pModPe->pvBits)
940 int rc = rtldrPEReadBits(pModPe);
944 *ppvBits = pvBits = pModPe->pvBits;
947 PIMAGE_EXPORT_DIRECTORY pExpDir = PE_RVA2TYPE(pvBits, pModPe->ExportDir.VirtualAddress, PIMAGE_EXPORT_DIRECTORY);
1270 PRTLDRMODPE pModPe = (PRTLDRMODPE)pMod;
1276 if ( !pModPe->ExportDir.VirtualAddress
1277 || !pModPe->ExportDir.Size)
1285 if (!pModPe->pvBits)
1287 int rc = rtldrPEReadBits(pModPe);
1289 return rtldrPEEnumSymbolsSlow(pModPe, fFlags, BaseAddress, pfnCallback, pvUser);
1291 pvBits = pModPe->pvBits;
1298 PIMAGE_EXPORT_DIRECTORY pExpDir = PE_RVA2TYPE(pvBits, pModPe->ExportDir.VirtualAddress, PIMAGE_EXPORT_DIRECTORY);
1344 if ( uRVAExport - (uintptr_t)pModPe->ExportDir.VirtualAddress
1345 < pModPe->ExportDir.Size)
1375 PRTLDRMODPE pModPe = (PRTLDRMODPE)pMod;
1381 if ( !pModPe->DebugDir.VirtualAddress
1382 || !pModPe->DebugDir.Size)
1397 pvBits = pModPe->pvBits;
1400 int rcRet = rtldrPEReadPartByRva(pModPe, pvBits, pModPe->DebugDir.VirtualAddress, pModPe->DebugDir.Size,
1411 uint32_t const cEntries = pModPe->DebugDir.Size / sizeof(paDbgDir[0]);
1414 if (paDbgDir[i].PointerToRawData < pModPe->offEndOfHdrs)
1424 DbgInfo.LinkAddress = paDbgDir[i].AddressOfRawData < pModPe->cbImage
1425 && paDbgDir[i].AddressOfRawData >= pModPe->offEndOfHdrs
1435 DbgInfo.u.Cv.cbImage = pModPe->cbImage;
1445 rc = rtldrPEReadPart(pModPe, pvBits, DbgInfo.offFile, DbgInfo.LinkAddress, paDbgDir[i].SizeOfData, &pvPart);
1454 DbgInfo.u.Pdb20.cbImage = pModPe->cbImage;
1464 DbgInfo.u.Pdb70.cbImage = pModPe->cbImage;
1481 DbgInfo.u.Dbg.cbImage = pModPe->cbImage;
1485 DbgInfo.u.Dbg.uTimestamp = pModPe->uTimestamp; /* NT4 SP1 ntfs.sys hack. Generic? */
1487 rc = rtldrPEReadPart(pModPe, pvBits, DbgInfo.offFile, DbgInfo.LinkAddress, paDbgDir[i].SizeOfData, &pvPart);
1515 DbgInfo.u.Coff.cbImage = pModPe->cbImage;
1546 rtldrPEFreePart(pModPe, pvBits, pvPart);
1554 rtldrPEFreePart(pModPe, pvBits, paDbgDir);
1563 PRTLDRMODPE pModPe = (PRTLDRMODPE)pMod;
1576 SegInfo.LinkAddress = pModPe->uImageBase;
1579 SegInfo.cb = pModPe->cbHeaders;
1580 SegInfo.cbFile = pModPe->cbHeaders;
1581 SegInfo.cbMapped = pModPe->cbHeaders;
1582 if ((pModPe->paSections[0].Characteristics & IMAGE_SCN_TYPE_NOLOAD))
1583 SegInfo.cbMapped = pModPe->paSections[0].VirtualAddress;
1589 PCIMAGE_SECTION_HEADER pSh = pModPe->paSections;
1590 for (uint32_t i = 0; i < pModPe->cSections && rc == VINF_SUCCESS; i++, pSh++)
1627 SegInfo.LinkAddress = pSh->VirtualAddress + pModPe->uImageBase ;
1630 if (i + 1 < pModPe->cSections && !(pSh[1].Characteristics & IMAGE_SCN_TYPE_NOLOAD))
1656 PRTLDRMODPE pModPe = (PRTLDRMODPE)pMod;
1658 LinkAddress -= pModPe->uImageBase;
1661 if (LinkAddress < pModPe->paSections[0].VirtualAddress)
1672 if (LinkAddress > pModPe->cbImage)
1674 uint32_t i = pModPe->cSections;
1675 PCIMAGE_SECTION_HEADER paShs = pModPe->paSections;
1695 PRTLDRMODPE pModPe = (PRTLDRMODPE)pMod;
1697 LinkAddress -= pModPe->uImageBase;
1698 if (LinkAddress > pModPe->cbImage)
1710 PRTLDRMODPE pModPe = (PRTLDRMODPE)pMod;
1712 if (iSeg > pModPe->cSections)
1718 else if (pModPe->paSections[iSeg].Characteristics & IMAGE_SCN_TYPE_NOLOAD)
1721 *pRva = offSeg + pModPe->paSections[iSeg].VirtualAddress;
1730 PRTLDRMODPE pModPe = (PRTLDRMODPE)pMod;
1731 int rc = rtldrPE_LinkAddressToSegOffset(pMod, Rva + pModPe->uImageBase, piSeg, poffSeg);
1875 PRTLDRMODPE pModPe = (PRTLDRMODPE)pMod;
1881 *(int32_t *)pvBuf = pModPe->uTimestamp;
1883 *(int64_t *)pvBuf = pModPe->uTimestamp;
1891 *(bool *)pvBuf = pModPe->offPkcs7SignedData != 0;
1896 if (pModPe->cbPkcs7SignedData == 0)
1898 Assert(pModPe->offPkcs7SignedData > pModPe->SecurityDir.VirtualAddress);
1900 *pcbRet = pModPe->cbPkcs7SignedData;
1901 if (cbBuf < pModPe->cbPkcs7SignedData)
1903 return pModPe->Core.pReader->pfnRead(pModPe->Core.pReader, pvBuf, pModPe->cbPkcs7SignedData,
1904 pModPe->offPkcs7SignedData);
1910 *(bool *)pvBuf = pModPe->offPkcs7SignedData > 0
1911 && (pModPe->fDllCharacteristics & IMAGE_DLLCHARACTERISTICS_FORCE_INTEGRITY);
1917 if (pModPe->cImports == UINT32_MAX)
1919 int rc = rtLdrPE_CountImports(pModPe, pvBits);
1923 *(uint32_t *)pvBuf = pModPe->cImports;
1929 return rtLdrPE_QueryImportModule(pModPe, pvBits, *(uint32_t *)pvBuf, pvBuf, cbBuf, pcbRet);
2029 * @param pModPe The PE module.
2033 static int rtldrPe_CalcSpecialHashPlaces(PRTLDRMODPE pModPe, PRTLDRPEHASHSPECIALS pPlaces, PRTERRINFO pErrInfo)
2038 pPlaces->cbToHash = pModPe->SecurityDir.VirtualAddress;
2041 RTFOFF cbFile = pModPe->Core.pReader->pfnSize(pModPe->Core.pReader);
2050 pPlaces->offCksum = (uint32_t)pModPe->offNtHdrs
2051 + (pModPe->f64Bit
2055 pPlaces->offSecDir = (uint32_t)pModPe->offNtHdrs
2056 + (pModPe->f64Bit
2090 * @param pModPe The PE module.
2098 static int rtldrPE_HashImageCommon(PRTLDRMODPE pModPe, void *pvScratch, uint32_t cbScratch, RTDIGESTTYPE enmDigest,
2109 rc = rtldrPe_CalcSpecialHashPlaces(pModPe, &SpecialPlaces, pErrInfo);
2121 rc = pModPe->Core.pReader->pfnRead(pModPe->Core.pReader, pbCur, cbRead, off);
2179 if ( pModPe->SecurityDir.Size != SpecialPlaces.cbToHash
2200 * @param pModPe The PE module.
2203 static int rtldrPE_VerifySignatureImagePrecoditions(PRTLDRMODPE pModPe, PRTERRINFO pErrInfo)
2210 uint32_t offNext = pModPe->cbHeaders; /* same */
2211 for (uint32_t i = 0; i < pModPe->cSections; i++)
2212 if (pModPe->paSections[i].SizeOfRawData > 0)
2214 uint64_t offEnd = (uint64_t)pModPe->paSections[i].PointerToRawData + pModPe->paSections[i].SizeOfRawData;
2220 i, pModPe->paSections[i].PointerToRawData, pModPe->paSections[i].SizeOfRawData);
2229 if (!pModPe->SecurityDir.Size)
2232 uint32_t const offSignature = pModPe->SecurityDir.VirtualAddress;
2233 uint32_t const cbSignature = pModPe->SecurityDir.Size;
2259 * @param pModPe The PE module.
2265 static int rtldrPE_VerifySignatureRead(PRTLDRMODPE pModPe, PRTLDRPESIGNATURE *ppSignature, PRTERRINFO pErrInfo)
2268 AssertReturn(pModPe->SecurityDir.Size > 0, VERR_INTERNAL_ERROR_2);
2273 if (pModPe->SecurityDir.Size >= RTLDRMODPE_MAX_SECURITY_DIR_SIZE)
2275 "Signature directory is to large: %#x", pModPe->SecurityDir.Size);
2277 PRTLDRPESIGNATURE pSignature = (PRTLDRPESIGNATURE)RTMemTmpAllocZ(sizeof(*pSignature) + 64 + pModPe->SecurityDir.Size);
2280 sizeof(*pSignature) + 64 + pModPe->SecurityDir.Size);
2287 int rc = pModPe->Core.pReader->pfnRead(pModPe->Core.pReader, (void *)pSignature->pRawData,
2288 pModPe->SecurityDir.Size, pModPe->SecurityDir.VirtualAddress);
2294 uint32_t cbLeft = pModPe->SecurityDir.Size;
2342 * @param pModPe The PE module.
2345 static void rtldrPE_VerifySignatureDestroy(PRTLDRMODPE pModPe, PRTLDRPESIGNATURE pSignature)
2356 * @param pModPe The PE module.
2360 static int rtldrPE_VerifySignatureDecode(PRTLDRMODPE pModPe, PRTLDRPESIGNATURE pSignature, PRTERRINFO pErrInfo)
2421 static int rtldrPE_VerifyAllPageHashes(PRTLDRMODPE pModPe, PCRTCRSPCSERIALIZEDOBJECTATTRIBUTE pAttrib, RTDIGESTTYPE enmDigest,
2430 int rc = rtldrPe_CalcSpecialHashPlaces(pModPe, &SpecialPlaces, pErrInfo);
2450 uint32_t offSectEnd = pModPe->cbHeaders;
2473 if ( iSh < pModPe->cSections
2474 && offPageInFile - pModPe->paSections[iSh].PointerToRawData < pModPe->paSections[iSh].SizeOfRawData)
2475 offSectEnd = pModPe->paSections[iSh].PointerToRawData + pModPe->paSections[iSh].SizeOfRawData;
2479 while ( iSh < pModPe->cSections
2480 && offPageInFile - pModPe->paSections[iSh].PointerToRawData >= pModPe->paSections[iSh].SizeOfRawData)
2482 if (iSh < pModPe->cSections)
2483 offSectEnd = pModPe->paSections[iSh].PointerToRawData + pModPe->paSections[iSh].SizeOfRawData;
2527 rc = pModPe->Core.pReader->pfnRead(pModPe->Core.pReader, pbCur, cbScratchRead, offScratchRead);
2620 * @param pModPe The PE module.
2624 static int rtldrPE_VerifySignatureValidateHash(PRTLDRMODPE pModPe, PRTLDRPESIGNATURE pSignature, PRTERRINFO pErrInfo)
2657 int rc = rtldrPE_HashImageCommon(pModPe, pvScratch, cbScratch, pSignature->enmDigest,
2679 rc = rtldrPE_VerifyAllPageHashes(pModPe, pAttrib, RTDIGESTTYPE_SHA256, pvScratch, cbScratch, pErrInfo);
2685 rc = rtldrPE_VerifyAllPageHashes(pModPe, pAttrib, RTDIGESTTYPE_SHA1, pvScratch, cbScratch, pErrInfo);
2707 PRTLDRMODPE pModPe = (PRTLDRMODPE)pMod;
2709 int rc = rtldrPE_VerifySignatureImagePrecoditions(pModPe, pErrInfo);
2713 rc = rtldrPE_VerifySignatureRead(pModPe, &pSignature, pErrInfo);
2716 rc = rtldrPE_VerifySignatureDecode(pModPe, pSignature, pErrInfo);
2718 rc = rtldrPE_VerifySignatureValidateHash(pModPe, pSignature, pErrInfo);
2721 rc = pfnCallback(&pModPe->Core, RTLDRSIGNATURETYPE_PKCS7_SIGNED_DATA,
2725 rtldrPE_VerifySignatureDestroy(pModPe, pSignature);
2739 PRTLDRMODPE pModPe = (PRTLDRMODPE)pMod;
2759 int rc = rtldrPE_HashImageCommon(pModPe, pvScratch, cbScratch, enmDigest, &HashCtx, &HashRes, NULL);
2781 PRTLDRMODPE pModPe = (PRTLDRMODPE)pMod;
2782 if (pModPe->pvBits)
2784 RTMemFree(pModPe->pvBits);
2785 pModPe->pvBits = NULL;
2794 PRTLDRMODPE pModPe = (PRTLDRMODPE)pMod;
2795 if (pModPe->paSections)
2797 RTMemFree(pModPe->paSections);
2798 pModPe->paSections = NULL;
2800 if (pModPe->pvBits)
2802 RTMemFree(pModPe->pvBits);
2803 pModPe->pvBits = NULL;
3335 * @param pModPe The PE module instance.
3340 static int rtldrPEReadRVA(PRTLDRMODPE pModPe, void *pvBuf, uint32_t cb, uint32_t RVA)
3342 const IMAGE_SECTION_HEADER *pSH = pModPe->paSections;
3343 PRTLDRREADER pReader = pModPe->Core.pReader;
3350 if (RVA < pModPe->cbHeaders)
3352 cbRead = RT_MIN(pModPe->cbHeaders - RVA, cb);
3377 for (unsigned cLeft = pModPe->cSections;
3393 uint32_t RVANext = cLeft ? pSH[1].VirtualAddress : pModPe->cbImage;
3419 * @param pModPe The PE module instance.
3423 static int rtldrPEValidateDirectoriesAndRememberStuff(PRTLDRMODPE pModPe, const IMAGE_OPTIONAL_HEADER64 *pOptHdr, uint32_t fFlags)
3425 const char *pszLogName = pModPe->Core.pReader->pfnLogName(pModPe->Core.pReader); NOREF(pszLogName);
3439 const size_t cbExpectV4 = !pModPe->f64Bit
3442 const size_t cbExpectV3 = !pModPe->f64Bit
3445 const size_t cbExpectV2 = !pModPe->f64Bit
3448 const size_t cbExpectV1 = !pModPe->f64Bit
3466 int rc = rtldrPEReadRVA(pModPe, &u.Cfg64, Dir.Size, Dir.VirtualAddress);
3484 rc = rtldrPEReadRVA(pModPe, &u.Cfg64, Dir.Size, Dir.VirtualAddress);
3491 if (Dir.Size == 0x40 && u.Cfg64.Size == 0x00 && !pModPe->f64Bit)
3553 int rc = pModPe->Core.pReader->pfnRead(pModPe->Core.pReader, pFirst, Dir.Size, Dir.VirtualAddress);
3591 && pModPe->offPkcs7SignedData == 0)
3593 pModPe->offPkcs7SignedData = Dir.VirtualAddress
3595 pModPe->cbPkcs7SignedData = pCur->dwLength - RT_OFFSETOF(WIN_CERTIFICATE, bCertificate);
3685 PRTLDRMODPE pModPe = (PRTLDRMODPE)RTMemAllocZ(sizeof(*pModPe));
3686 if (pModPe)
3688 pModPe->Core.u32Magic = RTLDRMOD_MAGIC;
3689 pModPe->Core.eState = LDR_STATE_OPENED;
3691 pModPe->Core.pOps = &s_rtldrPE64Ops.Core;
3693 pModPe->Core.pOps = &s_rtldrPE32Ops.Core;
3694 pModPe->Core.pReader = pReader;
3695 pModPe->Core.enmFormat= RTLDRFMT_PE;
3696 pModPe->Core.enmType = FileHdr.Characteristics & IMAGE_FILE_DLL
3703 pModPe->Core.enmEndian= RTLDRENDIAN_LITTLE;
3704 pModPe->Core.enmArch = FileHdr.Machine == IMAGE_FILE_MACHINE_I386
3709 pModPe->pvBits = NULL;
3710 pModPe->offNtHdrs = offNtHdrs;
3711 pModPe->offEndOfHdrs = offNtHdrs + 4 + sizeof(IMAGE_FILE_HEADER) + FileHdr.SizeOfOptionalHeader + cbSections;
3712 pModPe->u16Machine = FileHdr.Machine;
3713 pModPe->fFile = FileHdr.Characteristics;
3714 pModPe->cSections = FileHdr.NumberOfSections;
3715 pModPe->paSections = paSections;
3716 pModPe->uEntryPointRVA= OptHdr.AddressOfEntryPoint;
3717 pModPe->uImageBase = (RTUINTPTR)OptHdr.ImageBase;
3718 pModPe->cbImage = OptHdr.SizeOfImage;
3719 pModPe->cbHeaders = OptHdr.SizeOfHeaders;
3720 pModPe->uTimestamp = FileHdr.TimeDateStamp;
3721 pModPe->cImports = UINT32_MAX;
3722 pModPe->f64Bit = FileHdr.SizeOfOptionalHeader == sizeof(OptHdr);
3723 pModPe->ImportDir = OptHdr.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT];
3724 pModPe->RelocDir = OptHdr.DataDirectory[IMAGE_DIRECTORY_ENTRY_BASERELOC];
3725 pModPe->ExportDir = OptHdr.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT];
3726 pModPe->DebugDir = OptHdr.DataDirectory[IMAGE_DIRECTORY_ENTRY_DEBUG];
3727 pModPe->SecurityDir = OptHdr.DataDirectory[IMAGE_DIRECTORY_ENTRY_SECURITY];
3728 pModPe->fDllCharacteristics = OptHdr.DllCharacteristics;
3735 rc = rtldrPEValidateDirectoriesAndRememberStuff(pModPe, &OptHdr, fFlags);
3738 *phLdrMod = &pModPe->Core;
3741 RTMemFree(pModPe);