windows-nt/Source/XPSP1/NT/windows/appcompat/tools/smvtest/smvdrv/smvdrv.cpp
2020-09-26 16:20:57 +08:00

292 lines
5.8 KiB
C++

/*++
Copyright (c) 2000-2001 Microsoft Corporation
Module Name:
SMVDrv.cpp
Abstract:
This executable works as a driver for the SMVTest.exe.
Author:
Diaa Fathalla (DiaaF) 10-Dec-2000
Revision History:
DiaaF 18-Apr-2001 Adding GUI interface
--*/
#include "stdafx.h"
#include "resource.h"
/*
* Global Variables
*/
HINSTANCE g_hInstance;
BOOL CallSMVTest()
{
CLog Log;
DWORD dwSignalled = 0;
DWORD dwExitCode = 0;
HANDLE hEventObjects[1];
PROCESS_INFORMATION ProcessID;
STARTUPINFO sui = { sizeof(STARTUPINFO),
0,
NULL,
NULL,
NULL,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0 };
TCHAR sz_CommandLine[MAX_PATH];
GetCurrentDirectory(MAX_PATH, sz_CommandLine);
_tcscat(sz_CommandLine, TEXT("\\SMVTest.exe"));
//Start running SMVTest
if(!::CreateProcess (NULL,
sz_CommandLine,
NULL,
NULL,
FALSE,
NORMAL_PRIORITY_CLASS | CREATE_SUSPENDED,
NULL,
NULL,
&sui,
&ProcessID))
{
Log.LogResults(FALSE, TEXT("Can't create process for SMVTest.exe"));
return FALSE;
}
//Set the Event to the current Process
hEventObjects[0] = ProcessID.hThread;
ResumeThread(ProcessID.hThread);
dwSignalled = !WAIT_OBJECT_0;
do
{
dwSignalled = WaitForSingleObject(hEventObjects[0],0);
}
//Wait for the 'First' event which is the only one available.
while (dwSignalled != WAIT_OBJECT_0);
GetExitCodeProcess(ProcessID.hProcess, &dwExitCode);
//Close the thread/process handles
CloseHandle(ProcessID.hProcess);
CloseHandle(ProcessID.hThread);
if(dwExitCode != 0)
Log.LogResults(FALSE, TEXT("SMVTest.exe returned failure."));
return TRUE;
}
/*++
It initializes the project's log file and copy the shim dlls
to the AppPatch folder.
--*/
BOOL Initialize()
{
CLog Log;
TCHAR szAppPatchFolder[MAX_PATH];
TCHAR szShimCurrentDir[MAX_PATH];
TCHAR sz_SMVTSTSrcPath[MAX_PATH];
TCHAR sz_SMVTST2SrcPath[MAX_PATH];
TCHAR sz_SMVTSTDstPath[MAX_PATH];
TCHAR sz_SMVTST2DstPath[MAX_PATH];
Log.InitLogfile();
GetWindowsDirectory(szAppPatchFolder, MAX_PATH);
_tcscat(szAppPatchFolder, TEXT("\\AppPatch"));
_tcscpy(sz_SMVTSTDstPath, szAppPatchFolder);
_tcscpy(sz_SMVTST2DstPath, szAppPatchFolder);
GetCurrentDirectory(MAX_PATH, szShimCurrentDir);
_tcscat(szShimCurrentDir, TEXT("\\TestShims"));
_tcscpy(sz_SMVTSTSrcPath, szShimCurrentDir);
_tcscpy(sz_SMVTST2SrcPath, szShimCurrentDir);
_tcscat(sz_SMVTSTSrcPath, TEXT("\\_SMVTST.DLL"));
_tcscat(sz_SMVTST2SrcPath, TEXT("\\_SMVTST2.DLL"));
_tcscat(sz_SMVTSTDstPath, TEXT("\\_SMVTST.DLL"));
_tcscat(sz_SMVTST2DstPath, TEXT("\\_SMVTST2.DLL"));
//Copy the _SMVTST and _SMVTST2 to the AppPatch folder.
CopyFile(sz_SMVTSTSrcPath, sz_SMVTSTDstPath, FALSE);
CopyFile(sz_SMVTST2SrcPath, sz_SMVTST2DstPath, FALSE);
return TRUE;
}
/*++
It uninitializes the project's log file and delete the shim dlls
from the AppPatch folder.
--*/
BOOL Uninitialize()
{
CLog Log;
TCHAR szAppPatchFolder[MAX_PATH];
TCHAR sz_SMVTSTDstPath[MAX_PATH];
TCHAR sz_SMVTST2DstPath[MAX_PATH];
GetWindowsDirectory(szAppPatchFolder, MAX_PATH);
_tcscat(szAppPatchFolder, TEXT("\\AppPatch"));
_tcscpy(sz_SMVTSTDstPath, szAppPatchFolder);
_tcscpy(sz_SMVTST2DstPath, szAppPatchFolder);
_tcscat(sz_SMVTSTDstPath, TEXT("\\_SMVTST.DLL"));
_tcscat(sz_SMVTST2DstPath, TEXT("\\_SMVTST2.DLL"));
//Delete the shim DLLs from the AppPatch Folder
DeleteFile(sz_SMVTSTDstPath);
DeleteFile(sz_SMVTST2DstPath);
Log.EndLogfile();
return TRUE;
}
/*++
SetEnvironmentVariables: Sets necessary Environment Variables.
--*/
BOOL SetEnvironmentVariables()
{
TCHAR sz_Buffer[] = _T("9");
DWORD dwReturnValue;
HKEY hKey= NULL;
long lRet= 0;
TCHAR sz_SubKey[] = _T("SYSTEM\\CurrentControlSet\\Control\\Session Manager\\Environment");
CLog Log;
lRet = RegOpenKeyEx(HKEY_LOCAL_MACHINE, sz_SubKey, 0, KEY_WRITE, &hKey);
if(lRet == ERROR_SUCCESS)
{
lRet = RegSetValueEx(hKey,_T("SHIM_DEBUG_LEVEL"), 0, REG_SZ,
(LPBYTE) sz_Buffer, sizeof(sz_Buffer));
if(lRet == ERROR_SUCCESS)
SendMessageTimeout(HWND_BROADCAST, WM_SETTINGCHANGE, 0,(LPARAM) _T("Environment"),
SMTO_ABORTIFHUNG, 5000, &dwReturnValue);
else
Log.LogResults(FALSE,TEXT("Can't set the environment variable SHIM_DEBUG_LEVEL"));
RegCloseKey(hKey);
}
return TRUE;
}
BOOL CALLBACK
SMVDrvDlgProc(
HWND hDlg,
UINT uMsg,
WPARAM wParam,
LPARAM lParam)
/*++
SMVDrvDlgProc
Description: The dialog proc of SMVDrv.
--*/
{
switch (uMsg) {
case WM_INITDIALOG:
SetClassLong(hDlg, GCL_HICON, (LONG) LoadIcon(g_hInstance,MAKEINTRESOURCE(IDI_SMV)));
//g_bGoodApp = FALSE;
//CheckRadioButton(hDlg, IDC_OPTION_GOOD, IDC_OPTION_BAD, IDC_OPTION_BAD);
SetEnvironmentVariables();
break;
case WM_COMMAND:
switch (LOWORD (wParam))
{
case IDCANCEL:
EndDialog(hDlg, TRUE);
return TRUE;
case IDRUN:
Initialize();
CallSMVTest();
Uninitialize();
break;
//case IDC_OPTION_GOOD:
//case IDC_OPTION_BAD:
// CheckRadioButton(hDlg, IDC_OPTION_GOOD, IDC_OPTION_BAD, LOWORD(wParam));
// g_bGoodApp = !g_bGoodApp;
// return TRUE;
}
default:
return FALSE;
}
return FALSE;
}
int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
/*++
It initializes the project's log file and copy the shim dlls
to the AppPatch folder.
--*/
{
switch(*lpCmdLine)
{
//
// Check for the command line options
//
case '/':
case '-':
switch(*(lpCmdLine+1))
{
//Quite Mode
case 'q':
case 'Q':
Initialize();
SetEnvironmentVariables();
CallSMVTest();
Uninitialize();
break;
}
break;
default:
//
// If no command line options, launch dialog.
//
g_hInstance = hInstance;
DialogBox(hInstance,
MAKEINTRESOURCE(IDD_SMVDRV),
GetDesktopWindow(),
SMVDrvDlgProc);
}
return 0;
}