summaryrefslogtreecommitdiffstats
path: root/private/mvdm/dos/command/cmdpif.c
diff options
context:
space:
mode:
Diffstat (limited to 'private/mvdm/dos/command/cmdpif.c')
-rw-r--r--private/mvdm/dos/command/cmdpif.c289
1 files changed, 289 insertions, 0 deletions
diff --git a/private/mvdm/dos/command/cmdpif.c b/private/mvdm/dos/command/cmdpif.c
new file mode 100644
index 000000000..5fa2c2190
--- /dev/null
+++ b/private/mvdm/dos/command/cmdpif.c
@@ -0,0 +1,289 @@
+/* cmdpif.c - PIF Handling Routines For SCS
+ *
+ *
+ * Modification History:
+ *
+ * Sudeepb 19-Aug-1992 Created
+ * williamh 10-Nov-1992 (1). get params from w386 extention if exist
+ * (2). null terminate caption
+ * williamh 27-May-1993 almost rewrote for better pif support
+ */
+
+#include "cmd.h"
+#include <ctype.h>
+#include <pif.h>
+#include <cmdsvc.h>
+#include <softpc.h>
+#include <mvdm.h>
+#include <oemuni.h>
+#include "nt_pif.h"
+
+VOID cmdCheckForPIF (PVDMINFO pvi)
+{
+PCHAR pCmdLine = pvi->CmdLine;
+PCHAR pDot;
+ULONG size;
+UCHAR ch;
+DWORD dw;
+CHAR lpszEnvDir [] = "=?:";
+CHAR FullPathName[MAX_PATH + 1];
+CHAR * pFilePart;
+BOOL IsPIFFile, IsFromForceDos;
+CHAR AppFullPathName[MAX_PATH + 1];
+
+ //
+ // Advance CmdLine pointer to beg of command tail
+ //
+ while (*pCmdLine && !isgraph(*pCmdLine)) { // skip to first nonwhite
+ pCmdLine++;
+ }
+
+ pDot = strrchr(pvi->AppName, '.');
+ if (pDot)
+ IsPIFFile = pDot && !_strnicmp(pDot, ".pif", 4);
+ else
+ IsPIFFile = FALSE;
+
+
+ // if the command is not a pif file and it is not
+ // running on a new console
+ if (!IsPIFFile && !DosSessionId)
+ goto CleanUpAndReturn;
+
+ if (IsPIFFile) {
+ if (!IsFirstVDM) {
+ //
+ // Get the pif data. If no pif data, or not from forcedos
+ // just return -- command.com will receive the pif file
+ // name and fail.
+ //
+ pfdata.AppHasPIFFile =
+ pfdata.IgnoreStartDirInPIF =
+ pfdata.IgnoreTitleInPIF =
+ pfdata.IgnoreCmdLineInPIF =
+ pfdata.IgnoreConfigAutoexec = 1;
+ if (!GetPIFData(&pfdata, pvi->AppName))
+ goto CleanUpAndReturn;
+ }
+
+ // we only run a pif file on two occasions:
+ // (1). it is from a new console
+ // (2). it is from forcedos.
+ if (!DosSessionId && pfdata.SubSysId != SUBSYS_DOS)
+ goto CleanUpAndReturn;
+
+ }
+ if (IsFirstVDM) {
+ // if this is the first vdm, take cmdline, startupdir and title
+ // if they are there
+ if (pfdata.StartDir){
+ dw = cmdExpandEnvironmentStrings(NULL,
+ pfdata.StartDir,
+ FullPathName,
+ MAX_PATH + 1
+ );
+ if (dw != 0 && dw <= MAX_PATH) {
+ dw = GetFullPathNameOem(FullPathName,
+ MAX_PATH + 1,
+ pfdata.StartDir,
+ &pFilePart
+ );
+ }
+
+ if (dw != 0 && dw <= MAX_PATH)
+ dw = GetFileAttributesOem(pfdata.StartDir);
+ else
+ dw = 0;
+
+ if (dw == 0 || dw == 0xFFFFFFFF || !(dw & FILE_ATTRIBUTE_DIRECTORY))
+ {
+ RcMessageBox(EG_PIF_STARTDIR_ERR,
+ NULL,
+ NULL,
+ RMB_ICON_BANG | RMB_ABORT);
+ goto CleanUpAndReturn;
+ }
+
+ dw = GetShortPathNameOem(pfdata.StartDir,
+ pfdata.StartDir,
+ MAX_PATH + 1
+ );
+ if (dw == 0 || dw > MAX_PATH || dw > 64) {
+ RcMessageBox(EG_PIF_STARTDIR_ERR,
+ NULL,
+ NULL,
+ RMB_ICON_BANG | RMB_ABORT);
+ goto CleanUpAndReturn;
+ }
+
+ lpszEnvDir[1] = pfdata.StartDir[0];
+ SetEnvironmentVariableOem(lpszEnvDir, pfdata.StartDir);
+ SetCurrentDirectoryOem(pfdata.StartDir);
+ pvi->CurDrive = toupper(pfdata.StartDir[0]) - 'A';
+ }
+
+ if (pfdata.WinTitle) {
+ strcpy(FullPathName, pfdata.WinTitle);
+ dw = cmdExpandEnvironmentStrings(NULL,
+ FullPathName,
+ pfdata.WinTitle,
+ MAX_PATH + 1
+ );
+ pfdata.WinTitle[MAX_PATH] = '\0';
+ }
+
+ if (!*pCmdLine && pfdata.CmdLine) {
+
+ // if the optinal parameter is '?'
+ // prompt the user
+ pDot = pfdata.CmdLine;
+ while (*pDot && *pDot <= ' ')
+ pDot++;
+
+ if (*pDot == '?') {
+ pfdata.CmdLine[0] = '\0';
+ RcMessageBox(EG_PIF_ASK_CMDLINE,
+ NULL,
+ pfdata.CmdLine,
+ RMB_EDIT | RMB_ICON_INFO | (128 << 16)
+ );
+ }
+
+ if (*pfdata.CmdLine) {
+ strcpy(FullPathName, pfdata.CmdLine);
+ dw = cmdExpandEnvironmentStrings(NULL,
+ FullPathName,
+ pfdata.CmdLine,
+ MAX_PATH + 1
+ );
+ }
+ }
+ }
+
+
+ if(IsPIFFile) {
+ dw = cmdExpandEnvironmentStrings(NULL,
+ pfdata.StartFile,
+ FullPathName,
+ MAX_PATH + 1
+ );
+ if (!dw || dw > MAX_PATH) {
+ RcMessageBox(EG_PIF_STARTFILE_ERR,
+ NULL, NULL, RMB_ICON_BANG | RMB_ABORT);
+ goto CleanUpAndReturn;
+ }
+
+
+
+ // search from the current directory
+ // note that the startup directory specified in
+ // the pif file has been set as our current directory
+ // when we got here
+ dw = SearchPathOem(".",
+ FullPathName,
+ NULL,
+ MAX_PATH + 1,
+ AppFullPathName,
+ &pFilePart
+ );
+ // if couldn't find the file from the current dir
+ // ask win32api help
+ if (dw == 0 || dw > MAX_PATH) {
+ dw = SearchPathOem(NULL,
+ FullPathName,
+ NULL,
+ MAX_PATH + 1,
+ AppFullPathName,
+ &pFilePart
+ );
+ }
+
+ // couldn't find the file, give up
+ if (dw == 0 || dw > MAX_PATH) {
+ RcMessageBox(EG_PIF_STARTFILE_ERR,
+ NULL, NULL, RMB_ICON_BANG | RMB_ABORT);
+ goto CleanUpAndReturn;
+ }
+
+ dw = GetFileAttributesOem(AppFullPathName);
+ if (dw == (DWORD)(-1) || (dw & FILE_ATTRIBUTE_DIRECTORY)) {
+ RcMessageBox(EG_PIF_STARTFILE_ERR, NULL, NULL,
+ RMB_ICON_BANG | RMB_ABORT
+ );
+ goto CleanUpAndReturn;
+ }
+
+ // convert to shortfilename
+ dw = GetShortPathNameOem(AppFullPathName, pvi->AppName,
+ MAX_PATH + 1);
+ if (dw == 0 || dw > MAX_PATH) {
+
+ RcMessageBox(EG_PIF_STARTFILE_ERR, NULL, NULL,
+ RMB_ICON_BANG | RMB_ABORT
+ );
+ goto CleanUpAndReturn;
+ }
+ // update the application path name length(including the terminate NULL)
+ pvi->AppLen = strlen(pvi->AppName) + 1;
+
+ // pvi->AppName contains the application short name.
+ // verify that it has the correct extension(.EXE, .COM or .BAT).
+ pDot = (PCHAR)pvi->AppName + pvi->AppLen - 5;
+ if (pvi->AppLen < 5 ||
+ (_strnicmp(pDot, EXE_EXTENTION_STRING, EXTENTION_STRING_LEN) &&
+ _strnicmp(pDot, COM_EXTENTION_STRING, EXTENTION_STRING_LEN) &&
+ _strnicmp(pDot, BAT_EXTENTION_STRING, EXTENTION_STRING_LEN)))
+ {
+
+ RcMessageBox(EG_DOS_PROG_EXTENSION,AppFullPathName, NULL, RMB_ICON_BANG | RMB_ABORT);
+ goto CleanUpAndReturn;
+
+ }
+ }
+
+
+ //
+ // Copy in pif command tail if original command tail is empty
+ //
+ if (!*pCmdLine && pfdata.CmdLine) {
+ strcpy(FullPathName, pfdata.CmdLine);
+ strcat(FullPathName, "\x0d\x0a");
+ if (strlen(FullPathName) >= 128 - 13) {
+ // too bad, the command line is too long
+ RcMessageBox(EG_PIF_CMDLINE_ERR,NULL,NULL,RMB_ICON_BANG | RMB_ABORT);
+ goto CleanUpAndReturn;
+
+ }
+ strcpy(pvi->CmdLine, FullPathName);
+ pvi->CmdSize = strlen(FullPathName) + 1;
+ }
+
+ if (IsPIFFile)
+ // we don't know the binary type at this point.
+ *pIsDosBinary = 0;
+
+ if (pfdata.WinTitle)
+ SetConsoleTitle(pfdata.WinTitle);
+
+ DontCheckDosBinaryType = (pfdata.SubSysId == SUBSYS_DOS);
+
+CleanUpAndReturn:
+ if (pfdata.CmdLine) {
+ free(pfdata.CmdLine);
+ pfdata.CmdLine = NULL;
+ }
+ if (pfdata.StartDir) {
+ free(pfdata.StartDir);
+ pfdata.StartDir = NULL;
+ }
+ if (pfdata.StartFile) {
+ free(pfdata.StartFile);
+ pfdata.StartFile = NULL;
+ }
+ if (pfdata.WinTitle) {
+ free(pfdata.WinTitle);
+ pfdata.WinTitle = NULL;
+ }
+ return;
+
+}