So I’ve spent some time looking at the different inputs to my callback routine for processing IRP_MJ_CREATE, and I’m not finding any reference to the originating PID. I suspect this may not be available in the mini-filter, but I’m so new to driver development, I really don’t know. Can you comment on this?
I’m capture my IRP_MJ_CREATE event like this:
FLT_POSTOP_CALLBACK_STATUS
ScannerPostCreate (
__inout PFLT_CALLBACK_DATA Data,
__in PCFLT_RELATED_OBJECTS FltObjects,
__in_opt PVOID CompletionContext,
__in FLT_POST_OPERATION_FLAGS Flags
)
{
PSCANNER_STREAM_HANDLE_CONTEXT scannerContext;
FLT_POSTOP_CALLBACK_STATUS returnStatus = FLT_POSTOP_FINISHED_PROCESSING;
PFLT_FILE_NAME_INFORMATION nameInfo;
NTSTATUS status;
BOOLEAN safeToOpen, scanFile;
UNREFERENCED_PARAMETER( CompletionContext );
UNREFERENCED_PARAMETER( Flags );
if ( (FILE_OPENED & Data->IoStatus.Information) == FILE_OPENED)
{
if (Data->RequestorMode == UserMode)
{
//
// Check if we are interested in this file.
//
status = FltGetFileNameInformation( Data,
FLT_FILE_NAME_NORMALIZED |
FLT_FILE_NAME_QUERY_DEFAULT,
&nameInfo );
if (!NT_SUCCESS( status )) {
return FLT_POSTOP_FINISHED_PROCESSING;
}
FltParseFileNameInformation( nameInfo );
//
// Check if the extension matches the list of extensions we are interested in
//
if (RtlPrefixUnicodeString ( &TargetFolder, &nameInfo->ParentDir, TRUE ) == TRUE) {
scanFile = ScannerpCheckExtension( &nameInfo->Extension );
if (scanFile)
{
status = ScannerpSendFileNameInUserMode ( &nameInfo->Name, 3 );
}
}
//TODO : send file name to user app
FltReleaseFileNameInformation( nameInfo );
}
}
else if ( ( FILE_DELETE_ON_CLOSE & Data->IoStatus.Information) == FILE_DELETE_ON_CLOSE)
{
//
// Check if we are interested in this file.
//
status = FltGetFileNameInformation( Data,
FLT_FILE_NAME_NORMALIZED |
FLT_FILE_NAME_QUERY_DEFAULT,
&nameInfo );
if (!NT_SUCCESS( status )) {
return FLT_POSTOP_FINISHED_PROCESSING;
}
FltParseFileNameInformation( nameInfo );
//
// Check if the extension matches the list of extensions we are interested in
//
if (RtlPrefixUnicodeString ( &TargetFolder, &nameInfo->ParentDir, TRUE ) == TRUE) {
scanFile = ScannerpCheckExtension( &nameInfo->Extension );
if (scanFile)
{
status = ScannerpSendFileNameInUserMode ( &nameInfo->Name, 1 );
}
}
//TODO : send file name to user app
FltReleaseFileNameInformation( nameInfo );
}
return FLT_POSTOP_FINISHED_PROCESSING;
}