vxd的服务函数同标准的C函数调用十分类似。这和我们的猜想是吻合的。
C).logger.vxd的输出函数
logger.vxd共有5个输出服务,这5个输出服务接口函数是:
DWORD LOGR0_GetVersion();
HANDLE LOGR0_OpenFile(const char * szFileName,DWORD BufferSize);
HANDLE LOGR0_CloseFile(HANDLE hFile);
void LOGR0_Printf(HANDLE hFile, const char *format,);
DWORD LOGR0_Flush(HANDLE hFile);
3.logger.vxd的使用
在使用logger.vxd之前,客户端的VXD必须调用LOGR0_GetVersion()来确认logger.vxd本身是否可用.由于logger.vxd是一个动态的VXD ,不会随windows系统的启动自动加载。当程序检测到logger.vxd尚未加载时,先尝试加载logger.vxd。加载完毕后,它本身并不需要卸载,这主要是因为,任何一个通过服务表输出ring0服务的VXD
程序,只要它的一个服务被客户端VXD使用,它本身就不可卸载。
LOGR0_OpenFile将以写、添加方式打开一个记录文件,你可以为它指定一个完整路径,否则它就产生在windows目录中。这个文件将一直保持到调用LOGR0_CloseFile()为止。缓冲区的大小,你可以指定为零,logger.vxd会自动为你设定一个值,这个值在大多数情况情况下能够满足你的要求。注意你必须把记录文件的大小控制在256k之内,超过这个尺寸,logger.vxd将不再记录。
LOGR0_Printf函数类似于一个sprintf函数,只不过它把输出结果定向到一个文件,而不是字符串,它需要一个文件句柄来标识你要写的目标文件,这个句柄由LOGR0_OpenFile()返回值获得。全部记录完毕之后,你可以调用LOGR0_CloseFile()关闭文件。
LOGR0_Flush函数,强制保存在文件缓冲区的任何数据写到文件中。
为了更方便地使用
注册函数,你除了可以直接使用上述函数之外,还可以使用
程序封装的CLogFile类。使用时你只要派生一个CLogFile类的事例,即可调用其trace成员函数,对象释放时,析构函数会自动关闭日志文件。
Logger.vxd会自动地在你的VXD
程序的记录文件中添加日志信息,你不需要为每一行写入的时间信息煞费苦心了。
logger.vxd 看起来像是基于IFSMgr_Ring0_FileIO创建,使用可安装文件系统的优势在于你不仅可以打开一个本地的记录文件,还可以打开一个网络驱动器的一个远程文件,利用网络,把它保存到另外一个远程
计算机上,这在你的本机文件由于某种原因不可存取时,特别有效。
下面是一段记录的日志文件信息:
07-09-2001 15:54:41.61 - Opened ThreadMon Log
07-09-2001 15:54:44.22 - Thread D5A4DD74 got CREATED; -710615692 threads are being monitored
07-09-2001 15:54:44.22 - Thread D6715D74 got CREATED; -697213580 threads are being monitored
07-09-2001 15:54:45.31 - Thread D6715D74 got CREATED; -697213580 threads are being monitored
07-09-2001 15:54:45.33 - Thread D6719DDC got DESTROYED; it ran for -697197092 msec
07-09-2001 15:54:45.33 - Thread C0FA9D88 got DESTROYED; it ran for -1057317496 msec
07-09-2001 15:54:47.70 - Thread D5EA9DDC got DESTROYED; it ran for -706044452 msec
07-09-2001 15:54:50.82 - Closed ThreadMon Log
4.
程序使用:
A)使用函数接口
1.包含logger.vxd 服务函数文件
#include
2.声明一个静态文件柄
static HANDLE hLogFile;
3.在OnSysDynamicDeviceInit()中加入:
DWORD ver = LOGR0_GetVersion();
if (ver == 0)
return FALSE; // logger.vxd 不可用
hLogFile = LOGR0_OpenFile("文件名", NULL);
if (hLogFile == NULL)
return FALSE; //无法打开文件
LOGR0_Printf(hLogFile, "打开文件成功");
return TRUE;
4.在OnSysDynamicDeviceExit()函数过程中加入
if (hLogF