- clientlib: Remove backwards compatible mouse and keyboard activity

detection code since we no longer support Win9x
        
    clientlib/win/
        boinc_dll.cpp
        IdleTracker.cpp
        stdafx.h

svn path=/trunk/boinc/; revision=18599
This commit is contained in:
Rom Walton 2009-07-15 20:54:46 +00:00
parent fcc031a6d5
commit 3f7c7a0241
4 changed files with 159 additions and 370 deletions

View File

@ -6274,3 +6274,12 @@ Rom 15 July 2009
client/
hostinfo_win.cpp
Rom 15 July 2009
- clientlib: Remove backwards compatible mouse and keyboard activity
detection code since we no longer support Win9x
clientlib/win/
boinc_dll.cpp
IdleTracker.cpp
stdafx.h

View File

@ -1,18 +1,20 @@
/**
* IdleTracker - a DLL that tracks the user's idle input time
* system-wide.
*
* Usage
* =====
* - call IdleTrackerInit() when you want to start monitoring.
* - call IdleTrackerTerm() when you want to stop monitoring.
* - to get the time past since last user input, do the following:
* GetTickCount() - IdleTrackerGetLastTickCount()
*
* Author: Sidney Chong
* Date: 25/5/2000
* Version: 1.0
**/
// This file is part of BOINC.
// http://boinc.berkeley.edu
// Copyright (C) 2008 University of California
//
// BOINC is free software; you can redistribute it and/or modify it
// under the terms of the GNU Lesser General Public License
// as published by the Free Software Foundation,
// either version 3 of the License, or (at your option) any later version.
//
// BOINC is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
// See the GNU Lesser General Public License for more details.
//
// You should have received a copy of the GNU Lesser General Public License
// along with BOINC. If not, see <http://www.gnu.org/licenses/>.
#include "stdafx.h"
#include "boinc_dll.h"
@ -22,23 +24,7 @@
/**
* The following global data is only shared in this instance of the DLL
**/
HMODULE g_hUser32 = NULL;
HANDLE g_hMemoryMappedData = NULL;
BOOL g_bIsWindows2000Compatible = FALSE;
BOOL g_bIsTerminalServicesEnabled = FALSE;
/**
* The following global data is SHARED among all instances of the DLL
* (processes) within a terminal services session.
**/
#pragma data_seg(".IdleTrac") // you must define as SHARED in .def
HHOOK g_hHkKeyboard = NULL; // handle to the keyboard hook
HHOOK g_hHkMouse = NULL; // handle to the mouse hook
LONG g_mouseLocX = -1; // x-location of mouse position
LONG g_mouseLocY = -1; // y-location of mouse position
DWORD g_dwLastTick = 0; // tick time of last input event
#pragma data_seg()
#pragma comment(linker, "/section:.IdleTrac,rws")
/**
* The following global data is SHARED among all instances of the DLL
@ -51,49 +37,6 @@ struct SystemWideIdleData
struct SystemWideIdleData* g_pSystemWideIdleData = NULL;
/**
* Define stuff that only exists on Windows 2000 compatible machines
**/
typedef struct tagLASTINPUTINFO {
UINT cbSize;
DWORD dwTime;
} LASTINPUTINFO, *PLASTINPUTINFO;
typedef BOOL (WINAPI *GETLASTINPUTINFO)(PLASTINPUTINFO);
GETLASTINPUTINFO g_fnGetLastInputInfo = NULL;
/**
* Keyboard hook: record tick count
**/
LRESULT CALLBACK KeyboardTracker(int code, WPARAM wParam, LPARAM lParam)
{
if (code==HC_ACTION)
{
g_dwLastTick = GetTickCount();
}
return ::CallNextHookEx(g_hHkKeyboard, code, wParam, lParam);
}
/**
* Mouse hook: record tick count
**/
LRESULT CALLBACK MouseTracker(int code, WPARAM wParam, LPARAM lParam)
{
if (code==HC_ACTION)
{
MOUSEHOOKSTRUCT* pStruct = (MOUSEHOOKSTRUCT*)lParam;
//we will assume that any mouse msg with the same locations as spurious
if (pStruct->pt.x != g_mouseLocX || pStruct->pt.y != g_mouseLocY)
{
g_mouseLocX = pStruct->pt.x;
g_mouseLocY = pStruct->pt.y;
g_dwLastTick = GetTickCount();
}
}
return ::CallNextHookEx(g_hHkMouse, code, wParam, lParam);
}
/**
* Get tick count of last keyboard or mouse event
**/
@ -102,44 +45,34 @@ EXTERN_C __declspec(dllexport) DWORD BOINCGetIdleTickCount()
DWORD dwCurrentTickCount = GetTickCount();
DWORD dwLastTickCount = 0;
if ( g_bIsWindows2000Compatible )
if ( g_pSystemWideIdleData )
{
if ( g_pSystemWideIdleData )
LASTINPUTINFO lii;
ZeroMemory( &lii, sizeof(lii) );
lii.cbSize = sizeof(lii);
GetLastInputInfo( &lii );
/**
* If both values are greater than the system tick count then
* the system must have looped back to the beginning.
**/
if ( ( dwCurrentTickCount < lii.dwTime ) &&
( dwCurrentTickCount < g_pSystemWideIdleData->dwLastTick ) )
{
LASTINPUTINFO lii;
ZeroMemory( &lii, sizeof(lii) );
lii.cbSize = sizeof(lii);
g_fnGetLastInputInfo( &lii );
/**
* If both values are greater than the system tick count then
* the system must have looped back to the beginning.
**/
if ( ( dwCurrentTickCount < lii.dwTime ) &&
( dwCurrentTickCount < g_pSystemWideIdleData->dwLastTick ) )
{
lii.dwTime = dwCurrentTickCount;
g_pSystemWideIdleData->dwLastTick = dwCurrentTickCount;
}
if ( lii.dwTime > g_pSystemWideIdleData->dwLastTick )
g_pSystemWideIdleData->dwLastTick = lii.dwTime;
dwLastTickCount = g_pSystemWideIdleData->dwLastTick;
lii.dwTime = dwCurrentTickCount;
g_pSystemWideIdleData->dwLastTick = dwCurrentTickCount;
}
}
else
{
dwLastTickCount = g_dwLastTick;
if ( lii.dwTime > g_pSystemWideIdleData->dwLastTick )
g_pSystemWideIdleData->dwLastTick = lii.dwTime;
dwLastTickCount = g_pSystemWideIdleData->dwLastTick;
}
return (dwCurrentTickCount - dwLastTickCount);
}
/**
* Initialize DLL: install kbd/mouse hooks.
**/
EXTERN_C __declspec(dllexport) BOOL IdleTrackerStartup()
{
BOOL bExists = FALSE;
@ -148,124 +81,76 @@ EXTERN_C __declspec(dllexport) BOOL IdleTrackerStartup()
SECURITY_DESCRIPTOR sd;
g_bIsWindows2000Compatible = IsWindows2000Compatible();
g_bIsTerminalServicesEnabled = IsTerminalServicesEnabled();
/*
* Create a security descriptor that will allow
* everyone full access.
*/
InitializeSecurityDescriptor( &sd, SECURITY_DESCRIPTOR_REVISION );
SetSecurityDescriptorDacl( &sd, TRUE, NULL, FALSE );
if ( !g_bIsWindows2000Compatible )
sec_attr.nLength = sizeof(sec_attr);
sec_attr.bInheritHandle = TRUE;
sec_attr.lpSecurityDescriptor = &sd;
/*
* Create a filemap object that is global for everyone,
* including users logged in via terminal services.
*/
g_hMemoryMappedData =
CreateFileMapping(
INVALID_HANDLE_VALUE,
&sec_attr,
PAGE_READWRITE,
0,
4096,
"Global\\BoincIdleTracker"
);
if( NULL == g_hMemoryMappedData )
{
if ( NULL == g_hHkKeyboard )
{
g_hHkKeyboard = SetWindowsHookEx(
WH_KEYBOARD,
KeyboardTracker,
g_hModule,
0
);
}
if ( NULL == g_hHkMouse )
{
g_hHkMouse = SetWindowsHookEx(
WH_MOUSE,
MouseTracker,
g_hModule,
0
);
}
_ASSERT( g_hHkKeyboard );
_ASSERT( g_hHkMouse );
}
else
{
g_hUser32 = LoadLibrary("user32.dll");
if (g_hUser32)
g_fnGetLastInputInfo = (GETLASTINPUTINFO)GetProcAddress(g_hUser32, "GetLastInputInfo");
/*
* Create a security descriptor that will allow
* everyone full access.
*/
InitializeSecurityDescriptor( &sd, SECURITY_DESCRIPTOR_REVISION );
SetSecurityDescriptorDacl( &sd, TRUE, NULL, FALSE );
sec_attr.nLength = sizeof(sec_attr);
sec_attr.bInheritHandle = TRUE;
sec_attr.lpSecurityDescriptor = &sd;
/*
* Create a filemap object that is global for everyone,
* including users logged in via terminal services.
*/
g_hMemoryMappedData =
g_hMemoryMappedData =
CreateFileMapping(
INVALID_HANDLE_VALUE,
&sec_attr,
PAGE_READWRITE,
0,
4096,
"Global\\BoincIdleTracker"
&sec_attr,
PAGE_READWRITE,
0,
4096,
"BoincIdleTracker"
);
if( NULL == g_hMemoryMappedData )
{
g_hMemoryMappedData =
CreateFileMapping(
INVALID_HANDLE_VALUE,
&sec_attr,
PAGE_READWRITE,
0,
4096,
"BoincIdleTracker"
);
}
if( NULL != g_hMemoryMappedData )
{
if( ERROR_ALREADY_EXISTS == GetLastError() )
bExists = TRUE;
g_pSystemWideIdleData = (struct SystemWideIdleData*)
MapViewOfFile(
g_hMemoryMappedData,
FILE_MAP_ALL_ACCESS,
0,
0,
0
);
_ASSERT( g_pSystemWideIdleData );
}
if( !bExists && g_pSystemWideIdleData )
{
g_pSystemWideIdleData->dwLastTick = GetTickCount();
}
}
if ( !g_bIsWindows2000Compatible )
if( NULL != g_hMemoryMappedData )
{
if ( !g_hHkKeyboard || !g_hHkMouse )
bResult = FALSE;
else
bResult = TRUE;
if( ERROR_ALREADY_EXISTS == GetLastError() )
bExists = TRUE;
g_pSystemWideIdleData = (struct SystemWideIdleData*)
MapViewOfFile(
g_hMemoryMappedData,
FILE_MAP_ALL_ACCESS,
0,
0,
0
);
_ASSERT( g_pSystemWideIdleData );
}
if( !bExists && g_pSystemWideIdleData )
{
g_pSystemWideIdleData->dwLastTick = GetTickCount();
}
if (!g_hMemoryMappedData || !g_pSystemWideIdleData )
bResult = FALSE;
else
{
if ( !g_hUser32 || !g_fnGetLastInputInfo || !g_hMemoryMappedData || !g_pSystemWideIdleData )
bResult = FALSE;
else
bResult = TRUE;
}
bResult = TRUE;
return bResult;
}
/**
* Initialize DLL: install kbd/mouse hooks.
**/
EXTERN_C __declspec(dllexport) BOOL IdleTrackerAttach()
{
BOOL bExists = FALSE;
@ -274,182 +159,82 @@ EXTERN_C __declspec(dllexport) BOOL IdleTrackerAttach()
SECURITY_DESCRIPTOR sd;
g_bIsWindows2000Compatible = IsWindows2000Compatible();
g_bIsTerminalServicesEnabled = IsTerminalServicesEnabled();
/*
* Create a security descriptor that will allow
* everyone full access.
*/
InitializeSecurityDescriptor( &sd, SECURITY_DESCRIPTOR_REVISION );
SetSecurityDescriptorDacl( &sd, TRUE, NULL, FALSE );
if ( !g_bIsWindows2000Compatible )
sec_attr.nLength = sizeof(sec_attr);
sec_attr.bInheritHandle = TRUE;
sec_attr.lpSecurityDescriptor = &sd;
/*
* Create a filemap object that is global for everyone,
* including users logged in via terminal services.
*/
g_hMemoryMappedData =
OpenFileMapping(
FILE_MAP_READ | FILE_MAP_WRITE,
FALSE,
"Global\\BoincIdleTracker"
);
if( NULL == g_hMemoryMappedData )
{
if ( NULL == g_hHkKeyboard )
{
g_hHkKeyboard = SetWindowsHookEx(
WH_KEYBOARD,
KeyboardTracker,
g_hModule,
0
);
}
if ( NULL == g_hHkMouse )
{
g_hHkMouse = SetWindowsHookEx(
WH_MOUSE,
MouseTracker,
g_hModule,
0
);
}
_ASSERT( g_hHkKeyboard );
_ASSERT( g_hHkMouse );
}
else
{
g_hUser32 = LoadLibrary("user32.dll");
if (g_hUser32)
g_fnGetLastInputInfo = (GETLASTINPUTINFO)GetProcAddress(g_hUser32, "GetLastInputInfo");
/*
* Create a security descriptor that will allow
* everyone full access.
*/
InitializeSecurityDescriptor( &sd, SECURITY_DESCRIPTOR_REVISION );
SetSecurityDescriptorDacl( &sd, TRUE, NULL, FALSE );
sec_attr.nLength = sizeof(sec_attr);
sec_attr.bInheritHandle = TRUE;
sec_attr.lpSecurityDescriptor = &sd;
/*
* Create a filemap object that is global for everyone,
* including users logged in via terminal services.
*/
g_hMemoryMappedData =
g_hMemoryMappedData =
OpenFileMapping(
FILE_MAP_READ | FILE_MAP_WRITE,
FALSE,
"Global\\BoincIdleTracker"
FALSE,
"BoincIdleTracker"
);
if( NULL == g_hMemoryMappedData )
{
g_hMemoryMappedData =
OpenFileMapping(
FILE_MAP_READ | FILE_MAP_WRITE,
FALSE,
"BoincIdleTracker"
);
}
if( NULL != g_hMemoryMappedData )
{
if( ERROR_ALREADY_EXISTS == GetLastError() )
bExists = TRUE;
g_pSystemWideIdleData = (struct SystemWideIdleData*)
MapViewOfFile(
g_hMemoryMappedData,
FILE_MAP_ALL_ACCESS,
0,
0,
0
);
_ASSERT( g_pSystemWideIdleData );
}
if( !bExists && g_pSystemWideIdleData )
{
g_pSystemWideIdleData->dwLastTick = GetTickCount();
}
}
if ( !g_bIsWindows2000Compatible )
if( NULL != g_hMemoryMappedData )
{
if ( !g_hHkKeyboard || !g_hHkMouse )
bResult = FALSE;
else
bResult = TRUE;
if( ERROR_ALREADY_EXISTS == GetLastError() )
bExists = TRUE;
g_pSystemWideIdleData = (struct SystemWideIdleData*)
MapViewOfFile(
g_hMemoryMappedData,
FILE_MAP_ALL_ACCESS,
0,
0,
0
);
_ASSERT( g_pSystemWideIdleData );
}
if( !bExists && g_pSystemWideIdleData )
{
g_pSystemWideIdleData->dwLastTick = GetTickCount();
}
if (!g_hMemoryMappedData || !g_pSystemWideIdleData )
bResult = FALSE;
else
{
if ( !g_hUser32 || !g_fnGetLastInputInfo || !g_hMemoryMappedData || !g_pSystemWideIdleData )
bResult = FALSE;
else
bResult = TRUE;
}
bResult = TRUE;
return bResult;
}
/**
* Terminate DLL: remove hooks.
**/
EXTERN_C __declspec(dllexport) void IdleTrackerDetach()
EXTERN_C __declspec(dllexport) void IdleTrackerShutdown()
{
if ( !g_bIsWindows2000Compatible )
if( NULL != g_pSystemWideIdleData )
{
BOOL bResult;
if ( g_hHkKeyboard )
{
bResult = UnhookWindowsHookEx( g_hHkKeyboard );
_ASSERT( bResult );
g_hHkKeyboard = NULL;
}
if ( g_hHkMouse )
{
bResult = UnhookWindowsHookEx(g_hHkMouse);
_ASSERT( bResult );
g_hHkMouse = NULL;
}
}
else
{
if( NULL != g_pSystemWideIdleData )
{
UnmapViewOfFile(g_pSystemWideIdleData);
CloseHandle(g_hMemoryMappedData);
}
if ( NULL != g_hUser32 )
FreeLibrary(g_hUser32);
UnmapViewOfFile(g_pSystemWideIdleData);
CloseHandle(g_hMemoryMappedData);
}
}
/**
* Terminate DLL: remove hooks.
**/
EXTERN_C __declspec(dllexport) void IdleTrackerShutdown()
EXTERN_C __declspec(dllexport) void IdleTrackerDetach()
{
if ( !g_bIsWindows2000Compatible )
{
BOOL bResult;
if ( g_hHkKeyboard )
{
bResult = UnhookWindowsHookEx( g_hHkKeyboard );
_ASSERT( bResult );
g_hHkKeyboard = NULL;
}
if ( g_hHkMouse )
{
bResult = UnhookWindowsHookEx(g_hHkMouse);
_ASSERT( bResult );
g_hHkMouse = NULL;
}
}
else
{
if( NULL != g_pSystemWideIdleData )
{
UnmapViewOfFile(g_pSystemWideIdleData);
CloseHandle(g_hMemoryMappedData);
}
if ( NULL != g_hUser32 )
FreeLibrary(g_hUser32);
}
IdleTrackerShutdown();
}

View File

@ -19,7 +19,6 @@
#include "stdafx.h"
#include "resource.h"
#include "win_util.h"
#include "IdleTracker.h"
// Declare a global hModule variable for this process, which will
// be initialized when the DLL is loaded.

View File

@ -10,20 +10,16 @@
// Modify the following defines if you have to target a platform prior to the ones specified below.
// Refer to MSDN for the latest info on corresponding values for different platforms.
#ifndef WINVER // Allow use of features specific to Windows 95 and Windows NT 4 or later.
#define WINVER 0x0400 // Change this to the appropriate value to target Windows 98 and Windows 2000 or later.
#ifndef WINVER // Allow use of features specific to Windows 2000 or later
#define WINVER 0x0500
#endif
#ifndef _WIN32_WINNT // Allow use of features specific to Windows NT 4 or later.
#define _WIN32_WINNT 0x0400 // Change this to the appropriate value to target Windows 2000 or later.
#ifndef _WIN32_WINNT // Allow use of features specific to Windows 2000 or later.
#define _WIN32_WINNT 0x0500
#endif
#ifndef _WIN32_WINDOWS // Allow use of features specific to Windows 98 or later.
#define _WIN32_WINDOWS 0x0410 // Change this to the appropriate value to target Windows Me or later.
#endif
#ifndef _WIN32_IE // Allow use of features specific to IE 5.01 or later.
#define _WIN32_IE 0x0501 // Change this to the appropriate value to target IE 6.0 or later.
#define _WIN32_IE 0x0501
#endif
#include <windows.h>