mirror of
https://github.com/reactos/reactos.git
synced 2024-08-30 07:08:19 +00:00
159 lines
5 KiB
C++
159 lines
5 KiB
C++
////////////////////////////////////////////////////////////////////
|
|
// Copyright (C) Alexander Telyatnikov, Ivan Keliukh, Yegor Anchishkin, SKIF Software, 1999-2013. Kiev, Ukraine
|
|
// All rights reserved
|
|
// This file was released under the GPLv2 on June 2015.
|
|
////////////////////////////////////////////////////////////////////
|
|
/*
|
|
|
|
Module Name: Filter.cpp
|
|
|
|
Abstract:
|
|
|
|
Contains code to handle register file system notification and attach to
|
|
CDFS if required.
|
|
|
|
Environment:
|
|
|
|
Kernel mode only
|
|
|
|
*/
|
|
|
|
#include "udffs.h"
|
|
|
|
// define the file specific bug-check id
|
|
#define UDF_BUG_CHECK_ID UDF_FILE_FILTER
|
|
|
|
VOID
|
|
UDFCheckOtherFS(PDEVICE_OBJECT deviceObject) {
|
|
PFILTER_DEV_EXTENSION FilterDevExt;
|
|
PDEVICE_OBJECT filterDeviceObject;
|
|
NTSTATUS RC;
|
|
|
|
// BrutePoint();
|
|
|
|
// Acquire GlobalDataResource
|
|
UDFAcquireResourceExclusive(&(UDFGlobalData.GlobalDataResource), TRUE);
|
|
|
|
if (!NT_SUCCESS(RC = IoCreateDevice(
|
|
UDFGlobalData.DriverObject, // our driver object
|
|
sizeof(FILTER_DEV_EXTENSION), // don't need an extension
|
|
// for this object
|
|
NULL, // name - can be used to
|
|
// "open" the driver
|
|
// see the R.Nagar's book
|
|
// for alternate choices
|
|
FILE_DEVICE_CD_ROM_FILE_SYSTEM,
|
|
0, // no special characteristics
|
|
// do not want this as an
|
|
// exclusive device, though
|
|
// we might
|
|
FALSE,
|
|
&filterDeviceObject))) {
|
|
// failed to create a filter device object, leave ...
|
|
// Release the global resource.
|
|
UDFReleaseResource( &(UDFGlobalData.GlobalDataResource) );
|
|
return;
|
|
}
|
|
FilterDevExt = (PFILTER_DEV_EXTENSION)filterDeviceObject->DeviceExtension;
|
|
// Zero it out (typically this has already been done by the I/O
|
|
// Manager but it does not hurt to do it again)!
|
|
RtlZeroMemory(FilterDevExt, sizeof(FILTER_DEV_EXTENSION));
|
|
|
|
// Initialize the signature fields
|
|
FilterDevExt->NodeIdentifier.NodeType = UDF_NODE_TYPE_FILTER_DEVOBJ;
|
|
FilterDevExt->NodeIdentifier.NodeSize = sizeof(FILTER_DEV_EXTENSION);
|
|
|
|
UDFPrint(("UDFCheckOtherFS: Attaching filter devobj %x to FS devobj %x \n",filterDeviceObject,deviceObject));
|
|
deviceObject = IoGetAttachedDevice( deviceObject );
|
|
UDFPrint(("UDFCheckOtherFS: top devobj is %x \n",deviceObject));
|
|
FilterDevExt->lowerFSDeviceObject = deviceObject;
|
|
|
|
RC = IoAttachDeviceByPointer( filterDeviceObject, deviceObject );
|
|
if (!NT_SUCCESS(RC)) {
|
|
IoDeleteDevice( filterDeviceObject );
|
|
} else {
|
|
filterDeviceObject->Flags &= ~DO_DEVICE_INITIALIZING;
|
|
}
|
|
// Release the global resource.
|
|
UDFReleaseResource( &(UDFGlobalData.GlobalDataResource) );
|
|
}
|
|
|
|
VOID
|
|
UDFCheckOtherFSByName(PCWSTR DeviceObjectName) {
|
|
PFILE_OBJECT fileObject;
|
|
PDEVICE_OBJECT deviceObject;
|
|
UNICODE_STRING nameString;
|
|
NTSTATUS RC;
|
|
|
|
UDFPrint(("UDFCheckOtherFSByName: trying %s \n",DeviceObjectName));
|
|
|
|
RtlInitUnicodeString( &nameString, DeviceObjectName );
|
|
RC = IoGetDeviceObjectPointer(
|
|
&nameString,
|
|
FILE_READ_ATTRIBUTES,
|
|
&fileObject,
|
|
&deviceObject
|
|
);
|
|
|
|
if (!NT_SUCCESS(RC)) {
|
|
UDFPrint(("UDFCheckOtherFSByName: error %x while calling IoGetDeviceObjectPointer \n",RC));
|
|
return;
|
|
}
|
|
|
|
UDFCheckOtherFS(deviceObject);
|
|
|
|
ObDereferenceObject( fileObject );
|
|
}
|
|
|
|
#if 0
|
|
VOID
|
|
NTAPI
|
|
UDFFsNotification(
|
|
IN PDEVICE_OBJECT DeviceObject,
|
|
IN BOOLEAN FsActive
|
|
)
|
|
|
|
/*
|
|
|
|
Routine Description:
|
|
|
|
This routine is invoked whenever a file system has either registered or
|
|
unregistered itself as an active file system.
|
|
|
|
For the former case, this routine creates a device object and attaches it
|
|
to the specified file system's device object. This allows this driver
|
|
to filter all requests to that file system.
|
|
|
|
For the latter case, this file system's device object is located,
|
|
detached, and deleted. This removes this file system as a filter for
|
|
the specified file system.
|
|
|
|
Arguments:
|
|
|
|
DeviceObject - Pointer to the file system's device object.
|
|
|
|
FsActive - bolean indicating whether the file system has registered
|
|
(TRUE) or unregistered (FALSE) itself as an active file system.
|
|
|
|
Return Value:
|
|
|
|
None.
|
|
|
|
*/
|
|
|
|
{
|
|
// Begin by determine whether or not the file system is a cdrom-based file
|
|
// system. If not, then this driver is not concerned with it.
|
|
if (DeviceObject->DeviceType != FILE_DEVICE_CD_ROM_FILE_SYSTEM) {
|
|
return;
|
|
}
|
|
|
|
// Begin by determining whether this file system is registering or
|
|
// unregistering as an active file system.
|
|
if (FsActive) {
|
|
UDFPrint(("UDFFSNotification \n"));
|
|
UDFCheckOtherFS(DeviceObject);
|
|
}
|
|
}
|
|
#endif
|