2 * Copyright (c) 2008, 2009, 2010, 2011 Kernel Drivers, LLC.
3 * Copyright (c) 2009, 2010, 2011 Your File System, Inc.
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions
10 * - Redistributions of source code must retain the above copyright notice,
11 * this list of conditions and the following disclaimer.
12 * - Redistributions in binary form must reproduce the above copyright
14 * this list of conditions and the following disclaimer in the
16 * and/or other materials provided with the distribution.
17 * - Neither the names of Kernel Drivers, LLC and Your File System, Inc.
18 * nor the names of their contributors may be used to endorse or promote
19 * products derived from this software without specific prior written
20 * permission from Kernel Drivers, LLC and Your File System, Inc.
22 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
23 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
24 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
25 * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
26 * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
27 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
28 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
29 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
30 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
31 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
32 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
39 #include "AFSCommon.h"
44 // This is the initial entry point for the driver.
47 // DriverObject Pointer to Driver Object created by I/O manager
48 // RegistryPath Pointer to registry path representing this Driver
51 // Success To indicate Driver's inituaialization processing
53 // NT ERROR STATUS Otherwise -- Driver does not remain loaded
57 DriverEntry( PDRIVER_OBJECT DriverObject,
58 PUNICODE_STRING RegistryPath)
61 NTSTATUS ntStatus = STATUS_SUCCESS;
62 AFSDeviceExt *pDeviceExt;
63 ULONG ulTimeIncrement = 0;
64 UNICODE_STRING uniDeviceName;
66 UNICODE_STRING uniRoutine;
67 RTL_OSVERSIONINFOW sysVersion;
69 BOOLEAN bExit = FALSE;
74 AFSPrint("AFSLibrary DriverEntry Initialization build %s:%s\n", __DATE__, __TIME__);
77 // Our backdoor to not let the driver load
84 // Return a failure so we can update the binary and manually start it without
85 // having to do a reboot
88 try_return( ntStatus = STATUS_UNSUCCESSFUL);
92 // Perform some initialization
95 AFSLibraryDriverObject = DriverObject;
98 // Setup the registry string
101 AFSRegistryPath.MaximumLength = RegistryPath->MaximumLength;
102 AFSRegistryPath.Length = RegistryPath->Length;
104 AFSRegistryPath.Buffer = (PWSTR)AFSLibExAllocatePoolWithTag( PagedPool,
105 AFSRegistryPath.Length,
106 AFS_GENERIC_MEMORY_13_TAG);
108 if( AFSRegistryPath.Buffer == NULL)
111 AFSPrint("AFS DriverEntry Failed to allocate registry path buffer\n");
113 try_return( ntStatus = STATUS_INSUFFICIENT_RESOURCES);
116 RtlCopyMemory( AFSRegistryPath.Buffer,
117 RegistryPath->Buffer,
118 RegistryPath->Length);
120 RtlZeroMemory( &sysVersion,
121 sizeof( RTL_OSVERSIONINFOW));
123 sysVersion.dwOSVersionInfoSize = sizeof( RTL_OSVERSIONINFOW);
125 RtlGetVersion( &sysVersion);
129 // By not fetching the RtlSetSaclSecurityDescriptor function
130 // pointer it disables the additional of a mandatory label
131 // to the default acl which is returned by AFSRedir for all
132 // security information queries. The addition of the
133 // mandatory label appears to have a negative consequence
134 // for roaming profiles and redirected folders. All links
135 // become untrusted and IE9 is unable to open a new instance
136 // to a non-default home page.
139 // Only retrieve this function for Vista and above since
140 // Mandatory Labels only exist on those operating systems.
143 if( sysVersion.dwMajorVersion >= 6)
145 RtlInitUnicodeString( &uniRoutine,
146 L"RtlSetSaclSecurityDescriptor");
148 AFSRtlSetSaclSecurityDescriptor = (PAFSRtlSetSaclSecurityDescriptor)MmGetSystemRoutineAddress( &uniRoutine);
153 RtlInitUnicodeString( &uniRoutine,
154 L"RtlSetGroupSecurityDescriptor");
156 AFSRtlSetGroupSecurityDescriptor = (PAFSRtlSetGroupSecurityDescriptor)MmGetSystemRoutineAddress( &uniRoutine);
158 ntStatus = AFSCreateDefaultSecurityDescriptor();
160 if( !NT_SUCCESS( ntStatus))
163 AFSPrint("AFS DriverEntry AFSCreateDefaultSecurityDescriptor failed Status %08lX\n", ntStatus);
165 ntStatus = STATUS_SUCCESS;
169 // Initilize the control device
172 RtlInitUnicodeString( &uniDeviceName,
173 AFS_LIBRARY_CONTROL_DEVICE_NAME);
175 ntStatus = IoCreateDevice( DriverObject,
176 sizeof( AFSDeviceExt),
178 FILE_DEVICE_DISK_FILE_SYSTEM,
181 &AFSLibraryDeviceObject);
183 if( !NT_SUCCESS( ntStatus))
186 AFSPrint("AFS DriverEntry - Failed to allocate device control object Status %08lX\n", ntStatus);
188 try_return( ntStatus);
192 // Setup the device extension
195 pDeviceExt = (AFSDeviceExt *)AFSLibraryDeviceObject->DeviceExtension;
198 // Now initialize the control device
201 ntStatus = AFSInitializeLibraryDevice();
203 if( !NT_SUCCESS( ntStatus))
206 try_return( ntStatus);
210 // Initialize the worker thread pool
213 ntStatus = AFSInitializeWorkerPool();
215 if( !NT_SUCCESS( ntStatus))
218 AFSPrint("AFS DriverEntry Failed to initialize worker pool Status %08lX\n", ntStatus);
220 try_return( ntStatus);
224 // Fill in the dispatch table
227 for( ulIndex = 0; ulIndex <= IRP_MJ_MAXIMUM_FUNCTION; ulIndex++)
230 DriverObject->MajorFunction[ ulIndex] = AFSDefaultDispatch;
233 DriverObject->MajorFunction[IRP_MJ_CREATE] = AFSCreate;
234 DriverObject->MajorFunction[IRP_MJ_CLOSE] = AFSClose;
235 DriverObject->MajorFunction[IRP_MJ_READ] = AFSRead;
236 DriverObject->MajorFunction[IRP_MJ_WRITE] = AFSWrite;
237 DriverObject->MajorFunction[IRP_MJ_QUERY_INFORMATION] = AFSQueryFileInfo;
238 DriverObject->MajorFunction[IRP_MJ_SET_INFORMATION] = AFSSetFileInfo;
239 DriverObject->MajorFunction[IRP_MJ_QUERY_EA] = AFSQueryEA;
240 DriverObject->MajorFunction[IRP_MJ_SET_EA] = AFSSetEA;
241 DriverObject->MajorFunction[IRP_MJ_FLUSH_BUFFERS] = AFSFlushBuffers;
242 DriverObject->MajorFunction[IRP_MJ_QUERY_VOLUME_INFORMATION] = AFSQueryVolumeInfo;
243 DriverObject->MajorFunction[IRP_MJ_SET_VOLUME_INFORMATION] = AFSSetVolumeInfo;
244 DriverObject->MajorFunction[IRP_MJ_DIRECTORY_CONTROL] = AFSDirControl;
245 DriverObject->MajorFunction[IRP_MJ_FILE_SYSTEM_CONTROL] = AFSFSControl;
246 DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = AFSDevControl;
247 DriverObject->MajorFunction[IRP_MJ_INTERNAL_DEVICE_CONTROL] = AFSInternalDevControl;
248 DriverObject->MajorFunction[IRP_MJ_SHUTDOWN] = AFSShutdown;
249 DriverObject->MajorFunction[IRP_MJ_LOCK_CONTROL] = AFSLockControl;
250 DriverObject->MajorFunction[IRP_MJ_CLEANUP] = AFSCleanup;
251 DriverObject->MajorFunction[IRP_MJ_QUERY_SECURITY] = AFSQuerySecurity;
252 DriverObject->MajorFunction[IRP_MJ_SET_SECURITY] = AFSSetSecurity;
253 DriverObject->MajorFunction[IRP_MJ_SYSTEM_CONTROL] = AFSSystemControl;
254 //DriverObject->MajorFunction[IRP_MJ_QUERY_QUOTA] = AFSQueryQuota;
255 //DriverObject->MajorFunction[IRP_MJ_SET_QUOTA] = AFSSetQuota;
257 DriverObject->DriverUnload = AFSUnload;
259 AFSSysProcess = PsGetCurrentProcessId();
263 if( !NT_SUCCESS( ntStatus))
266 AFSPrint("AFSLibrary DriverEntry failed to initialize %08lX\n", ntStatus);
268 if( AFSLibraryDeviceObject != NULL)
271 AFSRemoveWorkerPool();
274 if( AFSRegistryPath.Buffer != NULL)
277 ExFreePool( AFSRegistryPath.Buffer);
280 if( AFSLibraryDeviceObject != NULL)
283 AFSRemoveLibraryDevice();
285 IoDeleteDevice( AFSLibraryDeviceObject);
289 __except( AFSExceptionFilter( GetExceptionCode(), GetExceptionInformation()) )
292 AFSPrint( "EXCEPTION - AFS DriverEntry\n");
299 AFSUnload( IN PDRIVER_OBJECT DriverObject)
302 if( AFSGlobalRoot != NULL)
305 AFSInvalidateVolume( AFSGlobalRoot,
306 AFS_INVALIDATE_CALLBACK);
308 ClearFlag( AFSGlobalRoot->Flags, AFS_VOLUME_ACTIVE_GLOBAL_ROOT);
310 AFSShutdownVolumeWorker( AFSGlobalRoot);
313 if( AFSLibraryDeviceObject != NULL)
316 AFSRemoveWorkerPool();
319 if( AFSRegistryPath.Buffer != NULL)
322 ExFreePool( AFSRegistryPath.Buffer);
327 if( AFSDefaultSD != NULL)
329 ExFreePool( AFSDefaultSD);
332 if( AFSLibraryDeviceObject != NULL)
335 AFSRemoveLibraryDevice();
337 IoDeleteDevice( AFSLibraryDeviceObject);