Windows: Create default Security Descriptor
[openafs.git] / src / WINNT / afsrdr / kernel / lib / AFSInit.cpp
1 /*
2  * Copyright (c) 2008, 2009, 2010, 2011 Kernel Drivers, LLC.
3  * Copyright (c) 2009, 2010, 2011 Your File System, Inc.
4  * All rights reserved.
5  *
6  * Redistribution and use in source and binary forms, with or without
7  * modification, are permitted provided that the following conditions
8  * are met:
9  *
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
13  *   notice,
14  *   this list of conditions and the following disclaimer in the
15  *   documentation
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.
21  *
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.
33  */
34
35 //
36 // File: AFSInit.cpp
37 //
38
39 #include "AFSCommon.h"
40
41 //
42 // DriverEntry
43 //
44 // This is the initial entry point for the driver.
45 //
46 // Inputs:
47 //  DriverObject        Pointer to Driver Object created by I/O manager
48 //  RegistryPath        Pointer to registry path representing this Driver
49 //
50 // Returns:
51 //  Success             To indicate Driver's inituaialization processing
52 //                      was successful
53 //  NT ERROR STATUS     Otherwise -- Driver does not remain loaded
54 //
55
56 NTSTATUS
57 DriverEntry( PDRIVER_OBJECT DriverObject,
58              PUNICODE_STRING RegistryPath)
59 {
60
61     NTSTATUS ntStatus = STATUS_SUCCESS;
62     AFSDeviceExt    *pDeviceExt;
63     ULONG ulTimeIncrement = 0;
64     UNICODE_STRING uniDeviceName;
65     ULONG ulIndex = 0;
66     UNICODE_STRING uniRoutine;
67     RTL_OSVERSIONINFOW sysVersion;
68
69     BOOLEAN bExit = FALSE;
70
71     __try
72     {
73
74         AFSPrint("AFSLibrary DriverEntry Initialization build %s:%s\n", __DATE__, __TIME__);
75
76         //
77         // Our backdoor to not let the driver load
78         //
79
80         if( bExit)
81         {
82
83             //
84             // Return a failure so we can update the binary and manually start it without
85             // having to do a reboot
86             //
87
88             try_return( ntStatus = STATUS_UNSUCCESSFUL);
89         }
90
91         //
92         // Perform some initialization
93         //
94
95         AFSLibraryDriverObject = DriverObject;
96
97         //
98         // Setup the registry string
99         //
100
101         AFSRegistryPath.MaximumLength = RegistryPath->MaximumLength;
102         AFSRegistryPath.Length        = RegistryPath->Length;
103
104         AFSRegistryPath.Buffer = (PWSTR)AFSLibExAllocatePoolWithTag( PagedPool,
105                                                                      AFSRegistryPath.Length,
106                                                                      AFS_GENERIC_MEMORY_13_TAG);
107
108         if( AFSRegistryPath.Buffer == NULL)
109         {
110
111             AFSPrint("AFS DriverEntry Failed to allocate registry path buffer\n");
112
113             try_return( ntStatus = STATUS_INSUFFICIENT_RESOURCES);
114         }
115
116         RtlCopyMemory( AFSRegistryPath.Buffer,
117                        RegistryPath->Buffer,
118                        RegistryPath->Length);
119
120         RtlZeroMemory( &sysVersion,
121                        sizeof( RTL_OSVERSIONINFOW));
122
123         sysVersion.dwOSVersionInfoSize = sizeof( RTL_OSVERSIONINFOW);
124
125         RtlGetVersion( &sysVersion);
126
127 #if 0
128         //
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.
137         //
138         //
139         // Only retrieve this function for Vista and above since
140         // Mandatory Labels only exist on those operating systems.
141         //
142
143         if( sysVersion.dwMajorVersion >= 6)
144         {
145             RtlInitUnicodeString( &uniRoutine,
146                                   L"RtlSetSaclSecurityDescriptor");
147
148             AFSRtlSetSaclSecurityDescriptor = (PAFSRtlSetSaclSecurityDescriptor)MmGetSystemRoutineAddress( &uniRoutine);
149         }
150 #endif
151         ntStatus = AFSCreateDefaultSecurityDescriptor();
152
153         if( !NT_SUCCESS( ntStatus))
154         {
155
156             AFSPrint("AFS DriverEntry  AFSCreateDefaultSecurityDescriptor failed Status %08lX\n", ntStatus);
157
158             ntStatus = STATUS_SUCCESS;
159         }
160
161         //
162         // Initilize the control device
163         //
164
165         RtlInitUnicodeString( &uniDeviceName,
166                               AFS_LIBRARY_CONTROL_DEVICE_NAME);
167
168         ntStatus = IoCreateDevice( DriverObject,
169                                    sizeof( AFSDeviceExt),
170                                    &uniDeviceName,
171                                    FILE_DEVICE_DISK_FILE_SYSTEM,
172                                    0,
173                                    FALSE,
174                                    &AFSLibraryDeviceObject);
175
176         if( !NT_SUCCESS( ntStatus))
177         {
178
179             AFSPrint("AFS DriverEntry - Failed to allocate device control object Status %08lX\n", ntStatus);
180
181             try_return( ntStatus);
182         }
183
184         //
185         // Setup the device extension
186         //
187
188         pDeviceExt = (AFSDeviceExt *)AFSLibraryDeviceObject->DeviceExtension;
189
190         //
191         // Now initialize the control device
192         //
193
194         ntStatus = AFSInitializeLibraryDevice();
195
196         if( !NT_SUCCESS( ntStatus))
197         {
198
199             try_return( ntStatus);
200         }
201
202         //
203         // Initialize the worker thread pool
204         //
205
206         ntStatus = AFSInitializeWorkerPool();
207
208         if( !NT_SUCCESS( ntStatus))
209         {
210
211             AFSPrint("AFS DriverEntry Failed to initialize worker pool Status %08lX\n", ntStatus);
212
213             try_return( ntStatus);
214         }
215
216         //
217         // Fill in the dispatch table
218         //
219
220         for( ulIndex = 0; ulIndex <= IRP_MJ_MAXIMUM_FUNCTION; ulIndex++)
221         {
222
223             DriverObject->MajorFunction[ ulIndex] = AFSDefaultDispatch;
224         }
225
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;
249
250         DriverObject->DriverUnload = AFSUnload;
251
252         AFSSysProcess = PsGetCurrentProcessId();
253
254 try_exit:
255
256         if( !NT_SUCCESS( ntStatus))
257         {
258
259             AFSPrint("AFSLibrary DriverEntry failed to initialize %08lX\n", ntStatus);
260
261             if( AFSLibraryDeviceObject != NULL)
262             {
263
264                 AFSRemoveWorkerPool();
265             }
266
267             if( AFSRegistryPath.Buffer != NULL)
268             {
269
270                 ExFreePool( AFSRegistryPath.Buffer);
271             }
272
273             if( AFSLibraryDeviceObject != NULL)
274             {
275
276                 AFSRemoveLibraryDevice();
277
278                 IoDeleteDevice( AFSLibraryDeviceObject);
279             }
280         }
281     }
282     __except( AFSExceptionFilter( GetExceptionCode(), GetExceptionInformation()) )
283     {
284
285         AFSPrint( "EXCEPTION - AFS DriverEntry\n");
286     }
287
288     return ntStatus;
289 }
290
291 void
292 AFSUnload( IN PDRIVER_OBJECT DriverObject)
293 {
294
295     if( AFSGlobalRoot != NULL)
296     {
297
298         AFSInvalidateVolume( AFSGlobalRoot,
299                              AFS_INVALIDATE_CALLBACK);
300
301         ClearFlag( AFSGlobalRoot->Flags, AFS_VOLUME_ACTIVE_GLOBAL_ROOT);
302
303         AFSShutdownVolumeWorker( AFSGlobalRoot);
304     }
305
306     if( AFSLibraryDeviceObject != NULL)
307     {
308
309         AFSRemoveWorkerPool();
310     }
311
312     if( AFSRegistryPath.Buffer != NULL)
313     {
314
315         ExFreePool( AFSRegistryPath.Buffer);
316     }
317
318     AFSCloseLibrary();
319
320     if( AFSDefaultSD != NULL)
321     {
322         ExFreePool( AFSDefaultSD);
323     }
324
325     if( AFSLibraryDeviceObject != NULL)
326     {
327
328         AFSRemoveLibraryDevice();
329
330         IoDeleteDevice( AFSLibraryDeviceObject);
331     }
332
333     return;
334 }