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; 
}