1 //////////////////////////////////////////////////////////////////// 2 // Copyright (C) Alexander Telyatnikov, Ivan Keliukh, Yegor Anchishkin, SKIF Software, 1999-2013. Kiev, Ukraine 3 // All rights reserved 4 // This file was released under the GPLv2 on June 2015. 5 //////////////////////////////////////////////////////////////////// 6 /* 7 8 Module Name: Filter.cpp 9 10 Abstract: 11 12 Contains code to handle register file system notification and attach to 13 CDFS if required. 14 15 Environment: 16 17 Kernel mode only 18 19 */ 20 21 #include "udffs.h" 22 23 // define the file specific bug-check id 24 #define UDF_BUG_CHECK_ID UDF_FILE_FILTER 25 26 VOID 27 UDFCheckOtherFS(PDEVICE_OBJECT deviceObject) { 28 PFILTER_DEV_EXTENSION FilterDevExt; 29 PDEVICE_OBJECT filterDeviceObject; 30 NTSTATUS RC; 31 32 // BrutePoint(); 33 34 // Acquire GlobalDataResource 35 UDFAcquireResourceExclusive(&(UDFGlobalData.GlobalDataResource), TRUE); 36 37 if (!NT_SUCCESS(RC = IoCreateDevice( 38 UDFGlobalData.DriverObject, // our driver object 39 sizeof(FILTER_DEV_EXTENSION), // don't need an extension 40 // for this object 41 NULL, // name - can be used to 42 // "open" the driver 43 // see the R.Nagar's book 44 // for alternate choices 45 FILE_DEVICE_CD_ROM_FILE_SYSTEM, 46 0, // no special characteristics 47 // do not want this as an 48 // exclusive device, though 49 // we might 50 FALSE, 51 &filterDeviceObject))) { 52 // failed to create a filter device object, leave ... 53 // Release the global resource. 54 UDFReleaseResource( &(UDFGlobalData.GlobalDataResource) ); 55 return; 56 } 57 FilterDevExt = (PFILTER_DEV_EXTENSION)filterDeviceObject->DeviceExtension; 58 // Zero it out (typically this has already been done by the I/O 59 // Manager but it does not hurt to do it again)! 60 RtlZeroMemory(FilterDevExt, sizeof(FILTER_DEV_EXTENSION)); 61 62 // Initialize the signature fields 63 FilterDevExt->NodeIdentifier.NodeType = UDF_NODE_TYPE_FILTER_DEVOBJ; 64 FilterDevExt->NodeIdentifier.NodeSize = sizeof(FILTER_DEV_EXTENSION); 65 66 UDFPrint(("UDFCheckOtherFS: Attaching filter devobj %x to FS devobj %x \n",filterDeviceObject,deviceObject)); 67 deviceObject = IoGetAttachedDevice( deviceObject ); 68 UDFPrint(("UDFCheckOtherFS: top devobj is %x \n",deviceObject)); 69 FilterDevExt->lowerFSDeviceObject = deviceObject; 70 71 RC = IoAttachDeviceByPointer( filterDeviceObject, deviceObject ); 72 if (!NT_SUCCESS(RC)) { 73 IoDeleteDevice( filterDeviceObject ); 74 } else { 75 filterDeviceObject->Flags &= ~DO_DEVICE_INITIALIZING; 76 } 77 // Release the global resource. 78 UDFReleaseResource( &(UDFGlobalData.GlobalDataResource) ); 79 } 80 81 VOID 82 UDFCheckOtherFSByName(PCWSTR DeviceObjectName) { 83 PFILE_OBJECT fileObject; 84 PDEVICE_OBJECT deviceObject; 85 UNICODE_STRING nameString; 86 NTSTATUS RC; 87 88 UDFPrint(("UDFCheckOtherFSByName: trying %s \n",DeviceObjectName)); 89 90 RtlInitUnicodeString( &nameString, DeviceObjectName ); 91 RC = IoGetDeviceObjectPointer( 92 &nameString, 93 FILE_READ_ATTRIBUTES, 94 &fileObject, 95 &deviceObject 96 ); 97 98 if (!NT_SUCCESS(RC)) { 99 UDFPrint(("UDFCheckOtherFSByName: error %x while calling IoGetDeviceObjectPointer \n",RC)); 100 return; 101 } 102 103 UDFCheckOtherFS(deviceObject); 104 105 ObDereferenceObject( fileObject ); 106 } 107 108 #if 0 109 VOID 110 NTAPI 111 UDFFsNotification( 112 IN PDEVICE_OBJECT DeviceObject, 113 IN BOOLEAN FsActive 114 ) 115 116 /* 117 118 Routine Description: 119 120 This routine is invoked whenever a file system has either registered or 121 unregistered itself as an active file system. 122 123 For the former case, this routine creates a device object and attaches it 124 to the specified file system's device object. This allows this driver 125 to filter all requests to that file system. 126 127 For the latter case, this file system's device object is located, 128 detached, and deleted. This removes this file system as a filter for 129 the specified file system. 130 131 Arguments: 132 133 DeviceObject - Pointer to the file system's device object. 134 135 FsActive - bolean indicating whether the file system has registered 136 (TRUE) or unregistered (FALSE) itself as an active file system. 137 138 Return Value: 139 140 None. 141 142 */ 143 144 { 145 // Begin by determine whether or not the file system is a cdrom-based file 146 // system. If not, then this driver is not concerned with it. 147 if (DeviceObject->DeviceType != FILE_DEVICE_CD_ROM_FILE_SYSTEM) { 148 return; 149 } 150 151 // Begin by determining whether this file system is registering or 152 // unregistering as an active file system. 153 if (FsActive) { 154 UDFPrint(("UDFFSNotification \n")); 155 UDFCheckOtherFS(DeviceObject); 156 } 157 } 158 #endif 159