Changeset 2858


Ignore:
Timestamp:
Nov 6, 2006, 1:23:14 AM (19 years ago)
Author:
bird
Message:

bugfixing - dinner break.

Location:
trunk/kLdr
Files:
8 edited

Legend:

Unmodified
Added
Removed
  • trunk/kLdr/Makefile.kmk

    r2854 r2858  
    6868 kLdr_TOOL = GCC3
    6969 kLdr_TOOL = VCC70
    70  kLdr_CFLAGS = -W3 -Zl
     70 kLdr_CFLAGS = -W3 -Zl -ML
    7171 kLdr_ASFLAGS = -f win
    72  kLdr_LDFLAGS = -Entry:DllMain@12
     72 kLdr_LDFLAGS = -Entry:DllMain@12 -Debug
    7373 kLdr_DEFS = __WIN__
    7474 kLdr_SDKS = WIN32SDK
    7575 #kLdr_SDKS.x86 = WIN32SDK
    7676 #kLdr_SDKS.amd64 = WIN64SDK
     77 kLdr_LIBS = \
     78        $$(PATH_TOOL_VCC70_LIB)/LIBC.lib
    7779else
    7880 ifneq ($(filter os2,$(BUILD_TARGET)),)
     
    138140        kLdrHlpHeap.c \
    139141
     142#
     143# Heap testcase.
     144#
     145PROGRAMS += tstkLdrMod
     146tstkLdrMod_TEMPLATE = TST
     147tstkLdrMod_SOURCES = \
     148        tstkLdrMod.c
     149ifneq ($(filter win win32 win64 nt,$(BUILD_TARGET)),)
     150tstkLdrMod_LIBS = $(TARGET_kLdr:.dll=.lib)
     151else
     152tstkLdrMod_LIBS = $(TARGET_kLdr)
     153endif
     154
     155
    140156
    141157# generate rules.
  • trunk/kLdr/kLdr-win.def

    r2834 r2858  
    3838    kLdrRdrTell
    3939    kLdrRdrName
     40    kLdrRdrPageSize
     41    kLdrRdrPrepare
     42    kLdrRdrMap
     43    kLdrRdrRefreshMap
     44    kLdrRdrProtect
     45    kLdrRdrUnmap
     46    kLdrRdrUnprepare
     47    kLdrRdrDone
    4048
    4149    ; The module interpreter API
     50    kLdrModOpen
    4251    kLdrModOpenFromRdr
    43     kLdrModOpen
     52    kLdrModOpenNative
     53    kLdrModClose
     54    kLdrModQuerySymbol
     55    kLdrModEnumSymbols
     56    kLdrModGetImport
     57    kLdrModNumberOfImports
     58    kLdrModCanExecuteOn
     59    kLdrModGetStackInfo
     60    kLdrModQueryMainEntrypoint
     61    kLdrModEnumDbgInfo
     62    kLdrModHasDbgInfo
     63    kLdrModMap
     64    kLdrModUnmap
     65    kLdrModAllocTLS
     66    kLdrModFreeTLS
     67    kLdrModReload
     68    kLdrModFixupMapping
     69    kLdrModCallInit
     70    kLdrModCallTerm
     71    kLdrModCallThread
     72    kLdrModSize
     73    kLdrModGetBits
     74    kLdrModRelocateBits
    4475
    4576    ; Process Bootstrapping
  • trunk/kLdr/kLdr.h

    r2857 r2858  
    928928 */
    929929#ifdef __OS2__
    930 # define KLDR_ERR_BASE          0x7face000
     930# define KLDR_ERR_BASE          420000
    931931#elif defined(__WIN__)
    932 # define KLDR_ERR_BASE          0x7face000
     932# define KLDR_ERR_BASE          420000
    933933#else
    934934# error "port me"
  • trunk/kLdr/kLdrHlp.h

    r2854 r2858  
    3838#define KLDR_MAX(a, b) ((a) >= (b) ? (a) : (b))
    3939/** Calculate the offset of a structure member. */
    40 #define KLDR_OFFSETOF(strct, memb)  ( (size_t)( ((strct *)0)->memb ) )
     40#define KLDR_OFFSETOF(strct, memb)  ( (size_t)( &((strct *)0)->memb ) )
    4141/** Align a size_t value. */
    4242#define KLDR_ALIGN_Z(val, align)    ( ((val) + ((align) - 1)) & ~(size_t)((align) - 1) )
  • trunk/kLdr/kLdrInternal.h

    r2847 r2858  
    403403
    404404
     405/** @name Module interpreter method tables
     406 * @{ */
     407extern KLDRMODOPS       g_kLdrModPEOps;
     408/** @} */
     409
    405410/** @} */
    406411#ifdef __cplusplus
  • trunk/kLdr/kLdrMod.c

    r2856 r2858  
    183183        rc = KLDR_ERR_LE_NOT_SUPPORTED;
    184184    else if (u.u32 == IMAGE_NT_SIGNATURE)
    185         rc = KLDR_ERR_PE_NOT_SUPPORTED;
     185        rc = g_kLdrModPEOps.pfnCreate(&g_kLdrModPEOps, pRdr, offHdr, ppMod);
    186186    else if (u.u32 == IMAGE_ELF_SIGNATURE)
    187187        rc = KLDR_ERR_ELF_NOT_SUPPORTED;
  • trunk/kLdr/kLdrModPE.c

    r2857 r2858  
    204204     */
    205205    cchFilename = kLdrHlpStrLen(kLdrRdrName(pRdr));
    206     cb = sizeof(KLDRMOD)
    207        + s.FileHdr.NumberOfSections * sizeof(KLDRSEG)
    208        + sizeof(KLDRMODPE) - sizeof(IMAGE_SECTION_HEADER)
    209        + s.FileHdr.NumberOfSections * sizeof(IMAGE_SECTION_HEADER)
     206    cb = KLDR_ALIGN_Z(KLDR_OFFSETOF(KLDRMODPE, aShdrs[s.FileHdr.NumberOfSections]), 16)
     207       + KLDR_OFFSETOF(KLDRMOD, aSegments[s.FileHdr.NumberOfSections + 1])
    210208       + cchFilename + 1;
    211209    pModPE = (PKLDRMODPE)kldrHlpAlloc(cb);
    212210    if (!pModPE)
    213211        return KLDR_ERR_NO_MEMORY;
     212    *ppModPE = pModPE;
    214213
    215214    /* KLDRMOD */
    216     pMod = (PKLDRMOD)((uint8_t *)pModPE + sizeof(KLDRMOD) + (s.FileHdr.NumberOfSections + 1) * sizeof(KLDRSEG));
     215    pMod = (PKLDRMOD)((uint8_t *)pModPE + KLDR_ALIGN_Z(KLDR_OFFSETOF(KLDRMODPE, aShdrs[s.FileHdr.NumberOfSections]), 16));
    217216    pMod->pvData = pModPE;
    218217    pMod->pRdr = pRdr;
     
    252251    pModPE->Hdrs.Signature = s.Signature;
    253252    pModPE->Hdrs.FileHeader = s.FileHdr;
    254     *ppModPE = pModPE;
    255253
    256254    /*
     
    811809
    812810/** @copydoc kLdrModEnumSymbols */
    813 static int kldrModPEEnumSymbols(PKLDRMOD pMod, uint32_t fFlags, const void *pvBits, KLDRADDR BaseAddress,
    814                                 PFNKLDRMODENUMSYMS pfnCallback, void *pvUser)
     811static int kldrModPEEnumSymbols(PKLDRMOD pMod, const void *pvBits, KLDRADDR BaseAddress,
     812                                uint32_t fFlags, PFNKLDRMODENUMSYMS pfnCallback, void *pvUser)
    815813{
    816814    PKLDRMODPE                      pModPE = (PKLDRMODPE)pMod->pvData;
     
    890888
    891889/** @copydoc kLdrModGetImport */
    892 static int kldrModPEGetImport(PKLDRMOD pMod, void *pvBits, uint32_t iImport, char *pszName, size_t cchName)
     890static int kldrModPEGetImport(PKLDRMOD pMod, const void *pvBits, uint32_t iImport, char *pszName, size_t cchName)
    893891{
    894892    PKLDRMODPE                      pModPE = (PKLDRMODPE)pMod->pvData;
     
    19401938}
    19411939
     1940
     1941/**
     1942 * The PE module interpreter method table.
     1943 */
     1944KLDRMODOPS g_kLdrModPEOps =
     1945{
     1946    "PE",
     1947    NULL,
     1948    kldrModPECreate,
     1949    kldrModPEDestroy,
     1950    kldrModPEQuerySymbol,
     1951    kldrModPEEnumSymbols,
     1952    kldrModPEGetImport,
     1953    kldrModPENumberOfImports,
     1954    NULL /* can execute one is optional */,
     1955    kldrModPEGetStackInfo,
     1956    kldrModPEQueryMainEntrypoint,
     1957    kldrModPEEnumDbgInfo,
     1958    kldrModPEHasDbgInfo,
     1959    kldrModPEMap,
     1960    kldrModPEUnmap,
     1961    kldrModPEAllocTLS,
     1962    kldrModPEFreeTLS,
     1963    kldrModPEReload,
     1964    kldrModPEFixupMapping,
     1965    kldrModPECallInit,
     1966    kldrModPECallTerm,
     1967    kldrModPECallThread,
     1968    kldrModPESize,
     1969    kldrModPEGetBits,
     1970    kldrModPERelocateBits,
     1971    42 /* the end */
     1972};
  • trunk/kLdr/kLdrRdrFile.c

    r2857 r2858  
    232232
    233233        SetLastError(0);
    234         offLow = SetFilePointer(pRdrFile->File, 0, &offHigh, FILE_BEGIN);
     234        offLow = SetFilePointer(pRdrFile->File, 0, &offHigh, FILE_CURRENT);
    235235        rc = GetLastError();
    236236        if (rc)
     
    325325#ifdef __OS2__
    326326        ULONG ulNew;
    327         APIRET rc = DosSetFilePtr(pRdrFile->File, off, FILE_BEGIN, &ulNew);
     327        APIRET rc;
     328
     329        rc = DosSetFilePtr(pRdrFile->File, off, FILE_BEGIN, &ulNew);
    328330        if (rc)
    329331        {
     
    333335
    334336#elif defined(__WIN__)
    335         LONG offHigh = (LONG)(off >> 32);
    336         LONG offLow = SetFilePointer(pRdrFile->File, (LONG)off, &offHigh, FILE_BEGIN);
     337        LONG offHigh;
     338        LONG offLow;
     339
     340        offHigh = sizeof(off_t) == 4 ? 0 : (off >> 32);
     341        offLow = SetFilePointer(pRdrFile->File, (LONG)off, &offHigh, FILE_BEGIN);
    337342        if (    offLow != (LONG)off
    338             &&  offHigh != (LONG)(off >> 32))
     343            ||  offHigh != (LONG)(sizeof(off_t) == 4 ? 0 : (off >> 32)))
    339344        {
    340345            int rc = GetLastError();
     
    405410
    406411#elif defined(__WIN__)
     412    rc = 0;
    407413    if (!CloseHandle(pRdrFile->File))
    408414        rc = GetLastError();
     
    433439     */
    434440#ifdef __OS2__
    435     ULONG ulAction = 0;
    436     FILESTATUS3 Info;
    437     APIRET rc;
    438     HFILE File = 0;
    439     off_t cb;
     441    ULONG           ulAction = 0;
     442    FILESTATUS3     Info;
     443    APIRET          rc;
     444    HFILE           File = 0;
     445    off_t           cb;
     446    char            szFilename[CCHMAXPATH];
    440447
    441448    if ((uintptr_t)pszFilename >= 0x20000000)
     
    451458    if (rc)
    452459        return rc;
     460
     461    rc = DosQueryPathInfo(pszFilename, FIL_QUERYFULLNAME, szFilename, sizeof(szFilename));
     462    if (rc)
     463    {
     464        DosClose(File);
     465        return rc;
     466    }
    453467
    454468    rc = DosQueryFileInfo(File, FIL_STANDARD, &Info, sizeof(Info));
     
    467481    HANDLE              File;
    468482    off_t               cb;
     483    char                szFilename[MAX_PATH];
    469484
    470485    SecAttr.bInheritHandle = FALSE;
     
    475490        return GetLastError();
    476491
     492    if (!GetFullPathName(pszFilename, sizeof(szFilename), szFilename, NULL))
     493    {
     494        rc = GetLastError();
     495        CloseHandle(File);
     496        return rc;
     497    }
     498
    477499    SetLastError(0);
    478500    Low = GetFileSize(File, &High);
     
    483505        return rc;
    484506    }
    485     cb = ((off_t)High << 32) | Low;
     507    if (sizeof(off_t) == 4)
     508        cb = High ? 0x7fffffff : Low;
     509    else
     510        cb = ((off_t)High << 32) | Low;
    486511
    487512#else
     
    493518     * Allocate the reader instance.
    494519     */
    495     cchFilename = kLdrHlpStrLen(pszFilename);
     520    cchFilename = kLdrHlpStrLen(szFilename);
    496521    pRdrFile = (PKLDRRDRFILE)kldrHlpAlloc(sizeof(*pRdrFile) + cchFilename);
    497522    if (!pRdrFile)
     
    513538     * Initialize it and return successfully.
    514539     */
     540    pRdrFile->Core.u32Magic = KLDRRDR_MAGIC;
    515541    pRdrFile->Core.pOps = &g_kLdrRdrFileOps;
    516542    pRdrFile->File = File;
     543    pRdrFile->cb = cb;
    517544    pRdrFile->off = 0;
    518     kLdrHlpMemCopy(&pRdrFile->szFilename[0], pszFilename, cchFilename + 1);
     545    kLdrHlpMemCopy(&pRdrFile->szFilename[0], szFilename, cchFilename + 1);
    519546
    520547    *ppRdr = &pRdrFile->Core;
Note: See TracChangeset for help on using the changeset viewer.