Changeset 54


Ignore:
Timestamp:
Oct 9, 2013, 9:52:48 PM (12 years ago)
Author:
bird
Message:

Added kLdrModQueryImageUuid for Mach-O.

Location:
trunk
Files:
7 edited

Legend:

Unmodified
Added
Removed
  • trunk/include/k/kErrors.h

    r29 r54  
    206206/** Unsupported CPU subtype found in a FAT entry. */
    207207#define KLDR_ERR_FAT_UNSUPPORTED_CPU_SUBTYPE            (KLDR_ERR_BASE + 37)
     208/** The image has no UUID. */
     209#define KLDR_ERR_NO_IMAGE_UUID                          (KLDR_ERR_BASE + 38)
    208210/** @} */
    209211
     
    212214 */
    213215/** The base of the kLdrModPE specific status codes. */
    214 #define KLDR_ERR_PE_BASE                                (KLDR_ERR_BASE + 38)
     216#define KLDR_ERR_PE_BASE                                (KLDR_ERR_BASE + 39)
    215217/** The machine isn't supported by the interpreter. */
    216218#define KLDR_ERR_PE_UNSUPPORTED_MACHINE                 (KLDR_ERR_PE_BASE + 0)
  • trunk/include/k/kLdr.h

    r52 r54  
    614614int     kLdrModGetStackInfo(PKLDRMOD pMod, const void *pvBits, KLDRADDR BaseAddress, PKLDRSTACKINFO pStackInfo);
    615615int     kLdrModQueryMainEntrypoint(PKLDRMOD pMod, const void *pvBits, KLDRADDR BaseAddress, PKLDRADDR pMainEPAddress);
     616int     kLdrModQueryImageUuid(PKLDRMOD pMod, const void *pvBits, void *pvUuid, KSIZE cbUuid);
    616617int     kLdrModQueryResource(PKLDRMOD pMod, const void *pvBits, KLDRADDR BaseAddress, KU32 idType, const char *pszType,
    617618                             KU32 idName, const char *pszName, KU32 idLang, PKLDRADDR pAddrRsrc, KSIZE *pcbRsrc);
     
    699700    /** @copydoc kLdrModQueryMainEntrypoint */
    700701    int (* pfnQueryMainEntrypoint)(PKLDRMOD pMod, const void *pvBits, KLDRADDR BaseAddress, PKLDRADDR pMainEPAddress);
     702    /** @copydoc kLdrModQueryImageUuid  */
     703    int (* pfnQueryImageUuid)(PKLDRMOD pMod, const void *pvBits, void *pvUuid, KSIZE pcbUuid);
    701704    /** @copydoc kLdrModQueryResource */
    702705    int (* pfnQueryResource)(PKLDRMOD pMod, const void *pvBits, KLDRADDR BaseAddress, KU32 idType, const char *pszType,
  • trunk/kLdr/kLdrMod.c

    r52 r54  
    511511 * @param   pvBits          Optional pointer to bits returned by kLdrModGetBits().
    512512 *                          This can be used by some module interpreters to reduce memory consumption.
     513 * @param   enmArch         The CPU architecture.
     514 * @param   enmCpu          The CPU series/model.
    513515 */
    514516int     kLdrModCanExecuteOn(PKLDRMOD pMod, const void *pvBits, KCPUARCH enmArch, KCPU enmCpu)
     
    560562    *pMainEPAddress = 0;
    561563    return pMod->pOps->pfnQueryMainEntrypoint(pMod, pvBits, BaseAddress, pMainEPAddress);
     564}
     565
     566
     567/**
     568 * Queries the image UUID, if the image has one.
     569 *
     570 * @returns 0 and *pvUuid. Non-zero status code on failure.
     571 * @param   pMod            The module.
     572 * @param   pvBits          Optional pointer to bits returned by kLdrModGetBits() currently located at BaseAddress.
     573 *                          This can be used by some module interpreters to reduce memory consumption.
     574 * @param   pvUuid          Where to store the UUID.
     575 * @param   cbUuid          Size of the UUID buffer, must be at least 16 bytes.
     576 */
     577int     kLdrModQueryImageUuid(PKLDRMOD pMod, const void *pvBits, void *pvUuid, KSIZE cbUuid)
     578{
     579    KLDRMOD_VALIDATE(pMod);
     580    if (cbUuid < 16)
     581        return KERR_INVALID_SIZE;
     582    if (pMod->pOps->pfnQueryImageUuid)
     583        return pMod->pOps->pfnQueryImageUuid(pMod, pvBits, pvUuid, cbUuid);
     584    return KLDR_ERR_NO_IMAGE_UUID;
    562585}
    563586
  • trunk/kLdr/kLdrModLX.c

    r29 r54  
    26402640    kldrModLXGetStackInfo,
    26412641    kldrModLXQueryMainEntrypoint,
     2642    NULL /* pfnQueryImageUuid */,
    26422643    NULL /* fixme */,
    26432644    NULL /* fixme */,
  • trunk/kLdr/kLdrModMachO.c

    r53 r54  
    164164    /** Pointer to the loaded string table. */
    165165    char                   *pchStrings;
     166
     167    /** The image UUID, all zeros if not found. */
     168    KU8                     abImageUuid[16];
    166169
    167170    /** The RVA of the Global Offset Table. */
     
    475478    pModMachO->cchStrings = 0;
    476479    pModMachO->pchStrings = NULL;
     480    kHlpMemSet(pModMachO->abImageUuid, 0, sizeof(pModMachO->abImageUuid));
    477481    pModMachO->GotRVA = NIL_KLDRADDR;
    478482    pModMachO->JmpStubsRVA = NIL_KLDRADDR;
     
    11171121        const segment_command_64_t *pSeg64;
    11181122        const symtab_command_t     *pSymTab;
     1123        const uuid_command_t       *pUuid;
    11191124    } u;
    11201125    const char *pchCurSegName = NULL;
     
    14261431                break;
    14271432
     1433            case LC_UUID:
     1434                kHlpMemCopy(pModMachO->abImageUuid, u.pUuid->uuid, sizeof(pModMachO->abImageUuid));
     1435                break;
     1436
    14281437            default:
    14291438                break;
     
    24042413    *pMainEPAddress = NIL_KLDRADDR;
    24052414#endif
     2415    return 0;
     2416}
     2417
     2418
     2419/** @copydoc kLdrModQueryImageUuid */
     2420static int kldrModMachOQueryImageUuid(PKLDRMOD pMod, const void *pvBits, void *pvUuid, KSIZE cbUuid)
     2421{
     2422    PKLDRMODMACHO pModMachO = (PKLDRMODMACHO)pMod->pvData;
     2423    kHlpMemSet(pvUuid, 0, cbUuid);
     2424    if (kHlpMemComp(pvUuid, pModMachO->abImageUuid, sizeof(pModMachO->abImageUuid)) == 0)
     2425        return KLDR_ERR_NO_IMAGE_UUID;
     2426    kHlpMemCopy(pvUuid, pModMachO->abImageUuid, sizeof(pModMachO->abImageUuid));
    24062427    return 0;
    24072428}
     
    37393760    kldrModMachOGetStackInfo,
    37403761    kldrModMachOQueryMainEntrypoint,
     3762    kldrModMachOQueryImageUuid,
    37413763    NULL,
    37423764    NULL,
  • trunk/kLdr/kLdrModNative.c

    r29 r54  
    11361136    kldrModNativeGetStackInfo,
    11371137    kldrModNativeQueryMainEntrypoint,
     1138    NULL /* pfnQueryImageUuid */,
    11381139    NULL /* fixme */,
    11391140    NULL /* fixme */,
  • trunk/kLdr/kLdrModPE.c

    r41 r54  
    19791979    kldrModPEGetStackInfo,
    19801980    kldrModPEQueryMainEntrypoint,
     1981    NULL /* pfnQueryImageUuid */,
    19811982    NULL, /** @todo resources */
    19821983    NULL, /** @todo resources */
Note: See TracChangeset for help on using the changeset viewer.