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