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);
151 ntStatus = AFSCreateDefaultSecurityDescriptor();
153 if( !NT_SUCCESS( ntStatus))
156 AFSPrint("AFS DriverEntry AFSCreateDefaultSecurityDescriptor failed Status %08lX\n", ntStatus);
158 ntStatus = STATUS_SUCCESS;
162 // Initilize the control device
165 RtlInitUnicodeString( &uniDeviceName,
166 AFS_LIBRARY_CONTROL_DEVICE_NAME);
168 ntStatus = IoCreateDevice( DriverObject,
169 sizeof( AFSDeviceExt),
171 FILE_DEVICE_DISK_FILE_SYSTEM,
174 &AFSLibraryDeviceObject);
176 if( !NT_SUCCESS( ntStatus))
179 AFSPrint("AFS DriverEntry - Failed to allocate device control object Status %08lX\n", ntStatus);
181 try_return( ntStatus);
185 // Setup the device extension
188 pDeviceExt = (AFSDeviceExt *)AFSLibraryDeviceObject->DeviceExtension;
191 // Now initialize the control device
194 ntStatus = AFSInitializeLibraryDevice();
196 if( !NT_SUCCESS( ntStatus))
199 try_return( ntStatus);
203 // Initialize the worker thread pool
206 ntStatus = AFSInitializeWorkerPool();
208 if( !NT_SUCCESS( ntStatus))
211 AFSPrint("AFS DriverEntry Failed to initialize worker pool Status %08lX\n", ntStatus);
213 try_return( ntStatus);
217 // Fill in the dispatch table
220 for( ulIndex = 0; ulIndex <= IRP_MJ_MAXIMUM_FUNCTION; ulIndex++)
223 DriverObject->MajorFunction[ ulIndex] = AFSDefaultDispatch;
226 DriverObject->MajorFunction[IRP_MJ_CREATE] = AFSCreate;
227 DriverObject->MajorFunction[IRP_MJ_CLOSE] = AFSClose;
228 DriverObject->MajorFunction[IRP_MJ_READ] = AFSRead;
229 DriverObject->MajorFunction[IRP_MJ_WRITE] = AFSWrite;
230 DriverObject->MajorFunction[IRP_MJ_QUERY_INFORMATION] = AFSQueryFileInfo;
231 DriverObject->MajorFunction[IRP_MJ_SET_INFORMATION] = AFSSetFileInfo;
232 DriverObject->MajorFunction[IRP_MJ_QUERY_EA] = AFSQueryEA;
233 DriverObject->MajorFunction[IRP_MJ_SET_EA] = AFSSetEA;
234 DriverObject->MajorFunction[IRP_MJ_FLUSH_BUFFERS] = AFSFlushBuffers;
235 DriverObject->MajorFunction[IRP_MJ_QUERY_VOLUME_INFORMATION] = AFSQueryVolumeInfo;
236 DriverObject->MajorFunction[IRP_MJ_SET_VOLUME_INFORMATION] = AFSSetVolumeInfo;
237 DriverObject->MajorFunction[IRP_MJ_DIRECTORY_CONTROL] = AFSDirControl;
238 DriverObject->MajorFunction[IRP_MJ_FILE_SYSTEM_CONTROL] = AFSFSControl;
239 DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = AFSDevControl;
240 DriverObject->MajorFunction[IRP_MJ_INTERNAL_DEVICE_CONTROL] = AFSInternalDevControl;
241 DriverObject->MajorFunction[IRP_MJ_SHUTDOWN] = AFSShutdown;
242 DriverObject->MajorFunction[IRP_MJ_LOCK_CONTROL] = AFSLockControl;
243 DriverObject->MajorFunction[IRP_MJ_CLEANUP] = AFSCleanup;
244 DriverObject->MajorFunction[IRP_MJ_QUERY_SECURITY] = AFSQuerySecurity;
245 DriverObject->MajorFunction[IRP_MJ_SET_SECURITY] = AFSSetSecurity;
246 DriverObject->MajorFunction[IRP_MJ_SYSTEM_CONTROL] = AFSSystemControl;
247 //DriverObject->MajorFunction[IRP_MJ_QUERY_QUOTA] = AFSQueryQuota;
248 //DriverObject->MajorFunction[IRP_MJ_SET_QUOTA] = AFSSetQuota;
250 DriverObject->DriverUnload = AFSUnload;
252 AFSSysProcess = PsGetCurrentProcessId();
256 if( !NT_SUCCESS( ntStatus))
259 AFSPrint("AFSLibrary DriverEntry failed to initialize %08lX\n", ntStatus);
261 if( AFSLibraryDeviceObject != NULL)
264 AFSRemoveWorkerPool();
267 if( AFSRegistryPath.Buffer != NULL)
270 ExFreePool( AFSRegistryPath.Buffer);
273 if( AFSLibraryDeviceObject != NULL)
276 AFSRemoveLibraryDevice();
278 IoDeleteDevice( AFSLibraryDeviceObject);
282 __except( AFSExceptionFilter( GetExceptionCode(), GetExceptionInformation()) )
285 AFSPrint( "EXCEPTION - AFS DriverEntry\n");
292 AFSUnload( IN PDRIVER_OBJECT DriverObject)
295 if( AFSGlobalRoot != NULL)
298 AFSInvalidateVolume( AFSGlobalRoot,
299 AFS_INVALIDATE_CALLBACK);
301 ClearFlag( AFSGlobalRoot->Flags, AFS_VOLUME_ACTIVE_GLOBAL_ROOT);
303 AFSShutdownVolumeWorker( AFSGlobalRoot);
306 if( AFSLibraryDeviceObject != NULL)
309 AFSRemoveWorkerPool();
312 if( AFSRegistryPath.Buffer != NULL)
315 ExFreePool( AFSRegistryPath.Buffer);
320 if( AFSDefaultSD != NULL)
322 ExFreePool( AFSDefaultSD);
325 if( AFSLibraryDeviceObject != NULL)
328 AFSRemoveLibraryDevice();
330 IoDeleteDevice( AFSLibraryDeviceObject);