C 无法使用Windows微筛选器驱动程序读取文件
我有一个基于示例Minivers的minifilter驱动程序 看, 我在用于读取输入文件的FltCreateFile上获得了一些文件的错误代码 我收到的错误代码是 -1073741757 0xC0000034 状态\u对象\u名称\u未找到 接着是另一次尝试 -1073741757 0xC0000043 状态共享违反 我不确定到哪里去或更改以解决问题。我已经查看了FltCreateFile的MSDN页面 看 不幸的是,记录的返回值与我收到的错误不匹配 在Windows101803上运行 我尝试过修改共享访问标志,但仍然会出现相同的错误 我已经做了更多的测试/调查,并决定在我的示例中监视minifilter中的单个目录C:\temp。我认为我的问题在于预操作回调,即何时调用复制文件。以下是我的术前准备C 无法使用Windows微筛选器驱动程序读取文件,c,windows,driver,C,Windows,Driver,我有一个基于示例Minivers的minifilter驱动程序 看, 我在用于读取输入文件的FltCreateFile上获得了一些文件的错误代码 我收到的错误代码是 -1073741757 0xC0000034 状态\u对象\u名称\u未找到 接着是另一次尝试 -1073741757 0xC0000043 状态共享违反 我不确定到哪里去或更改以解决问题。我已经查看了FltCreateFile的MSDN页面 看 不幸的是,记录的返回值与我收到的错误不匹配 在Windows101803上运行 我尝试
FLT_PREOP_CALLBACK_STATUS PreOperationCallback(_Inout_
PFLT_CALLBACK_DATA Data, _In_ PCFLT_RELATED_OBJECTS FltObjects,
_Flt_CompletionContext_Outptr_ PVOID* CompletionContext)
{
//PFILE_RENAME_INFORMATION renameInfo;
/* 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 process_irp(Data, FltObjects, CompletionContext, DEFERRED_IO, FALSE);
}
} else if (Data->Iopb->MajorFunction == IRP_MJ_SET_INFORMATION) {
switch (Data->Iopb->Parameters.SetFileInformation.FileInformationClass) {
case FileDispositionInformation:
if (((FILE_DISPOSITION_INFORMATION*) Data->Iopb->Parameters.SetFileInformation.InfoBuffer)->DeleteFile) {
return process_irp(Data, FltObjects, CompletionContext, FALSE, FALSE);
}
break;
case FileEndOfFileInformation:
case FileRenameInformation:
// //https://stackoverflow.com/questions/40564824/how-to-cancel-a-rename-operation-in-minifilter-driver
//renameInfo = Data->Iopb->Parameters.SetFileInformation.InfoBuffer;
//DbgPrint("Rename info length- '%u'", renameInfo->FileNameLength);
//memcpy(buf, renameInfo->FileName, renameInfo->FileNameLength);
//DbgPrint("Rename info - '%wZ'", renameInfo->FileName);
return process_irp(Data, FltObjects, CompletionContext, FALSE, TRUE);
}
}
}
return FLT_PREOP_SUCCESS_NO_CALLBACK;
}
当我右键单击temp目录并创建新的富文本文档时,或者如果我将文件复制到该目录中,就会出现上面列出的错误。在c:\temp中创建了一个新文件,我在调试器中收到错误。B.N-我尝试了不同大小写的不同文件,以确认我对文件名大小写没有问题
现在,如果我删除文件,我会得到正确的结果,这是通过
case FileDispositionInformation:
if (((FILE_DISPOSITION_INFORMATION*) Data->Iopb->Parameters.SetFileInformation.InfoBuffer)->DeleteFile) {
return process_irp(Data, FltObjects, CompletionContext, FALSE, FALSE);
}
break;
进程\u irp-检查文件并生成一个新的位置,将其移动到何处,然后在满足所有条件时调用copy\u文件
BOOLEAN copy_file(PFLT_FILTER filter,
PFLT_INSTANCE instance,
UNICODE_STRING* dest,
UNICODE_STRING* src)
{
HANDLE hInput, hOutput;
PFILE_OBJECT out;
OBJECT_ATTRIBUTES attr;
IO_STATUS_BLOCK io_status_block;
PVOID buf;
ULONGLONG filesize;
NTSTATUS status;
InitializeObjectAttributes(&attr,
src,
OBJ_CASE_INSENSITIVE | OBJ_KERNEL_HANDLE,
NULL,
NULL);
status = FltCreateFile(filter, /* Filter */
instance, /* Instance */
&hInput, /* FileHandle */
GENERIC_READ, /* DesiredAccess */
&attr, /* ObjectAttributes */
&io_status_block, /* IoStatusBlock */
NULL, /* AllocationSize */
FILE_ATTRIBUTE_NORMAL, /* FileAttributes */
FILE_SHARE_WRITE | FILE_SHARE_READ | FILE_SHARE_DELETE, /* ShareAccess */
FILE_OPEN, /* CreateDisposition */
FILE_SYNCHRONOUS_IO_NONALERT, /* CreateOptions */
NULL, /* EaBuffer */
0, /* EaLength */
IO_FORCE_ACCESS_CHECK); /* Flags */
if (!NT_SUCCESS(status)) {
DbgPrint("Could not create the file '%wZ' with STATUS '%d.\n' ",
dest,
status);
return FALSE;
}
}
抱歉,这是第一次用C语言编写并创建驱动程序,我已经尝试阅读了IRP,因为我认为问题就在这里。我的想法是,文件在执行时可能不存在,因此我得到了错误-我可能完全错了
任何帮助都将不胜感激。请在此处直接显示,而不是外部链接。更正了我以前的格式编辑,将
BOOL
更改为原始BOOLEAN
您可能希望至少显示调用代码,以便希望帮助的人了解您所做的工作,并且可以重现错误。(也就是说,按照第一条评论中提供的链接中的说明进行操作。只是在黑暗中拍摄,但您使用OBJ_不区分大小写的方法调用InitializeObjectAttributes
,您的UNICODE_STRING*src
大小写是否正确?不幸的是,OBJ_不区分大小写没有任何影响,我有一种感觉,这可能是需要的。)执行时执行。我已经做了更多的测试,因此将为问题添加更多细节。请在此处直接显示,而不是外部链接。更正了我以前的格式编辑,将BOOL
更改回原始BOOLEAN
您可能希望至少显示调用代码,以便I’我想帮助您了解一下您所做的工作,并重现错误。(也就是说,按照第一条评论中提供的链接中的说明进行操作。只是在黑暗中拍摄,但您使用OBJ_不区分大小写的方法调用InitializeObjectAttributes
,您的UNICODE_STRING*src
大小写是否正确?不幸的是,OBJ_不区分大小写没有任何影响,我有一种感觉,这可能是需要的。)我已经做了更多的测试,所以我会为这个问题添加更多的细节。