1 /*
2  * ntifs.h
3  *
4  * Windows NT Filesystem Driver Developer Kit
5  *
6  * This file is part of the ReactOS DDK package.
7  *
8  * Contributors:
9  *   Amine Khaldi
10  *   Timo Kreuzer (timo.kreuzer@reactos.org)
11  *
12  * THIS SOFTWARE IS NOT COPYRIGHTED
13  *
14  * This source code is offered for use in the public domain. You may
15  * use, modify or distribute it freely.
16  *
17  * This code is distributed in the hope that it will be useful but
18  * WITHOUT ANY WARRANTY. ALL WARRANTIES, EXPRESS OR IMPLIED ARE HEREBY
19  * DISCLAIMED. This includes but is not limited to warranties of
20  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21  *
22  */
23 
24 #pragma once
25 
26 #define _NTIFS_INCLUDED_
27 #define _GNU_NTIFS_
28 
29 #ifdef __cplusplus
30 extern "C" {
31 #endif
32 
33 /* Dependencies */
34 #include <ntddk.h>
35 #include <excpt.h>
36 #include <ntdef.h>
37 #include <ntnls.h>
38 #include <ntstatus.h>
39 #include <bugcodes.h>
40 #include <ntiologc.h>
41 
42 
43 #ifndef FlagOn
44 #define FlagOn(_F,_SF)        ((_F) & (_SF))
45 #endif
46 
47 #ifndef BooleanFlagOn
48 #define BooleanFlagOn(F,SF)   ((BOOLEAN)(((F) & (SF)) != 0))
49 #endif
50 
51 #ifndef SetFlag
52 #define SetFlag(_F,_SF)       ((_F) |= (_SF))
53 #endif
54 
55 #ifndef ClearFlag
56 #define ClearFlag(_F,_SF)     ((_F) &= ~(_SF))
57 #endif
58 
59 typedef UNICODE_STRING LSA_UNICODE_STRING, *PLSA_UNICODE_STRING;
60 typedef STRING LSA_STRING, *PLSA_STRING;
61 typedef OBJECT_ATTRIBUTES LSA_OBJECT_ATTRIBUTES, *PLSA_OBJECT_ATTRIBUTES;
62 
63 /******************************************************************************
64  *                            Security Manager Types                          *
65  ******************************************************************************/
66 #ifndef SID_IDENTIFIER_AUTHORITY_DEFINED
67 #define SID_IDENTIFIER_AUTHORITY_DEFINED
68 typedef struct _SID_IDENTIFIER_AUTHORITY {
69   UCHAR Value[6];
70 } SID_IDENTIFIER_AUTHORITY,*PSID_IDENTIFIER_AUTHORITY,*LPSID_IDENTIFIER_AUTHORITY;
71 #endif
72 
73 #ifndef SID_DEFINED
74 #define SID_DEFINED
75 typedef struct _SID {
76   UCHAR Revision;
77   UCHAR SubAuthorityCount;
78   SID_IDENTIFIER_AUTHORITY IdentifierAuthority;
79   ULONG SubAuthority[ANYSIZE_ARRAY];
80 } SID, *PISID;
81 #endif
82 
83 #define SID_REVISION                    1
84 #define SID_MAX_SUB_AUTHORITIES         15
85 #define SID_RECOMMENDED_SUB_AUTHORITIES 1
86 
87 typedef enum _SID_NAME_USE {
88   SidTypeUser = 1,
89   SidTypeGroup,
90   SidTypeDomain,
91   SidTypeAlias,
92   SidTypeWellKnownGroup,
93   SidTypeDeletedAccount,
94   SidTypeInvalid,
95   SidTypeUnknown,
96   SidTypeComputer,
97   SidTypeLabel,
98   SidTypeLogonSession
99 } SID_NAME_USE, *PSID_NAME_USE;
100 
101 typedef struct _SID_AND_ATTRIBUTES {
102   PSID Sid;
103   ULONG Attributes;
104 } SID_AND_ATTRIBUTES, *PSID_AND_ATTRIBUTES;
105 typedef SID_AND_ATTRIBUTES SID_AND_ATTRIBUTES_ARRAY[ANYSIZE_ARRAY];
106 typedef SID_AND_ATTRIBUTES_ARRAY *PSID_AND_ATTRIBUTES_ARRAY;
107 
108 #define SID_HASH_SIZE 32
109 typedef ULONG_PTR SID_HASH_ENTRY, *PSID_HASH_ENTRY;
110 
111 typedef struct _SID_AND_ATTRIBUTES_HASH {
112   ULONG SidCount;
113   PSID_AND_ATTRIBUTES SidAttr;
114   SID_HASH_ENTRY Hash[SID_HASH_SIZE];
115 } SID_AND_ATTRIBUTES_HASH, *PSID_AND_ATTRIBUTES_HASH;
116 
117 /* Universal well-known SIDs */
118 
119 #define SECURITY_NULL_SID_AUTHORITY         {0,0,0,0,0,0}
120 #define SECURITY_WORLD_SID_AUTHORITY        {0,0,0,0,0,1}
121 #define SECURITY_LOCAL_SID_AUTHORITY        {0,0,0,0,0,2}
122 #define SECURITY_CREATOR_SID_AUTHORITY      {0,0,0,0,0,3}
123 #define SECURITY_NON_UNIQUE_AUTHORITY       {0,0,0,0,0,4}
124 #define SECURITY_RESOURCE_MANAGER_AUTHORITY {0,0,0,0,0,9}
125 
126 #define SECURITY_NULL_RID                 (0x00000000L)
127 #define SECURITY_WORLD_RID                (0x00000000L)
128 #define SECURITY_LOCAL_RID                (0x00000000L)
129 #define SECURITY_LOCAL_LOGON_RID          (0x00000001L)
130 
131 #define SECURITY_CREATOR_OWNER_RID        (0x00000000L)
132 #define SECURITY_CREATOR_GROUP_RID        (0x00000001L)
133 #define SECURITY_CREATOR_OWNER_SERVER_RID (0x00000002L)
134 #define SECURITY_CREATOR_GROUP_SERVER_RID (0x00000003L)
135 #define SECURITY_CREATOR_OWNER_RIGHTS_RID (0x00000004L)
136 
137 /* NT well-known SIDs */
138 
139 #define SECURITY_NT_AUTHORITY           {0,0,0,0,0,5}
140 
141 #define SECURITY_DIALUP_RID             (0x00000001L)
142 #define SECURITY_NETWORK_RID            (0x00000002L)
143 #define SECURITY_BATCH_RID              (0x00000003L)
144 #define SECURITY_INTERACTIVE_RID        (0x00000004L)
145 #define SECURITY_LOGON_IDS_RID          (0x00000005L)
146 #define SECURITY_LOGON_IDS_RID_COUNT    (3L)
147 #define SECURITY_SERVICE_RID            (0x00000006L)
148 #define SECURITY_ANONYMOUS_LOGON_RID    (0x00000007L)
149 #define SECURITY_PROXY_RID              (0x00000008L)
150 #define SECURITY_ENTERPRISE_CONTROLLERS_RID (0x00000009L)
151 #define SECURITY_SERVER_LOGON_RID       SECURITY_ENTERPRISE_CONTROLLERS_RID
152 #define SECURITY_PRINCIPAL_SELF_RID     (0x0000000AL)
153 #define SECURITY_AUTHENTICATED_USER_RID (0x0000000BL)
154 #define SECURITY_RESTRICTED_CODE_RID    (0x0000000CL)
155 #define SECURITY_TERMINAL_SERVER_RID    (0x0000000DL)
156 #define SECURITY_REMOTE_LOGON_RID       (0x0000000EL)
157 #define SECURITY_THIS_ORGANIZATION_RID  (0x0000000FL)
158 #define SECURITY_IUSER_RID              (0x00000011L)
159 #define SECURITY_LOCAL_SYSTEM_RID       (0x00000012L)
160 #define SECURITY_LOCAL_SERVICE_RID      (0x00000013L)
161 #define SECURITY_NETWORK_SERVICE_RID    (0x00000014L)
162 #define SECURITY_NT_NON_UNIQUE          (0x00000015L)
163 #define SECURITY_NT_NON_UNIQUE_SUB_AUTH_COUNT  (3L)
164 #define SECURITY_ENTERPRISE_READONLY_CONTROLLERS_RID (0x00000016L)
165 
166 #define SECURITY_BUILTIN_DOMAIN_RID     (0x00000020L)
167 #define SECURITY_WRITE_RESTRICTED_CODE_RID (0x00000021L)
168 
169 
170 #define SECURITY_PACKAGE_BASE_RID       (0x00000040L)
171 #define SECURITY_PACKAGE_RID_COUNT      (2L)
172 #define SECURITY_PACKAGE_NTLM_RID       (0x0000000AL)
173 #define SECURITY_PACKAGE_SCHANNEL_RID   (0x0000000EL)
174 #define SECURITY_PACKAGE_DIGEST_RID     (0x00000015L)
175 
176 #define SECURITY_CRED_TYPE_BASE_RID             (0x00000041L)
177 #define SECURITY_CRED_TYPE_RID_COUNT            (2L)
178 #define SECURITY_CRED_TYPE_THIS_ORG_CERT_RID    (0x00000001L)
179 
180 #define SECURITY_MIN_BASE_RID		(0x00000050L)
181 #define SECURITY_SERVICE_ID_BASE_RID    (0x00000050L)
182 #define SECURITY_SERVICE_ID_RID_COUNT   (6L)
183 #define SECURITY_RESERVED_ID_BASE_RID   (0x00000051L)
184 #define SECURITY_APPPOOL_ID_BASE_RID    (0x00000052L)
185 #define SECURITY_APPPOOL_ID_RID_COUNT   (6L)
186 #define SECURITY_VIRTUALSERVER_ID_BASE_RID    (0x00000053L)
187 #define SECURITY_VIRTUALSERVER_ID_RID_COUNT   (6L)
188 #define SECURITY_USERMODEDRIVERHOST_ID_BASE_RID  (0x00000054L)
189 #define SECURITY_USERMODEDRIVERHOST_ID_RID_COUNT (6L)
190 #define SECURITY_CLOUD_INFRASTRUCTURE_SERVICES_ID_BASE_RID  (0x00000055L)
191 #define SECURITY_CLOUD_INFRASTRUCTURE_SERVICES_ID_RID_COUNT (6L)
192 #define SECURITY_WMIHOST_ID_BASE_RID  (0x00000056L)
193 #define SECURITY_WMIHOST_ID_RID_COUNT (6L)
194 #define SECURITY_TASK_ID_BASE_RID                 (0x00000057L)
195 #define SECURITY_NFS_ID_BASE_RID        (0x00000058L)
196 #define SECURITY_COM_ID_BASE_RID        (0x00000059L)
197 #define SECURITY_VIRTUALACCOUNT_ID_RID_COUNT   (6L)
198 
199 #define SECURITY_MAX_BASE_RID		(0x0000006FL)
200 
201 #define SECURITY_MAX_ALWAYS_FILTERED    (0x000003E7L)
202 #define SECURITY_MIN_NEVER_FILTERED     (0x000003E8L)
203 
204 #define SECURITY_OTHER_ORGANIZATION_RID (0x000003E8L)
205 
206 #define SECURITY_WINDOWSMOBILE_ID_BASE_RID (0x00000070L)
207 
208 /* Well-known domain relative sub-authority values (RIDs) */
209 
210 #define DOMAIN_GROUP_RID_ENTERPRISE_READONLY_DOMAIN_CONTROLLERS (0x000001F2L)
211 
212 #define FOREST_USER_RID_MAX            (0x000001F3L)
213 
214 /* Well-known users */
215 
216 #define DOMAIN_USER_RID_ADMIN          (0x000001F4L)
217 #define DOMAIN_USER_RID_GUEST          (0x000001F5L)
218 #define DOMAIN_USER_RID_KRBTGT         (0x000001F6L)
219 
220 #define DOMAIN_USER_RID_MAX            (0x000003E7L)
221 
222 /* Well-known groups */
223 
224 #define DOMAIN_GROUP_RID_ADMINS               (0x00000200L)
225 #define DOMAIN_GROUP_RID_USERS                (0x00000201L)
226 #define DOMAIN_GROUP_RID_GUESTS               (0x00000202L)
227 #define DOMAIN_GROUP_RID_COMPUTERS            (0x00000203L)
228 #define DOMAIN_GROUP_RID_CONTROLLERS          (0x00000204L)
229 #define DOMAIN_GROUP_RID_CERT_ADMINS          (0x00000205L)
230 #define DOMAIN_GROUP_RID_SCHEMA_ADMINS        (0x00000206L)
231 #define DOMAIN_GROUP_RID_ENTERPRISE_ADMINS    (0x00000207L)
232 #define DOMAIN_GROUP_RID_POLICY_ADMINS        (0x00000208L)
233 #define DOMAIN_GROUP_RID_READONLY_CONTROLLERS (0x00000209L)
234 
235 /* Well-known aliases */
236 
237 #define DOMAIN_ALIAS_RID_ADMINS                         (0x00000220L)
238 #define DOMAIN_ALIAS_RID_USERS                          (0x00000221L)
239 #define DOMAIN_ALIAS_RID_GUESTS                         (0x00000222L)
240 #define DOMAIN_ALIAS_RID_POWER_USERS                    (0x00000223L)
241 
242 #define DOMAIN_ALIAS_RID_ACCOUNT_OPS                    (0x00000224L)
243 #define DOMAIN_ALIAS_RID_SYSTEM_OPS                     (0x00000225L)
244 #define DOMAIN_ALIAS_RID_PRINT_OPS                      (0x00000226L)
245 #define DOMAIN_ALIAS_RID_BACKUP_OPS                     (0x00000227L)
246 
247 #define DOMAIN_ALIAS_RID_REPLICATOR                     (0x00000228L)
248 #define DOMAIN_ALIAS_RID_RAS_SERVERS                    (0x00000229L)
249 #define DOMAIN_ALIAS_RID_PREW2KCOMPACCESS               (0x0000022AL)
250 #define DOMAIN_ALIAS_RID_REMOTE_DESKTOP_USERS           (0x0000022BL)
251 #define DOMAIN_ALIAS_RID_NETWORK_CONFIGURATION_OPS      (0x0000022CL)
252 #define DOMAIN_ALIAS_RID_INCOMING_FOREST_TRUST_BUILDERS (0x0000022DL)
253 
254 #define DOMAIN_ALIAS_RID_MONITORING_USERS               (0x0000022EL)
255 #define DOMAIN_ALIAS_RID_LOGGING_USERS                  (0x0000022FL)
256 #define DOMAIN_ALIAS_RID_AUTHORIZATIONACCESS            (0x00000230L)
257 #define DOMAIN_ALIAS_RID_TS_LICENSE_SERVERS             (0x00000231L)
258 #define DOMAIN_ALIAS_RID_DCOM_USERS                     (0x00000232L)
259 #define DOMAIN_ALIAS_RID_IUSERS                         (0x00000238L)
260 #define DOMAIN_ALIAS_RID_CRYPTO_OPERATORS               (0x00000239L)
261 #define DOMAIN_ALIAS_RID_CACHEABLE_PRINCIPALS_GROUP     (0x0000023BL)
262 #define DOMAIN_ALIAS_RID_NON_CACHEABLE_PRINCIPALS_GROUP (0x0000023CL)
263 #define DOMAIN_ALIAS_RID_EVENT_LOG_READERS_GROUP        (0x0000023DL)
264 #define DOMAIN_ALIAS_RID_CERTSVC_DCOM_ACCESS_GROUP      (0x0000023EL)
265 
266 #define SECURITY_MANDATORY_LABEL_AUTHORITY          {0,0,0,0,0,16}
267 #define SECURITY_MANDATORY_UNTRUSTED_RID            (0x00000000L)
268 #define SECURITY_MANDATORY_LOW_RID                  (0x00001000L)
269 #define SECURITY_MANDATORY_MEDIUM_RID               (0x00002000L)
270 #define SECURITY_MANDATORY_HIGH_RID                 (0x00003000L)
271 #define SECURITY_MANDATORY_SYSTEM_RID               (0x00004000L)
272 #define SECURITY_MANDATORY_PROTECTED_PROCESS_RID    (0x00005000L)
273 
274 /* SECURITY_MANDATORY_MAXIMUM_USER_RID is the highest RID that
275    can be set by a usermode caller.*/
276 
277 #define SECURITY_MANDATORY_MAXIMUM_USER_RID   SECURITY_MANDATORY_SYSTEM_RID
278 
279 #define MANDATORY_LEVEL_TO_MANDATORY_RID(IL) (IL * 0x1000)
280 
281 /* Allocate the System Luid.  The first 1000 LUIDs are reserved.
282    Use #999 here (0x3e7 = 999) */
283 
284 #define SYSTEM_LUID                     {0x3e7, 0x0}
285 #define ANONYMOUS_LOGON_LUID            {0x3e6, 0x0}
286 #define LOCALSERVICE_LUID               {0x3e5, 0x0}
287 #define NETWORKSERVICE_LUID             {0x3e4, 0x0}
288 #define IUSER_LUID                      {0x3e3, 0x0}
289 
290 typedef struct _ACE_HEADER {
291   UCHAR AceType;
292   UCHAR AceFlags;
293   USHORT AceSize;
294 } ACE_HEADER, *PACE_HEADER;
295 
296 /* also in winnt.h */
297 #define ACCESS_MIN_MS_ACE_TYPE                  (0x0)
298 #define ACCESS_ALLOWED_ACE_TYPE                 (0x0)
299 #define ACCESS_DENIED_ACE_TYPE                  (0x1)
300 #define SYSTEM_AUDIT_ACE_TYPE                   (0x2)
301 #define SYSTEM_ALARM_ACE_TYPE                   (0x3)
302 #define ACCESS_MAX_MS_V2_ACE_TYPE               (0x3)
303 #define ACCESS_ALLOWED_COMPOUND_ACE_TYPE        (0x4)
304 #define ACCESS_MAX_MS_V3_ACE_TYPE               (0x4)
305 #define ACCESS_MIN_MS_OBJECT_ACE_TYPE           (0x5)
306 #define ACCESS_ALLOWED_OBJECT_ACE_TYPE          (0x5)
307 #define ACCESS_DENIED_OBJECT_ACE_TYPE           (0x6)
308 #define SYSTEM_AUDIT_OBJECT_ACE_TYPE            (0x7)
309 #define SYSTEM_ALARM_OBJECT_ACE_TYPE            (0x8)
310 #define ACCESS_MAX_MS_OBJECT_ACE_TYPE           (0x8)
311 #define ACCESS_MAX_MS_V4_ACE_TYPE               (0x8)
312 #define ACCESS_MAX_MS_ACE_TYPE                  (0x8)
313 #define ACCESS_ALLOWED_CALLBACK_ACE_TYPE        (0x9)
314 #define ACCESS_DENIED_CALLBACK_ACE_TYPE         (0xA)
315 #define ACCESS_ALLOWED_CALLBACK_OBJECT_ACE_TYPE (0xB)
316 #define ACCESS_DENIED_CALLBACK_OBJECT_ACE_TYPE  (0xC)
317 #define SYSTEM_AUDIT_CALLBACK_ACE_TYPE          (0xD)
318 #define SYSTEM_ALARM_CALLBACK_ACE_TYPE          (0xE)
319 #define SYSTEM_AUDIT_CALLBACK_OBJECT_ACE_TYPE   (0xF)
320 #define SYSTEM_ALARM_CALLBACK_OBJECT_ACE_TYPE   (0x10)
321 #define ACCESS_MAX_MS_V5_ACE_TYPE               (0x11)
322 #define SYSTEM_MANDATORY_LABEL_ACE_TYPE         (0x11)
323 
324 /* The following are the inherit flags that go into the AceFlags field
325    of an Ace header. */
326 
327 #define OBJECT_INHERIT_ACE                (0x1)
328 #define CONTAINER_INHERIT_ACE             (0x2)
329 #define NO_PROPAGATE_INHERIT_ACE          (0x4)
330 #define INHERIT_ONLY_ACE                  (0x8)
331 #define INHERITED_ACE                     (0x10)
332 #define VALID_INHERIT_FLAGS               (0x1F)
333 
334 #define SUCCESSFUL_ACCESS_ACE_FLAG        (0x40)
335 #define FAILED_ACCESS_ACE_FLAG            (0x80)
336 
337 typedef struct _ACCESS_ALLOWED_ACE {
338   ACE_HEADER Header;
339   ACCESS_MASK Mask;
340   ULONG SidStart;
341 } ACCESS_ALLOWED_ACE, *PACCESS_ALLOWED_ACE;
342 
343 typedef struct _ACCESS_DENIED_ACE {
344   ACE_HEADER Header;
345   ACCESS_MASK Mask;
346   ULONG SidStart;
347 } ACCESS_DENIED_ACE, *PACCESS_DENIED_ACE;
348 
349 typedef struct _SYSTEM_AUDIT_ACE {
350   ACE_HEADER Header;
351   ACCESS_MASK Mask;
352   ULONG SidStart;
353 } SYSTEM_AUDIT_ACE, *PSYSTEM_AUDIT_ACE;
354 
355 typedef struct _SYSTEM_ALARM_ACE {
356   ACE_HEADER Header;
357   ACCESS_MASK Mask;
358   ULONG SidStart;
359 } SYSTEM_ALARM_ACE, *PSYSTEM_ALARM_ACE;
360 
361 typedef struct _SYSTEM_MANDATORY_LABEL_ACE {
362   ACE_HEADER Header;
363   ACCESS_MASK Mask;
364   ULONG SidStart;
365 } SYSTEM_MANDATORY_LABEL_ACE, *PSYSTEM_MANDATORY_LABEL_ACE;
366 
367 #define SYSTEM_MANDATORY_LABEL_NO_WRITE_UP         0x1
368 #define SYSTEM_MANDATORY_LABEL_NO_READ_UP          0x2
369 #define SYSTEM_MANDATORY_LABEL_NO_EXECUTE_UP       0x4
370 #define SYSTEM_MANDATORY_LABEL_VALID_MASK (SYSTEM_MANDATORY_LABEL_NO_WRITE_UP   | \
371                                            SYSTEM_MANDATORY_LABEL_NO_READ_UP    | \
372                                            SYSTEM_MANDATORY_LABEL_NO_EXECUTE_UP)
373 
374 #define SECURITY_DESCRIPTOR_MIN_LENGTH   (sizeof(SECURITY_DESCRIPTOR))
375 
376 typedef USHORT SECURITY_DESCRIPTOR_CONTROL,*PSECURITY_DESCRIPTOR_CONTROL;
377 
378 #define SE_OWNER_DEFAULTED              0x0001
379 #define SE_GROUP_DEFAULTED              0x0002
380 #define SE_DACL_PRESENT                 0x0004
381 #define SE_DACL_DEFAULTED               0x0008
382 #define SE_SACL_PRESENT                 0x0010
383 #define SE_SACL_DEFAULTED               0x0020
384 #define SE_DACL_UNTRUSTED               0x0040
385 #define SE_SERVER_SECURITY              0x0080
386 #define SE_DACL_AUTO_INHERIT_REQ        0x0100
387 #define SE_SACL_AUTO_INHERIT_REQ        0x0200
388 #define SE_DACL_AUTO_INHERITED          0x0400
389 #define SE_SACL_AUTO_INHERITED          0x0800
390 #define SE_DACL_PROTECTED               0x1000
391 #define SE_SACL_PROTECTED               0x2000
392 #define SE_RM_CONTROL_VALID             0x4000
393 #define SE_SELF_RELATIVE                0x8000
394 
395 typedef struct _SECURITY_DESCRIPTOR_RELATIVE {
396   UCHAR Revision;
397   UCHAR Sbz1;
398   SECURITY_DESCRIPTOR_CONTROL Control;
399   ULONG Owner;
400   ULONG Group;
401   ULONG Sacl;
402   ULONG Dacl;
403 } SECURITY_DESCRIPTOR_RELATIVE, *PISECURITY_DESCRIPTOR_RELATIVE;
404 
405 typedef struct _SECURITY_DESCRIPTOR {
406   UCHAR Revision;
407   UCHAR Sbz1;
408   SECURITY_DESCRIPTOR_CONTROL Control;
409   PSID Owner;
410   PSID Group;
411   PACL Sacl;
412   PACL Dacl;
413 } SECURITY_DESCRIPTOR, *PISECURITY_DESCRIPTOR;
414 
415 typedef struct _OBJECT_TYPE_LIST {
416   USHORT Level;
417   USHORT Sbz;
418   GUID *ObjectType;
419 } OBJECT_TYPE_LIST, *POBJECT_TYPE_LIST;
420 
421 #define ACCESS_OBJECT_GUID       0
422 #define ACCESS_PROPERTY_SET_GUID 1
423 #define ACCESS_PROPERTY_GUID     2
424 #define ACCESS_MAX_LEVEL         4
425 
426 typedef enum _AUDIT_EVENT_TYPE {
427   AuditEventObjectAccess,
428   AuditEventDirectoryServiceAccess
429 } AUDIT_EVENT_TYPE, *PAUDIT_EVENT_TYPE;
430 
431 #define AUDIT_ALLOW_NO_PRIVILEGE 0x1
432 
433 #define ACCESS_DS_SOURCE_A "DS"
434 #define ACCESS_DS_SOURCE_W L"DS"
435 #define ACCESS_DS_OBJECT_TYPE_NAME_A "Directory Service Object"
436 #define ACCESS_DS_OBJECT_TYPE_NAME_W L"Directory Service Object"
437 
438 #define ACCESS_REASON_TYPE_MASK 0xffff0000
439 #define ACCESS_REASON_DATA_MASK 0x0000ffff
440 
441 typedef enum _ACCESS_REASON_TYPE {
442   AccessReasonNone = 0x00000000,
443   AccessReasonAllowedAce = 0x00010000,
444   AccessReasonDeniedAce = 0x00020000,
445   AccessReasonAllowedParentAce = 0x00030000,
446   AccessReasonDeniedParentAce = 0x00040000,
447   AccessReasonMissingPrivilege = 0x00100000,
448   AccessReasonFromPrivilege = 0x00200000,
449   AccessReasonIntegrityLevel = 0x00300000,
450   AccessReasonOwnership = 0x00400000,
451   AccessReasonNullDacl = 0x00500000,
452   AccessReasonEmptyDacl = 0x00600000,
453   AccessReasonNoSD = 0x00700000,
454   AccessReasonNoGrant = 0x00800000
455 } ACCESS_REASON_TYPE;
456 
457 typedef ULONG ACCESS_REASON;
458 
459 typedef struct _ACCESS_REASONS {
460   ACCESS_REASON Data[32];
461 } ACCESS_REASONS, *PACCESS_REASONS;
462 
463 #define SE_SECURITY_DESCRIPTOR_FLAG_NO_OWNER_ACE    0x00000001
464 #define SE_SECURITY_DESCRIPTOR_FLAG_NO_LABEL_ACE    0x00000002
465 #define SE_SECURITY_DESCRIPTOR_VALID_FLAGS          0x00000003
466 
467 typedef struct _SE_SECURITY_DESCRIPTOR {
468   ULONG Size;
469   ULONG Flags;
470   PSECURITY_DESCRIPTOR SecurityDescriptor;
471 } SE_SECURITY_DESCRIPTOR, *PSE_SECURITY_DESCRIPTOR;
472 
473 typedef struct _SE_ACCESS_REQUEST {
474   ULONG Size;
475   PSE_SECURITY_DESCRIPTOR SeSecurityDescriptor;
476   ACCESS_MASK DesiredAccess;
477   ACCESS_MASK PreviouslyGrantedAccess;
478   PSID PrincipalSelfSid;
479   PGENERIC_MAPPING GenericMapping;
480   ULONG ObjectTypeListCount;
481   POBJECT_TYPE_LIST ObjectTypeList;
482 } SE_ACCESS_REQUEST, *PSE_ACCESS_REQUEST;
483 
484 typedef struct _SE_ACCESS_REPLY {
485   ULONG Size;
486   ULONG ResultListCount;
487   PACCESS_MASK GrantedAccess;
488   PNTSTATUS AccessStatus;
489   PACCESS_REASONS AccessReason;
490   PPRIVILEGE_SET* Privileges;
491 } SE_ACCESS_REPLY, *PSE_ACCESS_REPLY;
492 
493 typedef enum _SE_AUDIT_OPERATION {
494   AuditPrivilegeObject,
495   AuditPrivilegeService,
496   AuditAccessCheck,
497   AuditOpenObject,
498   AuditOpenObjectWithTransaction,
499   AuditCloseObject,
500   AuditDeleteObject,
501   AuditOpenObjectForDelete,
502   AuditOpenObjectForDeleteWithTransaction,
503   AuditCloseNonObject,
504   AuditOpenNonObject,
505   AuditObjectReference,
506   AuditHandleCreation,
507 } SE_AUDIT_OPERATION, *PSE_AUDIT_OPERATION;
508 
509 typedef struct _SE_AUDIT_INFO {
510   ULONG Size;
511   AUDIT_EVENT_TYPE AuditType;
512   SE_AUDIT_OPERATION AuditOperation;
513   ULONG AuditFlags;
514   UNICODE_STRING SubsystemName;
515   UNICODE_STRING ObjectTypeName;
516   UNICODE_STRING ObjectName;
517   PVOID HandleId;
518   GUID* TransactionId;
519   LUID* OperationId;
520   BOOLEAN ObjectCreation;
521   BOOLEAN GenerateOnClose;
522 } SE_AUDIT_INFO, *PSE_AUDIT_INFO;
523 
524 #define TOKEN_ASSIGN_PRIMARY            (0x0001)
525 #define TOKEN_DUPLICATE                 (0x0002)
526 #define TOKEN_IMPERSONATE               (0x0004)
527 #define TOKEN_QUERY                     (0x0008)
528 #define TOKEN_QUERY_SOURCE              (0x0010)
529 #define TOKEN_ADJUST_PRIVILEGES         (0x0020)
530 #define TOKEN_ADJUST_GROUPS             (0x0040)
531 #define TOKEN_ADJUST_DEFAULT            (0x0080)
532 #define TOKEN_ADJUST_SESSIONID          (0x0100)
533 
534 #define TOKEN_ALL_ACCESS_P (STANDARD_RIGHTS_REQUIRED  |\
535                             TOKEN_ASSIGN_PRIMARY      |\
536                             TOKEN_DUPLICATE           |\
537                             TOKEN_IMPERSONATE         |\
538                             TOKEN_QUERY               |\
539                             TOKEN_QUERY_SOURCE        |\
540                             TOKEN_ADJUST_PRIVILEGES   |\
541                             TOKEN_ADJUST_GROUPS       |\
542                             TOKEN_ADJUST_DEFAULT )
543 
544 #if ((defined(_WIN32_WINNT) && (_WIN32_WINNT > 0x0400)) || (!defined(_WIN32_WINNT)))
545 #define TOKEN_ALL_ACCESS  (TOKEN_ALL_ACCESS_P |\
546                            TOKEN_ADJUST_SESSIONID )
547 #else
548 #define TOKEN_ALL_ACCESS  (TOKEN_ALL_ACCESS_P)
549 #endif
550 
551 #define TOKEN_READ       (STANDARD_RIGHTS_READ     |\
552                           TOKEN_QUERY)
553 
554 #define TOKEN_WRITE      (STANDARD_RIGHTS_WRITE    |\
555                           TOKEN_ADJUST_PRIVILEGES  |\
556                           TOKEN_ADJUST_GROUPS      |\
557                           TOKEN_ADJUST_DEFAULT)
558 
559 #define TOKEN_EXECUTE    (STANDARD_RIGHTS_EXECUTE)
560 
561 typedef enum _TOKEN_TYPE {
562   TokenPrimary = 1,
563   TokenImpersonation
564 } TOKEN_TYPE,*PTOKEN_TYPE;
565 
566 typedef enum _TOKEN_INFORMATION_CLASS {
567   TokenUser = 1,
568   TokenGroups,
569   TokenPrivileges,
570   TokenOwner,
571   TokenPrimaryGroup,
572   TokenDefaultDacl,
573   TokenSource,
574   TokenType,
575   TokenImpersonationLevel,
576   TokenStatistics,
577   TokenRestrictedSids,
578   TokenSessionId,
579   TokenGroupsAndPrivileges,
580   TokenSessionReference,
581   TokenSandBoxInert,
582   TokenAuditPolicy,
583   TokenOrigin,
584   TokenElevationType,
585   TokenLinkedToken,
586   TokenElevation,
587   TokenHasRestrictions,
588   TokenAccessInformation,
589   TokenVirtualizationAllowed,
590   TokenVirtualizationEnabled,
591   TokenIntegrityLevel,
592   TokenUIAccess,
593   TokenMandatoryPolicy,
594   TokenLogonSid,
595   MaxTokenInfoClass
596 } TOKEN_INFORMATION_CLASS, *PTOKEN_INFORMATION_CLASS;
597 
598 typedef struct _TOKEN_USER {
599   SID_AND_ATTRIBUTES User;
600 } TOKEN_USER, *PTOKEN_USER;
601 
602 typedef struct _TOKEN_GROUPS {
603   ULONG GroupCount;
604   SID_AND_ATTRIBUTES Groups[ANYSIZE_ARRAY];
605 } TOKEN_GROUPS,*PTOKEN_GROUPS,*LPTOKEN_GROUPS;
606 
607 typedef struct _TOKEN_PRIVILEGES {
608   ULONG PrivilegeCount;
609   LUID_AND_ATTRIBUTES Privileges[ANYSIZE_ARRAY];
610 } TOKEN_PRIVILEGES,*PTOKEN_PRIVILEGES,*LPTOKEN_PRIVILEGES;
611 
612 typedef struct _TOKEN_OWNER {
613   PSID Owner;
614 } TOKEN_OWNER,*PTOKEN_OWNER;
615 
616 typedef struct _TOKEN_PRIMARY_GROUP {
617   PSID PrimaryGroup;
618 } TOKEN_PRIMARY_GROUP,*PTOKEN_PRIMARY_GROUP;
619 
620 typedef struct _TOKEN_DEFAULT_DACL {
621   PACL DefaultDacl;
622 } TOKEN_DEFAULT_DACL,*PTOKEN_DEFAULT_DACL;
623 
624 typedef struct _TOKEN_GROUPS_AND_PRIVILEGES {
625   ULONG SidCount;
626   ULONG SidLength;
627   PSID_AND_ATTRIBUTES Sids;
628   ULONG RestrictedSidCount;
629   ULONG RestrictedSidLength;
630   PSID_AND_ATTRIBUTES RestrictedSids;
631   ULONG PrivilegeCount;
632   ULONG PrivilegeLength;
633   PLUID_AND_ATTRIBUTES Privileges;
634   LUID AuthenticationId;
635 } TOKEN_GROUPS_AND_PRIVILEGES, *PTOKEN_GROUPS_AND_PRIVILEGES;
636 
637 typedef struct _TOKEN_LINKED_TOKEN {
638   HANDLE LinkedToken;
639 } TOKEN_LINKED_TOKEN, *PTOKEN_LINKED_TOKEN;
640 
641 typedef struct _TOKEN_ELEVATION {
642   ULONG TokenIsElevated;
643 } TOKEN_ELEVATION, *PTOKEN_ELEVATION;
644 
645 typedef struct _TOKEN_MANDATORY_LABEL {
646   SID_AND_ATTRIBUTES Label;
647 } TOKEN_MANDATORY_LABEL, *PTOKEN_MANDATORY_LABEL;
648 
649 #define TOKEN_MANDATORY_POLICY_OFF             0x0
650 #define TOKEN_MANDATORY_POLICY_NO_WRITE_UP     0x1
651 #define TOKEN_MANDATORY_POLICY_NEW_PROCESS_MIN 0x2
652 
653 #define TOKEN_MANDATORY_POLICY_VALID_MASK    (TOKEN_MANDATORY_POLICY_NO_WRITE_UP | \
654                                               TOKEN_MANDATORY_POLICY_NEW_PROCESS_MIN)
655 
656 typedef struct _TOKEN_MANDATORY_POLICY {
657   ULONG Policy;
658 } TOKEN_MANDATORY_POLICY, *PTOKEN_MANDATORY_POLICY;
659 
660 typedef struct _TOKEN_ACCESS_INFORMATION {
661   PSID_AND_ATTRIBUTES_HASH SidHash;
662   PSID_AND_ATTRIBUTES_HASH RestrictedSidHash;
663   PTOKEN_PRIVILEGES Privileges;
664   LUID AuthenticationId;
665   TOKEN_TYPE TokenType;
666   SECURITY_IMPERSONATION_LEVEL ImpersonationLevel;
667   TOKEN_MANDATORY_POLICY MandatoryPolicy;
668   ULONG Flags;
669 } TOKEN_ACCESS_INFORMATION, *PTOKEN_ACCESS_INFORMATION;
670 
671 #define POLICY_AUDIT_SUBCATEGORY_COUNT (53)
672 
673 typedef struct _TOKEN_AUDIT_POLICY {
674   UCHAR PerUserPolicy[((POLICY_AUDIT_SUBCATEGORY_COUNT) >> 1) + 1];
675 } TOKEN_AUDIT_POLICY, *PTOKEN_AUDIT_POLICY;
676 
677 #define TOKEN_SOURCE_LENGTH 8
678 
679 typedef struct _TOKEN_SOURCE {
680   CHAR SourceName[TOKEN_SOURCE_LENGTH];
681   LUID SourceIdentifier;
682 } TOKEN_SOURCE,*PTOKEN_SOURCE;
683 
684 typedef struct _TOKEN_STATISTICS {
685   LUID TokenId;
686   LUID AuthenticationId;
687   LARGE_INTEGER ExpirationTime;
688   TOKEN_TYPE TokenType;
689   SECURITY_IMPERSONATION_LEVEL ImpersonationLevel;
690   ULONG DynamicCharged;
691   ULONG DynamicAvailable;
692   ULONG GroupCount;
693   ULONG PrivilegeCount;
694   LUID ModifiedId;
695 } TOKEN_STATISTICS, *PTOKEN_STATISTICS;
696 
697 typedef struct _TOKEN_CONTROL {
698   LUID TokenId;
699   LUID AuthenticationId;
700   LUID ModifiedId;
701   TOKEN_SOURCE TokenSource;
702 } TOKEN_CONTROL,*PTOKEN_CONTROL;
703 
704 typedef struct _TOKEN_ORIGIN {
705   LUID OriginatingLogonSession;
706 } TOKEN_ORIGIN, *PTOKEN_ORIGIN;
707 
708 typedef enum _MANDATORY_LEVEL {
709   MandatoryLevelUntrusted = 0,
710   MandatoryLevelLow,
711   MandatoryLevelMedium,
712   MandatoryLevelHigh,
713   MandatoryLevelSystem,
714   MandatoryLevelSecureProcess,
715   MandatoryLevelCount
716 } MANDATORY_LEVEL, *PMANDATORY_LEVEL;
717 
718 #define TOKEN_HAS_TRAVERSE_PRIVILEGE    0x0001
719 #define TOKEN_HAS_BACKUP_PRIVILEGE      0x0002
720 #define TOKEN_HAS_RESTORE_PRIVILEGE     0x0004
721 #define TOKEN_WRITE_RESTRICTED          0x0008
722 #define TOKEN_IS_RESTRICTED             0x0010
723 #define TOKEN_SESSION_NOT_REFERENCED    0x0020
724 #define TOKEN_SANDBOX_INERT             0x0040
725 #define TOKEN_HAS_IMPERSONATE_PRIVILEGE 0x0080
726 #define SE_BACKUP_PRIVILEGES_CHECKED    0x0100
727 #define TOKEN_VIRTUALIZE_ALLOWED        0x0200
728 #define TOKEN_VIRTUALIZE_ENABLED        0x0400
729 #define TOKEN_IS_FILTERED               0x0800
730 #define TOKEN_UIACCESS                  0x1000
731 #define TOKEN_NOT_LOW                   0x2000
732 
733 typedef struct _SE_EXPORTS {
734   LUID SeCreateTokenPrivilege;
735   LUID SeAssignPrimaryTokenPrivilege;
736   LUID SeLockMemoryPrivilege;
737   LUID SeIncreaseQuotaPrivilege;
738   LUID SeUnsolicitedInputPrivilege;
739   LUID SeTcbPrivilege;
740   LUID SeSecurityPrivilege;
741   LUID SeTakeOwnershipPrivilege;
742   LUID SeLoadDriverPrivilege;
743   LUID SeCreatePagefilePrivilege;
744   LUID SeIncreaseBasePriorityPrivilege;
745   LUID SeSystemProfilePrivilege;
746   LUID SeSystemtimePrivilege;
747   LUID SeProfileSingleProcessPrivilege;
748   LUID SeCreatePermanentPrivilege;
749   LUID SeBackupPrivilege;
750   LUID SeRestorePrivilege;
751   LUID SeShutdownPrivilege;
752   LUID SeDebugPrivilege;
753   LUID SeAuditPrivilege;
754   LUID SeSystemEnvironmentPrivilege;
755   LUID SeChangeNotifyPrivilege;
756   LUID SeRemoteShutdownPrivilege;
757   PSID SeNullSid;
758   PSID SeWorldSid;
759   PSID SeLocalSid;
760   PSID SeCreatorOwnerSid;
761   PSID SeCreatorGroupSid;
762   PSID SeNtAuthoritySid;
763   PSID SeDialupSid;
764   PSID SeNetworkSid;
765   PSID SeBatchSid;
766   PSID SeInteractiveSid;
767   PSID SeLocalSystemSid;
768   PSID SeAliasAdminsSid;
769   PSID SeAliasUsersSid;
770   PSID SeAliasGuestsSid;
771   PSID SeAliasPowerUsersSid;
772   PSID SeAliasAccountOpsSid;
773   PSID SeAliasSystemOpsSid;
774   PSID SeAliasPrintOpsSid;
775   PSID SeAliasBackupOpsSid;
776   PSID SeAuthenticatedUsersSid;
777   PSID SeRestrictedSid;
778   PSID SeAnonymousLogonSid;
779   LUID SeUndockPrivilege;
780   LUID SeSyncAgentPrivilege;
781   LUID SeEnableDelegationPrivilege;
782   PSID SeLocalServiceSid;
783   PSID SeNetworkServiceSid;
784   LUID SeManageVolumePrivilege;
785   LUID SeImpersonatePrivilege;
786   LUID SeCreateGlobalPrivilege;
787   LUID SeTrustedCredManAccessPrivilege;
788   LUID SeRelabelPrivilege;
789   LUID SeIncreaseWorkingSetPrivilege;
790   LUID SeTimeZonePrivilege;
791   LUID SeCreateSymbolicLinkPrivilege;
792   PSID SeIUserSid;
793   PSID SeUntrustedMandatorySid;
794   PSID SeLowMandatorySid;
795   PSID SeMediumMandatorySid;
796   PSID SeHighMandatorySid;
797   PSID SeSystemMandatorySid;
798   PSID SeOwnerRightsSid;
799 } SE_EXPORTS, *PSE_EXPORTS;
800 
801 typedef NTSTATUS
802 (NTAPI *PSE_LOGON_SESSION_TERMINATED_ROUTINE)(
803   IN PLUID LogonId);
804 /******************************************************************************
805  *                           Runtime Library Types                            *
806  ******************************************************************************/
807 
808 
809 #define RTL_SYSTEM_VOLUME_INFORMATION_FOLDER    L"System Volume Information"
810 
811 typedef PVOID
812 (NTAPI *PRTL_ALLOCATE_STRING_ROUTINE)(
813   IN SIZE_T NumberOfBytes);
814 
815 #if _WIN32_WINNT >= 0x0600
816 typedef PVOID
817 (NTAPI *PRTL_REALLOCATE_STRING_ROUTINE)(
818   IN SIZE_T NumberOfBytes,
819   IN PVOID Buffer);
820 #endif
821 
822 typedef VOID
823 (NTAPI *PRTL_FREE_STRING_ROUTINE)(
824   IN PVOID Buffer);
825 
826 extern const PRTL_ALLOCATE_STRING_ROUTINE RtlAllocateStringRoutine;
827 extern const PRTL_FREE_STRING_ROUTINE RtlFreeStringRoutine;
828 
829 #if _WIN32_WINNT >= 0x0600
830 extern const PRTL_REALLOCATE_STRING_ROUTINE RtlReallocateStringRoutine;
831 #endif
832 
833 typedef NTSTATUS
834 (NTAPI * PRTL_HEAP_COMMIT_ROUTINE) (
835   IN PVOID Base,
836   IN OUT PVOID *CommitAddress,
837   IN OUT PSIZE_T CommitSize);
838 
839 typedef struct _RTL_HEAP_PARAMETERS {
840   ULONG Length;
841   SIZE_T SegmentReserve;
842   SIZE_T SegmentCommit;
843   SIZE_T DeCommitFreeBlockThreshold;
844   SIZE_T DeCommitTotalFreeThreshold;
845   SIZE_T MaximumAllocationSize;
846   SIZE_T VirtualMemoryThreshold;
847   SIZE_T InitialCommit;
848   SIZE_T InitialReserve;
849   PRTL_HEAP_COMMIT_ROUTINE CommitRoutine;
850   SIZE_T Reserved[2];
851 } RTL_HEAP_PARAMETERS, *PRTL_HEAP_PARAMETERS;
852 
853 #if (NTDDI_VERSION >= NTDDI_WIN2K)
854 
855 typedef struct _GENERATE_NAME_CONTEXT {
856   USHORT Checksum;
857   BOOLEAN CheckSumInserted;
858   UCHAR NameLength;
859   WCHAR NameBuffer[8];
860   ULONG ExtensionLength;
861   WCHAR ExtensionBuffer[4];
862   ULONG LastIndexValue;
863 } GENERATE_NAME_CONTEXT, *PGENERATE_NAME_CONTEXT;
864 
865 typedef struct _PREFIX_TABLE_ENTRY {
866   CSHORT NodeTypeCode;
867   CSHORT NameLength;
868   struct _PREFIX_TABLE_ENTRY *NextPrefixTree;
869   RTL_SPLAY_LINKS Links;
870   PSTRING Prefix;
871 } PREFIX_TABLE_ENTRY, *PPREFIX_TABLE_ENTRY;
872 
873 typedef struct _PREFIX_TABLE {
874   CSHORT NodeTypeCode;
875   CSHORT NameLength;
876   PPREFIX_TABLE_ENTRY NextPrefixTree;
877 } PREFIX_TABLE, *PPREFIX_TABLE;
878 
879 typedef struct _UNICODE_PREFIX_TABLE_ENTRY {
880   CSHORT NodeTypeCode;
881   CSHORT NameLength;
882   struct _UNICODE_PREFIX_TABLE_ENTRY *NextPrefixTree;
883   struct _UNICODE_PREFIX_TABLE_ENTRY *CaseMatch;
884   RTL_SPLAY_LINKS Links;
885   PUNICODE_STRING Prefix;
886 } UNICODE_PREFIX_TABLE_ENTRY, *PUNICODE_PREFIX_TABLE_ENTRY;
887 
888 typedef struct _UNICODE_PREFIX_TABLE {
889   CSHORT NodeTypeCode;
890   CSHORT NameLength;
891   PUNICODE_PREFIX_TABLE_ENTRY NextPrefixTree;
892   PUNICODE_PREFIX_TABLE_ENTRY LastNextEntry;
893 } UNICODE_PREFIX_TABLE, *PUNICODE_PREFIX_TABLE;
894 
895 #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
896 
897 #if (NTDDI_VERSION >= NTDDI_WINXP)
898 typedef struct _COMPRESSED_DATA_INFO {
899   USHORT CompressionFormatAndEngine;
900   UCHAR CompressionUnitShift;
901   UCHAR ChunkShift;
902   UCHAR ClusterShift;
903   UCHAR Reserved;
904   USHORT NumberOfChunks;
905   ULONG CompressedChunkSizes[ANYSIZE_ARRAY];
906 } COMPRESSED_DATA_INFO, *PCOMPRESSED_DATA_INFO;
907 #endif
908 
909 /******************************************************************************
910  *                         Runtime Library Functions                          *
911  ******************************************************************************/
912 
913 #if (NTDDI_VERSION >= NTDDI_WIN2K)
914 
915 NTSYSAPI
916 PVOID
917 NTAPI
918 RtlAllocateHeap(
919   IN HANDLE HeapHandle,
920   IN ULONG Flags OPTIONAL,
921   IN SIZE_T Size);
922 
923 NTSYSAPI
924 BOOLEAN
925 NTAPI
926 RtlFreeHeap(
927   IN PVOID HeapHandle,
928   IN ULONG Flags OPTIONAL,
929   IN PVOID BaseAddress);
930 
931 NTSYSAPI
932 VOID
933 NTAPI
934 RtlCaptureContext(
935   OUT PCONTEXT ContextRecord);
936 
937 NTSYSAPI
938 ULONG
939 NTAPI
940 RtlRandom(
941   IN OUT PULONG Seed);
942 
943 NTSYSAPI
944 BOOLEAN
945 NTAPI
946 RtlCreateUnicodeString(
947   OUT PUNICODE_STRING DestinationString,
948   IN PCWSTR SourceString);
949 
950 NTSYSAPI
951 NTSTATUS
952 NTAPI
953 RtlAppendStringToString(
954   IN OUT PSTRING Destination,
955   IN const STRING *Source);
956 
957 NTSYSAPI
958 NTSTATUS
959 NTAPI
960 RtlOemStringToUnicodeString(
961   IN OUT PUNICODE_STRING DestinationString,
962   IN PCOEM_STRING SourceString,
963   IN BOOLEAN AllocateDestinationString);
964 
965 NTSYSAPI
966 NTSTATUS
967 NTAPI
968 RtlUnicodeStringToOemString(
969   IN OUT POEM_STRING DestinationString,
970   IN PCUNICODE_STRING SourceString,
971   IN BOOLEAN AllocateDestinationString);
972 
973 NTSYSAPI
974 NTSTATUS
975 NTAPI
976 RtlUpcaseUnicodeStringToOemString(
977   IN OUT POEM_STRING DestinationString,
978   IN PCUNICODE_STRING SourceString,
979   IN BOOLEAN AllocateDestinationString);
980 
981 NTSYSAPI
982 NTSTATUS
983 NTAPI
984 RtlOemStringToCountedUnicodeString(
985   IN OUT PUNICODE_STRING DestinationString,
986   IN PCOEM_STRING SourceString,
987   IN BOOLEAN AllocateDestinationString);
988 
989 NTSYSAPI
990 NTSTATUS
991 NTAPI
992 RtlUnicodeStringToCountedOemString(
993   IN OUT POEM_STRING DestinationString,
994   IN PCUNICODE_STRING SourceString,
995   IN BOOLEAN AllocateDestinationString);
996 
997 NTSYSAPI
998 NTSTATUS
999 NTAPI
1000 RtlUpcaseUnicodeStringToCountedOemString(
1001   IN OUT POEM_STRING DestinationString,
1002   IN PCUNICODE_STRING SourceString,
1003   IN BOOLEAN AllocateDestinationString);
1004 
1005 NTSYSAPI
1006 NTSTATUS
1007 NTAPI
1008 RtlDowncaseUnicodeString(
1009   IN OUT PUNICODE_STRING UniDest,
1010   IN PCUNICODE_STRING UniSource,
1011   IN BOOLEAN AllocateDestinationString);
1012 
1013 NTSYSAPI
1014 VOID
1015 NTAPI
1016 RtlFreeOemString (
1017   IN OUT POEM_STRING OemString);
1018 
1019 NTSYSAPI
1020 ULONG
1021 NTAPI
1022 RtlxUnicodeStringToOemSize(
1023   IN PCUNICODE_STRING UnicodeString);
1024 
1025 NTSYSAPI
1026 ULONG
1027 NTAPI
1028 RtlxOemStringToUnicodeSize(
1029   IN PCOEM_STRING OemString);
1030 
1031 NTSYSAPI
1032 NTSTATUS
1033 NTAPI
1034 RtlMultiByteToUnicodeN(
1035   OUT PWCH UnicodeString,
1036   IN ULONG MaxBytesInUnicodeString,
1037   OUT PULONG BytesInUnicodeString OPTIONAL,
1038   IN const CHAR *MultiByteString,
1039   IN ULONG BytesInMultiByteString);
1040 
1041 NTSYSAPI
1042 NTSTATUS
1043 NTAPI
1044 RtlMultiByteToUnicodeSize(
1045   OUT PULONG BytesInUnicodeString,
1046   IN const CHAR *MultiByteString,
1047   IN ULONG BytesInMultiByteString);
1048 
1049 NTSYSAPI
1050 NTSTATUS
1051 NTAPI
1052 RtlUnicodeToMultiByteSize(
1053   OUT PULONG BytesInMultiByteString,
1054   IN PCWCH UnicodeString,
1055   IN ULONG BytesInUnicodeString);
1056 
1057 NTSYSAPI
1058 NTSTATUS
1059 NTAPI
1060 RtlUnicodeToMultiByteN(
1061   OUT PCHAR MultiByteString,
1062   IN ULONG MaxBytesInMultiByteString,
1063   OUT PULONG BytesInMultiByteString OPTIONAL,
1064   IN PCWCH UnicodeString,
1065   IN ULONG BytesInUnicodeString);
1066 
1067 NTSYSAPI
1068 NTSTATUS
1069 NTAPI
1070 RtlUpcaseUnicodeToMultiByteN(
1071   OUT PCHAR MultiByteString,
1072   IN ULONG MaxBytesInMultiByteString,
1073   OUT PULONG BytesInMultiByteString OPTIONAL,
1074   IN PCWCH UnicodeString,
1075   IN ULONG BytesInUnicodeString);
1076 
1077 NTSYSAPI
1078 NTSTATUS
1079 NTAPI
1080 RtlOemToUnicodeN(
1081   OUT PWSTR UnicodeString,
1082   IN ULONG MaxBytesInUnicodeString,
1083   OUT PULONG BytesInUnicodeString OPTIONAL,
1084   IN PCCH OemString,
1085   IN ULONG BytesInOemString);
1086 
1087 NTSYSAPI
1088 NTSTATUS
1089 NTAPI
1090 RtlUnicodeToOemN(
1091   OUT PCHAR OemString,
1092   IN ULONG MaxBytesInOemString,
1093   OUT PULONG BytesInOemString OPTIONAL,
1094   IN PCWCH UnicodeString,
1095   IN ULONG BytesInUnicodeString);
1096 
1097 NTSYSAPI
1098 NTSTATUS
1099 NTAPI
1100 RtlUpcaseUnicodeToOemN(
1101   OUT PCHAR OemString,
1102   IN ULONG MaxBytesInOemString,
1103   OUT PULONG BytesInOemString OPTIONAL,
1104   IN PCWCH UnicodeString,
1105   IN ULONG BytesInUnicodeString);
1106 
1107 #if (NTDDI_VERSION >= NTDDI_VISTASP1)
1108 NTSYSAPI
1109 NTSTATUS
1110 NTAPI
1111 RtlGenerate8dot3Name(
1112   IN PCUNICODE_STRING Name,
1113   IN BOOLEAN AllowExtendedCharacters,
1114   IN OUT PGENERATE_NAME_CONTEXT Context,
1115   IN OUT PUNICODE_STRING Name8dot3);
1116 #else
1117 NTSYSAPI
1118 VOID
1119 NTAPI
1120 RtlGenerate8dot3Name(
1121   IN PCUNICODE_STRING Name,
1122   IN BOOLEAN AllowExtendedCharacters,
1123   IN OUT PGENERATE_NAME_CONTEXT Context,
1124   IN OUT PUNICODE_STRING Name8dot3);
1125 #endif
1126 
1127 NTSYSAPI
1128 BOOLEAN
1129 NTAPI
1130 RtlIsNameLegalDOS8Dot3(
1131   IN PCUNICODE_STRING Name,
1132   IN OUT POEM_STRING OemName OPTIONAL,
1133   IN OUT PBOOLEAN NameContainsSpaces OPTIONAL);
1134 
1135 NTSYSAPI
1136 BOOLEAN
1137 NTAPI
1138 RtlIsValidOemCharacter(
1139   IN OUT PWCHAR Char);
1140 
1141 NTSYSAPI
1142 VOID
1143 NTAPI
1144 PfxInitialize(
1145   OUT PPREFIX_TABLE PrefixTable);
1146 
1147 NTSYSAPI
1148 BOOLEAN
1149 NTAPI
1150 PfxInsertPrefix(
1151   IN PPREFIX_TABLE PrefixTable,
1152   IN PSTRING Prefix,
1153   OUT PPREFIX_TABLE_ENTRY PrefixTableEntry);
1154 
1155 NTSYSAPI
1156 VOID
1157 NTAPI
1158 PfxRemovePrefix(
1159   IN PPREFIX_TABLE PrefixTable,
1160   IN PPREFIX_TABLE_ENTRY PrefixTableEntry);
1161 
1162 NTSYSAPI
1163 PPREFIX_TABLE_ENTRY
1164 NTAPI
1165 PfxFindPrefix(
1166   IN PPREFIX_TABLE PrefixTable,
1167   IN PSTRING FullName);
1168 
1169 NTSYSAPI
1170 VOID
1171 NTAPI
1172 RtlInitializeUnicodePrefix(
1173   OUT PUNICODE_PREFIX_TABLE PrefixTable);
1174 
1175 NTSYSAPI
1176 BOOLEAN
1177 NTAPI
1178 RtlInsertUnicodePrefix(
1179   IN PUNICODE_PREFIX_TABLE PrefixTable,
1180   IN PUNICODE_STRING Prefix,
1181   OUT PUNICODE_PREFIX_TABLE_ENTRY PrefixTableEntry);
1182 
1183 NTSYSAPI
1184 VOID
1185 NTAPI
1186 RtlRemoveUnicodePrefix(
1187   IN PUNICODE_PREFIX_TABLE PrefixTable,
1188   IN PUNICODE_PREFIX_TABLE_ENTRY PrefixTableEntry);
1189 
1190 NTSYSAPI
1191 PUNICODE_PREFIX_TABLE_ENTRY
1192 NTAPI
1193 RtlFindUnicodePrefix(
1194   IN PUNICODE_PREFIX_TABLE PrefixTable,
1195   IN PUNICODE_STRING FullName,
1196   IN ULONG CaseInsensitiveIndex);
1197 
1198 NTSYSAPI
1199 PUNICODE_PREFIX_TABLE_ENTRY
1200 NTAPI
1201 RtlNextUnicodePrefix(
1202   IN PUNICODE_PREFIX_TABLE PrefixTable,
1203   IN BOOLEAN Restart);
1204 
1205 NTSYSAPI
1206 SIZE_T
1207 NTAPI
1208 RtlCompareMemoryUlong(
1209   IN PVOID Source,
1210   IN SIZE_T Length,
1211   IN ULONG Pattern);
1212 
1213 NTSYSAPI
1214 BOOLEAN
1215 NTAPI
1216 RtlTimeToSecondsSince1980(
1217   IN PLARGE_INTEGER Time,
1218   OUT PULONG ElapsedSeconds);
1219 
1220 NTSYSAPI
1221 VOID
1222 NTAPI
1223 RtlSecondsSince1980ToTime(
1224   IN ULONG ElapsedSeconds,
1225   OUT PLARGE_INTEGER Time);
1226 
1227 NTSYSAPI
1228 BOOLEAN
1229 NTAPI
1230 RtlTimeToSecondsSince1970(
1231   IN PLARGE_INTEGER Time,
1232   OUT PULONG ElapsedSeconds);
1233 
1234 NTSYSAPI
1235 VOID
1236 NTAPI
1237 RtlSecondsSince1970ToTime(
1238   IN ULONG ElapsedSeconds,
1239   OUT PLARGE_INTEGER Time);
1240 
1241 NTSYSAPI
1242 BOOLEAN
1243 NTAPI
1244 RtlValidSid(
1245   IN PSID Sid);
1246 
1247 NTSYSAPI
1248 BOOLEAN
1249 NTAPI
1250 RtlEqualSid(
1251   IN PSID Sid1,
1252   IN PSID Sid2);
1253 
1254 NTSYSAPI
1255 BOOLEAN
1256 NTAPI
1257 RtlEqualPrefixSid(
1258   IN PSID Sid1,
1259   IN PSID Sid2);
1260 
1261 NTSYSAPI
1262 ULONG
1263 NTAPI
1264 RtlLengthRequiredSid(
1265   IN ULONG SubAuthorityCount);
1266 
1267 NTSYSAPI
1268 PVOID
1269 NTAPI
1270 RtlFreeSid(
1271   IN PSID Sid);
1272 
1273 NTSYSAPI
1274 NTSTATUS
1275 NTAPI
1276 RtlAllocateAndInitializeSid(
1277   IN PSID_IDENTIFIER_AUTHORITY IdentifierAuthority,
1278   IN UCHAR SubAuthorityCount,
1279   IN ULONG SubAuthority0,
1280   IN ULONG SubAuthority1,
1281   IN ULONG SubAuthority2,
1282   IN ULONG SubAuthority3,
1283   IN ULONG SubAuthority4,
1284   IN ULONG SubAuthority5,
1285   IN ULONG SubAuthority6,
1286   IN ULONG SubAuthority7,
1287   OUT PSID *Sid);
1288 
1289 NTSYSAPI
1290 NTSTATUS
1291 NTAPI
1292 RtlInitializeSid(
1293   OUT PSID Sid,
1294   IN PSID_IDENTIFIER_AUTHORITY IdentifierAuthority,
1295   IN UCHAR SubAuthorityCount);
1296 
1297 NTSYSAPI
1298 PULONG
1299 NTAPI
1300 RtlSubAuthoritySid(
1301   IN PSID Sid,
1302   IN ULONG SubAuthority);
1303 
1304 NTSYSAPI
1305 ULONG
1306 NTAPI
1307 RtlLengthSid(
1308   IN PSID Sid);
1309 
1310 NTSYSAPI
1311 NTSTATUS
1312 NTAPI
1313 RtlCopySid(
1314   IN ULONG Length,
1315   IN PSID Destination,
1316   IN PSID Source);
1317 
1318 NTSYSAPI
1319 NTSTATUS
1320 NTAPI
1321 RtlConvertSidToUnicodeString(
1322   IN OUT PUNICODE_STRING UnicodeString,
1323   IN PSID Sid,
1324   IN BOOLEAN AllocateDestinationString);
1325 
1326 NTSYSAPI
1327 VOID
1328 NTAPI
1329 RtlCopyLuid(
1330   OUT PLUID DestinationLuid,
1331   IN PLUID SourceLuid);
1332 
1333 NTSYSAPI
1334 NTSTATUS
1335 NTAPI
1336 RtlCreateAcl(
1337   OUT PACL Acl,
1338   IN ULONG AclLength,
1339   IN ULONG AclRevision);
1340 
1341 NTSYSAPI
1342 NTSTATUS
1343 NTAPI
1344 RtlAddAce(
1345   IN OUT PACL Acl,
1346   IN ULONG AceRevision,
1347   IN ULONG StartingAceIndex,
1348   IN PVOID AceList,
1349   IN ULONG AceListLength);
1350 
1351 NTSYSAPI
1352 NTSTATUS
1353 NTAPI
1354 RtlDeleteAce(
1355   IN OUT PACL Acl,
1356   IN ULONG AceIndex);
1357 
1358 NTSYSAPI
1359 NTSTATUS
1360 NTAPI
1361 RtlGetAce(
1362   IN PACL Acl,
1363   IN ULONG AceIndex,
1364   OUT PVOID *Ace);
1365 
1366 NTSYSAPI
1367 NTSTATUS
1368 NTAPI
1369 RtlAddAccessAllowedAce(
1370   IN OUT PACL Acl,
1371   IN ULONG AceRevision,
1372   IN ACCESS_MASK AccessMask,
1373   IN PSID Sid);
1374 
1375 NTSYSAPI
1376 NTSTATUS
1377 NTAPI
1378 RtlAddAccessAllowedAceEx(
1379   IN OUT PACL Acl,
1380   IN ULONG AceRevision,
1381   IN ULONG AceFlags,
1382   IN ACCESS_MASK AccessMask,
1383   IN PSID Sid);
1384 
1385 NTSYSAPI
1386 NTSTATUS
1387 NTAPI
1388 RtlCreateSecurityDescriptorRelative(
1389   OUT PISECURITY_DESCRIPTOR_RELATIVE SecurityDescriptor,
1390   IN ULONG Revision);
1391 
1392 NTSYSAPI
1393 NTSTATUS
1394 NTAPI
1395 RtlGetDaclSecurityDescriptor(
1396   IN PSECURITY_DESCRIPTOR SecurityDescriptor,
1397   OUT PBOOLEAN DaclPresent,
1398   OUT PACL *Dacl,
1399   OUT PBOOLEAN DaclDefaulted);
1400 
1401 NTSYSAPI
1402 NTSTATUS
1403 NTAPI
1404 RtlSetOwnerSecurityDescriptor(
1405   IN OUT PSECURITY_DESCRIPTOR SecurityDescriptor,
1406   IN PSID Owner OPTIONAL,
1407   IN BOOLEAN OwnerDefaulted);
1408 
1409 NTSYSAPI
1410 NTSTATUS
1411 NTAPI
1412 RtlGetOwnerSecurityDescriptor(
1413   IN PSECURITY_DESCRIPTOR SecurityDescriptor,
1414   OUT PSID *Owner,
1415   OUT PBOOLEAN OwnerDefaulted);
1416 
1417 NTSYSAPI
1418 ULONG
1419 NTAPI
1420 RtlNtStatusToDosError(
1421   IN NTSTATUS Status);
1422 
1423 NTSYSAPI
1424 NTSTATUS
1425 NTAPI
1426 RtlCustomCPToUnicodeN(
1427   IN PCPTABLEINFO CustomCP,
1428   OUT PWCH UnicodeString,
1429   IN ULONG MaxBytesInUnicodeString,
1430   OUT PULONG BytesInUnicodeString OPTIONAL,
1431   IN PCH CustomCPString,
1432   IN ULONG BytesInCustomCPString);
1433 
1434 NTSYSAPI
1435 NTSTATUS
1436 NTAPI
1437 RtlUnicodeToCustomCPN(
1438   IN PCPTABLEINFO CustomCP,
1439   OUT PCH CustomCPString,
1440   IN ULONG MaxBytesInCustomCPString,
1441   OUT PULONG BytesInCustomCPString OPTIONAL,
1442   IN PWCH UnicodeString,
1443   IN ULONG BytesInUnicodeString);
1444 
1445 NTSYSAPI
1446 NTSTATUS
1447 NTAPI
1448 RtlUpcaseUnicodeToCustomCPN(
1449   IN PCPTABLEINFO CustomCP,
1450   OUT PCH CustomCPString,
1451   IN ULONG MaxBytesInCustomCPString,
1452   OUT PULONG BytesInCustomCPString OPTIONAL,
1453   IN PWCH UnicodeString,
1454   IN ULONG BytesInUnicodeString);
1455 
1456 NTSYSAPI
1457 VOID
1458 NTAPI
1459 RtlInitCodePageTable(
1460   IN PUSHORT TableBase,
1461   IN OUT PCPTABLEINFO CodePageTable);
1462 
1463 
1464 #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
1465 
1466 
1467 #if (NTDDI_VERSION >= NTDDI_WINXP)
1468 
1469 NTSYSAPI
1470 PVOID
1471 NTAPI
1472 RtlCreateHeap(
1473   IN ULONG Flags,
1474   IN PVOID HeapBase OPTIONAL,
1475   IN SIZE_T ReserveSize OPTIONAL,
1476   IN SIZE_T CommitSize OPTIONAL,
1477   IN PVOID Lock OPTIONAL,
1478   IN PRTL_HEAP_PARAMETERS Parameters OPTIONAL);
1479 
1480 NTSYSAPI
1481 PVOID
1482 NTAPI
1483 RtlDestroyHeap(
1484   IN PVOID HeapHandle);
1485 
1486 NTSYSAPI
1487 USHORT
1488 NTAPI
1489 RtlCaptureStackBackTrace(
1490   IN ULONG FramesToSkip,
1491   IN ULONG FramesToCapture,
1492   OUT PVOID *BackTrace,
1493   OUT PULONG BackTraceHash OPTIONAL);
1494 
1495 NTSYSAPI
1496 ULONG
1497 NTAPI
1498 RtlRandomEx(
1499   IN OUT PULONG Seed);
1500 
1501 NTSYSAPI
1502 NTSTATUS
1503 NTAPI
1504 RtlInitUnicodeStringEx(
1505   OUT PUNICODE_STRING DestinationString,
1506   IN PCWSTR SourceString OPTIONAL);
1507 
1508 NTSYSAPI
1509 NTSTATUS
1510 NTAPI
1511 RtlValidateUnicodeString(
1512   IN ULONG Flags,
1513   IN PCUNICODE_STRING String);
1514 
1515 NTSYSAPI
1516 NTSTATUS
1517 NTAPI
1518 RtlDuplicateUnicodeString(
1519   IN ULONG Flags,
1520   IN PCUNICODE_STRING SourceString,
1521   OUT PUNICODE_STRING DestinationString);
1522 
1523 NTSYSAPI
1524 NTSTATUS
1525 NTAPI
1526 RtlGetCompressionWorkSpaceSize(
1527   IN USHORT CompressionFormatAndEngine,
1528   OUT PULONG CompressBufferWorkSpaceSize,
1529   OUT PULONG CompressFragmentWorkSpaceSize);
1530 
1531 NTSYSAPI
1532 NTSTATUS
1533 NTAPI
1534 RtlCompressBuffer(
1535   IN USHORT CompressionFormatAndEngine,
1536   IN PUCHAR UncompressedBuffer,
1537   IN ULONG UncompressedBufferSize,
1538   OUT PUCHAR CompressedBuffer,
1539   IN ULONG CompressedBufferSize,
1540   IN ULONG UncompressedChunkSize,
1541   OUT PULONG FinalCompressedSize,
1542   IN PVOID WorkSpace);
1543 
1544 NTSYSAPI
1545 NTSTATUS
1546 NTAPI
1547 RtlDecompressBuffer(
1548   IN USHORT CompressionFormat,
1549   OUT PUCHAR UncompressedBuffer,
1550   IN ULONG UncompressedBufferSize,
1551   IN PUCHAR CompressedBuffer,
1552   IN ULONG CompressedBufferSize,
1553   OUT PULONG FinalUncompressedSize);
1554 
1555 NTSYSAPI
1556 NTSTATUS
1557 NTAPI
1558 RtlDecompressFragment(
1559   IN USHORT CompressionFormat,
1560   OUT PUCHAR UncompressedFragment,
1561   IN ULONG UncompressedFragmentSize,
1562   IN PUCHAR CompressedBuffer,
1563   IN ULONG CompressedBufferSize,
1564   IN ULONG FragmentOffset,
1565   OUT PULONG FinalUncompressedSize,
1566   IN PVOID WorkSpace);
1567 
1568 NTSYSAPI
1569 NTSTATUS
1570 NTAPI
1571 RtlDescribeChunk(
1572   IN USHORT CompressionFormat,
1573   IN OUT PUCHAR *CompressedBuffer,
1574   IN PUCHAR EndOfCompressedBufferPlus1,
1575   OUT PUCHAR *ChunkBuffer,
1576   OUT PULONG ChunkSize);
1577 
1578 NTSYSAPI
1579 NTSTATUS
1580 NTAPI
1581 RtlReserveChunk(
1582   IN USHORT CompressionFormat,
1583   IN OUT PUCHAR *CompressedBuffer,
1584   IN PUCHAR EndOfCompressedBufferPlus1,
1585   OUT PUCHAR *ChunkBuffer,
1586   IN ULONG ChunkSize);
1587 
1588 NTSYSAPI
1589 NTSTATUS
1590 NTAPI
1591 RtlDecompressChunks(
1592   OUT PUCHAR UncompressedBuffer,
1593   IN ULONG UncompressedBufferSize,
1594   IN PUCHAR CompressedBuffer,
1595   IN ULONG CompressedBufferSize,
1596   IN PUCHAR CompressedTail,
1597   IN ULONG CompressedTailSize,
1598   IN PCOMPRESSED_DATA_INFO CompressedDataInfo);
1599 
1600 NTSYSAPI
1601 NTSTATUS
1602 NTAPI
1603 RtlCompressChunks(
1604   IN PUCHAR UncompressedBuffer,
1605   IN ULONG UncompressedBufferSize,
1606   OUT PUCHAR CompressedBuffer,
1607   IN ULONG CompressedBufferSize,
1608   IN OUT PCOMPRESSED_DATA_INFO CompressedDataInfo,
1609   IN ULONG CompressedDataInfoLength,
1610   IN PVOID WorkSpace);
1611 
1612 NTSYSAPI
1613 PSID_IDENTIFIER_AUTHORITY
1614 NTAPI
1615 RtlIdentifierAuthoritySid(
1616   IN PSID Sid);
1617 
1618 NTSYSAPI
1619 PUCHAR
1620 NTAPI
1621 RtlSubAuthorityCountSid(
1622   IN PSID Sid);
1623 
1624 NTSYSAPI
1625 ULONG
1626 NTAPI
1627 RtlNtStatusToDosErrorNoTeb(
1628   IN NTSTATUS Status);
1629 
1630 NTSYSAPI
1631 NTSTATUS
1632 NTAPI
1633 RtlCreateSystemVolumeInformationFolder(
1634   IN PCUNICODE_STRING VolumeRootPath);
1635 
1636 #if defined(_M_AMD64)
1637 
1638 FORCEINLINE
1639 VOID
RtlFillMemoryUlong(OUT PVOID Destination,IN SIZE_T Length,IN ULONG Pattern)1640 RtlFillMemoryUlong (
1641   OUT PVOID Destination,
1642   IN SIZE_T Length,
1643   IN ULONG Pattern)
1644 {
1645   PULONG Address = (PULONG)Destination;
1646   if ((Length /= 4) != 0) {
1647     if (((ULONG64)Address & 4) != 0) {
1648       *Address = Pattern;
1649       if ((Length -= 1) == 0) {
1650         return;
1651       }
1652       Address += 1;
1653     }
1654     __stosq((PULONG64)(Address), Pattern | ((ULONG64)Pattern << 32), Length / 2);
1655     if ((Length & 1) != 0) Address[Length - 1] = Pattern;
1656   }
1657   return;
1658 }
1659 
1660 #define RtlFillMemoryUlonglong(Destination, Length, Pattern)                \
1661     __stosq((PULONG64)(Destination), Pattern, (Length) / 8)
1662 
1663 #else
1664 
1665 NTSYSAPI
1666 VOID
1667 NTAPI
1668 RtlFillMemoryUlong(
1669   OUT PVOID Destination,
1670   IN SIZE_T Length,
1671   IN ULONG Pattern);
1672 
1673 NTSYSAPI
1674 VOID
1675 NTAPI
1676 RtlFillMemoryUlonglong(
1677   OUT PVOID Destination,
1678   IN SIZE_T Length,
1679   IN ULONGLONG Pattern);
1680 
1681 #endif /* defined(_M_AMD64) */
1682 
1683 #endif /* (NTDDI_VERSION >= NTDDI_WINXP) */
1684 
1685 #if (NTDDI_VERSION >= NTDDI_WS03)
1686 NTSYSAPI
1687 NTSTATUS
1688 NTAPI
1689 RtlInitAnsiStringEx(
1690   OUT PANSI_STRING DestinationString,
1691   IN PCSZ SourceString OPTIONAL);
1692 #endif
1693 
1694 #if (NTDDI_VERSION >= NTDDI_WS03SP1)
1695 
1696 NTSYSAPI
1697 NTSTATUS
1698 NTAPI
1699 RtlGetSaclSecurityDescriptor(
1700   IN PSECURITY_DESCRIPTOR SecurityDescriptor,
1701   OUT PBOOLEAN SaclPresent,
1702   OUT PACL *Sacl,
1703   OUT PBOOLEAN SaclDefaulted);
1704 
1705 NTSYSAPI
1706 NTSTATUS
1707 NTAPI
1708 RtlSetGroupSecurityDescriptor(
1709   IN OUT PSECURITY_DESCRIPTOR SecurityDescriptor,
1710   IN PSID Group OPTIONAL,
1711   IN BOOLEAN GroupDefaulted OPTIONAL);
1712 
1713 NTSYSAPI
1714 NTSTATUS
1715 NTAPI
1716 RtlGetGroupSecurityDescriptor(
1717   IN PSECURITY_DESCRIPTOR SecurityDescriptor,
1718   OUT PSID *Group,
1719   OUT PBOOLEAN GroupDefaulted);
1720 
1721 NTSYSAPI
1722 NTSTATUS
1723 NTAPI
1724 RtlAbsoluteToSelfRelativeSD(
1725   IN PSECURITY_DESCRIPTOR AbsoluteSecurityDescriptor,
1726   OUT PSECURITY_DESCRIPTOR SelfRelativeSecurityDescriptor OPTIONAL,
1727   IN OUT PULONG BufferLength);
1728 
1729 NTSYSAPI
1730 NTSTATUS
1731 NTAPI
1732 RtlSelfRelativeToAbsoluteSD(
1733   IN PSECURITY_DESCRIPTOR SelfRelativeSecurityDescriptor,
1734   OUT PSECURITY_DESCRIPTOR AbsoluteSecurityDescriptor OPTIONAL,
1735   IN OUT PULONG AbsoluteSecurityDescriptorSize,
1736   OUT PACL Dacl OPTIONAL,
1737   IN OUT PULONG DaclSize,
1738   OUT PACL Sacl OPTIONAL,
1739   IN OUT PULONG SaclSize,
1740   OUT PSID Owner OPTIONAL,
1741   IN OUT PULONG OwnerSize,
1742   OUT PSID PrimaryGroup OPTIONAL,
1743   IN OUT PULONG PrimaryGroupSize);
1744 
1745 #endif /* (NTDDI_VERSION >= NTDDI_WS03SP1) */
1746 
1747 #if (NTDDI_VERSION >= NTDDI_VISTA)
1748 
1749 NTSYSAPI
1750 NTSTATUS
1751 NTAPI
1752 RtlNormalizeString(
1753   IN ULONG NormForm,
1754   IN PCWSTR SourceString,
1755   IN LONG SourceStringLength,
1756   OUT PWSTR DestinationString,
1757   IN OUT PLONG DestinationStringLength);
1758 
1759 NTSYSAPI
1760 NTSTATUS
1761 NTAPI
1762 RtlIsNormalizedString(
1763   IN ULONG NormForm,
1764   IN PCWSTR SourceString,
1765   IN LONG SourceStringLength,
1766   OUT PBOOLEAN Normalized);
1767 
1768 NTSYSAPI
1769 NTSTATUS
1770 NTAPI
1771 RtlIdnToAscii(
1772   IN ULONG Flags,
1773   IN PCWSTR SourceString,
1774   IN LONG SourceStringLength,
1775   OUT PWSTR DestinationString,
1776   IN OUT PLONG DestinationStringLength);
1777 
1778 NTSYSAPI
1779 NTSTATUS
1780 NTAPI
1781 RtlIdnToUnicode(
1782   IN ULONG Flags,
1783   IN PCWSTR SourceString,
1784   IN LONG SourceStringLength,
1785   OUT PWSTR DestinationString,
1786   IN OUT PLONG DestinationStringLength);
1787 
1788 NTSYSAPI
1789 NTSTATUS
1790 NTAPI
1791 RtlIdnToNameprepUnicode(
1792   IN ULONG Flags,
1793   IN PCWSTR SourceString,
1794   IN LONG SourceStringLength,
1795   OUT PWSTR DestinationString,
1796   IN OUT PLONG DestinationStringLength);
1797 
1798 NTSYSAPI
1799 NTSTATUS
1800 NTAPI
1801 RtlCreateServiceSid(
1802   IN PUNICODE_STRING ServiceName,
1803   OUT PSID ServiceSid,
1804   IN OUT PULONG ServiceSidLength);
1805 
1806 NTSYSAPI
1807 LONG
1808 NTAPI
1809 RtlCompareAltitudes(
1810   IN PCUNICODE_STRING Altitude1,
1811   IN PCUNICODE_STRING Altitude2);
1812 
1813 #endif /* (NTDDI_VERSION >= NTDDI_VISTA) */
1814 
1815 #if (NTDDI_VERSION >= NTDDI_WIN7)
1816 
1817 NTSYSAPI
1818 NTSTATUS
1819 NTAPI
1820 RtlUnicodeToUTF8N(
1821   OUT PCHAR UTF8StringDestination,
1822   IN ULONG UTF8StringMaxByteCount,
1823   OUT PULONG UTF8StringActualByteCount,
1824   IN PCWCH UnicodeStringSource,
1825   IN ULONG UnicodeStringByteCount);
1826 
1827 NTSYSAPI
1828 NTSTATUS
1829 NTAPI
1830 RtlUTF8ToUnicodeN(
1831   OUT PWSTR UnicodeStringDestination,
1832   IN ULONG UnicodeStringMaxByteCount,
1833   OUT PULONG UnicodeStringActualByteCount,
1834   IN PCCH UTF8StringSource,
1835   IN ULONG UTF8StringByteCount);
1836 
1837 NTSYSAPI
1838 NTSTATUS
1839 NTAPI
1840 RtlReplaceSidInSd(
1841   IN OUT PSECURITY_DESCRIPTOR SecurityDescriptor,
1842   IN PSID OldSid,
1843   IN PSID NewSid,
1844   OUT ULONG *NumChanges);
1845 
1846 NTSYSAPI
1847 NTSTATUS
1848 NTAPI
1849 RtlCreateVirtualAccountSid(
1850   IN PCUNICODE_STRING Name,
1851   IN ULONG BaseSubAuthority,
1852   OUT PSID Sid,
1853   IN OUT PULONG SidLength);
1854 
1855 #endif /* (NTDDI_VERSION >= NTDDI_WIN7) */
1856 
1857 
1858 #if defined(_AMD64_) || defined(_IA64_)
1859 
1860 
1861 #endif /* defined(_AMD64_) || defined(_IA64_) */
1862 
1863 
1864 
1865 #define RTL_DUPLICATE_UNICODE_STRING_NULL_TERMINATE 1
1866 #define RTL_DUPLICATE_UNICODE_STRING_ALLOCATE_NULL_STRING 2
1867 
1868 #define RtlUnicodeStringToOemSize(STRING) (NLS_MB_OEM_CODE_PAGE_TAG ?                                \
1869                                            RtlxUnicodeStringToOemSize(STRING) :                      \
1870                                            ((STRING)->Length + sizeof(UNICODE_NULL)) / sizeof(WCHAR) \
1871 )
1872 
1873 #define RtlOemStringToUnicodeSize(STRING) (                 \
1874     NLS_MB_OEM_CODE_PAGE_TAG ?                              \
1875     RtlxOemStringToUnicodeSize(STRING) :                    \
1876     ((STRING)->Length + sizeof(ANSI_NULL)) * sizeof(WCHAR)  \
1877 )
1878 
1879 #define RtlOemStringToCountedUnicodeSize(STRING) (                    \
1880     (ULONG)(RtlOemStringToUnicodeSize(STRING) - sizeof(UNICODE_NULL)) \
1881 )
1882 
1883 #define RtlOffsetToPointer(B,O) ((PCHAR)(((PCHAR)(B)) + ((ULONG_PTR)(O))))
1884 #define RtlPointerToOffset(B,P) ((ULONG)(((PCHAR)(P)) - ((PCHAR)(B))))
1885 
1886 typedef enum _OBJECT_INFORMATION_CLASS {
1887   ObjectBasicInformation = 0,
1888   ObjectNameInformation = 1, /* FIXME, not in WDK */
1889   ObjectTypeInformation = 2,
1890   ObjectTypesInformation = 3, /* FIXME, not in WDK */
1891   ObjectHandleFlagInformation = 4, /* FIXME, not in WDK */
1892   ObjectSessionInformation = 5, /* FIXME, not in WDK */
1893   MaxObjectInfoClass /* FIXME, not in WDK */
1894 } OBJECT_INFORMATION_CLASS;
1895 
1896 NTSYSCALLAPI
1897 NTSTATUS
1898 NTAPI
1899 NtQueryObject(
1900   IN HANDLE Handle OPTIONAL,
1901   IN OBJECT_INFORMATION_CLASS ObjectInformationClass,
1902   OUT PVOID ObjectInformation OPTIONAL,
1903   IN ULONG ObjectInformationLength,
1904   OUT PULONG ReturnLength OPTIONAL);
1905 
1906 #if (NTDDI_VERSION >= NTDDI_WIN2K)
1907 
1908 NTSYSCALLAPI
1909 NTSTATUS
1910 NTAPI
1911 NtOpenThreadToken(
1912   IN HANDLE ThreadHandle,
1913   IN ACCESS_MASK DesiredAccess,
1914   IN BOOLEAN OpenAsSelf,
1915   OUT PHANDLE TokenHandle);
1916 
1917 NTSYSCALLAPI
1918 NTSTATUS
1919 NTAPI
1920 NtOpenProcessToken(
1921   IN HANDLE ProcessHandle,
1922   IN ACCESS_MASK DesiredAccess,
1923   OUT PHANDLE TokenHandle);
1924 
1925 NTSYSCALLAPI
1926 NTSTATUS
1927 NTAPI
1928 NtQueryInformationToken(
1929   IN HANDLE TokenHandle,
1930   IN TOKEN_INFORMATION_CLASS TokenInformationClass,
1931   OUT PVOID TokenInformation OPTIONAL,
1932   IN ULONG TokenInformationLength,
1933   OUT PULONG ReturnLength);
1934 
1935 NTSYSCALLAPI
1936 NTSTATUS
1937 NTAPI
1938 NtAdjustPrivilegesToken(
1939   IN HANDLE TokenHandle,
1940   IN BOOLEAN DisableAllPrivileges,
1941   IN PTOKEN_PRIVILEGES NewState OPTIONAL,
1942   IN ULONG BufferLength,
1943   OUT PTOKEN_PRIVILEGES PreviousState,
1944   OUT PULONG ReturnLength OPTIONAL);
1945 
1946 NTSYSCALLAPI
1947 NTSTATUS
1948 NTAPI
1949 NtCreateFile(
1950   OUT PHANDLE FileHandle,
1951   IN ACCESS_MASK DesiredAccess,
1952   IN POBJECT_ATTRIBUTES ObjectAttributes,
1953   OUT PIO_STATUS_BLOCK IoStatusBlock,
1954   IN PLARGE_INTEGER AllocationSize OPTIONAL,
1955   IN ULONG FileAttributes,
1956   IN ULONG ShareAccess,
1957   IN ULONG CreateDisposition,
1958   IN ULONG CreateOptions,
1959   IN PVOID EaBuffer,
1960   IN ULONG EaLength);
1961 
1962 NTSYSCALLAPI
1963 NTSTATUS
1964 NTAPI
1965 NtDeviceIoControlFile(
1966   IN HANDLE FileHandle,
1967   IN HANDLE Event OPTIONAL,
1968   IN PIO_APC_ROUTINE ApcRoutine OPTIONAL,
1969   IN PVOID ApcContext OPTIONAL,
1970   OUT PIO_STATUS_BLOCK IoStatusBlock,
1971   IN ULONG IoControlCode,
1972   IN PVOID InputBuffer OPTIONAL,
1973   IN ULONG InputBufferLength,
1974   OUT PVOID OutputBuffer OPTIONAL,
1975   IN ULONG OutputBufferLength);
1976 
1977 NTSYSCALLAPI
1978 NTSTATUS
1979 NTAPI
1980 NtFsControlFile(
1981   IN HANDLE FileHandle,
1982   IN HANDLE Event OPTIONAL,
1983   IN PIO_APC_ROUTINE ApcRoutine OPTIONAL,
1984   IN PVOID ApcContext OPTIONAL,
1985   OUT PIO_STATUS_BLOCK IoStatusBlock,
1986   IN ULONG FsControlCode,
1987   IN PVOID InputBuffer OPTIONAL,
1988   IN ULONG InputBufferLength,
1989   OUT PVOID OutputBuffer OPTIONAL,
1990   IN ULONG OutputBufferLength);
1991 
1992 NTSYSCALLAPI
1993 NTSTATUS
1994 NTAPI
1995 NtLockFile(
1996   IN HANDLE FileHandle,
1997   IN HANDLE Event OPTIONAL,
1998   IN PIO_APC_ROUTINE ApcRoutine OPTIONAL,
1999   IN PVOID ApcContext OPTIONAL,
2000   OUT PIO_STATUS_BLOCK IoStatusBlock,
2001   IN PLARGE_INTEGER ByteOffset,
2002   IN PLARGE_INTEGER Length,
2003   IN ULONG Key,
2004   IN BOOLEAN FailImmediately,
2005   IN BOOLEAN ExclusiveLock);
2006 
2007 NTSYSCALLAPI
2008 NTSTATUS
2009 NTAPI
2010 NtOpenFile(
2011   OUT PHANDLE FileHandle,
2012   IN ACCESS_MASK DesiredAccess,
2013   IN POBJECT_ATTRIBUTES ObjectAttributes,
2014   OUT PIO_STATUS_BLOCK IoStatusBlock,
2015   IN ULONG ShareAccess,
2016   IN ULONG OpenOptions);
2017 
2018 NTSYSCALLAPI
2019 NTSTATUS
2020 NTAPI
2021 NtQueryDirectoryFile(
2022   IN HANDLE FileHandle,
2023   IN HANDLE Event OPTIONAL,
2024   IN PIO_APC_ROUTINE ApcRoutine OPTIONAL,
2025   IN PVOID ApcContext OPTIONAL,
2026   OUT PIO_STATUS_BLOCK IoStatusBlock,
2027   OUT PVOID FileInformation,
2028   IN ULONG Length,
2029   IN FILE_INFORMATION_CLASS FileInformationClass,
2030   IN BOOLEAN ReturnSingleEntry,
2031   IN PUNICODE_STRING FileName OPTIONAL,
2032   IN BOOLEAN RestartScan);
2033 
2034 NTSYSCALLAPI
2035 NTSTATUS
2036 NTAPI
2037 NtQueryInformationFile(
2038   IN HANDLE FileHandle,
2039   OUT PIO_STATUS_BLOCK IoStatusBlock,
2040   OUT PVOID FileInformation,
2041   IN ULONG Length,
2042   IN FILE_INFORMATION_CLASS FileInformationClass);
2043 
2044 NTSYSCALLAPI
2045 NTSTATUS
2046 NTAPI
2047 NtQueryQuotaInformationFile(
2048   IN HANDLE FileHandle,
2049   OUT PIO_STATUS_BLOCK IoStatusBlock,
2050   OUT PVOID Buffer,
2051   IN ULONG Length,
2052   IN BOOLEAN ReturnSingleEntry,
2053   IN PVOID SidList,
2054   IN ULONG SidListLength,
2055   IN PSID StartSid OPTIONAL,
2056   IN BOOLEAN RestartScan);
2057 
2058 NTSYSCALLAPI
2059 NTSTATUS
2060 NTAPI
2061 NtQueryVolumeInformationFile(
2062   IN HANDLE FileHandle,
2063   OUT PIO_STATUS_BLOCK IoStatusBlock,
2064   OUT PVOID FsInformation,
2065   IN ULONG Length,
2066   IN FS_INFORMATION_CLASS FsInformationClass);
2067 
2068 NTSYSCALLAPI
2069 NTSTATUS
2070 NTAPI
2071 NtReadFile(
2072   IN HANDLE FileHandle,
2073   IN HANDLE Event OPTIONAL,
2074   IN PIO_APC_ROUTINE ApcRoutine OPTIONAL,
2075   IN PVOID ApcContext OPTIONAL,
2076   OUT PIO_STATUS_BLOCK IoStatusBlock,
2077   OUT PVOID Buffer,
2078   IN ULONG Length,
2079   IN PLARGE_INTEGER ByteOffset OPTIONAL,
2080   IN PULONG Key OPTIONAL);
2081 
2082 NTSYSCALLAPI
2083 NTSTATUS
2084 NTAPI
2085 NtSetInformationFile(
2086   IN HANDLE FileHandle,
2087   OUT PIO_STATUS_BLOCK IoStatusBlock,
2088   IN PVOID FileInformation,
2089   IN ULONG Length,
2090   IN FILE_INFORMATION_CLASS FileInformationClass);
2091 
2092 NTSYSCALLAPI
2093 NTSTATUS
2094 NTAPI
2095 NtSetQuotaInformationFile(
2096   IN HANDLE FileHandle,
2097   OUT PIO_STATUS_BLOCK IoStatusBlock,
2098   IN PVOID Buffer,
2099   IN ULONG Length);
2100 
2101 NTSYSCALLAPI
2102 NTSTATUS
2103 NTAPI
2104 NtSetVolumeInformationFile(
2105   IN HANDLE FileHandle,
2106   OUT PIO_STATUS_BLOCK IoStatusBlock,
2107   IN PVOID FsInformation,
2108   IN ULONG Length,
2109   IN FS_INFORMATION_CLASS FsInformationClass);
2110 
2111 NTSYSCALLAPI
2112 NTSTATUS
2113 NTAPI
2114 NtWriteFile(
2115   IN HANDLE FileHandle,
2116   IN HANDLE Event OPTIONAL,
2117   IN PIO_APC_ROUTINE ApcRoutine OPTIONAL,
2118   IN PVOID ApcContext OPTIONAL,
2119   OUT PIO_STATUS_BLOCK IoStatusBlock,
2120   IN PVOID Buffer,
2121   IN ULONG Length,
2122   IN PLARGE_INTEGER ByteOffset OPTIONAL,
2123   IN PULONG Key OPTIONAL);
2124 
2125 NTSYSCALLAPI
2126 NTSTATUS
2127 NTAPI
2128 NtUnlockFile(
2129   IN HANDLE FileHandle,
2130   OUT PIO_STATUS_BLOCK IoStatusBlock,
2131   IN PLARGE_INTEGER ByteOffset,
2132   IN PLARGE_INTEGER Length,
2133   IN ULONG Key);
2134 
2135 NTSYSCALLAPI
2136 NTSTATUS
2137 NTAPI
2138 NtSetSecurityObject(
2139   IN HANDLE Handle,
2140   IN SECURITY_INFORMATION SecurityInformation,
2141   IN PSECURITY_DESCRIPTOR SecurityDescriptor);
2142 
2143 NTSYSCALLAPI
2144 NTSTATUS
2145 NTAPI
2146 NtQuerySecurityObject(
2147   IN HANDLE Handle,
2148   IN SECURITY_INFORMATION SecurityInformation,
2149   OUT PSECURITY_DESCRIPTOR SecurityDescriptor,
2150   IN ULONG Length,
2151   OUT PULONG LengthNeeded);
2152 
2153 NTSYSCALLAPI
2154 NTSTATUS
2155 NTAPI
2156 NtClose(
2157   IN HANDLE Handle);
2158 
2159 NTSYSCALLAPI
2160 NTSTATUS
2161 NTAPI
2162 NtAllocateVirtualMemory(
2163   IN HANDLE ProcessHandle,
2164   IN OUT PVOID *BaseAddress,
2165   IN ULONG_PTR ZeroBits,
2166   IN OUT PSIZE_T RegionSize,
2167   IN ULONG AllocationType,
2168   IN ULONG Protect);
2169 
2170 NTSYSCALLAPI
2171 NTSTATUS
2172 NTAPI
2173 NtFreeVirtualMemory(
2174   IN HANDLE ProcessHandle,
2175   IN OUT PVOID *BaseAddress,
2176   IN OUT PSIZE_T RegionSize,
2177   IN ULONG FreeType);
2178 
2179 #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
2180 
2181 #if (NTDDI_VERSION >= NTDDI_WINXP)
2182 
2183 NTSYSCALLAPI
2184 NTSTATUS
2185 NTAPI
2186 NtOpenThreadTokenEx(
2187   IN HANDLE ThreadHandle,
2188   IN ACCESS_MASK DesiredAccess,
2189   IN BOOLEAN OpenAsSelf,
2190   IN ULONG HandleAttributes,
2191   OUT PHANDLE TokenHandle);
2192 
2193 NTSYSCALLAPI
2194 NTSTATUS
2195 NTAPI
2196 NtOpenProcessTokenEx(
2197   IN HANDLE ProcessHandle,
2198   IN ACCESS_MASK DesiredAccess,
2199   IN ULONG HandleAttributes,
2200   OUT PHANDLE TokenHandle);
2201 
2202 NTSYSAPI
2203 NTSTATUS
2204 NTAPI
2205 NtOpenJobObjectToken(
2206   IN HANDLE JobHandle,
2207   IN ACCESS_MASK DesiredAccess,
2208   OUT PHANDLE TokenHandle);
2209 
2210 NTSYSCALLAPI
2211 NTSTATUS
2212 NTAPI
2213 NtDuplicateToken(
2214   IN HANDLE ExistingTokenHandle,
2215   IN ACCESS_MASK DesiredAccess,
2216   IN POBJECT_ATTRIBUTES ObjectAttributes,
2217   IN BOOLEAN EffectiveOnly,
2218   IN TOKEN_TYPE TokenType,
2219   OUT PHANDLE NewTokenHandle);
2220 
2221 NTSYSCALLAPI
2222 NTSTATUS
2223 NTAPI
2224 NtFilterToken(
2225   IN HANDLE ExistingTokenHandle,
2226   IN ULONG Flags,
2227   IN PTOKEN_GROUPS SidsToDisable OPTIONAL,
2228   IN PTOKEN_PRIVILEGES PrivilegesToDelete OPTIONAL,
2229   IN PTOKEN_GROUPS RestrictedSids OPTIONAL,
2230   OUT PHANDLE NewTokenHandle);
2231 
2232 NTSYSCALLAPI
2233 NTSTATUS
2234 NTAPI
2235 NtImpersonateAnonymousToken(
2236   IN HANDLE ThreadHandle);
2237 
2238 NTSYSCALLAPI
2239 NTSTATUS
2240 NTAPI
2241 NtSetInformationToken(
2242   IN HANDLE TokenHandle,
2243   IN TOKEN_INFORMATION_CLASS TokenInformationClass,
2244   IN PVOID TokenInformation,
2245   IN ULONG TokenInformationLength);
2246 
2247 NTSYSCALLAPI
2248 NTSTATUS
2249 NTAPI
2250 NtAdjustGroupsToken(
2251   IN HANDLE TokenHandle,
2252   IN BOOLEAN ResetToDefault,
2253   IN PTOKEN_GROUPS NewState OPTIONAL,
2254   IN ULONG BufferLength OPTIONAL,
2255   OUT PTOKEN_GROUPS PreviousState,
2256   OUT PULONG ReturnLength);
2257 
2258 NTSYSCALLAPI
2259 NTSTATUS
2260 NTAPI
2261 NtPrivilegeCheck(
2262   IN HANDLE ClientToken,
2263   IN OUT PPRIVILEGE_SET RequiredPrivileges,
2264   OUT PBOOLEAN Result);
2265 
2266 NTSYSCALLAPI
2267 NTSTATUS
2268 NTAPI
2269 NtAccessCheckAndAuditAlarm(
2270   IN PUNICODE_STRING SubsystemName,
2271   IN PVOID HandleId OPTIONAL,
2272   IN PUNICODE_STRING ObjectTypeName,
2273   IN PUNICODE_STRING ObjectName,
2274   IN PSECURITY_DESCRIPTOR SecurityDescriptor,
2275   IN ACCESS_MASK DesiredAccess,
2276   IN PGENERIC_MAPPING GenericMapping,
2277   IN BOOLEAN ObjectCreation,
2278   OUT PACCESS_MASK GrantedAccess,
2279   OUT PNTSTATUS AccessStatus,
2280   OUT PBOOLEAN GenerateOnClose);
2281 
2282 NTSYSCALLAPI
2283 NTSTATUS
2284 NTAPI
2285 NtAccessCheckByTypeAndAuditAlarm(
2286   IN PUNICODE_STRING SubsystemName,
2287   IN PVOID HandleId,
2288   IN PUNICODE_STRING ObjectTypeName,
2289   IN PUNICODE_STRING ObjectName,
2290   IN PSECURITY_DESCRIPTOR SecurityDescriptor,
2291   IN PSID PrincipalSelfSid OPTIONAL,
2292   IN ACCESS_MASK DesiredAccess,
2293   IN AUDIT_EVENT_TYPE AuditType,
2294   IN ULONG Flags,
2295   IN POBJECT_TYPE_LIST ObjectTypeList OPTIONAL,
2296   IN ULONG ObjectTypeLength,
2297   IN PGENERIC_MAPPING GenericMapping,
2298   IN BOOLEAN ObjectCreation,
2299   OUT PACCESS_MASK GrantedAccess,
2300   OUT PNTSTATUS AccessStatus,
2301   OUT PBOOLEAN GenerateOnClose);
2302 
2303 NTSYSCALLAPI
2304 NTSTATUS
2305 NTAPI
2306 NtAccessCheckByTypeResultListAndAuditAlarm(
2307   IN PUNICODE_STRING SubsystemName,
2308   IN PVOID HandleId OPTIONAL,
2309   IN PUNICODE_STRING ObjectTypeName,
2310   IN PUNICODE_STRING ObjectName,
2311   IN PSECURITY_DESCRIPTOR SecurityDescriptor,
2312   IN PSID PrincipalSelfSid OPTIONAL,
2313   IN ACCESS_MASK DesiredAccess,
2314   IN AUDIT_EVENT_TYPE AuditType,
2315   IN ULONG Flags,
2316   IN POBJECT_TYPE_LIST ObjectTypeList OPTIONAL,
2317   IN ULONG ObjectTypeLength,
2318   IN PGENERIC_MAPPING GenericMapping,
2319   IN BOOLEAN ObjectCreation,
2320   OUT PACCESS_MASK GrantedAccess,
2321   OUT PNTSTATUS AccessStatus,
2322   OUT PBOOLEAN GenerateOnClose);
2323 
2324 NTSTATUS
2325 NTAPI
2326 NtAccessCheckByTypeResultListAndAuditAlarmByHandle(
2327   IN PUNICODE_STRING SubsystemName,
2328   IN PVOID HandleId OPTIONAL,
2329   IN HANDLE ClientToken,
2330   IN PUNICODE_STRING ObjectTypeName,
2331   IN PUNICODE_STRING ObjectName,
2332   IN PSECURITY_DESCRIPTOR SecurityDescriptor,
2333   IN PSID PrincipalSelfSid OPTIONAL,
2334   IN ACCESS_MASK DesiredAccess,
2335   IN AUDIT_EVENT_TYPE AuditType,
2336   IN ULONG Flags,
2337   IN POBJECT_TYPE_LIST ObjectTypeList OPTIONAL,
2338   IN ULONG ObjectTypeLength,
2339   IN PGENERIC_MAPPING GenericMapping,
2340   IN BOOLEAN ObjectCreation,
2341   OUT PACCESS_MASK GrantedAccess,
2342   OUT PNTSTATUS AccessStatus,
2343   OUT PBOOLEAN GenerateOnClose);
2344 
2345 NTSYSCALLAPI
2346 NTSTATUS
2347 NTAPI
2348 NtOpenObjectAuditAlarm(
2349   IN PUNICODE_STRING SubsystemName,
2350   IN PVOID HandleId OPTIONAL,
2351   IN PUNICODE_STRING ObjectTypeName,
2352   IN PUNICODE_STRING ObjectName,
2353   IN PSECURITY_DESCRIPTOR SecurityDescriptor OPTIONAL,
2354   IN HANDLE ClientToken,
2355   IN ACCESS_MASK DesiredAccess,
2356   IN ACCESS_MASK GrantedAccess,
2357   IN PPRIVILEGE_SET Privileges OPTIONAL,
2358   IN BOOLEAN ObjectCreation,
2359   IN BOOLEAN AccessGranted,
2360   OUT PBOOLEAN GenerateOnClose);
2361 
2362 NTSYSCALLAPI
2363 NTSTATUS
2364 NTAPI
2365 NtPrivilegeObjectAuditAlarm(
2366   IN PUNICODE_STRING SubsystemName,
2367   IN PVOID HandleId OPTIONAL,
2368   IN HANDLE ClientToken,
2369   IN ACCESS_MASK DesiredAccess,
2370   IN PPRIVILEGE_SET Privileges,
2371   IN BOOLEAN AccessGranted);
2372 
2373 NTSYSCALLAPI
2374 NTSTATUS
2375 NTAPI
2376 NtCloseObjectAuditAlarm(
2377   IN PUNICODE_STRING SubsystemName,
2378   IN PVOID HandleId OPTIONAL,
2379   IN BOOLEAN GenerateOnClose);
2380 
2381 NTSYSCALLAPI
2382 NTSTATUS
2383 NTAPI
2384 NtDeleteObjectAuditAlarm(
2385   IN PUNICODE_STRING SubsystemName,
2386   IN PVOID HandleId OPTIONAL,
2387   IN BOOLEAN GenerateOnClose);
2388 
2389 NTSYSCALLAPI
2390 NTSTATUS
2391 NTAPI
2392 NtPrivilegedServiceAuditAlarm(
2393   IN PUNICODE_STRING SubsystemName,
2394   IN PUNICODE_STRING ServiceName,
2395   IN HANDLE ClientToken,
2396   IN PPRIVILEGE_SET Privileges,
2397   IN BOOLEAN AccessGranted);
2398 
2399 NTSYSCALLAPI
2400 NTSTATUS
2401 NTAPI
2402 NtSetInformationThread(
2403   IN HANDLE ThreadHandle,
2404   IN THREADINFOCLASS ThreadInformationClass,
2405   IN PVOID ThreadInformation,
2406   IN ULONG ThreadInformationLength);
2407 
2408 NTSYSCALLAPI
2409 NTSTATUS
2410 NTAPI
2411 NtCreateSection(
2412   OUT PHANDLE SectionHandle,
2413   IN ACCESS_MASK DesiredAccess,
2414   IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,
2415   IN PLARGE_INTEGER MaximumSize OPTIONAL,
2416   IN ULONG SectionPageProtection,
2417   IN ULONG AllocationAttributes,
2418   IN HANDLE FileHandle OPTIONAL);
2419 
2420 #endif /* (NTDDI_VERSION >= NTDDI_WINXP) */
2421 
2422 #define COMPRESSION_FORMAT_NONE         (0x0000)
2423 #define COMPRESSION_FORMAT_DEFAULT      (0x0001)
2424 #define COMPRESSION_FORMAT_LZNT1        (0x0002)
2425 #define COMPRESSION_ENGINE_STANDARD     (0x0000)
2426 #define COMPRESSION_ENGINE_MAXIMUM      (0x0100)
2427 #define COMPRESSION_ENGINE_HIBER        (0x0200)
2428 
2429 #define MAX_UNICODE_STACK_BUFFER_LENGTH 256
2430 
2431 #define METHOD_FROM_CTL_CODE(ctrlCode)  ((ULONG)(ctrlCode & 3))
2432 
2433 #define METHOD_DIRECT_TO_HARDWARE       METHOD_IN_DIRECT
2434 #define METHOD_DIRECT_FROM_HARDWARE     METHOD_OUT_DIRECT
2435 
2436 typedef ULONG LSA_OPERATIONAL_MODE, *PLSA_OPERATIONAL_MODE;
2437 
2438 typedef enum _SECURITY_LOGON_TYPE {
2439   UndefinedLogonType = 0,
2440   Interactive = 2,
2441   Network,
2442   Batch,
2443   Service,
2444   Proxy,
2445   Unlock,
2446   NetworkCleartext,
2447   NewCredentials,
2448 #if (_WIN32_WINNT >= 0x0501)
2449   RemoteInteractive,
2450   CachedInteractive,
2451 #endif
2452 #if (_WIN32_WINNT >= 0x0502)
2453   CachedRemoteInteractive,
2454   CachedUnlock
2455 #endif
2456 } SECURITY_LOGON_TYPE, *PSECURITY_LOGON_TYPE;
2457 
2458 #ifndef _NTLSA_AUDIT_
2459 #define _NTLSA_AUDIT_
2460 
2461 #ifndef GUID_DEFINED
2462 #include <guiddef.h>
2463 #endif
2464 
2465 #endif /* _NTLSA_AUDIT_ */
2466 
2467 NTSTATUS
2468 NTAPI
2469 LsaRegisterLogonProcess(
2470   IN PLSA_STRING LogonProcessName,
2471   OUT PHANDLE LsaHandle,
2472   OUT PLSA_OPERATIONAL_MODE SecurityMode);
2473 
2474 NTSTATUS
2475 NTAPI
2476 LsaLogonUser(
2477   IN HANDLE LsaHandle,
2478   IN PLSA_STRING OriginName,
2479   IN SECURITY_LOGON_TYPE LogonType,
2480   IN ULONG AuthenticationPackage,
2481   IN PVOID AuthenticationInformation,
2482   IN ULONG AuthenticationInformationLength,
2483   IN PTOKEN_GROUPS LocalGroups OPTIONAL,
2484   IN PTOKEN_SOURCE SourceContext,
2485   OUT PVOID *ProfileBuffer,
2486   OUT PULONG ProfileBufferLength,
2487   OUT PLUID LogonId,
2488   OUT PHANDLE Token,
2489   OUT PQUOTA_LIMITS Quotas,
2490   OUT PNTSTATUS SubStatus);
2491 
2492 NTSTATUS
2493 NTAPI
2494 LsaFreeReturnBuffer(
2495   IN PVOID Buffer);
2496 
2497 #ifndef _NTLSA_IFS_
2498 #define _NTLSA_IFS_
2499 #endif
2500 
2501 #define MSV1_0_PACKAGE_NAME     "MICROSOFT_AUTHENTICATION_PACKAGE_V1_0"
2502 #define MSV1_0_PACKAGE_NAMEW    L"MICROSOFT_AUTHENTICATION_PACKAGE_V1_0"
2503 #define MSV1_0_PACKAGE_NAMEW_LENGTH sizeof(MSV1_0_PACKAGE_NAMEW) - sizeof(WCHAR)
2504 
2505 #define MSV1_0_SUBAUTHENTICATION_KEY "SYSTEM\\CurrentControlSet\\Control\\Lsa\\MSV1_0"
2506 #define MSV1_0_SUBAUTHENTICATION_VALUE "Auth"
2507 
2508 #define MSV1_0_CHALLENGE_LENGTH                8
2509 #define MSV1_0_USER_SESSION_KEY_LENGTH         16
2510 #define MSV1_0_LANMAN_SESSION_KEY_LENGTH       8
2511 
2512 #define MSV1_0_CLEARTEXT_PASSWORD_ALLOWED      0x02
2513 #define MSV1_0_UPDATE_LOGON_STATISTICS         0x04
2514 #define MSV1_0_RETURN_USER_PARAMETERS          0x08
2515 #define MSV1_0_DONT_TRY_GUEST_ACCOUNT          0x10
2516 #define MSV1_0_ALLOW_SERVER_TRUST_ACCOUNT      0x20
2517 #define MSV1_0_RETURN_PASSWORD_EXPIRY          0x40
2518 #define MSV1_0_USE_CLIENT_CHALLENGE            0x80
2519 #define MSV1_0_TRY_GUEST_ACCOUNT_ONLY          0x100
2520 #define MSV1_0_RETURN_PROFILE_PATH             0x200
2521 #define MSV1_0_TRY_SPECIFIED_DOMAIN_ONLY       0x400
2522 #define MSV1_0_ALLOW_WORKSTATION_TRUST_ACCOUNT 0x800
2523 
2524 #define MSV1_0_DISABLE_PERSONAL_FALLBACK     0x00001000
2525 #define MSV1_0_ALLOW_FORCE_GUEST             0x00002000
2526 
2527 #if (_WIN32_WINNT >= 0x0502)
2528 #define MSV1_0_CLEARTEXT_PASSWORD_SUPPLIED   0x00004000
2529 #define MSV1_0_USE_DOMAIN_FOR_ROUTING_ONLY   0x00008000
2530 #endif
2531 
2532 #define MSV1_0_SUBAUTHENTICATION_DLL_EX      0x00100000
2533 #define MSV1_0_ALLOW_MSVCHAPV2               0x00010000
2534 
2535 #if (_WIN32_WINNT >= 0x0600)
2536 #define MSV1_0_S4U2SELF                      0x00020000
2537 #define MSV1_0_CHECK_LOGONHOURS_FOR_S4U      0x00040000
2538 #endif
2539 
2540 #define MSV1_0_SUBAUTHENTICATION_DLL         0xFF000000
2541 #define MSV1_0_SUBAUTHENTICATION_DLL_SHIFT   24
2542 #define MSV1_0_MNS_LOGON                     0x01000000
2543 
2544 #define MSV1_0_SUBAUTHENTICATION_DLL_RAS     2
2545 #define MSV1_0_SUBAUTHENTICATION_DLL_IIS     132
2546 
2547 #define LOGON_GUEST                 0x01
2548 #define LOGON_NOENCRYPTION          0x02
2549 #define LOGON_CACHED_ACCOUNT        0x04
2550 #define LOGON_USED_LM_PASSWORD      0x08
2551 #define LOGON_EXTRA_SIDS            0x20
2552 #define LOGON_SUBAUTH_SESSION_KEY   0x40
2553 #define LOGON_SERVER_TRUST_ACCOUNT  0x80
2554 #define LOGON_NTLMV2_ENABLED        0x100
2555 #define LOGON_RESOURCE_GROUPS       0x200
2556 #define LOGON_PROFILE_PATH_RETURNED 0x400
2557 #define LOGON_NT_V2                 0x800
2558 #define LOGON_LM_V2                 0x1000
2559 #define LOGON_NTLM_V2               0x2000
2560 
2561 #if (_WIN32_WINNT >= 0x0600)
2562 
2563 #define LOGON_OPTIMIZED             0x4000
2564 #define LOGON_WINLOGON              0x8000
2565 #define LOGON_PKINIT               0x10000
2566 #define LOGON_NO_OPTIMIZED         0x20000
2567 
2568 #endif
2569 
2570 #define MSV1_0_SUBAUTHENTICATION_FLAGS 0xFF000000
2571 
2572 #define LOGON_GRACE_LOGON              0x01000000
2573 
2574 #define MSV1_0_OWF_PASSWORD_LENGTH 16
2575 #define MSV1_0_CRED_LM_PRESENT 0x1
2576 #define MSV1_0_CRED_NT_PRESENT 0x2
2577 #define MSV1_0_CRED_VERSION 0
2578 
2579 #define MSV1_0_NTLM3_RESPONSE_LENGTH 16
2580 #define MSV1_0_NTLM3_OWF_LENGTH 16
2581 
2582 #if (_WIN32_WINNT == 0x0500)
2583 #define MSV1_0_MAX_NTLM3_LIFE 1800
2584 #else
2585 #define MSV1_0_MAX_NTLM3_LIFE 129600
2586 #endif
2587 #define MSV1_0_MAX_AVL_SIZE 64000
2588 
2589 #if (_WIN32_WINNT >= 0x0501)
2590 
2591 #define MSV1_0_AV_FLAG_FORCE_GUEST                  0x00000001
2592 
2593 #if (_WIN32_WINNT >= 0x0600)
2594 #define MSV1_0_AV_FLAG_MIC_HANDSHAKE_MESSAGES       0x00000002
2595 #endif
2596 
2597 #endif
2598 
2599 #define MSV1_0_NTLM3_INPUT_LENGTH (sizeof(MSV1_0_NTLM3_RESPONSE) - MSV1_0_NTLM3_RESPONSE_LENGTH)
2600 
2601 #if(_WIN32_WINNT >= 0x0502)
2602 #define MSV1_0_NTLM3_MIN_NT_RESPONSE_LENGTH RTL_SIZEOF_THROUGH_FIELD(MSV1_0_NTLM3_RESPONSE, AvPairsOff)
2603 #endif
2604 
2605 #define USE_PRIMARY_PASSWORD            0x01
2606 #define RETURN_PRIMARY_USERNAME         0x02
2607 #define RETURN_PRIMARY_LOGON_DOMAINNAME 0x04
2608 #define RETURN_NON_NT_USER_SESSION_KEY  0x08
2609 #define GENERATE_CLIENT_CHALLENGE       0x10
2610 #define GCR_NTLM3_PARMS                 0x20
2611 #define GCR_TARGET_INFO                 0x40
2612 #define RETURN_RESERVED_PARAMETER       0x80
2613 #define GCR_ALLOW_NTLM                 0x100
2614 #define GCR_USE_OEM_SET                0x200
2615 #define GCR_MACHINE_CREDENTIAL         0x400
2616 #define GCR_USE_OWF_PASSWORD           0x800
2617 #define GCR_ALLOW_LM                  0x1000
2618 #define GCR_ALLOW_NO_TARGET           0x2000
2619 
2620 typedef enum _MSV1_0_LOGON_SUBMIT_TYPE {
2621   MsV1_0InteractiveLogon = 2,
2622   MsV1_0Lm20Logon,
2623   MsV1_0NetworkLogon,
2624   MsV1_0SubAuthLogon,
2625   MsV1_0WorkstationUnlockLogon = 7,
2626   MsV1_0S4ULogon = 12,
2627   MsV1_0VirtualLogon = 82
2628 } MSV1_0_LOGON_SUBMIT_TYPE, *PMSV1_0_LOGON_SUBMIT_TYPE;
2629 
2630 typedef enum _MSV1_0_PROFILE_BUFFER_TYPE {
2631   MsV1_0InteractiveProfile = 2,
2632   MsV1_0Lm20LogonProfile,
2633   MsV1_0SmartCardProfile
2634 } MSV1_0_PROFILE_BUFFER_TYPE, *PMSV1_0_PROFILE_BUFFER_TYPE;
2635 
2636 typedef struct _MSV1_0_INTERACTIVE_LOGON {
2637   MSV1_0_LOGON_SUBMIT_TYPE MessageType;
2638   UNICODE_STRING LogonDomainName;
2639   UNICODE_STRING UserName;
2640   UNICODE_STRING Password;
2641 } MSV1_0_INTERACTIVE_LOGON, *PMSV1_0_INTERACTIVE_LOGON;
2642 
2643 typedef struct _MSV1_0_INTERACTIVE_PROFILE {
2644   MSV1_0_PROFILE_BUFFER_TYPE MessageType;
2645   USHORT LogonCount;
2646   USHORT BadPasswordCount;
2647   LARGE_INTEGER LogonTime;
2648   LARGE_INTEGER LogoffTime;
2649   LARGE_INTEGER KickOffTime;
2650   LARGE_INTEGER PasswordLastSet;
2651   LARGE_INTEGER PasswordCanChange;
2652   LARGE_INTEGER PasswordMustChange;
2653   UNICODE_STRING LogonScript;
2654   UNICODE_STRING HomeDirectory;
2655   UNICODE_STRING FullName;
2656   UNICODE_STRING ProfilePath;
2657   UNICODE_STRING HomeDirectoryDrive;
2658   UNICODE_STRING LogonServer;
2659   ULONG UserFlags;
2660 } MSV1_0_INTERACTIVE_PROFILE, *PMSV1_0_INTERACTIVE_PROFILE;
2661 
2662 typedef struct _MSV1_0_LM20_LOGON {
2663   MSV1_0_LOGON_SUBMIT_TYPE MessageType;
2664   UNICODE_STRING LogonDomainName;
2665   UNICODE_STRING UserName;
2666   UNICODE_STRING Workstation;
2667   UCHAR ChallengeToClient[MSV1_0_CHALLENGE_LENGTH];
2668   STRING CaseSensitiveChallengeResponse;
2669   STRING CaseInsensitiveChallengeResponse;
2670   ULONG ParameterControl;
2671 } MSV1_0_LM20_LOGON, * PMSV1_0_LM20_LOGON;
2672 
2673 typedef struct _MSV1_0_SUBAUTH_LOGON {
2674   MSV1_0_LOGON_SUBMIT_TYPE MessageType;
2675   UNICODE_STRING LogonDomainName;
2676   UNICODE_STRING UserName;
2677   UNICODE_STRING Workstation;
2678   UCHAR ChallengeToClient[MSV1_0_CHALLENGE_LENGTH];
2679   STRING AuthenticationInfo1;
2680   STRING AuthenticationInfo2;
2681   ULONG ParameterControl;
2682   ULONG SubAuthPackageId;
2683 } MSV1_0_SUBAUTH_LOGON, * PMSV1_0_SUBAUTH_LOGON;
2684 
2685 #if (_WIN32_WINNT >= 0x0600)
2686 
2687 #define MSV1_0_S4U_LOGON_FLAG_CHECK_LOGONHOURS 0x2
2688 
2689 typedef struct _MSV1_0_S4U_LOGON {
2690   MSV1_0_LOGON_SUBMIT_TYPE MessageType;
2691   ULONG Flags;
2692   UNICODE_STRING UserPrincipalName;
2693   UNICODE_STRING DomainName;
2694 } MSV1_0_S4U_LOGON, *PMSV1_0_S4U_LOGON;
2695 
2696 #endif
2697 
2698 typedef struct _MSV1_0_LM20_LOGON_PROFILE {
2699   MSV1_0_PROFILE_BUFFER_TYPE MessageType;
2700   LARGE_INTEGER KickOffTime;
2701   LARGE_INTEGER LogoffTime;
2702   ULONG UserFlags;
2703   UCHAR UserSessionKey[MSV1_0_USER_SESSION_KEY_LENGTH];
2704   UNICODE_STRING LogonDomainName;
2705   UCHAR LanmanSessionKey[MSV1_0_LANMAN_SESSION_KEY_LENGTH];
2706   UNICODE_STRING LogonServer;
2707   UNICODE_STRING UserParameters;
2708 } MSV1_0_LM20_LOGON_PROFILE, * PMSV1_0_LM20_LOGON_PROFILE;
2709 
2710 typedef struct _MSV1_0_SUPPLEMENTAL_CREDENTIAL {
2711   ULONG Version;
2712   ULONG Flags;
2713   UCHAR LmPassword[MSV1_0_OWF_PASSWORD_LENGTH];
2714   UCHAR NtPassword[MSV1_0_OWF_PASSWORD_LENGTH];
2715 } MSV1_0_SUPPLEMENTAL_CREDENTIAL, *PMSV1_0_SUPPLEMENTAL_CREDENTIAL;
2716 
2717 typedef struct _MSV1_0_NTLM3_RESPONSE {
2718   UCHAR Response[MSV1_0_NTLM3_RESPONSE_LENGTH];
2719   UCHAR RespType;
2720   UCHAR HiRespType;
2721   USHORT Flags;
2722   ULONG MsgWord;
2723   ULONGLONG TimeStamp;
2724   UCHAR ChallengeFromClient[MSV1_0_CHALLENGE_LENGTH];
2725   ULONG AvPairsOff;
2726   UCHAR Buffer[1];
2727 } MSV1_0_NTLM3_RESPONSE, *PMSV1_0_NTLM3_RESPONSE;
2728 
2729 typedef enum _MSV1_0_AVID {
2730   MsvAvEOL,
2731   MsvAvNbComputerName,
2732   MsvAvNbDomainName,
2733   MsvAvDnsComputerName,
2734   MsvAvDnsDomainName,
2735 #if (_WIN32_WINNT >= 0x0501)
2736   MsvAvDnsTreeName,
2737   MsvAvFlags,
2738 #if (_WIN32_WINNT >= 0x0600)
2739   MsvAvTimestamp,
2740   MsvAvRestrictions,
2741   MsvAvTargetName,
2742   MsvAvChannelBindings,
2743 #endif
2744 #endif
2745 } MSV1_0_AVID;
2746 
2747 typedef struct _MSV1_0_AV_PAIR {
2748   USHORT AvId;
2749   USHORT AvLen;
2750 } MSV1_0_AV_PAIR, *PMSV1_0_AV_PAIR;
2751 
2752 typedef enum _MSV1_0_PROTOCOL_MESSAGE_TYPE {
2753   MsV1_0Lm20ChallengeRequest = 0,
2754   MsV1_0Lm20GetChallengeResponse,
2755   MsV1_0EnumerateUsers,
2756   MsV1_0GetUserInfo,
2757   MsV1_0ReLogonUsers,
2758   MsV1_0ChangePassword,
2759   MsV1_0ChangeCachedPassword,
2760   MsV1_0GenericPassthrough,
2761   MsV1_0CacheLogon,
2762   MsV1_0SubAuth,
2763   MsV1_0DeriveCredential,
2764   MsV1_0CacheLookup,
2765 #if (_WIN32_WINNT >= 0x0501)
2766   MsV1_0SetProcessOption,
2767 #endif
2768 #if (_WIN32_WINNT >= 0x0600)
2769   MsV1_0ConfigLocalAliases,
2770   MsV1_0ClearCachedCredentials,
2771 #endif
2772 } MSV1_0_PROTOCOL_MESSAGE_TYPE, *PMSV1_0_PROTOCOL_MESSAGE_TYPE;
2773 
2774 typedef struct _MSV1_0_LM20_CHALLENGE_REQUEST {
2775   MSV1_0_PROTOCOL_MESSAGE_TYPE MessageType;
2776 } MSV1_0_LM20_CHALLENGE_REQUEST, *PMSV1_0_LM20_CHALLENGE_REQUEST;
2777 
2778 typedef struct _MSV1_0_LM20_CHALLENGE_RESPONSE {
2779   MSV1_0_PROTOCOL_MESSAGE_TYPE MessageType;
2780   UCHAR ChallengeToClient[MSV1_0_CHALLENGE_LENGTH];
2781 } MSV1_0_LM20_CHALLENGE_RESPONSE, *PMSV1_0_LM20_CHALLENGE_RESPONSE;
2782 
2783 typedef struct _MSV1_0_GETCHALLENRESP_REQUEST_V1 {
2784   MSV1_0_PROTOCOL_MESSAGE_TYPE MessageType;
2785   ULONG ParameterControl;
2786   LUID LogonId;
2787   UNICODE_STRING Password;
2788   UCHAR ChallengeToClient[MSV1_0_CHALLENGE_LENGTH];
2789 } MSV1_0_GETCHALLENRESP_REQUEST_V1, *PMSV1_0_GETCHALLENRESP_REQUEST_V1;
2790 
2791 typedef struct _MSV1_0_GETCHALLENRESP_REQUEST {
2792   MSV1_0_PROTOCOL_MESSAGE_TYPE MessageType;
2793   ULONG ParameterControl;
2794   LUID LogonId;
2795   UNICODE_STRING Password;
2796   UCHAR ChallengeToClient[MSV1_0_CHALLENGE_LENGTH];
2797   UNICODE_STRING UserName;
2798   UNICODE_STRING LogonDomainName;
2799   UNICODE_STRING ServerName;
2800 } MSV1_0_GETCHALLENRESP_REQUEST, *PMSV1_0_GETCHALLENRESP_REQUEST;
2801 
2802 typedef struct _MSV1_0_GETCHALLENRESP_RESPONSE {
2803   MSV1_0_PROTOCOL_MESSAGE_TYPE MessageType;
2804   STRING CaseSensitiveChallengeResponse;
2805   STRING CaseInsensitiveChallengeResponse;
2806   UNICODE_STRING UserName;
2807   UNICODE_STRING LogonDomainName;
2808   UCHAR UserSessionKey[MSV1_0_USER_SESSION_KEY_LENGTH];
2809   UCHAR LanmanSessionKey[MSV1_0_LANMAN_SESSION_KEY_LENGTH];
2810 } MSV1_0_GETCHALLENRESP_RESPONSE, *PMSV1_0_GETCHALLENRESP_RESPONSE;
2811 
2812 typedef struct _MSV1_0_ENUMUSERS_REQUEST {
2813   MSV1_0_PROTOCOL_MESSAGE_TYPE MessageType;
2814 } MSV1_0_ENUMUSERS_REQUEST, *PMSV1_0_ENUMUSERS_REQUEST;
2815 
2816 typedef struct _MSV1_0_ENUMUSERS_RESPONSE {
2817   MSV1_0_PROTOCOL_MESSAGE_TYPE MessageType;
2818   ULONG NumberOfLoggedOnUsers;
2819   PLUID LogonIds;
2820   PULONG EnumHandles;
2821 } MSV1_0_ENUMUSERS_RESPONSE, *PMSV1_0_ENUMUSERS_RESPONSE;
2822 
2823 typedef struct _MSV1_0_GETUSERINFO_REQUEST {
2824   MSV1_0_PROTOCOL_MESSAGE_TYPE MessageType;
2825   LUID LogonId;
2826 } MSV1_0_GETUSERINFO_REQUEST, *PMSV1_0_GETUSERINFO_REQUEST;
2827 
2828 typedef struct _MSV1_0_GETUSERINFO_RESPONSE {
2829   MSV1_0_PROTOCOL_MESSAGE_TYPE MessageType;
2830   PSID UserSid;
2831   UNICODE_STRING UserName;
2832   UNICODE_STRING LogonDomainName;
2833   UNICODE_STRING LogonServer;
2834   SECURITY_LOGON_TYPE LogonType;
2835 } MSV1_0_GETUSERINFO_RESPONSE, *PMSV1_0_GETUSERINFO_RESPONSE;
2836 
2837 
2838 
2839 #define FILE_OPLOCK_BROKEN_TO_LEVEL_2   0x00000007
2840 #define FILE_OPLOCK_BROKEN_TO_NONE      0x00000008
2841 #define FILE_OPBATCH_BREAK_UNDERWAY     0x00000009
2842 
2843 /* also in winnt.h */
2844 #define FILE_NOTIFY_CHANGE_FILE_NAME    0x00000001
2845 #define FILE_NOTIFY_CHANGE_DIR_NAME     0x00000002
2846 #define FILE_NOTIFY_CHANGE_NAME         0x00000003
2847 #define FILE_NOTIFY_CHANGE_ATTRIBUTES   0x00000004
2848 #define FILE_NOTIFY_CHANGE_SIZE         0x00000008
2849 #define FILE_NOTIFY_CHANGE_LAST_WRITE   0x00000010
2850 #define FILE_NOTIFY_CHANGE_LAST_ACCESS  0x00000020
2851 #define FILE_NOTIFY_CHANGE_CREATION     0x00000040
2852 #define FILE_NOTIFY_CHANGE_EA           0x00000080
2853 #define FILE_NOTIFY_CHANGE_SECURITY     0x00000100
2854 #define FILE_NOTIFY_CHANGE_STREAM_NAME  0x00000200
2855 #define FILE_NOTIFY_CHANGE_STREAM_SIZE  0x00000400
2856 #define FILE_NOTIFY_CHANGE_STREAM_WRITE 0x00000800
2857 #define FILE_NOTIFY_VALID_MASK          0x00000fff
2858 
2859 #define FILE_ACTION_ADDED                   0x00000001
2860 #define FILE_ACTION_REMOVED                 0x00000002
2861 #define FILE_ACTION_MODIFIED                0x00000003
2862 #define FILE_ACTION_RENAMED_OLD_NAME        0x00000004
2863 #define FILE_ACTION_RENAMED_NEW_NAME        0x00000005
2864 #define FILE_ACTION_ADDED_STREAM            0x00000006
2865 #define FILE_ACTION_REMOVED_STREAM          0x00000007
2866 #define FILE_ACTION_MODIFIED_STREAM         0x00000008
2867 #define FILE_ACTION_REMOVED_BY_DELETE       0x00000009
2868 #define FILE_ACTION_ID_NOT_TUNNELLED        0x0000000A
2869 #define FILE_ACTION_TUNNELLED_ID_COLLISION  0x0000000B
2870 /* end  winnt.h */
2871 
2872 #define FILE_PIPE_BYTE_STREAM_TYPE          0x00000000
2873 #define FILE_PIPE_MESSAGE_TYPE              0x00000001
2874 
2875 #define FILE_PIPE_ACCEPT_REMOTE_CLIENTS     0x00000000
2876 #define FILE_PIPE_REJECT_REMOTE_CLIENTS     0x00000002
2877 
2878 #define FILE_PIPE_TYPE_VALID_MASK           0x00000003
2879 
2880 #define FILE_PIPE_BYTE_STREAM_MODE          0x00000000
2881 #define FILE_PIPE_MESSAGE_MODE              0x00000001
2882 
2883 #define FILE_PIPE_QUEUE_OPERATION           0x00000000
2884 #define FILE_PIPE_COMPLETE_OPERATION        0x00000001
2885 
2886 #define FILE_PIPE_INBOUND                   0x00000000
2887 #define FILE_PIPE_OUTBOUND                  0x00000001
2888 #define FILE_PIPE_FULL_DUPLEX               0x00000002
2889 
2890 #define FILE_PIPE_DISCONNECTED_STATE        0x00000001
2891 #define FILE_PIPE_LISTENING_STATE           0x00000002
2892 #define FILE_PIPE_CONNECTED_STATE           0x00000003
2893 #define FILE_PIPE_CLOSING_STATE             0x00000004
2894 
2895 #define FILE_PIPE_CLIENT_END                0x00000000
2896 #define FILE_PIPE_SERVER_END                0x00000001
2897 
2898 #define FILE_CASE_SENSITIVE_SEARCH          0x00000001
2899 #define FILE_CASE_PRESERVED_NAMES           0x00000002
2900 #define FILE_UNICODE_ON_DISK                0x00000004
2901 #define FILE_PERSISTENT_ACLS                0x00000008
2902 #define FILE_FILE_COMPRESSION               0x00000010
2903 #define FILE_VOLUME_QUOTAS                  0x00000020
2904 #define FILE_SUPPORTS_SPARSE_FILES          0x00000040
2905 #define FILE_SUPPORTS_REPARSE_POINTS        0x00000080
2906 #define FILE_SUPPORTS_REMOTE_STORAGE        0x00000100
2907 #define FILE_VOLUME_IS_COMPRESSED           0x00008000
2908 #define FILE_SUPPORTS_OBJECT_IDS            0x00010000
2909 #define FILE_SUPPORTS_ENCRYPTION            0x00020000
2910 #define FILE_NAMED_STREAMS                  0x00040000
2911 #define FILE_READ_ONLY_VOLUME               0x00080000
2912 #define FILE_SEQUENTIAL_WRITE_ONCE          0x00100000
2913 #define FILE_SUPPORTS_TRANSACTIONS          0x00200000
2914 #define FILE_SUPPORTS_HARD_LINKS            0x00400000
2915 #define FILE_SUPPORTS_EXTENDED_ATTRIBUTES   0x00800000
2916 #define FILE_SUPPORTS_OPEN_BY_FILE_ID       0x01000000
2917 #define FILE_SUPPORTS_USN_JOURNAL           0x02000000
2918 
2919 #define FILE_NEED_EA                    0x00000080
2920 
2921 #define FILE_EA_TYPE_BINARY             0xfffe
2922 #define FILE_EA_TYPE_ASCII              0xfffd
2923 #define FILE_EA_TYPE_BITMAP             0xfffb
2924 #define FILE_EA_TYPE_METAFILE           0xfffa
2925 #define FILE_EA_TYPE_ICON               0xfff9
2926 #define FILE_EA_TYPE_EA                 0xffee
2927 #define FILE_EA_TYPE_MVMT               0xffdf
2928 #define FILE_EA_TYPE_MVST               0xffde
2929 #define FILE_EA_TYPE_ASN1               0xffdd
2930 #define FILE_EA_TYPE_FAMILY_IDS         0xff01
2931 
2932 typedef struct _FILE_NOTIFY_INFORMATION {
2933   ULONG NextEntryOffset;
2934   ULONG Action;
2935   ULONG FileNameLength;
2936   WCHAR FileName[1];
2937 } FILE_NOTIFY_INFORMATION, *PFILE_NOTIFY_INFORMATION;
2938 
2939 typedef struct _FILE_DIRECTORY_INFORMATION {
2940   ULONG NextEntryOffset;
2941   ULONG FileIndex;
2942   LARGE_INTEGER CreationTime;
2943   LARGE_INTEGER LastAccessTime;
2944   LARGE_INTEGER LastWriteTime;
2945   LARGE_INTEGER ChangeTime;
2946   LARGE_INTEGER EndOfFile;
2947   LARGE_INTEGER AllocationSize;
2948   ULONG FileAttributes;
2949   ULONG FileNameLength;
2950   WCHAR FileName[1];
2951 } FILE_DIRECTORY_INFORMATION, *PFILE_DIRECTORY_INFORMATION;
2952 
2953 typedef struct _FILE_FULL_DIR_INFORMATION {
2954   ULONG NextEntryOffset;
2955   ULONG FileIndex;
2956   LARGE_INTEGER CreationTime;
2957   LARGE_INTEGER LastAccessTime;
2958   LARGE_INTEGER LastWriteTime;
2959   LARGE_INTEGER ChangeTime;
2960   LARGE_INTEGER EndOfFile;
2961   LARGE_INTEGER AllocationSize;
2962   ULONG FileAttributes;
2963   ULONG FileNameLength;
2964   ULONG EaSize;
2965   WCHAR FileName[1];
2966 } FILE_FULL_DIR_INFORMATION, *PFILE_FULL_DIR_INFORMATION;
2967 
2968 typedef struct _FILE_ID_FULL_DIR_INFORMATION {
2969   ULONG NextEntryOffset;
2970   ULONG FileIndex;
2971   LARGE_INTEGER CreationTime;
2972   LARGE_INTEGER LastAccessTime;
2973   LARGE_INTEGER LastWriteTime;
2974   LARGE_INTEGER ChangeTime;
2975   LARGE_INTEGER EndOfFile;
2976   LARGE_INTEGER AllocationSize;
2977   ULONG FileAttributes;
2978   ULONG FileNameLength;
2979   ULONG EaSize;
2980   LARGE_INTEGER FileId;
2981   WCHAR FileName[1];
2982 } FILE_ID_FULL_DIR_INFORMATION, *PFILE_ID_FULL_DIR_INFORMATION;
2983 
2984 typedef struct _FILE_BOTH_DIR_INFORMATION {
2985   ULONG NextEntryOffset;
2986   ULONG FileIndex;
2987   LARGE_INTEGER CreationTime;
2988   LARGE_INTEGER LastAccessTime;
2989   LARGE_INTEGER LastWriteTime;
2990   LARGE_INTEGER ChangeTime;
2991   LARGE_INTEGER EndOfFile;
2992   LARGE_INTEGER AllocationSize;
2993   ULONG FileAttributes;
2994   ULONG FileNameLength;
2995   ULONG EaSize;
2996   CCHAR ShortNameLength;
2997   WCHAR ShortName[12];
2998   WCHAR FileName[1];
2999 } FILE_BOTH_DIR_INFORMATION, *PFILE_BOTH_DIR_INFORMATION;
3000 
3001 typedef struct _FILE_ID_BOTH_DIR_INFORMATION {
3002   ULONG NextEntryOffset;
3003   ULONG FileIndex;
3004   LARGE_INTEGER CreationTime;
3005   LARGE_INTEGER LastAccessTime;
3006   LARGE_INTEGER LastWriteTime;
3007   LARGE_INTEGER ChangeTime;
3008   LARGE_INTEGER EndOfFile;
3009   LARGE_INTEGER AllocationSize;
3010   ULONG FileAttributes;
3011   ULONG FileNameLength;
3012   ULONG EaSize;
3013   CCHAR ShortNameLength;
3014   WCHAR ShortName[12];
3015   LARGE_INTEGER FileId;
3016   WCHAR FileName[1];
3017 } FILE_ID_BOTH_DIR_INFORMATION, *PFILE_ID_BOTH_DIR_INFORMATION;
3018 
3019 typedef struct _FILE_NAMES_INFORMATION {
3020   ULONG NextEntryOffset;
3021   ULONG FileIndex;
3022   ULONG FileNameLength;
3023   WCHAR FileName[1];
3024 } FILE_NAMES_INFORMATION, *PFILE_NAMES_INFORMATION;
3025 
3026 typedef struct _FILE_ID_GLOBAL_TX_DIR_INFORMATION {
3027   ULONG NextEntryOffset;
3028   ULONG FileIndex;
3029   LARGE_INTEGER CreationTime;
3030   LARGE_INTEGER LastAccessTime;
3031   LARGE_INTEGER LastWriteTime;
3032   LARGE_INTEGER ChangeTime;
3033   LARGE_INTEGER EndOfFile;
3034   LARGE_INTEGER AllocationSize;
3035   ULONG FileAttributes;
3036   ULONG FileNameLength;
3037   LARGE_INTEGER FileId;
3038   GUID LockingTransactionId;
3039   ULONG TxInfoFlags;
3040   WCHAR FileName[1];
3041 } FILE_ID_GLOBAL_TX_DIR_INFORMATION, *PFILE_ID_GLOBAL_TX_DIR_INFORMATION;
3042 
3043 #define FILE_ID_GLOBAL_TX_DIR_INFO_FLAG_WRITELOCKED         0x00000001
3044 #define FILE_ID_GLOBAL_TX_DIR_INFO_FLAG_VISIBLE_TO_TX       0x00000002
3045 #define FILE_ID_GLOBAL_TX_DIR_INFO_FLAG_VISIBLE_OUTSIDE_TX  0x00000004
3046 
3047 typedef struct _FILE_OBJECTID_INFORMATION {
3048   LONGLONG FileReference;
3049   UCHAR ObjectId[16];
3050   _ANONYMOUS_UNION union {
3051     _ANONYMOUS_STRUCT struct {
3052       UCHAR BirthVolumeId[16];
3053       UCHAR BirthObjectId[16];
3054       UCHAR DomainId[16];
3055     } DUMMYSTRUCTNAME;
3056     UCHAR ExtendedInfo[48];
3057   } DUMMYUNIONNAME;
3058 } FILE_OBJECTID_INFORMATION, *PFILE_OBJECTID_INFORMATION;
3059 
3060 #define ANSI_DOS_STAR                   ('<')
3061 #define ANSI_DOS_QM                     ('>')
3062 #define ANSI_DOS_DOT                    ('"')
3063 
3064 #define DOS_STAR                        (L'<')
3065 #define DOS_QM                          (L'>')
3066 #define DOS_DOT                         (L'"')
3067 
3068 typedef struct _FILE_INTERNAL_INFORMATION {
3069   LARGE_INTEGER IndexNumber;
3070 } FILE_INTERNAL_INFORMATION, *PFILE_INTERNAL_INFORMATION;
3071 
3072 typedef struct _FILE_EA_INFORMATION {
3073   ULONG EaSize;
3074 } FILE_EA_INFORMATION, *PFILE_EA_INFORMATION;
3075 
3076 typedef struct _FILE_ACCESS_INFORMATION {
3077   ACCESS_MASK AccessFlags;
3078 } FILE_ACCESS_INFORMATION, *PFILE_ACCESS_INFORMATION;
3079 
3080 typedef struct _FILE_MODE_INFORMATION {
3081   ULONG Mode;
3082 } FILE_MODE_INFORMATION, *PFILE_MODE_INFORMATION;
3083 
3084 typedef struct _FILE_ALL_INFORMATION {
3085   FILE_BASIC_INFORMATION BasicInformation;
3086   FILE_STANDARD_INFORMATION StandardInformation;
3087   FILE_INTERNAL_INFORMATION InternalInformation;
3088   FILE_EA_INFORMATION EaInformation;
3089   FILE_ACCESS_INFORMATION AccessInformation;
3090   FILE_POSITION_INFORMATION PositionInformation;
3091   FILE_MODE_INFORMATION ModeInformation;
3092   FILE_ALIGNMENT_INFORMATION AlignmentInformation;
3093   FILE_NAME_INFORMATION NameInformation;
3094 } FILE_ALL_INFORMATION, *PFILE_ALL_INFORMATION;
3095 
3096 typedef struct _FILE_ALLOCATION_INFORMATION {
3097   LARGE_INTEGER AllocationSize;
3098 } FILE_ALLOCATION_INFORMATION, *PFILE_ALLOCATION_INFORMATION;
3099 
3100 typedef struct _FILE_COMPRESSION_INFORMATION {
3101   LARGE_INTEGER CompressedFileSize;
3102   USHORT CompressionFormat;
3103   UCHAR CompressionUnitShift;
3104   UCHAR ChunkShift;
3105   UCHAR ClusterShift;
3106   UCHAR Reserved[3];
3107 } FILE_COMPRESSION_INFORMATION, *PFILE_COMPRESSION_INFORMATION;
3108 
3109 typedef struct _FILE_LINK_INFORMATION {
3110   BOOLEAN ReplaceIfExists;
3111   HANDLE RootDirectory;
3112   ULONG FileNameLength;
3113   WCHAR FileName[1];
3114 } FILE_LINK_INFORMATION, *PFILE_LINK_INFORMATION;
3115 
3116 typedef struct _FILE_MOVE_CLUSTER_INFORMATION {
3117   ULONG ClusterCount;
3118   HANDLE RootDirectory;
3119   ULONG FileNameLength;
3120   WCHAR FileName[1];
3121 } FILE_MOVE_CLUSTER_INFORMATION, *PFILE_MOVE_CLUSTER_INFORMATION;
3122 
3123 typedef struct _FILE_RENAME_INFORMATION {
3124   BOOLEAN ReplaceIfExists;
3125   HANDLE RootDirectory;
3126   ULONG FileNameLength;
3127   WCHAR FileName[1];
3128 } FILE_RENAME_INFORMATION, *PFILE_RENAME_INFORMATION;
3129 
3130 typedef struct _FILE_STREAM_INFORMATION {
3131   ULONG NextEntryOffset;
3132   ULONG StreamNameLength;
3133   LARGE_INTEGER StreamSize;
3134   LARGE_INTEGER StreamAllocationSize;
3135   WCHAR StreamName[1];
3136 } FILE_STREAM_INFORMATION, *PFILE_STREAM_INFORMATION;
3137 
3138 typedef struct _FILE_TRACKING_INFORMATION {
3139   HANDLE DestinationFile;
3140   ULONG ObjectInformationLength;
3141   CHAR ObjectInformation[1];
3142 } FILE_TRACKING_INFORMATION, *PFILE_TRACKING_INFORMATION;
3143 
3144 typedef struct _FILE_COMPLETION_INFORMATION {
3145   HANDLE Port;
3146   PVOID Key;
3147 } FILE_COMPLETION_INFORMATION, *PFILE_COMPLETION_INFORMATION;
3148 
3149 typedef struct _FILE_PIPE_INFORMATION {
3150   ULONG ReadMode;
3151   ULONG CompletionMode;
3152 } FILE_PIPE_INFORMATION, *PFILE_PIPE_INFORMATION;
3153 
3154 typedef struct _FILE_PIPE_LOCAL_INFORMATION {
3155   ULONG NamedPipeType;
3156   ULONG NamedPipeConfiguration;
3157   ULONG MaximumInstances;
3158   ULONG CurrentInstances;
3159   ULONG InboundQuota;
3160   ULONG ReadDataAvailable;
3161   ULONG OutboundQuota;
3162   ULONG WriteQuotaAvailable;
3163   ULONG NamedPipeState;
3164   ULONG NamedPipeEnd;
3165 } FILE_PIPE_LOCAL_INFORMATION, *PFILE_PIPE_LOCAL_INFORMATION;
3166 
3167 typedef struct _FILE_PIPE_REMOTE_INFORMATION {
3168   LARGE_INTEGER CollectDataTime;
3169   ULONG MaximumCollectionCount;
3170 } FILE_PIPE_REMOTE_INFORMATION, *PFILE_PIPE_REMOTE_INFORMATION;
3171 
3172 typedef struct _FILE_MAILSLOT_QUERY_INFORMATION {
3173   ULONG MaximumMessageSize;
3174   ULONG MailslotQuota;
3175   ULONG NextMessageSize;
3176   ULONG MessagesAvailable;
3177   LARGE_INTEGER ReadTimeout;
3178 } FILE_MAILSLOT_QUERY_INFORMATION, *PFILE_MAILSLOT_QUERY_INFORMATION;
3179 
3180 typedef struct _FILE_MAILSLOT_SET_INFORMATION {
3181   PLARGE_INTEGER ReadTimeout;
3182 } FILE_MAILSLOT_SET_INFORMATION, *PFILE_MAILSLOT_SET_INFORMATION;
3183 
3184 typedef struct _FILE_REPARSE_POINT_INFORMATION {
3185   LONGLONG FileReference;
3186   ULONG Tag;
3187 } FILE_REPARSE_POINT_INFORMATION, *PFILE_REPARSE_POINT_INFORMATION;
3188 
3189 typedef struct _FILE_LINK_ENTRY_INFORMATION {
3190   ULONG NextEntryOffset;
3191   LONGLONG ParentFileId;
3192   ULONG FileNameLength;
3193   WCHAR FileName[1];
3194 } FILE_LINK_ENTRY_INFORMATION, *PFILE_LINK_ENTRY_INFORMATION;
3195 
3196 typedef struct _FILE_LINKS_INFORMATION {
3197   ULONG BytesNeeded;
3198   ULONG EntriesReturned;
3199   FILE_LINK_ENTRY_INFORMATION Entry;
3200 } FILE_LINKS_INFORMATION, *PFILE_LINKS_INFORMATION;
3201 
3202 typedef struct _FILE_NETWORK_PHYSICAL_NAME_INFORMATION {
3203   ULONG FileNameLength;
3204   WCHAR FileName[1];
3205 } FILE_NETWORK_PHYSICAL_NAME_INFORMATION, *PFILE_NETWORK_PHYSICAL_NAME_INFORMATION;
3206 
3207 typedef struct _FILE_STANDARD_LINK_INFORMATION {
3208   ULONG NumberOfAccessibleLinks;
3209   ULONG TotalNumberOfLinks;
3210   BOOLEAN DeletePending;
3211   BOOLEAN Directory;
3212 } FILE_STANDARD_LINK_INFORMATION, *PFILE_STANDARD_LINK_INFORMATION;
3213 
3214 typedef struct _FILE_GET_EA_INFORMATION {
3215   ULONG NextEntryOffset;
3216   UCHAR EaNameLength;
3217   CHAR  EaName[1];
3218 } FILE_GET_EA_INFORMATION, *PFILE_GET_EA_INFORMATION;
3219 
3220 #define REMOTE_PROTOCOL_FLAG_LOOPBACK       0x00000001
3221 #define REMOTE_PROTOCOL_FLAG_OFFLINE        0x00000002
3222 
3223 typedef struct _FILE_REMOTE_PROTOCOL_INFORMATION {
3224   USHORT StructureVersion;
3225   USHORT StructureSize;
3226   ULONG  Protocol;
3227   USHORT ProtocolMajorVersion;
3228   USHORT ProtocolMinorVersion;
3229   USHORT ProtocolRevision;
3230   USHORT Reserved;
3231   ULONG  Flags;
3232   struct {
3233     ULONG Reserved[8];
3234   } GenericReserved;
3235   struct {
3236     ULONG Reserved[16];
3237   } ProtocolSpecificReserved;
3238 } FILE_REMOTE_PROTOCOL_INFORMATION, *PFILE_REMOTE_PROTOCOL_INFORMATION;
3239 
3240 typedef struct _FILE_GET_QUOTA_INFORMATION {
3241   ULONG NextEntryOffset;
3242   ULONG SidLength;
3243   SID Sid;
3244 } FILE_GET_QUOTA_INFORMATION, *PFILE_GET_QUOTA_INFORMATION;
3245 
3246 typedef struct _FILE_QUOTA_INFORMATION {
3247   ULONG NextEntryOffset;
3248   ULONG SidLength;
3249   LARGE_INTEGER ChangeTime;
3250   LARGE_INTEGER QuotaUsed;
3251   LARGE_INTEGER QuotaThreshold;
3252   LARGE_INTEGER QuotaLimit;
3253   SID Sid;
3254 } FILE_QUOTA_INFORMATION, *PFILE_QUOTA_INFORMATION;
3255 
3256 typedef struct _FILE_FS_ATTRIBUTE_INFORMATION {
3257   ULONG FileSystemAttributes;
3258   ULONG MaximumComponentNameLength;
3259   ULONG FileSystemNameLength;
3260   WCHAR FileSystemName[1];
3261 } FILE_FS_ATTRIBUTE_INFORMATION, *PFILE_FS_ATTRIBUTE_INFORMATION;
3262 
3263 typedef struct _FILE_FS_DRIVER_PATH_INFORMATION {
3264   BOOLEAN DriverInPath;
3265   ULONG DriverNameLength;
3266   WCHAR DriverName[1];
3267 } FILE_FS_DRIVER_PATH_INFORMATION, *PFILE_FS_DRIVER_PATH_INFORMATION;
3268 
3269 typedef struct _FILE_FS_VOLUME_FLAGS_INFORMATION {
3270   ULONG Flags;
3271 } FILE_FS_VOLUME_FLAGS_INFORMATION, *PFILE_FS_VOLUME_FLAGS_INFORMATION;
3272 
3273 #define FILE_VC_QUOTA_NONE              0x00000000
3274 #define FILE_VC_QUOTA_TRACK             0x00000001
3275 #define FILE_VC_QUOTA_ENFORCE           0x00000002
3276 #define FILE_VC_QUOTA_MASK              0x00000003
3277 #define FILE_VC_CONTENT_INDEX_DISABLED  0x00000008
3278 #define FILE_VC_LOG_QUOTA_THRESHOLD     0x00000010
3279 #define FILE_VC_LOG_QUOTA_LIMIT         0x00000020
3280 #define FILE_VC_LOG_VOLUME_THRESHOLD    0x00000040
3281 #define FILE_VC_LOG_VOLUME_LIMIT        0x00000080
3282 #define FILE_VC_QUOTAS_INCOMPLETE       0x00000100
3283 #define FILE_VC_QUOTAS_REBUILDING       0x00000200
3284 #define FILE_VC_VALID_MASK              0x000003ff
3285 
3286 typedef struct _FILE_FS_CONTROL_INFORMATION {
3287   LARGE_INTEGER FreeSpaceStartFiltering;
3288   LARGE_INTEGER FreeSpaceThreshold;
3289   LARGE_INTEGER FreeSpaceStopFiltering;
3290   LARGE_INTEGER DefaultQuotaThreshold;
3291   LARGE_INTEGER DefaultQuotaLimit;
3292   ULONG FileSystemControlFlags;
3293 } FILE_FS_CONTROL_INFORMATION, *PFILE_FS_CONTROL_INFORMATION;
3294 
3295 #ifndef _FILESYSTEMFSCTL_
3296 #define _FILESYSTEMFSCTL_
3297 
3298 #define FSCTL_REQUEST_OPLOCK_LEVEL_1    CTL_CODE(FILE_DEVICE_FILE_SYSTEM,  0, METHOD_BUFFERED, FILE_ANY_ACCESS)
3299 #define FSCTL_REQUEST_OPLOCK_LEVEL_2    CTL_CODE(FILE_DEVICE_FILE_SYSTEM,  1, METHOD_BUFFERED, FILE_ANY_ACCESS)
3300 #define FSCTL_REQUEST_BATCH_OPLOCK      CTL_CODE(FILE_DEVICE_FILE_SYSTEM,  2, METHOD_BUFFERED, FILE_ANY_ACCESS)
3301 #define FSCTL_OPLOCK_BREAK_ACKNOWLEDGE  CTL_CODE(FILE_DEVICE_FILE_SYSTEM,  3, METHOD_BUFFERED, FILE_ANY_ACCESS)
3302 #define FSCTL_OPBATCH_ACK_CLOSE_PENDING CTL_CODE(FILE_DEVICE_FILE_SYSTEM,  4, METHOD_BUFFERED, FILE_ANY_ACCESS)
3303 #define FSCTL_OPLOCK_BREAK_NOTIFY       CTL_CODE(FILE_DEVICE_FILE_SYSTEM,  5, METHOD_BUFFERED, FILE_ANY_ACCESS)
3304 #define FSCTL_LOCK_VOLUME               CTL_CODE(FILE_DEVICE_FILE_SYSTEM,  6, METHOD_BUFFERED, FILE_ANY_ACCESS)
3305 #define FSCTL_UNLOCK_VOLUME             CTL_CODE(FILE_DEVICE_FILE_SYSTEM,  7, METHOD_BUFFERED, FILE_ANY_ACCESS)
3306 #define FSCTL_DISMOUNT_VOLUME           CTL_CODE(FILE_DEVICE_FILE_SYSTEM,  8, METHOD_BUFFERED, FILE_ANY_ACCESS)
3307 #define FSCTL_IS_VOLUME_MOUNTED         CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 10, METHOD_BUFFERED, FILE_ANY_ACCESS)
3308 #define FSCTL_IS_PATHNAME_VALID         CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 11, METHOD_BUFFERED, FILE_ANY_ACCESS)
3309 #define FSCTL_MARK_VOLUME_DIRTY         CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 12, METHOD_BUFFERED, FILE_ANY_ACCESS)
3310 #define FSCTL_QUERY_RETRIEVAL_POINTERS  CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 14, METHOD_NEITHER,  FILE_ANY_ACCESS)
3311 #define FSCTL_GET_COMPRESSION           CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 15, METHOD_BUFFERED, FILE_ANY_ACCESS)
3312 #define FSCTL_SET_COMPRESSION           CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 16, METHOD_BUFFERED, FILE_READ_DATA | FILE_WRITE_DATA)
3313 #define FSCTL_SET_BOOTLOADER_ACCESSED   CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 19, METHOD_NEITHER,  FILE_ANY_ACCESS)
3314 
3315 #define FSCTL_OPLOCK_BREAK_ACK_NO_2     CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 20, METHOD_BUFFERED, FILE_ANY_ACCESS)
3316 #define FSCTL_INVALIDATE_VOLUMES        CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 21, METHOD_BUFFERED, FILE_ANY_ACCESS)
3317 #define FSCTL_QUERY_FAT_BPB             CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 22, METHOD_BUFFERED, FILE_ANY_ACCESS)
3318 #define FSCTL_REQUEST_FILTER_OPLOCK     CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 23, METHOD_BUFFERED, FILE_ANY_ACCESS)
3319 #define FSCTL_FILESYSTEM_GET_STATISTICS CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 24, METHOD_BUFFERED, FILE_ANY_ACCESS)
3320 
3321 #if (_WIN32_WINNT >= 0x0400)
3322 
3323 #define FSCTL_GET_NTFS_VOLUME_DATA      CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 25, METHOD_BUFFERED, FILE_ANY_ACCESS)
3324 #define FSCTL_GET_NTFS_FILE_RECORD      CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 26, METHOD_BUFFERED, FILE_ANY_ACCESS)
3325 #define FSCTL_GET_VOLUME_BITMAP         CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 27, METHOD_NEITHER,  FILE_ANY_ACCESS)
3326 #define FSCTL_GET_RETRIEVAL_POINTERS    CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 28, METHOD_NEITHER,  FILE_ANY_ACCESS)
3327 #define FSCTL_MOVE_FILE                 CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 29, METHOD_BUFFERED, FILE_SPECIAL_ACCESS)
3328 #define FSCTL_IS_VOLUME_DIRTY           CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 30, METHOD_BUFFERED, FILE_ANY_ACCESS)
3329 #define FSCTL_ALLOW_EXTENDED_DASD_IO    CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 32, METHOD_NEITHER,  FILE_ANY_ACCESS)
3330 
3331 #endif
3332 
3333 #if (_WIN32_WINNT >= 0x0500)
3334 
3335 #define FSCTL_FIND_FILES_BY_SID         CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 35, METHOD_NEITHER,  FILE_ANY_ACCESS)
3336 #define FSCTL_SET_OBJECT_ID             CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 38, METHOD_BUFFERED, FILE_SPECIAL_ACCESS)
3337 #define FSCTL_GET_OBJECT_ID             CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 39, METHOD_BUFFERED, FILE_ANY_ACCESS)
3338 #define FSCTL_DELETE_OBJECT_ID          CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 40, METHOD_BUFFERED, FILE_SPECIAL_ACCESS)
3339 #define FSCTL_SET_REPARSE_POINT         CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 41, METHOD_BUFFERED, FILE_SPECIAL_ACCESS)
3340 #define FSCTL_GET_REPARSE_POINT         CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 42, METHOD_BUFFERED, FILE_ANY_ACCESS)
3341 #define FSCTL_DELETE_REPARSE_POINT      CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 43, METHOD_BUFFERED, FILE_SPECIAL_ACCESS)
3342 #define FSCTL_ENUM_USN_DATA             CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 44, METHOD_NEITHER,  FILE_ANY_ACCESS)
3343 #define FSCTL_SECURITY_ID_CHECK         CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 45, METHOD_NEITHER,  FILE_READ_DATA)
3344 #define FSCTL_READ_USN_JOURNAL          CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 46, METHOD_NEITHER,  FILE_ANY_ACCESS)
3345 #define FSCTL_SET_OBJECT_ID_EXTENDED    CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 47, METHOD_BUFFERED, FILE_SPECIAL_ACCESS)
3346 #define FSCTL_CREATE_OR_GET_OBJECT_ID   CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 48, METHOD_BUFFERED, FILE_ANY_ACCESS)
3347 #define FSCTL_SET_SPARSE                CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 49, METHOD_BUFFERED, FILE_SPECIAL_ACCESS)
3348 #define FSCTL_SET_ZERO_DATA             CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 50, METHOD_BUFFERED, FILE_WRITE_DATA)
3349 #define FSCTL_QUERY_ALLOCATED_RANGES    CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 51, METHOD_NEITHER,  FILE_READ_DATA)
3350 #define FSCTL_ENABLE_UPGRADE            CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 52, METHOD_BUFFERED, FILE_WRITE_DATA)
3351 #define FSCTL_SET_ENCRYPTION            CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 53, METHOD_NEITHER,  FILE_ANY_ACCESS)
3352 #define FSCTL_ENCRYPTION_FSCTL_IO       CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 54, METHOD_NEITHER,  FILE_ANY_ACCESS)
3353 #define FSCTL_WRITE_RAW_ENCRYPTED       CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 55, METHOD_NEITHER,  FILE_SPECIAL_ACCESS)
3354 #define FSCTL_READ_RAW_ENCRYPTED        CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 56, METHOD_NEITHER,  FILE_SPECIAL_ACCESS)
3355 #define FSCTL_CREATE_USN_JOURNAL        CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 57, METHOD_NEITHER,  FILE_ANY_ACCESS)
3356 #define FSCTL_READ_FILE_USN_DATA        CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 58, METHOD_NEITHER,  FILE_ANY_ACCESS)
3357 #define FSCTL_WRITE_USN_CLOSE_RECORD    CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 59, METHOD_NEITHER,  FILE_ANY_ACCESS)
3358 #define FSCTL_EXTEND_VOLUME             CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 60, METHOD_BUFFERED, FILE_ANY_ACCESS)
3359 #define FSCTL_QUERY_USN_JOURNAL         CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 61, METHOD_BUFFERED, FILE_ANY_ACCESS)
3360 #define FSCTL_DELETE_USN_JOURNAL        CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 62, METHOD_BUFFERED, FILE_ANY_ACCESS)
3361 #define FSCTL_MARK_HANDLE               CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 63, METHOD_BUFFERED, FILE_ANY_ACCESS)
3362 #define FSCTL_SIS_COPYFILE              CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 64, METHOD_BUFFERED, FILE_ANY_ACCESS)
3363 #define FSCTL_SIS_LINK_FILES            CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 65, METHOD_BUFFERED, FILE_READ_DATA | FILE_WRITE_DATA)
3364 #define FSCTL_RECALL_FILE               CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 69, METHOD_NEITHER, FILE_ANY_ACCESS)
3365 #define FSCTL_READ_FROM_PLEX            CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 71, METHOD_OUT_DIRECT, FILE_READ_DATA)
3366 #define FSCTL_FILE_PREFETCH             CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 72, METHOD_BUFFERED, FILE_SPECIAL_ACCESS)
3367 
3368 #endif
3369 
3370 #if (_WIN32_WINNT >= 0x0600)
3371 
3372 #define FSCTL_MAKE_MEDIA_COMPATIBLE         CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 76, METHOD_BUFFERED, FILE_WRITE_DATA)
3373 #define FSCTL_SET_DEFECT_MANAGEMENT         CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 77, METHOD_BUFFERED, FILE_WRITE_DATA)
3374 #define FSCTL_QUERY_SPARING_INFO            CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 78, METHOD_BUFFERED, FILE_ANY_ACCESS)
3375 #define FSCTL_QUERY_ON_DISK_VOLUME_INFO     CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 79, METHOD_BUFFERED, FILE_ANY_ACCESS)
3376 #define FSCTL_SET_VOLUME_COMPRESSION_STATE  CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 80, METHOD_BUFFERED, FILE_SPECIAL_ACCESS)
3377 #define FSCTL_TXFS_MODIFY_RM                CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 81, METHOD_BUFFERED, FILE_WRITE_DATA)
3378 #define FSCTL_TXFS_QUERY_RM_INFORMATION     CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 82, METHOD_BUFFERED, FILE_READ_DATA)
3379 #define FSCTL_TXFS_ROLLFORWARD_REDO         CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 84, METHOD_BUFFERED, FILE_WRITE_DATA)
3380 #define FSCTL_TXFS_ROLLFORWARD_UNDO         CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 85, METHOD_BUFFERED, FILE_WRITE_DATA)
3381 #define FSCTL_TXFS_START_RM                 CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 86, METHOD_BUFFERED, FILE_WRITE_DATA)
3382 #define FSCTL_TXFS_SHUTDOWN_RM              CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 87, METHOD_BUFFERED, FILE_WRITE_DATA)
3383 #define FSCTL_TXFS_READ_BACKUP_INFORMATION  CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 88, METHOD_BUFFERED, FILE_READ_DATA)
3384 #define FSCTL_TXFS_WRITE_BACKUP_INFORMATION CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 89, METHOD_BUFFERED, FILE_WRITE_DATA)
3385 #define FSCTL_TXFS_CREATE_SECONDARY_RM      CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 90, METHOD_BUFFERED, FILE_WRITE_DATA)
3386 #define FSCTL_TXFS_GET_METADATA_INFO        CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 91, METHOD_BUFFERED, FILE_READ_DATA)
3387 #define FSCTL_TXFS_GET_TRANSACTED_VERSION   CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 92, METHOD_BUFFERED, FILE_READ_DATA)
3388 #define FSCTL_TXFS_SAVEPOINT_INFORMATION    CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 94, METHOD_BUFFERED, FILE_WRITE_DATA)
3389 #define FSCTL_TXFS_CREATE_MINIVERSION       CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 95, METHOD_BUFFERED, FILE_WRITE_DATA)
3390 #define FSCTL_TXFS_TRANSACTION_ACTIVE       CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 99, METHOD_BUFFERED, FILE_READ_DATA)
3391 #define FSCTL_SET_ZERO_ON_DEALLOCATION      CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 101, METHOD_BUFFERED, FILE_SPECIAL_ACCESS)
3392 #define FSCTL_SET_REPAIR                    CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 102, METHOD_BUFFERED, FILE_ANY_ACCESS)
3393 #define FSCTL_GET_REPAIR                    CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 103, METHOD_BUFFERED, FILE_ANY_ACCESS)
3394 #define FSCTL_WAIT_FOR_REPAIR               CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 104, METHOD_BUFFERED, FILE_ANY_ACCESS)
3395 #define FSCTL_INITIATE_REPAIR               CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 106, METHOD_BUFFERED, FILE_ANY_ACCESS)
3396 #define FSCTL_CSC_INTERNAL                  CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 107, METHOD_NEITHER,  FILE_ANY_ACCESS)
3397 #define FSCTL_SHRINK_VOLUME                 CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 108, METHOD_BUFFERED, FILE_SPECIAL_ACCESS)
3398 #define FSCTL_SET_SHORT_NAME_BEHAVIOR       CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 109, METHOD_BUFFERED, FILE_ANY_ACCESS)
3399 #define FSCTL_DFSR_SET_GHOST_HANDLE_STATE   CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 110, METHOD_BUFFERED, FILE_ANY_ACCESS)
3400 
3401 #define FSCTL_TXFS_LIST_TRANSACTION_LOCKED_FILES \
3402                                             CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 120, METHOD_BUFFERED, FILE_READ_DATA)
3403 #define FSCTL_TXFS_LIST_TRANSACTIONS        CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 121, METHOD_BUFFERED, FILE_READ_DATA)
3404 #define FSCTL_QUERY_PAGEFILE_ENCRYPTION     CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 122, METHOD_BUFFERED, FILE_ANY_ACCESS)
3405 #define FSCTL_RESET_VOLUME_ALLOCATION_HINTS CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 123, METHOD_BUFFERED, FILE_ANY_ACCESS)
3406 #define FSCTL_TXFS_READ_BACKUP_INFORMATION2 CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 126, METHOD_BUFFERED, FILE_ANY_ACCESS)
3407 
3408 #endif
3409 
3410 #if (_WIN32_WINNT >= 0x0601)
3411 
3412 #define FSCTL_QUERY_DEPENDENT_VOLUME        CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 124, METHOD_BUFFERED, FILE_ANY_ACCESS)
3413 #define FSCTL_SD_GLOBAL_CHANGE              CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 125, METHOD_BUFFERED, FILE_ANY_ACCESS)
3414 #define FSCTL_LOOKUP_STREAM_FROM_CLUSTER    CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 127, METHOD_BUFFERED, FILE_ANY_ACCESS)
3415 #define FSCTL_TXFS_WRITE_BACKUP_INFORMATION2 CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 128, METHOD_BUFFERED, FILE_ANY_ACCESS)
3416 #define FSCTL_FILE_TYPE_NOTIFICATION        CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 129, METHOD_BUFFERED, FILE_ANY_ACCESS)
3417 #define FSCTL_GET_BOOT_AREA_INFO            CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 140, METHOD_BUFFERED, FILE_ANY_ACCESS)
3418 #define FSCTL_GET_RETRIEVAL_POINTER_BASE    CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 141, METHOD_BUFFERED, FILE_ANY_ACCESS)
3419 #define FSCTL_SET_PERSISTENT_VOLUME_STATE   CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 142, METHOD_BUFFERED, FILE_ANY_ACCESS)
3420 #define FSCTL_QUERY_PERSISTENT_VOLUME_STATE CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 143, METHOD_BUFFERED, FILE_ANY_ACCESS)
3421 
3422 #define FSCTL_REQUEST_OPLOCK                CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 144, METHOD_BUFFERED, FILE_ANY_ACCESS)
3423 
3424 #define FSCTL_CSV_TUNNEL_REQUEST            CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 145, METHOD_BUFFERED, FILE_ANY_ACCESS)
3425 #define FSCTL_IS_CSV_FILE                   CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 146, METHOD_BUFFERED, FILE_ANY_ACCESS)
3426 
3427 #define FSCTL_QUERY_FILE_SYSTEM_RECOGNITION CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 147, METHOD_BUFFERED, FILE_ANY_ACCESS)
3428 #define FSCTL_CSV_GET_VOLUME_PATH_NAME      CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 148, METHOD_BUFFERED, FILE_ANY_ACCESS)
3429 #define FSCTL_CSV_GET_VOLUME_NAME_FOR_VOLUME_MOUNT_POINT CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 149, METHOD_BUFFERED, FILE_ANY_ACCESS)
3430 #define FSCTL_CSV_GET_VOLUME_PATH_NAMES_FOR_VOLUME_NAME CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 150,  METHOD_BUFFERED, FILE_ANY_ACCESS)
3431 #define FSCTL_IS_FILE_ON_CSV_VOLUME         CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 151,  METHOD_BUFFERED, FILE_ANY_ACCESS)
3432 
3433 typedef struct _CSV_NAMESPACE_INFO {
3434   ULONG Version;
3435   ULONG DeviceNumber;
3436   LARGE_INTEGER StartingOffset;
3437   ULONG SectorSize;
3438 } CSV_NAMESPACE_INFO, *PCSV_NAMESPACE_INFO;
3439 
3440 #define CSV_NAMESPACE_INFO_V1 (sizeof(CSV_NAMESPACE_INFO))
3441 #define CSV_INVALID_DEVICE_NUMBER 0xFFFFFFFF
3442 
3443 #endif
3444 
3445 #define FSCTL_MARK_AS_SYSTEM_HIVE           FSCTL_SET_BOOTLOADER_ACCESSED
3446 
3447 typedef struct _PATHNAME_BUFFER {
3448   ULONG PathNameLength;
3449   WCHAR Name[1];
3450 } PATHNAME_BUFFER, *PPATHNAME_BUFFER;
3451 
3452 typedef struct _FSCTL_QUERY_FAT_BPB_BUFFER {
3453   UCHAR First0x24BytesOfBootSector[0x24];
3454 } FSCTL_QUERY_FAT_BPB_BUFFER, *PFSCTL_QUERY_FAT_BPB_BUFFER;
3455 
3456 #if (_WIN32_WINNT >= 0x0400)
3457 
3458 typedef struct _NTFS_VOLUME_DATA_BUFFER {
3459   LARGE_INTEGER VolumeSerialNumber;
3460   LARGE_INTEGER NumberSectors;
3461   LARGE_INTEGER TotalClusters;
3462   LARGE_INTEGER FreeClusters;
3463   LARGE_INTEGER TotalReserved;
3464   ULONG BytesPerSector;
3465   ULONG BytesPerCluster;
3466   ULONG BytesPerFileRecordSegment;
3467   ULONG ClustersPerFileRecordSegment;
3468   LARGE_INTEGER MftValidDataLength;
3469   LARGE_INTEGER MftStartLcn;
3470   LARGE_INTEGER Mft2StartLcn;
3471   LARGE_INTEGER MftZoneStart;
3472   LARGE_INTEGER MftZoneEnd;
3473 } NTFS_VOLUME_DATA_BUFFER, *PNTFS_VOLUME_DATA_BUFFER;
3474 
3475 typedef struct _NTFS_EXTENDED_VOLUME_DATA {
3476   ULONG ByteCount;
3477   USHORT MajorVersion;
3478   USHORT MinorVersion;
3479 } NTFS_EXTENDED_VOLUME_DATA, *PNTFS_EXTENDED_VOLUME_DATA;
3480 
3481 typedef struct _STARTING_LCN_INPUT_BUFFER {
3482   LARGE_INTEGER StartingLcn;
3483 } STARTING_LCN_INPUT_BUFFER, *PSTARTING_LCN_INPUT_BUFFER;
3484 
3485 typedef struct _VOLUME_BITMAP_BUFFER {
3486   LARGE_INTEGER StartingLcn;
3487   LARGE_INTEGER BitmapSize;
3488   UCHAR Buffer[1];
3489 } VOLUME_BITMAP_BUFFER, *PVOLUME_BITMAP_BUFFER;
3490 
3491 typedef struct _STARTING_VCN_INPUT_BUFFER {
3492   LARGE_INTEGER StartingVcn;
3493 } STARTING_VCN_INPUT_BUFFER, *PSTARTING_VCN_INPUT_BUFFER;
3494 
3495 typedef struct _RETRIEVAL_POINTERS_BUFFER {
3496   ULONG ExtentCount;
3497   LARGE_INTEGER StartingVcn;
3498   struct {
3499     LARGE_INTEGER NextVcn;
3500     LARGE_INTEGER Lcn;
3501   } Extents[1];
3502 } RETRIEVAL_POINTERS_BUFFER, *PRETRIEVAL_POINTERS_BUFFER;
3503 
3504 typedef struct _NTFS_FILE_RECORD_INPUT_BUFFER {
3505   LARGE_INTEGER FileReferenceNumber;
3506 } NTFS_FILE_RECORD_INPUT_BUFFER, *PNTFS_FILE_RECORD_INPUT_BUFFER;
3507 
3508 typedef struct _NTFS_FILE_RECORD_OUTPUT_BUFFER {
3509   LARGE_INTEGER FileReferenceNumber;
3510   ULONG FileRecordLength;
3511   UCHAR FileRecordBuffer[1];
3512 } NTFS_FILE_RECORD_OUTPUT_BUFFER, *PNTFS_FILE_RECORD_OUTPUT_BUFFER;
3513 
3514 typedef struct _MOVE_FILE_DATA {
3515   HANDLE FileHandle;
3516   LARGE_INTEGER StartingVcn;
3517   LARGE_INTEGER StartingLcn;
3518   ULONG ClusterCount;
3519 } MOVE_FILE_DATA, *PMOVE_FILE_DATA;
3520 
3521 typedef struct _MOVE_FILE_RECORD_DATA {
3522   HANDLE FileHandle;
3523   LARGE_INTEGER SourceFileRecord;
3524   LARGE_INTEGER TargetFileRecord;
3525 } MOVE_FILE_RECORD_DATA, *PMOVE_FILE_RECORD_DATA;
3526 
3527 #if defined(_WIN64)
3528 typedef struct _MOVE_FILE_DATA32 {
3529   UINT32 FileHandle;
3530   LARGE_INTEGER StartingVcn;
3531   LARGE_INTEGER StartingLcn;
3532   ULONG ClusterCount;
3533 } MOVE_FILE_DATA32, *PMOVE_FILE_DATA32;
3534 #endif
3535 
3536 #endif /* (_WIN32_WINNT >= 0x0400) */
3537 
3538 #if (_WIN32_WINNT >= 0x0500)
3539 
3540 typedef struct _FIND_BY_SID_DATA {
3541   ULONG Restart;
3542   SID Sid;
3543 } FIND_BY_SID_DATA, *PFIND_BY_SID_DATA;
3544 
3545 typedef struct _FIND_BY_SID_OUTPUT {
3546   ULONG NextEntryOffset;
3547   ULONG FileIndex;
3548   ULONG FileNameLength;
3549   WCHAR FileName[1];
3550 } FIND_BY_SID_OUTPUT, *PFIND_BY_SID_OUTPUT;
3551 
3552 typedef struct _MFT_ENUM_DATA {
3553   ULONGLONG StartFileReferenceNumber;
3554   USN LowUsn;
3555   USN HighUsn;
3556 } MFT_ENUM_DATA, *PMFT_ENUM_DATA;
3557 
3558 typedef struct _CREATE_USN_JOURNAL_DATA {
3559   ULONGLONG MaximumSize;
3560   ULONGLONG AllocationDelta;
3561 } CREATE_USN_JOURNAL_DATA, *PCREATE_USN_JOURNAL_DATA;
3562 
3563 typedef struct _READ_USN_JOURNAL_DATA {
3564   USN StartUsn;
3565   ULONG ReasonMask;
3566   ULONG ReturnOnlyOnClose;
3567   ULONGLONG Timeout;
3568   ULONGLONG BytesToWaitFor;
3569   ULONGLONG UsnJournalID;
3570 } READ_USN_JOURNAL_DATA, *PREAD_USN_JOURNAL_DATA;
3571 
3572 typedef struct _USN_RECORD {
3573   ULONG RecordLength;
3574   USHORT MajorVersion;
3575   USHORT MinorVersion;
3576   ULONGLONG FileReferenceNumber;
3577   ULONGLONG ParentFileReferenceNumber;
3578   USN Usn;
3579   LARGE_INTEGER TimeStamp;
3580   ULONG Reason;
3581   ULONG SourceInfo;
3582   ULONG SecurityId;
3583   ULONG FileAttributes;
3584   USHORT FileNameLength;
3585   USHORT FileNameOffset;
3586   WCHAR FileName[1];
3587 } USN_RECORD, *PUSN_RECORD;
3588 
3589 #define USN_PAGE_SIZE                    (0x1000)
3590 
3591 #define USN_REASON_DATA_OVERWRITE        (0x00000001)
3592 #define USN_REASON_DATA_EXTEND           (0x00000002)
3593 #define USN_REASON_DATA_TRUNCATION       (0x00000004)
3594 #define USN_REASON_NAMED_DATA_OVERWRITE  (0x00000010)
3595 #define USN_REASON_NAMED_DATA_EXTEND     (0x00000020)
3596 #define USN_REASON_NAMED_DATA_TRUNCATION (0x00000040)
3597 #define USN_REASON_FILE_CREATE           (0x00000100)
3598 #define USN_REASON_FILE_DELETE           (0x00000200)
3599 #define USN_REASON_EA_CHANGE             (0x00000400)
3600 #define USN_REASON_SECURITY_CHANGE       (0x00000800)
3601 #define USN_REASON_RENAME_OLD_NAME       (0x00001000)
3602 #define USN_REASON_RENAME_NEW_NAME       (0x00002000)
3603 #define USN_REASON_INDEXABLE_CHANGE      (0x00004000)
3604 #define USN_REASON_BASIC_INFO_CHANGE     (0x00008000)
3605 #define USN_REASON_HARD_LINK_CHANGE      (0x00010000)
3606 #define USN_REASON_COMPRESSION_CHANGE    (0x00020000)
3607 #define USN_REASON_ENCRYPTION_CHANGE     (0x00040000)
3608 #define USN_REASON_OBJECT_ID_CHANGE      (0x00080000)
3609 #define USN_REASON_REPARSE_POINT_CHANGE  (0x00100000)
3610 #define USN_REASON_STREAM_CHANGE         (0x00200000)
3611 #define USN_REASON_TRANSACTED_CHANGE     (0x00400000)
3612 #define USN_REASON_CLOSE                 (0x80000000)
3613 
3614 typedef struct _USN_JOURNAL_DATA {
3615   ULONGLONG UsnJournalID;
3616   USN FirstUsn;
3617   USN NextUsn;
3618   USN LowestValidUsn;
3619   USN MaxUsn;
3620   ULONGLONG MaximumSize;
3621   ULONGLONG AllocationDelta;
3622 } USN_JOURNAL_DATA, *PUSN_JOURNAL_DATA;
3623 
3624 typedef struct _DELETE_USN_JOURNAL_DATA {
3625   ULONGLONG UsnJournalID;
3626   ULONG DeleteFlags;
3627 } DELETE_USN_JOURNAL_DATA, *PDELETE_USN_JOURNAL_DATA;
3628 
3629 #define USN_DELETE_FLAG_DELETE              (0x00000001)
3630 #define USN_DELETE_FLAG_NOTIFY              (0x00000002)
3631 #define USN_DELETE_VALID_FLAGS              (0x00000003)
3632 
3633 typedef struct _MARK_HANDLE_INFO {
3634   ULONG UsnSourceInfo;
3635   HANDLE VolumeHandle;
3636   ULONG HandleInfo;
3637 } MARK_HANDLE_INFO, *PMARK_HANDLE_INFO;
3638 
3639 #if defined(_WIN64)
3640 typedef struct _MARK_HANDLE_INFO32 {
3641   ULONG UsnSourceInfo;
3642   UINT32 VolumeHandle;
3643   ULONG HandleInfo;
3644 } MARK_HANDLE_INFO32, *PMARK_HANDLE_INFO32;
3645 #endif
3646 
3647 #define USN_SOURCE_DATA_MANAGEMENT          (0x00000001)
3648 #define USN_SOURCE_AUXILIARY_DATA           (0x00000002)
3649 #define USN_SOURCE_REPLICATION_MANAGEMENT   (0x00000004)
3650 
3651 #define MARK_HANDLE_PROTECT_CLUSTERS        (0x00000001)
3652 #define MARK_HANDLE_TXF_SYSTEM_LOG          (0x00000004)
3653 #define MARK_HANDLE_NOT_TXF_SYSTEM_LOG      (0x00000008)
3654 
3655 typedef struct _BULK_SECURITY_TEST_DATA {
3656   ACCESS_MASK DesiredAccess;
3657   ULONG SecurityIds[1];
3658 } BULK_SECURITY_TEST_DATA, *PBULK_SECURITY_TEST_DATA;
3659 
3660 #define VOLUME_IS_DIRTY                  (0x00000001)
3661 #define VOLUME_UPGRADE_SCHEDULED         (0x00000002)
3662 #define VOLUME_SESSION_OPEN              (0x00000004)
3663 
3664 typedef struct _FILE_PREFETCH {
3665   ULONG Type;
3666   ULONG Count;
3667   ULONGLONG Prefetch[1];
3668 } FILE_PREFETCH, *PFILE_PREFETCH;
3669 
3670 typedef struct _FILE_PREFETCH_EX {
3671   ULONG Type;
3672   ULONG Count;
3673   PVOID Context;
3674   ULONGLONG Prefetch[1];
3675 } FILE_PREFETCH_EX, *PFILE_PREFETCH_EX;
3676 
3677 #define FILE_PREFETCH_TYPE_FOR_CREATE       0x1
3678 #define FILE_PREFETCH_TYPE_FOR_DIRENUM      0x2
3679 #define FILE_PREFETCH_TYPE_FOR_CREATE_EX    0x3
3680 #define FILE_PREFETCH_TYPE_FOR_DIRENUM_EX   0x4
3681 
3682 #define FILE_PREFETCH_TYPE_MAX              0x4
3683 
3684 typedef struct _FILE_OBJECTID_BUFFER {
3685   UCHAR ObjectId[16];
3686   _ANONYMOUS_UNION union {
3687     _ANONYMOUS_STRUCT struct {
3688       UCHAR BirthVolumeId[16];
3689       UCHAR BirthObjectId[16];
3690       UCHAR DomainId[16];
3691     } DUMMYSTRUCTNAME;
3692     UCHAR ExtendedInfo[48];
3693   } DUMMYUNIONNAME;
3694 } FILE_OBJECTID_BUFFER, *PFILE_OBJECTID_BUFFER;
3695 
3696 typedef struct _FILE_SET_SPARSE_BUFFER {
3697   BOOLEAN SetSparse;
3698 } FILE_SET_SPARSE_BUFFER, *PFILE_SET_SPARSE_BUFFER;
3699 
3700 typedef struct _FILE_ZERO_DATA_INFORMATION {
3701   LARGE_INTEGER FileOffset;
3702   LARGE_INTEGER BeyondFinalZero;
3703 } FILE_ZERO_DATA_INFORMATION, *PFILE_ZERO_DATA_INFORMATION;
3704 
3705 typedef struct _FILE_ALLOCATED_RANGE_BUFFER {
3706   LARGE_INTEGER FileOffset;
3707   LARGE_INTEGER Length;
3708 } FILE_ALLOCATED_RANGE_BUFFER, *PFILE_ALLOCATED_RANGE_BUFFER;
3709 
3710 typedef struct _ENCRYPTION_BUFFER {
3711   ULONG EncryptionOperation;
3712   UCHAR Private[1];
3713 } ENCRYPTION_BUFFER, *PENCRYPTION_BUFFER;
3714 
3715 #define FILE_SET_ENCRYPTION         0x00000001
3716 #define FILE_CLEAR_ENCRYPTION       0x00000002
3717 #define STREAM_SET_ENCRYPTION       0x00000003
3718 #define STREAM_CLEAR_ENCRYPTION     0x00000004
3719 
3720 #define MAXIMUM_ENCRYPTION_VALUE    0x00000004
3721 
3722 typedef struct _DECRYPTION_STATUS_BUFFER {
3723   BOOLEAN NoEncryptedStreams;
3724 } DECRYPTION_STATUS_BUFFER, *PDECRYPTION_STATUS_BUFFER;
3725 
3726 #define ENCRYPTION_FORMAT_DEFAULT        (0x01)
3727 
3728 #define COMPRESSION_FORMAT_SPARSE        (0x4000)
3729 
3730 typedef struct _REQUEST_RAW_ENCRYPTED_DATA {
3731   LONGLONG FileOffset;
3732   ULONG Length;
3733 } REQUEST_RAW_ENCRYPTED_DATA, *PREQUEST_RAW_ENCRYPTED_DATA;
3734 
3735 typedef struct _ENCRYPTED_DATA_INFO {
3736   ULONGLONG StartingFileOffset;
3737   ULONG OutputBufferOffset;
3738   ULONG BytesWithinFileSize;
3739   ULONG BytesWithinValidDataLength;
3740   USHORT CompressionFormat;
3741   UCHAR DataUnitShift;
3742   UCHAR ChunkShift;
3743   UCHAR ClusterShift;
3744   UCHAR EncryptionFormat;
3745   USHORT NumberOfDataBlocks;
3746   ULONG DataBlockSize[ANYSIZE_ARRAY];
3747 } ENCRYPTED_DATA_INFO, *PENCRYPTED_DATA_INFO;
3748 
3749 typedef struct _PLEX_READ_DATA_REQUEST {
3750   LARGE_INTEGER ByteOffset;
3751   ULONG ByteLength;
3752   ULONG PlexNumber;
3753 } PLEX_READ_DATA_REQUEST, *PPLEX_READ_DATA_REQUEST;
3754 
3755 typedef struct _SI_COPYFILE {
3756   ULONG SourceFileNameLength;
3757   ULONG DestinationFileNameLength;
3758   ULONG Flags;
3759   WCHAR FileNameBuffer[1];
3760 } SI_COPYFILE, *PSI_COPYFILE;
3761 
3762 #define COPYFILE_SIS_LINK       0x0001
3763 #define COPYFILE_SIS_REPLACE    0x0002
3764 #define COPYFILE_SIS_FLAGS      0x0003
3765 
3766 #endif /* (_WIN32_WINNT >= 0x0500) */
3767 
3768 #if (_WIN32_WINNT >= 0x0600)
3769 
3770 typedef struct _FILE_MAKE_COMPATIBLE_BUFFER {
3771   BOOLEAN CloseDisc;
3772 } FILE_MAKE_COMPATIBLE_BUFFER, *PFILE_MAKE_COMPATIBLE_BUFFER;
3773 
3774 typedef struct _FILE_SET_DEFECT_MGMT_BUFFER {
3775   BOOLEAN Disable;
3776 } FILE_SET_DEFECT_MGMT_BUFFER, *PFILE_SET_DEFECT_MGMT_BUFFER;
3777 
3778 typedef struct _FILE_QUERY_SPARING_BUFFER {
3779   ULONG SparingUnitBytes;
3780   BOOLEAN SoftwareSparing;
3781   ULONG TotalSpareBlocks;
3782   ULONG FreeSpareBlocks;
3783 } FILE_QUERY_SPARING_BUFFER, *PFILE_QUERY_SPARING_BUFFER;
3784 
3785 typedef struct _FILE_QUERY_ON_DISK_VOL_INFO_BUFFER {
3786   LARGE_INTEGER DirectoryCount;
3787   LARGE_INTEGER FileCount;
3788   USHORT FsFormatMajVersion;
3789   USHORT FsFormatMinVersion;
3790   WCHAR FsFormatName[12];
3791   LARGE_INTEGER FormatTime;
3792   LARGE_INTEGER LastUpdateTime;
3793   WCHAR CopyrightInfo[34];
3794   WCHAR AbstractInfo[34];
3795   WCHAR FormattingImplementationInfo[34];
3796   WCHAR LastModifyingImplementationInfo[34];
3797 } FILE_QUERY_ON_DISK_VOL_INFO_BUFFER, *PFILE_QUERY_ON_DISK_VOL_INFO_BUFFER;
3798 
3799 #define SET_REPAIR_ENABLED                                      (0x00000001)
3800 #define SET_REPAIR_VOLUME_BITMAP_SCAN                           (0x00000002)
3801 #define SET_REPAIR_DELETE_CROSSLINK                             (0x00000004)
3802 #define SET_REPAIR_WARN_ABOUT_DATA_LOSS                         (0x00000008)
3803 #define SET_REPAIR_DISABLED_AND_BUGCHECK_ON_CORRUPT             (0x00000010)
3804 #define SET_REPAIR_VALID_MASK                                   (0x0000001F)
3805 
3806 typedef enum _SHRINK_VOLUME_REQUEST_TYPES {
3807   ShrinkPrepare = 1,
3808   ShrinkCommit,
3809   ShrinkAbort
3810 } SHRINK_VOLUME_REQUEST_TYPES, *PSHRINK_VOLUME_REQUEST_TYPES;
3811 
3812 typedef struct _SHRINK_VOLUME_INFORMATION {
3813   SHRINK_VOLUME_REQUEST_TYPES ShrinkRequestType;
3814   ULONGLONG Flags;
3815   LONGLONG NewNumberOfSectors;
3816 } SHRINK_VOLUME_INFORMATION, *PSHRINK_VOLUME_INFORMATION;
3817 
3818 #define TXFS_RM_FLAG_LOGGING_MODE                           0x00000001
3819 #define TXFS_RM_FLAG_RENAME_RM                              0x00000002
3820 #define TXFS_RM_FLAG_LOG_CONTAINER_COUNT_MAX                0x00000004
3821 #define TXFS_RM_FLAG_LOG_CONTAINER_COUNT_MIN                0x00000008
3822 #define TXFS_RM_FLAG_LOG_GROWTH_INCREMENT_NUM_CONTAINERS    0x00000010
3823 #define TXFS_RM_FLAG_LOG_GROWTH_INCREMENT_PERCENT           0x00000020
3824 #define TXFS_RM_FLAG_LOG_AUTO_SHRINK_PERCENTAGE             0x00000040
3825 #define TXFS_RM_FLAG_LOG_NO_CONTAINER_COUNT_MAX             0x00000080
3826 #define TXFS_RM_FLAG_LOG_NO_CONTAINER_COUNT_MIN             0x00000100
3827 #define TXFS_RM_FLAG_GROW_LOG                               0x00000400
3828 #define TXFS_RM_FLAG_SHRINK_LOG                             0x00000800
3829 #define TXFS_RM_FLAG_ENFORCE_MINIMUM_SIZE                   0x00001000
3830 #define TXFS_RM_FLAG_PRESERVE_CHANGES                       0x00002000
3831 #define TXFS_RM_FLAG_RESET_RM_AT_NEXT_START                 0x00004000
3832 #define TXFS_RM_FLAG_DO_NOT_RESET_RM_AT_NEXT_START          0x00008000
3833 #define TXFS_RM_FLAG_PREFER_CONSISTENCY                     0x00010000
3834 #define TXFS_RM_FLAG_PREFER_AVAILABILITY                    0x00020000
3835 
3836 #define TXFS_LOGGING_MODE_SIMPLE        (0x0001)
3837 #define TXFS_LOGGING_MODE_FULL          (0x0002)
3838 
3839 #define TXFS_TRANSACTION_STATE_NONE         0x00
3840 #define TXFS_TRANSACTION_STATE_ACTIVE       0x01
3841 #define TXFS_TRANSACTION_STATE_PREPARED     0x02
3842 #define TXFS_TRANSACTION_STATE_NOTACTIVE    0x03
3843 
3844 #define TXFS_MODIFY_RM_VALID_FLAGS (TXFS_RM_FLAG_LOGGING_MODE                        | \
3845                                     TXFS_RM_FLAG_RENAME_RM                           | \
3846                                     TXFS_RM_FLAG_LOG_CONTAINER_COUNT_MAX             | \
3847                                     TXFS_RM_FLAG_LOG_CONTAINER_COUNT_MIN             | \
3848                                     TXFS_RM_FLAG_LOG_GROWTH_INCREMENT_NUM_CONTAINERS | \
3849                                     TXFS_RM_FLAG_LOG_GROWTH_INCREMENT_PERCENT        | \
3850                                     TXFS_RM_FLAG_LOG_AUTO_SHRINK_PERCENTAGE          | \
3851                                     TXFS_RM_FLAG_LOG_NO_CONTAINER_COUNT_MAX          | \
3852                                     TXFS_RM_FLAG_LOG_NO_CONTAINER_COUNT_MIN          | \
3853                                     TXFS_RM_FLAG_SHRINK_LOG                          | \
3854                                     TXFS_RM_FLAG_GROW_LOG                            | \
3855                                     TXFS_RM_FLAG_ENFORCE_MINIMUM_SIZE                | \
3856                                     TXFS_RM_FLAG_PRESERVE_CHANGES                    | \
3857                                     TXFS_RM_FLAG_RESET_RM_AT_NEXT_START              | \
3858                                     TXFS_RM_FLAG_DO_NOT_RESET_RM_AT_NEXT_START       | \
3859                                     TXFS_RM_FLAG_PREFER_CONSISTENCY                  | \
3860                                     TXFS_RM_FLAG_PREFER_AVAILABILITY)
3861 
3862 typedef struct _TXFS_MODIFY_RM {
3863   ULONG Flags;
3864   ULONG LogContainerCountMax;
3865   ULONG LogContainerCountMin;
3866   ULONG LogContainerCount;
3867   ULONG LogGrowthIncrement;
3868   ULONG LogAutoShrinkPercentage;
3869   ULONGLONG Reserved;
3870   USHORT LoggingMode;
3871 } TXFS_MODIFY_RM, *PTXFS_MODIFY_RM;
3872 
3873 #define TXFS_RM_STATE_NOT_STARTED       0
3874 #define TXFS_RM_STATE_STARTING          1
3875 #define TXFS_RM_STATE_ACTIVE            2
3876 #define TXFS_RM_STATE_SHUTTING_DOWN     3
3877 
3878 #define TXFS_QUERY_RM_INFORMATION_VALID_FLAGS                           \
3879                 (TXFS_RM_FLAG_LOG_GROWTH_INCREMENT_NUM_CONTAINERS   |   \
3880                  TXFS_RM_FLAG_LOG_GROWTH_INCREMENT_PERCENT          |   \
3881                  TXFS_RM_FLAG_LOG_NO_CONTAINER_COUNT_MAX            |   \
3882                  TXFS_RM_FLAG_LOG_NO_CONTAINER_COUNT_MIN            |   \
3883                  TXFS_RM_FLAG_RESET_RM_AT_NEXT_START                |   \
3884                  TXFS_RM_FLAG_DO_NOT_RESET_RM_AT_NEXT_START         |   \
3885                  TXFS_RM_FLAG_PREFER_CONSISTENCY                    |   \
3886                  TXFS_RM_FLAG_PREFER_AVAILABILITY)
3887 
3888 typedef struct _TXFS_QUERY_RM_INFORMATION {
3889   ULONG BytesRequired;
3890   ULONGLONG TailLsn;
3891   ULONGLONG CurrentLsn;
3892   ULONGLONG ArchiveTailLsn;
3893   ULONGLONG LogContainerSize;
3894   LARGE_INTEGER HighestVirtualClock;
3895   ULONG LogContainerCount;
3896   ULONG LogContainerCountMax;
3897   ULONG LogContainerCountMin;
3898   ULONG LogGrowthIncrement;
3899   ULONG LogAutoShrinkPercentage;
3900   ULONG Flags;
3901   USHORT LoggingMode;
3902   USHORT Reserved;
3903   ULONG RmState;
3904   ULONGLONG LogCapacity;
3905   ULONGLONG LogFree;
3906   ULONGLONG TopsSize;
3907   ULONGLONG TopsUsed;
3908   ULONGLONG TransactionCount;
3909   ULONGLONG OnePCCount;
3910   ULONGLONG TwoPCCount;
3911   ULONGLONG NumberLogFileFull;
3912   ULONGLONG OldestTransactionAge;
3913   GUID RMName;
3914   ULONG TmLogPathOffset;
3915 } TXFS_QUERY_RM_INFORMATION, *PTXFS_QUERY_RM_INFORMATION;
3916 
3917 #define TXFS_ROLLFORWARD_REDO_FLAG_USE_LAST_REDO_LSN        0x01
3918 #define TXFS_ROLLFORWARD_REDO_FLAG_USE_LAST_VIRTUAL_CLOCK   0x02
3919 
3920 #define TXFS_ROLLFORWARD_REDO_VALID_FLAGS                               \
3921                 (TXFS_ROLLFORWARD_REDO_FLAG_USE_LAST_REDO_LSN |         \
3922                  TXFS_ROLLFORWARD_REDO_FLAG_USE_LAST_VIRTUAL_CLOCK)
3923 
3924 typedef struct _TXFS_ROLLFORWARD_REDO_INFORMATION {
3925   LARGE_INTEGER LastVirtualClock;
3926   ULONGLONG LastRedoLsn;
3927   ULONGLONG HighestRecoveryLsn;
3928   ULONG Flags;
3929 } TXFS_ROLLFORWARD_REDO_INFORMATION, *PTXFS_ROLLFORWARD_REDO_INFORMATION;
3930 
3931 #define TXFS_START_RM_FLAG_LOG_CONTAINER_COUNT_MAX              0x00000001
3932 #define TXFS_START_RM_FLAG_LOG_CONTAINER_COUNT_MIN              0x00000002
3933 #define TXFS_START_RM_FLAG_LOG_CONTAINER_SIZE                   0x00000004
3934 #define TXFS_START_RM_FLAG_LOG_GROWTH_INCREMENT_NUM_CONTAINERS  0x00000008
3935 #define TXFS_START_RM_FLAG_LOG_GROWTH_INCREMENT_PERCENT         0x00000010
3936 #define TXFS_START_RM_FLAG_LOG_AUTO_SHRINK_PERCENTAGE           0x00000020
3937 #define TXFS_START_RM_FLAG_LOG_NO_CONTAINER_COUNT_MAX           0x00000040
3938 #define TXFS_START_RM_FLAG_LOG_NO_CONTAINER_COUNT_MIN           0x00000080
3939 
3940 #define TXFS_START_RM_FLAG_RECOVER_BEST_EFFORT                  0x00000200
3941 #define TXFS_START_RM_FLAG_LOGGING_MODE                         0x00000400
3942 #define TXFS_START_RM_FLAG_PRESERVE_CHANGES                     0x00000800
3943 
3944 #define TXFS_START_RM_FLAG_PREFER_CONSISTENCY                   0x00001000
3945 #define TXFS_START_RM_FLAG_PREFER_AVAILABILITY                  0x00002000
3946 
3947 #define TXFS_START_RM_VALID_FLAGS                                           \
3948                 (TXFS_START_RM_FLAG_LOG_CONTAINER_COUNT_MAX             |   \
3949                  TXFS_START_RM_FLAG_LOG_CONTAINER_COUNT_MIN             |   \
3950                  TXFS_START_RM_FLAG_LOG_CONTAINER_SIZE                  |   \
3951                  TXFS_START_RM_FLAG_LOG_GROWTH_INCREMENT_NUM_CONTAINERS |   \
3952                  TXFS_START_RM_FLAG_LOG_GROWTH_INCREMENT_PERCENT        |   \
3953                  TXFS_START_RM_FLAG_LOG_AUTO_SHRINK_PERCENTAGE          |   \
3954                  TXFS_START_RM_FLAG_RECOVER_BEST_EFFORT                 |   \
3955                  TXFS_START_RM_FLAG_LOG_NO_CONTAINER_COUNT_MAX          |   \
3956                  TXFS_START_RM_FLAG_LOGGING_MODE                        |   \
3957                  TXFS_START_RM_FLAG_PRESERVE_CHANGES                    |   \
3958                  TXFS_START_RM_FLAG_PREFER_CONSISTENCY                  |   \
3959                  TXFS_START_RM_FLAG_PREFER_AVAILABILITY)
3960 
3961 typedef struct _TXFS_START_RM_INFORMATION {
3962   ULONG Flags;
3963   ULONGLONG LogContainerSize;
3964   ULONG LogContainerCountMin;
3965   ULONG LogContainerCountMax;
3966   ULONG LogGrowthIncrement;
3967   ULONG LogAutoShrinkPercentage;
3968   ULONG TmLogPathOffset;
3969   USHORT TmLogPathLength;
3970   USHORT LoggingMode;
3971   USHORT LogPathLength;
3972   USHORT Reserved;
3973   WCHAR LogPath[1];
3974 } TXFS_START_RM_INFORMATION, *PTXFS_START_RM_INFORMATION;
3975 
3976 typedef struct _TXFS_GET_METADATA_INFO_OUT {
3977   struct {
3978     LONGLONG LowPart;
3979     LONGLONG HighPart;
3980   } TxfFileId;
3981   GUID LockingTransaction;
3982   ULONGLONG LastLsn;
3983   ULONG TransactionState;
3984 } TXFS_GET_METADATA_INFO_OUT, *PTXFS_GET_METADATA_INFO_OUT;
3985 
3986 #define TXFS_LIST_TRANSACTION_LOCKED_FILES_ENTRY_FLAG_CREATED   0x00000001
3987 #define TXFS_LIST_TRANSACTION_LOCKED_FILES_ENTRY_FLAG_DELETED   0x00000002
3988 
3989 typedef struct _TXFS_LIST_TRANSACTION_LOCKED_FILES_ENTRY {
3990   ULONGLONG Offset;
3991   ULONG NameFlags;
3992   LONGLONG FileId;
3993   ULONG Reserved1;
3994   ULONG Reserved2;
3995   LONGLONG Reserved3;
3996   WCHAR FileName[1];
3997 } TXFS_LIST_TRANSACTION_LOCKED_FILES_ENTRY, *PTXFS_LIST_TRANSACTION_LOCKED_FILES_ENTRY;
3998 
3999 typedef struct _TXFS_LIST_TRANSACTION_LOCKED_FILES {
4000   GUID KtmTransaction;
4001   ULONGLONG NumberOfFiles;
4002   ULONGLONG BufferSizeRequired;
4003   ULONGLONG Offset;
4004 } TXFS_LIST_TRANSACTION_LOCKED_FILES, *PTXFS_LIST_TRANSACTION_LOCKED_FILES;
4005 
4006 typedef struct _TXFS_LIST_TRANSACTIONS_ENTRY {
4007   GUID TransactionId;
4008   ULONG TransactionState;
4009   ULONG Reserved1;
4010   ULONG Reserved2;
4011   LONGLONG Reserved3;
4012 } TXFS_LIST_TRANSACTIONS_ENTRY, *PTXFS_LIST_TRANSACTIONS_ENTRY;
4013 
4014 typedef struct _TXFS_LIST_TRANSACTIONS {
4015   ULONGLONG NumberOfTransactions;
4016   ULONGLONG BufferSizeRequired;
4017 } TXFS_LIST_TRANSACTIONS, *PTXFS_LIST_TRANSACTIONS;
4018 
4019 typedef struct _TXFS_READ_BACKUP_INFORMATION_OUT {
4020   _ANONYMOUS_UNION union {
4021     ULONG BufferLength;
4022     UCHAR Buffer[1];
4023   } DUMMYUNIONNAME;
4024 } TXFS_READ_BACKUP_INFORMATION_OUT, *PTXFS_READ_BACKUP_INFORMATION_OUT;
4025 
4026 typedef struct _TXFS_WRITE_BACKUP_INFORMATION {
4027   UCHAR Buffer[1];
4028 } TXFS_WRITE_BACKUP_INFORMATION, *PTXFS_WRITE_BACKUP_INFORMATION;
4029 
4030 #define TXFS_TRANSACTED_VERSION_NONTRANSACTED   0xFFFFFFFE
4031 #define TXFS_TRANSACTED_VERSION_UNCOMMITTED     0xFFFFFFFF
4032 
4033 typedef struct _TXFS_GET_TRANSACTED_VERSION {
4034   ULONG ThisBaseVersion;
4035   ULONG LatestVersion;
4036   USHORT ThisMiniVersion;
4037   USHORT FirstMiniVersion;
4038   USHORT LatestMiniVersion;
4039 } TXFS_GET_TRANSACTED_VERSION, *PTXFS_GET_TRANSACTED_VERSION;
4040 
4041 #define TXFS_SAVEPOINT_SET                      0x00000001
4042 #define TXFS_SAVEPOINT_ROLLBACK                 0x00000002
4043 #define TXFS_SAVEPOINT_CLEAR                    0x00000004
4044 #define TXFS_SAVEPOINT_CLEAR_ALL                0x00000010
4045 
4046 typedef struct _TXFS_SAVEPOINT_INFORMATION {
4047   HANDLE KtmTransaction;
4048   ULONG ActionCode;
4049   ULONG SavepointId;
4050 } TXFS_SAVEPOINT_INFORMATION, *PTXFS_SAVEPOINT_INFORMATION;
4051 
4052 typedef struct _TXFS_CREATE_MINIVERSION_INFO {
4053   USHORT StructureVersion;
4054   USHORT StructureLength;
4055   ULONG BaseVersion;
4056   USHORT MiniVersion;
4057 } TXFS_CREATE_MINIVERSION_INFO, *PTXFS_CREATE_MINIVERSION_INFO;
4058 
4059 typedef struct _TXFS_TRANSACTION_ACTIVE_INFO {
4060   BOOLEAN TransactionsActiveAtSnapshot;
4061 } TXFS_TRANSACTION_ACTIVE_INFO, *PTXFS_TRANSACTION_ACTIVE_INFO;
4062 
4063 #endif /* (_WIN32_WINNT >= 0x0600) */
4064 
4065 #if (_WIN32_WINNT >= 0x0601)
4066 
4067 #define MARK_HANDLE_REALTIME                (0x00000020)
4068 #define MARK_HANDLE_NOT_REALTIME            (0x00000040)
4069 
4070 #define NO_8DOT3_NAME_PRESENT               (0x00000001)
4071 #define REMOVED_8DOT3_NAME                  (0x00000002)
4072 
4073 #define PERSISTENT_VOLUME_STATE_SHORT_NAME_CREATION_DISABLED        (0x00000001)
4074 
4075 typedef struct _BOOT_AREA_INFO {
4076   ULONG BootSectorCount;
4077   struct {
4078     LARGE_INTEGER Offset;
4079   } BootSectors[2];
4080 } BOOT_AREA_INFO, *PBOOT_AREA_INFO;
4081 
4082 typedef struct _RETRIEVAL_POINTER_BASE {
4083   LARGE_INTEGER FileAreaOffset;
4084 } RETRIEVAL_POINTER_BASE, *PRETRIEVAL_POINTER_BASE;
4085 
4086 typedef struct _FILE_FS_PERSISTENT_VOLUME_INFORMATION {
4087   ULONG VolumeFlags;
4088   ULONG FlagMask;
4089   ULONG Version;
4090   ULONG Reserved;
4091 } FILE_FS_PERSISTENT_VOLUME_INFORMATION, *PFILE_FS_PERSISTENT_VOLUME_INFORMATION;
4092 
4093 typedef struct _FILE_SYSTEM_RECOGNITION_INFORMATION {
4094   CHAR FileSystem[9];
4095 } FILE_SYSTEM_RECOGNITION_INFORMATION, *PFILE_SYSTEM_RECOGNITION_INFORMATION;
4096 
4097 #define OPLOCK_LEVEL_CACHE_READ         (0x00000001)
4098 #define OPLOCK_LEVEL_CACHE_HANDLE       (0x00000002)
4099 #define OPLOCK_LEVEL_CACHE_WRITE        (0x00000004)
4100 
4101 #define REQUEST_OPLOCK_INPUT_FLAG_REQUEST               (0x00000001)
4102 #define REQUEST_OPLOCK_INPUT_FLAG_ACK                   (0x00000002)
4103 #define REQUEST_OPLOCK_INPUT_FLAG_COMPLETE_ACK_ON_CLOSE (0x00000004)
4104 
4105 #define REQUEST_OPLOCK_CURRENT_VERSION          1
4106 
4107 typedef struct _REQUEST_OPLOCK_INPUT_BUFFER {
4108   USHORT StructureVersion;
4109   USHORT StructureLength;
4110   ULONG RequestedOplockLevel;
4111   ULONG Flags;
4112 } REQUEST_OPLOCK_INPUT_BUFFER, *PREQUEST_OPLOCK_INPUT_BUFFER;
4113 
4114 #define REQUEST_OPLOCK_OUTPUT_FLAG_ACK_REQUIRED     (0x00000001)
4115 #define REQUEST_OPLOCK_OUTPUT_FLAG_MODES_PROVIDED   (0x00000002)
4116 
4117 typedef struct _REQUEST_OPLOCK_OUTPUT_BUFFER {
4118   USHORT StructureVersion;
4119   USHORT StructureLength;
4120   ULONG OriginalOplockLevel;
4121   ULONG NewOplockLevel;
4122   ULONG Flags;
4123   ACCESS_MASK AccessMode;
4124   USHORT ShareMode;
4125 } REQUEST_OPLOCK_OUTPUT_BUFFER, *PREQUEST_OPLOCK_OUTPUT_BUFFER;
4126 
4127 #define SD_GLOBAL_CHANGE_TYPE_MACHINE_SID   1
4128 
4129 typedef struct _SD_CHANGE_MACHINE_SID_INPUT {
4130   USHORT CurrentMachineSIDOffset;
4131   USHORT CurrentMachineSIDLength;
4132   USHORT NewMachineSIDOffset;
4133   USHORT NewMachineSIDLength;
4134 } SD_CHANGE_MACHINE_SID_INPUT, *PSD_CHANGE_MACHINE_SID_INPUT;
4135 
4136 typedef struct _SD_CHANGE_MACHINE_SID_OUTPUT {
4137   ULONGLONG NumSDChangedSuccess;
4138   ULONGLONG NumSDChangedFail;
4139   ULONGLONG NumSDUnused;
4140   ULONGLONG NumSDTotal;
4141   ULONGLONG NumMftSDChangedSuccess;
4142   ULONGLONG NumMftSDChangedFail;
4143   ULONGLONG NumMftSDTotal;
4144 } SD_CHANGE_MACHINE_SID_OUTPUT, *PSD_CHANGE_MACHINE_SID_OUTPUT;
4145 
4146 typedef struct _SD_GLOBAL_CHANGE_INPUT {
4147   ULONG Flags;
4148   ULONG ChangeType;
4149   _ANONYMOUS_UNION union {
4150     SD_CHANGE_MACHINE_SID_INPUT SdChange;
4151   } DUMMYUNIONNAME;
4152 } SD_GLOBAL_CHANGE_INPUT, *PSD_GLOBAL_CHANGE_INPUT;
4153 
4154 typedef struct _SD_GLOBAL_CHANGE_OUTPUT {
4155   ULONG Flags;
4156   ULONG ChangeType;
4157   _ANONYMOUS_UNION union {
4158     SD_CHANGE_MACHINE_SID_OUTPUT SdChange;
4159   } DUMMYUNIONNAME;
4160 } SD_GLOBAL_CHANGE_OUTPUT, *PSD_GLOBAL_CHANGE_OUTPUT;
4161 
4162 #define ENCRYPTED_DATA_INFO_SPARSE_FILE    1
4163 
4164 typedef struct _EXTENDED_ENCRYPTED_DATA_INFO {
4165   ULONG ExtendedCode;
4166   ULONG Length;
4167   ULONG Flags;
4168   ULONG Reserved;
4169 } EXTENDED_ENCRYPTED_DATA_INFO, *PEXTENDED_ENCRYPTED_DATA_INFO;
4170 
4171 typedef struct _LOOKUP_STREAM_FROM_CLUSTER_INPUT {
4172   ULONG Flags;
4173   ULONG NumberOfClusters;
4174   LARGE_INTEGER Cluster[1];
4175 } LOOKUP_STREAM_FROM_CLUSTER_INPUT, *PLOOKUP_STREAM_FROM_CLUSTER_INPUT;
4176 
4177 typedef struct _LOOKUP_STREAM_FROM_CLUSTER_OUTPUT {
4178   ULONG Offset;
4179   ULONG NumberOfMatches;
4180   ULONG BufferSizeRequired;
4181 } LOOKUP_STREAM_FROM_CLUSTER_OUTPUT, *PLOOKUP_STREAM_FROM_CLUSTER_OUTPUT;
4182 
4183 #define LOOKUP_STREAM_FROM_CLUSTER_ENTRY_FLAG_PAGE_FILE          0x00000001
4184 #define LOOKUP_STREAM_FROM_CLUSTER_ENTRY_FLAG_DENY_DEFRAG_SET    0x00000002
4185 #define LOOKUP_STREAM_FROM_CLUSTER_ENTRY_FLAG_FS_SYSTEM_FILE     0x00000004
4186 #define LOOKUP_STREAM_FROM_CLUSTER_ENTRY_FLAG_TXF_SYSTEM_FILE    0x00000008
4187 
4188 #define LOOKUP_STREAM_FROM_CLUSTER_ENTRY_ATTRIBUTE_MASK          0xff000000
4189 #define LOOKUP_STREAM_FROM_CLUSTER_ENTRY_ATTRIBUTE_DATA          0x01000000
4190 #define LOOKUP_STREAM_FROM_CLUSTER_ENTRY_ATTRIBUTE_INDEX         0x02000000
4191 #define LOOKUP_STREAM_FROM_CLUSTER_ENTRY_ATTRIBUTE_SYSTEM        0x03000000
4192 
4193 typedef struct _LOOKUP_STREAM_FROM_CLUSTER_ENTRY {
4194   ULONG OffsetToNext;
4195   ULONG Flags;
4196   LARGE_INTEGER Reserved;
4197   LARGE_INTEGER Cluster;
4198   WCHAR FileName[1];
4199 } LOOKUP_STREAM_FROM_CLUSTER_ENTRY, *PLOOKUP_STREAM_FROM_CLUSTER_ENTRY;
4200 
4201 typedef struct _FILE_TYPE_NOTIFICATION_INPUT {
4202   ULONG Flags;
4203   ULONG NumFileTypeIDs;
4204   GUID FileTypeID[1];
4205 } FILE_TYPE_NOTIFICATION_INPUT, *PFILE_TYPE_NOTIFICATION_INPUT;
4206 
4207 #define FILE_TYPE_NOTIFICATION_FLAG_USAGE_BEGIN     0x00000001
4208 #define FILE_TYPE_NOTIFICATION_FLAG_USAGE_END       0x00000002
4209 
4210 DEFINE_GUID(FILE_TYPE_NOTIFICATION_GUID_PAGE_FILE,         0x0d0a64a1, 0x38fc, 0x4db8, 0x9f, 0xe7, 0x3f, 0x43, 0x52, 0xcd, 0x7c, 0x5c);
4211 DEFINE_GUID(FILE_TYPE_NOTIFICATION_GUID_HIBERNATION_FILE,  0xb7624d64, 0xb9a3, 0x4cf8, 0x80, 0x11, 0x5b, 0x86, 0xc9, 0x40, 0xe7, 0xb7);
4212 DEFINE_GUID(FILE_TYPE_NOTIFICATION_GUID_CRASHDUMP_FILE,    0x9d453eb7, 0xd2a6, 0x4dbd, 0xa2, 0xe3, 0xfb, 0xd0, 0xed, 0x91, 0x09, 0xa9);
4213 
4214 #ifndef _VIRTUAL_STORAGE_TYPE_DEFINED
4215 #define _VIRTUAL_STORAGE_TYPE_DEFINED
4216 typedef struct _VIRTUAL_STORAGE_TYPE {
4217   ULONG DeviceId;
4218   GUID VendorId;
4219 } VIRTUAL_STORAGE_TYPE, *PVIRTUAL_STORAGE_TYPE;
4220 #endif
4221 
4222 typedef struct _STORAGE_QUERY_DEPENDENT_VOLUME_REQUEST {
4223   ULONG RequestLevel;
4224   ULONG RequestFlags;
4225 } STORAGE_QUERY_DEPENDENT_VOLUME_REQUEST, *PSTORAGE_QUERY_DEPENDENT_VOLUME_REQUEST;
4226 
4227 #define QUERY_DEPENDENT_VOLUME_REQUEST_FLAG_HOST_VOLUMES    0x1
4228 #define QUERY_DEPENDENT_VOLUME_REQUEST_FLAG_GUEST_VOLUMES   0x2
4229 
4230 typedef struct _STORAGE_QUERY_DEPENDENT_VOLUME_LEV1_ENTRY {
4231   ULONG EntryLength;
4232   ULONG DependencyTypeFlags;
4233   ULONG ProviderSpecificFlags;
4234   VIRTUAL_STORAGE_TYPE VirtualStorageType;
4235 } STORAGE_QUERY_DEPENDENT_VOLUME_LEV1_ENTRY, *PSTORAGE_QUERY_DEPENDENT_VOLUME_LEV1_ENTRY;
4236 
4237 typedef struct _STORAGE_QUERY_DEPENDENT_VOLUME_LEV2_ENTRY {
4238   ULONG EntryLength;
4239   ULONG DependencyTypeFlags;
4240   ULONG ProviderSpecificFlags;
4241   VIRTUAL_STORAGE_TYPE VirtualStorageType;
4242   ULONG AncestorLevel;
4243   ULONG HostVolumeNameOffset;
4244   ULONG HostVolumeNameSize;
4245   ULONG DependentVolumeNameOffset;
4246   ULONG DependentVolumeNameSize;
4247   ULONG RelativePathOffset;
4248   ULONG RelativePathSize;
4249   ULONG DependentDeviceNameOffset;
4250   ULONG DependentDeviceNameSize;
4251 } STORAGE_QUERY_DEPENDENT_VOLUME_LEV2_ENTRY, *PSTORAGE_QUERY_DEPENDENT_VOLUME_LEV2_ENTRY;
4252 
4253 typedef struct _STORAGE_QUERY_DEPENDENT_VOLUME_RESPONSE {
4254   ULONG ResponseLevel;
4255   ULONG NumberEntries;
4256   _ANONYMOUS_UNION union {
4257     STORAGE_QUERY_DEPENDENT_VOLUME_LEV1_ENTRY Lev1Depends[0];
4258     STORAGE_QUERY_DEPENDENT_VOLUME_LEV2_ENTRY Lev2Depends[0];
4259   } DUMMYUNIONNAME;
4260 } STORAGE_QUERY_DEPENDENT_VOLUME_RESPONSE, *PSTORAGE_QUERY_DEPENDENT_VOLUME_RESPONSE;
4261 
4262 #endif /* (_WIN32_WINNT >= 0x0601) */
4263 
4264 typedef struct _FILESYSTEM_STATISTICS {
4265   USHORT FileSystemType;
4266   USHORT Version;
4267   ULONG SizeOfCompleteStructure;
4268   ULONG UserFileReads;
4269   ULONG UserFileReadBytes;
4270   ULONG UserDiskReads;
4271   ULONG UserFileWrites;
4272   ULONG UserFileWriteBytes;
4273   ULONG UserDiskWrites;
4274   ULONG MetaDataReads;
4275   ULONG MetaDataReadBytes;
4276   ULONG MetaDataDiskReads;
4277   ULONG MetaDataWrites;
4278   ULONG MetaDataWriteBytes;
4279   ULONG MetaDataDiskWrites;
4280 } FILESYSTEM_STATISTICS, *PFILESYSTEM_STATISTICS;
4281 
4282 #define FILESYSTEM_STATISTICS_TYPE_NTFS     1
4283 #define FILESYSTEM_STATISTICS_TYPE_FAT      2
4284 #define FILESYSTEM_STATISTICS_TYPE_EXFAT    3
4285 
4286 typedef struct _FAT_STATISTICS {
4287   ULONG CreateHits;
4288   ULONG SuccessfulCreates;
4289   ULONG FailedCreates;
4290   ULONG NonCachedReads;
4291   ULONG NonCachedReadBytes;
4292   ULONG NonCachedWrites;
4293   ULONG NonCachedWriteBytes;
4294   ULONG NonCachedDiskReads;
4295   ULONG NonCachedDiskWrites;
4296 } FAT_STATISTICS, *PFAT_STATISTICS;
4297 
4298 typedef struct _EXFAT_STATISTICS {
4299   ULONG CreateHits;
4300   ULONG SuccessfulCreates;
4301   ULONG FailedCreates;
4302   ULONG NonCachedReads;
4303   ULONG NonCachedReadBytes;
4304   ULONG NonCachedWrites;
4305   ULONG NonCachedWriteBytes;
4306   ULONG NonCachedDiskReads;
4307   ULONG NonCachedDiskWrites;
4308 } EXFAT_STATISTICS, *PEXFAT_STATISTICS;
4309 
4310 typedef struct _NTFS_STATISTICS {
4311   ULONG LogFileFullExceptions;
4312   ULONG OtherExceptions;
4313   ULONG MftReads;
4314   ULONG MftReadBytes;
4315   ULONG MftWrites;
4316   ULONG MftWriteBytes;
4317   struct {
4318     USHORT Write;
4319     USHORT Create;
4320     USHORT SetInfo;
4321     USHORT Flush;
4322   } MftWritesUserLevel;
4323   USHORT MftWritesFlushForLogFileFull;
4324   USHORT MftWritesLazyWriter;
4325   USHORT MftWritesUserRequest;
4326   ULONG Mft2Writes;
4327   ULONG Mft2WriteBytes;
4328   struct {
4329     USHORT Write;
4330     USHORT Create;
4331     USHORT SetInfo;
4332     USHORT Flush;
4333   } Mft2WritesUserLevel;
4334   USHORT Mft2WritesFlushForLogFileFull;
4335   USHORT Mft2WritesLazyWriter;
4336   USHORT Mft2WritesUserRequest;
4337   ULONG RootIndexReads;
4338   ULONG RootIndexReadBytes;
4339   ULONG RootIndexWrites;
4340   ULONG RootIndexWriteBytes;
4341   ULONG BitmapReads;
4342   ULONG BitmapReadBytes;
4343   ULONG BitmapWrites;
4344   ULONG BitmapWriteBytes;
4345   USHORT BitmapWritesFlushForLogFileFull;
4346   USHORT BitmapWritesLazyWriter;
4347   USHORT BitmapWritesUserRequest;
4348   struct {
4349     USHORT Write;
4350     USHORT Create;
4351     USHORT SetInfo;
4352   } BitmapWritesUserLevel;
4353   ULONG MftBitmapReads;
4354   ULONG MftBitmapReadBytes;
4355   ULONG MftBitmapWrites;
4356   ULONG MftBitmapWriteBytes;
4357   USHORT MftBitmapWritesFlushForLogFileFull;
4358   USHORT MftBitmapWritesLazyWriter;
4359   USHORT MftBitmapWritesUserRequest;
4360   struct {
4361     USHORT Write;
4362     USHORT Create;
4363     USHORT SetInfo;
4364     USHORT Flush;
4365   } MftBitmapWritesUserLevel;
4366   ULONG UserIndexReads;
4367   ULONG UserIndexReadBytes;
4368   ULONG UserIndexWrites;
4369   ULONG UserIndexWriteBytes;
4370   ULONG LogFileReads;
4371   ULONG LogFileReadBytes;
4372   ULONG LogFileWrites;
4373   ULONG LogFileWriteBytes;
4374   struct {
4375     ULONG Calls;
4376     ULONG Clusters;
4377     ULONG Hints;
4378     ULONG RunsReturned;
4379     ULONG HintsHonored;
4380     ULONG HintsClusters;
4381     ULONG Cache;
4382     ULONG CacheClusters;
4383     ULONG CacheMiss;
4384     ULONG CacheMissClusters;
4385   } Allocate;
4386 } NTFS_STATISTICS, *PNTFS_STATISTICS;
4387 
4388 #endif /* _FILESYSTEMFSCTL_ */
4389 
4390 #define SYMLINK_FLAG_RELATIVE   1
4391 
4392 typedef struct _REPARSE_DATA_BUFFER {
4393   ULONG ReparseTag;
4394   USHORT ReparseDataLength;
4395   USHORT Reserved;
4396   _ANONYMOUS_UNION union {
4397     struct {
4398       USHORT SubstituteNameOffset;
4399       USHORT SubstituteNameLength;
4400       USHORT PrintNameOffset;
4401       USHORT PrintNameLength;
4402       ULONG Flags;
4403       WCHAR PathBuffer[1];
4404     } SymbolicLinkReparseBuffer;
4405     struct {
4406       USHORT SubstituteNameOffset;
4407       USHORT SubstituteNameLength;
4408       USHORT PrintNameOffset;
4409       USHORT PrintNameLength;
4410       WCHAR PathBuffer[1];
4411     } MountPointReparseBuffer;
4412     struct {
4413       UCHAR DataBuffer[1];
4414     } GenericReparseBuffer;
4415   } DUMMYUNIONNAME;
4416 } REPARSE_DATA_BUFFER, *PREPARSE_DATA_BUFFER;
4417 
4418 #define REPARSE_DATA_BUFFER_HEADER_SIZE   FIELD_OFFSET(REPARSE_DATA_BUFFER, GenericReparseBuffer)
4419 
4420 typedef struct _REPARSE_GUID_DATA_BUFFER {
4421   ULONG ReparseTag;
4422   USHORT ReparseDataLength;
4423   USHORT Reserved;
4424   GUID ReparseGuid;
4425   struct {
4426     UCHAR DataBuffer[1];
4427   } GenericReparseBuffer;
4428 } REPARSE_GUID_DATA_BUFFER, *PREPARSE_GUID_DATA_BUFFER;
4429 
4430 #define REPARSE_GUID_DATA_BUFFER_HEADER_SIZE   FIELD_OFFSET(REPARSE_GUID_DATA_BUFFER, GenericReparseBuffer)
4431 
4432 #define MAXIMUM_REPARSE_DATA_BUFFER_SIZE      ( 16 * 1024 )
4433 
4434 /* Reserved reparse tags */
4435 #define IO_REPARSE_TAG_RESERVED_ZERO            (0)
4436 #define IO_REPARSE_TAG_RESERVED_ONE             (1)
4437 #define IO_REPARSE_TAG_RESERVED_RANGE           IO_REPARSE_TAG_RESERVED_ONE
4438 
4439 #define IsReparseTagMicrosoft(_tag)             (((_tag) & 0x80000000))
4440 #define IsReparseTagNameSurrogate(_tag)         (((_tag) & 0x20000000))
4441 
4442 #define IO_REPARSE_TAG_VALID_VALUES             (0xF000FFFF)
4443 
4444 #define IsReparseTagValid(tag) (                               \
4445                   !((tag) & ~IO_REPARSE_TAG_VALID_VALUES) &&   \
4446                   ((tag) > IO_REPARSE_TAG_RESERVED_RANGE)      \
4447                 )
4448 
4449 /* MicroSoft reparse point tags */
4450 #define IO_REPARSE_TAG_MOUNT_POINT              (0xA0000003L)
4451 #define IO_REPARSE_TAG_HSM                      (0xC0000004L)
4452 #define IO_REPARSE_TAG_DRIVE_EXTENDER           (0x80000005L)
4453 #define IO_REPARSE_TAG_HSM2                     (0x80000006L)
4454 #define IO_REPARSE_TAG_SIS                      (0x80000007L)
4455 #define IO_REPARSE_TAG_WIM                      (0x80000008L)
4456 #define IO_REPARSE_TAG_CSV                      (0x80000009L)
4457 #define IO_REPARSE_TAG_DFS                      (0x8000000AL)
4458 #define IO_REPARSE_TAG_FILTER_MANAGER           (0x8000000BL)
4459 #define IO_REPARSE_TAG_SYMLINK                  (0xA000000CL)
4460 #define IO_REPARSE_TAG_IIS_CACHE                (0xA0000010L)
4461 #define IO_REPARSE_TAG_DFSR                     (0x80000012L)
4462 
4463 #pragma pack(4)
4464 typedef struct _REPARSE_INDEX_KEY {
4465   ULONG FileReparseTag;
4466   LARGE_INTEGER FileId;
4467 } REPARSE_INDEX_KEY, *PREPARSE_INDEX_KEY;
4468 #pragma pack()
4469 
4470 #define FSCTL_LMR_GET_LINK_TRACKING_INFORMATION   CTL_CODE(FILE_DEVICE_NETWORK_FILE_SYSTEM,58,METHOD_BUFFERED,FILE_ANY_ACCESS)
4471 #define FSCTL_LMR_SET_LINK_TRACKING_INFORMATION   CTL_CODE(FILE_DEVICE_NETWORK_FILE_SYSTEM,59,METHOD_BUFFERED,FILE_ANY_ACCESS)
4472 #define IOCTL_LMR_ARE_FILE_OBJECTS_ON_SAME_SERVER CTL_CODE(FILE_DEVICE_NETWORK_FILE_SYSTEM,60,METHOD_BUFFERED,FILE_ANY_ACCESS)
4473 
4474 #define FSCTL_PIPE_ASSIGN_EVENT             CTL_CODE(FILE_DEVICE_NAMED_PIPE, 0, METHOD_BUFFERED, FILE_ANY_ACCESS)
4475 #define FSCTL_PIPE_DISCONNECT               CTL_CODE(FILE_DEVICE_NAMED_PIPE, 1, METHOD_BUFFERED, FILE_ANY_ACCESS)
4476 #define FSCTL_PIPE_LISTEN                   CTL_CODE(FILE_DEVICE_NAMED_PIPE, 2, METHOD_BUFFERED, FILE_ANY_ACCESS)
4477 #define FSCTL_PIPE_PEEK                     CTL_CODE(FILE_DEVICE_NAMED_PIPE, 3, METHOD_BUFFERED, FILE_READ_DATA)
4478 #define FSCTL_PIPE_QUERY_EVENT              CTL_CODE(FILE_DEVICE_NAMED_PIPE, 4, METHOD_BUFFERED, FILE_ANY_ACCESS)
4479 #define FSCTL_PIPE_TRANSCEIVE               CTL_CODE(FILE_DEVICE_NAMED_PIPE, 5, METHOD_NEITHER,  FILE_READ_DATA | FILE_WRITE_DATA)
4480 #define FSCTL_PIPE_WAIT                     CTL_CODE(FILE_DEVICE_NAMED_PIPE, 6, METHOD_BUFFERED, FILE_ANY_ACCESS)
4481 #define FSCTL_PIPE_IMPERSONATE              CTL_CODE(FILE_DEVICE_NAMED_PIPE, 7, METHOD_BUFFERED, FILE_ANY_ACCESS)
4482 #define FSCTL_PIPE_SET_CLIENT_PROCESS       CTL_CODE(FILE_DEVICE_NAMED_PIPE, 8, METHOD_BUFFERED, FILE_ANY_ACCESS)
4483 #define FSCTL_PIPE_QUERY_CLIENT_PROCESS     CTL_CODE(FILE_DEVICE_NAMED_PIPE, 9, METHOD_BUFFERED, FILE_ANY_ACCESS)
4484 #define FSCTL_PIPE_GET_PIPE_ATTRIBUTE       CTL_CODE(FILE_DEVICE_NAMED_PIPE, 10, METHOD_BUFFERED, FILE_ANY_ACCESS)
4485 #define FSCTL_PIPE_SET_PIPE_ATTRIBUTE       CTL_CODE(FILE_DEVICE_NAMED_PIPE, 11, METHOD_BUFFERED, FILE_ANY_ACCESS)
4486 #define FSCTL_PIPE_GET_CONNECTION_ATTRIBUTE CTL_CODE(FILE_DEVICE_NAMED_PIPE, 12, METHOD_BUFFERED, FILE_ANY_ACCESS)
4487 #define FSCTL_PIPE_SET_CONNECTION_ATTRIBUTE CTL_CODE(FILE_DEVICE_NAMED_PIPE, 13, METHOD_BUFFERED, FILE_ANY_ACCESS)
4488 #define FSCTL_PIPE_GET_HANDLE_ATTRIBUTE     CTL_CODE(FILE_DEVICE_NAMED_PIPE, 14, METHOD_BUFFERED, FILE_ANY_ACCESS)
4489 #define FSCTL_PIPE_SET_HANDLE_ATTRIBUTE     CTL_CODE(FILE_DEVICE_NAMED_PIPE, 15, METHOD_BUFFERED, FILE_ANY_ACCESS)
4490 #define FSCTL_PIPE_FLUSH                    CTL_CODE(FILE_DEVICE_NAMED_PIPE, 16, METHOD_BUFFERED, FILE_WRITE_DATA)
4491 
4492 #define FSCTL_PIPE_INTERNAL_READ            CTL_CODE(FILE_DEVICE_NAMED_PIPE, 2045, METHOD_BUFFERED, FILE_READ_DATA)
4493 #define FSCTL_PIPE_INTERNAL_WRITE           CTL_CODE(FILE_DEVICE_NAMED_PIPE, 2046, METHOD_BUFFERED, FILE_WRITE_DATA)
4494 #define FSCTL_PIPE_INTERNAL_TRANSCEIVE      CTL_CODE(FILE_DEVICE_NAMED_PIPE, 2047, METHOD_NEITHER, FILE_READ_DATA | FILE_WRITE_DATA)
4495 #define FSCTL_PIPE_INTERNAL_READ_OVFLOW     CTL_CODE(FILE_DEVICE_NAMED_PIPE, 2048, METHOD_BUFFERED, FILE_READ_DATA)
4496 
4497 #define FILE_PIPE_READ_DATA                 0x00000000
4498 #define FILE_PIPE_WRITE_SPACE               0x00000001
4499 
4500 typedef struct _FILE_PIPE_ASSIGN_EVENT_BUFFER {
4501   HANDLE EventHandle;
4502   ULONG KeyValue;
4503 } FILE_PIPE_ASSIGN_EVENT_BUFFER, *PFILE_PIPE_ASSIGN_EVENT_BUFFER;
4504 
4505 typedef struct _FILE_PIPE_EVENT_BUFFER {
4506   ULONG NamedPipeState;
4507   ULONG EntryType;
4508   ULONG ByteCount;
4509   ULONG KeyValue;
4510   ULONG NumberRequests;
4511 } FILE_PIPE_EVENT_BUFFER, *PFILE_PIPE_EVENT_BUFFER;
4512 
4513 typedef struct _FILE_PIPE_PEEK_BUFFER {
4514   ULONG NamedPipeState;
4515   ULONG ReadDataAvailable;
4516   ULONG NumberOfMessages;
4517   ULONG MessageLength;
4518   CHAR Data[1];
4519 } FILE_PIPE_PEEK_BUFFER, *PFILE_PIPE_PEEK_BUFFER;
4520 
4521 typedef struct _FILE_PIPE_WAIT_FOR_BUFFER {
4522   LARGE_INTEGER Timeout;
4523   ULONG NameLength;
4524   BOOLEAN TimeoutSpecified;
4525   WCHAR Name[1];
4526 } FILE_PIPE_WAIT_FOR_BUFFER, *PFILE_PIPE_WAIT_FOR_BUFFER;
4527 
4528 typedef struct _FILE_PIPE_CLIENT_PROCESS_BUFFER {
4529 #if !defined(BUILD_WOW6432)
4530   PVOID ClientSession;
4531   PVOID ClientProcess;
4532 #else
4533   ULONGLONG ClientSession;
4534   ULONGLONG ClientProcess;
4535 #endif
4536 } FILE_PIPE_CLIENT_PROCESS_BUFFER, *PFILE_PIPE_CLIENT_PROCESS_BUFFER;
4537 
4538 #define FILE_PIPE_COMPUTER_NAME_LENGTH 15
4539 
4540 typedef struct _FILE_PIPE_CLIENT_PROCESS_BUFFER_EX {
4541 #if !defined(BUILD_WOW6432)
4542   PVOID ClientSession;
4543   PVOID ClientProcess;
4544 #else
4545   ULONGLONG ClientSession;
4546   ULONGLONG ClientProcess;
4547 #endif
4548   USHORT ClientComputerNameLength;
4549   WCHAR ClientComputerBuffer[FILE_PIPE_COMPUTER_NAME_LENGTH+1];
4550 } FILE_PIPE_CLIENT_PROCESS_BUFFER_EX, *PFILE_PIPE_CLIENT_PROCESS_BUFFER_EX;
4551 
4552 #define FSCTL_MAILSLOT_PEEK             CTL_CODE(FILE_DEVICE_MAILSLOT, 0, METHOD_NEITHER, FILE_READ_DATA)
4553 
4554 typedef enum _LINK_TRACKING_INFORMATION_TYPE {
4555   NtfsLinkTrackingInformation,
4556   DfsLinkTrackingInformation
4557 } LINK_TRACKING_INFORMATION_TYPE, *PLINK_TRACKING_INFORMATION_TYPE;
4558 
4559 typedef struct _LINK_TRACKING_INFORMATION {
4560   LINK_TRACKING_INFORMATION_TYPE Type;
4561   UCHAR VolumeId[16];
4562 } LINK_TRACKING_INFORMATION, *PLINK_TRACKING_INFORMATION;
4563 
4564 typedef struct _REMOTE_LINK_TRACKING_INFORMATION {
4565   PVOID TargetFileObject;
4566   ULONG TargetLinkTrackingInformationLength;
4567   UCHAR TargetLinkTrackingInformationBuffer[1];
4568 } REMOTE_LINK_TRACKING_INFORMATION, *PREMOTE_LINK_TRACKING_INFORMATION;
4569 
4570 #define IO_OPEN_PAGING_FILE                 0x0002
4571 #define IO_OPEN_TARGET_DIRECTORY            0x0004
4572 #define IO_STOP_ON_SYMLINK                  0x0008
4573 #define IO_MM_PAGING_FILE                   0x0010
4574 
4575 typedef VOID
4576 (NTAPI *PDRIVER_FS_NOTIFICATION) (
4577   IN PDEVICE_OBJECT DeviceObject,
4578   IN BOOLEAN FsActive);
4579 
4580 typedef enum _FS_FILTER_SECTION_SYNC_TYPE {
4581   SyncTypeOther = 0,
4582   SyncTypeCreateSection
4583 } FS_FILTER_SECTION_SYNC_TYPE, *PFS_FILTER_SECTION_SYNC_TYPE;
4584 
4585 typedef enum _FS_FILTER_STREAM_FO_NOTIFICATION_TYPE {
4586   NotifyTypeCreate = 0,
4587   NotifyTypeRetired
4588 } FS_FILTER_STREAM_FO_NOTIFICATION_TYPE, *PFS_FILTER_STREAM_FO_NOTIFICATION_TYPE;
4589 
4590 typedef union _FS_FILTER_PARAMETERS {
4591   struct {
4592     PLARGE_INTEGER EndingOffset;
4593     PERESOURCE *ResourceToRelease;
4594   } AcquireForModifiedPageWriter;
4595   struct {
4596     PERESOURCE ResourceToRelease;
4597   } ReleaseForModifiedPageWriter;
4598   struct {
4599     FS_FILTER_SECTION_SYNC_TYPE SyncType;
4600     ULONG PageProtection;
4601   } AcquireForSectionSynchronization;
4602   struct {
4603     FS_FILTER_STREAM_FO_NOTIFICATION_TYPE NotificationType;
4604     BOOLEAN POINTER_ALIGNMENT SafeToRecurse;
4605   } NotifyStreamFileObject;
4606   struct {
4607     PVOID Argument1;
4608     PVOID Argument2;
4609     PVOID Argument3;
4610     PVOID Argument4;
4611     PVOID Argument5;
4612   } Others;
4613 } FS_FILTER_PARAMETERS, *PFS_FILTER_PARAMETERS;
4614 
4615 #define FS_FILTER_ACQUIRE_FOR_SECTION_SYNCHRONIZATION      (UCHAR)-1
4616 #define FS_FILTER_RELEASE_FOR_SECTION_SYNCHRONIZATION      (UCHAR)-2
4617 #define FS_FILTER_ACQUIRE_FOR_MOD_WRITE                    (UCHAR)-3
4618 #define FS_FILTER_RELEASE_FOR_MOD_WRITE                    (UCHAR)-4
4619 #define FS_FILTER_ACQUIRE_FOR_CC_FLUSH                     (UCHAR)-5
4620 #define FS_FILTER_RELEASE_FOR_CC_FLUSH                     (UCHAR)-6
4621 
4622 typedef struct _FS_FILTER_CALLBACK_DATA {
4623   ULONG SizeOfFsFilterCallbackData;
4624   UCHAR Operation;
4625   UCHAR Reserved;
4626   struct _DEVICE_OBJECT *DeviceObject;
4627   struct _FILE_OBJECT *FileObject;
4628   FS_FILTER_PARAMETERS Parameters;
4629 } FS_FILTER_CALLBACK_DATA, *PFS_FILTER_CALLBACK_DATA;
4630 
4631 typedef NTSTATUS
4632 (NTAPI *PFS_FILTER_CALLBACK) (
4633   IN PFS_FILTER_CALLBACK_DATA Data,
4634   OUT PVOID *CompletionContext);
4635 
4636 typedef VOID
4637 (NTAPI *PFS_FILTER_COMPLETION_CALLBACK) (
4638   IN PFS_FILTER_CALLBACK_DATA Data,
4639   IN NTSTATUS OperationStatus,
4640   IN PVOID CompletionContext);
4641 
4642 typedef struct _FS_FILTER_CALLBACKS {
4643   ULONG SizeOfFsFilterCallbacks;
4644   ULONG Reserved;
4645   PFS_FILTER_CALLBACK PreAcquireForSectionSynchronization;
4646   PFS_FILTER_COMPLETION_CALLBACK PostAcquireForSectionSynchronization;
4647   PFS_FILTER_CALLBACK PreReleaseForSectionSynchronization;
4648   PFS_FILTER_COMPLETION_CALLBACK PostReleaseForSectionSynchronization;
4649   PFS_FILTER_CALLBACK PreAcquireForCcFlush;
4650   PFS_FILTER_COMPLETION_CALLBACK PostAcquireForCcFlush;
4651   PFS_FILTER_CALLBACK PreReleaseForCcFlush;
4652   PFS_FILTER_COMPLETION_CALLBACK PostReleaseForCcFlush;
4653   PFS_FILTER_CALLBACK PreAcquireForModifiedPageWriter;
4654   PFS_FILTER_COMPLETION_CALLBACK PostAcquireForModifiedPageWriter;
4655   PFS_FILTER_CALLBACK PreReleaseForModifiedPageWriter;
4656   PFS_FILTER_COMPLETION_CALLBACK PostReleaseForModifiedPageWriter;
4657 } FS_FILTER_CALLBACKS, *PFS_FILTER_CALLBACKS;
4658 
4659 #if (NTDDI_VERSION >= NTDDI_WINXP)
4660 NTKERNELAPI
4661 NTSTATUS
4662 NTAPI
4663 FsRtlRegisterFileSystemFilterCallbacks(
4664   IN struct _DRIVER_OBJECT *FilterDriverObject,
4665   IN PFS_FILTER_CALLBACKS Callbacks);
4666 #endif /* (NTDDI_VERSION >= NTDDI_WINXP) */
4667 
4668 #if (NTDDI_VERSION >= NTDDI_VISTA)
4669 NTKERNELAPI
4670 NTSTATUS
4671 NTAPI
4672 FsRtlNotifyStreamFileObject(
4673   IN struct _FILE_OBJECT * StreamFileObject,
4674   IN struct _DEVICE_OBJECT *DeviceObjectHint OPTIONAL,
4675   IN FS_FILTER_STREAM_FO_NOTIFICATION_TYPE NotificationType,
4676   IN BOOLEAN SafeToRecurse);
4677 #endif /* (NTDDI_VERSION >= NTDDI_VISTA) */
4678 
4679 #define DO_VERIFY_VOLUME                    0x00000002
4680 #define DO_BUFFERED_IO                      0x00000004
4681 #define DO_EXCLUSIVE                        0x00000008
4682 #define DO_DIRECT_IO                        0x00000010
4683 #define DO_MAP_IO_BUFFER                    0x00000020
4684 #define DO_DEVICE_HAS_NAME                  0x00000040
4685 #define DO_DEVICE_INITIALIZING              0x00000080
4686 #define DO_SYSTEM_BOOT_PARTITION            0x00000100
4687 #define DO_LONG_TERM_REQUESTS               0x00000200
4688 #define DO_NEVER_LAST_DEVICE                0x00000400
4689 #define DO_SHUTDOWN_REGISTERED              0x00000800
4690 #define DO_BUS_ENUMERATED_DEVICE            0x00001000
4691 #define DO_POWER_PAGABLE                    0x00002000
4692 #define DO_POWER_INRUSH                     0x00004000
4693 #define DO_LOW_PRIORITY_FILESYSTEM          0x00010000
4694 #define DO_SUPPORTS_TRANSACTIONS            0x00040000
4695 #define DO_FORCE_NEITHER_IO                 0x00080000
4696 #define DO_VOLUME_DEVICE_OBJECT             0x00100000
4697 #define DO_SYSTEM_SYSTEM_PARTITION          0x00200000
4698 #define DO_SYSTEM_CRITICAL_PARTITION        0x00400000
4699 #define DO_DISALLOW_EXECUTE                 0x00800000
4700 
4701 extern KSPIN_LOCK                   IoStatisticsLock;
4702 extern ULONG                        IoReadOperationCount;
4703 extern ULONG                        IoWriteOperationCount;
4704 extern ULONG                        IoOtherOperationCount;
4705 extern LARGE_INTEGER                IoReadTransferCount;
4706 extern LARGE_INTEGER                IoWriteTransferCount;
4707 extern LARGE_INTEGER                IoOtherTransferCount;
4708 
4709 #define IO_FILE_OBJECT_NON_PAGED_POOL_CHARGE    64
4710 #define IO_FILE_OBJECT_PAGED_POOL_CHARGE        1024
4711 
4712 #if (NTDDI_VERSION >= NTDDI_VISTA)
4713 typedef struct _IO_PRIORITY_INFO {
4714   ULONG Size;
4715   ULONG ThreadPriority;
4716   ULONG PagePriority;
4717   IO_PRIORITY_HINT IoPriority;
4718 } IO_PRIORITY_INFO, *PIO_PRIORITY_INFO;
4719 #endif
4720 
4721 typedef struct _PUBLIC_OBJECT_BASIC_INFORMATION {
4722   ULONG Attributes;
4723   ACCESS_MASK GrantedAccess;
4724   ULONG HandleCount;
4725   ULONG PointerCount;
4726   ULONG Reserved[10];
4727 } PUBLIC_OBJECT_BASIC_INFORMATION, *PPUBLIC_OBJECT_BASIC_INFORMATION;
4728 
4729 typedef struct _PUBLIC_OBJECT_TYPE_INFORMATION {
4730   UNICODE_STRING TypeName;
4731   ULONG Reserved [22];
4732 } PUBLIC_OBJECT_TYPE_INFORMATION, *PPUBLIC_OBJECT_TYPE_INFORMATION;
4733 
4734 typedef struct _SECURITY_CLIENT_CONTEXT {
4735   SECURITY_QUALITY_OF_SERVICE SecurityQos;
4736   PACCESS_TOKEN ClientToken;
4737   BOOLEAN DirectlyAccessClientToken;
4738   BOOLEAN DirectAccessEffectiveOnly;
4739   BOOLEAN ServerIsRemote;
4740   TOKEN_CONTROL ClientTokenControl;
4741 } SECURITY_CLIENT_CONTEXT, *PSECURITY_CLIENT_CONTEXT;
4742 
4743 #define SYSTEM_PAGE_PRIORITY_BITS       3
4744 #define SYSTEM_PAGE_PRIORITY_LEVELS     (1 << SYSTEM_PAGE_PRIORITY_BITS)
4745 
4746 typedef struct _KAPC_STATE {
4747   LIST_ENTRY ApcListHead[MaximumMode];
4748   PKPROCESS Process;
4749   BOOLEAN KernelApcInProgress;
4750   BOOLEAN KernelApcPending;
4751   BOOLEAN UserApcPending;
4752 } KAPC_STATE, *PKAPC_STATE, *RESTRICTED_POINTER PRKAPC_STATE;
4753 
4754 #define KAPC_STATE_ACTUAL_LENGTH (FIELD_OFFSET(KAPC_STATE, UserApcPending) + sizeof(BOOLEAN))
4755 
4756 #define ASSERT_QUEUE(Q) ASSERT(((Q)->Header.Type & KOBJECT_TYPE_MASK) == QueueObject);
4757 
4758 typedef struct _KQUEUE {
4759   DISPATCHER_HEADER Header;
4760   LIST_ENTRY EntryListHead;
4761   volatile ULONG CurrentCount;
4762   ULONG MaximumCount;
4763   LIST_ENTRY ThreadListHead;
4764 } KQUEUE, *PKQUEUE, *RESTRICTED_POINTER PRKQUEUE;
4765 
4766 /******************************************************************************
4767  *                              Kernel Functions                              *
4768  ******************************************************************************/
4769 
4770 NTSTATUS
4771 NTAPI
4772 KeGetProcessorNumberFromIndex(
4773   IN ULONG ProcIndex,
4774   OUT PPROCESSOR_NUMBER ProcNumber);
4775 
4776 ULONG
4777 NTAPI
4778 KeGetProcessorIndexFromNumber(
4779   IN PPROCESSOR_NUMBER ProcNumber);
4780 
4781 #if (NTDDI_VERSION >= NTDDI_WIN2K)
4782 
4783 
4784 
4785 
4786 NTKERNELAPI
4787 VOID
4788 NTAPI
4789 KeInitializeMutant(
4790   OUT PRKMUTANT Mutant,
4791   IN BOOLEAN InitialOwner);
4792 
4793 NTKERNELAPI
4794 LONG
4795 NTAPI
4796 KeReadStateMutant(
4797   IN PRKMUTANT Mutant);
4798 
4799 NTKERNELAPI
4800 LONG
4801 NTAPI
4802 KeReleaseMutant(
4803   IN OUT PRKMUTANT Mutant,
4804   IN KPRIORITY Increment,
4805   IN BOOLEAN Abandoned,
4806   IN BOOLEAN Wait);
4807 
4808 NTKERNELAPI
4809 VOID
4810 NTAPI
4811 KeInitializeQueue(
4812   OUT PRKQUEUE Queue,
4813   IN ULONG Count);
4814 
4815 NTKERNELAPI
4816 LONG
4817 NTAPI
4818 KeReadStateQueue(
4819   IN PRKQUEUE Queue);
4820 
4821 NTKERNELAPI
4822 LONG
4823 NTAPI
4824 KeInsertQueue(
4825   IN OUT PRKQUEUE Queue,
4826   IN OUT PLIST_ENTRY Entry);
4827 
4828 NTKERNELAPI
4829 LONG
4830 NTAPI
4831 KeInsertHeadQueue(
4832   IN OUT PRKQUEUE Queue,
4833   IN OUT PLIST_ENTRY Entry);
4834 
4835 NTKERNELAPI
4836 PLIST_ENTRY
4837 NTAPI
4838 KeRemoveQueue(
4839   IN OUT PRKQUEUE Queue,
4840   IN KPROCESSOR_MODE WaitMode,
4841   IN PLARGE_INTEGER Timeout OPTIONAL);
4842 
4843 NTKERNELAPI
4844 VOID
4845 NTAPI
4846 KeAttachProcess(
4847   IN OUT PKPROCESS Process);
4848 
4849 NTKERNELAPI
4850 VOID
4851 NTAPI
4852 KeDetachProcess(
4853   VOID);
4854 
4855 NTKERNELAPI
4856 PLIST_ENTRY
4857 NTAPI
4858 KeRundownQueue(
4859   IN OUT PRKQUEUE Queue);
4860 
4861 NTKERNELAPI
4862 VOID
4863 NTAPI
4864 KeStackAttachProcess(
4865   IN OUT PKPROCESS Process,
4866   OUT PKAPC_STATE ApcState);
4867 
4868 NTKERNELAPI
4869 VOID
4870 NTAPI
4871 KeUnstackDetachProcess(
4872   IN PKAPC_STATE ApcState);
4873 
4874 NTKERNELAPI
4875 UCHAR
4876 NTAPI
4877 KeSetIdealProcessorThread(
4878   IN OUT PKTHREAD Thread,
4879   IN UCHAR Processor);
4880 
4881 NTKERNELAPI
4882 BOOLEAN
4883 NTAPI
4884 KeSetKernelStackSwapEnable(
4885   IN BOOLEAN Enable);
4886 
4887 #if defined(_X86_)
4888 NTHALAPI
4889 KIRQL
4890 FASTCALL
4891 KeAcquireSpinLockRaiseToSynch(
4892   IN OUT PKSPIN_LOCK SpinLock);
4893 #else
4894 NTKERNELAPI
4895 KIRQL
4896 KeAcquireSpinLockRaiseToSynch(
4897   IN OUT PKSPIN_LOCK SpinLock);
4898 #endif
4899 
4900 #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
4901 
4902 #if (NTDDI_VERSION >= NTDDI_WINXP)
4903 
4904 _DECL_HAL_KE_IMPORT
4905 KIRQL
4906 FASTCALL
4907 KeAcquireQueuedSpinLock(
4908   IN OUT KSPIN_LOCK_QUEUE_NUMBER Number);
4909 
4910 _DECL_HAL_KE_IMPORT
4911 VOID
4912 FASTCALL
4913 KeReleaseQueuedSpinLock(
4914   IN OUT KSPIN_LOCK_QUEUE_NUMBER Number,
4915   IN KIRQL OldIrql);
4916 
4917 _DECL_HAL_KE_IMPORT
4918 LOGICAL
4919 FASTCALL
4920 KeTryToAcquireQueuedSpinLock(
4921   IN KSPIN_LOCK_QUEUE_NUMBER Number,
4922   OUT PKIRQL OldIrql);
4923 
4924 #endif /* (NTDDI_VERSION >= NTDDI_WINXP) */
4925 
4926 
4927 
4928 #if (NTDDI_VERSION >= NTDDI_VISTA)
4929 
4930 NTKERNELAPI
4931 VOID
4932 KeQueryOwnerMutant(
4933   IN PKMUTANT Mutant,
4934   OUT PCLIENT_ID ClientId);
4935 
4936 NTKERNELAPI
4937 ULONG
4938 KeRemoveQueueEx (
4939   IN OUT PKQUEUE Queue,
4940   IN KPROCESSOR_MODE WaitMode,
4941   IN BOOLEAN Alertable,
4942   IN PLARGE_INTEGER Timeout OPTIONAL,
4943   OUT PLIST_ENTRY *EntryArray,
4944   IN ULONG Count);
4945 
4946 #endif /* (NTDDI_VERSION >= NTDDI_VISTA) */
4947 
4948 
4949 
4950 #define INVALID_PROCESSOR_INDEX     0xffffffff
4951 
4952 #define EX_PUSH_LOCK ULONG_PTR
4953 #define PEX_PUSH_LOCK PULONG_PTR
4954 
4955 /******************************************************************************
4956  *                          Executive Functions                               *
4957  ******************************************************************************/
4958 
4959 #define ExDisableResourceBoost ExDisableResourceBoostLite
4960 
4961 VOID
4962 ExInitializePushLock (
4963   OUT PEX_PUSH_LOCK PushLock);
4964 
4965 #if (NTDDI_VERSION >= NTDDI_WIN2K)
4966 
4967 NTKERNELAPI
4968 SIZE_T
4969 NTAPI
4970 ExQueryPoolBlockSize(
4971   IN PVOID PoolBlock,
4972   OUT PBOOLEAN QuotaCharged);
4973 
4974 VOID
4975 ExAdjustLookasideDepth(
4976   VOID);
4977 
4978 NTKERNELAPI
4979 VOID
4980 NTAPI
4981 ExDisableResourceBoostLite(
4982   IN PERESOURCE Resource);
4983 #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
4984 
4985 #if (NTDDI_VERSION >= NTDDI_WINXP)
4986 
4987 PSLIST_ENTRY
4988 FASTCALL
4989 InterlockedPushListSList(
4990   IN OUT PSLIST_HEADER ListHead,
4991   IN OUT PSLIST_ENTRY List,
4992   IN OUT PSLIST_ENTRY ListEnd,
4993   IN ULONG Count);
4994 #endif /* (NTDDI_VERSION >= NTDDI_WINXP) */
4995 
4996 /******************************************************************************
4997  *                            Security Manager Functions                      *
4998  ******************************************************************************/
4999 
5000 #if (NTDDI_VERSION >= NTDDI_WIN2K)
5001 
5002 NTKERNELAPI
5003 VOID
5004 NTAPI
5005 SeReleaseSubjectContext(
5006   IN PSECURITY_SUBJECT_CONTEXT SubjectContext);
5007 
5008 NTKERNELAPI
5009 BOOLEAN
5010 NTAPI
5011 SePrivilegeCheck(
5012   IN OUT PPRIVILEGE_SET RequiredPrivileges,
5013   IN PSECURITY_SUBJECT_CONTEXT SubjectContext,
5014   IN KPROCESSOR_MODE AccessMode);
5015 
5016 NTKERNELAPI
5017 VOID
5018 NTAPI
5019 SeOpenObjectAuditAlarm(
5020   IN PUNICODE_STRING ObjectTypeName,
5021   IN PVOID Object OPTIONAL,
5022   IN PUNICODE_STRING AbsoluteObjectName OPTIONAL,
5023   IN PSECURITY_DESCRIPTOR SecurityDescriptor,
5024   IN PACCESS_STATE AccessState,
5025   IN BOOLEAN ObjectCreated,
5026   IN BOOLEAN AccessGranted,
5027   IN KPROCESSOR_MODE AccessMode,
5028   OUT PBOOLEAN GenerateOnClose);
5029 
5030 NTKERNELAPI
5031 VOID
5032 NTAPI
5033 SeOpenObjectForDeleteAuditAlarm(
5034   IN PUNICODE_STRING ObjectTypeName,
5035   IN PVOID Object OPTIONAL,
5036   IN PUNICODE_STRING AbsoluteObjectName OPTIONAL,
5037   IN PSECURITY_DESCRIPTOR SecurityDescriptor,
5038   IN PACCESS_STATE AccessState,
5039   IN BOOLEAN ObjectCreated,
5040   IN BOOLEAN AccessGranted,
5041   IN KPROCESSOR_MODE AccessMode,
5042   OUT PBOOLEAN GenerateOnClose);
5043 
5044 NTKERNELAPI
5045 VOID
5046 NTAPI
5047 SeDeleteObjectAuditAlarm(
5048   IN PVOID Object,
5049   IN HANDLE Handle);
5050 
5051 NTKERNELAPI
5052 TOKEN_TYPE
5053 NTAPI
5054 SeTokenType(
5055   IN PACCESS_TOKEN Token);
5056 
5057 NTKERNELAPI
5058 BOOLEAN
5059 NTAPI
5060 SeTokenIsAdmin(
5061   IN PACCESS_TOKEN Token);
5062 
5063 NTKERNELAPI
5064 BOOLEAN
5065 NTAPI
5066 SeTokenIsRestricted(
5067   IN PACCESS_TOKEN Token);
5068 
5069 NTKERNELAPI
5070 NTSTATUS
5071 NTAPI
5072 SeQueryAuthenticationIdToken(
5073   IN PACCESS_TOKEN Token,
5074   OUT PLUID AuthenticationId);
5075 
5076 NTKERNELAPI
5077 NTSTATUS
5078 NTAPI
5079 SeQuerySessionIdToken(
5080   IN PACCESS_TOKEN Token,
5081   OUT PULONG SessionId);
5082 
5083 NTKERNELAPI
5084 NTSTATUS
5085 NTAPI
5086 SeCreateClientSecurity(
5087   IN PETHREAD ClientThread,
5088   IN PSECURITY_QUALITY_OF_SERVICE ClientSecurityQos,
5089   IN BOOLEAN RemoteSession,
5090   OUT PSECURITY_CLIENT_CONTEXT ClientContext);
5091 
5092 NTKERNELAPI
5093 VOID
5094 NTAPI
5095 SeImpersonateClient(
5096   IN PSECURITY_CLIENT_CONTEXT ClientContext,
5097   IN PETHREAD ServerThread OPTIONAL);
5098 
5099 NTKERNELAPI
5100 NTSTATUS
5101 NTAPI
5102 SeImpersonateClientEx(
5103   IN PSECURITY_CLIENT_CONTEXT ClientContext,
5104   IN PETHREAD ServerThread OPTIONAL);
5105 
5106 NTKERNELAPI
5107 NTSTATUS
5108 NTAPI
5109 SeCreateClientSecurityFromSubjectContext(
5110   IN PSECURITY_SUBJECT_CONTEXT SubjectContext,
5111   IN PSECURITY_QUALITY_OF_SERVICE ClientSecurityQos,
5112   IN BOOLEAN ServerIsRemote,
5113   OUT PSECURITY_CLIENT_CONTEXT ClientContext);
5114 
5115 NTKERNELAPI
5116 NTSTATUS
5117 NTAPI
5118 SeQuerySecurityDescriptorInfo(
5119   IN PSECURITY_INFORMATION SecurityInformation,
5120   OUT PSECURITY_DESCRIPTOR SecurityDescriptor,
5121   IN OUT PULONG Length,
5122   IN OUT PSECURITY_DESCRIPTOR *ObjectsSecurityDescriptor);
5123 
5124 NTKERNELAPI
5125 NTSTATUS
5126 NTAPI
5127 SeSetSecurityDescriptorInfo(
5128   IN PVOID Object OPTIONAL,
5129   IN PSECURITY_INFORMATION SecurityInformation,
5130   IN PSECURITY_DESCRIPTOR SecurityDescriptor,
5131   IN OUT PSECURITY_DESCRIPTOR *ObjectsSecurityDescriptor,
5132   IN POOL_TYPE PoolType,
5133   IN PGENERIC_MAPPING GenericMapping);
5134 
5135 NTKERNELAPI
5136 NTSTATUS
5137 NTAPI
5138 SeSetSecurityDescriptorInfoEx(
5139   IN PVOID Object OPTIONAL,
5140   IN PSECURITY_INFORMATION SecurityInformation,
5141   IN PSECURITY_DESCRIPTOR ModificationDescriptor,
5142   IN OUT PSECURITY_DESCRIPTOR *ObjectsSecurityDescriptor,
5143   IN ULONG AutoInheritFlags,
5144   IN POOL_TYPE PoolType,
5145   IN PGENERIC_MAPPING GenericMapping);
5146 
5147 NTKERNELAPI
5148 NTSTATUS
5149 NTAPI
5150 SeAppendPrivileges(
5151   IN OUT PACCESS_STATE AccessState,
5152   IN PPRIVILEGE_SET Privileges);
5153 
5154 NTKERNELAPI
5155 BOOLEAN
5156 NTAPI
5157 SeAuditingFileEvents(
5158   IN BOOLEAN AccessGranted,
5159   IN PSECURITY_DESCRIPTOR SecurityDescriptor);
5160 
5161 NTKERNELAPI
5162 BOOLEAN
5163 NTAPI
5164 SeAuditingFileOrGlobalEvents(
5165   IN BOOLEAN AccessGranted,
5166   IN PSECURITY_DESCRIPTOR SecurityDescriptor,
5167   IN PSECURITY_SUBJECT_CONTEXT SubjectSecurityContext);
5168 
5169 VOID
5170 NTAPI
5171 SeSetAccessStateGenericMapping(
5172   IN OUT PACCESS_STATE AccessState,
5173   IN PGENERIC_MAPPING GenericMapping);
5174 
5175 NTKERNELAPI
5176 NTSTATUS
5177 NTAPI
5178 SeRegisterLogonSessionTerminatedRoutine(
5179   IN PSE_LOGON_SESSION_TERMINATED_ROUTINE CallbackRoutine);
5180 
5181 NTKERNELAPI
5182 NTSTATUS
5183 NTAPI
5184 SeUnregisterLogonSessionTerminatedRoutine(
5185   IN PSE_LOGON_SESSION_TERMINATED_ROUTINE CallbackRoutine);
5186 
5187 NTKERNELAPI
5188 NTSTATUS
5189 NTAPI
5190 SeMarkLogonSessionForTerminationNotification(
5191   IN PLUID LogonId);
5192 
5193 NTKERNELAPI
5194 NTSTATUS
5195 NTAPI
5196 SeQueryInformationToken(
5197   IN PACCESS_TOKEN Token,
5198   IN TOKEN_INFORMATION_CLASS TokenInformationClass,
5199   OUT PVOID *TokenInformation);
5200 
5201 #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
5202 #if (NTDDI_VERSION >= NTDDI_WIN2KSP3)
5203 NTKERNELAPI
5204 BOOLEAN
5205 NTAPI
5206 SeAuditingHardLinkEvents(
5207   IN BOOLEAN AccessGranted,
5208   IN PSECURITY_DESCRIPTOR SecurityDescriptor);
5209 #endif
5210 
5211 #if (NTDDI_VERSION >= NTDDI_WINXP)
5212 
5213 NTKERNELAPI
5214 NTSTATUS
5215 NTAPI
5216 SeFilterToken(
5217   IN PACCESS_TOKEN ExistingToken,
5218   IN ULONG Flags,
5219   IN PTOKEN_GROUPS SidsToDisable OPTIONAL,
5220   IN PTOKEN_PRIVILEGES PrivilegesToDelete OPTIONAL,
5221   IN PTOKEN_GROUPS RestrictedSids OPTIONAL,
5222   OUT PACCESS_TOKEN *FilteredToken);
5223 
5224 NTKERNELAPI
5225 VOID
5226 NTAPI
5227 SeAuditHardLinkCreation(
5228   IN PUNICODE_STRING FileName,
5229   IN PUNICODE_STRING LinkName,
5230   IN BOOLEAN bSuccess);
5231 
5232 #endif /* (NTDDI_VERSION >= NTDDI_WINXP) */
5233 
5234 #if (NTDDI_VERSION >= NTDDI_WINXPSP2)
5235 
5236 NTKERNELAPI
5237 BOOLEAN
5238 NTAPI
5239 SeAuditingFileEventsWithContext(
5240   IN BOOLEAN AccessGranted,
5241   IN PSECURITY_DESCRIPTOR SecurityDescriptor,
5242   IN PSECURITY_SUBJECT_CONTEXT SubjectSecurityContext OPTIONAL);
5243 
5244 NTKERNELAPI
5245 BOOLEAN
5246 NTAPI
5247 SeAuditingHardLinkEventsWithContext(
5248   IN BOOLEAN AccessGranted,
5249   IN PSECURITY_DESCRIPTOR SecurityDescriptor,
5250   IN PSECURITY_SUBJECT_CONTEXT SubjectSecurityContext OPTIONAL);
5251 
5252 #endif
5253 
5254 
5255 #if (NTDDI_VERSION >= NTDDI_VISTA)
5256 
5257 NTKERNELAPI
5258 VOID
5259 NTAPI
5260 SeOpenObjectAuditAlarmWithTransaction(
5261   IN PUNICODE_STRING ObjectTypeName,
5262   IN PVOID Object OPTIONAL,
5263   IN PUNICODE_STRING AbsoluteObjectName OPTIONAL,
5264   IN PSECURITY_DESCRIPTOR SecurityDescriptor,
5265   IN PACCESS_STATE AccessState,
5266   IN BOOLEAN ObjectCreated,
5267   IN BOOLEAN AccessGranted,
5268   IN KPROCESSOR_MODE AccessMode,
5269   IN GUID *TransactionId OPTIONAL,
5270   OUT PBOOLEAN GenerateOnClose);
5271 
5272 NTKERNELAPI
5273 VOID
5274 NTAPI
5275 SeOpenObjectForDeleteAuditAlarmWithTransaction(
5276   IN PUNICODE_STRING ObjectTypeName,
5277   IN PVOID Object OPTIONAL,
5278   IN PUNICODE_STRING AbsoluteObjectName OPTIONAL,
5279   IN PSECURITY_DESCRIPTOR SecurityDescriptor,
5280   IN PACCESS_STATE AccessState,
5281   IN BOOLEAN ObjectCreated,
5282   IN BOOLEAN AccessGranted,
5283   IN KPROCESSOR_MODE AccessMode,
5284   IN GUID *TransactionId OPTIONAL,
5285   OUT PBOOLEAN GenerateOnClose);
5286 
5287 NTKERNELAPI
5288 VOID
5289 NTAPI
5290 SeExamineSacl(
5291   IN PACL Sacl,
5292   IN PACCESS_TOKEN Token,
5293   IN ACCESS_MASK DesiredAccess,
5294   IN BOOLEAN AccessGranted,
5295   OUT PBOOLEAN GenerateAudit,
5296   OUT PBOOLEAN GenerateAlarm);
5297 
5298 NTKERNELAPI
5299 VOID
5300 NTAPI
5301 SeDeleteObjectAuditAlarmWithTransaction(
5302   IN PVOID Object,
5303   IN HANDLE Handle,
5304   IN GUID *TransactionId OPTIONAL);
5305 
5306 NTKERNELAPI
5307 VOID
5308 NTAPI
5309 SeQueryTokenIntegrity(
5310   IN PACCESS_TOKEN Token,
5311   IN OUT PSID_AND_ATTRIBUTES IntegritySA);
5312 
5313 NTKERNELAPI
5314 NTSTATUS
5315 NTAPI
5316 SeSetSessionIdToken(
5317   IN PACCESS_TOKEN Token,
5318   IN ULONG SessionId);
5319 
5320 NTKERNELAPI
5321 VOID
5322 NTAPI
5323 SeAuditHardLinkCreationWithTransaction(
5324   IN PUNICODE_STRING FileName,
5325   IN PUNICODE_STRING LinkName,
5326   IN BOOLEAN bSuccess,
5327   IN GUID *TransactionId OPTIONAL);
5328 
5329 NTKERNELAPI
5330 VOID
5331 NTAPI
5332 SeAuditTransactionStateChange(
5333   IN GUID *TransactionId,
5334   IN GUID *ResourceManagerId,
5335   IN ULONG NewTransactionState);
5336 #endif /* (NTDDI_VERSION >= NTDDI_VISTA) */
5337 
5338 #if (NTDDI_VERSION >= NTDDI_VISTA || (NTDDI_VERSION >= NTDDI_WINXPSP2 && NTDDI_VERSION < NTDDI_WS03))
5339 NTKERNELAPI
5340 BOOLEAN
5341 NTAPI
5342 SeTokenIsWriteRestricted(
5343   IN PACCESS_TOKEN Token);
5344 #endif
5345 
5346 #if (NTDDI_VERSION >= NTDDI_WIN7)
5347 
5348 NTKERNELAPI
5349 BOOLEAN
5350 NTAPI
5351 SeAuditingAnyFileEventsWithContext(
5352   IN PSECURITY_DESCRIPTOR SecurityDescriptor,
5353   IN PSECURITY_SUBJECT_CONTEXT SubjectSecurityContext OPTIONAL);
5354 
5355 NTKERNELAPI
5356 VOID
5357 NTAPI
5358 SeExamineGlobalSacl(
5359   IN PUNICODE_STRING ObjectType,
5360   IN PACCESS_TOKEN Token,
5361   IN ACCESS_MASK DesiredAccess,
5362   IN BOOLEAN AccessGranted,
5363   IN OUT PBOOLEAN GenerateAudit,
5364   IN OUT PBOOLEAN GenerateAlarm OPTIONAL);
5365 
5366 NTKERNELAPI
5367 VOID
5368 NTAPI
5369 SeMaximumAuditMaskFromGlobalSacl(
5370   IN PUNICODE_STRING ObjectTypeName OPTIONAL,
5371   IN ACCESS_MASK GrantedAccess,
5372   IN PACCESS_TOKEN Token,
5373   IN OUT PACCESS_MASK AuditMask);
5374 
5375 #endif /* (NTDDI_VERSION >= NTDDI_WIN7) */
5376 
5377 NTSTATUS
5378 NTAPI
5379 SeReportSecurityEventWithSubCategory(
5380   IN ULONG Flags,
5381   IN PUNICODE_STRING SourceName,
5382   IN PSID UserSid OPTIONAL,
5383   IN PSE_ADT_PARAMETER_ARRAY AuditParameters,
5384   IN ULONG AuditSubcategoryId);
5385 
5386 BOOLEAN
5387 NTAPI
5388 SeAccessCheckFromState(
5389   IN PSECURITY_DESCRIPTOR SecurityDescriptor,
5390   IN PTOKEN_ACCESS_INFORMATION PrimaryTokenInformation,
5391   IN PTOKEN_ACCESS_INFORMATION ClientTokenInformation OPTIONAL,
5392   IN ACCESS_MASK DesiredAccess,
5393   IN ACCESS_MASK PreviouslyGrantedAccess,
5394   OUT PPRIVILEGE_SET *Privileges OPTIONAL,
5395   IN PGENERIC_MAPPING GenericMapping,
5396   IN KPROCESSOR_MODE AccessMode,
5397   OUT PACCESS_MASK GrantedAccess,
5398   OUT PNTSTATUS AccessStatus);
5399 
5400 NTKERNELAPI
5401 VOID
5402 NTAPI
5403 SeFreePrivileges(
5404   IN PPRIVILEGE_SET Privileges);
5405 
5406 NTSTATUS
5407 NTAPI
5408 SeLocateProcessImageName(
5409   IN OUT PEPROCESS Process,
5410   OUT PUNICODE_STRING *pImageFileName);
5411 
5412 #define SeLengthSid( Sid ) \
5413     (8 + (4 * ((SID *)Sid)->SubAuthorityCount))
5414 
5415 #define SeDeleteClientSecurity(C)  {                                           \
5416             if (SeTokenType((C)->ClientToken) == TokenPrimary) {               \
5417                 PsDereferencePrimaryToken( (C)->ClientToken );                 \
5418             } else {                                                           \
5419                 PsDereferenceImpersonationToken( (C)->ClientToken );           \
5420             }                                                                  \
5421 }
5422 
5423 #define SeStopImpersonatingClient() PsRevertToSelf()
5424 
5425 #define SeQuerySubjectContextToken( SubjectContext )                \
5426     ( ARGUMENT_PRESENT(                                             \
5427         ((PSECURITY_SUBJECT_CONTEXT) SubjectContext)->ClientToken   \
5428         ) ?                                                         \
5429     ((PSECURITY_SUBJECT_CONTEXT) SubjectContext)->ClientToken :     \
5430     ((PSECURITY_SUBJECT_CONTEXT) SubjectContext)->PrimaryToken )
5431 
5432 extern NTKERNELAPI PSE_EXPORTS SeExports;
5433 /******************************************************************************
5434  *                          Process Manager Functions                         *
5435  ******************************************************************************/
5436 
5437 NTKERNELAPI
5438 NTSTATUS
5439 NTAPI
5440 PsLookupProcessByProcessId(
5441   IN HANDLE ProcessId,
5442   OUT PEPROCESS *Process);
5443 
5444 NTKERNELAPI
5445 NTSTATUS
5446 NTAPI
5447 PsLookupThreadByThreadId(
5448   IN HANDLE UniqueThreadId,
5449   OUT PETHREAD *Thread);
5450 
5451 #if (NTDDI_VERSION >= NTDDI_WIN2K)
5452 
5453 
5454 NTKERNELAPI
5455 PACCESS_TOKEN
5456 NTAPI
5457 PsReferenceImpersonationToken(
5458   IN OUT PETHREAD Thread,
5459   OUT PBOOLEAN CopyOnOpen,
5460   OUT PBOOLEAN EffectiveOnly,
5461   OUT PSECURITY_IMPERSONATION_LEVEL ImpersonationLevel);
5462 
5463 NTKERNELAPI
5464 LARGE_INTEGER
5465 NTAPI
5466 PsGetProcessExitTime(VOID);
5467 
5468 NTKERNELAPI
5469 BOOLEAN
5470 NTAPI
5471 PsIsThreadTerminating(
5472   IN PETHREAD Thread);
5473 
5474 NTKERNELAPI
5475 NTSTATUS
5476 NTAPI
5477 PsImpersonateClient(
5478   IN OUT PETHREAD Thread,
5479   IN PACCESS_TOKEN Token,
5480   IN BOOLEAN CopyOnOpen,
5481   IN BOOLEAN EffectiveOnly,
5482   IN SECURITY_IMPERSONATION_LEVEL ImpersonationLevel);
5483 
5484 NTKERNELAPI
5485 BOOLEAN
5486 NTAPI
5487 PsDisableImpersonation(
5488   IN OUT PETHREAD Thread,
5489   IN OUT PSE_IMPERSONATION_STATE ImpersonationState);
5490 
5491 NTKERNELAPI
5492 VOID
5493 NTAPI
5494 PsRestoreImpersonation(
5495   IN PETHREAD Thread,
5496   IN PSE_IMPERSONATION_STATE ImpersonationState);
5497 
5498 NTKERNELAPI
5499 VOID
5500 NTAPI
5501 PsRevertToSelf(VOID);
5502 
5503 NTKERNELAPI
5504 VOID
5505 NTAPI
5506 PsChargePoolQuota(
5507   IN PEPROCESS Process,
5508   IN POOL_TYPE PoolType,
5509   IN ULONG_PTR Amount);
5510 
5511 NTKERNELAPI
5512 VOID
5513 NTAPI
5514 PsReturnPoolQuota(
5515   IN PEPROCESS Process,
5516   IN POOL_TYPE PoolType,
5517   IN ULONG_PTR Amount);
5518 
5519 NTKERNELAPI
5520 NTSTATUS
5521 NTAPI
5522 PsAssignImpersonationToken(
5523   IN PETHREAD Thread,
5524   IN HANDLE Token OPTIONAL);
5525 
5526 NTKERNELAPI
5527 HANDLE
5528 NTAPI
5529 PsReferencePrimaryToken(
5530   IN OUT PEPROCESS Process);
5531 #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
5532 #if (NTDDI_VERSION >= NTDDI_WINXP)
5533 
5534 
5535 NTKERNELAPI
5536 VOID
5537 NTAPI
5538 PsDereferencePrimaryToken(
5539   IN PACCESS_TOKEN PrimaryToken);
5540 
5541 NTKERNELAPI
5542 VOID
5543 NTAPI
5544 PsDereferenceImpersonationToken(
5545   IN PACCESS_TOKEN ImpersonationToken);
5546 
5547 NTKERNELAPI
5548 NTSTATUS
5549 NTAPI
5550 PsChargeProcessPoolQuota(
5551   IN PEPROCESS Process,
5552   IN POOL_TYPE PoolType,
5553   IN ULONG_PTR Amount);
5554 
5555 NTKERNELAPI
5556 BOOLEAN
5557 NTAPI
5558 PsIsSystemThread(
5559   IN PETHREAD Thread);
5560 #endif /* (NTDDI_VERSION >= NTDDI_WINXP) */
5561 
5562 /******************************************************************************
5563  *                         I/O Manager Functions                              *
5564  ******************************************************************************/
5565 
5566 #define IoIsFileOpenedExclusively(FileObject) ( \
5567     (BOOLEAN) !(                                \
5568     (FileObject)->SharedRead ||                 \
5569     (FileObject)->SharedWrite ||                \
5570     (FileObject)->SharedDelete                  \
5571     )                                           \
5572 )
5573 
5574 #if (NTDDI_VERSION == NTDDI_WIN2K)
5575 NTKERNELAPI
5576 NTSTATUS
5577 NTAPI
5578 IoRegisterFsRegistrationChangeEx(
5579   IN PDRIVER_OBJECT DriverObject,
5580   IN PDRIVER_FS_NOTIFICATION DriverNotificationRoutine);
5581 #endif
5582 #if (NTDDI_VERSION >= NTDDI_WIN2K)
5583 
5584 
5585 NTKERNELAPI
5586 VOID
5587 NTAPI
5588 IoAcquireVpbSpinLock(
5589   OUT PKIRQL Irql);
5590 
5591 NTKERNELAPI
5592 NTSTATUS
5593 NTAPI
5594 IoCheckDesiredAccess(
5595   IN OUT PACCESS_MASK DesiredAccess,
5596   IN ACCESS_MASK GrantedAccess);
5597 
5598 NTKERNELAPI
5599 NTSTATUS
5600 NTAPI
5601 IoCheckEaBufferValidity(
5602   IN PFILE_FULL_EA_INFORMATION EaBuffer,
5603   IN ULONG EaLength,
5604   OUT PULONG ErrorOffset);
5605 
5606 NTKERNELAPI
5607 NTSTATUS
5608 NTAPI
5609 IoCheckFunctionAccess(
5610   IN ACCESS_MASK GrantedAccess,
5611   IN UCHAR MajorFunction,
5612   IN UCHAR MinorFunction,
5613   IN ULONG IoControlCode,
5614   IN PVOID Argument1 OPTIONAL,
5615   IN PVOID Argument2 OPTIONAL);
5616 
5617 NTKERNELAPI
5618 NTSTATUS
5619 NTAPI
5620 IoCheckQuerySetFileInformation(
5621   IN FILE_INFORMATION_CLASS FileInformationClass,
5622   IN ULONG Length,
5623   IN BOOLEAN SetOperation);
5624 
5625 NTKERNELAPI
5626 NTSTATUS
5627 NTAPI
5628 IoCheckQuerySetVolumeInformation(
5629   IN FS_INFORMATION_CLASS FsInformationClass,
5630   IN ULONG Length,
5631   IN BOOLEAN SetOperation);
5632 
5633 NTKERNELAPI
5634 NTSTATUS
5635 NTAPI
5636 IoCheckQuotaBufferValidity(
5637   IN PFILE_QUOTA_INFORMATION QuotaBuffer,
5638   IN ULONG QuotaLength,
5639   OUT PULONG ErrorOffset);
5640 
5641 NTKERNELAPI
5642 PFILE_OBJECT
5643 NTAPI
5644 IoCreateStreamFileObject(
5645   IN PFILE_OBJECT FileObject OPTIONAL,
5646   IN PDEVICE_OBJECT DeviceObject OPTIONAL);
5647 
5648 NTKERNELAPI
5649 PFILE_OBJECT
5650 NTAPI
5651 IoCreateStreamFileObjectLite(
5652   IN PFILE_OBJECT FileObject OPTIONAL,
5653   IN PDEVICE_OBJECT DeviceObject OPTIONAL);
5654 
5655 NTKERNELAPI
5656 BOOLEAN
5657 NTAPI
5658 IoFastQueryNetworkAttributes(
5659   IN POBJECT_ATTRIBUTES ObjectAttributes,
5660   IN ACCESS_MASK DesiredAccess,
5661   IN ULONG OpenOptions,
5662   OUT PIO_STATUS_BLOCK IoStatus,
5663   OUT PFILE_NETWORK_OPEN_INFORMATION Buffer);
5664 
5665 NTKERNELAPI
5666 NTSTATUS
5667 NTAPI
5668 IoPageRead(
5669   IN PFILE_OBJECT FileObject,
5670   IN PMDL Mdl,
5671   IN PLARGE_INTEGER Offset,
5672   IN PKEVENT Event,
5673   OUT PIO_STATUS_BLOCK IoStatusBlock);
5674 
5675 NTKERNELAPI
5676 PDEVICE_OBJECT
5677 NTAPI
5678 IoGetBaseFileSystemDeviceObject(
5679   IN PFILE_OBJECT FileObject);
5680 
5681 NTKERNELAPI
5682 PCONFIGURATION_INFORMATION
5683 NTAPI
5684 IoGetConfigurationInformation(VOID);
5685 
5686 NTKERNELAPI
5687 ULONG
5688 NTAPI
5689 IoGetRequestorProcessId(
5690   IN PIRP Irp);
5691 
5692 NTKERNELAPI
5693 PEPROCESS
5694 NTAPI
5695 IoGetRequestorProcess(
5696   IN PIRP Irp);
5697 
5698 NTKERNELAPI
5699 PIRP
5700 NTAPI
5701 IoGetTopLevelIrp(VOID);
5702 
5703 NTKERNELAPI
5704 BOOLEAN
5705 NTAPI
5706 IoIsOperationSynchronous(
5707   IN PIRP Irp);
5708 
5709 NTKERNELAPI
5710 BOOLEAN
5711 NTAPI
5712 IoIsSystemThread(
5713   IN PETHREAD Thread);
5714 
5715 NTKERNELAPI
5716 BOOLEAN
5717 NTAPI
5718 IoIsValidNameGraftingBuffer(
5719   IN PIRP Irp,
5720   IN PREPARSE_DATA_BUFFER ReparseBuffer);
5721 
5722 NTKERNELAPI
5723 NTSTATUS
5724 NTAPI
5725 IoQueryFileInformation(
5726   IN PFILE_OBJECT FileObject,
5727   IN FILE_INFORMATION_CLASS FileInformationClass,
5728   IN ULONG Length,
5729   OUT PVOID FileInformation,
5730   OUT PULONG ReturnedLength);
5731 
5732 NTKERNELAPI
5733 NTSTATUS
5734 NTAPI
5735 IoQueryVolumeInformation(
5736   IN PFILE_OBJECT FileObject,
5737   IN FS_INFORMATION_CLASS FsInformationClass,
5738   IN ULONG Length,
5739   OUT PVOID FsInformation,
5740   OUT PULONG ReturnedLength);
5741 
5742 NTKERNELAPI
5743 VOID
5744 NTAPI
5745 IoQueueThreadIrp(
5746   IN PIRP Irp);
5747 
5748 NTKERNELAPI
5749 VOID
5750 NTAPI
5751 IoRegisterFileSystem(
5752   IN PDEVICE_OBJECT DeviceObject);
5753 
5754 NTKERNELAPI
5755 NTSTATUS
5756 NTAPI
5757 IoRegisterFsRegistrationChange(
5758   IN PDRIVER_OBJECT DriverObject,
5759   IN PDRIVER_FS_NOTIFICATION DriverNotificationRoutine);
5760 
5761 NTKERNELAPI
5762 VOID
5763 NTAPI
5764 IoReleaseVpbSpinLock(
5765   IN KIRQL Irql);
5766 
5767 NTKERNELAPI
5768 VOID
5769 NTAPI
5770 IoSetDeviceToVerify(
5771   IN PETHREAD Thread,
5772   IN PDEVICE_OBJECT DeviceObject OPTIONAL);
5773 
5774 NTKERNELAPI
5775 NTSTATUS
5776 NTAPI
5777 IoSetInformation(
5778   IN PFILE_OBJECT FileObject,
5779   IN FILE_INFORMATION_CLASS FileInformationClass,
5780   IN ULONG Length,
5781   IN PVOID FileInformation);
5782 
5783 NTKERNELAPI
5784 VOID
5785 NTAPI
5786 IoSetTopLevelIrp(
5787   IN PIRP Irp OPTIONAL);
5788 
5789 NTKERNELAPI
5790 NTSTATUS
5791 NTAPI
5792 IoSynchronousPageWrite(
5793   IN PFILE_OBJECT FileObject,
5794   IN PMDL Mdl,
5795   IN PLARGE_INTEGER FileOffset,
5796   IN PKEVENT Event,
5797   OUT PIO_STATUS_BLOCK IoStatusBlock);
5798 
5799 NTKERNELAPI
5800 PEPROCESS
5801 NTAPI
5802 IoThreadToProcess(
5803   IN PETHREAD Thread);
5804 
5805 NTKERNELAPI
5806 VOID
5807 NTAPI
5808 IoUnregisterFileSystem(
5809   IN PDEVICE_OBJECT DeviceObject);
5810 
5811 NTKERNELAPI
5812 VOID
5813 NTAPI
5814 IoUnregisterFsRegistrationChange(
5815   IN PDRIVER_OBJECT DriverObject,
5816   IN PDRIVER_FS_NOTIFICATION DriverNotificationRoutine);
5817 
5818 NTKERNELAPI
5819 NTSTATUS
5820 NTAPI
5821 IoVerifyVolume(
5822   IN PDEVICE_OBJECT DeviceObject,
5823   IN BOOLEAN AllowRawMount);
5824 
5825 NTKERNELAPI
5826 NTSTATUS
5827 NTAPI
5828 IoGetRequestorSessionId(
5829   IN PIRP Irp,
5830   OUT PULONG pSessionId);
5831 
5832 #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
5833 
5834 
5835 #if (NTDDI_VERSION >= NTDDI_WINXP)
5836 
5837 NTKERNELAPI
5838 PFILE_OBJECT
5839 NTAPI
5840 IoCreateStreamFileObjectEx(
5841   IN PFILE_OBJECT FileObject OPTIONAL,
5842   IN PDEVICE_OBJECT DeviceObject OPTIONAL,
5843   OUT PHANDLE FileObjectHandle OPTIONAL);
5844 
5845 NTKERNELAPI
5846 NTSTATUS
5847 NTAPI
5848 IoQueryFileDosDeviceName(
5849   IN PFILE_OBJECT FileObject,
5850   OUT POBJECT_NAME_INFORMATION *ObjectNameInformation);
5851 
5852 NTKERNELAPI
5853 NTSTATUS
5854 NTAPI
5855 IoEnumerateDeviceObjectList(
5856   IN PDRIVER_OBJECT DriverObject,
5857   OUT PDEVICE_OBJECT *DeviceObjectList,
5858   IN ULONG DeviceObjectListSize,
5859   OUT PULONG ActualNumberDeviceObjects);
5860 
5861 NTKERNELAPI
5862 PDEVICE_OBJECT
5863 NTAPI
5864 IoGetLowerDeviceObject(
5865   IN PDEVICE_OBJECT DeviceObject);
5866 
5867 NTKERNELAPI
5868 PDEVICE_OBJECT
5869 NTAPI
5870 IoGetDeviceAttachmentBaseRef(
5871   IN PDEVICE_OBJECT DeviceObject);
5872 
5873 NTKERNELAPI
5874 NTSTATUS
5875 NTAPI
5876 IoGetDiskDeviceObject(
5877   IN PDEVICE_OBJECT FileSystemDeviceObject,
5878   OUT PDEVICE_OBJECT *DiskDeviceObject);
5879 
5880 #endif /* (NTDDI_VERSION >= NTDDI_WINXP) */
5881 
5882 #if (NTDDI_VERSION >= NTDDI_WS03SP1)
5883 
5884 NTKERNELAPI
5885 NTSTATUS
5886 NTAPI
5887 IoEnumerateRegisteredFiltersList(
5888   OUT PDRIVER_OBJECT *DriverObjectList,
5889   IN ULONG DriverObjectListSize,
5890   OUT PULONG ActualNumberDriverObjects);
5891 #endif /* (NTDDI_VERSION >= NTDDI_WS03SP1) */
5892 
5893 #if (NTDDI_VERSION >= NTDDI_VISTA)
5894 
5895 FORCEINLINE
5896 VOID
5897 NTAPI
IoInitializePriorityInfo(IN PIO_PRIORITY_INFO PriorityInfo)5898 IoInitializePriorityInfo(
5899   IN PIO_PRIORITY_INFO PriorityInfo)
5900 {
5901   PriorityInfo->Size = sizeof(IO_PRIORITY_INFO);
5902   PriorityInfo->ThreadPriority = 0xffff;
5903   PriorityInfo->IoPriority = IoPriorityNormal;
5904   PriorityInfo->PagePriority = 0;
5905 }
5906 #endif /* (NTDDI_VERSION >= NTDDI_VISTA) */
5907 
5908 #if (NTDDI_VERSION >= NTDDI_WIN7)
5909 
5910 NTKERNELAPI
5911 NTSTATUS
5912 NTAPI
5913 IoRegisterFsRegistrationChangeMountAware(
5914   IN PDRIVER_OBJECT DriverObject,
5915   IN PDRIVER_FS_NOTIFICATION DriverNotificationRoutine,
5916   IN BOOLEAN SynchronizeWithMounts);
5917 
5918 NTKERNELAPI
5919 NTSTATUS
5920 NTAPI
5921 IoReplaceFileObjectName(
5922   IN PFILE_OBJECT FileObject,
5923   IN PWSTR NewFileName,
5924   IN USHORT FileNameLength);
5925 #endif /* (NTDDI_VERSION >= NTDDI_WIN7) */
5926 
5927 
5928 #define PO_CB_SYSTEM_POWER_POLICY       0
5929 #define PO_CB_AC_STATUS                 1
5930 #define PO_CB_BUTTON_COLLISION          2
5931 #define PO_CB_SYSTEM_STATE_LOCK         3
5932 #define PO_CB_LID_SWITCH_STATE          4
5933 #define PO_CB_PROCESSOR_POWER_POLICY    5
5934 
5935 
5936 #if (NTDDI_VERSION >= NTDDI_WINXP)
5937 NTKERNELAPI
5938 NTSTATUS
5939 NTAPI
5940 PoQueueShutdownWorkItem(
5941   IN OUT PWORK_QUEUE_ITEM WorkItem);
5942 #endif
5943 
5944 /******************************************************************************
5945  *                         Memory manager Types                               *
5946  ******************************************************************************/
5947 
5948 typedef enum _MMFLUSH_TYPE {
5949   MmFlushForDelete,
5950   MmFlushForWrite
5951 } MMFLUSH_TYPE;
5952 
5953 typedef struct _READ_LIST {
5954   PFILE_OBJECT FileObject;
5955   ULONG NumberOfEntries;
5956   LOGICAL IsImage;
5957   FILE_SEGMENT_ELEMENT List[ANYSIZE_ARRAY];
5958 } READ_LIST, *PREAD_LIST;
5959 
5960 #if (NTDDI_VERSION >= NTDDI_WINXP)
5961 
5962 typedef union _MM_PREFETCH_FLAGS {
5963   struct {
5964     ULONG Priority : SYSTEM_PAGE_PRIORITY_BITS;
5965     ULONG RepurposePriority : SYSTEM_PAGE_PRIORITY_BITS;
5966   } Flags;
5967   ULONG AllFlags;
5968 } MM_PREFETCH_FLAGS, *PMM_PREFETCH_FLAGS;
5969 
5970 #define MM_PREFETCH_FLAGS_MASK ((1 << (2*SYSTEM_PAGE_PRIORITY_BITS)) - 1)
5971 
5972 #endif /* (NTDDI_VERSION >= NTDDI_WINXP) */
5973 
5974 #define HEAP_NO_SERIALIZE               0x00000001
5975 #define HEAP_GROWABLE                   0x00000002
5976 #define HEAP_GENERATE_EXCEPTIONS        0x00000004
5977 #define HEAP_ZERO_MEMORY                0x00000008
5978 #define HEAP_REALLOC_IN_PLACE_ONLY      0x00000010
5979 #define HEAP_TAIL_CHECKING_ENABLED      0x00000020
5980 #define HEAP_FREE_CHECKING_ENABLED      0x00000040
5981 #define HEAP_DISABLE_COALESCE_ON_FREE   0x00000080
5982 
5983 #define HEAP_CREATE_ALIGN_16            0x00010000
5984 #define HEAP_CREATE_ENABLE_TRACING      0x00020000
5985 #define HEAP_CREATE_ENABLE_EXECUTE      0x00040000
5986 
5987 #define HEAP_SETTABLE_USER_VALUE        0x00000100
5988 #define HEAP_SETTABLE_USER_FLAG1        0x00000200
5989 #define HEAP_SETTABLE_USER_FLAG2        0x00000400
5990 #define HEAP_SETTABLE_USER_FLAG3        0x00000800
5991 #define HEAP_SETTABLE_USER_FLAGS        0x00000E00
5992 
5993 #define HEAP_CLASS_0                    0x00000000
5994 #define HEAP_CLASS_1                    0x00001000
5995 #define HEAP_CLASS_2                    0x00002000
5996 #define HEAP_CLASS_3                    0x00003000
5997 #define HEAP_CLASS_4                    0x00004000
5998 #define HEAP_CLASS_5                    0x00005000
5999 #define HEAP_CLASS_6                    0x00006000
6000 #define HEAP_CLASS_7                    0x00007000
6001 #define HEAP_CLASS_8                    0x00008000
6002 #define HEAP_CLASS_MASK                 0x0000F000
6003 
6004 #define HEAP_MAXIMUM_TAG                0x0FFF
6005 #define HEAP_GLOBAL_TAG                 0x0800
6006 #define HEAP_PSEUDO_TAG_FLAG            0x8000
6007 #define HEAP_TAG_SHIFT                  18
6008 #define HEAP_TAG_MASK                  (HEAP_MAXIMUM_TAG << HEAP_TAG_SHIFT)
6009 
6010 #define HEAP_CREATE_VALID_MASK         (HEAP_NO_SERIALIZE             |   \
6011                                         HEAP_GROWABLE                 |   \
6012                                         HEAP_GENERATE_EXCEPTIONS      |   \
6013                                         HEAP_ZERO_MEMORY              |   \
6014                                         HEAP_REALLOC_IN_PLACE_ONLY    |   \
6015                                         HEAP_TAIL_CHECKING_ENABLED    |   \
6016                                         HEAP_FREE_CHECKING_ENABLED    |   \
6017                                         HEAP_DISABLE_COALESCE_ON_FREE |   \
6018                                         HEAP_CLASS_MASK               |   \
6019                                         HEAP_CREATE_ALIGN_16          |   \
6020                                         HEAP_CREATE_ENABLE_TRACING    |   \
6021                                         HEAP_CREATE_ENABLE_EXECUTE)
6022 
6023 /******************************************************************************
6024  *                       Memory manager Functions                             *
6025  ******************************************************************************/
6026 
6027 FORCEINLINE
6028 ULONG
HEAP_MAKE_TAG_FLAGS(IN ULONG TagBase,IN ULONG Tag)6029 HEAP_MAKE_TAG_FLAGS(
6030   IN ULONG TagBase,
6031   IN ULONG Tag)
6032 {
6033   //__assume_bound(TagBase); // FIXME
6034   return ((ULONG)((TagBase) + ((Tag) << HEAP_TAG_SHIFT)));
6035 }
6036 
6037 #if (NTDDI_VERSION >= NTDDI_WIN2K)
6038 
6039 NTKERNELAPI
6040 BOOLEAN
6041 NTAPI
6042 MmIsRecursiveIoFault(
6043   VOID);
6044 
6045 NTKERNELAPI
6046 BOOLEAN
6047 NTAPI
6048 MmForceSectionClosed(
6049   IN PSECTION_OBJECT_POINTERS SectionObjectPointer,
6050   IN BOOLEAN DelayClose);
6051 
6052 NTKERNELAPI
6053 BOOLEAN
6054 NTAPI
6055 MmFlushImageSection(
6056   IN PSECTION_OBJECT_POINTERS SectionObjectPointer,
6057   IN MMFLUSH_TYPE FlushType);
6058 
6059 NTKERNELAPI
6060 BOOLEAN
6061 NTAPI
6062 MmCanFileBeTruncated(
6063   IN PSECTION_OBJECT_POINTERS SectionObjectPointer,
6064   IN PLARGE_INTEGER NewFileSize OPTIONAL);
6065 
6066 NTKERNELAPI
6067 BOOLEAN
6068 NTAPI
6069 MmSetAddressRangeModified(
6070   IN PVOID Address,
6071   IN SIZE_T Length);
6072 
6073 #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
6074 
6075 #if (NTDDI_VERSION >= NTDDI_WINXP)
6076 
6077 NTKERNELAPI
6078 NTSTATUS
6079 NTAPI
6080 MmPrefetchPages(
6081   IN ULONG NumberOfLists,
6082   IN PREAD_LIST *ReadLists);
6083 
6084 #endif /* (NTDDI_VERSION >= NTDDI_WINXP) */
6085 
6086 
6087 #if (NTDDI_VERSION >= NTDDI_VISTA)
6088 
6089 NTKERNELAPI
6090 ULONG
6091 NTAPI
6092 MmDoesFileHaveUserWritableReferences(
6093   IN PSECTION_OBJECT_POINTERS SectionPointer);
6094 #endif /* (NTDDI_VERSION >= NTDDI_VISTA) */
6095 
6096 
6097 #if (NTDDI_VERSION >= NTDDI_WIN2K)
6098 
6099 NTKERNELAPI
6100 NTSTATUS
6101 NTAPI
6102 ObInsertObject(
6103   IN PVOID Object,
6104   IN OUT PACCESS_STATE PassedAccessState OPTIONAL,
6105   IN ACCESS_MASK DesiredAccess OPTIONAL,
6106   IN ULONG ObjectPointerBias,
6107   OUT PVOID *NewObject OPTIONAL,
6108   OUT PHANDLE Handle OPTIONAL);
6109 
6110 NTKERNELAPI
6111 NTSTATUS
6112 NTAPI
6113 ObOpenObjectByPointer(
6114   IN PVOID Object,
6115   IN ULONG HandleAttributes,
6116   IN PACCESS_STATE PassedAccessState OPTIONAL,
6117   IN ACCESS_MASK DesiredAccess OPTIONAL,
6118   IN POBJECT_TYPE ObjectType OPTIONAL,
6119   IN KPROCESSOR_MODE AccessMode,
6120   OUT PHANDLE Handle);
6121 
6122 NTKERNELAPI
6123 VOID
6124 NTAPI
6125 ObMakeTemporaryObject(
6126   IN PVOID Object);
6127 
6128 NTKERNELAPI
6129 NTSTATUS
6130 NTAPI
6131 ObQueryNameString(
6132   IN PVOID Object,
6133   OUT POBJECT_NAME_INFORMATION ObjectNameInfo OPTIONAL,
6134   IN ULONG Length,
6135   OUT PULONG ReturnLength);
6136 
6137 NTKERNELAPI
6138 NTSTATUS
6139 NTAPI
6140 ObQueryObjectAuditingByHandle(
6141   IN HANDLE Handle,
6142   OUT PBOOLEAN GenerateOnClose);
6143 #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
6144 
6145 #if (NTDDI_VERSION >= NTDDI_VISTA)
6146 
6147 NTKERNELAPI
6148 BOOLEAN
6149 NTAPI
6150 ObIsKernelHandle(
6151   IN HANDLE Handle);
6152 #endif
6153 
6154 
6155 #if (NTDDI_VERSION >= NTDDI_WIN7)
6156 
6157 NTKERNELAPI
6158 NTSTATUS
6159 NTAPI
6160 ObOpenObjectByPointerWithTag(
6161   IN PVOID Object,
6162   IN ULONG HandleAttributes,
6163   IN PACCESS_STATE PassedAccessState OPTIONAL,
6164   IN ACCESS_MASK DesiredAccess,
6165   IN POBJECT_TYPE ObjectType OPTIONAL,
6166   IN KPROCESSOR_MODE AccessMode,
6167   IN ULONG Tag,
6168   OUT PHANDLE Handle);
6169 #endif /* (NTDDI_VERSION >= NTDDI_WIN7) */
6170 
6171 /* FSRTL Types */
6172 
6173 typedef ULONG LBN;
6174 typedef LBN *PLBN;
6175 
6176 typedef ULONG VBN;
6177 typedef VBN *PVBN;
6178 
6179 #define FSRTL_COMMON_FCB_HEADER_LAYOUT \
6180   CSHORT NodeTypeCode; \
6181   CSHORT NodeByteSize; \
6182   UCHAR Flags; \
6183   UCHAR IsFastIoPossible; \
6184   UCHAR Flags2; \
6185   UCHAR Reserved:4; \
6186   UCHAR Version:4; \
6187   PERESOURCE Resource; \
6188   PERESOURCE PagingIoResource; \
6189   LARGE_INTEGER AllocationSize; \
6190   LARGE_INTEGER FileSize; \
6191   LARGE_INTEGER ValidDataLength;
6192 
6193 typedef struct _FSRTL_COMMON_FCB_HEADER {
6194   FSRTL_COMMON_FCB_HEADER_LAYOUT
6195 } FSRTL_COMMON_FCB_HEADER, *PFSRTL_COMMON_FCB_HEADER;
6196 
6197 #ifdef __cplusplus
6198 typedef struct _FSRTL_ADVANCED_FCB_HEADER:FSRTL_COMMON_FCB_HEADER {
6199 #else /* __cplusplus */
6200 typedef struct _FSRTL_ADVANCED_FCB_HEADER {
6201   FSRTL_COMMON_FCB_HEADER_LAYOUT
6202 #endif  /* __cplusplus */
6203   PFAST_MUTEX FastMutex;
6204   LIST_ENTRY FilterContexts;
6205 #if (NTDDI_VERSION >= NTDDI_VISTA)
6206   EX_PUSH_LOCK PushLock;
6207   PVOID *FileContextSupportPointer;
6208 #endif
6209 } FSRTL_ADVANCED_FCB_HEADER, *PFSRTL_ADVANCED_FCB_HEADER;
6210 
6211 #define FSRTL_FCB_HEADER_V0             (0x00)
6212 #define FSRTL_FCB_HEADER_V1             (0x01)
6213 
6214 #define FSRTL_FLAG_FILE_MODIFIED        (0x01)
6215 #define FSRTL_FLAG_FILE_LENGTH_CHANGED  (0x02)
6216 #define FSRTL_FLAG_LIMIT_MODIFIED_PAGES (0x04)
6217 #define FSRTL_FLAG_ACQUIRE_MAIN_RSRC_EX (0x08)
6218 #define FSRTL_FLAG_ACQUIRE_MAIN_RSRC_SH (0x10)
6219 #define FSRTL_FLAG_USER_MAPPED_FILE     (0x20)
6220 #define FSRTL_FLAG_ADVANCED_HEADER      (0x40)
6221 #define FSRTL_FLAG_EOF_ADVANCE_ACTIVE   (0x80)
6222 
6223 #define FSRTL_FLAG2_DO_MODIFIED_WRITE        (0x01)
6224 #define FSRTL_FLAG2_SUPPORTS_FILTER_CONTEXTS (0x02)
6225 #define FSRTL_FLAG2_PURGE_WHEN_MAPPED        (0x04)
6226 #define FSRTL_FLAG2_IS_PAGING_FILE           (0x08)
6227 
6228 #define FSRTL_FSP_TOP_LEVEL_IRP         (0x01)
6229 #define FSRTL_CACHE_TOP_LEVEL_IRP       (0x02)
6230 #define FSRTL_MOD_WRITE_TOP_LEVEL_IRP   (0x03)
6231 #define FSRTL_FAST_IO_TOP_LEVEL_IRP     (0x04)
6232 #define FSRTL_NETWORK1_TOP_LEVEL_IRP    ((LONG_PTR)0x05)
6233 #define FSRTL_NETWORK2_TOP_LEVEL_IRP    ((LONG_PTR)0x06)
6234 #define FSRTL_MAX_TOP_LEVEL_IRP_FLAG    ((LONG_PTR)0xFFFF)
6235 
6236 typedef struct _FSRTL_AUXILIARY_BUFFER {
6237   PVOID Buffer;
6238   ULONG Length;
6239   ULONG Flags;
6240   PMDL Mdl;
6241 } FSRTL_AUXILIARY_BUFFER, *PFSRTL_AUXILIARY_BUFFER;
6242 
6243 #define FSRTL_AUXILIARY_FLAG_DEALLOCATE 0x00000001
6244 
6245 typedef enum _FSRTL_COMPARISON_RESULT {
6246   LessThan = -1,
6247   EqualTo = 0,
6248   GreaterThan = 1
6249 } FSRTL_COMPARISON_RESULT;
6250 
6251 #define FSRTL_FAT_LEGAL                 0x01
6252 #define FSRTL_HPFS_LEGAL                0x02
6253 #define FSRTL_NTFS_LEGAL                0x04
6254 #define FSRTL_WILD_CHARACTER            0x08
6255 #define FSRTL_OLE_LEGAL                 0x10
6256 #define FSRTL_NTFS_STREAM_LEGAL         (FSRTL_NTFS_LEGAL | FSRTL_OLE_LEGAL)
6257 
6258 #define FSRTL_VOLUME_DISMOUNT           1
6259 #define FSRTL_VOLUME_DISMOUNT_FAILED    2
6260 #define FSRTL_VOLUME_LOCK               3
6261 #define FSRTL_VOLUME_LOCK_FAILED        4
6262 #define FSRTL_VOLUME_UNLOCK             5
6263 #define FSRTL_VOLUME_MOUNT              6
6264 #define FSRTL_VOLUME_NEEDS_CHKDSK       7
6265 #define FSRTL_VOLUME_WORM_NEAR_FULL     8
6266 #define FSRTL_VOLUME_WEARING_OUT        9
6267 #define FSRTL_VOLUME_FORCED_CLOSED      10
6268 #define FSRTL_VOLUME_INFO_MAKE_COMPAT   11
6269 #define FSRTL_VOLUME_PREPARING_EJECT    12
6270 #define FSRTL_VOLUME_CHANGE_SIZE        13
6271 #define FSRTL_VOLUME_BACKGROUND_FORMAT  14
6272 
6273 typedef VOID
6274 (NTAPI *PFSRTL_STACK_OVERFLOW_ROUTINE) (
6275   IN PVOID Context,
6276   IN PKEVENT Event);
6277 
6278 #if (NTDDI_VERSION >= NTDDI_VISTA)
6279 
6280 #define FSRTL_UNC_PROVIDER_FLAGS_MAILSLOTS_SUPPORTED    0x00000001
6281 #define FSRTL_UNC_PROVIDER_FLAGS_CSC_ENABLED            0x00000002
6282 #define FSRTL_UNC_PROVIDER_FLAGS_DOMAIN_SVC_AWARE       0x00000004
6283 
6284 #define FSRTL_ALLOCATE_ECPLIST_FLAG_CHARGE_QUOTA           0x00000001
6285 
6286 #define FSRTL_ALLOCATE_ECP_FLAG_CHARGE_QUOTA               0x00000001
6287 #define FSRTL_ALLOCATE_ECP_FLAG_NONPAGED_POOL              0x00000002
6288 
6289 #define FSRTL_ECP_LOOKASIDE_FLAG_NONPAGED_POOL             0x00000002
6290 
6291 #define FSRTL_VIRTDISK_FULLY_ALLOCATED  0x00000001
6292 #define FSRTL_VIRTDISK_NO_DRIVE_LETTER  0x00000002
6293 
6294 typedef struct _FSRTL_MUP_PROVIDER_INFO_LEVEL_1 {
6295   ULONG32 ProviderId;
6296 } FSRTL_MUP_PROVIDER_INFO_LEVEL_1, *PFSRTL_MUP_PROVIDER_INFO_LEVEL_1;
6297 
6298 typedef struct _FSRTL_MUP_PROVIDER_INFO_LEVEL_2 {
6299   ULONG32 ProviderId;
6300   UNICODE_STRING ProviderName;
6301 } FSRTL_MUP_PROVIDER_INFO_LEVEL_2, *PFSRTL_MUP_PROVIDER_INFO_LEVEL_2;
6302 
6303 typedef VOID
6304 (*PFSRTL_EXTRA_CREATE_PARAMETER_CLEANUP_CALLBACK) (
6305   IN OUT PVOID EcpContext,
6306   IN LPCGUID EcpType);
6307 
6308 typedef struct _ECP_LIST ECP_LIST, *PECP_LIST;
6309 
6310 typedef ULONG FSRTL_ALLOCATE_ECPLIST_FLAGS;
6311 typedef ULONG FSRTL_ALLOCATE_ECP_FLAGS;
6312 typedef ULONG FSRTL_ECP_LOOKASIDE_FLAGS;
6313 
6314 typedef enum _FSRTL_CHANGE_BACKING_TYPE {
6315   ChangeDataControlArea,
6316   ChangeImageControlArea,
6317   ChangeSharedCacheMap
6318 } FSRTL_CHANGE_BACKING_TYPE, *PFSRTL_CHANGE_BACKING_TYPE;
6319 
6320 #endif /* (NTDDI_VERSION >= NTDDI_VISTA) */
6321 
6322 typedef struct _FSRTL_PER_FILE_CONTEXT {
6323   LIST_ENTRY Links;
6324   PVOID OwnerId;
6325   PVOID InstanceId;
6326   PFREE_FUNCTION FreeCallback;
6327 } FSRTL_PER_FILE_CONTEXT, *PFSRTL_PER_FILE_CONTEXT;
6328 
6329 typedef struct _FSRTL_PER_STREAM_CONTEXT {
6330   LIST_ENTRY Links;
6331   PVOID OwnerId;
6332   PVOID InstanceId;
6333   PFREE_FUNCTION FreeCallback;
6334 } FSRTL_PER_STREAM_CONTEXT, *PFSRTL_PER_STREAM_CONTEXT;
6335 
6336 #if (NTDDI_VERSION >= NTDDI_WIN2K)
6337 typedef VOID
6338 (*PFN_FSRTLTEARDOWNPERSTREAMCONTEXTS) (
6339   IN PFSRTL_ADVANCED_FCB_HEADER AdvancedHeader);
6340 #endif
6341 
6342 typedef struct _FSRTL_PER_FILEOBJECT_CONTEXT {
6343   LIST_ENTRY Links;
6344   PVOID OwnerId;
6345   PVOID InstanceId;
6346 } FSRTL_PER_FILEOBJECT_CONTEXT, *PFSRTL_PER_FILEOBJECT_CONTEXT;
6347 
6348 #define FSRTL_CC_FLUSH_ERROR_FLAG_NO_HARD_ERROR  0x1
6349 #define FSRTL_CC_FLUSH_ERROR_FLAG_NO_LOG_ENTRY   0x2
6350 
6351 typedef NTSTATUS
6352 (NTAPI *PCOMPLETE_LOCK_IRP_ROUTINE) (
6353   IN PVOID Context,
6354   IN PIRP Irp);
6355 
6356 typedef struct _FILE_LOCK_INFO {
6357   LARGE_INTEGER StartingByte;
6358   LARGE_INTEGER Length;
6359   BOOLEAN ExclusiveLock;
6360   ULONG Key;
6361   PFILE_OBJECT FileObject;
6362   PVOID ProcessId;
6363   LARGE_INTEGER EndingByte;
6364 } FILE_LOCK_INFO, *PFILE_LOCK_INFO;
6365 
6366 typedef VOID
6367 (NTAPI *PUNLOCK_ROUTINE) (
6368   IN PVOID Context,
6369   IN PFILE_LOCK_INFO FileLockInfo);
6370 
6371 typedef struct _FILE_LOCK {
6372   PCOMPLETE_LOCK_IRP_ROUTINE CompleteLockIrpRoutine;
6373   PUNLOCK_ROUTINE UnlockRoutine;
6374   BOOLEAN FastIoIsQuestionable;
6375   BOOLEAN SpareC[3];
6376   PVOID LockInformation;
6377   FILE_LOCK_INFO LastReturnedLockInfo;
6378   PVOID LastReturnedLock;
6379   LONG volatile LockRequestsInProgress;
6380 } FILE_LOCK, *PFILE_LOCK;
6381 
6382 typedef struct _TUNNEL {
6383   FAST_MUTEX Mutex;
6384   PRTL_SPLAY_LINKS Cache;
6385   LIST_ENTRY TimerQueue;
6386   USHORT NumEntries;
6387 } TUNNEL, *PTUNNEL;
6388 
6389 typedef struct _BASE_MCB {
6390   ULONG MaximumPairCount;
6391   ULONG PairCount;
6392   USHORT PoolType;
6393   USHORT Flags;
6394   PVOID Mapping;
6395 } BASE_MCB, *PBASE_MCB;
6396 
6397 typedef struct _LARGE_MCB {
6398   PKGUARDED_MUTEX GuardedMutex;
6399   BASE_MCB BaseMcb;
6400 } LARGE_MCB, *PLARGE_MCB;
6401 
6402 #define MCB_FLAG_RAISE_ON_ALLOCATION_FAILURE 1
6403 
6404 typedef struct _MCB {
6405   LARGE_MCB DummyFieldThatSizesThisStructureCorrectly;
6406 } MCB, *PMCB;
6407 
6408 typedef enum _FAST_IO_POSSIBLE {
6409   FastIoIsNotPossible = 0,
6410   FastIoIsPossible,
6411   FastIoIsQuestionable
6412 } FAST_IO_POSSIBLE;
6413 
6414 typedef struct _EOF_WAIT_BLOCK {
6415   LIST_ENTRY EofWaitLinks;
6416   KEVENT Event;
6417 } EOF_WAIT_BLOCK, *PEOF_WAIT_BLOCK;
6418 
6419 typedef PVOID OPLOCK, *POPLOCK;
6420 
6421 typedef VOID
6422 (NTAPI *POPLOCK_WAIT_COMPLETE_ROUTINE) (
6423   IN PVOID Context,
6424   IN PIRP Irp);
6425 
6426 typedef VOID
6427 (NTAPI *POPLOCK_FS_PREPOST_IRP) (
6428   IN PVOID Context,
6429   IN PIRP Irp);
6430 
6431 #if (NTDDI_VERSION >= NTDDI_VISTASP1)
6432 #define OPLOCK_FLAG_COMPLETE_IF_OPLOCKED    0x00000001
6433 #endif
6434 
6435 #if (NTDDI_VERSION >= NTDDI_WIN7)
6436 #define OPLOCK_FLAG_OPLOCK_KEY_CHECK_ONLY   0x00000002
6437 #define OPLOCK_FLAG_BACK_OUT_ATOMIC_OPLOCK  0x00000004
6438 #define OPLOCK_FLAG_IGNORE_OPLOCK_KEYS      0x00000008
6439 #define OPLOCK_FSCTRL_FLAG_ALL_KEYS_MATCH   0x00000001
6440 #endif
6441 
6442 #if (NTDDI_VERSION >= NTDDI_WIN7)
6443 
6444 typedef struct _OPLOCK_KEY_ECP_CONTEXT {
6445   GUID OplockKey;
6446   ULONG Reserved;
6447 } OPLOCK_KEY_ECP_CONTEXT, *POPLOCK_KEY_ECP_CONTEXT;
6448 
6449 DEFINE_GUID(GUID_ECP_OPLOCK_KEY, 0x48850596, 0x3050, 0x4be7, 0x98, 0x63, 0xfe, 0xc3, 0x50, 0xce, 0x8d, 0x7f);
6450 
6451 #endif
6452 
6453 typedef PVOID PNOTIFY_SYNC;
6454 
6455 #if (NTDDI_VERSION >= NTDDI_WIN7)
6456 typedef struct _ECP_HEADER ECP_HEADER, *PECP_HEADER;
6457 #endif
6458 
6459 typedef BOOLEAN
6460 (NTAPI *PCHECK_FOR_TRAVERSE_ACCESS) (
6461   IN PVOID NotifyContext,
6462   IN PVOID TargetContext OPTIONAL,
6463   IN PSECURITY_SUBJECT_CONTEXT SubjectContext);
6464 
6465 typedef BOOLEAN
6466 (NTAPI *PFILTER_REPORT_CHANGE) (
6467   IN PVOID NotifyContext,
6468   IN PVOID FilterContext);
6469 /* FSRTL Functions */
6470 
6471 #define FsRtlEnterFileSystem    KeEnterCriticalRegion
6472 #define FsRtlExitFileSystem     KeLeaveCriticalRegion
6473 
6474 #if (NTDDI_VERSION >= NTDDI_WIN2K)
6475 
6476 NTKERNELAPI
6477 BOOLEAN
6478 NTAPI
6479 FsRtlCopyRead(
6480   IN PFILE_OBJECT FileObject,
6481   IN PLARGE_INTEGER FileOffset,
6482   IN ULONG Length,
6483   IN BOOLEAN Wait,
6484   IN ULONG LockKey,
6485   OUT PVOID Buffer,
6486   OUT PIO_STATUS_BLOCK IoStatus,
6487   IN PDEVICE_OBJECT DeviceObject);
6488 
6489 NTKERNELAPI
6490 BOOLEAN
6491 NTAPI
6492 FsRtlCopyWrite(
6493   IN PFILE_OBJECT FileObject,
6494   IN PLARGE_INTEGER FileOffset,
6495   IN ULONG Length,
6496   IN BOOLEAN Wait,
6497   IN ULONG LockKey,
6498   IN PVOID Buffer,
6499   OUT PIO_STATUS_BLOCK IoStatus,
6500   IN PDEVICE_OBJECT DeviceObject);
6501 
6502 NTKERNELAPI
6503 BOOLEAN
6504 NTAPI
6505 FsRtlMdlReadDev(
6506   IN PFILE_OBJECT FileObject,
6507   IN PLARGE_INTEGER FileOffset,
6508   IN ULONG Length,
6509   IN ULONG LockKey,
6510   OUT PMDL *MdlChain,
6511   OUT PIO_STATUS_BLOCK IoStatus,
6512   IN PDEVICE_OBJECT DeviceObject OPTIONAL);
6513 
6514 NTKERNELAPI
6515 BOOLEAN
6516 NTAPI
6517 FsRtlMdlReadCompleteDev(
6518   IN PFILE_OBJECT FileObject,
6519   IN PMDL MdlChain,
6520   IN PDEVICE_OBJECT DeviceObject OPTIONAL);
6521 
6522 NTKERNELAPI
6523 BOOLEAN
6524 NTAPI
6525 FsRtlPrepareMdlWriteDev(
6526   IN PFILE_OBJECT FileObject,
6527   IN PLARGE_INTEGER FileOffset,
6528   IN ULONG Length,
6529   IN ULONG LockKey,
6530   OUT PMDL *MdlChain,
6531   OUT PIO_STATUS_BLOCK IoStatus,
6532   IN PDEVICE_OBJECT DeviceObject);
6533 
6534 NTKERNELAPI
6535 BOOLEAN
6536 NTAPI
6537 FsRtlMdlWriteCompleteDev(
6538   IN PFILE_OBJECT FileObject,
6539   IN PLARGE_INTEGER FileOffset,
6540   IN PMDL MdlChain,
6541   IN PDEVICE_OBJECT DeviceObject);
6542 
6543 NTKERNELAPI
6544 VOID
6545 NTAPI
6546 FsRtlAcquireFileExclusive(
6547   IN PFILE_OBJECT FileObject);
6548 
6549 NTKERNELAPI
6550 VOID
6551 NTAPI
6552 FsRtlReleaseFile(
6553   IN PFILE_OBJECT FileObject);
6554 
6555 NTKERNELAPI
6556 NTSTATUS
6557 NTAPI
6558 FsRtlGetFileSize(
6559   IN PFILE_OBJECT FileObject,
6560   OUT PLARGE_INTEGER FileSize);
6561 
6562 NTKERNELAPI
6563 BOOLEAN
6564 NTAPI
6565 FsRtlIsTotalDeviceFailure(
6566   IN NTSTATUS Status);
6567 
6568 NTKERNELAPI
6569 PFILE_LOCK
6570 NTAPI
6571 FsRtlAllocateFileLock(
6572   IN PCOMPLETE_LOCK_IRP_ROUTINE CompleteLockIrpRoutine OPTIONAL,
6573   IN PUNLOCK_ROUTINE UnlockRoutine OPTIONAL);
6574 
6575 NTKERNELAPI
6576 VOID
6577 NTAPI
6578 FsRtlFreeFileLock(
6579   IN PFILE_LOCK FileLock);
6580 
6581 NTKERNELAPI
6582 VOID
6583 NTAPI
6584 FsRtlInitializeFileLock(
6585   IN PFILE_LOCK FileLock,
6586   IN PCOMPLETE_LOCK_IRP_ROUTINE CompleteLockIrpRoutine OPTIONAL,
6587   IN PUNLOCK_ROUTINE UnlockRoutine OPTIONAL);
6588 
6589 NTKERNELAPI
6590 VOID
6591 NTAPI
6592 FsRtlUninitializeFileLock(
6593   IN PFILE_LOCK FileLock);
6594 
6595 /*
6596   FsRtlProcessFileLock:
6597 
6598   ret:
6599     -STATUS_INVALID_DEVICE_REQUEST
6600     -STATUS_RANGE_NOT_LOCKED from unlock routines.
6601     -STATUS_PENDING, STATUS_LOCK_NOT_GRANTED from FsRtlPrivateLock
6602     (redirected IoStatus->Status).
6603 
6604   Internals:
6605     -switch ( Irp->CurrentStackLocation->MinorFunction )
6606         lock: return FsRtlPrivateLock;
6607         unlocksingle: return FsRtlFastUnlockSingle;
6608         unlockall: return FsRtlFastUnlockAll;
6609         unlockallbykey: return FsRtlFastUnlockAllByKey;
6610         default: IofCompleteRequest with STATUS_INVALID_DEVICE_REQUEST;
6611                  return STATUS_INVALID_DEVICE_REQUEST;
6612 
6613     -'AllwaysZero' is passed thru as 'AllwaysZero' to lock / unlock routines.
6614     -'Irp' is passet thru as 'Irp' to FsRtlPrivateLock.
6615 */
6616 NTKERNELAPI
6617 NTSTATUS
6618 NTAPI
6619 FsRtlProcessFileLock(
6620   IN PFILE_LOCK FileLock,
6621   IN PIRP Irp,
6622   IN PVOID Context OPTIONAL);
6623 
6624 /*
6625   FsRtlCheckLockForReadAccess:
6626 
6627   All this really does is pick out the lock parameters from the irp (io stack
6628   location?), get IoGetRequestorProcess, and pass values on to
6629   FsRtlFastCheckLockForRead.
6630 */
6631 NTKERNELAPI
6632 BOOLEAN
6633 NTAPI
6634 FsRtlCheckLockForReadAccess(
6635   IN PFILE_LOCK FileLock,
6636   IN PIRP Irp);
6637 
6638 /*
6639   FsRtlCheckLockForWriteAccess:
6640 
6641   All this really does is pick out the lock parameters from the irp (io stack
6642   location?), get IoGetRequestorProcess, and pass values on to
6643   FsRtlFastCheckLockForWrite.
6644 */
6645 NTKERNELAPI
6646 BOOLEAN
6647 NTAPI
6648 FsRtlCheckLockForWriteAccess(
6649   IN PFILE_LOCK FileLock,
6650   IN PIRP Irp);
6651 
6652 NTKERNELAPI
6653 BOOLEAN
6654 NTAPI
6655 FsRtlFastCheckLockForRead(
6656   IN PFILE_LOCK FileLock,
6657   IN PLARGE_INTEGER FileOffset,
6658   IN PLARGE_INTEGER Length,
6659   IN ULONG Key,
6660   IN PFILE_OBJECT FileObject,
6661   IN PVOID Process);
6662 
6663 NTKERNELAPI
6664 BOOLEAN
6665 NTAPI
6666 FsRtlFastCheckLockForWrite(
6667   IN PFILE_LOCK FileLock,
6668   IN PLARGE_INTEGER FileOffset,
6669   IN PLARGE_INTEGER Length,
6670   IN ULONG Key,
6671   IN PFILE_OBJECT FileObject,
6672   IN PVOID Process);
6673 
6674 /*
6675   FsRtlGetNextFileLock:
6676 
6677   ret: NULL if no more locks
6678 
6679   Internals:
6680     FsRtlGetNextFileLock uses FileLock->LastReturnedLockInfo and
6681     FileLock->LastReturnedLock as storage.
6682     LastReturnedLock is a pointer to the 'raw' lock inkl. double linked
6683     list, and FsRtlGetNextFileLock needs this to get next lock on subsequent
6684     calls with Restart = FALSE.
6685 */
6686 NTKERNELAPI
6687 PFILE_LOCK_INFO
6688 NTAPI
6689 FsRtlGetNextFileLock(
6690   IN PFILE_LOCK FileLock,
6691   IN BOOLEAN Restart);
6692 
6693 NTKERNELAPI
6694 NTSTATUS
6695 NTAPI
6696 FsRtlFastUnlockSingle(
6697   IN PFILE_LOCK FileLock,
6698   IN PFILE_OBJECT FileObject,
6699   IN PLARGE_INTEGER FileOffset,
6700   IN PLARGE_INTEGER Length,
6701   IN PEPROCESS Process,
6702   IN ULONG Key,
6703   IN PVOID Context OPTIONAL,
6704   IN BOOLEAN AlreadySynchronized);
6705 
6706 NTKERNELAPI
6707 NTSTATUS
6708 NTAPI
6709 FsRtlFastUnlockAll(
6710   IN PFILE_LOCK FileLock,
6711   IN PFILE_OBJECT FileObject,
6712   IN PEPROCESS Process,
6713   IN PVOID Context OPTIONAL);
6714 
6715 NTKERNELAPI
6716 NTSTATUS
6717 NTAPI
6718 FsRtlFastUnlockAllByKey(
6719   IN PFILE_LOCK FileLock,
6720   IN PFILE_OBJECT FileObject,
6721   IN PEPROCESS Process,
6722   IN ULONG Key,
6723   IN PVOID Context OPTIONAL);
6724 
6725 /*
6726   FsRtlPrivateLock:
6727 
6728   ret: IoStatus->Status: STATUS_PENDING, STATUS_LOCK_NOT_GRANTED
6729 
6730   Internals:
6731     -Calls IoCompleteRequest if Irp
6732     -Uses exception handling / ExRaiseStatus with STATUS_INSUFFICIENT_RESOURCES
6733 */
6734 NTKERNELAPI
6735 BOOLEAN
6736 NTAPI
6737 FsRtlPrivateLock(
6738   IN PFILE_LOCK FileLock,
6739   IN PFILE_OBJECT FileObject,
6740   IN PLARGE_INTEGER FileOffset,
6741   IN PLARGE_INTEGER Length,
6742   IN PEPROCESS Process,
6743   IN ULONG Key,
6744   IN BOOLEAN FailImmediately,
6745   IN BOOLEAN ExclusiveLock,
6746   OUT PIO_STATUS_BLOCK IoStatus,
6747   IN PIRP Irp OPTIONAL,
6748   IN PVOID Context,
6749   IN BOOLEAN AlreadySynchronized);
6750 
6751 NTKERNELAPI
6752 VOID
6753 NTAPI
6754 FsRtlInitializeTunnelCache(
6755   IN PTUNNEL Cache);
6756 
6757 NTKERNELAPI
6758 VOID
6759 NTAPI
6760 FsRtlAddToTunnelCache(
6761   IN PTUNNEL Cache,
6762   IN ULONGLONG DirectoryKey,
6763   IN PUNICODE_STRING ShortName,
6764   IN PUNICODE_STRING LongName,
6765   IN BOOLEAN KeyByShortName,
6766   IN ULONG DataLength,
6767   IN PVOID Data);
6768 
6769 NTKERNELAPI
6770 BOOLEAN
6771 NTAPI
6772 FsRtlFindInTunnelCache(
6773   IN PTUNNEL Cache,
6774   IN ULONGLONG DirectoryKey,
6775   IN PUNICODE_STRING Name,
6776   OUT PUNICODE_STRING ShortName,
6777   OUT PUNICODE_STRING LongName,
6778   IN OUT PULONG DataLength,
6779   OUT PVOID Data);
6780 
6781 NTKERNELAPI
6782 VOID
6783 NTAPI
6784 FsRtlDeleteKeyFromTunnelCache(
6785   IN PTUNNEL Cache,
6786   IN ULONGLONG DirectoryKey);
6787 
6788 NTKERNELAPI
6789 VOID
6790 NTAPI
6791 FsRtlDeleteTunnelCache(
6792   IN PTUNNEL Cache);
6793 
6794 NTKERNELAPI
6795 VOID
6796 NTAPI
6797 FsRtlDissectDbcs(
6798   IN ANSI_STRING Name,
6799   OUT PANSI_STRING FirstPart,
6800   OUT PANSI_STRING RemainingPart);
6801 
6802 NTKERNELAPI
6803 BOOLEAN
6804 NTAPI
6805 FsRtlDoesDbcsContainWildCards(
6806   IN PANSI_STRING Name);
6807 
6808 NTKERNELAPI
6809 BOOLEAN
6810 NTAPI
6811 FsRtlIsDbcsInExpression(
6812   IN PANSI_STRING Expression,
6813   IN PANSI_STRING Name);
6814 
6815 NTKERNELAPI
6816 BOOLEAN
6817 NTAPI
6818 FsRtlIsFatDbcsLegal(
6819   IN ANSI_STRING DbcsName,
6820   IN BOOLEAN WildCardsPermissible,
6821   IN BOOLEAN PathNamePermissible,
6822   IN BOOLEAN LeadingBackslashPermissible);
6823 
6824 NTKERNELAPI
6825 BOOLEAN
6826 NTAPI
6827 FsRtlIsHpfsDbcsLegal(
6828   IN ANSI_STRING DbcsName,
6829   IN BOOLEAN WildCardsPermissible,
6830   IN BOOLEAN PathNamePermissible,
6831   IN BOOLEAN LeadingBackslashPermissible);
6832 
6833 NTKERNELAPI
6834 NTSTATUS
6835 NTAPI
6836 FsRtlNormalizeNtstatus(
6837   IN NTSTATUS Exception,
6838   IN NTSTATUS GenericException);
6839 
6840 NTKERNELAPI
6841 BOOLEAN
6842 NTAPI
6843 FsRtlIsNtstatusExpected(
6844   IN NTSTATUS Ntstatus);
6845 
6846 NTKERNELAPI
6847 PERESOURCE
6848 NTAPI
6849 FsRtlAllocateResource(
6850   VOID);
6851 
6852 NTKERNELAPI
6853 VOID
6854 NTAPI
6855 FsRtlInitializeLargeMcb(
6856   IN PLARGE_MCB Mcb,
6857   IN POOL_TYPE PoolType);
6858 
6859 NTKERNELAPI
6860 VOID
6861 NTAPI
6862 FsRtlUninitializeLargeMcb(
6863   IN PLARGE_MCB Mcb);
6864 
6865 NTKERNELAPI
6866 VOID
6867 NTAPI
6868 FsRtlResetLargeMcb(
6869   IN PLARGE_MCB Mcb,
6870   IN BOOLEAN SelfSynchronized);
6871 
6872 NTKERNELAPI
6873 VOID
6874 NTAPI
6875 FsRtlTruncateLargeMcb(
6876   IN PLARGE_MCB Mcb,
6877   IN LONGLONG Vbn);
6878 
6879 NTKERNELAPI
6880 BOOLEAN
6881 NTAPI
6882 FsRtlAddLargeMcbEntry(
6883   IN PLARGE_MCB Mcb,
6884   IN LONGLONG Vbn,
6885   IN LONGLONG Lbn,
6886   IN LONGLONG SectorCount);
6887 
6888 NTKERNELAPI
6889 VOID
6890 NTAPI
6891 FsRtlRemoveLargeMcbEntry(
6892   IN PLARGE_MCB Mcb,
6893   IN LONGLONG Vbn,
6894   IN LONGLONG SectorCount);
6895 
6896 NTKERNELAPI
6897 BOOLEAN
6898 NTAPI
6899 FsRtlLookupLargeMcbEntry(
6900   IN PLARGE_MCB Mcb,
6901   IN LONGLONG Vbn,
6902   OUT PLONGLONG Lbn OPTIONAL,
6903   OUT PLONGLONG SectorCountFromLbn OPTIONAL,
6904   OUT PLONGLONG StartingLbn OPTIONAL,
6905   OUT PLONGLONG SectorCountFromStartingLbn OPTIONAL,
6906   OUT PULONG Index OPTIONAL);
6907 
6908 NTKERNELAPI
6909 BOOLEAN
6910 NTAPI
6911 FsRtlLookupLastLargeMcbEntry(
6912   IN PLARGE_MCB Mcb,
6913   OUT PLONGLONG Vbn,
6914   OUT PLONGLONG Lbn);
6915 
6916 NTKERNELAPI
6917 BOOLEAN
6918 NTAPI
6919 FsRtlLookupLastLargeMcbEntryAndIndex(
6920   IN PLARGE_MCB OpaqueMcb,
6921   OUT PLONGLONG LargeVbn,
6922   OUT PLONGLONG LargeLbn,
6923   OUT PULONG Index);
6924 
6925 NTKERNELAPI
6926 ULONG
6927 NTAPI
6928 FsRtlNumberOfRunsInLargeMcb(
6929   IN PLARGE_MCB Mcb);
6930 
6931 NTKERNELAPI
6932 BOOLEAN
6933 NTAPI
6934 FsRtlGetNextLargeMcbEntry(
6935   IN PLARGE_MCB Mcb,
6936   IN ULONG RunIndex,
6937   OUT PLONGLONG Vbn,
6938   OUT PLONGLONG Lbn,
6939   OUT PLONGLONG SectorCount);
6940 
6941 NTKERNELAPI
6942 BOOLEAN
6943 NTAPI
6944 FsRtlSplitLargeMcb(
6945   IN PLARGE_MCB Mcb,
6946   IN LONGLONG Vbn,
6947   IN LONGLONG Amount);
6948 
6949 NTKERNELAPI
6950 VOID
6951 NTAPI
6952 FsRtlInitializeMcb(
6953   IN PMCB Mcb,
6954   IN POOL_TYPE PoolType);
6955 
6956 NTKERNELAPI
6957 VOID
6958 NTAPI
6959 FsRtlUninitializeMcb(
6960   IN PMCB Mcb);
6961 
6962 NTKERNELAPI
6963 VOID
6964 NTAPI
6965 FsRtlTruncateMcb(
6966   IN PMCB Mcb,
6967   IN VBN Vbn);
6968 
6969 NTKERNELAPI
6970 BOOLEAN
6971 NTAPI
6972 FsRtlAddMcbEntry(
6973   IN PMCB Mcb,
6974   IN VBN Vbn,
6975   IN LBN Lbn,
6976   IN ULONG SectorCount);
6977 
6978 NTKERNELAPI
6979 VOID
6980 NTAPI
6981 FsRtlRemoveMcbEntry(
6982   IN PMCB Mcb,
6983   IN VBN Vbn,
6984   IN ULONG SectorCount);
6985 
6986 NTKERNELAPI
6987 BOOLEAN
6988 NTAPI
6989 FsRtlLookupMcbEntry(
6990   IN PMCB Mcb,
6991   IN VBN Vbn,
6992   OUT PLBN Lbn,
6993   OUT PULONG SectorCount OPTIONAL,
6994   OUT PULONG Index);
6995 
6996 NTKERNELAPI
6997 BOOLEAN
6998 NTAPI
6999 FsRtlLookupLastMcbEntry(
7000   IN PMCB Mcb,
7001   OUT PVBN Vbn,
7002   OUT PLBN Lbn);
7003 
7004 NTKERNELAPI
7005 ULONG
7006 NTAPI
7007 FsRtlNumberOfRunsInMcb(
7008   IN PMCB Mcb);
7009 
7010 NTKERNELAPI
7011 BOOLEAN
7012 NTAPI
7013 FsRtlGetNextMcbEntry(
7014   IN PMCB Mcb,
7015   IN ULONG RunIndex,
7016   OUT PVBN Vbn,
7017   OUT PLBN Lbn,
7018   OUT PULONG SectorCount);
7019 
7020 NTKERNELAPI
7021 NTSTATUS
7022 NTAPI
7023 FsRtlBalanceReads(
7024   IN PDEVICE_OBJECT TargetDevice);
7025 
7026 NTKERNELAPI
7027 VOID
7028 NTAPI
7029 FsRtlInitializeOplock(
7030   IN OUT POPLOCK Oplock);
7031 
7032 NTKERNELAPI
7033 VOID
7034 NTAPI
7035 FsRtlUninitializeOplock(
7036   IN OUT POPLOCK Oplock);
7037 
7038 NTKERNELAPI
7039 NTSTATUS
7040 NTAPI
7041 FsRtlOplockFsctrl(
7042   IN POPLOCK Oplock,
7043   IN PIRP Irp,
7044   IN ULONG OpenCount);
7045 
7046 NTKERNELAPI
7047 NTSTATUS
7048 NTAPI
7049 FsRtlCheckOplock(
7050   IN POPLOCK Oplock,
7051   IN PIRP Irp,
7052   IN PVOID Context,
7053   IN POPLOCK_WAIT_COMPLETE_ROUTINE CompletionRoutine OPTIONAL,
7054   IN POPLOCK_FS_PREPOST_IRP PostIrpRoutine OPTIONAL);
7055 
7056 NTKERNELAPI
7057 BOOLEAN
7058 NTAPI
7059 FsRtlOplockIsFastIoPossible(
7060   IN POPLOCK Oplock);
7061 
7062 NTKERNELAPI
7063 BOOLEAN
7064 NTAPI
7065 FsRtlCurrentBatchOplock(
7066   IN POPLOCK Oplock);
7067 
7068 NTKERNELAPI
7069 NTSTATUS
7070 NTAPI
7071 FsRtlNotifyVolumeEvent(
7072   IN PFILE_OBJECT FileObject,
7073   IN ULONG EventCode);
7074 
7075 NTKERNELAPI
7076 VOID
7077 NTAPI
7078 FsRtlNotifyInitializeSync(
7079   IN PNOTIFY_SYNC *NotifySync);
7080 
7081 NTKERNELAPI
7082 VOID
7083 NTAPI
7084 FsRtlNotifyUninitializeSync(
7085   IN PNOTIFY_SYNC *NotifySync);
7086 
7087 NTKERNELAPI
7088 VOID
7089 NTAPI
7090 FsRtlNotifyFullChangeDirectory(
7091   IN PNOTIFY_SYNC NotifySync,
7092   IN PLIST_ENTRY NotifyList,
7093   IN PVOID FsContext,
7094   IN PSTRING FullDirectoryName,
7095   IN BOOLEAN WatchTree,
7096   IN BOOLEAN IgnoreBuffer,
7097   IN ULONG CompletionFilter,
7098   IN PIRP NotifyIrp OPTIONAL,
7099   IN PCHECK_FOR_TRAVERSE_ACCESS TraverseCallback OPTIONAL,
7100   IN PSECURITY_SUBJECT_CONTEXT SubjectContext OPTIONAL);
7101 
7102 NTKERNELAPI
7103 VOID
7104 NTAPI
7105 FsRtlNotifyFilterReportChange(
7106   IN PNOTIFY_SYNC NotifySync,
7107   IN PLIST_ENTRY NotifyList,
7108   IN PSTRING FullTargetName,
7109   IN USHORT TargetNameOffset,
7110   IN PSTRING StreamName OPTIONAL,
7111   IN PSTRING NormalizedParentName OPTIONAL,
7112   IN ULONG FilterMatch,
7113   IN ULONG Action,
7114   IN PVOID TargetContext OPTIONAL,
7115   IN PVOID FilterContext OPTIONAL);
7116 
7117 NTKERNELAPI
7118 VOID
7119 NTAPI
7120 FsRtlNotifyFullReportChange(
7121   IN PNOTIFY_SYNC NotifySync,
7122   IN PLIST_ENTRY NotifyList,
7123   IN PSTRING FullTargetName,
7124   IN USHORT TargetNameOffset,
7125   IN PSTRING StreamName OPTIONAL,
7126   IN PSTRING NormalizedParentName OPTIONAL,
7127   IN ULONG FilterMatch,
7128   IN ULONG Action,
7129   IN PVOID TargetContext OPTIONAL);
7130 
7131 NTKERNELAPI
7132 VOID
7133 NTAPI
7134 FsRtlNotifyCleanup(
7135   IN PNOTIFY_SYNC NotifySync,
7136   IN PLIST_ENTRY NotifyList,
7137   IN PVOID FsContext);
7138 
7139 NTKERNELAPI
7140 VOID
7141 NTAPI
7142 FsRtlDissectName(
7143   IN UNICODE_STRING Name,
7144   OUT PUNICODE_STRING FirstPart,
7145   OUT PUNICODE_STRING RemainingPart);
7146 
7147 NTKERNELAPI
7148 BOOLEAN
7149 NTAPI
7150 FsRtlDoesNameContainWildCards(
7151   IN PUNICODE_STRING Name);
7152 
7153 NTKERNELAPI
7154 BOOLEAN
7155 NTAPI
7156 FsRtlAreNamesEqual(
7157   IN PCUNICODE_STRING Name1,
7158   IN PCUNICODE_STRING Name2,
7159   IN BOOLEAN IgnoreCase,
7160   IN PCWCH UpcaseTable OPTIONAL);
7161 
7162 NTKERNELAPI
7163 BOOLEAN
7164 NTAPI
7165 FsRtlIsNameInExpression(
7166   IN PUNICODE_STRING Expression,
7167   IN PUNICODE_STRING Name,
7168   IN BOOLEAN IgnoreCase,
7169   IN PWCHAR UpcaseTable OPTIONAL);
7170 
7171 NTKERNELAPI
7172 VOID
7173 NTAPI
7174 FsRtlPostPagingFileStackOverflow(
7175   IN PVOID Context,
7176   IN PKEVENT Event,
7177   IN PFSRTL_STACK_OVERFLOW_ROUTINE StackOverflowRoutine);
7178 
7179 NTKERNELAPI
7180 VOID
7181 NTAPI
7182 FsRtlPostStackOverflow (
7183   IN PVOID Context,
7184   IN PKEVENT Event,
7185   IN PFSRTL_STACK_OVERFLOW_ROUTINE StackOverflowRoutine);
7186 
7187 NTKERNELAPI
7188 NTSTATUS
7189 NTAPI
7190 FsRtlRegisterUncProvider(
7191   OUT PHANDLE MupHandle,
7192   IN PUNICODE_STRING RedirectorDeviceName,
7193   IN BOOLEAN MailslotsSupported);
7194 
7195 NTKERNELAPI
7196 VOID
7197 NTAPI
7198 FsRtlDeregisterUncProvider(
7199   IN HANDLE Handle);
7200 
7201 NTKERNELAPI
7202 VOID
7203 NTAPI
7204 FsRtlTeardownPerStreamContexts(
7205   IN PFSRTL_ADVANCED_FCB_HEADER AdvancedHeader);
7206 
7207 NTKERNELAPI
7208 NTSTATUS
7209 NTAPI
7210 FsRtlCreateSectionForDataScan(
7211   OUT PHANDLE SectionHandle,
7212   OUT PVOID *SectionObject,
7213   OUT PLARGE_INTEGER SectionFileSize OPTIONAL,
7214   IN PFILE_OBJECT FileObject,
7215   IN ACCESS_MASK DesiredAccess,
7216   IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,
7217   IN PLARGE_INTEGER MaximumSize OPTIONAL,
7218   IN ULONG SectionPageProtection,
7219   IN ULONG AllocationAttributes,
7220   IN ULONG Flags);
7221 
7222 #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
7223 
7224 #if (NTDDI_VERSION >= NTDDI_WINXP)
7225 
7226 NTKERNELAPI
7227 VOID
7228 NTAPI
7229 FsRtlNotifyFilterChangeDirectory(
7230   IN PNOTIFY_SYNC NotifySync,
7231   IN PLIST_ENTRY NotifyList,
7232   IN PVOID FsContext,
7233   IN PSTRING FullDirectoryName,
7234   IN BOOLEAN WatchTree,
7235   IN BOOLEAN IgnoreBuffer,
7236   IN ULONG CompletionFilter,
7237   IN PIRP NotifyIrp OPTIONAL,
7238   IN PCHECK_FOR_TRAVERSE_ACCESS TraverseCallback OPTIONAL,
7239   IN PSECURITY_SUBJECT_CONTEXT SubjectContext OPTIONAL,
7240   IN PFILTER_REPORT_CHANGE FilterCallback OPTIONAL);
7241 
7242 NTKERNELAPI
7243 NTSTATUS
7244 NTAPI
7245 FsRtlInsertPerStreamContext(
7246   IN PFSRTL_ADVANCED_FCB_HEADER PerStreamContext,
7247   IN PFSRTL_PER_STREAM_CONTEXT Ptr);
7248 
7249 NTKERNELAPI
7250 PFSRTL_PER_STREAM_CONTEXT
7251 NTAPI
7252 FsRtlLookupPerStreamContextInternal(
7253   IN PFSRTL_ADVANCED_FCB_HEADER StreamContext,
7254   IN PVOID OwnerId OPTIONAL,
7255   IN PVOID InstanceId OPTIONAL);
7256 
7257 NTKERNELAPI
7258 PFSRTL_PER_STREAM_CONTEXT
7259 NTAPI
7260 FsRtlRemovePerStreamContext(
7261   IN PFSRTL_ADVANCED_FCB_HEADER StreamContext,
7262   IN PVOID OwnerId OPTIONAL,
7263   IN PVOID InstanceId OPTIONAL);
7264 
7265 NTKERNELAPI
7266 VOID
7267 NTAPI
7268 FsRtlIncrementCcFastReadNotPossible(
7269   VOID);
7270 
7271 NTKERNELAPI
7272 VOID
7273 NTAPI
7274 FsRtlIncrementCcFastReadWait(
7275   VOID);
7276 
7277 NTKERNELAPI
7278 VOID
7279 NTAPI
7280 FsRtlIncrementCcFastReadNoWait(
7281   VOID);
7282 
7283 NTKERNELAPI
7284 VOID
7285 NTAPI
7286 FsRtlIncrementCcFastReadResourceMiss(
7287   VOID);
7288 
7289 NTKERNELAPI
7290 LOGICAL
7291 NTAPI
7292 FsRtlIsPagingFile(
7293   IN PFILE_OBJECT FileObject);
7294 
7295 #endif /* (NTDDI_VERSION >= NTDDI_WINXP) */
7296 
7297 #if (NTDDI_VERSION >= NTDDI_WS03)
7298 
7299 NTKERNELAPI
7300 VOID
7301 NTAPI
7302 FsRtlInitializeBaseMcb(
7303   IN PBASE_MCB Mcb,
7304   IN POOL_TYPE PoolType);
7305 
7306 NTKERNELAPI
7307 VOID
7308 NTAPI
7309 FsRtlUninitializeBaseMcb(
7310   IN PBASE_MCB Mcb);
7311 
7312 NTKERNELAPI
7313 VOID
7314 NTAPI
7315 FsRtlResetBaseMcb(
7316   IN PBASE_MCB Mcb);
7317 
7318 NTKERNELAPI
7319 VOID
7320 NTAPI
7321 FsRtlTruncateBaseMcb(
7322   IN PBASE_MCB Mcb,
7323   IN LONGLONG Vbn);
7324 
7325 NTKERNELAPI
7326 BOOLEAN
7327 NTAPI
7328 FsRtlAddBaseMcbEntry(
7329   IN PBASE_MCB Mcb,
7330   IN LONGLONG Vbn,
7331   IN LONGLONG Lbn,
7332   IN LONGLONG SectorCount);
7333 
7334 NTKERNELAPI
7335 BOOLEAN
7336 NTAPI
7337 FsRtlRemoveBaseMcbEntry(
7338   IN PBASE_MCB Mcb,
7339   IN LONGLONG Vbn,
7340   IN LONGLONG SectorCount);
7341 
7342 NTKERNELAPI
7343 BOOLEAN
7344 NTAPI
7345 FsRtlLookupBaseMcbEntry(
7346   IN PBASE_MCB Mcb,
7347   IN LONGLONG Vbn,
7348   OUT PLONGLONG Lbn OPTIONAL,
7349   OUT PLONGLONG SectorCountFromLbn OPTIONAL,
7350   OUT PLONGLONG StartingLbn OPTIONAL,
7351   OUT PLONGLONG SectorCountFromStartingLbn OPTIONAL,
7352   OUT PULONG Index OPTIONAL);
7353 
7354 NTKERNELAPI
7355 BOOLEAN
7356 NTAPI
7357 FsRtlLookupLastBaseMcbEntry(
7358   IN PBASE_MCB Mcb,
7359   OUT PLONGLONG Vbn,
7360   OUT PLONGLONG Lbn);
7361 
7362 NTKERNELAPI
7363 BOOLEAN
7364 NTAPI
7365 FsRtlLookupLastBaseMcbEntryAndIndex(
7366   IN PBASE_MCB OpaqueMcb,
7367   IN OUT PLONGLONG LargeVbn,
7368   IN OUT PLONGLONG LargeLbn,
7369   IN OUT PULONG Index);
7370 
7371 NTKERNELAPI
7372 ULONG
7373 NTAPI
7374 FsRtlNumberOfRunsInBaseMcb(
7375   IN PBASE_MCB Mcb);
7376 
7377 NTKERNELAPI
7378 BOOLEAN
7379 NTAPI
7380 FsRtlGetNextBaseMcbEntry(
7381   IN PBASE_MCB Mcb,
7382   IN ULONG RunIndex,
7383   OUT PLONGLONG Vbn,
7384   OUT PLONGLONG Lbn,
7385   OUT PLONGLONG SectorCount);
7386 
7387 NTKERNELAPI
7388 BOOLEAN
7389 NTAPI
7390 FsRtlSplitBaseMcb(
7391   IN PBASE_MCB Mcb,
7392   IN LONGLONG Vbn,
7393   IN LONGLONG Amount);
7394 
7395 #endif /* (NTDDI_VERSION >= NTDDI_WS03) */
7396 
7397 #if (NTDDI_VERSION >= NTDDI_VISTA)
7398 
7399 BOOLEAN
7400 NTAPI
7401 FsRtlInitializeBaseMcbEx(
7402   IN PBASE_MCB Mcb,
7403   IN POOL_TYPE PoolType,
7404   IN USHORT Flags);
7405 
7406 NTSTATUS
7407 NTAPI
7408 FsRtlAddBaseMcbEntryEx(
7409   IN PBASE_MCB Mcb,
7410   IN LONGLONG Vbn,
7411   IN LONGLONG Lbn,
7412   IN LONGLONG SectorCount);
7413 
7414 NTKERNELAPI
7415 BOOLEAN
7416 NTAPI
7417 FsRtlCurrentOplock(
7418   IN POPLOCK Oplock);
7419 
7420 NTKERNELAPI
7421 NTSTATUS
7422 NTAPI
7423 FsRtlOplockBreakToNone(
7424   IN OUT POPLOCK Oplock,
7425   IN PIO_STACK_LOCATION IrpSp OPTIONAL,
7426   IN PIRP Irp,
7427   IN PVOID Context OPTIONAL,
7428   IN POPLOCK_WAIT_COMPLETE_ROUTINE CompletionRoutine OPTIONAL,
7429   IN POPLOCK_FS_PREPOST_IRP PostIrpRoutine OPTIONAL);
7430 
7431 NTKERNELAPI
7432 NTSTATUS
7433 NTAPI
7434 FsRtlNotifyVolumeEventEx(
7435   IN PFILE_OBJECT FileObject,
7436   IN ULONG EventCode,
7437   IN PTARGET_DEVICE_CUSTOM_NOTIFICATION Event);
7438 
7439 NTKERNELAPI
7440 VOID
7441 NTAPI
7442 FsRtlNotifyCleanupAll(
7443   IN PNOTIFY_SYNC NotifySync,
7444   IN PLIST_ENTRY NotifyList);
7445 
7446 NTSTATUS
7447 NTAPI
7448 FsRtlRegisterUncProviderEx(
7449   OUT PHANDLE MupHandle,
7450   IN PUNICODE_STRING RedirDevName,
7451   IN PDEVICE_OBJECT DeviceObject,
7452   IN ULONG Flags);
7453 
7454 NTKERNELAPI
7455 NTSTATUS
7456 NTAPI
7457 FsRtlCancellableWaitForSingleObject(
7458   IN PVOID Object,
7459   IN PLARGE_INTEGER Timeout OPTIONAL,
7460   IN PIRP Irp OPTIONAL);
7461 
7462 NTKERNELAPI
7463 NTSTATUS
7464 NTAPI
7465 FsRtlCancellableWaitForMultipleObjects(
7466   IN ULONG Count,
7467   IN PVOID ObjectArray[],
7468   IN WAIT_TYPE WaitType,
7469   IN PLARGE_INTEGER Timeout OPTIONAL,
7470   IN PKWAIT_BLOCK WaitBlockArray OPTIONAL,
7471   IN PIRP Irp OPTIONAL);
7472 
7473 NTKERNELAPI
7474 NTSTATUS
7475 NTAPI
7476 FsRtlMupGetProviderInfoFromFileObject(
7477   IN PFILE_OBJECT pFileObject,
7478   IN ULONG Level,
7479   OUT PVOID pBuffer,
7480   IN OUT PULONG pBufferSize);
7481 
7482 NTKERNELAPI
7483 NTSTATUS
7484 NTAPI
7485 FsRtlMupGetProviderIdFromName(
7486   IN PUNICODE_STRING pProviderName,
7487   OUT PULONG32 pProviderId);
7488 
7489 NTKERNELAPI
7490 VOID
7491 NTAPI
7492 FsRtlIncrementCcFastMdlReadWait(
7493   VOID);
7494 
7495 NTKERNELAPI
7496 NTSTATUS
7497 NTAPI
7498 FsRtlValidateReparsePointBuffer(
7499   IN ULONG BufferLength,
7500   IN PREPARSE_DATA_BUFFER ReparseBuffer);
7501 
7502 NTKERNELAPI
7503 NTSTATUS
7504 NTAPI
7505 FsRtlRemoveDotsFromPath(
7506   IN OUT PWSTR OriginalString,
7507   IN USHORT PathLength,
7508   OUT USHORT *NewLength);
7509 
7510 NTKERNELAPI
7511 NTSTATUS
7512 NTAPI
7513 FsRtlAllocateExtraCreateParameterList(
7514   IN FSRTL_ALLOCATE_ECPLIST_FLAGS Flags,
7515   OUT PECP_LIST *EcpList);
7516 
7517 NTKERNELAPI
7518 VOID
7519 NTAPI
7520 FsRtlFreeExtraCreateParameterList(
7521   IN PECP_LIST EcpList);
7522 
7523 NTKERNELAPI
7524 NTSTATUS
7525 NTAPI
7526 FsRtlAllocateExtraCreateParameter(
7527   IN LPCGUID EcpType,
7528   IN ULONG SizeOfContext,
7529   IN FSRTL_ALLOCATE_ECP_FLAGS Flags,
7530   IN PFSRTL_EXTRA_CREATE_PARAMETER_CLEANUP_CALLBACK CleanupCallback OPTIONAL,
7531   IN ULONG PoolTag,
7532   OUT PVOID *EcpContext);
7533 
7534 NTKERNELAPI
7535 VOID
7536 NTAPI
7537 FsRtlFreeExtraCreateParameter(
7538   IN PVOID EcpContext);
7539 
7540 NTKERNELAPI
7541 VOID
7542 NTAPI
7543 FsRtlInitExtraCreateParameterLookasideList(
7544   IN OUT PVOID Lookaside,
7545   IN FSRTL_ECP_LOOKASIDE_FLAGS Flags,
7546   IN SIZE_T Size,
7547   IN ULONG Tag);
7548 
7549 VOID
7550 NTAPI
7551 FsRtlDeleteExtraCreateParameterLookasideList(
7552   IN OUT PVOID Lookaside,
7553   IN FSRTL_ECP_LOOKASIDE_FLAGS Flags);
7554 
7555 NTKERNELAPI
7556 NTSTATUS
7557 NTAPI
7558 FsRtlAllocateExtraCreateParameterFromLookasideList(
7559   IN LPCGUID EcpType,
7560   IN ULONG SizeOfContext,
7561   IN FSRTL_ALLOCATE_ECP_FLAGS Flags,
7562   IN PFSRTL_EXTRA_CREATE_PARAMETER_CLEANUP_CALLBACK CleanupCallback OPTIONAL,
7563   IN OUT PVOID LookasideList,
7564   OUT PVOID *EcpContext);
7565 
7566 NTKERNELAPI
7567 NTSTATUS
7568 NTAPI
7569 FsRtlInsertExtraCreateParameter(
7570   IN OUT PECP_LIST EcpList,
7571   IN OUT PVOID EcpContext);
7572 
7573 NTKERNELAPI
7574 NTSTATUS
7575 NTAPI
7576 FsRtlFindExtraCreateParameter(
7577   IN PECP_LIST EcpList,
7578   IN LPCGUID EcpType,
7579   OUT PVOID *EcpContext OPTIONAL,
7580   OUT ULONG *EcpContextSize OPTIONAL);
7581 
7582 NTKERNELAPI
7583 NTSTATUS
7584 NTAPI
7585 FsRtlRemoveExtraCreateParameter(
7586   IN OUT PECP_LIST EcpList,
7587   IN LPCGUID EcpType,
7588   OUT PVOID *EcpContext,
7589   OUT ULONG *EcpContextSize OPTIONAL);
7590 
7591 NTKERNELAPI
7592 NTSTATUS
7593 NTAPI
7594 FsRtlGetEcpListFromIrp(
7595   IN PIRP Irp,
7596   OUT PECP_LIST *EcpList OPTIONAL);
7597 
7598 NTKERNELAPI
7599 NTSTATUS
7600 NTAPI
7601 FsRtlSetEcpListIntoIrp(
7602   IN OUT PIRP Irp,
7603   IN PECP_LIST EcpList);
7604 
7605 NTKERNELAPI
7606 NTSTATUS
7607 NTAPI
7608 FsRtlGetNextExtraCreateParameter(
7609   IN PECP_LIST EcpList,
7610   IN PVOID CurrentEcpContext OPTIONAL,
7611   OUT LPGUID NextEcpType OPTIONAL,
7612   OUT PVOID *NextEcpContext OPTIONAL,
7613   OUT ULONG *NextEcpContextSize OPTIONAL);
7614 
7615 NTKERNELAPI
7616 VOID
7617 NTAPI
7618 FsRtlAcknowledgeEcp(
7619   IN PVOID EcpContext);
7620 
7621 NTKERNELAPI
7622 BOOLEAN
7623 NTAPI
7624 FsRtlIsEcpAcknowledged(
7625   IN PVOID EcpContext);
7626 
7627 NTKERNELAPI
7628 BOOLEAN
7629 NTAPI
7630 FsRtlIsEcpFromUserMode(
7631   IN PVOID EcpContext);
7632 
7633 NTKERNELAPI
7634 NTSTATUS
7635 NTAPI
7636 FsRtlChangeBackingFileObject(
7637   IN PFILE_OBJECT CurrentFileObject OPTIONAL,
7638   IN PFILE_OBJECT NewFileObject,
7639   IN FSRTL_CHANGE_BACKING_TYPE ChangeBackingType,
7640   IN ULONG Flags);
7641 
7642 NTKERNELAPI
7643 NTSTATUS
7644 NTAPI
7645 FsRtlLogCcFlushError(
7646   IN PUNICODE_STRING FileName,
7647   IN PDEVICE_OBJECT DeviceObject,
7648   IN PSECTION_OBJECT_POINTERS SectionObjectPointer,
7649   IN NTSTATUS FlushError,
7650   IN ULONG Flags);
7651 
7652 NTKERNELAPI
7653 BOOLEAN
7654 NTAPI
7655 FsRtlAreVolumeStartupApplicationsComplete(
7656   VOID);
7657 
7658 NTKERNELAPI
7659 ULONG
7660 NTAPI
7661 FsRtlQueryMaximumVirtualDiskNestingLevel(
7662   VOID);
7663 
7664 NTKERNELAPI
7665 NTSTATUS
7666 NTAPI
7667 FsRtlGetVirtualDiskNestingLevel(
7668   IN PDEVICE_OBJECT DeviceObject,
7669   OUT PULONG NestingLevel,
7670   OUT PULONG NestingFlags OPTIONAL);
7671 
7672 #endif /* (NTDDI_VERSION >= NTDDI_VISTA) */
7673 
7674 #if (NTDDI_VERSION >= NTDDI_VISTASP1)
7675 NTKERNELAPI
7676 NTSTATUS
7677 NTAPI
7678 FsRtlCheckOplockEx(
7679   IN POPLOCK Oplock,
7680   IN PIRP Irp,
7681   IN ULONG Flags,
7682   IN PVOID Context OPTIONAL,
7683   IN POPLOCK_WAIT_COMPLETE_ROUTINE CompletionRoutine OPTIONAL,
7684   IN POPLOCK_FS_PREPOST_IRP PostIrpRoutine OPTIONAL);
7685 
7686 #endif
7687 
7688 #if (NTDDI_VERSION >= NTDDI_WIN7)
7689 
7690 NTKERNELAPI
7691 BOOLEAN
7692 NTAPI
7693 FsRtlAreThereCurrentOrInProgressFileLocks(
7694   IN PFILE_LOCK FileLock);
7695 
7696 NTKERNELAPI
7697 BOOLEAN
7698 NTAPI
7699 FsRtlOplockIsSharedRequest(
7700   IN PIRP Irp);
7701 
7702 NTKERNELAPI
7703 NTSTATUS
7704 NTAPI
7705 FsRtlOplockBreakH(
7706   IN POPLOCK Oplock,
7707   IN PIRP Irp,
7708   IN ULONG Flags,
7709   IN PVOID Context OPTIONAL,
7710   IN POPLOCK_WAIT_COMPLETE_ROUTINE CompletionRoutine OPTIONAL,
7711   IN POPLOCK_FS_PREPOST_IRP PostIrpRoutine OPTIONAL);
7712 
7713 NTKERNELAPI
7714 BOOLEAN
7715 NTAPI
7716 FsRtlCurrentOplockH(
7717   IN POPLOCK Oplock);
7718 
7719 NTKERNELAPI
7720 NTSTATUS
7721 NTAPI
7722 FsRtlOplockBreakToNoneEx(
7723   IN OUT POPLOCK Oplock,
7724   IN PIRP Irp,
7725   IN ULONG Flags,
7726   IN PVOID Context OPTIONAL,
7727   IN POPLOCK_WAIT_COMPLETE_ROUTINE CompletionRoutine OPTIONAL,
7728   IN POPLOCK_FS_PREPOST_IRP PostIrpRoutine OPTIONAL);
7729 
7730 NTKERNELAPI
7731 NTSTATUS
7732 NTAPI
7733 FsRtlOplockFsctrlEx(
7734   IN POPLOCK Oplock,
7735   IN PIRP Irp,
7736   IN ULONG OpenCount,
7737   IN ULONG Flags);
7738 
7739 NTKERNELAPI
7740 BOOLEAN
7741 NTAPI
7742 FsRtlOplockKeysEqual(
7743   IN PFILE_OBJECT Fo1 OPTIONAL,
7744   IN PFILE_OBJECT Fo2 OPTIONAL);
7745 
7746 NTKERNELAPI
7747 NTSTATUS
7748 NTAPI
7749 FsRtlInitializeExtraCreateParameterList(
7750   IN OUT PECP_LIST EcpList);
7751 
7752 NTKERNELAPI
7753 VOID
7754 NTAPI
7755 FsRtlInitializeExtraCreateParameter(
7756   IN PECP_HEADER Ecp,
7757   IN ULONG EcpFlags,
7758   IN PFSRTL_EXTRA_CREATE_PARAMETER_CLEANUP_CALLBACK CleanupCallback OPTIONAL,
7759   IN ULONG TotalSize,
7760   IN LPCGUID EcpType,
7761   IN PVOID ListAllocatedFrom OPTIONAL);
7762 
7763 #endif /* (NTDDI_VERSION >= NTDDI_WIN7) */
7764 
7765 NTKERNELAPI
7766 NTSTATUS
7767 NTAPI
7768 FsRtlInsertPerFileContext(
7769   IN PVOID* PerFileContextPointer,
7770   IN PFSRTL_PER_FILE_CONTEXT Ptr);
7771 
7772 NTKERNELAPI
7773 PFSRTL_PER_FILE_CONTEXT
7774 NTAPI
7775 FsRtlLookupPerFileContext(
7776   IN PVOID* PerFileContextPointer,
7777   IN PVOID OwnerId OPTIONAL,
7778   IN PVOID InstanceId OPTIONAL);
7779 
7780 NTKERNELAPI
7781 PFSRTL_PER_FILE_CONTEXT
7782 NTAPI
7783 FsRtlRemovePerFileContext(
7784   IN PVOID* PerFileContextPointer,
7785   IN PVOID OwnerId OPTIONAL,
7786   IN PVOID InstanceId OPTIONAL);
7787 
7788 NTKERNELAPI
7789 VOID
7790 NTAPI
7791 FsRtlTeardownPerFileContexts(
7792   IN PVOID* PerFileContextPointer);
7793 
7794 NTKERNELAPI
7795 NTSTATUS
7796 NTAPI
7797 FsRtlInsertPerFileObjectContext(
7798   IN PFILE_OBJECT FileObject,
7799   IN PFSRTL_PER_FILEOBJECT_CONTEXT Ptr);
7800 
7801 NTKERNELAPI
7802 PFSRTL_PER_FILEOBJECT_CONTEXT
7803 NTAPI
7804 FsRtlLookupPerFileObjectContext(
7805   IN PFILE_OBJECT FileObject,
7806   IN PVOID OwnerId OPTIONAL,
7807   IN PVOID InstanceId OPTIONAL);
7808 
7809 NTKERNELAPI
7810 PFSRTL_PER_FILEOBJECT_CONTEXT
7811 NTAPI
7812 FsRtlRemovePerFileObjectContext(
7813   IN PFILE_OBJECT FileObject,
7814   IN PVOID OwnerId OPTIONAL,
7815   IN PVOID InstanceId OPTIONAL);
7816 
7817 #define FsRtlFastLock(A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11) (       \
7818      FsRtlPrivateLock(A1, A2, A3, A4, A5, A6, A7, A8, A9, NULL, A10, A11)   \
7819 )
7820 
7821 #define FsRtlAreThereCurrentFileLocks(FL) ( \
7822     ((FL)->FastIoIsQuestionable)            \
7823 )
7824 
7825 #define FsRtlIncrementLockRequestsInProgress(FL) {                           \
7826     ASSERT( (FL)->LockRequestsInProgress >= 0 );                             \
7827     (void)                                                                   \
7828     (InterlockedIncrement((LONG volatile *)&((FL)->LockRequestsInProgress)));\
7829 }
7830 
7831 #define FsRtlDecrementLockRequestsInProgress(FL) {                           \
7832     ASSERT( (FL)->LockRequestsInProgress > 0 );                              \
7833     (void)                                                                   \
7834     (InterlockedDecrement((LONG volatile *)&((FL)->LockRequestsInProgress)));\
7835 }
7836 
7837 /* GCC compatible definition, MS one is retarded */
7838 extern NTKERNELAPI const UCHAR * const FsRtlLegalAnsiCharacterArray;
7839 #define LEGAL_ANSI_CHARACTER_ARRAY        FsRtlLegalAnsiCharacterArray
7840 
7841 #define FsRtlIsAnsiCharacterWild(C) (                                       \
7842     FlagOn(FsRtlLegalAnsiCharacterArray[(UCHAR)(C)], FSRTL_WILD_CHARACTER ) \
7843 )
7844 
7845 #define FsRtlIsAnsiCharacterLegalFat(C, WILD) (                                \
7846     FlagOn(FsRtlLegalAnsiCharacterArray[(UCHAR)(C)], (FSRTL_FAT_LEGAL) |       \
7847                                         ((WILD) ? FSRTL_WILD_CHARACTER : 0 ))  \
7848 )
7849 
7850 #define FsRtlIsAnsiCharacterLegalHpfs(C, WILD) (                               \
7851     FlagOn(FsRtlLegalAnsiCharacterArray[(UCHAR)(C)], (FSRTL_HPFS_LEGAL) |      \
7852                                         ((WILD) ? FSRTL_WILD_CHARACTER : 0 ))  \
7853 )
7854 
7855 #define FsRtlIsAnsiCharacterLegalNtfs(C, WILD) (                               \
7856     FlagOn(FsRtlLegalAnsiCharacterArray[(UCHAR)(C)], (FSRTL_NTFS_LEGAL) |      \
7857                                         ((WILD) ? FSRTL_WILD_CHARACTER : 0 ))  \
7858 )
7859 
7860 #define FsRtlIsAnsiCharacterLegalNtfsStream(C,WILD_OK) (                    \
7861     FsRtlTestAnsiCharacter((C), TRUE, (WILD_OK), FSRTL_NTFS_STREAM_LEGAL)   \
7862 )
7863 
7864 #define FsRtlIsAnsiCharacterLegal(C,FLAGS) (          \
7865     FsRtlTestAnsiCharacter((C), TRUE, FALSE, (FLAGS)) \
7866 )
7867 
7868 #define FsRtlTestAnsiCharacter(C, DEFAULT_RET, WILD_OK, FLAGS) (            \
7869         ((SCHAR)(C) < 0) ? DEFAULT_RET :                                    \
7870                            FlagOn( LEGAL_ANSI_CHARACTER_ARRAY[(C)],         \
7871                                    (FLAGS) |                                \
7872                                    ((WILD_OK) ? FSRTL_WILD_CHARACTER : 0) ) \
7873 )
7874 
7875 #define FsRtlIsLeadDbcsCharacter(DBCS_CHAR) (                               \
7876     (BOOLEAN)((UCHAR)(DBCS_CHAR) < 0x80 ? FALSE :                           \
7877               (NLS_MB_CODE_PAGE_TAG &&                                      \
7878                (NLS_OEM_LEAD_BYTE_INFO[(UCHAR)(DBCS_CHAR)] != 0)))          \
7879 )
7880 
7881 #define FsRtlIsUnicodeCharacterWild(C) (                                    \
7882     (((C) >= 0x40) ?                                                        \
7883     FALSE :                                                                 \
7884     FlagOn(FsRtlLegalAnsiCharacterArray[(C)], FSRTL_WILD_CHARACTER ))       \
7885 )
7886 
7887 #define FsRtlInitPerFileContext( _fc, _owner, _inst, _cb)   \
7888     ((_fc)->OwnerId = (_owner),                               \
7889      (_fc)->InstanceId = (_inst),                             \
7890      (_fc)->FreeCallback = (_cb))
7891 
7892 #define FsRtlGetPerFileContextPointer(_fo) \
7893     (FsRtlSupportsPerFileContexts(_fo) ? \
7894         FsRtlGetPerStreamContextPointer(_fo)->FileContextSupportPointer : \
7895         NULL)
7896 
7897 #define FsRtlSupportsPerFileContexts(_fo)                     \
7898     ((FsRtlGetPerStreamContextPointer(_fo) != NULL) &&        \
7899      (FsRtlGetPerStreamContextPointer(_fo)->Version >= FSRTL_FCB_HEADER_V1) &&  \
7900      (FsRtlGetPerStreamContextPointer(_fo)->FileContextSupportPointer != NULL))
7901 
7902 #define FsRtlSetupAdvancedHeaderEx( _advhdr, _fmutx, _fctxptr )                     \
7903 {                                                                                   \
7904     FsRtlSetupAdvancedHeader( _advhdr, _fmutx );                                    \
7905     if ((_fctxptr) != NULL) {                                                       \
7906         (_advhdr)->FileContextSupportPointer = (_fctxptr);                          \
7907     }                                                                               \
7908 }
7909 
7910 #define FsRtlGetPerStreamContextPointer(FO) (   \
7911     (PFSRTL_ADVANCED_FCB_HEADER)(FO)->FsContext \
7912 )
7913 
7914 #define FsRtlInitPerStreamContext(PSC, O, I, FC) ( \
7915     (PSC)->OwnerId = (O),                          \
7916     (PSC)->InstanceId = (I),                       \
7917     (PSC)->FreeCallback = (FC)                     \
7918 )
7919 
7920 #define FsRtlSupportsPerStreamContexts(FO) (                       \
7921     (BOOLEAN)((NULL != FsRtlGetPerStreamContextPointer(FO) &&     \
7922               FlagOn(FsRtlGetPerStreamContextPointer(FO)->Flags2, \
7923               FSRTL_FLAG2_SUPPORTS_FILTER_CONTEXTS))               \
7924 )
7925 
7926 #define FsRtlLookupPerStreamContext(_sc, _oid, _iid)                          \
7927  (((NULL != (_sc)) &&                                                         \
7928    FlagOn((_sc)->Flags2,FSRTL_FLAG2_SUPPORTS_FILTER_CONTEXTS) &&              \
7929    !IsListEmpty(&(_sc)->FilterContexts)) ?                                    \
7930         FsRtlLookupPerStreamContextInternal((_sc), (_oid), (_iid)) :          \
7931         NULL)
7932 
7933 FORCEINLINE
7934 VOID
7935 NTAPI
FsRtlSetupAdvancedHeader(IN PVOID AdvHdr,IN PFAST_MUTEX FMutex)7936 FsRtlSetupAdvancedHeader(
7937   IN PVOID AdvHdr,
7938   IN PFAST_MUTEX FMutex )
7939 {
7940   PFSRTL_ADVANCED_FCB_HEADER localAdvHdr = (PFSRTL_ADVANCED_FCB_HEADER)AdvHdr;
7941 
7942   localAdvHdr->Flags |= FSRTL_FLAG_ADVANCED_HEADER;
7943   localAdvHdr->Flags2 |= FSRTL_FLAG2_SUPPORTS_FILTER_CONTEXTS;
7944 #if (NTDDI_VERSION >= NTDDI_VISTA)
7945   localAdvHdr->Version = FSRTL_FCB_HEADER_V1;
7946 #else
7947   localAdvHdr->Version = FSRTL_FCB_HEADER_V0;
7948 #endif
7949   InitializeListHead( &localAdvHdr->FilterContexts );
7950   if (FMutex != NULL) {
7951     localAdvHdr->FastMutex = FMutex;
7952   }
7953 #if (NTDDI_VERSION >= NTDDI_VISTA)
7954   *((PULONG_PTR)(&localAdvHdr->PushLock)) = 0;
7955   localAdvHdr->FileContextSupportPointer = NULL;
7956 #endif
7957 }
7958 
7959 #define FsRtlInitPerFileObjectContext(_fc, _owner, _inst)         \
7960            ((_fc)->OwnerId = (_owner), (_fc)->InstanceId = (_inst))
7961 
7962 #define FsRtlCompleteRequest(IRP,STATUS) {         \
7963     (IRP)->IoStatus.Status = (STATUS);             \
7964     IoCompleteRequest( (IRP), IO_DISK_INCREMENT ); \
7965 }
7966 /* Common Cache Types */
7967 
7968 #define VACB_MAPPING_GRANULARITY        (0x40000)
7969 #define VACB_OFFSET_SHIFT               (18)
7970 
7971 typedef struct _PUBLIC_BCB {
7972   CSHORT NodeTypeCode;
7973   CSHORT NodeByteSize;
7974   ULONG MappedLength;
7975   LARGE_INTEGER MappedFileOffset;
7976 } PUBLIC_BCB, *PPUBLIC_BCB;
7977 
7978 typedef struct _CC_FILE_SIZES {
7979   LARGE_INTEGER AllocationSize;
7980   LARGE_INTEGER FileSize;
7981   LARGE_INTEGER ValidDataLength;
7982 } CC_FILE_SIZES, *PCC_FILE_SIZES;
7983 
7984 typedef BOOLEAN
7985 (NTAPI *PACQUIRE_FOR_LAZY_WRITE) (
7986   IN PVOID Context,
7987   IN BOOLEAN Wait);
7988 
7989 typedef VOID
7990 (NTAPI *PRELEASE_FROM_LAZY_WRITE) (
7991   IN PVOID Context);
7992 
7993 typedef BOOLEAN
7994 (NTAPI *PACQUIRE_FOR_READ_AHEAD) (
7995   IN PVOID Context,
7996   IN BOOLEAN Wait);
7997 
7998 typedef VOID
7999 (NTAPI *PRELEASE_FROM_READ_AHEAD) (
8000   IN PVOID Context);
8001 
8002 typedef struct _CACHE_MANAGER_CALLBACKS {
8003   PACQUIRE_FOR_LAZY_WRITE AcquireForLazyWrite;
8004   PRELEASE_FROM_LAZY_WRITE ReleaseFromLazyWrite;
8005   PACQUIRE_FOR_READ_AHEAD AcquireForReadAhead;
8006   PRELEASE_FROM_READ_AHEAD ReleaseFromReadAhead;
8007 } CACHE_MANAGER_CALLBACKS, *PCACHE_MANAGER_CALLBACKS;
8008 
8009 typedef struct _CACHE_UNINITIALIZE_EVENT {
8010   struct _CACHE_UNINITIALIZE_EVENT *Next;
8011   KEVENT Event;
8012 } CACHE_UNINITIALIZE_EVENT, *PCACHE_UNINITIALIZE_EVENT;
8013 
8014 typedef VOID
8015 (NTAPI *PDIRTY_PAGE_ROUTINE) (
8016   IN PFILE_OBJECT FileObject,
8017   IN PLARGE_INTEGER FileOffset,
8018   IN ULONG Length,
8019   IN PLARGE_INTEGER OldestLsn,
8020   IN PLARGE_INTEGER NewestLsn,
8021   IN PVOID Context1,
8022   IN PVOID Context2);
8023 
8024 typedef VOID
8025 (NTAPI *PFLUSH_TO_LSN) (
8026   IN PVOID LogHandle,
8027   IN LARGE_INTEGER Lsn);
8028 
8029 typedef VOID
8030 (NTAPI *PCC_POST_DEFERRED_WRITE) (
8031   IN PVOID Context1,
8032   IN PVOID Context2);
8033 
8034 #define UNINITIALIZE_CACHE_MAPS          (1)
8035 #define DO_NOT_RETRY_PURGE               (2)
8036 #define DO_NOT_PURGE_DIRTY_PAGES         (0x4)
8037 
8038 #define CC_FLUSH_AND_PURGE_NO_PURGE     (0x1)
8039 /* Common Cache Functions */
8040 
8041 #define CcIsFileCached(FO) (                                                         \
8042     ((FO)->SectionObjectPointer != NULL) &&                                          \
8043     (((PSECTION_OBJECT_POINTERS)(FO)->SectionObjectPointer)->SharedCacheMap != NULL) \
8044 )
8045 
8046 extern ULONG CcFastMdlReadWait;
8047 
8048 #if (NTDDI_VERSION >= NTDDI_WIN2K)
8049 
8050 NTKERNELAPI
8051 VOID
8052 NTAPI
8053 CcInitializeCacheMap(
8054   IN PFILE_OBJECT FileObject,
8055   IN PCC_FILE_SIZES FileSizes,
8056   IN BOOLEAN PinAccess,
8057   IN PCACHE_MANAGER_CALLBACKS Callbacks,
8058   IN PVOID LazyWriteContext);
8059 
8060 NTKERNELAPI
8061 BOOLEAN
8062 NTAPI
8063 CcUninitializeCacheMap(
8064   IN PFILE_OBJECT FileObject,
8065   IN PLARGE_INTEGER TruncateSize OPTIONAL,
8066   IN PCACHE_UNINITIALIZE_EVENT UninitializeCompleteEvent OPTIONAL);
8067 
8068 NTKERNELAPI
8069 VOID
8070 NTAPI
8071 CcSetFileSizes(
8072   IN PFILE_OBJECT FileObject,
8073   IN PCC_FILE_SIZES FileSizes);
8074 
8075 NTKERNELAPI
8076 VOID
8077 NTAPI
8078 CcSetDirtyPageThreshold(
8079   IN PFILE_OBJECT FileObject,
8080   IN ULONG DirtyPageThreshold);
8081 
8082 NTKERNELAPI
8083 VOID
8084 NTAPI
8085 CcFlushCache(
8086   IN PSECTION_OBJECT_POINTERS SectionObjectPointer,
8087   IN PLARGE_INTEGER FileOffset OPTIONAL,
8088   IN ULONG Length,
8089   OUT PIO_STATUS_BLOCK IoStatus OPTIONAL);
8090 
8091 NTKERNELAPI
8092 LARGE_INTEGER
8093 NTAPI
8094 CcGetFlushedValidData(
8095   IN PSECTION_OBJECT_POINTERS SectionObjectPointer,
8096   IN BOOLEAN BcbListHeld);
8097 
8098 NTKERNELAPI
8099 BOOLEAN
8100 NTAPI
8101 CcZeroData(
8102   IN PFILE_OBJECT FileObject,
8103   IN PLARGE_INTEGER StartOffset,
8104   IN PLARGE_INTEGER EndOffset,
8105   IN BOOLEAN Wait);
8106 
8107 NTKERNELAPI
8108 PVOID
8109 NTAPI
8110 CcRemapBcb(
8111   IN PVOID Bcb);
8112 
8113 NTKERNELAPI
8114 VOID
8115 NTAPI
8116 CcRepinBcb(
8117   IN PVOID Bcb);
8118 
8119 NTKERNELAPI
8120 VOID
8121 NTAPI
8122 CcUnpinRepinnedBcb(
8123   IN PVOID Bcb,
8124   IN BOOLEAN WriteThrough,
8125   OUT PIO_STATUS_BLOCK IoStatus);
8126 
8127 NTKERNELAPI
8128 PFILE_OBJECT
8129 NTAPI
8130 CcGetFileObjectFromSectionPtrs(
8131   IN PSECTION_OBJECT_POINTERS SectionObjectPointer);
8132 
8133 NTKERNELAPI
8134 PFILE_OBJECT
8135 NTAPI
8136 CcGetFileObjectFromBcb(
8137   IN PVOID Bcb);
8138 
8139 NTKERNELAPI
8140 BOOLEAN
8141 NTAPI
8142 CcCanIWrite(
8143   IN PFILE_OBJECT FileObject,
8144   IN ULONG BytesToWrite,
8145   IN BOOLEAN Wait,
8146   IN BOOLEAN Retrying);
8147 
8148 NTKERNELAPI
8149 VOID
8150 NTAPI
8151 CcDeferWrite(
8152   IN PFILE_OBJECT FileObject,
8153   IN PCC_POST_DEFERRED_WRITE PostRoutine,
8154   IN PVOID Context1,
8155   IN PVOID Context2,
8156   IN ULONG BytesToWrite,
8157   IN BOOLEAN Retrying);
8158 
8159 NTKERNELAPI
8160 BOOLEAN
8161 NTAPI
8162 CcCopyRead(
8163   IN PFILE_OBJECT FileObject,
8164   IN PLARGE_INTEGER FileOffset,
8165   IN ULONG Length,
8166   IN BOOLEAN Wait,
8167   OUT PVOID Buffer,
8168   OUT PIO_STATUS_BLOCK IoStatus);
8169 
8170 NTKERNELAPI
8171 VOID
8172 NTAPI
8173 CcFastCopyRead(
8174   IN PFILE_OBJECT FileObject,
8175   IN ULONG FileOffset,
8176   IN ULONG Length,
8177   IN ULONG PageCount,
8178   OUT PVOID Buffer,
8179   OUT PIO_STATUS_BLOCK IoStatus);
8180 
8181 NTKERNELAPI
8182 BOOLEAN
8183 NTAPI
8184 CcCopyWrite(
8185   IN PFILE_OBJECT FileObject,
8186   IN PLARGE_INTEGER FileOffset,
8187   IN ULONG Length,
8188   IN BOOLEAN Wait,
8189   IN PVOID Buffer);
8190 
8191 NTKERNELAPI
8192 VOID
8193 NTAPI
8194 CcFastCopyWrite(
8195   IN PFILE_OBJECT FileObject,
8196   IN ULONG FileOffset,
8197   IN ULONG Length,
8198   IN PVOID Buffer);
8199 
8200 NTKERNELAPI
8201 VOID
8202 NTAPI
8203 CcMdlRead(
8204   IN PFILE_OBJECT FileObject,
8205   IN PLARGE_INTEGER FileOffset,
8206   IN ULONG Length,
8207   OUT PMDL *MdlChain,
8208   OUT PIO_STATUS_BLOCK IoStatus);
8209 
8210 NTKERNELAPI
8211 VOID
8212 NTAPI
8213 CcMdlReadComplete(
8214   IN PFILE_OBJECT FileObject,
8215   IN PMDL MdlChain);
8216 
8217 NTKERNELAPI
8218 VOID
8219 NTAPI
8220 CcPrepareMdlWrite(
8221   IN PFILE_OBJECT FileObject,
8222   IN PLARGE_INTEGER FileOffset,
8223   IN ULONG Length,
8224   OUT PMDL *MdlChain,
8225   OUT PIO_STATUS_BLOCK IoStatus);
8226 
8227 NTKERNELAPI
8228 VOID
8229 NTAPI
8230 CcMdlWriteComplete(
8231   IN PFILE_OBJECT FileObject,
8232   IN PLARGE_INTEGER FileOffset,
8233   IN PMDL MdlChain);
8234 
8235 NTKERNELAPI
8236 VOID
8237 NTAPI
8238 CcScheduleReadAhead(
8239   IN PFILE_OBJECT FileObject,
8240   IN PLARGE_INTEGER FileOffset,
8241   IN ULONG Length);
8242 
8243 NTKERNELAPI
8244 NTSTATUS
8245 NTAPI
8246 CcWaitForCurrentLazyWriterActivity(
8247   VOID);
8248 
8249 NTKERNELAPI
8250 VOID
8251 NTAPI
8252 CcSetReadAheadGranularity(
8253   IN PFILE_OBJECT FileObject,
8254   IN ULONG Granularity);
8255 
8256 NTKERNELAPI
8257 BOOLEAN
8258 NTAPI
8259 CcPinRead(
8260   IN PFILE_OBJECT FileObject,
8261   IN PLARGE_INTEGER FileOffset,
8262   IN ULONG Length,
8263   IN ULONG Flags,
8264   OUT PVOID *Bcb,
8265   OUT PVOID *Buffer);
8266 
8267 NTKERNELAPI
8268 BOOLEAN
8269 NTAPI
8270 CcPinMappedData(
8271   IN PFILE_OBJECT FileObject,
8272   IN PLARGE_INTEGER FileOffset,
8273   IN ULONG Length,
8274   IN ULONG Flags,
8275   IN OUT PVOID *Bcb);
8276 
8277 NTKERNELAPI
8278 BOOLEAN
8279 NTAPI
8280 CcPreparePinWrite(
8281   IN PFILE_OBJECT FileObject,
8282   IN PLARGE_INTEGER FileOffset,
8283   IN ULONG Length,
8284   IN BOOLEAN Zero,
8285   IN ULONG Flags,
8286   OUT PVOID *Bcb,
8287   OUT PVOID *Buffer);
8288 
8289 NTKERNELAPI
8290 VOID
8291 NTAPI
8292 CcSetDirtyPinnedData(
8293   IN PVOID BcbVoid,
8294   IN PLARGE_INTEGER Lsn OPTIONAL);
8295 
8296 NTKERNELAPI
8297 VOID
8298 NTAPI
8299 CcUnpinData(
8300   IN PVOID Bcb);
8301 
8302 NTKERNELAPI
8303 VOID
8304 NTAPI
8305 CcSetBcbOwnerPointer(
8306   IN PVOID Bcb,
8307   IN PVOID OwnerPointer);
8308 
8309 NTKERNELAPI
8310 VOID
8311 NTAPI
8312 CcUnpinDataForThread(
8313   IN PVOID Bcb,
8314   IN ERESOURCE_THREAD ResourceThreadId);
8315 
8316 NTKERNELAPI
8317 VOID
8318 NTAPI
8319 CcSetAdditionalCacheAttributes(
8320   IN PFILE_OBJECT FileObject,
8321   IN BOOLEAN DisableReadAhead,
8322   IN BOOLEAN DisableWriteBehind);
8323 
8324 NTKERNELAPI
8325 BOOLEAN
8326 NTAPI
8327 CcIsThereDirtyData(
8328   IN PVPB Vpb);
8329 
8330 #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
8331 
8332 #if (NTDDI_VERSION >= NTDDI_WINXP)
8333 
8334 NTKERNELAPI
8335 VOID
8336 NTAPI
8337 CcMdlWriteAbort(
8338   IN PFILE_OBJECT FileObject,
8339   IN PMDL MdlChain);
8340 
8341 NTKERNELAPI
8342 VOID
8343 NTAPI
8344 CcSetLogHandleForFile(
8345   IN PFILE_OBJECT FileObject,
8346   IN PVOID LogHandle,
8347   IN PFLUSH_TO_LSN FlushToLsnRoutine);
8348 
8349 NTKERNELAPI
8350 LARGE_INTEGER
8351 NTAPI
8352 CcGetDirtyPages(
8353   IN PVOID LogHandle,
8354   IN PDIRTY_PAGE_ROUTINE DirtyPageRoutine,
8355   IN PVOID Context1,
8356   IN PVOID Context2);
8357 
8358 #endif
8359 
8360 #if (NTDDI_VERSION >= NTDDI_WINXP)
8361 NTKERNELAPI
8362 BOOLEAN
8363 NTAPI
8364 CcMapData(
8365   IN PFILE_OBJECT FileObject,
8366   IN PLARGE_INTEGER FileOffset,
8367   IN ULONG Length,
8368   IN ULONG Flags,
8369   OUT PVOID *Bcb,
8370   OUT PVOID *Buffer);
8371 #elif (NTDDI_VERSION >= NTDDI_WIN2K)
8372 NTKERNELAPI
8373 BOOLEAN
8374 NTAPI
8375 CcMapData(
8376   IN PFILE_OBJECT FileObject,
8377   IN PLARGE_INTEGER FileOffset,
8378   IN ULONG Length,
8379   IN BOOLEAN Wait,
8380   OUT PVOID *Bcb,
8381   OUT PVOID *Buffer);
8382 #endif
8383 
8384 #if (NTDDI_VERSION >= NTDDI_VISTA)
8385 
8386 NTKERNELAPI
8387 NTSTATUS
8388 NTAPI
8389 CcSetFileSizesEx(
8390   IN PFILE_OBJECT FileObject,
8391   IN PCC_FILE_SIZES FileSizes);
8392 
8393 NTKERNELAPI
8394 PFILE_OBJECT
8395 NTAPI
8396 CcGetFileObjectFromSectionPtrsRef(
8397   IN PSECTION_OBJECT_POINTERS SectionObjectPointer);
8398 
8399 NTKERNELAPI
8400 VOID
8401 NTAPI
8402 CcSetParallelFlushFile(
8403   IN PFILE_OBJECT FileObject,
8404   IN BOOLEAN EnableParallelFlush);
8405 
8406 NTKERNELAPI
8407 BOOLEAN
8408 CcIsThereDirtyDataEx(
8409   IN PVPB Vpb,
8410   IN PULONG NumberOfDirtyPages OPTIONAL);
8411 
8412 #endif
8413 
8414 #if (NTDDI_VERSION >= NTDDI_WIN7)
8415 NTKERNELAPI
8416 VOID
8417 NTAPI
8418 CcCoherencyFlushAndPurgeCache(
8419   IN PSECTION_OBJECT_POINTERS SectionObjectPointer,
8420   IN PLARGE_INTEGER FileOffset OPTIONAL,
8421   IN ULONG Length,
8422   OUT PIO_STATUS_BLOCK IoStatus,
8423   IN ULONG Flags OPTIONAL);
8424 #endif
8425 
8426 #define CcGetFileSizePointer(FO) (                                     \
8427     ((PLARGE_INTEGER)((FO)->SectionObjectPointer->SharedCacheMap) + 1) \
8428 )
8429 
8430 #if (NTDDI_VERSION >= NTDDI_VISTA)
8431 NTKERNELAPI
8432 BOOLEAN
8433 NTAPI
8434 CcPurgeCacheSection(
8435   IN PSECTION_OBJECT_POINTERS SectionObjectPointer,
8436   IN PLARGE_INTEGER FileOffset OPTIONAL,
8437   IN ULONG Length,
8438   IN ULONG Flags);
8439 #elif (NTDDI_VERSION >= NTDDI_WIN2K)
8440 NTKERNELAPI
8441 BOOLEAN
8442 NTAPI
8443 CcPurgeCacheSection(
8444   IN PSECTION_OBJECT_POINTERS SectionObjectPointer,
8445   IN PLARGE_INTEGER FileOffset OPTIONAL,
8446   IN ULONG Length,
8447   IN BOOLEAN UninitializeCacheMaps);
8448 #endif
8449 
8450 #if (NTDDI_VERSION >= NTDDI_WIN7)
8451 NTKERNELAPI
8452 BOOLEAN
8453 NTAPI
8454 CcCopyWriteWontFlush(
8455   IN PFILE_OBJECT FileObject,
8456   IN PLARGE_INTEGER FileOffset,
8457   IN ULONG Length);
8458 #else
8459 #define CcCopyWriteWontFlush(FO, FOFF, LEN) ((LEN) <= 0x10000)
8460 #endif
8461 
8462 #define CcReadAhead(FO, FOFF, LEN) (                \
8463     if ((LEN) >= 256) {                             \
8464         CcScheduleReadAhead((FO), (FOFF), (LEN));   \
8465     }                                               \
8466 )
8467 
8468 
8469 /******************************************************************************
8470  *                            ZwXxx Functions                                 *
8471  ******************************************************************************/
8472 
8473 NTSYSAPI
8474 NTSTATUS
8475 NTAPI
8476 ZwQueryEaFile(
8477   IN HANDLE FileHandle,
8478   OUT PIO_STATUS_BLOCK IoStatusBlock,
8479   OUT PVOID Buffer,
8480   IN ULONG Length,
8481   IN BOOLEAN ReturnSingleEntry,
8482   IN PVOID EaList OPTIONAL,
8483   IN ULONG EaListLength,
8484   IN PULONG EaIndex OPTIONAL,
8485   IN BOOLEAN RestartScan);
8486 
8487 NTSYSAPI
8488 NTSTATUS
8489 NTAPI
8490 ZwSetEaFile(
8491   IN HANDLE FileHandle,
8492   OUT PIO_STATUS_BLOCK IoStatusBlock,
8493   OUT PVOID Buffer,
8494   IN ULONG Length);
8495 
8496 NTSYSAPI
8497 NTSTATUS
8498 NTAPI
8499 ZwDuplicateToken(
8500   IN HANDLE ExistingTokenHandle,
8501   IN ACCESS_MASK DesiredAccess,
8502   IN POBJECT_ATTRIBUTES ObjectAttributes,
8503   IN BOOLEAN EffectiveOnly,
8504   IN TOKEN_TYPE TokenType,
8505   OUT PHANDLE NewTokenHandle);
8506 
8507 #if (NTDDI_VERSION >= NTDDI_WIN2K)
8508 
8509 NTSYSAPI
8510 NTSTATUS
8511 NTAPI
8512 ZwQueryObject(
8513   IN HANDLE Handle OPTIONAL,
8514   IN OBJECT_INFORMATION_CLASS ObjectInformationClass,
8515   OUT PVOID ObjectInformation OPTIONAL,
8516   IN ULONG ObjectInformationLength,
8517   OUT PULONG ReturnLength OPTIONAL);
8518 
8519 NTSYSAPI
8520 NTSTATUS
8521 NTAPI
8522 ZwNotifyChangeKey(
8523   IN HANDLE KeyHandle,
8524   IN HANDLE EventHandle OPTIONAL,
8525   IN PIO_APC_ROUTINE ApcRoutine OPTIONAL,
8526   IN PVOID ApcContext OPTIONAL,
8527   OUT PIO_STATUS_BLOCK IoStatusBlock,
8528   IN ULONG NotifyFilter,
8529   IN BOOLEAN WatchSubtree,
8530   OUT PVOID Buffer,
8531   IN ULONG BufferLength,
8532   IN BOOLEAN Asynchronous);
8533 
8534 NTSYSAPI
8535 NTSTATUS
8536 NTAPI
8537 ZwCreateEvent(
8538   OUT PHANDLE EventHandle,
8539   IN ACCESS_MASK DesiredAccess,
8540   IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,
8541   IN EVENT_TYPE EventType,
8542   IN BOOLEAN InitialState);
8543 
8544 NTSYSAPI
8545 NTSTATUS
8546 NTAPI
8547 ZwDeleteFile(
8548   IN POBJECT_ATTRIBUTES ObjectAttributes);
8549 
8550 NTSYSAPI
8551 NTSTATUS
8552 NTAPI
8553 ZwQueryDirectoryFile(
8554   IN HANDLE FileHandle,
8555   IN HANDLE Event OPTIONAL,
8556   IN PIO_APC_ROUTINE ApcRoutine OPTIONAL,
8557   IN PVOID ApcContext OPTIONAL,
8558   OUT PIO_STATUS_BLOCK IoStatusBlock,
8559   OUT PVOID FileInformation,
8560   IN ULONG Length,
8561   IN FILE_INFORMATION_CLASS FileInformationClass,
8562   IN BOOLEAN ReturnSingleEntry,
8563   IN PUNICODE_STRING FileName OPTIONAL,
8564   IN BOOLEAN RestartScan);
8565 
8566 NTSYSAPI
8567 NTSTATUS
8568 NTAPI
8569 ZwSetVolumeInformationFile(
8570   IN HANDLE FileHandle,
8571   OUT PIO_STATUS_BLOCK IoStatusBlock,
8572   IN PVOID FsInformation,
8573   IN ULONG Length,
8574   IN FS_INFORMATION_CLASS FsInformationClass);
8575 
8576 NTSYSAPI
8577 NTSTATUS
8578 NTAPI
8579 ZwFsControlFile(
8580   IN HANDLE FileHandle,
8581   IN HANDLE Event OPTIONAL,
8582   IN PIO_APC_ROUTINE ApcRoutine OPTIONAL,
8583   IN PVOID ApcContext OPTIONAL,
8584   OUT PIO_STATUS_BLOCK IoStatusBlock,
8585   IN ULONG FsControlCode,
8586   IN PVOID InputBuffer OPTIONAL,
8587   IN ULONG InputBufferLength,
8588   OUT PVOID OutputBuffer OPTIONAL,
8589   IN ULONG OutputBufferLength);
8590 
8591 NTSYSAPI
8592 NTSTATUS
8593 NTAPI
8594 ZwDuplicateObject(
8595   IN HANDLE SourceProcessHandle,
8596   IN HANDLE SourceHandle,
8597   IN HANDLE TargetProcessHandle OPTIONAL,
8598   OUT PHANDLE TargetHandle OPTIONAL,
8599   IN ACCESS_MASK DesiredAccess,
8600   IN ULONG HandleAttributes,
8601   IN ULONG Options);
8602 
8603 NTSYSAPI
8604 NTSTATUS
8605 NTAPI
8606 ZwOpenDirectoryObject(
8607   OUT PHANDLE DirectoryHandle,
8608   IN ACCESS_MASK DesiredAccess,
8609   IN POBJECT_ATTRIBUTES ObjectAttributes);
8610 
8611 NTSYSAPI
8612 NTSTATUS
8613 NTAPI
8614 ZwAllocateVirtualMemory(
8615   IN HANDLE ProcessHandle,
8616   IN OUT PVOID *BaseAddress,
8617   IN ULONG_PTR ZeroBits,
8618   IN OUT PSIZE_T RegionSize,
8619   IN ULONG AllocationType,
8620   IN ULONG Protect);
8621 
8622 NTSYSAPI
8623 NTSTATUS
8624 NTAPI
8625 ZwFreeVirtualMemory(
8626   IN HANDLE ProcessHandle,
8627   IN OUT PVOID *BaseAddress,
8628   IN OUT PSIZE_T RegionSize,
8629   IN ULONG FreeType);
8630 
8631 NTSYSAPI
8632 NTSTATUS
8633 NTAPI
8634 ZwWaitForSingleObject(
8635   IN HANDLE Handle,
8636   IN BOOLEAN Alertable,
8637   IN PLARGE_INTEGER Timeout OPTIONAL);
8638 
8639 NTSYSAPI
8640 NTSTATUS
8641 NTAPI
8642 ZwSetEvent(
8643   IN HANDLE EventHandle,
8644   OUT PLONG PreviousState OPTIONAL);
8645 
8646 NTSYSAPI
8647 NTSTATUS
8648 NTAPI
8649 ZwFlushVirtualMemory(
8650   IN HANDLE ProcessHandle,
8651   IN OUT PVOID *BaseAddress,
8652   IN OUT PSIZE_T RegionSize,
8653   OUT PIO_STATUS_BLOCK IoStatusBlock);
8654 
8655 NTSYSAPI
8656 NTSTATUS
8657 NTAPI
8658 ZwQueryInformationToken(
8659   IN HANDLE TokenHandle,
8660   IN TOKEN_INFORMATION_CLASS TokenInformationClass,
8661   OUT PVOID TokenInformation,
8662   IN ULONG Length,
8663   OUT PULONG ResultLength);
8664 
8665 NTSYSAPI
8666 NTSTATUS
8667 NTAPI
8668 ZwSetSecurityObject(
8669   IN HANDLE Handle,
8670   IN SECURITY_INFORMATION SecurityInformation,
8671   IN PSECURITY_DESCRIPTOR SecurityDescriptor);
8672 
8673 NTSYSAPI
8674 NTSTATUS
8675 NTAPI
8676 ZwQuerySecurityObject(
8677   IN HANDLE FileHandle,
8678   IN SECURITY_INFORMATION SecurityInformation,
8679   OUT PSECURITY_DESCRIPTOR SecurityDescriptor,
8680   IN ULONG Length,
8681   OUT PULONG ResultLength);
8682 #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
8683 
8684 #if (NTDDI_VERSION >= NTDDI_WINXP)
8685 
8686 NTSYSAPI
8687 NTSTATUS
8688 NTAPI
8689 ZwOpenProcessTokenEx(
8690   IN HANDLE ProcessHandle,
8691   IN ACCESS_MASK DesiredAccess,
8692   IN ULONG HandleAttributes,
8693   OUT PHANDLE TokenHandle);
8694 
8695 NTSYSAPI
8696 NTSTATUS
8697 NTAPI
8698 ZwOpenThreadTokenEx(
8699   IN HANDLE ThreadHandle,
8700   IN ACCESS_MASK DesiredAccess,
8701   IN BOOLEAN OpenAsSelf,
8702   IN ULONG HandleAttributes,
8703   OUT PHANDLE TokenHandle);
8704 
8705 #endif /* (NTDDI_VERSION >= NTDDI_WINXP) */
8706 
8707 #if (NTDDI_VERSION >= NTDDI_VISTA)
8708 
8709 NTSYSAPI
8710 NTSTATUS
8711 NTAPI
8712 ZwLockFile(
8713   IN HANDLE FileHandle,
8714   IN HANDLE Event OPTIONAL,
8715   IN PIO_APC_ROUTINE ApcRoutine OPTIONAL,
8716   IN PVOID ApcContext OPTIONAL,
8717   OUT PIO_STATUS_BLOCK IoStatusBlock,
8718   IN PLARGE_INTEGER ByteOffset,
8719   IN PLARGE_INTEGER Length,
8720   IN ULONG Key,
8721   IN BOOLEAN FailImmediately,
8722   IN BOOLEAN ExclusiveLock);
8723 
8724 NTSYSAPI
8725 NTSTATUS
8726 NTAPI
8727 ZwUnlockFile(
8728   IN HANDLE FileHandle,
8729   OUT PIO_STATUS_BLOCK IoStatusBlock,
8730   IN PLARGE_INTEGER ByteOffset,
8731   IN PLARGE_INTEGER Length,
8732   IN ULONG Key);
8733 
8734 NTSYSAPI
8735 NTSTATUS
8736 NTAPI
8737 ZwQueryQuotaInformationFile(
8738   IN HANDLE FileHandle,
8739   OUT PIO_STATUS_BLOCK IoStatusBlock,
8740   OUT PVOID Buffer,
8741   IN ULONG Length,
8742   IN BOOLEAN ReturnSingleEntry,
8743   IN PVOID SidList,
8744   IN ULONG SidListLength,
8745   IN PSID StartSid OPTIONAL,
8746   IN BOOLEAN RestartScan);
8747 
8748 NTSYSAPI
8749 NTSTATUS
8750 NTAPI
8751 ZwSetQuotaInformationFile(
8752   IN HANDLE FileHandle,
8753   OUT PIO_STATUS_BLOCK IoStatusBlock,
8754   IN PVOID Buffer,
8755   IN ULONG Length);
8756 
8757 NTSYSAPI
8758 NTSTATUS
8759 NTAPI
8760 ZwFlushBuffersFile(
8761   IN HANDLE FileHandle,
8762   OUT PIO_STATUS_BLOCK IoStatusBlock);
8763 #endif /* (NTDDI_VERSION >= NTDDI_VISTA) */
8764 
8765 #if (NTDDI_VERSION >= NTDDI_WIN7)
8766 
8767 NTSYSAPI
8768 NTSTATUS
8769 NTAPI
8770 ZwSetInformationToken(
8771   IN HANDLE TokenHandle,
8772   IN TOKEN_INFORMATION_CLASS TokenInformationClass,
8773   IN PVOID TokenInformation,
8774   IN ULONG TokenInformationLength);
8775 #endif /* (NTDDI_VERSION >= NTDDI_WIN7) */
8776 
8777 
8778 /* #if !defined(_X86AMD64_)  FIXME : WHAT ?! */
8779 #if defined(_WIN64)
8780 
8781 C_ASSERT(sizeof(ERESOURCE) == 0x68);
8782 C_ASSERT(FIELD_OFFSET(ERESOURCE,ActiveCount) == 0x18);
8783 C_ASSERT(FIELD_OFFSET(ERESOURCE,Flag) == 0x1a);
8784 
8785 #else
8786 
8787 C_ASSERT(sizeof(ERESOURCE) == 0x38);
8788 C_ASSERT(FIELD_OFFSET(ERESOURCE,ActiveCount) == 0x0c);
8789 C_ASSERT(FIELD_OFFSET(ERESOURCE,Flag) == 0x0e);
8790 
8791 #endif
8792 /* #endif */
8793 
8794 #if defined(_IA64_)
8795 #if (NTDDI_VERSION >= NTDDI_WIN2K)
8796 //DECLSPEC_DEPRECATED_DDK
8797 NTHALAPI
8798 ULONG
8799 NTAPI
8800 HalGetDmaAlignmentRequirement(
8801   VOID);
8802 #endif
8803 #endif
8804 
8805 #if defined(_M_IX86) || defined(_M_AMD64)
8806 #define HalGetDmaAlignmentRequirement() 1L
8807 #endif
8808 
8809 extern NTKERNELAPI PUSHORT NlsOemLeadByteInfo;
8810 #define NLS_OEM_LEAD_BYTE_INFO            NlsOemLeadByteInfo
8811 
8812 #ifdef NLS_MB_CODE_PAGE_TAG
8813 #undef NLS_MB_CODE_PAGE_TAG
8814 #endif
8815 #define NLS_MB_CODE_PAGE_TAG              NlsMbOemCodePageTag
8816 
8817 #if (NTDDI_VERSION >= NTDDI_VISTA)
8818 
8819 typedef enum _NETWORK_OPEN_LOCATION_QUALIFIER {
8820   NetworkOpenLocationAny,
8821   NetworkOpenLocationRemote,
8822   NetworkOpenLocationLoopback
8823 } NETWORK_OPEN_LOCATION_QUALIFIER;
8824 
8825 typedef enum _NETWORK_OPEN_INTEGRITY_QUALIFIER {
8826   NetworkOpenIntegrityAny,
8827   NetworkOpenIntegrityNone,
8828   NetworkOpenIntegritySigned,
8829   NetworkOpenIntegrityEncrypted,
8830   NetworkOpenIntegrityMaximum
8831 } NETWORK_OPEN_INTEGRITY_QUALIFIER;
8832 
8833 #if (NTDDI_VERSION >= NTDDI_WIN7)
8834 
8835 #define NETWORK_OPEN_ECP_IN_FLAG_DISABLE_HANDLE_COLLAPSING 0x1
8836 #define NETWORK_OPEN_ECP_IN_FLAG_DISABLE_HANDLE_DURABILITY 0x2
8837 #define NETWORK_OPEN_ECP_IN_FLAG_FORCE_BUFFERED_SYNCHRONOUS_IO_HACK 0x80000000
8838 
8839 typedef struct _NETWORK_OPEN_ECP_CONTEXT {
8840   USHORT Size;
8841   USHORT Reserved;
8842   _ANONYMOUS_STRUCT struct {
8843     struct {
8844       NETWORK_OPEN_LOCATION_QUALIFIER Location;
8845       NETWORK_OPEN_INTEGRITY_QUALIFIER Integrity;
8846       ULONG Flags;
8847     } in;
8848     struct {
8849       NETWORK_OPEN_LOCATION_QUALIFIER Location;
8850       NETWORK_OPEN_INTEGRITY_QUALIFIER Integrity;
8851       ULONG Flags;
8852     } out;
8853   } DUMMYSTRUCTNAME;
8854 } NETWORK_OPEN_ECP_CONTEXT, *PNETWORK_OPEN_ECP_CONTEXT;
8855 
8856 typedef struct _NETWORK_OPEN_ECP_CONTEXT_V0 {
8857   USHORT Size;
8858   USHORT Reserved;
8859   _ANONYMOUS_STRUCT struct {
8860     struct {
8861     NETWORK_OPEN_LOCATION_QUALIFIER Location;
8862     NETWORK_OPEN_INTEGRITY_QUALIFIER Integrity;
8863     } in;
8864     struct {
8865       NETWORK_OPEN_LOCATION_QUALIFIER Location;
8866       NETWORK_OPEN_INTEGRITY_QUALIFIER Integrity;
8867     } out;
8868   } DUMMYSTRUCTNAME;
8869 } NETWORK_OPEN_ECP_CONTEXT_V0, *PNETWORK_OPEN_ECP_CONTEXT_V0;
8870 
8871 #elif (NTDDI_VERSION >= NTDDI_VISTA)
8872 typedef struct _NETWORK_OPEN_ECP_CONTEXT {
8873   USHORT Size;
8874   USHORT Reserved;
8875   _ANONYMOUS_STRUCT struct {
8876     struct {
8877       NETWORK_OPEN_LOCATION_QUALIFIER Location;
8878       NETWORK_OPEN_INTEGRITY_QUALIFIER Integrity;
8879     } in;
8880     struct {
8881       NETWORK_OPEN_LOCATION_QUALIFIER Location;
8882       NETWORK_OPEN_INTEGRITY_QUALIFIER Integrity;
8883     } out;
8884   } DUMMYSTRUCTNAME;
8885 } NETWORK_OPEN_ECP_CONTEXT, *PNETWORK_OPEN_ECP_CONTEXT;
8886 #endif
8887 
8888 DEFINE_GUID(GUID_ECP_NETWORK_OPEN_CONTEXT, 0xc584edbf, 0x00df, 0x4d28, 0xb8, 0x84, 0x35, 0xba, 0xca, 0x89, 0x11, 0xe8);
8889 
8890 #endif /* (NTDDI_VERSION >= NTDDI_VISTA) */
8891 
8892 
8893 #if (NTDDI_VERSION >= NTDDI_VISTA)
8894 
8895 typedef struct _PREFETCH_OPEN_ECP_CONTEXT {
8896   PVOID Context;
8897 } PREFETCH_OPEN_ECP_CONTEXT, *PPREFETCH_OPEN_ECP_CONTEXT;
8898 
8899 DEFINE_GUID(GUID_ECP_PREFETCH_OPEN, 0xe1777b21, 0x847e, 0x4837, 0xaa, 0x45, 0x64, 0x16, 0x1d, 0x28, 0x6, 0x55);
8900 
8901 #endif /* (NTDDI_VERSION >= NTDDI_VISTA) */
8902 
8903 #if (NTDDI_VERSION >= NTDDI_WIN7)
8904 
8905 DEFINE_GUID (GUID_ECP_NFS_OPEN, 0xf326d30c, 0xe5f8, 0x4fe7, 0xab, 0x74, 0xf5, 0xa3, 0x19, 0x6d, 0x92, 0xdb);
8906 DEFINE_GUID (GUID_ECP_SRV_OPEN, 0xbebfaebc, 0xaabf, 0x489d, 0x9d, 0x2c, 0xe9, 0xe3, 0x61, 0x10, 0x28, 0x53);
8907 
8908 typedef struct sockaddr_storage *PSOCKADDR_STORAGE_NFS;
8909 
8910 typedef struct _NFS_OPEN_ECP_CONTEXT {
8911   PUNICODE_STRING ExportAlias;
8912   PSOCKADDR_STORAGE_NFS ClientSocketAddress;
8913 } NFS_OPEN_ECP_CONTEXT, *PNFS_OPEN_ECP_CONTEXT, **PPNFS_OPEN_ECP_CONTEXT;
8914 
8915 typedef struct _SRV_OPEN_ECP_CONTEXT {
8916   PUNICODE_STRING ShareName;
8917   PSOCKADDR_STORAGE_NFS SocketAddress;
8918   BOOLEAN OplockBlockState;
8919   BOOLEAN OplockAppState;
8920   BOOLEAN OplockFinalState;
8921 } SRV_OPEN_ECP_CONTEXT, *PSRV_OPEN_ECP_CONTEXT;
8922 
8923 #endif /* (NTDDI_VERSION >= NTDDI_WIN7) */
8924 
8925 #define PIN_WAIT                        (1)
8926 #define PIN_EXCLUSIVE                   (2)
8927 #define PIN_NO_READ                     (4)
8928 #define PIN_IF_BCB                      (8)
8929 #define PIN_CALLER_TRACKS_DIRTY_DATA    (32)
8930 #define PIN_HIGH_PRIORITY               (64)
8931 
8932 #define MAP_WAIT                        1
8933 #define MAP_NO_READ                     (16)
8934 #define MAP_HIGH_PRIORITY               (64)
8935 
8936 #define IOCTL_REDIR_QUERY_PATH          CTL_CODE(FILE_DEVICE_NETWORK_FILE_SYSTEM, 99, METHOD_NEITHER, FILE_ANY_ACCESS)
8937 #define IOCTL_REDIR_QUERY_PATH_EX       CTL_CODE(FILE_DEVICE_NETWORK_FILE_SYSTEM, 100, METHOD_NEITHER, FILE_ANY_ACCESS)
8938 
8939 typedef struct _QUERY_PATH_REQUEST {
8940   ULONG PathNameLength;
8941   PIO_SECURITY_CONTEXT SecurityContext;
8942   WCHAR FilePathName[1];
8943 } QUERY_PATH_REQUEST, *PQUERY_PATH_REQUEST;
8944 
8945 typedef struct _QUERY_PATH_REQUEST_EX {
8946   PIO_SECURITY_CONTEXT pSecurityContext;
8947   ULONG EaLength;
8948   PVOID pEaBuffer;
8949   UNICODE_STRING PathName;
8950   UNICODE_STRING DomainServiceName;
8951   ULONG_PTR Reserved[ 3 ];
8952 } QUERY_PATH_REQUEST_EX, *PQUERY_PATH_REQUEST_EX;
8953 
8954 typedef struct _QUERY_PATH_RESPONSE {
8955   ULONG LengthAccepted;
8956 } QUERY_PATH_RESPONSE, *PQUERY_PATH_RESPONSE;
8957 
8958 #define VOLSNAPCONTROLTYPE                              0x00000053
8959 #define IOCTL_VOLSNAP_FLUSH_AND_HOLD_WRITES             CTL_CODE(VOLSNAPCONTROLTYPE, 0, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
8960 
8961 /* FIXME : These definitions below don't belong here (or anywhere in ddk really) */
8962 #pragma pack(push,4)
8963 
8964 #ifndef VER_PRODUCTBUILD
8965 #define VER_PRODUCTBUILD 10000
8966 #endif
8967 
8968 #include "csq.h"
8969 
8970 extern PACL                         SePublicDefaultDacl;
8971 extern PACL                         SeSystemDefaultDacl;
8972 
8973 #define FS_LFN_APIS                             0x00004000
8974 
8975 #define FILE_STORAGE_TYPE_SPECIFIED             0x00000041  /* FILE_DIRECTORY_FILE | FILE_NON_DIRECTORY_FILE */
8976 #define FILE_STORAGE_TYPE_DEFAULT               (StorageTypeDefault << FILE_STORAGE_TYPE_SHIFT)
8977 #define FILE_STORAGE_TYPE_DIRECTORY             (StorageTypeDirectory << FILE_STORAGE_TYPE_SHIFT)
8978 #define FILE_STORAGE_TYPE_FILE                  (StorageTypeFile << FILE_STORAGE_TYPE_SHIFT)
8979 #define FILE_STORAGE_TYPE_DOCFILE               (StorageTypeDocfile << FILE_STORAGE_TYPE_SHIFT)
8980 #define FILE_STORAGE_TYPE_JUNCTION_POINT        (StorageTypeJunctionPoint << FILE_STORAGE_TYPE_SHIFT)
8981 #define FILE_STORAGE_TYPE_CATALOG               (StorageTypeCatalog << FILE_STORAGE_TYPE_SHIFT)
8982 #define FILE_STORAGE_TYPE_STRUCTURED_STORAGE    (StorageTypeStructuredStorage << FILE_STORAGE_TYPE_SHIFT)
8983 #define FILE_STORAGE_TYPE_EMBEDDING             (StorageTypeEmbedding << FILE_STORAGE_TYPE_SHIFT)
8984 #define FILE_STORAGE_TYPE_STREAM                (StorageTypeStream << FILE_STORAGE_TYPE_SHIFT)
8985 #define FILE_MINIMUM_STORAGE_TYPE               FILE_STORAGE_TYPE_DEFAULT
8986 #define FILE_MAXIMUM_STORAGE_TYPE               FILE_STORAGE_TYPE_STREAM
8987 #define FILE_STORAGE_TYPE_MASK                  0x000f0000
8988 #define FILE_STORAGE_TYPE_SHIFT                 16
8989 
8990 #define FILE_VC_QUOTAS_LOG_VIOLATIONS           0x00000004
8991 
8992 #ifdef _X86_
8993 #define HARDWARE_PTE    HARDWARE_PTE_X86
8994 #define PHARDWARE_PTE   PHARDWARE_PTE_X86
8995 #endif
8996 
8997 #define IO_ATTACH_DEVICE_API            0x80000000
8998 
8999 #define IO_TYPE_APC                     18
9000 #define IO_TYPE_DPC                     19
9001 #define IO_TYPE_DEVICE_QUEUE            20
9002 #define IO_TYPE_EVENT_PAIR              21
9003 #define IO_TYPE_INTERRUPT               22
9004 #define IO_TYPE_PROFILE                 23
9005 
9006 #define IRP_BEING_VERIFIED              0x10
9007 
9008 #define MAILSLOT_CLASS_FIRSTCLASS       1
9009 #define MAILSLOT_CLASS_SECONDCLASS      2
9010 
9011 #define MAILSLOT_SIZE_AUTO              0
9012 
9013 #define MEM_DOS_LIM                     0x40000000
9014 
9015 #define OB_TYPE_TYPE                    1
9016 #define OB_TYPE_DIRECTORY               2
9017 #define OB_TYPE_SYMBOLIC_LINK           3
9018 #define OB_TYPE_TOKEN                   4
9019 #define OB_TYPE_PROCESS                 5
9020 #define OB_TYPE_THREAD                  6
9021 #define OB_TYPE_EVENT                   7
9022 #define OB_TYPE_EVENT_PAIR              8
9023 #define OB_TYPE_MUTANT                  9
9024 #define OB_TYPE_SEMAPHORE               10
9025 #define OB_TYPE_TIMER                   11
9026 #define OB_TYPE_PROFILE                 12
9027 #define OB_TYPE_WINDOW_STATION          13
9028 #define OB_TYPE_DESKTOP                 14
9029 #define OB_TYPE_SECTION                 15
9030 #define OB_TYPE_KEY                     16
9031 #define OB_TYPE_PORT                    17
9032 #define OB_TYPE_ADAPTER                 18
9033 #define OB_TYPE_CONTROLLER              19
9034 #define OB_TYPE_DEVICE                  20
9035 #define OB_TYPE_DRIVER                  21
9036 #define OB_TYPE_IO_COMPLETION           22
9037 #define OB_TYPE_FILE                    23
9038 
9039 #define SEC_BASED 0x00200000
9040 
9041 /* end winnt.h */
9042 
9043 #define TOKEN_HAS_ADMIN_GROUP           0x08
9044 
9045 #if (VER_PRODUCTBUILD >= 1381)
9046 #define FSCTL_GET_HFS_INFORMATION       CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 31, METHOD_BUFFERED, FILE_ANY_ACCESS)
9047 #endif /* (VER_PRODUCTBUILD >= 1381) */
9048 
9049 #if (VER_PRODUCTBUILD >= 2195)
9050 
9051 #define FSCTL_READ_PROPERTY_DATA        CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 33, METHOD_NEITHER, FILE_ANY_ACCESS)
9052 #define FSCTL_WRITE_PROPERTY_DATA       CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 34, METHOD_NEITHER, FILE_ANY_ACCESS)
9053 
9054 #define FSCTL_DUMP_PROPERTY_DATA        CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 37,  METHOD_NEITHER, FILE_ANY_ACCESS)
9055 
9056 #define FSCTL_HSM_MSG                   CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 66, METHOD_BUFFERED, FILE_READ_DATA | FILE_WRITE_DATA)
9057 #define FSCTL_NSS_CONTROL               CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 67, METHOD_BUFFERED, FILE_WRITE_DATA)
9058 #define FSCTL_HSM_DATA                  CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 68, METHOD_NEITHER, FILE_READ_DATA | FILE_WRITE_DATA)
9059 #define FSCTL_NSS_RCONTROL              CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 70, METHOD_BUFFERED, FILE_READ_DATA)
9060 #endif /* (VER_PRODUCTBUILD >= 2195) */
9061 
9062 #define FSCTL_NETWORK_SET_CONFIGURATION_INFO    CTL_CODE(FILE_DEVICE_NETWORK_FILE_SYSTEM, 102, METHOD_IN_DIRECT, FILE_ANY_ACCESS)
9063 #define FSCTL_NETWORK_GET_CONFIGURATION_INFO    CTL_CODE(FILE_DEVICE_NETWORK_FILE_SYSTEM, 103, METHOD_OUT_DIRECT, FILE_ANY_ACCESS)
9064 #define FSCTL_NETWORK_GET_CONNECTION_INFO       CTL_CODE(FILE_DEVICE_NETWORK_FILE_SYSTEM, 104, METHOD_NEITHER, FILE_ANY_ACCESS)
9065 #define FSCTL_NETWORK_ENUMERATE_CONNECTIONS     CTL_CODE(FILE_DEVICE_NETWORK_FILE_SYSTEM, 105, METHOD_NEITHER, FILE_ANY_ACCESS)
9066 #define FSCTL_NETWORK_DELETE_CONNECTION         CTL_CODE(FILE_DEVICE_NETWORK_FILE_SYSTEM, 107, METHOD_BUFFERED, FILE_ANY_ACCESS)
9067 #define FSCTL_NETWORK_GET_STATISTICS            CTL_CODE(FILE_DEVICE_NETWORK_FILE_SYSTEM, 116, METHOD_BUFFERED, FILE_ANY_ACCESS)
9068 #define FSCTL_NETWORK_SET_DOMAIN_NAME           CTL_CODE(FILE_DEVICE_NETWORK_FILE_SYSTEM, 120, METHOD_BUFFERED, FILE_ANY_ACCESS)
9069 #define FSCTL_NETWORK_REMOTE_BOOT_INIT_SCRT     CTL_CODE(FILE_DEVICE_NETWORK_FILE_SYSTEM, 250, METHOD_BUFFERED, FILE_ANY_ACCESS)
9070 
9071 typedef enum _FILE_STORAGE_TYPE {
9072     StorageTypeDefault = 1,
9073     StorageTypeDirectory,
9074     StorageTypeFile,
9075     StorageTypeJunctionPoint,
9076     StorageTypeCatalog,
9077     StorageTypeStructuredStorage,
9078     StorageTypeEmbedding,
9079     StorageTypeStream
9080 } FILE_STORAGE_TYPE;
9081 
9082 typedef struct _OBJECT_BASIC_INFORMATION
9083 {
9084     ULONG Attributes;
9085     ACCESS_MASK GrantedAccess;
9086     ULONG HandleCount;
9087     ULONG PointerCount;
9088     ULONG PagedPoolCharge;
9089     ULONG NonPagedPoolCharge;
9090     ULONG Reserved[ 3 ];
9091     ULONG NameInfoSize;
9092     ULONG TypeInfoSize;
9093     ULONG SecurityDescriptorSize;
9094     LARGE_INTEGER CreationTime;
9095 } OBJECT_BASIC_INFORMATION, *POBJECT_BASIC_INFORMATION;
9096 
9097 typedef struct _BITMAP_RANGE {
9098     LIST_ENTRY      Links;
9099     LONGLONG        BasePage;
9100     ULONG           FirstDirtyPage;
9101     ULONG           LastDirtyPage;
9102     ULONG           DirtyPages;
9103     PULONG          Bitmap;
9104 } BITMAP_RANGE, *PBITMAP_RANGE;
9105 
9106 typedef struct _FILE_COPY_ON_WRITE_INFORMATION {
9107     BOOLEAN ReplaceIfExists;
9108     HANDLE  RootDirectory;
9109     ULONG   FileNameLength;
9110     WCHAR   FileName[1];
9111 } FILE_COPY_ON_WRITE_INFORMATION, *PFILE_COPY_ON_WRITE_INFORMATION;
9112 
9113 typedef struct _FILE_FULL_DIRECTORY_INFORMATION {
9114     ULONG           NextEntryOffset;
9115     ULONG           FileIndex;
9116     LARGE_INTEGER   CreationTime;
9117     LARGE_INTEGER   LastAccessTime;
9118     LARGE_INTEGER   LastWriteTime;
9119     LARGE_INTEGER   ChangeTime;
9120     LARGE_INTEGER   EndOfFile;
9121     LARGE_INTEGER   AllocationSize;
9122     ULONG           FileAttributes;
9123     ULONG           FileNameLength;
9124     ULONG           EaSize;
9125     WCHAR           FileName[ANYSIZE_ARRAY];
9126 } FILE_FULL_DIRECTORY_INFORMATION, *PFILE_FULL_DIRECTORY_INFORMATION;
9127 
9128 /* raw internal file lock struct returned from FsRtlGetNextFileLock */
9129 typedef struct _FILE_SHARED_LOCK_ENTRY {
9130     PVOID           Unknown1;
9131     PVOID           Unknown2;
9132     FILE_LOCK_INFO  FileLock;
9133 } FILE_SHARED_LOCK_ENTRY, *PFILE_SHARED_LOCK_ENTRY;
9134 
9135 /* raw internal file lock struct returned from FsRtlGetNextFileLock */
9136 typedef struct _FILE_EXCLUSIVE_LOCK_ENTRY {
9137     LIST_ENTRY      ListEntry;
9138     PVOID           Unknown1;
9139     PVOID           Unknown2;
9140     FILE_LOCK_INFO  FileLock;
9141 } FILE_EXCLUSIVE_LOCK_ENTRY, *PFILE_EXCLUSIVE_LOCK_ENTRY;
9142 
9143 typedef struct _FILE_MAILSLOT_PEEK_BUFFER {
9144     ULONG ReadDataAvailable;
9145     ULONG NumberOfMessages;
9146     ULONG MessageLength;
9147 } FILE_MAILSLOT_PEEK_BUFFER, *PFILE_MAILSLOT_PEEK_BUFFER;
9148 
9149 typedef struct _FILE_OLE_CLASSID_INFORMATION {
9150     GUID ClassId;
9151 } FILE_OLE_CLASSID_INFORMATION, *PFILE_OLE_CLASSID_INFORMATION;
9152 
9153 typedef struct _FILE_OLE_ALL_INFORMATION {
9154     FILE_BASIC_INFORMATION          BasicInformation;
9155     FILE_STANDARD_INFORMATION       StandardInformation;
9156     FILE_INTERNAL_INFORMATION       InternalInformation;
9157     FILE_EA_INFORMATION             EaInformation;
9158     FILE_ACCESS_INFORMATION         AccessInformation;
9159     FILE_POSITION_INFORMATION       PositionInformation;
9160     FILE_MODE_INFORMATION           ModeInformation;
9161     FILE_ALIGNMENT_INFORMATION      AlignmentInformation;
9162     USN                             LastChangeUsn;
9163     USN                             ReplicationUsn;
9164     LARGE_INTEGER                   SecurityChangeTime;
9165     FILE_OLE_CLASSID_INFORMATION    OleClassIdInformation;
9166     FILE_OBJECTID_INFORMATION       ObjectIdInformation;
9167     FILE_STORAGE_TYPE               StorageType;
9168     ULONG                           OleStateBits;
9169     ULONG                           OleId;
9170     ULONG                           NumberOfStreamReferences;
9171     ULONG                           StreamIndex;
9172     ULONG                           SecurityId;
9173     BOOLEAN                         ContentIndexDisable;
9174     BOOLEAN                         InheritContentIndexDisable;
9175     FILE_NAME_INFORMATION           NameInformation;
9176 } FILE_OLE_ALL_INFORMATION, *PFILE_OLE_ALL_INFORMATION;
9177 
9178 typedef struct _FILE_OLE_DIR_INFORMATION {
9179     ULONG               NextEntryOffset;
9180     ULONG               FileIndex;
9181     LARGE_INTEGER       CreationTime;
9182     LARGE_INTEGER       LastAccessTime;
9183     LARGE_INTEGER       LastWriteTime;
9184     LARGE_INTEGER       ChangeTime;
9185     LARGE_INTEGER       EndOfFile;
9186     LARGE_INTEGER       AllocationSize;
9187     ULONG               FileAttributes;
9188     ULONG               FileNameLength;
9189     FILE_STORAGE_TYPE   StorageType;
9190     GUID                OleClassId;
9191     ULONG               OleStateBits;
9192     BOOLEAN             ContentIndexDisable;
9193     BOOLEAN             InheritContentIndexDisable;
9194     WCHAR               FileName[1];
9195 } FILE_OLE_DIR_INFORMATION, *PFILE_OLE_DIR_INFORMATION;
9196 
9197 typedef struct _FILE_OLE_INFORMATION {
9198     LARGE_INTEGER                   SecurityChangeTime;
9199     FILE_OLE_CLASSID_INFORMATION    OleClassIdInformation;
9200     FILE_OBJECTID_INFORMATION       ObjectIdInformation;
9201     FILE_STORAGE_TYPE               StorageType;
9202     ULONG                           OleStateBits;
9203     BOOLEAN                         ContentIndexDisable;
9204     BOOLEAN                         InheritContentIndexDisable;
9205 } FILE_OLE_INFORMATION, *PFILE_OLE_INFORMATION;
9206 
9207 typedef struct _FILE_OLE_STATE_BITS_INFORMATION {
9208     ULONG StateBits;
9209     ULONG StateBitsMask;
9210 } FILE_OLE_STATE_BITS_INFORMATION, *PFILE_OLE_STATE_BITS_INFORMATION;
9211 
9212 typedef struct _MAPPING_PAIR {
9213     ULONGLONG Vcn;
9214     ULONGLONG Lcn;
9215 } MAPPING_PAIR, *PMAPPING_PAIR;
9216 
9217 typedef struct _GET_RETRIEVAL_DESCRIPTOR {
9218     ULONG           NumberOfPairs;
9219     ULONGLONG       StartVcn;
9220     MAPPING_PAIR    Pair[1];
9221 } GET_RETRIEVAL_DESCRIPTOR, *PGET_RETRIEVAL_DESCRIPTOR;
9222 
9223 typedef struct _MBCB {
9224     CSHORT          NodeTypeCode;
9225     CSHORT          NodeIsInZone;
9226     ULONG           PagesToWrite;
9227     ULONG           DirtyPages;
9228     ULONG           Reserved;
9229     LIST_ENTRY      BitmapRanges;
9230     LONGLONG        ResumeWritePage;
9231     BITMAP_RANGE    BitmapRange1;
9232     BITMAP_RANGE    BitmapRange2;
9233     BITMAP_RANGE    BitmapRange3;
9234 } MBCB, *PMBCB;
9235 
9236 typedef struct _MOVEFILE_DESCRIPTOR {
9237      HANDLE         FileHandle;
9238      ULONG          Reserved;
9239      LARGE_INTEGER  StartVcn;
9240      LARGE_INTEGER  TargetLcn;
9241      ULONG          NumVcns;
9242      ULONG          Reserved1;
9243 } MOVEFILE_DESCRIPTOR, *PMOVEFILE_DESCRIPTOR;
9244 
9245 typedef struct _OBJECT_BASIC_INFO {
9246     ULONG           Attributes;
9247     ACCESS_MASK     GrantedAccess;
9248     ULONG           HandleCount;
9249     ULONG           ReferenceCount;
9250     ULONG           PagedPoolUsage;
9251     ULONG           NonPagedPoolUsage;
9252     ULONG           Reserved[3];
9253     ULONG           NameInformationLength;
9254     ULONG           TypeInformationLength;
9255     ULONG           SecurityDescriptorLength;
9256     LARGE_INTEGER   CreateTime;
9257 } OBJECT_BASIC_INFO, *POBJECT_BASIC_INFO;
9258 
9259 typedef struct _OBJECT_HANDLE_ATTRIBUTE_INFO {
9260     BOOLEAN Inherit;
9261     BOOLEAN ProtectFromClose;
9262 } OBJECT_HANDLE_ATTRIBUTE_INFO, *POBJECT_HANDLE_ATTRIBUTE_INFO;
9263 
9264 typedef struct _OBJECT_NAME_INFO {
9265     UNICODE_STRING  ObjectName;
9266     WCHAR           ObjectNameBuffer[1];
9267 } OBJECT_NAME_INFO, *POBJECT_NAME_INFO;
9268 
9269 typedef struct _OBJECT_PROTECTION_INFO {
9270     BOOLEAN Inherit;
9271     BOOLEAN ProtectHandle;
9272 } OBJECT_PROTECTION_INFO, *POBJECT_PROTECTION_INFO;
9273 
9274 typedef struct _OBJECT_TYPE_INFO {
9275     UNICODE_STRING  ObjectTypeName;
9276     UCHAR           Unknown[0x58];
9277     WCHAR           ObjectTypeNameBuffer[1];
9278 } OBJECT_TYPE_INFO, *POBJECT_TYPE_INFO;
9279 
9280 typedef struct _OBJECT_ALL_TYPES_INFO {
9281     ULONG               NumberOfObjectTypes;
9282     OBJECT_TYPE_INFO    ObjectsTypeInfo[1];
9283 } OBJECT_ALL_TYPES_INFO, *POBJECT_ALL_TYPES_INFO;
9284 
9285 #if defined(USE_LPC6432)
9286 #define LPC_CLIENT_ID CLIENT_ID64
9287 #define LPC_SIZE_T ULONGLONG
9288 #define LPC_PVOID ULONGLONG
9289 #define LPC_HANDLE ULONGLONG
9290 #else
9291 #define LPC_CLIENT_ID CLIENT_ID
9292 #define LPC_SIZE_T SIZE_T
9293 #define LPC_PVOID PVOID
9294 #define LPC_HANDLE HANDLE
9295 #endif
9296 
9297 typedef struct _PORT_MESSAGE
9298 {
9299     union
9300     {
9301         struct
9302         {
9303             CSHORT DataLength;
9304             CSHORT TotalLength;
9305         } s1;
9306         ULONG Length;
9307     } u1;
9308     union
9309     {
9310         struct
9311         {
9312             CSHORT Type;
9313             CSHORT DataInfoOffset;
9314         } s2;
9315         ULONG ZeroInit;
9316     } u2;
9317     __GNU_EXTENSION union
9318     {
9319         LPC_CLIENT_ID ClientId;
9320         double DoNotUseThisField;
9321     };
9322     ULONG MessageId;
9323     __GNU_EXTENSION union
9324     {
9325         LPC_SIZE_T ClientViewSize;
9326         ULONG CallbackId;
9327     };
9328 } PORT_MESSAGE, *PPORT_MESSAGE;
9329 
9330 #define LPC_KERNELMODE_MESSAGE      (CSHORT)((USHORT)0x8000)
9331 
9332 typedef struct _PORT_VIEW
9333 {
9334     ULONG Length;
9335     LPC_HANDLE SectionHandle;
9336     ULONG SectionOffset;
9337     LPC_SIZE_T ViewSize;
9338     LPC_PVOID ViewBase;
9339     LPC_PVOID ViewRemoteBase;
9340 } PORT_VIEW, *PPORT_VIEW;
9341 
9342 typedef struct _REMOTE_PORT_VIEW
9343 {
9344     ULONG Length;
9345     LPC_SIZE_T ViewSize;
9346     LPC_PVOID ViewBase;
9347 } REMOTE_PORT_VIEW, *PREMOTE_PORT_VIEW;
9348 
9349 typedef struct _VAD_HEADER {
9350     PVOID       StartVPN;
9351     PVOID       EndVPN;
9352     struct _VAD_HEADER* ParentLink;
9353     struct _VAD_HEADER* LeftLink;
9354     struct _VAD_HEADER* RightLink;
9355     ULONG       Flags;          /* LSB = CommitCharge */
9356     PVOID       ControlArea;
9357     PVOID       FirstProtoPte;
9358     PVOID       LastPTE;
9359     ULONG       Unknown;
9360     LIST_ENTRY  Secured;
9361 } VAD_HEADER, *PVAD_HEADER;
9362 
9363 NTKERNELAPI
9364 LARGE_INTEGER
9365 NTAPI
9366 CcGetLsnForFileObject (
9367     IN PFILE_OBJECT     FileObject,
9368     OUT PLARGE_INTEGER  OldestLsn OPTIONAL
9369 );
9370 
9371 NTKERNELAPI
9372 PVOID
9373 NTAPI
9374 FsRtlAllocatePool (
9375     IN POOL_TYPE    PoolType,
9376     IN ULONG        NumberOfBytes
9377 );
9378 
9379 NTKERNELAPI
9380 PVOID
9381 NTAPI
9382 FsRtlAllocatePoolWithQuota (
9383     IN POOL_TYPE    PoolType,
9384     IN ULONG        NumberOfBytes
9385 );
9386 
9387 NTKERNELAPI
9388 PVOID
9389 NTAPI
9390 FsRtlAllocatePoolWithQuotaTag (
9391     IN POOL_TYPE    PoolType,
9392     IN ULONG        NumberOfBytes,
9393     IN ULONG        Tag
9394 );
9395 
9396 NTKERNELAPI
9397 PVOID
9398 NTAPI
9399 FsRtlAllocatePoolWithTag (
9400     IN POOL_TYPE    PoolType,
9401     IN ULONG        NumberOfBytes,
9402     IN ULONG        Tag
9403 );
9404 
9405 NTKERNELAPI
9406 BOOLEAN
9407 NTAPI
9408 FsRtlIsFatDbcsLegal (
9409     IN ANSI_STRING  DbcsName,
9410     IN BOOLEAN      WildCardsPermissible,
9411     IN BOOLEAN      PathNamePermissible,
9412     IN BOOLEAN      LeadingBackslashPermissible
9413 );
9414 
9415 NTKERNELAPI
9416 BOOLEAN
9417 NTAPI
9418 FsRtlMdlReadComplete (
9419     IN PFILE_OBJECT     FileObject,
9420     IN PMDL             MdlChain
9421 );
9422 
9423 NTKERNELAPI
9424 BOOLEAN
9425 NTAPI
9426 FsRtlMdlWriteComplete (
9427     IN PFILE_OBJECT     FileObject,
9428     IN PLARGE_INTEGER   FileOffset,
9429     IN PMDL             MdlChain
9430 );
9431 
9432 NTKERNELAPI
9433 VOID
9434 NTAPI
9435 FsRtlNotifyChangeDirectory (
9436     IN PNOTIFY_SYNC NotifySync,
9437     IN PVOID        FsContext,
9438     IN PSTRING      FullDirectoryName,
9439     IN PLIST_ENTRY  NotifyList,
9440     IN BOOLEAN      WatchTree,
9441     IN ULONG        CompletionFilter,
9442     IN PIRP         NotifyIrp
9443 );
9444 
9445 NTKERNELAPI
9446 NTSTATUS
9447 NTAPI
9448 ObCreateObject (
9449     IN KPROCESSOR_MODE      ObjectAttributesAccessMode OPTIONAL,
9450     IN POBJECT_TYPE         ObjectType,
9451     IN POBJECT_ATTRIBUTES   ObjectAttributes OPTIONAL,
9452     IN KPROCESSOR_MODE      AccessMode,
9453     IN OUT PVOID            ParseContext OPTIONAL,
9454     IN ULONG                ObjectSize,
9455     IN ULONG                PagedPoolCharge OPTIONAL,
9456     IN ULONG                NonPagedPoolCharge OPTIONAL,
9457     OUT PVOID               *Object
9458 );
9459 
9460 NTKERNELAPI
9461 ULONG
9462 NTAPI
9463 ObGetObjectPointerCount (
9464     IN PVOID Object
9465 );
9466 
9467 NTKERNELAPI
9468 NTSTATUS
9469 NTAPI
9470 ObReferenceObjectByName (
9471     IN PUNICODE_STRING  ObjectName,
9472     IN ULONG            Attributes,
9473     IN PACCESS_STATE    PassedAccessState OPTIONAL,
9474     IN ACCESS_MASK      DesiredAccess OPTIONAL,
9475     IN POBJECT_TYPE     ObjectType,
9476     IN KPROCESSOR_MODE  AccessMode,
9477     IN OUT PVOID        ParseContext OPTIONAL,
9478     OUT PVOID           *Object
9479 );
9480 
9481 #define PsDereferenceImpersonationToken(T)  \
9482             {if (ARGUMENT_PRESENT(T)) {     \
9483                 (ObDereferenceObject((T))); \
9484             } else {                        \
9485                 ;                           \
9486             }                               \
9487 }
9488 
9489 NTKERNELAPI
9490 NTSTATUS
9491 NTAPI
9492 PsLookupProcessThreadByCid (
9493     IN PCLIENT_ID   Cid,
9494     OUT PEPROCESS   *Process OPTIONAL,
9495     OUT PETHREAD    *Thread
9496 );
9497 
9498 NTSYSAPI
9499 NTSTATUS
9500 NTAPI
9501 RtlSetSaclSecurityDescriptor (
9502     IN OUT PSECURITY_DESCRIPTOR SecurityDescriptor,
9503     IN BOOLEAN                  SaclPresent,
9504     IN PACL                     Sacl,
9505     IN BOOLEAN                  SaclDefaulted
9506 );
9507 
9508 #define SeEnableAccessToExports() SeExports = *(PSE_EXPORTS *)SeExports;
9509 
9510 #if (VER_PRODUCTBUILD >= 2195)
9511 
9512 NTSYSAPI
9513 NTSTATUS
9514 NTAPI
9515 ZwAdjustPrivilegesToken (
9516     IN HANDLE               TokenHandle,
9517     IN BOOLEAN              DisableAllPrivileges,
9518     IN PTOKEN_PRIVILEGES    NewState,
9519     IN ULONG                BufferLength,
9520     OUT PTOKEN_PRIVILEGES   PreviousState OPTIONAL,
9521     OUT PULONG              ReturnLength
9522 );
9523 
9524 #endif /* (VER_PRODUCTBUILD >= 2195) */
9525 
9526 NTSYSAPI
9527 NTSTATUS
9528 NTAPI
9529 ZwAlertThread (
9530     IN HANDLE ThreadHandle
9531 );
9532 
9533 NTSYSAPI
9534 NTSTATUS
9535 NTAPI
9536 ZwAccessCheckAndAuditAlarm (
9537     IN PUNICODE_STRING      SubsystemName,
9538     IN PVOID                HandleId,
9539     IN PUNICODE_STRING      ObjectTypeName,
9540     IN PUNICODE_STRING      ObjectName,
9541     IN PSECURITY_DESCRIPTOR SecurityDescriptor,
9542     IN ACCESS_MASK          DesiredAccess,
9543     IN PGENERIC_MAPPING     GenericMapping,
9544     IN BOOLEAN              ObjectCreation,
9545     OUT PACCESS_MASK        GrantedAccess,
9546     OUT PBOOLEAN            AccessStatus,
9547     OUT PBOOLEAN            GenerateOnClose
9548 );
9549 
9550 #if (VER_PRODUCTBUILD >= 2195)
9551 
9552 NTSYSAPI
9553 NTSTATUS
9554 NTAPI
9555 ZwCancelIoFile (
9556     IN HANDLE               FileHandle,
9557     OUT PIO_STATUS_BLOCK    IoStatusBlock
9558 );
9559 
9560 #endif /* (VER_PRODUCTBUILD >= 2195) */
9561 
9562 NTSYSAPI
9563 NTSTATUS
9564 NTAPI
9565 ZwClearEvent (
9566     IN HANDLE EventHandle
9567 );
9568 
9569 NTSYSAPI
9570 NTSTATUS
9571 NTAPI
9572 ZwCloseObjectAuditAlarm (
9573     IN PUNICODE_STRING  SubsystemName,
9574     IN PVOID            HandleId,
9575     IN BOOLEAN          GenerateOnClose
9576 );
9577 
9578 NTSYSAPI
9579 NTSTATUS
9580 NTAPI
9581 ZwCreateSymbolicLinkObject (
9582     OUT PHANDLE             SymbolicLinkHandle,
9583     IN ACCESS_MASK          DesiredAccess,
9584     IN POBJECT_ATTRIBUTES   ObjectAttributes,
9585     IN PUNICODE_STRING      TargetName
9586 );
9587 
9588 NTSYSAPI
9589 NTSTATUS
9590 NTAPI
9591 ZwFlushInstructionCache (
9592     IN HANDLE   ProcessHandle,
9593     IN PVOID    BaseAddress OPTIONAL,
9594     IN ULONG    FlushSize
9595 );
9596 
9597 NTSYSAPI
9598 NTSTATUS
9599 NTAPI
9600 ZwFlushBuffersFile(
9601     IN HANDLE FileHandle,
9602     OUT PIO_STATUS_BLOCK IoStatusBlock
9603 );
9604 
9605 #if (VER_PRODUCTBUILD >= 2195)
9606 
9607 NTSYSAPI
9608 NTSTATUS
9609 NTAPI
9610 ZwInitiatePowerAction (
9611     IN POWER_ACTION         SystemAction,
9612     IN SYSTEM_POWER_STATE   MinSystemState,
9613     IN ULONG                Flags,
9614     IN BOOLEAN              Asynchronous
9615 );
9616 
9617 #endif /* (VER_PRODUCTBUILD >= 2195) */
9618 
9619 NTSYSAPI
9620 NTSTATUS
9621 NTAPI
9622 ZwLoadKey (
9623     IN POBJECT_ATTRIBUTES KeyObjectAttributes,
9624     IN POBJECT_ATTRIBUTES FileObjectAttributes
9625 );
9626 
9627 NTSYSAPI
9628 NTSTATUS
9629 NTAPI
9630 ZwOpenProcessToken (
9631     IN HANDLE       ProcessHandle,
9632     IN ACCESS_MASK  DesiredAccess,
9633     OUT PHANDLE     TokenHandle
9634 );
9635 
9636 NTSYSAPI
9637 NTSTATUS
9638 NTAPI
9639 ZwOpenThread (
9640     OUT PHANDLE             ThreadHandle,
9641     IN ACCESS_MASK          DesiredAccess,
9642     IN POBJECT_ATTRIBUTES   ObjectAttributes,
9643     IN PCLIENT_ID           ClientId
9644 );
9645 
9646 NTSYSAPI
9647 NTSTATUS
9648 NTAPI
9649 ZwOpenThreadToken (
9650     IN HANDLE       ThreadHandle,
9651     IN ACCESS_MASK  DesiredAccess,
9652     IN BOOLEAN      OpenAsSelf,
9653     OUT PHANDLE     TokenHandle
9654 );
9655 
9656 NTSYSAPI
9657 NTSTATUS
9658 NTAPI
9659 ZwPulseEvent (
9660     IN HANDLE   EventHandle,
9661     OUT PLONG   PreviousState OPTIONAL
9662 );
9663 
9664 NTSYSAPI
9665 NTSTATUS
9666 NTAPI
9667 ZwQueryDefaultLocale (
9668     IN BOOLEAN  ThreadOrSystem,
9669     OUT PLCID   Locale
9670 );
9671 
9672 #if (VER_PRODUCTBUILD >= 2195)
9673 
9674 NTSYSAPI
9675 NTSTATUS
9676 NTAPI
9677 ZwQueryDirectoryObject (
9678     IN HANDLE       DirectoryHandle,
9679     OUT PVOID       Buffer,
9680     IN ULONG        Length,
9681     IN BOOLEAN      ReturnSingleEntry,
9682     IN BOOLEAN      RestartScan,
9683     IN OUT PULONG   Context,
9684     OUT PULONG      ReturnLength OPTIONAL
9685 );
9686 
9687 #endif /* (VER_PRODUCTBUILD >= 2195) */
9688 
9689 NTSYSAPI
9690 NTSTATUS
9691 NTAPI
9692 ZwQueryInformationProcess (
9693     IN HANDLE           ProcessHandle,
9694     IN PROCESSINFOCLASS ProcessInformationClass,
9695     OUT PVOID           ProcessInformation,
9696     IN ULONG            ProcessInformationLength,
9697     OUT PULONG          ReturnLength OPTIONAL
9698 );
9699 
9700 NTSYSAPI
9701 NTSTATUS
9702 NTAPI
9703 ZwReplaceKey (
9704     IN POBJECT_ATTRIBUTES   NewFileObjectAttributes,
9705     IN HANDLE               KeyHandle,
9706     IN POBJECT_ATTRIBUTES   OldFileObjectAttributes
9707 );
9708 
9709 NTSYSAPI
9710 NTSTATUS
9711 NTAPI
9712 ZwResetEvent (
9713     IN HANDLE   EventHandle,
9714     OUT PLONG   PreviousState OPTIONAL
9715 );
9716 
9717 #if (VER_PRODUCTBUILD >= 2195)
9718 
9719 NTSYSAPI
9720 NTSTATUS
9721 NTAPI
9722 ZwRestoreKey (
9723     IN HANDLE   KeyHandle,
9724     IN HANDLE   FileHandle,
9725     IN ULONG    Flags
9726 );
9727 
9728 #endif /* (VER_PRODUCTBUILD >= 2195) */
9729 
9730 NTSYSAPI
9731 NTSTATUS
9732 NTAPI
9733 ZwSaveKey (
9734     IN HANDLE KeyHandle,
9735     IN HANDLE FileHandle
9736 );
9737 
9738 NTSYSAPI
9739 NTSTATUS
9740 NTAPI
9741 ZwSetDefaultLocale (
9742     IN BOOLEAN  ThreadOrSystem,
9743     IN LCID     Locale
9744 );
9745 
9746 #if (VER_PRODUCTBUILD >= 2195)
9747 
9748 NTSYSAPI
9749 NTSTATUS
9750 NTAPI
9751 ZwSetDefaultUILanguage (
9752     IN LANGID LanguageId
9753 );
9754 
9755 #endif /* (VER_PRODUCTBUILD >= 2195) */
9756 
9757 NTSYSAPI
9758 NTSTATUS
9759 NTAPI
9760 ZwSetInformationProcess (
9761     IN HANDLE           ProcessHandle,
9762     IN PROCESSINFOCLASS ProcessInformationClass,
9763     IN PVOID            ProcessInformation,
9764     IN ULONG            ProcessInformationLength
9765 );
9766 
9767 NTSYSAPI
9768 NTSTATUS
9769 NTAPI
9770 ZwSetSystemTime (
9771     IN PLARGE_INTEGER   NewTime,
9772     OUT PLARGE_INTEGER  OldTime OPTIONAL
9773 );
9774 
9775 NTSYSAPI
9776 NTSTATUS
9777 NTAPI
9778 ZwUnloadKey (
9779     IN POBJECT_ATTRIBUTES KeyObjectAttributes
9780 );
9781 
9782 NTSYSAPI
9783 NTSTATUS
9784 NTAPI
9785 ZwWaitForMultipleObjects (
9786     IN ULONG            HandleCount,
9787     IN PHANDLE          Handles,
9788     IN WAIT_TYPE        WaitType,
9789     IN BOOLEAN          Alertable,
9790     IN PLARGE_INTEGER   Timeout OPTIONAL
9791 );
9792 
9793 NTSYSAPI
9794 NTSTATUS
9795 NTAPI
9796 ZwYieldExecution (
9797     VOID
9798 );
9799 
9800 #pragma pack(pop)
9801 
9802 #ifdef __cplusplus
9803 }
9804 #endif
9805