mirror of https://github.com/tongzx/nt5src
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.
162 lines
3.3 KiB
162 lines
3.3 KiB
#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);
|
|
}
|
|
|
|
|