Source code of Windows XP (NT5)
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.
 
 
 
 
 
 

180 lines
4.9 KiB

//+-------------------------------------------------------------------------
//
// Microsoft Windows
//
// Copyright (C) Microsoft Corporation, 1996 - 2000
//
// File: timebomb.c
//
//--------------------------------------------------------------------------
//
// -- Add these lines after the #include's in the file that handles DriverEntry:
//
// #ifdef TIME_BOMB
// #include "..\..\timebomb\timebomb.c"
// #endif
//
// -- Add the following lines to the beginning of DriverEntry:
//
// #ifdef TIME_BOMB
// if (HasEvaluationTimeExpired()) {
// return STATUS_EVALUATION_EXPIRATION;
// }
// #endif
//
// -- If you want to override the default expiration value of 31 days after
// compile, define the constant DAYS_UNTIL_EXPIRATION before you include
// timebomb.c
//
// -- Add -DTIME_BOMB to the $(C_DEFINES) line in the sources file. If you haven't
// already done so, you may also want to add -DDEBUG_LEVEL=DEBUGLVL_TERSE.
//
// -- "Cleanly" recompile your binary with 'build -cZ'
//
// -- NOTE: This uses the __DATE__ preprocessor directive which inserts a _very_
// clear-text string into the binary which is easily modifiable with a
// hex editor. Suggestions on making this more secure are welcome.
//
#if !defined(_KSDEBUG_)
#include <ksdebug.h>
#endif
#ifndef DAYS_UNTIL_EXPIRATION
#define DAYS_UNTIL_EXPIRATION 31
#endif
typedef enum {
Jan=1,
Feb,
Mar,
Apr,
May,
Jun,
Jul,
Aug,
Sep,
Oct,
Nov,
Dec
} MONTH;
MONTH GetMonthFromDateString
(
char *_BuildDate_
)
{
MONTH BuildMonth = (MONTH)0;
ASSERT(_BuildDate_);
switch (_BuildDate_[0]) {
case 'A':
if (_BuildDate_[1] == 'u') {
BuildMonth = Aug;
}
else {
BuildMonth = Apr;
}
break;
case 'D':
BuildMonth = Dec;
break;
case 'F':
BuildMonth = Feb;
break;
case 'J':
if (_BuildDate_[1] == 'u') {
if (_BuildDate_[2] == 'l') {
BuildMonth = Jul;
} else {
BuildMonth = Jun;
}
} else {
BuildMonth = Jan;
}
break;
case 'M':
if (_BuildDate_[2] == 'r') {
BuildMonth = Mar;
}
else {
BuildMonth = May;
}
break;
case 'N':
BuildMonth = Nov;
break;
case 'O':
BuildMonth = Oct;
break;
case 'S':
BuildMonth = Sep;
break;
default:
ASSERT(0);
break;
}
return BuildMonth;
}
BOOL HasEvaluationTimeExpired()
{
// Get the time that this file was compiled
char _BuildDate_[] = __DATE__;
CSHORT BuildYear,
BuildMonth,
BuildDay,
ThousandsDigit,
HundredsDigit,
TensDigit,
Digit;
ULONG BuildDays,
CurrentDays;
LARGE_INTEGER CurrentSystemTime;
TIME_FIELDS CurrentSystemTimeFields;
// Convert _BuildDate_ into something a little more palatable
_DbgPrintF( DEBUGLVL_TERSE, ("Driver Build Date: %s",_BuildDate_) );
BuildMonth = GetMonthFromDateString(_BuildDate_);
// Compensate for a ' ' in the tens digit
if ( (_BuildDate_[4] >= '0') && (_BuildDate_[4] <= '9') ) {
TensDigit = _BuildDate_[4] - '0';
} else {
TensDigit = 0;
}
Digit = _BuildDate_[5] - '0';
BuildDay = (TensDigit * 10) + Digit;
ThousandsDigit = _BuildDate_[7] - '0';
HundredsDigit = _BuildDate_[8] - '0';
TensDigit = _BuildDate_[9] - '0';
Digit = _BuildDate_[10] - '0';
BuildYear = (ThousandsDigit * 1000) + (HundredsDigit * 100) + (TensDigit * 10) + Digit;
// Get the current system time and convert to local time
KeQuerySystemTime( &CurrentSystemTime ); // returns GMT
RtlTimeToTimeFields( &CurrentSystemTime, &CurrentSystemTimeFields );
// For now, only let this binary float for 31 days
BuildDays = (BuildYear * 365) +
(BuildMonth * 31) +
BuildDay;
CurrentDays = (CurrentSystemTimeFields.Year * 365) +
(CurrentSystemTimeFields.Month * 31) +
CurrentSystemTimeFields.Day;
_DbgPrintF( DEBUGLVL_VERBOSE, ("CurrentDays: %d BuildDays: %d",CurrentDays, BuildDays) );
if (CurrentDays > BuildDays + DAYS_UNTIL_EXPIRATION) {
_DbgPrintF( DEBUGLVL_TERSE, ("Evaluation period expired!") );
return TRUE;
}
else {
_DbgPrintF( DEBUGLVL_TERSE, ("Evaluation days left: %d", (BuildDays + 31) - CurrentDays) );
return FALSE;
}
}