Windows: RDR File System Framework driver
[openafs.git] / src / WINNT / afsrdr / kernel / fs / AFSSecurity.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: AFSSecurity.cpp
37 //
38
39 #include "AFSCommon.h"
40
41 NTSTATUS
42 AFSSetSecurity( IN PDEVICE_OBJECT DeviceObject,
43                 IN PIRP Irp)
44 {
45
46     NTSTATUS ntStatus = STATUS_NOT_SUPPORTED;
47     IO_STACK_LOCATION *pIrpSp;
48     AFSDeviceExt *pControlDeviceExt = (AFSDeviceExt *)AFSDeviceObject->DeviceExtension;
49
50     pIrpSp = IoGetCurrentIrpStackLocation( Irp);
51
52     __try
53     {
54
55         AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
56                       AFS_TRACE_LEVEL_VERBOSE,
57                       "AFSSetSecurity Entry for FO %08lX\n",
58                       pIrpSp->FileObject);
59
60         if( DeviceObject == AFSDeviceObject)
61         {
62
63             ntStatus = STATUS_INVALID_DEVICE_REQUEST;
64
65             AFSCompleteRequest( Irp,
66                                 ntStatus);
67
68             try_return( ntStatus);
69         }
70
71         if( pIrpSp->FileObject->FsContext == NULL)
72         {
73
74             //
75             // Root open
76             //
77
78             ntStatus = STATUS_INVALID_DEVICE_REQUEST;
79
80             AFSCompleteRequest( Irp,
81                                 ntStatus);
82
83             try_return( ntStatus);
84         }
85
86         //
87         // Check the state of the library
88         //
89
90         ntStatus = AFSCheckLibraryState( Irp);
91
92         if( !NT_SUCCESS( ntStatus) ||
93             ntStatus == STATUS_PENDING)
94         {
95
96             if( ntStatus != STATUS_PENDING)
97             {
98                 AFSCompleteRequest( Irp, ntStatus);
99             }
100
101             try_return( ntStatus);
102         }
103
104         IoSkipCurrentIrpStackLocation( Irp);
105
106         ntStatus = IoCallDriver( pControlDeviceExt->Specific.Control.LibraryDeviceObject,
107                                  Irp);
108
109         //
110         // Indicate the library is done with the request
111         //
112
113         AFSClearLibraryRequest();
114
115 try_exit:
116
117         NOTHING;
118     }
119     __except( AFSExceptionFilter( GetExceptionCode(), GetExceptionInformation()) )
120     {
121
122         AFSDbgLogMsg( 0,
123                       0,
124                       "EXCEPTION - AFSSetSecurity\n");
125     }
126
127     return ntStatus;
128 }
129
130 NTSTATUS
131 AFSQuerySecurity( IN PDEVICE_OBJECT DeviceObject,
132                   IN PIRP Irp)
133 {
134
135     NTSTATUS ntStatus = STATUS_NOT_SUPPORTED;
136     IO_STACK_LOCATION *pIrpSp;
137     AFSDeviceExt *pControlDeviceExt = (AFSDeviceExt *)AFSDeviceObject->DeviceExtension;
138
139     pIrpSp = IoGetCurrentIrpStackLocation( Irp);
140
141     __try
142     {
143
144         AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
145                       AFS_TRACE_LEVEL_VERBOSE,
146                       "AFSQuerySecurity Entry for FO %08lX\n",
147                       pIrpSp->FileObject);
148
149         if( DeviceObject == AFSDeviceObject)
150         {
151
152             ntStatus = STATUS_INVALID_DEVICE_REQUEST;
153
154             AFSCompleteRequest( Irp,
155                                 ntStatus);
156
157             try_return( ntStatus);
158         }
159
160         if( pIrpSp->FileObject->FsContext == NULL)
161         {
162
163             //
164             // Root open
165             //
166
167             ntStatus = STATUS_INVALID_DEVICE_REQUEST;
168
169             AFSCompleteRequest( Irp,
170                                 ntStatus);
171
172             try_return( ntStatus);
173         }
174
175         //
176         // Check the state of the library
177         //
178
179         ntStatus = AFSCheckLibraryState( Irp);
180
181         if( !NT_SUCCESS( ntStatus) ||
182             ntStatus == STATUS_PENDING)
183         {
184
185             if( ntStatus != STATUS_PENDING)
186             {
187                 AFSCompleteRequest( Irp, ntStatus);
188             }
189
190             try_return( ntStatus);
191         }
192
193         IoSkipCurrentIrpStackLocation( Irp);
194
195         ntStatus = IoCallDriver( pControlDeviceExt->Specific.Control.LibraryDeviceObject,
196                                  Irp);
197
198         //
199         // Indicate the library is done with the request
200         //
201
202         AFSClearLibraryRequest();
203
204 try_exit:
205
206         NOTHING;
207     }
208     __except( AFSExceptionFilter( GetExceptionCode(), GetExceptionInformation()) )
209     {
210
211         AFSDbgLogMsg( 0,
212                       0,
213                       "EXCEPTION - AFSQuerySecurity\n");
214     }
215
216     return ntStatus;
217 }