我有一个微型过滤器驱动程序,该驱动程序仅监视“重命名”和“已删除”文件,在Windows 10 1903生成之前,它可以正常工作。按照下面的代码。
现在,在Windows 10 1903和1909中,通过测试许多不同的KB,每次创建文件时,它都会调用FileRenameInformation。有什么我可以阻止它被调用或在请求中标识它正在创建文件而不是重命名的东西。
我的测试用例是右键单击将文件(1MB)复制并粘贴到受这些更改监视的目录中。
我还注意到(包括1903年以前)FileRenameInformation被多次调用以重命名文件,这正常吗?
FLT_PREOP_CALLBACK_STATUS PreOperationCallback(_Inout_
PFLT_CALLBACK_DATA Data,
_In_ PCFLT_RELATED_OBJECTS FltObjects,
_Flt_CompletionContext_Outptr_ PVOID* CompletionContext)
{
PFILE_RENAME_INFORMATION renameInfo;
//WCHAR buf[4096] = { 0 };
/* IRP-based I/O operation? */
if (FLT_IS_IRP_OPERATION(Data)) {
/* Open file? */
if (Data->Iopb->MajorFunction == IRP_MJ_CREATE) {
/* Open file for writing/appending? */
if (Data->Iopb->Parameters.Create.SecurityContext->DesiredAccess &
(FILE_WRITE_DATA | FILE_APPEND_DATA)) {
return TRUE;
}
} else if (Data->Iopb->MajorFunction == IRP_MJ_SET_INFORMATION) {
switch (Data->Iopb->Parameters.SetFileInformation.FileInformationClass) {
case FileDispositionInformation:
// deleting a file we need to action
if (((FILE_DISPOSITION_INFORMATION*) Data->Iopb->Parameters.SetFileInformation.InfoBuffer)->DeleteFile) {
return process_irp(Data, FltObjects, CompletionContext, FALSE, FALSE);
}
break;
case FileEndOfFileInformation:
case FileRenameInformation:
DbgPrint("Original file - '%wZ'", name_info->Name);
renameInfo = Data->Iopb->Parameters.SetFileInformation.InfoBuffer;
DbgPrint("Rename File info - '%ws'", renameInfo->FileName);
// Process the request according to our needs e.g copy the file
return process_irp(Data, FltObjects, CompletionContext, FALSE, TRUE);
}
}
}
return FLT_PREOP_SUCCESS_NO_CALLBACK;
}
答案 0 :(得分:0)
在switch语句上中断了-更改代码
case FileEndOfFileInformation:
case FileRenameInformation:
到
case FileEndOfFileInformation:
// fix as per RbMm comment on SO
break;
case FileRenameInformation: