在进行windows驱动开发时,调试使用debugview虽然可以,但是有时想看整个运行流程。就需要将日志进行写文件进行存储在txt中,看了下资料。发现如何控制写文件的大小和文件个数。假如txt最大10M,个数不得超过五个。同时还有个问题。如果驱动在执行unload后,下一次如何记录上一次写日志已写的大小。这样已写的文件又是重新记录的,无法记录上一次文件中已写的日志文件大小。如何实现
15条回答 默认 最新
- Mr.小朱同学 2023-07-17 00:59关注
获得1.20元问题酬金 解决 无用评论 打赏 举报 - lilzutian 2023-07-17 03:49关注
在Windows驱动开发中,由于驱动程序的特殊性,需要采用一些特殊的方法来实现日志文件的写入、文件大小控制以及记录上一次写入位置等功能。下面我将为您提供一个基本的实现方案,用于控制写文件大小和文件个数,以及记录上一次写入位置。
控制文件大小和文件个数:
为了实现文件大小和个数的控制,您可以在驱动程序中维护一个全局变量或使用其他方法来跟踪当前文件大小和文件个数。当日志达到指定大小时,创建一个新的日志文件,并且在超过文件个数限制时,删除最旧的文件。以下是一个简化的示例:#define MAX_LOG_SIZE 10 * 1024 * 1024 // 10MB #define MAX_LOG_FILES 5 // 全局变量用于跟踪当前日志文件的大小和个数 ULONG currentLogSize = 0; ULONG currentLogFileIndex = 1; // 函数用于写入日志 void WriteToLogFile(const char* logMessage, ULONG logSize) { if (currentLogSize + logSize > MAX_LOG_SIZE) { // 如果超过了最大文件大小,创建新的日志文件 currentLogFileIndex++; currentLogSize = 0; // 关闭当前文件,打开新文件并写入日志 // ... } // 将日志写入当前日志文件 // ... currentLogSize += logSize; if (currentLogFileIndex > MAX_LOG_FILES) { // 如果超过了最大文件个数,删除最旧的日志文件 // ... } } 记录上一次写入位置: 由于驱动的unload后再次加载时不会保留上一次的运行状态,无法直接记录上一次写入位置。为了实现这一功能,您可以在驱动的unload时,将当前的写入位置信息保存在注册表或其他非易失性存储中,然后在驱动加载时从注册表中读取上一次的写入位置信息。 // 驱动unload时保存当前写入位置信息 void SaveLogPositionToRegistry() { // 将 currentLogFileIndex 和 currentLogSize 保存在注册表中 // ... } // 驱动加载时从注册表读取上一次的写入位置信息 void LoadLogPositionFromRegistry() { // 从注册表中读取上一次的 currentLogFileIndex 和 currentLogSize // ... } 在Windows驱动开发中,由于驱动程序的特殊性,需要采用一些特殊的方法来实现日志文件的写入、文件大小控制以及记录上一次写入位置等功能。下面我将为您提供一个基本的实现方案,用于控制写文件大小和文件个数,以及记录上一次写入位置。 控制文件大小和文件个数: 为了实现文件大小和个数的控制,您可以在驱动程序中维护一个全局变量或使用其他方法来跟踪当前文件大小和文件个数。当日志达到指定大小时,创建一个新的日志文件,并且在超过文件个数限制时,删除最旧的文件。以下是一个简化的示例: c Copy code #define MAX_LOG_SIZE 10 * 1024 * 1024 // 10MB #define MAX_LOG_FILES 5 // 全局变量用于跟踪当前日志文件的大小和个数 ULONG currentLogSize = 0; ULONG currentLogFileIndex = 1; // 函数用于写入日志 void WriteToLogFile(const char* logMessage, ULONG logSize) { if (currentLogSize + logSize > MAX_LOG_SIZE) { // 如果超过了最大文件大小,创建新的日志文件 currentLogFileIndex++; currentLogSize = 0; // 关闭当前文件,打开新文件并写入日志 // ... } // 将日志写入当前日志文件 // ... currentLogSize += logSize; if (currentLogFileIndex > MAX_LOG_FILES) { // 如果超过了最大文件个数,删除最旧的日志文件 // ... } } 记录上一次写入位置: 由于驱动的unload后再次加载时不会保留上一次的运行状态,无法直接记录上一次写入位置。为了实现这一功能,您可以在驱动的unload时,将当前的写入位置信息保存在注册表或其他非易失性存储中,然后在驱动加载时从注册表中读取上一次的写入位置信息。 c Copy code // 驱动unload时保存当前写入位置信息 void SaveLogPositionToRegistry() { // 将 currentLogFileIndex 和 currentLogSize 保存在注册表中 // ... } // 驱动加载时从注册表读取上一次的写入位置信息 void LoadLogPositionFromRegistry() { // 从注册表中读取上一次的 currentLogFileIndex 和 currentLogSize // ... } 在实际开发中可能需要考虑更多细节和异常情况的处理。同时,在驱动开发中,涉及文件操作和注册表访问等涉及系统资源的行为需要谨慎处理,以避免对系统稳定性产生负面影响。务必在进行驱动开发时仔细测试和验证您的代码。
解决 无用评论 打赏 举报 - 技术宅program 2023-07-17 05:44关注
获得0.60元问题酬金 解决 无用评论 打赏 举报 关注
获得1.35元问题酬金 不知道你这个问题是否已经解决, 如果还没有解决的话:- 以下回答来自chatgpt:
我将尝试回答你的问题。在Windows驱动中实现文件日志的大小和数量控制可以通过以下步骤实现:
- 首先,你需要在驱动中使用文件系统API打开和操作文件。你可以使用
ZwCreateFile
函数来创建或打开一个文件,使用ZwWriteFile
函数向文件写入日志内容。
```c HANDLE fileHandle; UNICODE_STRING fileName; OBJECT_ATTRIBUTES objAttr; IO_STATUS_BLOCK ioStatus; LARGE_INTEGER fileSize; CHAR logData[1024]; // 用于存储日志内容
RtlInitUnicodeString(&fileName, L"\??\C:\log.txt"); // 指定日志文件路径
InitializeObjectAttributes(&objAttr, &fileName, OBJ_CASE_INSENSITIVE, NULL, NULL);
// 创建或打开日志文件 status = ZwCreateFile(&fileHandle, SYNCHRONIZE | FILE_WRITE_DATA, &objAttr, &ioStatus, NULL, FILE_ATTRIBUTE_NORMAL, 0, FILE_CREATE, FILE_SYNCHRONOUS_IO_NONALERT, NULL, 0); ```
- 在写入日志之前,你可以使用
ZwQueryInformationFile
函数获取日志文件的当前大小。如果文件大小已经超过限制,你可以先关闭当前文件,然后创建一个新的日志文件。你可以使用ZwSetInformationFile
函数设置文件大小。
```c // 获取当前文件大小 ZwQueryInformationFile(fileHandle, &ioStatus, &fileSize, sizeof(fileSize), FileStandardInformation);
// 如果文件大小已经超过了限制 if (fileSize.QuadPart > 10 * 1024 * 1024) { // 关闭当前文件 ZwClose(fileHandle);
// 获取新文件名并创建新的日志文件 // ... // 如果超过了文件数量限制,你可能需要删除最旧的一个日志文件 // ...
} ```
- 当驱动执行
unload
时,你可以保存当前日志文件的大小,以便在下次加载时继续记录。
```c // 保存当前日志文件的大小 ZwQueryInformationFile(fileHandle, &ioStatus, &fileSize, sizeof(fileSize), FileStandardInformation);
// 保存文件大小到某个位置,比如驱动配置信息中 // ... ```
需要注意的是,以上代码片段仅供参考,具体实现可能需要根据你的需求做适当调整。
如果以上提示不能满足你的需求,我无法给出进一步的具体解决方案。请谅解。
- 首先,你需要在驱动中使用文件系统API打开和操作文件。你可以使用
如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^解决 无用评论 打赏 举报- 以下回答来自chatgpt:
- 「已注销」 2023-07-18 06:21关注解决 无用评论 打赏 举报
- yy64ll826 2023-07-20 01:20关注
获得0.60元问题酬金 解决 无用评论 打赏 举报yy64ll826 2023-07-20 01:20C语言实现写入日志文件
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <time.h> #ifdef WIN32 #include <windows.h> #else #include <unistd.h> // linux下头文件 #endif #define FILE_MAX_SIZE (1024*1024) /* 获得当前时间字符串 @param buffer [out]: 时间字符串 @return 空 */ void get_local_time(char* buffer) { time_t rawtime; struct tm* timeinfo; time(&rawtime); timeinfo = localtime(&rawtime); sprintf(buffer, "%04d-%02d-%02d %02d:%02d:%02d", (timeinfo->tm_year+1900), timeinfo->tm_mon, timeinfo->tm_mday, timeinfo->tm_hour, timeinfo->tm_min, timeinfo->tm_sec); } /* 获得文件大小 @param filename [in]: 文件名 @return 文件大小 */ long get_file_size(char* filename) { long length = 0; FILE *fp = NULL; fp = fopen(filename, "rb"); if (fp != NULL) { fseek(fp, 0, SEEK_END); length = ftell(fp); } if (fp != NULL) { fclose(fp); fp = NULL; } return length; } /* 写入日志文件 @param filename [in]: 日志文件名 @param max_size [in]: 日志文件大小限制 @param buffer [in]: 日志内容 @param buf_size [in]: 日志内容大小 @return 空 */ void write_log_file(char* filename, long max_size, char* buffer, unsigned buf_size) { if (filename != NULL && buffer != NULL) { // 文件超过最大限制, 删除 long length = get_file_size(filename); if (length > max_size) { unlink(filename); // 删除文件 } // 写日志 { FILE *fp; fp = fopen(filename, "at+"); if (fp != NULL) { char now[32]; memset(now, 0, sizeof(now)); get_local_time(now); fwrite(now, strlen(now)+1, 1, fp); fwrite(buffer, buf_size, 1, fp); fclose(fp); fp = NULL; } } } } int main(int argc, char** argv) { int i; for (i=0; i<10; ++i) { char buffer[32]; memset(buffer, 0, sizeof(buffer)); sprintf(buffer, "====> %d\n", i); write_log_file("log.txt", FILE_MAX_SIZE, buffer, strlen(buffer)); #ifdef WIN32 Sleep(100); // 毫秒 #else sleep(1); // 秒 #endif } // system("pause"); return 0; }
赞回复 - 阳光宅男xxb 2023-07-22 08:24关注
获得1.05元问题酬金 解决 无用评论 打赏 举报 - 竹山全栈 2023-07-23 13:44关注
获得0.45元问题酬金 解决 无用评论 打赏 举报 - 垄断的5心 2023-07-16 22:31关注
获得0.75元问题酬金 解决评论 打赏 举报无用 1 - 故事不长丨 2023-07-17 00:34关注解决评论 打赏 举报无用 1
- 玥轩_521 2023-07-17 01:36关注解决评论 打赏 举报无用 1
- Bert_2022 2023-07-17 02:37关注解决评论 打赏 举报无用 1
- Java毕设王 2023-07-17 05:24关注解决评论 打赏 举报无用 1
- 杨得江-君临天下wyj 2023-07-20 02:28关注解决评论 打赏 举报无用 1