Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

133 lines
4.6 KiB

#include <precomp.h>
#include "ErrCtrl.h"
#include "PrmDescr.h"
#include "utils.h"
//-------------------------------------------------------
// Parser code for the command line parameters.
// Parameters:
// [IN] nArgc: number of command line parameters
// [IN] pwszArgv: array of pointers to the command line parameteres
// [OUT] pnErrArgi: index to the faulty parameter (in case of error)
// Returns:
// ERROR_SUCCESS in case everything went fine
// any win32 error in case of failure. On error, pnErrArgi indicates
// the faulty parameter.
DWORD
WZCToolParse(UINT nPrmC, LPWSTR *pwszPrmV, UINT *pnErrPrmI)
{
DWORD dwErr = ERROR_SUCCESS;
UINT nPrmI = 0;
for (nPrmI = 0; dwErr == ERROR_SUCCESS && nPrmI < nPrmC; nPrmI++)
{
LPWSTR pArg;
PHASH_NODE pPrmNode;
PPARAM_DESCR pPrmDescr;
// get the pointer to the parameter's argument, if any
pArg = wcschr(pwszPrmV[nPrmI], L'=');
if (pArg != NULL)
*pArg = L'\0';
// get the hash node for the parameter, if it is present in the hash
pPrmNode = NULL;
dwErr = HshQueryObjectRef(
g_PDHash.pRoot,
pwszPrmV[nPrmI],
&pPrmNode);
// restore the '=' in the parameter string
if (pArg != NULL)
{
*pArg = L'=';
pArg++;
}
// if the parameter is valid (found in the hash)
if (dwErr == ERROR_SUCCESS)
{
// get the pointer to the parameter descriptor
pPrmDescr = (PPARAM_DESCR)pPrmNode->pObject;
// check if this is not a duplicated parameter
if (g_PDData.dwExistingParams & pPrmDescr->nParamID)
// if it is, set the error
dwErr = ERROR_DUPLICATE_TAG;
else
{
// else mark the parameter does exist now
g_PDData.dwExistingParams |= pPrmDescr->nParamID;
// if this is a command parameter and one has been found already,
// only accepts one command per call.
if (pPrmDescr->pfnCommand != NULL && g_PDData.pfnCommand != NULL)
dwErr = ERROR_INVALID_FUNCTION;
}
}
// if everything is ok so far and this param has an argument..
if (dwErr == ERROR_SUCCESS && pArg != NULL)
{
// ..if the param does not support arguments..
if (pPrmDescr->pfnArgParser == NULL)
// set the error
dwErr = ERROR_NOT_SUPPORTED;
else
// otherwise have the param to parse its argument.
dwErr = pPrmDescr->pfnArgParser(&g_PDData, pPrmDescr, pArg);
}
// if the parameter is entirely successful parsing its argument (if any) and is a
// command parameter (it is the first) encountered, save its command handler
if (dwErr == ERROR_SUCCESS && pPrmDescr->pfnCommand != NULL)
g_PDData.pfnCommand = pPrmDescr->pfnCommand;
}
if (dwErr != ERROR_SUCCESS && pnErrPrmI != NULL)
*pnErrPrmI = nPrmI;
return dwErr;
}
void _cdecl main()
{
LPWSTR *pwszPrmV = NULL;
UINT nPrmC = 0;
UINT nErrPrmI;
DWORD dwErr;
// get OS version
g_verInfoEx.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);
if (!GetVersionEx((LPOSVERSIONINFO)&g_verInfoEx))
_Asrt(FALSE, L"Error %d determining the OS version\n", GetLastError());
// get the command line in WCHAR
pwszPrmV = CommandLineToArgvW(GetCommandLineW(), &nPrmC);
_Asrt(nPrmC >= 2, L"Invalid parameters count (%d)\n", nPrmC);
_Asrt(pwszPrmV != NULL, L"Invalid parameters array (%p)\n", pwszPrmV);
// initialize and fill in the parameter's list,
// initialize the parameter descriptor data
dwErr = PDInitialize();
_Asrt(dwErr == ERROR_SUCCESS, L"Unexpected error (%d) in param hash initialization.\n", dwErr);
// scan command line parameters
dwErr = WZCToolParse(nPrmC-1, pwszPrmV+1, &nErrPrmI);
_Asrt(dwErr == ERROR_SUCCESS, L"Error %d encountered while parsing parameter \"%s\"\n",
dwErr,
dwErr != ERROR_SUCCESS ? pwszPrmV[nErrPrmI] : NULL);
_Asrt(g_PDData.pfnCommand != NULL,
L"Noop: No action parameter provided.\n");
dwErr = g_PDData.pfnCommand(&g_PDData);
_Asrt(dwErr == ERROR_SUCCESS,L"Error %d encountered while executing the command.\n",dwErr);
// cleanout whatever resources we might have had allocated
PDDestroy();
// set the %errorlevel% environment variable
exit(dwErr);
}