Visual Studio 2013开发 mini-filter driver step by step 获取文件读写内容(6)
由于后面的內容跟Visual Studio已經沒有太大關系,故文章標題去掉Visual Studio前綴。
今天剛好在CSDN上讀到一篇文章《程序員都要有八塊腹肌》,所以要練好身體啊!其實我也想說,現代程序員要練好太極,才能以柔克剛,以一當十。
本文以獲取文件寫的內容為例,來探討怎樣獲取寫入的數據。
請先參考這個關于如何獲取數據buffer的文章
http://msdn.microsoft.com/en-us/library/windows/hardware/ff554436(v=vs.85).aspx
請看下面的源代碼獲取數據的兩種方式。
PFLT_FILE_NAME_INFORMATION file_name_info = NULL;
?status = FltGetFileNameInformation(Data, FLT_FILE_NAME_NORMALIZED | FLT_FILE_NAME_QUERY_DEFAULT, &file_name_info);
?if (NT_SUCCESS(status))
?{
??WCHAR *ssmfflag = L".ssmffile";
??SIZE_T len = sizeof(WCHAR) * wcslen(ssmfflag);
??if (file_name_info->Name.Length > wcslen(ssmfflag) &&
???RtlCompareMemory((char*)ssmfflag, (char *)((char *)file_name_info->Name.Buffer + file_name_info->Name.Length - len), len) == len)
??{
???PT_DBG_PRINT(PTDBG_TRACE_ROUTINES, ("The file name is %wZ,the offset is %u,len is %u", file_name_info->Name, iopb->Parameters.Write.ByteOffset, writeLen));
???
if (iopb->Parameters.Write.MdlAddress == NULL)
???{
????try
????{
?????RtlCopyMemory(buffer,
??????iopb->Parameters.Write.WriteBuffer,
??????min(writeLen, 90));
????}
????except(EXCEPTION_EXECUTE_HANDLER)
????{
?????PT_DBG_PRINT(PTDBG_TRACE_ROUTINES, (""Exception occurred.\n"));
????}
???}
???else
???{//這個是針對direct io的。
????PUCHAR buff = MmGetSystemAddressForMdlSafe(iopb->Parameters.Write.MdlAddress,
?????NormalPagePriority);
????PT_DBG_PRINT(PTDBG_TRACE_ROUTINES, ("MDL"));
????if (buff)
????{
?????RtlCopyMemory(buffer,
??????buff,
??????min(writeLen, 90));
?????
????}
???}
???PT_DBG_PRINT(PTDBG_TRACE_ROUTINES, ("The data is %s", buffer));
???
??}
??FltReleaseFileNameInformation(file_name_info);
?}
?return FLT_PREOP_SUCCESS_WITH_CALLBACK;
上面的這段代碼就是獲取寫入的數據并把前100個數據內容打印出來。
總結
以上是生活随笔為你收集整理的Visual Studio 2013开发 mini-filter driver step by step 获取文件读写内容(6)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Visual Studio 2013开发
- 下一篇: ADSL宽带为什么下载和上传速度差别如此