我有一个微型筛选器驱动程序,想要重命名文件,但我不确定如何获得新的文件名。我想通过与创建文件相同的标准来运行新文件名- IRP_MJ_CREATE。
我目前监控过滤器中的所有文件,并根据一组规则进行相应的移动。
我在上找到了一个关于取消重命名的链接,但不确定如何获得新的文件名。
链接为How to cancel a rename operation in minifilter driver
此时,我可以在case FileRenameInformation中获得现有的文件名,但我需要知道新的文件名信息是什么。
我尝试过使用:
PFILE_RENAME_INFORMATION renameInfo
Iopb->Parameters.SetFileInformation.InfoBuffer;在开关- FileRenameInformation中,但输出始终为空。
我的PreOperation回调如下:
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 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;
//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;
}发布于 2019-08-17 15:17:22
此问题存在于您需要使用%ws的DbgPrint中
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 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:
DbgPrint("Original file - '%wZ'", name_info->Name);
renameInfo = Data->Iopb->Parameters.SetFileInformation.InfoBuffer;
DbgPrint("Rename info length- '%u'", renameInfo->FileNameLength);
DbgPrint("Rename File info - '%ws'", renameInfo->FileName);
return process_irp(Data, FltObjects, CompletionContext, FALSE, TRUE);
}
}
}
return FLT_PREOP_SUCCESS_NO_CALLBACK;
}您可以调用get_file_name_information来获取上述代码中的原始文件位置,如下所示:
PFLT_FILE_NAME_INFORMATION name_info;
get_file_name_information(Data, &name_info);
//Release
FltReleaseFileNameInformation(name_info);现在有一个问题,rename->FileName的格式与name_info->Name不同
下面的示例将C:\temp\1.rtf重命名为C:\temp\12.rtf
DbgPrint("Original file - '%wZ'", name_info->Name);将采用以下格式:
\Device\HarddiskVolume4\Temp\1.rtf
其中作为
DbgPrint("Rename File info - '%ws'", renameInfo->FileName);将采用以下格式:
\??\C:\Temp\12.rtf
BOOLEAN get_file_name_information(PFLT_CALLBACK_DATA data,
PFLT_FILE_NAME_INFORMATION* name_info)
{
/* Get name information. */
if (NT_SUCCESS(FltGetFileNameInformation(
data,
FLT_FILE_NAME_NORMALIZED |
FLT_FILE_NAME_QUERY_ALWAYS_ALLOW_CACHE_LOOKUP,
name_info
))) {
/* Parse file name information. */
if (NT_SUCCESS(FltParseFileNameInformation(*name_info))) {
return TRUE;
}
FltReleaseFileNameInformation(*name_info);
#if OSVER(NTDDI_VERSION) > NTDDI_WIN2K
} else {
/*
* We couldn't get the "normalized" name, try to get the "opened"
* name.
*/
if (NT_SUCCESS(FltGetFileNameInformation(data,
FLT_FILE_NAME_OPENED |
FLT_FILE_NAME_QUERY_ALWAYS_ALLOW_CACHE_LOOKUP,
name_info
))) {
if (NT_SUCCESS(FltParseFileNameInformation(*name_info))) {
return TRUE;
}
FltReleaseFileNameInformation(*name_info);
}
#endif /* OSVER(NTDDI_VERSION) > NTDDI_WIN2K */
}
return FALSE;
}不确定这是否需要是Stack overflow上的另一篇文章,但如果有人知道如何将rename->FileName更改为与name_info->Name相同的格式/结构,他们可以更新答案吗?
https://stackoverflow.com/questions/57509144
复制相似问题