//*************************************************************************** // // 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); } } }