Ignore:
Timestamp:
Apr 9, 2001, 10:50:16 PM (24 years ago)
Author:
umoeller
Message:

Sources for V0.9.9, plus a couple of fixes.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/helpers/dosh2.c

    r56 r57  
    810810 *@@changed V0.9.1 (2000-02-13) [umoeller]: fixed 32-bits flag
    811811 *@@changed V0.9.7 (2000-12-20) [lafaix]: fixed ulNewHeaderOfs
     812 *@@changed V0.9.10 (2001-04-08) [umoeller]: now setting ppExec only if NO_ERROR is returned
    812813 */
    813814
     
    819820    ULONG   ulAction = 0;
    820821    HFILE   hFile;
     822    PEXECUTABLE pExec = NULL;
    821823
    822824    if (!ppExec)
    823825        return (ERROR_INVALID_PARAMETER);
    824826
    825     *ppExec = (PEXECUTABLE)malloc(sizeof(EXECUTABLE));
    826     if (!(*ppExec))
     827    pExec = (PEXECUTABLE)malloc(sizeof(EXECUTABLE));
     828    if (!(pExec))
    827829        return (ERROR_NOT_ENOUGH_MEMORY);
    828830
    829     memset((*ppExec), 0, sizeof(EXECUTABLE));
     831    memset(pExec, 0, sizeof(EXECUTABLE));
    830832
    831833    if (!(arc = DosOpen((PSZ)pcszExecutable,
     
    850852
    851853        // read old DOS EXE header
    852         (*ppExec)->pDosExeHeader = (PDOSEXEHEADER)malloc(sizeof(DOSEXEHEADER));
    853         if (!((*ppExec)->pDosExeHeader))
     854        pExec->pDosExeHeader = (PDOSEXEHEADER)malloc(sizeof(DOSEXEHEADER));
     855        if (!(pExec->pDosExeHeader))
    854856            arc = ERROR_NOT_ENOUGH_MEMORY;
    855857        else
     
    862864                                           &ulLocal)))      // out: new offset
    863865                 && (!(arc = DosRead(hFile,
    864                                      (*ppExec)->pDosExeHeader,
     866                                     pExec->pDosExeHeader,
    865867                                     sizeof(DOSEXEHEADER),
    866                                      &((*ppExec)->cbDosExeHeader))))
     868                                     &(pExec->cbDosExeHeader))))
    867869               )
    868870            {
    869871                // now check if we really have a DOS header
    870                 if ((*ppExec)->pDosExeHeader->usDosExeID != 0x5a4d)
     872                if (pExec->pDosExeHeader->usDosExeID != 0x5a4d)
    871873                    arc = ERROR_INVALID_EXE_SIGNATURE;
    872874                else
    873875                {
    874876                    // we have a DOS header:
    875                     if ((*ppExec)->pDosExeHeader->usRelocTableOfs < 0x40)
     877                    if (pExec->pDosExeHeader->usRelocTableOfs < 0x40)
    876878                    {
    877879                        // neither LX nor PE nor NE:
    878                         (*ppExec)->ulOS = EXEOS_DOS3;
    879                         (*ppExec)->ulExeFormat = EXEFORMAT_OLDDOS;
     880                        pExec->ulOS = EXEOS_DOS3;
     881                        pExec->ulExeFormat = EXEFORMAT_OLDDOS;
    880882                    }
    881883                    else
     
    886888
    887889                        if (    (!(arc = DosSetFilePtr(hFile,
    888                                                        (*ppExec)->pDosExeHeader->ulNewHeaderOfs,
     890                                                       pExec->pDosExeHeader->ulNewHeaderOfs,
    889891                                                       FILE_BEGIN,
    890892                                                       &ulLocal)))
     
    900902                            // reset file ptr
    901903                            DosSetFilePtr(hFile,
    902                                           (*ppExec)->pDosExeHeader->ulNewHeaderOfs,
     904                                          pExec->pDosExeHeader->ulNewHeaderOfs,
    903905                                          FILE_BEGIN,
    904906                                          &ulLocal);
     
    907909                            {
    908910                                // New Executable:
    909                                 (*ppExec)->ulExeFormat = EXEFORMAT_NE;
     911                                pExec->ulExeFormat = EXEFORMAT_NE;
    910912                                // allocate NE header
    911                                 (*ppExec)->pNEHeader = (PNEHEADER)malloc(sizeof(NEHEADER));
    912                                 if (!((*ppExec)->pNEHeader))
     913                                pExec->pNEHeader = (PNEHEADER)malloc(sizeof(NEHEADER));
     914                                if (!(pExec->pNEHeader))
    913915                                    arc = ERROR_NOT_ENOUGH_MEMORY;
    914916                                else
    915917                                    // read in NE header
    916918                                    if (!(arc = DosRead(hFile,
    917                                                         (*ppExec)->pNEHeader,
     919                                                        pExec->pNEHeader,
    918920                                                        sizeof(NEHEADER),
    919                                                         &((*ppExec)->cbNEHeader))))
    920                                         if ((*ppExec)->cbNEHeader == sizeof(NEHEADER))
    921                                             pbCheckOS = &((*ppExec)->pNEHeader->bTargetOS);
     921                                                        &(pExec->cbNEHeader))))
     922                                        if (pExec->cbNEHeader == sizeof(NEHEADER))
     923                                            pbCheckOS = &(pExec->pNEHeader->bTargetOS);
    922924                            }
    923925                            else if (   (memcmp(achNewHeaderType, "LX", 2) == 0)
     
    927929                            {
    928930                                // OS/2 Linear Executable:
    929                                 (*ppExec)->ulExeFormat = EXEFORMAT_LX;
     931                                pExec->ulExeFormat = EXEFORMAT_LX;
    930932                                // allocate LX header
    931                                 (*ppExec)->pLXHeader = (PLXHEADER)malloc(sizeof(LXHEADER));
    932                                 if (!((*ppExec)->pLXHeader))
     933                                pExec->pLXHeader = (PLXHEADER)malloc(sizeof(LXHEADER));
     934                                if (!(pExec->pLXHeader))
    933935                                    arc = ERROR_NOT_ENOUGH_MEMORY;
    934936                                else
    935937                                    // read in LX header
    936938                                    if (!(arc = DosRead(hFile,
    937                                                         (*ppExec)->pLXHeader,
     939                                                        pExec->pLXHeader,
    938940                                                        sizeof(LXHEADER),
    939                                                         &((*ppExec)->cbLXHeader))))
    940                                         if ((*ppExec)->cbLXHeader == sizeof(LXHEADER))
    941                                             pbCheckOS = (PBYTE)(&((*ppExec)->pLXHeader->usTargetOS));
     941                                                        &(pExec->cbLXHeader))))
     942                                        if (pExec->cbLXHeader == sizeof(LXHEADER))
     943                                            pbCheckOS = (PBYTE)(&(pExec->pLXHeader->usTargetOS));
    942944                            }
    943945                            else if (memcmp(achNewHeaderType, "PE", 2) == 0)
    944946                            {
    945                                 (*ppExec)->ulExeFormat = EXEFORMAT_PE;
    946                                 (*ppExec)->ulOS = EXEOS_WIN32;
    947                                 (*ppExec)->f32Bits = TRUE;
     947                                pExec->ulExeFormat = EXEFORMAT_PE;
     948                                pExec->ulOS = EXEOS_WIN32;
     949                                pExec->f32Bits = TRUE;
    948950
    949951                                // can't parse this yet
     
    959961                                {
    960962                                    case NEOS_OS2:
    961                                         (*ppExec)->ulOS = EXEOS_OS2;
    962                                         if ((*ppExec)->ulExeFormat == EXEFORMAT_LX)
    963                                             (*ppExec)->f32Bits = TRUE;
     963                                        pExec->ulOS = EXEOS_OS2;
     964                                        if (pExec->ulExeFormat == EXEFORMAT_LX)
     965                                            pExec->f32Bits = TRUE;
    964966                                    break;
    965967
    966968                                    case NEOS_WIN16:
    967                                         (*ppExec)->ulOS = EXEOS_WIN16;
     969                                        pExec->ulOS = EXEOS_WIN16;
    968970                                    break;
    969971
    970972                                    case NEOS_DOS4:
    971                                         (*ppExec)->ulOS = EXEOS_DOS4;
     973                                        pExec->ulOS = EXEOS_DOS4;
    972974                                    break;
    973975
    974976                                    case NEOS_WIN386:
    975                                         (*ppExec)->ulOS = EXEOS_WIN386;
    976                                         (*ppExec)->f32Bits = TRUE;
     977                                        pExec->ulOS = EXEOS_WIN386;
     978                                        pExec->f32Bits = TRUE;
    977979                                    break;
    978980                                }
     
    981983                }
    982984            } // end if (!(arc = DosSetFilePtr(hFile,
    983         } // end if (*ppExec)->pDosExeHeader = (PDOSEXEHEADER)malloc(sizeof(DOSEXEHEADER));
     985        } // end if pExec->pDosExeHeader = (PDOSEXEHEADER)malloc(sizeof(DOSEXEHEADER));
    984986
    985987        // store exec's HFILE
    986         (*ppExec)->hfExe = hFile;
     988        pExec->hfExe = hFile;
    987989    } // end if (!(arc = DosOpen((PSZ)pcszExecutable,
    988990
    989991    if (arc != NO_ERROR)
    990992        // error: clean up
    991         doshExecClose(*ppExec);
     993        doshExecClose(pExec);
     994    else
     995        *ppExec = pExec;
    992996
    993997    return (arc);
     
    30053009 *@@added V0.9.0 [umoeller]
    30063010 *@@changed V0.9.9 (2001-04-07) [umoeller]: added transparent LVM support; changed prototype
    3007  *@@changed V0.9.9 (2001-04-07) [umoeller]: added memory leaks on errors
     3011 *@@changed V0.9.9 (2001-04-07) [umoeller]: fixed memory leaks on errors
    30083012 */
    30093013
Note: See TracChangeset for help on using the changeset viewer.