Changeset 3376 for trunk/src


Ignore:
Timestamp:
Apr 15, 2000, 12:56:11 AM (25 years ago)
Author:
sandervl
Message:

pe loader command line fixes + support for names with spaces

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/peldr/pe.cpp

    r3374 r3376  
    1 /* $Id: pe.cpp,v 1.15 2000-04-13 18:54:41 sandervl Exp $ */
     1/* $Id: pe.cpp,v 1.16 2000-04-14 22:56:11 sandervl Exp $ */
    22
    33/*
     
    3838char szInteralErrorMsg[]= "Internal Error";
    3939char szNoKernel32Msg[]  = "Can't load/find kernel32.dll (rc=%d)";
     40char szDosInfoBlocks[]  = "DosInfoBlocks failed!";
    4041
    4142char fullpath[CCHMAXPATH];
     
    6263
    6364//should be the same as in ..\kernel32\winexepeldr.h
    64 typedef BOOL (* WIN32API WIN32CTOR)(char *, ULONG);
     65typedef BOOL (* WIN32API WIN32CTOR)(char *, char *, ULONG);
    6566
    6667WIN32CTOR              CreateWin32Exe       = 0;
     
    7778 HMQ    hmq = 0;                             /* Message queue handle         */
    7879 char   exeName[CCHMAXPATH];
     80 char   fullpath[CCHMAXPATH];
    7981 APIRET  rc;
    8082 HMODULE hmodPMWin = 0, hmodKernel32 = 0;
     83 PTIB   ptib;
     84 PPIB   ppib;
     85 char  *cmdline, *win32cmdline;
    8186
    8287  if(argc >= 2) {
    83         strcpy(exeName, argv[1]);
    84         strupr(exeName);
     88        if(DosGetInfoBlocks(&ptib, &ppib) == 0) {
     89                cmdline = ppib->pib_pchcmd;
     90                cmdline += strlen(cmdline)+1;   //skip pe.exe
     91                while(*cmdline == ' ')  cmdline++; //skip leading space
     92                if(*cmdline == '"')     cmdline++;
     93                win32cmdline = cmdline;
     94
     95                strncpy(exeName, cmdline, sizeof(exeName)-1);
     96                exeName[sizeof(exeName)-1] = 0;
     97                strupr(exeName);
     98                cmdline = strstr(exeName, ".EXE");
     99                if(cmdline) {
     100                        cmdline[4] = 0;
     101                        win32cmdline += ((ULONG)cmdline - (ULONG)exeName) + 4;
     102                }
     103                else {
     104                        cmdline = exeName;
     105                        while(*cmdline && *cmdline != ' ')      cmdline++; //skip exe name
     106                        *cmdline = 0;
     107                        win32cmdline += ((ULONG)cmdline - (ULONG)exeName);
     108                        if(strstr(exeName, ".") == NULL) {
     109                                strcat(exeName, ".EXE");
     110                        }
     111                }
     112                while(*win32cmdline == ' ') win32cmdline++; //skip spaces
     113
     114                cmdline = exeName + strlen(exeName) - 1;
     115                while(*cmdline == ' ') cmdline--;
     116                cmdline[1] = 0;
     117                if(DosQueryPathInfo(exeName, FIL_QUERYFULLNAME, (PVOID)fullpath, sizeof(fullpath)) == 0) {
     118                        strcpy(exeName, fullpath);
     119                }
     120        }
     121        else {//should never happen!
     122                DebugInt3();
     123                rc = DosLoadModule(exeName, sizeof(exeName), "PMWIN.DLL", &hmodPMWin);
     124                rc = DosQueryProcAddr(hmodPMWin, ORD_WIN32MESSAGEBOX, NULL, (PFN *)&MyWinMessageBox);
     125                MyWinMessageBox(HWND_DESKTOP, NULL, szDosInfoBlocks, szErrorTitle, 0, MB_OK | MB_ERROR | MB_MOVEABLE);
     126                goto fail;
     127        }
    85128        AllocateExeMem(exeName);
    86129  }
     
    109152        goto fail;
    110153  }
    111   rc = DosQueryProcAddr(hmodKernel32, 0, "_CreateWin32PeLdrExe@8", (PFN *)&CreateWin32Exe);
    112 
    113   strcpy(exeName, argv[1]);
    114   strupr(exeName);
    115   if(CreateWin32Exe(exeName, reservedMemory) == FALSE) {
     154  rc = DosQueryProcAddr(hmodKernel32, 0, "_CreateWin32PeLdrExe@12", (PFN *)&CreateWin32Exe);
     155
     156  if(CreateWin32Exe(exeName, win32cmdline, reservedMemory) == FALSE) {
    116157        goto fail;
    117158  }
     
    154195
    155196  strcpy(szFileName, filename);
    156   tmp = szFileName;
    157   while(*tmp != ' ' && *tmp != 0)
    158         tmp++;
    159   *tmp = 0;
    160 
    161   if(!strchr(szFileName, '.')) {
    162         strcat(szFileName,".EXE");
    163   }
     197
    164198  rc = DosOpen(szFileName, &dllfile, &action, 0, FILE_READONLY, OPEN_ACTION_OPEN_IF_EXISTS|OPEN_ACTION_FAIL_IF_NEW, OPEN_SHARE_DENYNONE|OPEN_ACCESS_READONLY, NULL);
    165199  if(rc != 0) {
Note: See TracChangeset for help on using the changeset viewer.