www.pudn.com > hidedrive.rar > TimeAndProc.h
/************************************************************
版权所有: 北京赛搏长城信息技术研究所, 2005.
文件名: TimeAndProc.h
作者: 胡托任
描述: 存放取当前时间和应用程序名称辅助函数的头文件
***********************************************************/
//**********************************************************
//以下函数实现取得当前时间
//**********************************************************
/* 与时间有关的一些宏定义 */
#define ONE_DAY_SECONDS 86400
#define SECONDS_OF_1970_1601 3054539008 // 1970-01-01 - 1601-01-01 's seconds
#define WEEK_OF_1970_01_01 5 // 1970-01-01 is Saturday
#define HOUR_8_SECONDS 28800
/*************************************************************
函数名称: GetCurrentTime(unsigned char* Week, ULONG* pTime)
功能描述: 取得当前系统时间
调用: 无
被调用: NetControl()、IpFilter()、SynFloodAttack()、DealStopInfo()
输入: 无
输出: unsigned char* Week 当天为星期几
ULONG* pTime 当前时间在当天的秒数
返回值: 从1970年1月1日到当前的秒数
其他说明:
*************************************************************/
ULONG GetCurrentTime(unsigned char* Week, ULONG* pTime)
{
LARGE_INTEGER SystemTime;
ULONG GmtDateTime, DateTime, Date, Time;
/* 取得当前时间 */
KeQuerySystemTime(&SystemTime);
/* 对时间作一些处理 */
GmtDateTime = (ULONG)(SystemTime.QuadPart / 10000000 - SECONDS_OF_1970_1601);
ExSystemTimeToLocalTime(&SystemTime, &SystemTime);
DateTime = (ULONG)(SystemTime.QuadPart / 10000000 - SECONDS_OF_1970_1601);
Date = DateTime / ONE_DAY_SECONDS;
Time = DateTime % ONE_DAY_SECONDS;
/* 取得星期 */
*Week = (unsigned char)(Date % 7 + WEEK_OF_1970_01_01);
if(*Week > 7)
*Week -= 7;
/* 取得当天的时间秒数 */
*pTime = Time;
return GmtDateTime;
}
//********************************************************
//以下函数实现取得当前应用程序的名称
//********************************************************
/* 与应用程序名称有关的一些宏定义 */
#define BASE_PROCESS_PEB_OFFSET 0x01B0
#define BASE_PEB_PROCESS_PARAMETER_OFFSET 0x0010
#define BASE_PROCESS_PARAMETER_FULL_IMAGE_NAME 0x003C
#define BASE_PROCESS_NAME_OFFSET 0x01FC
#define BASE_PROCESS_NAME_OFFSET_XP 0x0174
/*************************************************************
函数名称: PsGetModuleFileNameW()
功能描述: 得到应用程序完整路径的地址
调用: 无
被调用: GetProcessFileName()
输入: 无
输出: 无
返回值: 失败 NULL,成功 应用程序完整路径地址
其他说明:
*************************************************************/
PCWSTR PsGetModuleFileNameW()
{
ULONG dwAddress;
if(KeGetCurrentIrql() != PASSIVE_LEVEL)
return NULL;
/* 取得应用程序名称的地址 */
dwAddress = (ULONG)PsGetCurrentProcess();
/* 对地址作合法性检查 */
if(dwAddress == 0 || dwAddress == 0xFFFFFFFF)
return NULL;
dwAddress += BASE_PROCESS_PEB_OFFSET;
if((dwAddress = *(ULONG*)dwAddress) == 0)
return 0;
dwAddress += BASE_PEB_PROCESS_PARAMETER_OFFSET;
if((dwAddress = *(ULONG*)dwAddress) == 0)
return 0;
dwAddress += BASE_PROCESS_PARAMETER_FULL_IMAGE_NAME;
if((dwAddress = *(ULONG*)dwAddress) == 0)
return 0;
return (PCWSTR)dwAddress;
}
/* 与操作系统版本信息有关的一些宏定义 */
#define WINDOWS_VERSION_NONE 0
#define WINDOWS_VERSION_2000 1
#define WINDOWS_VERSION_XP 2
#define WINDOWS_VERSION_2003 3
/*************************************************************
函数名称: GetWindowsVersion()
功能描述: 得到操作系统版本信息
调用: 无
被调用: PsGetProcessName()
输入: 无
输出: 无
返回值: 操作系统版本信息
其他说明:
*************************************************************/
int GetWindowsVersion()
{
ULONG MajorVersion, MinorVersion;
/* 取得操作系统版本信息 */
PsGetVersion(&MajorVersion, &MinorVersion, NULL, NULL);
if(MajorVersion == 5 && MinorVersion == 0)
return WINDOWS_VERSION_2000;
else if(MajorVersion == 5 && MinorVersion == 1)
return WINDOWS_VERSION_XP;
else if(MajorVersion == 5 && MinorVersion == 2)
return WINDOWS_VERSION_2003;
else
return WINDOWS_VERSION_NONE;
}
/*************************************************************
函数名称: PsGetProcessName()
功能描述: 得到当前进程的名称
调用: 无
被调用: GetProcessFileName()
输入: 无
输出: 无
返回值: 当前进程的名称
其他说明:
*************************************************************/
char* PsGetProcessName()
{
char* pImageName;
static int WindowsVersion = WINDOWS_VERSION_NONE;
if(KeGetCurrentIrql() != PASSIVE_LEVEL)
return NULL;
if(WindowsVersion == WINDOWS_VERSION_NONE)
WindowsVersion = GetWindowsVersion();
/* 取得当前进程的名称 */
pImageName = (char*)PsGetCurrentProcess();
if(pImageName == NULL || pImageName == (char*)0xFFFFFFFF)
return NULL;
/* 对进程名称基于操作系统作一些不同的处理 */
switch(WindowsVersion)
{
case WINDOWS_VERSION_2000:
pImageName += BASE_PROCESS_NAME_OFFSET;
break;
case WINDOWS_VERSION_XP:
pImageName += BASE_PROCESS_NAME_OFFSET_XP;
break;
default:
return NULL;
}
return pImageName;
}
/*************************************************************
函数名称: GetProcessFileName(char* buf, ULONG nSize, UCHAR IsOnlyName)
功能描述: 得到当前应用程序的名称
调用: 无
被调用: AppFilter()、IsLenovoProcess()
输入: ULONG nSize 存放应用程序名称缓冲区大小
UCHAR IsOnlyName 是否取完整路径的标志
输出: char* buf 存放应用程序名称的缓冲区地址
返回值: 当前应用程序的名称
其他说明:
*************************************************************/
int GetProcessFileName(char* buf, ULONG nSize, UCHAR IsOnlyName)
{
PCWSTR pFullName = NULL;
int i, j;
/* 输入输出数据合法性检查 */
if(buf == 0 || nSize == 0)
return -1;
if((!IsOnlyName && nSize < 260) || nSize < 16)
return -1;
if(KeGetCurrentIrql() != PASSIVE_LEVEL)
{
strcpy(buf, "SYSTEM");
return 0;
}
/* 取得当前进程的名称 */
if(IsOnlyName)
{
char* pName = PsGetProcessName();
if(pName == NULL)
strcpy(buf, "SYSTEM");
else
strcpy(buf, pName);
return 0;
}
/* 取得应用程序的路径名称 */
pFullName = PsGetModuleFileNameW();
if(pFullName == NULL) //系统进程
{
char* pName = PsGetProcessName();
if(pName == NULL)
strcpy(buf, "SYSTEM");
else
strcpy(buf, pName);
return 0;
}
else //非系统进程
{
UNICODE_STRING usFileName;
ANSI_STRING asFileName;
RtlInitUnicodeString(&usFileName, pFullName);
asFileName.Length = 0;
asFileName.MaximumLength = 260;
asFileName.Buffer = buf;
RtlUnicodeStringToAnsiString(&asFileName, &usFileName, FALSE);
}
return 0;
}