|
|
#include <windows.h>
#include <stdio.h>
#include "rc_ids.h"
//
// This app is a very simple wrapper for autoplay functionality
// for x86. It invokes winnt.exe on Win95 and winnt32.exe on NT.
//
#define SUCCESS 0
#define FAILURE 1
VOID Error( IN UINT Id, IN PCSTR Parameter OPTIONAL ) { CHAR String[1024]; CHAR Message[4096];
LoadString( GetModuleHandle(NULL), Id, String, sizeof(String) );
if(Parameter) { _snprintf(Message,sizeof(Message),String,Parameter); } else { lstrcpy(Message,String); }
MessageBox(NULL,Message,NULL,MB_ICONERROR|MB_OK|MB_SYSTEMMODAL); }
int __cdecl main( VOID ) { PCSTR CmdLine; CHAR cmdLine[4096]; PCSTR CmdLineTail; unsigned TailOffset; CHAR ModuleName[MAX_PATH]; PCHAR p; OSVERSIONINFO VersionInfo; BOOL b; STARTUPINFO StartupInfo; PROCESS_INFORMATION ProcessInfo;
//
// Form name of app we want to invoke.
//
GetModuleFileName(GetModuleHandle(NULL),ModuleName,MAX_PATH); CharUpper(ModuleName); p = strstr(ModuleName,"\\_WINNT.EXE"); if(!p) { Error(INVALID_MODNAME,ModuleName); return(FAILURE); } *(++p) = 0;
VersionInfo.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); if(!GetVersionEx(&VersionInfo)) { Error(GETVER_FAILED,NULL); return(FAILURE); }
lstrcpy( p, (VersionInfo.dwPlatformId == VER_PLATFORM_WIN32_NT) ? "WINNT32.EXE" : "WINNT.EXE" );
//
// Get the command line. We will assume that this app is in
// some subdirectory, probably \i386, on the CD, and that it is
// called _winnt.exe.
//
CmdLine = GetCommandLine();
//
// Uppercase the command line so we can locate the command tail.
//
lstrcpyn(cmdLine,CmdLine,sizeof(cmdLine)); CharUpper(cmdLine);
CmdLineTail = strstr(cmdLine,"\\_WINNT"); if(CmdLineTail == NULL) { Error(INVALID_CMDLINE,CmdLine); return(FAILURE); }
CmdLineTail += sizeof("\\_WINNT") - 1;
if(*CmdLineTail == '\"') { CmdLineTail++; } else {
//
// The next characters better be .exe or a space.
//
if(strncmp(CmdLineTail," ",1) && strncmp(CmdLineTail,".EXE ",5)) {
Error(INVALID_CMDLINE,CmdLine); return(FAILURE); } }
CmdLineTail = strchr(CmdLineTail,' '); if(!CmdLineTail) { CmdLineTail += lstrlen(CmdLineTail); }
//
// Now we want to point to the non-lowercased cmd line tail
//
TailOffset = CmdLineTail - cmdLine; CmdLineTail = CmdLine + TailOffset;
//
// Build a full command line: appname + cmd tail
//
lstrcpy(cmdLine,ModuleName); lstrcat(cmdLine,CmdLineTail);
//
// Invoke the correct setup app.
//
ZeroMemory(&StartupInfo,sizeof(STARTUPINFO)); StartupInfo.cb = sizeof(STARTUPINFO);
b = CreateProcess( ModuleName, cmdLine, NULL, NULL, FALSE, 0, NULL, NULL, &StartupInfo, &ProcessInfo );
if(!b) { Error(CREATEPROC_FAILED,cmdLine); return(FAILURE); }
CloseHandle(ProcessInfo.hThread); CloseHandle(ProcessInfo.hProcess); return(SUCCESS); }
|