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
UDFCheckOtherFS(PDEVICE_OBJECT deviceObject)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
UDFCheckOtherFSByName(PCWSTR DeviceObjectName)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