由于后面的内容跟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个数据内容打印出来。