2 * Copyright (c) 2008-2011 Kernel Drivers, LLC.
3 * Copyright (c) 2009-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 name of Kernel Drivers, LLC nor the names of its
19 * used to endorse or promote products derived from this software without
20 * specific prior written permission from Kernel Drivers, LLC
21 * and Your File System, Inc.
23 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
24 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
25 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
26 * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
27 * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
28 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
29 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
30 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
31 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
32 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
33 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
36 #ifndef _AFS_USER_DEFINE_H
37 #define _AFS_USER_DEFINE_H
43 #define AFS_SYMLINK "\\\\.\\AFSRedirector"
44 #define AFS_SYMLINK_W L"\\\\.\\AFSRedirector"
46 #define AFS_PIOCTL_FILE_INTERFACE_NAME L"_._AFS_IOCTL_._"
47 #define AFS_GLOBAL_ROOT_SHARE_NAME L"ALL"
50 // Payload buffer length
53 #define AFS_PAYLOAD_BUFFER_SIZE (16 * 1024)
60 #define AFS_REQUEST_TYPE_DIR_ENUM 0x00000001
61 #define AFS_REQUEST_TYPE_CREATE_FILE 0x00000002
62 #define AFS_REQUEST_TYPE_REQUEST_FILE_EXTENTS 0x00000003
63 #define AFS_REQUEST_TYPE_RELEASE_FILE_EXTENTS 0x00000004
64 #define AFS_REQUEST_TYPE_UPDATE_FILE 0x00000005
65 #define AFS_REQUEST_TYPE_DELETE_FILE 0x00000006
66 #define AFS_REQUEST_TYPE_RENAME_FILE 0x00000007
67 #define AFS_REQUEST_TYPE_FLUSH_FILE 0x00000008
68 #define AFS_REQUEST_TYPE_OPEN_FILE 0x00000009
69 #define AFS_REQUEST_TYPE_EVAL_TARGET_BY_ID 0x0000000A
70 #define AFS_REQUEST_TYPE_EVAL_TARGET_BY_NAME 0x0000000B
71 #define AFS_REQUEST_TYPE_PIOCTL_READ 0x0000000C
72 #define AFS_REQUEST_TYPE_PIOCTL_WRITE 0x0000000D
73 #define AFS_REQUEST_TYPE_PIOCTL_OPEN 0x0000000E
74 #define AFS_REQUEST_TYPE_PIOCTL_CLOSE 0x0000000F
75 #define AFS_REQUEST_TYPE_BYTE_RANGE_LOCK 0x00000010 // Takes AFSByteRangeLockRequestCB as INPUT
76 #define AFS_REQUEST_TYPE_BYTE_RANGE_UNLOCK 0x00000011 // Takes AFSByteRangeUnlockRequestCB as INPUT
77 #define AFS_REQUEST_TYPE_BYTE_RANGE_UNLOCK_ALL 0x00000012 // Takes AFSByteRangeUnlockRequestCB as INPUT
78 #define AFS_REQUEST_TYPE_GET_VOLUME_INFO 0x00000013
79 #define AFS_REQUEST_TYPE_HOLD_FID 0x00000014
80 #define AFS_REQUEST_TYPE_RELEASE_FID 0x00000015
81 #define AFS_REQUEST_TYPE_PIPE_TRANSCEIVE 0x00000016
82 #define AFS_REQUEST_TYPE_PIPE_READ 0x00000017
83 #define AFS_REQUEST_TYPE_PIPE_WRITE 0x00000018
84 #define AFS_REQUEST_TYPE_PIPE_OPEN 0x00000019
85 #define AFS_REQUEST_TYPE_PIPE_CLOSE 0x0000001A
86 #define AFS_REQUEST_TYPE_PIPE_QUERY_INFO 0x0000001B
87 #define AFS_REQUEST_TYPE_PIPE_SET_INFO 0x0000001C
88 #define AFS_REQUEST_TYPE_CLEANUP_PROCESSING 0x0000001D
89 #define AFS_REQUEST_TYPE_CREATE_LINK 0x0000001E
90 #define AFS_REQUEST_TYPE_CREATE_MOUNTPOINT 0x0000001F
91 #define AFS_REQUEST_TYPE_CREATE_SYMLINK 0x00000020
92 #define AFS_REQUEST_TYPE_RELEASE_FILE_ACCESS 0x00000021
93 #define AFS_REQUEST_TYPE_GET_VOLUME_SIZE_INFO 0x00000022
94 #define AFS_REQUEST_TYPE_HARDLINK_FILE 0x00000023
95 #define AFS_REQUEST_TYPE_PROCESS_READ_FILE 0x00000024
96 #define AFS_REQUEST_TYPE_PROCESS_WRITE_FILE 0x00000025
99 // Request Flags, these are passed up from the file system
102 #define AFS_REQUEST_FLAG_SYNCHRONOUS 0x00000001 // The service must call back through the
103 // IOCTL_AFS_PROCESS_IRP_RESULT IOCtl to ack
104 // the request with a response. The absense of
105 // this flag indicates no call should be made to
106 // the IOCTL_AFS_PROCESS_IRP_RESULT IOCtl and if a
107 // response is required for the call it is to be made
108 // through an IOCtl call
110 #define AFS_REQUEST_FLAG_CASE_SENSITIVE 0x00000002
112 #define AFS_REQUEST_FLAG_WOW64 0x00000004 // On 64-bit systems, set if the request
113 // originated from a WOW64 process
115 #define AFS_REQUEST_FLAG_FAST_REQUEST 0x00000008 // if this flag is set, the cache manager
116 // responds to the request using a minimum
117 // of file server interaction
119 #define AFS_REQUEST_FLAG_HOLD_FID 0x00000010 // if this flag is set, the cache manager
120 // maintains a reference count on the
121 // evaluated file object just as if
122 // AFS_REQUEST_TYPE_HOLD_FID was issued.
123 // The reference count must be released
124 // using AFS_REQUEST_TYPE_RELEASE_FID.
125 // This flag is only valid on
126 // AFS_REQUEST_TYPE_EVALUATE_BY_NAME,
127 // AFS_REQUEST_TYPE_EVALUATE_BY_ID,
128 // AFS_REQUEST_TYPE_CREATE_FILE, and
129 // AFS_REQUEST_TYPE_OPEN_FILE.
131 #define AFS_REQUEST_FLAG_FLUSH_FILE 0x00000020 // Passed as a flag to the AFS_REQUEST_TYPE_CLEANUP_PROCESSING
132 // request when the last handle is closed. This flag tells the
133 // to flush all dirty data before returning.
135 #define AFS_REQUEST_FLAG_FILE_DELETED 0x00000040 // Passed as a flag to the AFS_REQUEST_TYPE_CLEANUP_PROCESSING
136 // request to indicate the file has been marked for deletion.
138 #define AFS_REQUEST_FLAG_BYTE_RANGE_UNLOCK_ALL 0x00000080 // Passed as a flag to the AFS_REQUEST_TYPE_CLEANUP_PROCESSING
139 // request to indicate to release all BR locks on the file for the
142 #define AFS_REQUEST_FLAG_CHECK_ONLY 0x00000100 // Do not perform the action, just check if the action is possible
143 // Only used with AFS_REQUEST_TYPE_DELETE_FILE.
145 #define AFS_REQUEST_LOCAL_SYSTEM_PAG 0x00000200 // Indicates that the caller is or was at some point a system
148 #define AFS_REQUEST_FLAG_CACHE_BYPASS 0x00000400 // Indicates that the AFS_REQUEST_TYPE_PROCESS_READ_FILE or
149 // AFS_REQUEST_TYPE_PROCESS_WRITE_FILE is to be performed directly
150 // against the file server bypassing the AFS Cache file.
152 #define AFS_REQUEST_FLAG_LAST_COMPONENT 0x00000800 // During an AFS_REQUEST_TYPE_TARGET_BY_NAME the provided name
153 // is the last component in the path.
156 // Request Flags, these are passed down from the sevice
159 #define AFS_REQUEST_RELEASE_THREAD 0x00000001 // Set on threads which are dedicated extent release threads
162 // Status codes that can returned for various requests
165 #if !defined(AFS_KERNEL_MODE) && !defined(STATUS_SUCCESS)
167 #define STATUS_SUCCESS 0x00000000
168 #define STATUS_MORE_ENTRIES 0x00000105
169 #define STATUS_NO_MORE_FILES 0x80000006
177 #define AFS_TRACE_LEVEL_ERROR 0x00000001
178 #define AFS_TRACE_LEVEL_WARNING 0x00000002
179 #define AFS_TRACE_LEVEL_VERBOSE 0x00000003
180 #define AFS_TRACE_LEVEL_VERBOSE_2 0x00000004
181 #define AFS_TRACE_LEVEL_MAXIMUM 0x00000004
184 // Trace Subsystem Classes
187 #define AFS_SUBSYSTEM_IO_PROCESSING 0x00000001 // Includes IO subsystem
188 #define AFS_SUBSYSTEM_FILE_PROCESSING 0x00000002 // Includes Fcb and name processing
189 #define AFS_SUBSYSTEM_LOCK_PROCESSING 0x00000004 // All lock processing, level must be set to VERBOSE
190 #define AFS_SUBSYSTEM_EXTENT_PROCESSING 0x00000008 // Specific extent processing
191 #define AFS_SUBSYSTEM_WORKER_PROCESSING 0x00000010 // All worker processing
192 #define AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING 0x00000020 // Reference counting directory entries
193 #define AFS_SUBSYSTEM_OBJECT_REF_COUNTING 0x00000040 // Reference counting objects
194 #define AFS_SUBSYSTEM_VOLUME_REF_COUNTING 0x00000080 // Reference counting volumes
195 #define AFS_SUBSYSTEM_FCB_REF_COUNTING 0x00000100 // Reference counting fcbs
196 #define AFS_SUBSYSTEM_CLEANUP_PROCESSING 0x00000200 // Garbage collection of objects, dir entries, fcbs, etc.
197 #define AFS_SUBSYSTEM_PIPE_PROCESSING 0x00000400 // Pipe and share processing
198 #define AFS_SUBSYSTEM_DIR_NOTIF_PROCESSING 0x00000800 // Directory notification interface
199 #define AFS_SUBSYSTEM_NETWORK_PROVIDER 0x00001000 // Network provier interactions
200 #define AFS_SUBSYSTEM_DIR_NODE_COUNT 0x00002000 // Dir node count processing
201 #define AFS_SUBSYSTEM_PIOCTL_PROCESSING 0x00004000 // PIOCtl processing
202 #define AFS_SUBSYSTEM_AUTHGROUP_PROCESSING 0x00008000 // Auth group creation/assignment
203 #define AFS_SUBSYSTEM_LOAD_LIBRARY 0x00010000 // Library load and unload, request queuing
204 #define AFS_SUBSYSTEM_PROCESS_PROCESSING 0x00020000 // Process creation and destruction
205 #define AFS_SUBSYSTEM_EXTENT_ACTIVE_COUNTING 0x00040000 // Extent Active Counts
206 #define AFS_SUBSYSTEM_INIT_PROCESSING 0x00080000 // Redirector Initialization
207 #define AFS_SUBSYSTEM_NAME_ARRAY_PROCESSING 0x00100000 // Name Array Processing
208 #define AFS_SUBSYSTEM_NAME_ARRAY_REF_COUNTING 0x00200000 // Name Array DirectoryCB refcnts
209 #define AFS_SUBSYSTEM_FCB_ALLOCATION 0x01000000 // AFSFileCB Allocation
210 #define AFS_SUBSYSTEM_DIRENTRY_ALLOCATION 0x02000000 // AFSDirectoryCB Allocation
211 #define AFS_SUBSYSTEM_OBJINFO_ALLOCATION 0x04000000 // AFSObjectInformationCB Allocation
214 // Invalidation Reasons
217 #define AFS_INVALIDATE_EXPIRED 1 /* Set RE_VALIDATE */
218 #define AFS_INVALIDATE_FLUSHED 2 /* Set RE-VALIDATE */
219 #define AFS_INVALIDATE_CALLBACK 3 /* Set VERIFY Reset dir enumeration */
220 #define AFS_INVALIDATE_SMB 4 /* Set VERIFY Reset dir enumeration */
221 #define AFS_INVALIDATE_CREDS 5 /* Set VERIFY - User credentials changed */
222 #define AFS_INVALIDATE_DATA_VERSION 6 /* Set VERIFY */
223 #define AFS_INVALIDATE_DELETED 7 /* Requires top level locks */
226 // Flags which can be specified for each extent in the AFSFileExtentCB structure
229 #define AFS_EXTENT_FLAG_DIRTY 1 // The specified extent requires flushing, this can be
230 // specified by the file system during a release of the
233 #define AFS_EXTENT_FLAG_RELEASE 2 // The presence of this flag during a AFS_REQUEST_TYPE_RELEASE_FILE_EXTENTS
234 // call from the file system indicates to the service that the file system
235 // no longer requires the extents and they can be completely released. The
236 // absense of this flag tells the service that the extent should not be
237 // dereferenced; this is usually the case when the file system tells the
238 // service to flush a range of exents but do not release them
240 #define AFS_EXTENT_FLAG_CLEAN 4 // The presence of this flag during a AFS_REQUEST_TYPE_REQUEST_FILE_EXTENTS
241 // call from the file system indicates to the server that the file system
242 // is going to completely overwrite the contents of the extent and the
243 // service should therefore not bother to obtain the current version
244 // from the file server.
246 #define AFS_EXTENT_FLAG_FLUSH 8 // The presence of this flag indicates that the service should perform
247 // the equivalent of a FLUSH ioctl on the file after processing the
250 #define AFS_EXTENT_FLAG_IN_USE 0x10 // The extent is currenty in use by the fs and cannot be released
252 #define AFS_EXTENT_FLAG_UNKNOWN 0x20 // The extent is unknown to the fs
254 #define AFS_EXTENT_FLAG_MD5_SET 0x40 // The extent MD5 field has been set
257 // Volume Information Characteristics
260 #ifndef AFS_KERNEL_MODE
262 #define FILE_REMOVABLE_MEDIA 0x00000001
263 #define FILE_READ_ONLY_DEVICE 0x00000002
264 #define FILE_REMOTE_DEVICE 0x00000010
270 #define FILE_ATTRIBUTE_READONLY 0x00000001 // winnt
271 #define FILE_ATTRIBUTE_HIDDEN 0x00000002 // winnt
272 #define FILE_ATTRIBUTE_SYSTEM 0x00000004 // winnt
274 #define FILE_ATTRIBUTE_DIRECTORY 0x00000010 // winnt
275 #define FILE_ATTRIBUTE_ARCHIVE 0x00000020 // winnt
276 #define FILE_ATTRIBUTE_DEVICE 0x00000040 // winnt
277 #define FILE_ATTRIBUTE_NORMAL 0x00000080 // winnt
280 // Filesystem attributes
283 #define FILE_CASE_PRESERVED_NAMES 0x00000002 // winnt
284 #define FILE_UNICODE_ON_DISK 0x00000004 // winnt
285 #define FILE_PERSISTENT_ACLS 0x00000008 // winnt
286 #define FILE_VOLUME_QUOTAS 0x00000020 // winnt
287 #define FILE_SUPPORTS_REPARSE_POINTS 0x00000080 // winnt
288 #define FILE_SUPPORTS_OBJECT_IDS 0x00010000 // winnt
289 #define FILE_SUPPORTS_HARD_LINKS 0x00400000 // winnt
297 #define AFS_FILE_TYPE_UNKNOWN 0 /* an unknown object */
298 #define AFS_FILE_TYPE_FILE 1 /* a file */
299 #define AFS_FILE_TYPE_DIRECTORY 2 /* a dir */
300 #define AFS_FILE_TYPE_SYMLINK 3 /* a symbolic link */
301 #define AFS_FILE_TYPE_MOUNTPOINT 4 /* a mount point */
302 #define AFS_FILE_TYPE_DFSLINK 5 /* a Microsoft Dfs link */
303 #define AFS_FILE_TYPE_INVALID 99 /* an invalid link */
306 // AFS File types specific to Windows
309 #define AFS_FILE_TYPE_SPECIAL_SHARE_NAME -1
310 #define AFS_FILE_TYPE_PIOCTL -2
311 #define AFS_FILE_TYPE_PIPE -3
314 // AFS SysName Constants
317 #define AFS_MAX_SYSNAME_LENGTH 128
318 #define AFS_SYSNAME_ARCH_32BIT 0
319 #define AFS_SYSNAME_ARCH_64BIT 1
322 // Server file access granted to callers on open
325 #define AFS_FILE_ACCESS_NOLOCK 0x00000000
326 #define AFS_FILE_ACCESS_EXCLUSIVE 0x00000001
327 #define AFS_FILE_ACCESS_SHARED 0x00000002
330 // Reparse Point processing policy
333 #define AFS_REPARSE_POINT_POLICY_RESET 0x00000000 // This will reset the policy to default
334 // behavior which is to process the
335 // "open as reparse point" flag during
336 // Create per normal operation.
338 #define AFS_REPARSE_POINT_TO_FILE_AS_FILE 0x00000001 // If indicated then ignore any attempt to
339 // "open as reparse point" when the target is
342 #define AFS_REPARSE_POINT_VALID_POLICY_FLAGS 0x00000001
345 // Reparse Point policy scope
348 #define AFS_REPARSE_POINT_POLICY_GLOBAL 0x00000000
350 #define AFS_REPARSE_POINT_POLICY_AUTHGROUP 0x00000001
352 #endif /* _AFS_USER_DEFINE_H */