1
0
mirror of https://github.com/veracrypt/VeraCrypt.git synced 2025-11-11 19:08:26 -06:00

Windows: Better command line handling to make it more strict and robust. This avoids issues when using wrong syntax.

This commit is contained in:
Mounir IDRASSI
2015-04-26 15:57:43 +02:00
parent 9ccb8a97af
commit dc3bc64b86
4 changed files with 133 additions and 149 deletions

View File

@@ -130,109 +130,46 @@ int GetArgSepPosOffset (char *lpszArgument)
return 0; return 0;
} }
int GetArgumentID (argumentspec *as, char *lpszArgument, int *nArgPos) int GetArgumentID (argumentspec *as, char *lpszArgument)
{ {
char szTmp[MAX_PATH * 2];
int i; int i;
i = strlen (lpszArgument);
szTmp[i] = 0;
while (--i >= 0)
{
szTmp[i] = (char) tolower (lpszArgument[i]);
}
for (i = 0; i < as->arg_cnt; i++) for (i = 0; i < as->arg_cnt; i++)
{ {
size_t k; if (_stricmp (as->args[i].long_name, lpszArgument) == 0)
k = strlen (as->args[i].long_name);
if (memcmp (as->args[i].long_name, szTmp, k * sizeof (char)) == 0)
{ {
int x;
for (x = i + 1; x < as->arg_cnt; x++)
{
size_t m;
m = strlen (as->args[x].long_name);
if (memcmp (as->args[x].long_name, szTmp, m * sizeof (char)) == 0)
{
break;
}
}
if (x == as->arg_cnt)
{
if (strlen (lpszArgument) != k)
*nArgPos = k;
else
*nArgPos = 0;
return as->args[i].Id; return as->args[i].Id;
} }
} }
}
for (i = 0; i < as->arg_cnt; i++) for (i = 0; i < as->arg_cnt; i++)
{ {
size_t k;
if (as->args[i].short_name[0] == 0) if (as->args[i].short_name[0] == 0)
continue; continue;
k = strlen (as->args[i].short_name); if (_stricmp (as->args[i].short_name, lpszArgument) == 0)
if (memcmp (as->args[i].short_name, szTmp, k * sizeof (char)) == 0)
{ {
int x;
for (x = i + 1; x < as->arg_cnt; x++)
{
size_t m;
if (as->args[x].short_name[0] == 0)
continue;
m = strlen (as->args[x].short_name);
if (memcmp (as->args[x].short_name, szTmp, m * sizeof (char)) == 0)
{
break;
}
}
if (x == as->arg_cnt)
{
if (strlen (lpszArgument) != k)
*nArgPos = k;
else
*nArgPos = 0;
return as->args[i].Id; return as->args[i].Id;
} }
} }
}
return -1; return -1;
} }
int GetArgumentValue (char **lpszCommandLineArgs, int nArgPos, int *nArgIdx, int GetArgumentValue (char **lpszCommandLineArgs, int *nArgIdx,
int nNoCommandLineArgs, char *lpszValue, int nValueSize) int nNoCommandLineArgs, char *lpszValue, int nValueSize)
{ {
*lpszValue = 0; *lpszValue = 0;
if (nArgPos) if (*nArgIdx + 1 < nNoCommandLineArgs)
{
/* Handles the case of no space between parameter code and
value */
StringCbCopyA (lpszValue, nValueSize, &lpszCommandLineArgs[*nArgIdx][nArgPos]);
lpszValue[nValueSize - 1] = 0;
return HAS_ARGUMENT;
}
else if (*nArgIdx + 1 < nNoCommandLineArgs)
{ {
int x = GetArgSepPosOffset (lpszCommandLineArgs[*nArgIdx + 1]); int x = GetArgSepPosOffset (lpszCommandLineArgs[*nArgIdx + 1]);
if (x == 0) if (x == 0)
{ {
/* Handles the case of space between parameter code /* Handles the case of space between parameter code
and value */ and value */
StringCbCopyA (lpszValue, nValueSize, &lpszCommandLineArgs[*nArgIdx + 1][x]); StringCbCopyA (lpszValue, nValueSize, lpszCommandLineArgs[*nArgIdx + 1]);
lpszValue[nValueSize - 1] = 0; lpszValue[nValueSize - 1] = 0;
(*nArgIdx)++; (*nArgIdx)++;
return HAS_ARGUMENT; return HAS_ARGUMENT;

View File

@@ -33,8 +33,8 @@ typedef struct argumentspec_t
BOOL CALLBACK CommandHelpDlgProc ( HWND hwndDlg , UINT msg , WPARAM wParam , LPARAM lParam ); BOOL CALLBACK CommandHelpDlgProc ( HWND hwndDlg , UINT msg , WPARAM wParam , LPARAM lParam );
int Win32CommandLine ( char *lpszCommandLine , char ***lpszArgs ); int Win32CommandLine ( char *lpszCommandLine , char ***lpszArgs );
int GetArgSepPosOffset ( char *lpszArgument ); int GetArgSepPosOffset ( char *lpszArgument );
int GetArgumentID ( argumentspec *as , char *lpszArgument , int *nArgPos ); int GetArgumentID ( argumentspec *as , char *lpszArgument );
int GetArgumentValue ( char **lpszCommandLineArgs , int nArgPos , int *nArgIdx , int nNoCommandLineArgs , char *lpszValue , int nValueSize ); int GetArgumentValue ( char **lpszCommandLineArgs , int *nArgIdx , int nNoCommandLineArgs , char *lpszValue , int nValueSize );
#ifdef __cplusplus #ifdef __cplusplus
} }

View File

@@ -7831,7 +7831,6 @@ void ExtractCommandLine (HWND hwndDlg, char *lpszCommandLine)
{ {
OptionHistory, OptionHistory,
OptionNoIsoCheck, OptionNoIsoCheck,
OptionQuit,
OptionTokenLib, OptionTokenLib,
CommandResumeSysEncLogOn, CommandResumeSysEncLogOn,
CommandResumeSysEnc, CommandResumeSysEnc,
@@ -7848,7 +7847,6 @@ void ExtractCommandLine (HWND hwndDlg, char *lpszCommandLine)
{ {
{ OptionHistory, "/history", "/h", FALSE }, { OptionHistory, "/history", "/h", FALSE },
{ OptionNoIsoCheck, "/noisocheck", "/n", FALSE }, { OptionNoIsoCheck, "/noisocheck", "/n", FALSE },
{ OptionQuit, "/quit", "/q", FALSE },
{ OptionTokenLib, "/tokenlib", NULL, FALSE }, { OptionTokenLib, "/tokenlib", NULL, FALSE },
{ CommandResumeSysEncLogOn, "/acsysenc", "/a", TRUE }, { CommandResumeSysEncLogOn, "/acsysenc", "/a", TRUE },
@@ -7864,7 +7862,6 @@ void ExtractCommandLine (HWND hwndDlg, char *lpszCommandLine)
argumentspec as; argumentspec as;
int nArgPos;
int x; int x;
if (lpszCommandLineArgs[i] == NULL) if (lpszCommandLineArgs[i] == NULL)
@@ -7873,7 +7870,7 @@ void ExtractCommandLine (HWND hwndDlg, char *lpszCommandLine)
as.args = args; as.args = args;
as.arg_cnt = sizeof(args)/ sizeof(args[0]); as.arg_cnt = sizeof(args)/ sizeof(args[0]);
x = GetArgumentID (&as, lpszCommandLineArgs[i], &nArgPos); x = GetArgumentID (&as, lpszCommandLineArgs[i]);
switch (x) switch (x)
{ {
@@ -8004,39 +8001,35 @@ void ExtractCommandLine (HWND hwndDlg, char *lpszCommandLine)
case OptionHistory: case OptionHistory:
{ {
char szTmp[8]; char szTmp[8] = {0};
GetArgumentValue (lpszCommandLineArgs, nArgPos, &i, nNoCommandLineArgs, bHistory = bHistoryCmdLine = TRUE;
szTmp, sizeof (szTmp));
if (HAS_ARGUMENT == GetArgumentValue (lpszCommandLineArgs, &i, nNoCommandLineArgs,
szTmp, sizeof (szTmp)))
{
if (!_stricmp(szTmp,"y") || !_stricmp(szTmp,"yes")) if (!_stricmp(szTmp,"y") || !_stricmp(szTmp,"yes"))
{ {
bHistory = TRUE; bHistory = TRUE;
bHistoryCmdLine = TRUE;
} }
if (!_stricmp(szTmp,"n") || !_stricmp(szTmp,"no")) else if (!_stricmp(szTmp,"n") || !_stricmp(szTmp,"no"))
{ {
bHistory = FALSE; bHistory = FALSE;
bHistoryCmdLine = TRUE; }
else
AbortProcess ("COMMAND_LINE_ERROR");
} }
} }
break; break;
case OptionTokenLib: case OptionTokenLib:
if (GetArgumentValue (lpszCommandLineArgs, nArgPos, &i, nNoCommandLineArgs, SecurityTokenLibraryPath, sizeof (SecurityTokenLibraryPath)) == HAS_ARGUMENT) if (GetArgumentValue (lpszCommandLineArgs, &i, nNoCommandLineArgs, SecurityTokenLibraryPath, sizeof (SecurityTokenLibraryPath)) == HAS_ARGUMENT)
InitSecurityTokenLibrary(hwndDlg); InitSecurityTokenLibrary(hwndDlg);
else else
Error ("COMMAND_LINE_ERROR", hwndDlg); AbortProcess ("COMMAND_LINE_ERROR");
break; break;
case OptionQuit:
{
// Used to indicate non-install elevation
char szTmp[32];
GetArgumentValue (lpszCommandLineArgs, nArgPos, &i, nNoCommandLineArgs, szTmp, sizeof (szTmp));
}
break;
default: default:
DialogBoxParamW (hInst, MAKEINTRESOURCEW (IDD_COMMANDHELP_DLG), hwndDlg, (DLGPROC) DialogBoxParamW (hInst, MAKEINTRESOURCEW (IDD_COMMANDHELP_DLG), hwndDlg, (DLGPROC)
CommandHelpDlgProc, (LPARAM) &as); CommandHelpDlgProc, (LPARAM) &as);

View File

@@ -7156,20 +7156,18 @@ void ExtractCommandLine (HWND hwndDlg, char *lpszCommandLine)
argumentspec as; argumentspec as;
int nArgPos;
as.args = args; as.args = args;
as.arg_cnt = sizeof(args)/ sizeof(args[0]); as.arg_cnt = sizeof(args)/ sizeof(args[0]);
switch (GetArgumentID (&as, lpszCommandLineArgs[i], &nArgPos)) switch (GetArgumentID (&as, lpszCommandLineArgs[i]))
{ {
case OptionAuto: case OptionAuto:
{ {
char szTmp[32]; char szTmp[32] = {0};
bAuto = TRUE; bAuto = TRUE;
if (HAS_ARGUMENT == GetArgumentValue (lpszCommandLineArgs, if (HAS_ARGUMENT == GetArgumentValue (lpszCommandLineArgs,
nArgPos, &i, nNoCommandLineArgs, szTmp, sizeof (szTmp))) &i, nNoCommandLineArgs, szTmp, sizeof (szTmp)))
{ {
if (!_stricmp (szTmp, "devices")) if (!_stricmp (szTmp, "devices"))
bAutoMountDevices = TRUE; bAutoMountDevices = TRUE;
@@ -7177,6 +7175,8 @@ void ExtractCommandLine (HWND hwndDlg, char *lpszCommandLine)
bAutoMountFavorites = TRUE; bAutoMountFavorites = TRUE;
else if (!_stricmp (szTmp, "logon")) else if (!_stricmp (szTmp, "logon"))
LogOn = TRUE; LogOn = TRUE;
else
AbortProcess ("COMMAND_LINE_ERROR");
} }
} }
break; break;
@@ -7187,22 +7187,39 @@ void ExtractCommandLine (HWND hwndDlg, char *lpszCommandLine)
case OptionCache: case OptionCache:
{ {
char szTmp[8]; char szTmp[8] = {0};
bCacheInDriver = TRUE; bCacheInDriver = TRUE;
GetArgumentValue (lpszCommandLineArgs, nArgPos, &i, nNoCommandLineArgs, if (HAS_ARGUMENT == GetArgumentValue (lpszCommandLineArgs, &i, nNoCommandLineArgs,
szTmp, sizeof (szTmp)); szTmp, sizeof (szTmp)))
{
if (!_stricmp(szTmp,"n") || !_stricmp(szTmp,"no")) if (!_stricmp(szTmp,"n") || !_stricmp(szTmp,"no"))
bCacheInDriver = FALSE; bCacheInDriver = FALSE;
else if (!_stricmp(szTmp,"y") || !_stricmp(szTmp,"yes"))
bCacheInDriver = FALSE;
else
AbortProcess ("COMMAND_LINE_ERROR");
}
} }
break; break;
case CommandDismount: case CommandDismount:
if (HAS_ARGUMENT == GetArgumentValue (lpszCommandLineArgs, nArgPos, &i, nNoCommandLineArgs, if (HAS_ARGUMENT == GetArgumentValue (lpszCommandLineArgs, &i, nNoCommandLineArgs,
szDriveLetter, sizeof (szDriveLetter))) szDriveLetter, sizeof (szDriveLetter)))
{
if ( (strlen(szDriveLetter) == 1)
|| (strlen(szDriveLetter) == 2 && szDriveLetter[1] == ':')
)
{
cmdUnmountDrive = toupper(szDriveLetter[0]) - 'A'; cmdUnmountDrive = toupper(szDriveLetter[0]) - 'A';
if ((cmdUnmountDrive < 0) || (cmdUnmountDrive > ('Z' - 'A')))
AbortProcess ("BAD_DRIVE_LETTER");
}
else
AbortProcess ("BAD_DRIVE_LETTER");
}
else else
cmdUnmountDrive = -1; cmdUnmountDrive = -1;
@@ -7218,7 +7235,7 @@ void ExtractCommandLine (HWND hwndDlg, char *lpszCommandLine)
break; break;
case OptionKeyfile: case OptionKeyfile:
if (HAS_ARGUMENT == GetArgumentValue (lpszCommandLineArgs, nArgPos, &i, if (HAS_ARGUMENT == GetArgumentValue (lpszCommandLineArgs, &i,
nNoCommandLineArgs, tmpPath, sizeof (tmpPath))) nNoCommandLineArgs, tmpPath, sizeof (tmpPath)))
{ {
KeyFile *kf; KeyFile *kf;
@@ -7230,97 +7247,130 @@ void ExtractCommandLine (HWND hwndDlg, char *lpszCommandLine)
FirstCmdKeyFile = KeyFileAdd (FirstCmdKeyFile, kf); FirstCmdKeyFile = KeyFileAdd (FirstCmdKeyFile, kf);
} }
} }
else
AbortProcess ("COMMAND_LINE_ERROR");
break; break;
case OptionLetter: case OptionLetter:
GetArgumentValue (lpszCommandLineArgs, nArgPos, &i, nNoCommandLineArgs, if (HAS_ARGUMENT == GetArgumentValue (lpszCommandLineArgs, &i, nNoCommandLineArgs,
szDriveLetter, sizeof (szDriveLetter)); szDriveLetter, sizeof (szDriveLetter)))
{
if ( (strlen(szDriveLetter) == 1)
|| (strlen(szDriveLetter) == 2 && szDriveLetter[1] == ':')
)
{
commandLineDrive = *szDriveLetter = (char) toupper (*szDriveLetter); commandLineDrive = *szDriveLetter = (char) toupper (*szDriveLetter);
if (commandLineDrive < 'C' || commandLineDrive > 'Z') if (commandLineDrive < 'C' || commandLineDrive > 'Z')
AbortProcess ("BAD_DRIVE_LETTER"); AbortProcess ("BAD_DRIVE_LETTER");
}
else
AbortProcess ("BAD_DRIVE_LETTER");
}
else
AbortProcess ("BAD_DRIVE_LETTER");
break; break;
case OptionHistory: case OptionHistory:
{ {
char szTmp[8]; char szTmp[8] = {0};
bHistory = bHistoryCmdLine = TRUE; bHistory = bHistoryCmdLine = TRUE;
GetArgumentValue (lpszCommandLineArgs, nArgPos, &i, nNoCommandLineArgs, if (HAS_ARGUMENT == GetArgumentValue (lpszCommandLineArgs, &i, nNoCommandLineArgs,
szTmp, sizeof (szTmp)); szTmp, sizeof (szTmp)))
{
if (!_stricmp(szTmp,"n") || !_stricmp(szTmp,"no")) if (!_stricmp(szTmp,"n") || !_stricmp(szTmp,"no"))
bHistory = FALSE; bHistory = FALSE;
else if (!_stricmp(szTmp,"y") || !_stricmp(szTmp,"yes"))
bHistory = TRUE;
else
AbortProcess ("COMMAND_LINE_ERROR");
}
} }
break; break;
case OptionMountOption: case OptionMountOption:
{ {
char szTmp[16]; char szTmp[16] = {0};
if (HAS_ARGUMENT == GetArgumentValue (lpszCommandLineArgs, if (HAS_ARGUMENT == GetArgumentValue (lpszCommandLineArgs,
nArgPos, &i, nNoCommandLineArgs, szTmp, sizeof (szTmp))) &i, nNoCommandLineArgs, szTmp, sizeof (szTmp)))
{ {
if (!_stricmp (szTmp, "ro") || !_stricmp (szTmp, "readonly")) if (!_stricmp (szTmp, "ro") || !_stricmp (szTmp, "readonly"))
mountOptions.ReadOnly = TRUE; mountOptions.ReadOnly = TRUE;
if (!_stricmp (szTmp, "rm") || !_stricmp (szTmp, "removable")) else if (!_stricmp (szTmp, "rm") || !_stricmp (szTmp, "removable"))
mountOptions.Removable = TRUE; mountOptions.Removable = TRUE;
if (!_stricmp (szTmp, "ts") || !_stricmp (szTmp, "timestamp")) else if (!_stricmp (szTmp, "ts") || !_stricmp (szTmp, "timestamp"))
mountOptions.PreserveTimestamp = FALSE; mountOptions.PreserveTimestamp = FALSE;
if (!_stricmp (szTmp, "sm") || !_stricmp (szTmp, "system")) else if (!_stricmp (szTmp, "sm") || !_stricmp (szTmp, "system"))
mountOptions.PartitionInInactiveSysEncScope = bPrebootPasswordDlgMode = TRUE; mountOptions.PartitionInInactiveSysEncScope = bPrebootPasswordDlgMode = TRUE;
if (!_stricmp (szTmp, "bk") || !_stricmp (szTmp, "headerbak")) else if (!_stricmp (szTmp, "bk") || !_stricmp (szTmp, "headerbak"))
mountOptions.UseBackupHeader = TRUE; mountOptions.UseBackupHeader = TRUE;
if (!_stricmp (szTmp, "recovery")) else if (!_stricmp (szTmp, "recovery"))
mountOptions.RecoveryMode = TRUE; mountOptions.RecoveryMode = TRUE;
else
AbortProcess ("COMMAND_LINE_ERROR");
CmdMountOptions = mountOptions; CmdMountOptions = mountOptions;
CmdMountOptionsValid = TRUE; CmdMountOptionsValid = TRUE;
} }
else
AbortProcess ("COMMAND_LINE_ERROR");
} }
break; break;
case OptionPassword: case OptionPassword:
GetArgumentValue (lpszCommandLineArgs, nArgPos, &i, nNoCommandLineArgs, if (HAS_ARGUMENT == GetArgumentValue (lpszCommandLineArgs, &i, nNoCommandLineArgs,
(char *) CmdVolumePassword.Text, sizeof (CmdVolumePassword.Text)); (char *) CmdVolumePassword.Text, sizeof (CmdVolumePassword.Text)))
{
CmdVolumePassword.Length = strlen ((char *) CmdVolumePassword.Text); CmdVolumePassword.Length = strlen ((char *) CmdVolumePassword.Text);
CmdVolumePasswordValid = TRUE; CmdVolumePasswordValid = TRUE;
}
else
AbortProcess ("COMMAND_LINE_ERROR");
break; break;
case OptionVolume: case OptionVolume:
if (HAS_ARGUMENT == GetArgumentValue (lpszCommandLineArgs, nArgPos, &i, if (HAS_ARGUMENT == GetArgumentValue (lpszCommandLineArgs, &i,
nNoCommandLineArgs, szFileName, sizeof (szFileName))) nNoCommandLineArgs, szFileName, sizeof (szFileName)))
{ {
RelativePath2Absolute (szFileName); RelativePath2Absolute (szFileName);
AddComboItem (GetDlgItem (hwndDlg, IDC_VOLUME), szFileName, bHistory); AddComboItem (GetDlgItem (hwndDlg, IDC_VOLUME), szFileName, bHistory);
CmdLineVolumeSpecified = TRUE; CmdLineVolumeSpecified = TRUE;
} }
else
AbortProcess ("COMMAND_LINE_ERROR");
break; break;
case OptionQuit: case OptionQuit:
{ {
char szTmp[32]; char szTmp[32] = {0};
if (HAS_ARGUMENT == GetArgumentValue (lpszCommandLineArgs, if (HAS_ARGUMENT == GetArgumentValue (lpszCommandLineArgs,
nArgPos, &i, nNoCommandLineArgs, szTmp, sizeof (szTmp))) &i, nNoCommandLineArgs, szTmp, sizeof (szTmp)))
{ {
if (!_stricmp (szTmp, "UAC")) // Used to indicate non-install elevation if (!_stricmp (szTmp, "UAC")) // Used to indicate non-install elevation
break; break;
if (!_stricmp (szTmp, "preferences")) else if (!_stricmp (szTmp, "preferences"))
{ {
Quit = TRUE; Quit = TRUE;
UsePreferences = TRUE; UsePreferences = TRUE;
break; break;
} }
if (!_stricmp (szTmp, "background")) else if (!_stricmp (szTmp, "background"))
bEnableBkgTask = TRUE; bEnableBkgTask = TRUE;
else
AbortProcess ("COMMAND_LINE_ERROR");
} }
Quit = TRUE; Quit = TRUE;
@@ -7333,10 +7383,10 @@ void ExtractCommandLine (HWND hwndDlg, char *lpszCommandLine)
break; break;
case OptionTokenLib: case OptionTokenLib:
if (GetArgumentValue (lpszCommandLineArgs, nArgPos, &i, nNoCommandLineArgs, SecurityTokenLibraryPath, sizeof (SecurityTokenLibraryPath)) == HAS_ARGUMENT) if (GetArgumentValue (lpszCommandLineArgs, &i, nNoCommandLineArgs, SecurityTokenLibraryPath, sizeof (SecurityTokenLibraryPath)) == HAS_ARGUMENT)
InitSecurityTokenLibrary(hwndDlg); InitSecurityTokenLibrary(hwndDlg);
else else
Error ("COMMAND_LINE_ERROR", hwndDlg); AbortProcess ("COMMAND_LINE_ERROR");
break; break;
@@ -7352,9 +7402,9 @@ void ExtractCommandLine (HWND hwndDlg, char *lpszCommandLine)
case OptionPkcs5: case OptionPkcs5:
{ {
char szTmp[32]; char szTmp[32] = {0};
if (HAS_ARGUMENT == GetArgumentValue (lpszCommandLineArgs, if (HAS_ARGUMENT == GetArgumentValue (lpszCommandLineArgs,
nArgPos, &i, nNoCommandLineArgs, szTmp, sizeof (szTmp))) &i, nNoCommandLineArgs, szTmp, sizeof (szTmp)))
{ {
if (_stricmp(szTmp, "sha512") == 0 || _stricmp(szTmp, "sha-512") == 0) if (_stricmp(szTmp, "sha512") == 0 || _stricmp(szTmp, "sha-512") == 0)
CmdVolumePkcs5 = SHA512; CmdVolumePkcs5 = SHA512;
@@ -7367,28 +7417,32 @@ void ExtractCommandLine (HWND hwndDlg, char *lpszCommandLine)
else else
{ {
CmdVolumePkcs5 = 0; CmdVolumePkcs5 = 0;
Error ("COMMAND_LINE_ERROR", hwndDlg); AbortProcess ("COMMAND_LINE_ERROR");
} }
} }
else else
Error ("COMMAND_LINE_ERROR", hwndDlg); AbortProcess ("COMMAND_LINE_ERROR");
} }
break; break;
case OptionTrueCryptMode: case OptionTrueCryptMode:
CmdVolumeTrueCryptMode = TRUE; CmdVolumeTrueCryptMode = TRUE;
break; break;
// no option = file name // no option = file name if there is only one argument
default: default:
{
if (nNoCommandLineArgs == 1)
{ {
strcpy_s (szFileName, array_capacity (szFileName), lpszCommandLineArgs[i]); strcpy_s (szFileName, array_capacity (szFileName), lpszCommandLineArgs[i]);
RelativePath2Absolute (szFileName); RelativePath2Absolute (szFileName);
if (nNoCommandLineArgs == 1)
CmdLineVolumeSpecified = TRUE; CmdLineVolumeSpecified = TRUE;
AddComboItem (GetDlgItem (hwndDlg, IDC_VOLUME), szFileName, bHistory); AddComboItem (GetDlgItem (hwndDlg, IDC_VOLUME), szFileName, bHistory);
} }
else
AbortProcess ("COMMAND_LINE_ERROR");
}
} }
} }
} }