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.
272 lines
7.6 KiB
272 lines
7.6 KiB
// vidacc.cpp : Video acceleration manipulation tool.
|
|
//
|
|
|
|
#include "stdafx.h"
|
|
#include "windows.h"
|
|
#include "vidacc.h"
|
|
#include <devguid.h>
|
|
#include <setupapi.h>
|
|
#include <regstr.h>
|
|
|
|
#ifdef _DEBUG
|
|
#define new DEBUG_NEW
|
|
#undef THIS_FILE
|
|
static char THIS_FILE[] = __FILE__;
|
|
#endif
|
|
|
|
using namespace std;
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// The one and only application object
|
|
|
|
inline
|
|
void
|
|
CDrvchkApp::PrintOut (LPCSTR str)
|
|
{
|
|
if (m_logf)
|
|
fprintf (m_logf, "%s", str);
|
|
else
|
|
cerr << str;
|
|
}
|
|
|
|
inline
|
|
void
|
|
CDrvchkApp::PrintOut (unsigned num)
|
|
{
|
|
if (m_logf)
|
|
fprintf (m_logf, "%d", num);
|
|
else
|
|
cerr << num;
|
|
}
|
|
|
|
int __cdecl _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
|
|
{
|
|
int nRetCode = 0;
|
|
|
|
// cerr << ::GetCommandLine() << endl;
|
|
|
|
// initialize MFC and print and error on failure
|
|
if (AfxWinInit(::GetModuleHandle(NULL), NULL, ::GetCommandLine(), 0))
|
|
{
|
|
CDrvchkApp theApp;
|
|
theApp.InitInstance ();
|
|
}
|
|
|
|
return nRetCode;
|
|
}
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CDrvchkApp construction
|
|
|
|
CDrvchkApp::CDrvchkApp() :
|
|
m_logf(NULL),
|
|
m_drv_name ("")
|
|
{
|
|
// TODO: add construction code here,
|
|
// Place all significant initialization in InitInstance
|
|
}
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// The one and only CDrvchkApp object
|
|
|
|
/*------------------------------------------------------------------------
|
|
|
|
vchk /drv driver.dll /log logname.log /allow videoptr.sys
|
|
|
|
/allowed_modules module1.sys FnName1 FnName2 FnName3 /allowed_modules module2.dll FnName4
|
|
|
|
------------------------------------------------------------------------*/
|
|
|
|
void
|
|
CommandLine::ParseParam( LPCTSTR lpszParam, BOOL bFlag, BOOL bLast )
|
|
{
|
|
|
|
if (m_parse_error)
|
|
return;
|
|
|
|
CString param (lpszParam);
|
|
|
|
if (bFlag) {
|
|
|
|
param.MakeUpper();
|
|
|
|
if (m_last_flag.GetLength()) {
|
|
m_parse_error = TRUE;
|
|
m_error_msg = CString("Flag ") + m_last_flag + CString(" requires a parameter.");
|
|
} else if ((param==CString("ACC")) || (param==CString("LOG")) || (param==CString("MON"))) {
|
|
m_last_flag = param;
|
|
m_first_param = TRUE;
|
|
} else if (param==CString("?")) {
|
|
m_help = TRUE;
|
|
m_last_flag="";
|
|
} else {
|
|
m_last_flag = "";
|
|
m_parse_error = TRUE;
|
|
m_error_msg = CString("Unrecognized flag: ") + param;
|
|
}
|
|
|
|
} else {
|
|
if ((m_last_flag==CString("ACC"))) {
|
|
DWORD acc_lvl = atoi(param);
|
|
if ((acc_lvl==0) && !(param==CString("0"))) {
|
|
m_error_msg = "bad command line: /ACC flag has wrong parameter";
|
|
m_parse_error = TRUE;
|
|
}
|
|
else if (acc_lvl>ACC_DISABLED)
|
|
m_acc_level=ACC_DISABLED;
|
|
else
|
|
m_acc_level=acc_lvl;
|
|
m_last_flag = "";
|
|
} else if (m_last_flag==CString("MON")) {
|
|
if (param.GetLength()==1) {
|
|
char c = ((LPCSTR)param)[0];
|
|
m_monitor = c - '1';
|
|
} else {
|
|
m_monitor = -1;
|
|
m_error_msg = "bad command line: /MON flag has wrong parameter";
|
|
m_parse_error = TRUE;
|
|
}
|
|
m_last_flag="";
|
|
} else if (m_last_flag==CString("LOG")) {
|
|
m_log_fname = param;
|
|
m_last_flag="";
|
|
} else {
|
|
m_parse_error = TRUE;
|
|
m_error_msg = CString("Wrong parameter: ") + param;
|
|
m_last_flag="";
|
|
}
|
|
}
|
|
|
|
if (bLast) {
|
|
if (m_last_flag==CString("ACC")) {
|
|
m_parse_error = TRUE;
|
|
m_error_msg = CString("Flag ") + m_last_flag + CString(" requires a parameter.");
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CDrvchkApp initialization
|
|
|
|
BOOL CDrvchkApp::InitInstance()
|
|
{
|
|
// Standard initialization
|
|
// If you are not using these features and wish to reduce the size
|
|
|
|
ParseCommandLine (m_cmd_line);
|
|
|
|
if (m_cmd_line.m_help) {
|
|
PrintOut ("\nVIDACC [/ACC level] [/MON monitor] [/LOG logfile] [/?]\n\n");
|
|
PrintOut (" /ACC explicitely defines acceleration level\n\n");
|
|
PrintOut (" level a digit from 0 to 5, 0 means full acceleration,\n"
|
|
" and 5 (default) disables acceleration at all.\n\n");
|
|
PrintOut (" monitor monitor number (if running on multimon)\n\n");
|
|
PrintOut (" logfile a file to dump the output messages\n\n");
|
|
return TRUE;
|
|
}
|
|
|
|
m_os_ver_info.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
|
|
GetVersionEx (&m_os_ver_info);
|
|
if (m_os_ver_info.dwPlatformId != VER_PLATFORM_WIN32_NT) { // doesn't work on Win9x
|
|
PrintOut ("warning: unsupported OS (Win9x), nothing done.\n");
|
|
return FALSE;
|
|
}
|
|
if (m_os_ver_info.dwMajorVersion<5) { // doesn't work on NT version prior to Win2K
|
|
PrintOut ("warning: unsupported OS (");
|
|
PrintOut (m_os_ver_info.dwMajorVersion);
|
|
PrintOut (".");
|
|
PrintOut (m_os_ver_info.dwMinorVersion);
|
|
PrintOut ("): nothing done.\n");
|
|
return FALSE;
|
|
}
|
|
|
|
if (m_cmd_line.m_log_fname.GetLength()) {
|
|
m_logf = fopen (m_cmd_line.m_log_fname, "a+");
|
|
}
|
|
|
|
if (m_cmd_line.m_parse_error) {
|
|
|
|
PrintOut ("error: ");
|
|
PrintOut ((LPCSTR)m_cmd_line.m_error_msg);
|
|
PrintOut ("\n");
|
|
|
|
} else {
|
|
|
|
//
|
|
// Let's find all the video drivers that are installed in the system
|
|
//
|
|
DISPLAY_DEVICE DisplayDevice;
|
|
DisplayDevice.cb = sizeof (DisplayDevice);
|
|
|
|
// cerr << "looking for device #" << m_cmd_line.m_monitor << endl;
|
|
|
|
for (DWORD d=0, index=0; EnumDisplayDevices(NULL, index, &DisplayDevice, 0); index++) {
|
|
|
|
// cerr << "device #" << d << endl;
|
|
|
|
if (DisplayDevice.StateFlags & DISPLAY_DEVICE_MIRRORING_DRIVER) {
|
|
// cerr << "DisplayDevice.StateFlags & DISPLAY_DEVICE_MIRRORING_DRIVER\n";
|
|
continue;
|
|
}
|
|
|
|
if (m_cmd_line.m_monitor!=d++) {
|
|
// cerr << "m_cmd_line.m_monitor!=d\n";
|
|
continue;
|
|
}
|
|
|
|
HKEY hKey = NULL;
|
|
|
|
TCHAR device_key[256]; // Name of service (drivers)
|
|
|
|
// cerr << DisplayDevice.DeviceKey << endl;
|
|
_tcscpy (device_key, DisplayDevice.DeviceKey+18); // chop "\Registry\Machine\" off
|
|
// cerr << device_key << endl;
|
|
|
|
if (RegOpenKeyEx(HKEY_LOCAL_MACHINE,device_key,(DWORD)0,KEY_ALL_ACCESS,&hKey)==ERROR_SUCCESS) {
|
|
|
|
RegSetValueEx(hKey,
|
|
_TEXT("Acceleration.Level"),
|
|
0,
|
|
REG_DWORD,
|
|
(CONST BYTE *)&m_cmd_line.m_acc_level,
|
|
sizeof(DWORD));
|
|
}
|
|
|
|
ChangeDisplaySettings(NULL, 0);
|
|
|
|
switch (m_cmd_line.m_acc_level) {
|
|
case 0:
|
|
PrintOut ("Level 0: Full acceleration enabled\n");
|
|
break;
|
|
case 1:
|
|
PrintOut ("Level 1: Only cursor and birmap acceleration disabled\n");
|
|
break;
|
|
case 2:
|
|
PrintOut ("Level 2: Cursor and advanced drawing acceleration disabled\n");
|
|
break;
|
|
case 3:
|
|
PrintOut ("Level 3: DirectX, cursor and advanced drawing acceleration disabled\n");
|
|
break;
|
|
case 4:
|
|
PrintOut ("Level 4: All but basic accelerations disabled\n");
|
|
break;
|
|
case 5:
|
|
PrintOut ("Level 5: All accelerations disabled\n");
|
|
break;
|
|
}
|
|
|
|
if (hKey)
|
|
RegCloseKey(hKey);
|
|
|
|
} // for each device
|
|
|
|
} // if no cmd line error
|
|
|
|
if (m_logf)
|
|
fclose (m_logf);
|
|
m_logf = NULL;
|
|
|
|
return TRUE;
|
|
}
|
|
|