113 lines
3.4 KiB
C++
113 lines
3.4 KiB
C++
|
//***************************************************************************
|
||
|
|
||
|
//
|
||
|
|
||
|
// Copyright (c) 1997-2001 Microsoft Corporation, All Rights Reserved
|
||
|
//
|
||
|
// RunDll.cpp
|
||
|
//
|
||
|
// Purpose: Allow framework to be used to run a command
|
||
|
//
|
||
|
//***************************************************************************
|
||
|
|
||
|
#include "precomp.h"
|
||
|
|
||
|
// This routine is meant to be called from RUNDLL32.EXE
|
||
|
extern "C" {
|
||
|
__declspec(dllexport) VOID CALLBACK
|
||
|
DoCmd(HWND hwnd, HINSTANCE hinst, LPSTR lpszCmdLine, int nCmdShow)
|
||
|
{
|
||
|
|
||
|
DWORD dwRet = WBEM_E_OUT_OF_MEMORY;
|
||
|
BOOL bRet = FALSE;
|
||
|
char *pBuff = (char *)calloc(strlen(lpszCmdLine) + 1, sizeof(char));
|
||
|
|
||
|
if (pBuff)
|
||
|
{
|
||
|
dwRet = WBEM_E_FAILED;
|
||
|
|
||
|
try
|
||
|
{
|
||
|
// Parse the passed in command line to figure out what command we
|
||
|
// are being asked to run.
|
||
|
sscanf(lpszCmdLine, "%s ", pBuff);
|
||
|
|
||
|
dwRet = ERROR_INVALID_FUNCTION;
|
||
|
|
||
|
// Find out which command
|
||
|
if (_stricmp(pBuff, "ExitWindowsEx") == 0)
|
||
|
{
|
||
|
// Parse out the parameters for this command
|
||
|
DWORD dwFlags, dwReserved;
|
||
|
if (sscanf(lpszCmdLine, "%s %d %d ", pBuff, &dwFlags, &dwReserved) == 3)
|
||
|
{
|
||
|
// Clear the error (it appears ExitWindowsEx doesn't always clear old data)
|
||
|
SetLastError(0);
|
||
|
|
||
|
bRet = ExitWindowsEx(dwFlags, dwReserved);
|
||
|
dwRet = GetLastError();
|
||
|
}
|
||
|
}
|
||
|
else if (_stricmp(pBuff, "InitiateSystemShutdown") == 0)
|
||
|
{
|
||
|
// Parse out the parameters for this command
|
||
|
DWORD dwFlags, dwReserved;
|
||
|
bool bRebootAfterShutdown = false;
|
||
|
bool bForceShutDown = false;
|
||
|
|
||
|
if (sscanf(lpszCmdLine, "%s %d %d ", pBuff, &dwFlags, &dwReserved) == 3)
|
||
|
{
|
||
|
// Clear the error (it appears ExitWindowsEx doesn't always clear old data)
|
||
|
SetLastError(0);
|
||
|
|
||
|
if(dwFlags & EWX_REBOOT)
|
||
|
{
|
||
|
bRebootAfterShutdown = true;
|
||
|
}
|
||
|
if( dwFlags & EWX_FORCE)
|
||
|
{
|
||
|
bForceShutDown = true;
|
||
|
}
|
||
|
|
||
|
WCHAR wstrComputerName[MAX_COMPUTERNAME_LENGTH + 1] = { '\0' };
|
||
|
DWORD dwSize;
|
||
|
|
||
|
if(::GetComputerName(wstrComputerName, &dwSize))
|
||
|
{
|
||
|
|
||
|
bRet = InitiateSystemShutdown(
|
||
|
wstrComputerName,
|
||
|
NULL,
|
||
|
0 /* dwTimeout */,
|
||
|
(bForceShutDown)? TRUE:FALSE,
|
||
|
(bRebootAfterShutdown)? TRUE:FALSE );
|
||
|
|
||
|
dwRet = GetLastError();
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
dwRet = GetLastError();
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
catch ( ... )
|
||
|
{
|
||
|
free(pBuff);
|
||
|
}
|
||
|
|
||
|
free(pBuff);
|
||
|
}
|
||
|
|
||
|
// NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE
|
||
|
//
|
||
|
// We are aborting out at this point, since RunDLL32 in its finite wisdom doesn't allow
|
||
|
// for the setting of the dos error level (who designs this stuff?).
|
||
|
if (!bRet)
|
||
|
{
|
||
|
ExitProcess(dwRet);
|
||
|
}
|
||
|
|
||
|
}
|
||
|
}
|