你好我是新的过滤器驱动程序编程,我拿了windows swapBuffer示例,我尝试修改它以便为每个读/写操作打开文件名 并打印试图读/写的数据。
我尝试这样做:FLT_PREOP_CALLBACK_STATUS SwapPreWriteBuffers(
_Inout_ PFLT_CALLBACK_DATA Data,
_In_ PCFLT_RELATED_OBJECTS FltObjects,
_Flt_CompletionContext_Outptr_ PVOID *CompletionContext)
{
/* here we do some logic that check that we want to write more the
0 bytes and get volume context and allocate aligned nonPaged memory
for the "swapping memory" , build a MDL and then if all succeed i try this:
*/
WCHAR filename[300] = {0};
wfprintf(filename, "%wZ\0", Data->Iopb->TargetFileObject->FileName);
if (NULL != wcstr(filename, L"try_me.txt"))
{
DbgPrint("Fname %S try to write %S\n", filename, Data->Iopb->Parameters.Write.WriteBuffe);
}
}
我的主要问题(我认为)数据 - > Iopb-> TargetFileObject-> FileName是unicode,我不知道如何让这个和这个文件名字符串的比较
我的外部问题是如何将缓冲区当前打印到dbg字符串而不会冒蓝屏的风险? (我从他们那里得到了很多......)有时候我会在没有写字符串的情况下使用这个功能,我如何识别不同并安全地打印它?
最后一个问题,有没有办法尝试nake尝试除了驱动程序或所有故障都直接继续蓝屏?
谢谢
P.S。 这里是整个代码的链接(没有我写的添加内容(我在上面的帖子中列出)) https://github.com/Microsoft/Windows-driver-samples/blob/master/filesys/miniFilter/swapBuffers/swapBuffers.c
答案 0 :(得分:1)
文件名是IRP_MJ_CREATE的概念。你不能依赖irp_mj_write的名字或阅读。所以最好在创造中做到这一点。还尝试从FltObject获取名称 - > FileObject-> FileName它也可以为您提供所需的文件名,也可以使用其他名称。
要打印书面数据,您需要在minifilter中检查Irp标志,它来自Data-> Iopb-> IrpFlags,IRP_PAGING_IO如果是真的那么打印缓冲区使用 KdPrint((“....”));
是的,您可以使用try,驱动程序除外。
希望这可能会有所帮助。
:)