69,374
社区成员
发帖
与我相关
我的任务
分享
FLT_PREOP_CALLBACK_STATUS
FsFilter3PreCreate(
_Inout_ PFLT_CALLBACK_DATA Data,
_In_ PCFLT_RELATED_OBJECTS FltObjects,
_Flt_CompletionContext_Outptr_ PVOID *CompletionContext
)
/*++
Routine Description:
This routine is a pre-operation dispatch routine for this miniFilter.
This is non-pageable because it could be called on the paging path
Arguments:
Data - Pointer to the filter callbackData that is passed to us.
FltObjects - Pointer to the FLT_RELATED_OBJECTS data structure containing
opaque handles to this filter, instance, its associated volume and
file object.
CompletionContext - The context for the completion routine for this
operation.
Return Value:
The return value is the status of the operation.
--*/
{
NTSTATUS status;
UNREFERENCED_PARAMETER(FltObjects);
UNREFERENCED_PARAMETER(CompletionContext);
//PFLT_FILE_NAME_INFORMATION pinfo;
//BOOLEAN bMatchFound;
PFsFilter3_INSTANCE_CONTEXT pAIC = NULL;
BOOLEAN ucFlags=FALSE;
PAGED_CODE();
status = FltGetInstanceContext(Data->Iopb->TargetInstance, &pAIC);
if (!NT_SUCCESS(status))
return FLT_PREOP_SUCCESS_NO_CALLBACK;
//true代表是USB设备
ucFlags = pAIC->ucFlags;
if (pAIC != NULL)
FltReleaseContext(pAIC);
ULONG CreatePosition;
ULONG Position;
Position = Data->Iopb->Parameters.Create.Options;
CreatePosition = (Data->Iopb->Parameters.Create.Options >> 24) & 0xFF;
//拒绝USB操作
if (ucFlags && (CreatePosition == FILE_OPEN))
{
//拒绝文件操作
DbgPrint("pasthrough pre Create: access denied");
DbgPrint("%s", ucFlags == FALSE ? "FALSE" : "TRUE");
Data->IoStatus.Status = STATUS_ACCESS_DENIED;
Data->IoStatus.Information = 0;
return FLT_PREOP_COMPLETE;
}
else
{
return FLT_PREOP_SUCCESS_WITH_CALLBACK;
}
}