292 lines
5.8 KiB
C++
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;
|
||
|
}
|