Home | History | Annotate | Download | only in ddk
      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 (at) 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 } SID_NAME_USE, *PSID_NAME_USE;
     99 
    100 typedef struct _SID_AND_ATTRIBUTES {
    101   PSID Sid;
    102   ULONG Attributes;
    103 } SID_AND_ATTRIBUTES, *PSID_AND_ATTRIBUTES;
    104 typedef SID_AND_ATTRIBUTES SID_AND_ATTRIBUTES_ARRAY[ANYSIZE_ARRAY];
    105 typedef SID_AND_ATTRIBUTES_ARRAY *PSID_AND_ATTRIBUTES_ARRAY;
    106 
    107 #define SID_HASH_SIZE 32
    108 typedef ULONG_PTR SID_HASH_ENTRY, *PSID_HASH_ENTRY;
    109 
    110 typedef struct _SID_AND_ATTRIBUTES_HASH {
    111   ULONG SidCount;
    112   PSID_AND_ATTRIBUTES SidAttr;
    113   SID_HASH_ENTRY Hash[SID_HASH_SIZE];
    114 } SID_AND_ATTRIBUTES_HASH, *PSID_AND_ATTRIBUTES_HASH;
    115 
    116 /* Universal well-known SIDs */
    117 
    118 #define SECURITY_NULL_SID_AUTHORITY         {0,0,0,0,0,0}
    119 #define SECURITY_WORLD_SID_AUTHORITY        {0,0,0,0,0,1}
    120 #define SECURITY_LOCAL_SID_AUTHORITY        {0,0,0,0,0,2}
    121 #define SECURITY_CREATOR_SID_AUTHORITY      {0,0,0,0,0,3}
    122 #define SECURITY_NON_UNIQUE_AUTHORITY       {0,0,0,0,0,4}
    123 #define SECURITY_RESOURCE_MANAGER_AUTHORITY {0,0,0,0,0,9}
    124 
    125 #define SECURITY_NULL_RID                 (0x00000000L)
    126 #define SECURITY_WORLD_RID                (0x00000000L)
    127 #define SECURITY_LOCAL_RID                (0x00000000L)
    128 #define SECURITY_LOCAL_LOGON_RID          (0x00000001L)
    129 
    130 #define SECURITY_CREATOR_OWNER_RID        (0x00000000L)
    131 #define SECURITY_CREATOR_GROUP_RID        (0x00000001L)
    132 #define SECURITY_CREATOR_OWNER_SERVER_RID (0x00000002L)
    133 #define SECURITY_CREATOR_GROUP_SERVER_RID (0x00000003L)
    134 #define SECURITY_CREATOR_OWNER_RIGHTS_RID (0x00000004L)
    135 
    136 /* NT well-known SIDs */
    137 
    138 #define SECURITY_NT_AUTHORITY           {0,0,0,0,0,5}
    139 
    140 #define SECURITY_DIALUP_RID             (0x00000001L)
    141 #define SECURITY_NETWORK_RID            (0x00000002L)
    142 #define SECURITY_BATCH_RID              (0x00000003L)
    143 #define SECURITY_INTERACTIVE_RID        (0x00000004L)
    144 #define SECURITY_LOGON_IDS_RID          (0x00000005L)
    145 #define SECURITY_LOGON_IDS_RID_COUNT    (3L)
    146 #define SECURITY_SERVICE_RID            (0x00000006L)
    147 #define SECURITY_ANONYMOUS_LOGON_RID    (0x00000007L)
    148 #define SECURITY_PROXY_RID              (0x00000008L)
    149 #define SECURITY_ENTERPRISE_CONTROLLERS_RID (0x00000009L)
    150 #define SECURITY_SERVER_LOGON_RID       SECURITY_ENTERPRISE_CONTROLLERS_RID
    151 #define SECURITY_PRINCIPAL_SELF_RID     (0x0000000AL)
    152 #define SECURITY_AUTHENTICATED_USER_RID (0x0000000BL)
    153 #define SECURITY_RESTRICTED_CODE_RID    (0x0000000CL)
    154 #define SECURITY_TERMINAL_SERVER_RID    (0x0000000DL)
    155 #define SECURITY_REMOTE_LOGON_RID       (0x0000000EL)
    156 #define SECURITY_THIS_ORGANIZATION_RID  (0x0000000FL)
    157 #define SECURITY_IUSER_RID              (0x00000011L)
    158 #define SECURITY_LOCAL_SYSTEM_RID       (0x00000012L)
    159 #define SECURITY_LOCAL_SERVICE_RID      (0x00000013L)
    160 #define SECURITY_NETWORK_SERVICE_RID    (0x00000014L)
    161 #define SECURITY_NT_NON_UNIQUE          (0x00000015L)
    162 #define SECURITY_NT_NON_UNIQUE_SUB_AUTH_COUNT  (3L)
    163 #define SECURITY_ENTERPRISE_READONLY_CONTROLLERS_RID (0x00000016L)
    164 
    165 #define SECURITY_BUILTIN_DOMAIN_RID     (0x00000020L)
    166 #define SECURITY_WRITE_RESTRICTED_CODE_RID (0x00000021L)
    167 
    168 
    169 #define SECURITY_PACKAGE_BASE_RID       (0x00000040L)
    170 #define SECURITY_PACKAGE_RID_COUNT      (2L)
    171 #define SECURITY_PACKAGE_NTLM_RID       (0x0000000AL)
    172 #define SECURITY_PACKAGE_SCHANNEL_RID   (0x0000000EL)
    173 #define SECURITY_PACKAGE_DIGEST_RID     (0x00000015L)
    174 
    175 #define SECURITY_CRED_TYPE_BASE_RID             (0x00000041L)
    176 #define SECURITY_CRED_TYPE_RID_COUNT            (2L)
    177 #define SECURITY_CRED_TYPE_THIS_ORG_CERT_RID    (0x00000001L)
    178 
    179 #define SECURITY_MIN_BASE_RID		(0x00000050L)
    180 #define SECURITY_SERVICE_ID_BASE_RID    (0x00000050L)
    181 #define SECURITY_SERVICE_ID_RID_COUNT   (6L)
    182 #define SECURITY_RESERVED_ID_BASE_RID   (0x00000051L)
    183 #define SECURITY_APPPOOL_ID_BASE_RID    (0x00000052L)
    184 #define SECURITY_APPPOOL_ID_RID_COUNT   (6L)
    185 #define SECURITY_VIRTUALSERVER_ID_BASE_RID    (0x00000053L)
    186 #define SECURITY_VIRTUALSERVER_ID_RID_COUNT   (6L)
    187 #define SECURITY_USERMODEDRIVERHOST_ID_BASE_RID  (0x00000054L)
    188 #define SECURITY_USERMODEDRIVERHOST_ID_RID_COUNT (6L)
    189 #define SECURITY_CLOUD_INFRASTRUCTURE_SERVICES_ID_BASE_RID  (0x00000055L)
    190 #define SECURITY_CLOUD_INFRASTRUCTURE_SERVICES_ID_RID_COUNT (6L)
    191 #define SECURITY_WMIHOST_ID_BASE_RID  (0x00000056L)
    192 #define SECURITY_WMIHOST_ID_RID_COUNT (6L)
    193 #define SECURITY_TASK_ID_BASE_RID                 (0x00000057L)
    194 #define SECURITY_NFS_ID_BASE_RID        (0x00000058L)
    195 #define SECURITY_COM_ID_BASE_RID        (0x00000059L)
    196 #define SECURITY_VIRTUALACCOUNT_ID_RID_COUNT   (6L)
    197 
    198 #define SECURITY_MAX_BASE_RID		(0x0000006FL)
    199 
    200 #define SECURITY_MAX_ALWAYS_FILTERED    (0x000003E7L)
    201 #define SECURITY_MIN_NEVER_FILTERED     (0x000003E8L)
    202 
    203 #define SECURITY_OTHER_ORGANIZATION_RID (0x000003E8L)
    204 
    205 #define SECURITY_WINDOWSMOBILE_ID_BASE_RID (0x00000070L)
    206 
    207 /* Well-known domain relative sub-authority values (RIDs) */
    208 
    209 #define DOMAIN_GROUP_RID_ENTERPRISE_READONLY_DOMAIN_CONTROLLERS (0x000001F2L)
    210 
    211 #define FOREST_USER_RID_MAX            (0x000001F3L)
    212 
    213 /* Well-known users */
    214 
    215 #define DOMAIN_USER_RID_ADMIN          (0x000001F4L)
    216 #define DOMAIN_USER_RID_GUEST          (0x000001F5L)
    217 #define DOMAIN_USER_RID_KRBTGT         (0x000001F6L)
    218 
    219 #define DOMAIN_USER_RID_MAX            (0x000003E7L)
    220 
    221 /* Well-known groups */
    222 
    223 #define DOMAIN_GROUP_RID_ADMINS               (0x00000200L)
    224 #define DOMAIN_GROUP_RID_USERS                (0x00000201L)
    225 #define DOMAIN_GROUP_RID_GUESTS               (0x00000202L)
    226 #define DOMAIN_GROUP_RID_COMPUTERS            (0x00000203L)
    227 #define DOMAIN_GROUP_RID_CONTROLLERS          (0x00000204L)
    228 #define DOMAIN_GROUP_RID_CERT_ADMINS          (0x00000205L)
    229 #define DOMAIN_GROUP_RID_SCHEMA_ADMINS        (0x00000206L)
    230 #define DOMAIN_GROUP_RID_ENTERPRISE_ADMINS    (0x00000207L)
    231 #define DOMAIN_GROUP_RID_POLICY_ADMINS        (0x00000208L)
    232 #define DOMAIN_GROUP_RID_READONLY_CONTROLLERS (0x00000209L)
    233 
    234 /* Well-known aliases */
    235 
    236 #define DOMAIN_ALIAS_RID_ADMINS                         (0x00000220L)
    237 #define DOMAIN_ALIAS_RID_USERS                          (0x00000221L)
    238 #define DOMAIN_ALIAS_RID_GUESTS                         (0x00000222L)
    239 #define DOMAIN_ALIAS_RID_POWER_USERS                    (0x00000223L)
    240 
    241 #define DOMAIN_ALIAS_RID_ACCOUNT_OPS                    (0x00000224L)
    242 #define DOMAIN_ALIAS_RID_SYSTEM_OPS                     (0x00000225L)
    243 #define DOMAIN_ALIAS_RID_PRINT_OPS                      (0x00000226L)
    244 #define DOMAIN_ALIAS_RID_BACKUP_OPS                     (0x00000227L)
    245 
    246 #define DOMAIN_ALIAS_RID_REPLICATOR                     (0x00000228L)
    247 #define DOMAIN_ALIAS_RID_RAS_SERVERS                    (0x00000229L)
    248 #define DOMAIN_ALIAS_RID_PREW2KCOMPACCESS               (0x0000022AL)
    249 #define DOMAIN_ALIAS_RID_REMOTE_DESKTOP_USERS           (0x0000022BL)
    250 #define DOMAIN_ALIAS_RID_NETWORK_CONFIGURATION_OPS      (0x0000022CL)
    251 #define DOMAIN_ALIAS_RID_INCOMING_FOREST_TRUST_BUILDERS (0x0000022DL)
    252 
    253 #define DOMAIN_ALIAS_RID_MONITORING_USERS               (0x0000022EL)
    254 #define DOMAIN_ALIAS_RID_LOGGING_USERS                  (0x0000022FL)
    255 #define DOMAIN_ALIAS_RID_AUTHORIZATIONACCESS            (0x00000230L)
    256 #define DOMAIN_ALIAS_RID_TS_LICENSE_SERVERS             (0x00000231L)
    257 #define DOMAIN_ALIAS_RID_DCOM_USERS                     (0x00000232L)
    258 #define DOMAIN_ALIAS_RID_IUSERS                         (0x00000238L)
    259 #define DOMAIN_ALIAS_RID_CRYPTO_OPERATORS               (0x00000239L)
    260 #define DOMAIN_ALIAS_RID_CACHEABLE_PRINCIPALS_GROUP     (0x0000023BL)
    261 #define DOMAIN_ALIAS_RID_NON_CACHEABLE_PRINCIPALS_GROUP (0x0000023CL)
    262 #define DOMAIN_ALIAS_RID_EVENT_LOG_READERS_GROUP        (0x0000023DL)
    263 #define DOMAIN_ALIAS_RID_CERTSVC_DCOM_ACCESS_GROUP      (0x0000023EL)
    264 
    265 #define SECURITY_MANDATORY_LABEL_AUTHORITY          {0,0,0,0,0,16}
    266 #define SECURITY_MANDATORY_UNTRUSTED_RID            (0x00000000L)
    267 #define SECURITY_MANDATORY_LOW_RID                  (0x00001000L)
    268 #define SECURITY_MANDATORY_MEDIUM_RID               (0x00002000L)
    269 #define SECURITY_MANDATORY_HIGH_RID                 (0x00003000L)
    270 #define SECURITY_MANDATORY_SYSTEM_RID               (0x00004000L)
    271 #define SECURITY_MANDATORY_PROTECTED_PROCESS_RID    (0x00005000L)
    272 
    273 /* SECURITY_MANDATORY_MAXIMUM_USER_RID is the highest RID that
    274    can be set by a usermode caller.*/
    275 
    276 #define SECURITY_MANDATORY_MAXIMUM_USER_RID   SECURITY_MANDATORY_SYSTEM_RID
    277 
    278 #define MANDATORY_LEVEL_TO_MANDATORY_RID(IL) (IL * 0x1000)
    279 
    280 /* Allocate the System Luid.  The first 1000 LUIDs are reserved.
    281    Use #999 here (0x3e7 = 999) */
    282 
    283 #define SYSTEM_LUID                     {0x3e7, 0x0}
    284 #define ANONYMOUS_LOGON_LUID            {0x3e6, 0x0}
    285 #define LOCALSERVICE_LUID               {0x3e5, 0x0}
    286 #define NETWORKSERVICE_LUID             {0x3e4, 0x0}
    287 #define IUSER_LUID                      {0x3e3, 0x0}
    288 
    289 typedef struct _ACE_HEADER {
    290   UCHAR AceType;
    291   UCHAR AceFlags;
    292   USHORT AceSize;
    293 } ACE_HEADER, *PACE_HEADER;
    294 
    295 /* also in winnt.h */
    296 #define ACCESS_MIN_MS_ACE_TYPE                  (0x0)
    297 #define ACCESS_ALLOWED_ACE_TYPE                 (0x0)
    298 #define ACCESS_DENIED_ACE_TYPE                  (0x1)
    299 #define SYSTEM_AUDIT_ACE_TYPE                   (0x2)
    300 #define SYSTEM_ALARM_ACE_TYPE                   (0x3)
    301 #define ACCESS_MAX_MS_V2_ACE_TYPE               (0x3)
    302 #define ACCESS_ALLOWED_COMPOUND_ACE_TYPE        (0x4)
    303 #define ACCESS_MAX_MS_V3_ACE_TYPE               (0x4)
    304 #define ACCESS_MIN_MS_OBJECT_ACE_TYPE           (0x5)
    305 #define ACCESS_ALLOWED_OBJECT_ACE_TYPE          (0x5)
    306 #define ACCESS_DENIED_OBJECT_ACE_TYPE           (0x6)
    307 #define SYSTEM_AUDIT_OBJECT_ACE_TYPE            (0x7)
    308 #define SYSTEM_ALARM_OBJECT_ACE_TYPE            (0x8)
    309 #define ACCESS_MAX_MS_OBJECT_ACE_TYPE           (0x8)
    310 #define ACCESS_MAX_MS_V4_ACE_TYPE               (0x8)
    311 #define ACCESS_MAX_MS_ACE_TYPE                  (0x8)
    312 #define ACCESS_ALLOWED_CALLBACK_ACE_TYPE        (0x9)
    313 #define ACCESS_DENIED_CALLBACK_ACE_TYPE         (0xA)
    314 #define ACCESS_ALLOWED_CALLBACK_OBJECT_ACE_TYPE (0xB)
    315 #define ACCESS_DENIED_CALLBACK_OBJECT_ACE_TYPE  (0xC)
    316 #define SYSTEM_AUDIT_CALLBACK_ACE_TYPE          (0xD)
    317 #define SYSTEM_ALARM_CALLBACK_ACE_TYPE          (0xE)
    318 #define SYSTEM_AUDIT_CALLBACK_OBJECT_ACE_TYPE   (0xF)
    319 #define SYSTEM_ALARM_CALLBACK_OBJECT_ACE_TYPE   (0x10)
    320 #define ACCESS_MAX_MS_V5_ACE_TYPE               (0x11)
    321 #define SYSTEM_MANDATORY_LABEL_ACE_TYPE         (0x11)
    322 
    323 /* The following are the inherit flags that go into the AceFlags field
    324    of an Ace header. */
    325 
    326 #define OBJECT_INHERIT_ACE                (0x1)
    327 #define CONTAINER_INHERIT_ACE             (0x2)
    328 #define NO_PROPAGATE_INHERIT_ACE          (0x4)
    329 #define INHERIT_ONLY_ACE                  (0x8)
    330 #define INHERITED_ACE                     (0x10)
    331 #define VALID_INHERIT_FLAGS               (0x1F)
    332 
    333 #define SUCCESSFUL_ACCESS_ACE_FLAG        (0x40)
    334 #define FAILED_ACCESS_ACE_FLAG            (0x80)
    335 
    336 typedef struct _ACCESS_ALLOWED_ACE {
    337   ACE_HEADER Header;
    338   ACCESS_MASK Mask;
    339   ULONG SidStart;
    340 } ACCESS_ALLOWED_ACE, *PACCESS_ALLOWED_ACE;
    341 
    342 typedef struct _ACCESS_DENIED_ACE {
    343   ACE_HEADER Header;
    344   ACCESS_MASK Mask;
    345   ULONG SidStart;
    346 } ACCESS_DENIED_ACE, *PACCESS_DENIED_ACE;
    347 
    348 typedef struct _SYSTEM_AUDIT_ACE {
    349   ACE_HEADER Header;
    350   ACCESS_MASK Mask;
    351   ULONG SidStart;
    352 } SYSTEM_AUDIT_ACE, *PSYSTEM_AUDIT_ACE;
    353 
    354 typedef struct _SYSTEM_ALARM_ACE {
    355   ACE_HEADER Header;
    356   ACCESS_MASK Mask;
    357   ULONG SidStart;
    358 } SYSTEM_ALARM_ACE, *PSYSTEM_ALARM_ACE;
    359 
    360 typedef struct _SYSTEM_MANDATORY_LABEL_ACE {
    361   ACE_HEADER Header;
    362   ACCESS_MASK Mask;
    363   ULONG SidStart;
    364 } SYSTEM_MANDATORY_LABEL_ACE, *PSYSTEM_MANDATORY_LABEL_ACE;
    365 
    366 #define SYSTEM_MANDATORY_LABEL_NO_WRITE_UP         0x1
    367 #define SYSTEM_MANDATORY_LABEL_NO_READ_UP          0x2
    368 #define SYSTEM_MANDATORY_LABEL_NO_EXECUTE_UP       0x4
    369 #define SYSTEM_MANDATORY_LABEL_VALID_MASK (SYSTEM_MANDATORY_LABEL_NO_WRITE_UP   | \
    370                                            SYSTEM_MANDATORY_LABEL_NO_READ_UP    | \
    371                                            SYSTEM_MANDATORY_LABEL_NO_EXECUTE_UP)
    372 
    373 #define SECURITY_DESCRIPTOR_MIN_LENGTH   (sizeof(SECURITY_DESCRIPTOR))
    374 
    375 typedef USHORT SECURITY_DESCRIPTOR_CONTROL,*PSECURITY_DESCRIPTOR_CONTROL;
    376 
    377 #define SE_OWNER_DEFAULTED              0x0001
    378 #define SE_GROUP_DEFAULTED              0x0002
    379 #define SE_DACL_PRESENT                 0x0004
    380 #define SE_DACL_DEFAULTED               0x0008
    381 #define SE_SACL_PRESENT                 0x0010
    382 #define SE_SACL_DEFAULTED               0x0020
    383 #define SE_DACL_UNTRUSTED               0x0040
    384 #define SE_SERVER_SECURITY              0x0080
    385 #define SE_DACL_AUTO_INHERIT_REQ        0x0100
    386 #define SE_SACL_AUTO_INHERIT_REQ        0x0200
    387 #define SE_DACL_AUTO_INHERITED          0x0400
    388 #define SE_SACL_AUTO_INHERITED          0x0800
    389 #define SE_DACL_PROTECTED               0x1000
    390 #define SE_SACL_PROTECTED               0x2000
    391 #define SE_RM_CONTROL_VALID             0x4000
    392 #define SE_SELF_RELATIVE                0x8000
    393 
    394 typedef struct _SECURITY_DESCRIPTOR_RELATIVE {
    395   UCHAR Revision;
    396   UCHAR Sbz1;
    397   SECURITY_DESCRIPTOR_CONTROL Control;
    398   ULONG Owner;
    399   ULONG Group;
    400   ULONG Sacl;
    401   ULONG Dacl;
    402 } SECURITY_DESCRIPTOR_RELATIVE, *PISECURITY_DESCRIPTOR_RELATIVE;
    403 
    404 typedef struct _SECURITY_DESCRIPTOR {
    405   UCHAR Revision;
    406   UCHAR Sbz1;
    407   SECURITY_DESCRIPTOR_CONTROL Control;
    408   PSID Owner;
    409   PSID Group;
    410   PACL Sacl;
    411   PACL Dacl;
    412 } SECURITY_DESCRIPTOR, *PISECURITY_DESCRIPTOR;
    413 
    414 typedef struct _OBJECT_TYPE_LIST {
    415   USHORT Level;
    416   USHORT Sbz;
    417   GUID *ObjectType;
    418 } OBJECT_TYPE_LIST, *POBJECT_TYPE_LIST;
    419 
    420 #define ACCESS_OBJECT_GUID       0
    421 #define ACCESS_PROPERTY_SET_GUID 1
    422 #define ACCESS_PROPERTY_GUID     2
    423 #define ACCESS_MAX_LEVEL         4
    424 
    425 typedef enum _AUDIT_EVENT_TYPE {
    426   AuditEventObjectAccess,
    427   AuditEventDirectoryServiceAccess
    428 } AUDIT_EVENT_TYPE, *PAUDIT_EVENT_TYPE;
    429 
    430 #define AUDIT_ALLOW_NO_PRIVILEGE 0x1
    431 
    432 #define ACCESS_DS_SOURCE_A "DS"
    433 #define ACCESS_DS_SOURCE_W L"DS"
    434 #define ACCESS_DS_OBJECT_TYPE_NAME_A "Directory Service Object"
    435 #define ACCESS_DS_OBJECT_TYPE_NAME_W L"Directory Service Object"
    436 
    437 #define ACCESS_REASON_TYPE_MASK 0xffff0000
    438 #define ACCESS_REASON_DATA_MASK 0x0000ffff
    439 
    440 typedef enum _ACCESS_REASON_TYPE {
    441   AccessReasonNone = 0x00000000,
    442   AccessReasonAllowedAce = 0x00010000,
    443   AccessReasonDeniedAce = 0x00020000,
    444   AccessReasonAllowedParentAce = 0x00030000,
    445   AccessReasonDeniedParentAce = 0x00040000,
    446   AccessReasonMissingPrivilege = 0x00100000,
    447   AccessReasonFromPrivilege = 0x00200000,
    448   AccessReasonIntegrityLevel = 0x00300000,
    449   AccessReasonOwnership = 0x00400000,
    450   AccessReasonNullDacl = 0x00500000,
    451   AccessReasonEmptyDacl = 0x00600000,
    452   AccessReasonNoSD = 0x00700000,
    453   AccessReasonNoGrant = 0x00800000
    454 } ACCESS_REASON_TYPE;
    455 
    456 typedef ULONG ACCESS_REASON;
    457 
    458 typedef struct _ACCESS_REASONS {
    459   ACCESS_REASON Data[32];
    460 } ACCESS_REASONS, *PACCESS_REASONS;
    461 
    462 #define SE_SECURITY_DESCRIPTOR_FLAG_NO_OWNER_ACE    0x00000001
    463 #define SE_SECURITY_DESCRIPTOR_FLAG_NO_LABEL_ACE    0x00000002
    464 #define SE_SECURITY_DESCRIPTOR_VALID_FLAGS          0x00000003
    465 
    466 typedef struct _SE_SECURITY_DESCRIPTOR {
    467   ULONG Size;
    468   ULONG Flags;
    469   PSECURITY_DESCRIPTOR SecurityDescriptor;
    470 } SE_SECURITY_DESCRIPTOR, *PSE_SECURITY_DESCRIPTOR;
    471 
    472 typedef struct _SE_ACCESS_REQUEST {
    473   ULONG Size;
    474   PSE_SECURITY_DESCRIPTOR SeSecurityDescriptor;
    475   ACCESS_MASK DesiredAccess;
    476   ACCESS_MASK PreviouslyGrantedAccess;
    477   PSID PrincipalSelfSid;
    478   PGENERIC_MAPPING GenericMapping;
    479   ULONG ObjectTypeListCount;
    480   POBJECT_TYPE_LIST ObjectTypeList;
    481 } SE_ACCESS_REQUEST, *PSE_ACCESS_REQUEST;
    482 
    483 typedef struct _SE_ACCESS_REPLY {
    484   ULONG Size;
    485   ULONG ResultListCount;
    486   PACCESS_MASK GrantedAccess;
    487   PNTSTATUS AccessStatus;
    488   PACCESS_REASONS AccessReason;
    489   PPRIVILEGE_SET* Privileges;
    490 } SE_ACCESS_REPLY, *PSE_ACCESS_REPLY;
    491 
    492 typedef enum _SE_AUDIT_OPERATION {
    493   AuditPrivilegeObject,
    494   AuditPrivilegeService,
    495   AuditAccessCheck,
    496   AuditOpenObject,
    497   AuditOpenObjectWithTransaction,
    498   AuditCloseObject,
    499   AuditDeleteObject,
    500   AuditOpenObjectForDelete,
    501   AuditOpenObjectForDeleteWithTransaction,
    502   AuditCloseNonObject,
    503   AuditOpenNonObject,
    504   AuditObjectReference,
    505   AuditHandleCreation,
    506 } SE_AUDIT_OPERATION, *PSE_AUDIT_OPERATION;
    507 
    508 typedef struct _SE_AUDIT_INFO {
    509   ULONG Size;
    510   AUDIT_EVENT_TYPE AuditType;
    511   SE_AUDIT_OPERATION AuditOperation;
    512   ULONG AuditFlags;
    513   UNICODE_STRING SubsystemName;
    514   UNICODE_STRING ObjectTypeName;
    515   UNICODE_STRING ObjectName;
    516   PVOID HandleId;
    517   GUID* TransactionId;
    518   LUID* OperationId;
    519   BOOLEAN ObjectCreation;
    520   BOOLEAN GenerateOnClose;
    521 } SE_AUDIT_INFO, *PSE_AUDIT_INFO;
    522 
    523 #define TOKEN_ASSIGN_PRIMARY            (0x0001)
    524 #define TOKEN_DUPLICATE                 (0x0002)
    525 #define TOKEN_IMPERSONATE               (0x0004)
    526 #define TOKEN_QUERY                     (0x0008)
    527 #define TOKEN_QUERY_SOURCE              (0x0010)
    528 #define TOKEN_ADJUST_PRIVILEGES         (0x0020)
    529 #define TOKEN_ADJUST_GROUPS             (0x0040)
    530 #define TOKEN_ADJUST_DEFAULT            (0x0080)
    531 #define TOKEN_ADJUST_SESSIONID          (0x0100)
    532 
    533 #define TOKEN_ALL_ACCESS_P (STANDARD_RIGHTS_REQUIRED  |\
    534                             TOKEN_ASSIGN_PRIMARY      |\
    535                             TOKEN_DUPLICATE           |\
    536                             TOKEN_IMPERSONATE         |\
    537                             TOKEN_QUERY               |\
    538                             TOKEN_QUERY_SOURCE        |\
    539                             TOKEN_ADJUST_PRIVILEGES   |\
    540                             TOKEN_ADJUST_GROUPS       |\
    541                             TOKEN_ADJUST_DEFAULT )
    542 
    543 #if ((defined(_WIN32_WINNT) && (_WIN32_WINNT > 0x0400)) || (!defined(_WIN32_WINNT)))
    544 #define TOKEN_ALL_ACCESS  (TOKEN_ALL_ACCESS_P |\
    545                            TOKEN_ADJUST_SESSIONID )
    546 #else
    547 #define TOKEN_ALL_ACCESS  (TOKEN_ALL_ACCESS_P)
    548 #endif
    549 
    550 #define TOKEN_READ       (STANDARD_RIGHTS_READ     |\
    551                           TOKEN_QUERY)
    552 
    553 #define TOKEN_WRITE      (STANDARD_RIGHTS_WRITE    |\
    554                           TOKEN_ADJUST_PRIVILEGES  |\
    555                           TOKEN_ADJUST_GROUPS      |\
    556                           TOKEN_ADJUST_DEFAULT)
    557 
    558 #define TOKEN_EXECUTE    (STANDARD_RIGHTS_EXECUTE)
    559 
    560 typedef enum _TOKEN_TYPE {
    561   TokenPrimary = 1,
    562   TokenImpersonation
    563 } TOKEN_TYPE,*PTOKEN_TYPE;
    564 
    565 typedef enum _TOKEN_INFORMATION_CLASS {
    566   TokenUser = 1,
    567   TokenGroups,
    568   TokenPrivileges,
    569   TokenOwner,
    570   TokenPrimaryGroup,
    571   TokenDefaultDacl,
    572   TokenSource,
    573   TokenType,
    574   TokenImpersonationLevel,
    575   TokenStatistics,
    576   TokenRestrictedSids,
    577   TokenSessionId,
    578   TokenGroupsAndPrivileges,
    579   TokenSessionReference,
    580   TokenSandBoxInert,
    581   TokenAuditPolicy,
    582   TokenOrigin,
    583   TokenElevationType,
    584   TokenLinkedToken,
    585   TokenElevation,
    586   TokenHasRestrictions,
    587   TokenAccessInformation,
    588   TokenVirtualizationAllowed,
    589   TokenVirtualizationEnabled,
    590   TokenIntegrityLevel,
    591   TokenUIAccess,
    592   TokenMandatoryPolicy,
    593   TokenLogonSid,
    594   MaxTokenInfoClass
    595 } TOKEN_INFORMATION_CLASS, *PTOKEN_INFORMATION_CLASS;
    596 
    597 typedef struct _TOKEN_USER {
    598   SID_AND_ATTRIBUTES User;
    599 } TOKEN_USER, *PTOKEN_USER;
    600 
    601 typedef struct _TOKEN_GROUPS {
    602   ULONG GroupCount;
    603   SID_AND_ATTRIBUTES Groups[ANYSIZE_ARRAY];
    604 } TOKEN_GROUPS,*PTOKEN_GROUPS,*LPTOKEN_GROUPS;
    605 
    606 typedef struct _TOKEN_PRIVILEGES {
    607   ULONG PrivilegeCount;
    608   LUID_AND_ATTRIBUTES Privileges[ANYSIZE_ARRAY];
    609 } TOKEN_PRIVILEGES,*PTOKEN_PRIVILEGES,*LPTOKEN_PRIVILEGES;
    610 
    611 typedef struct _TOKEN_OWNER {
    612   PSID Owner;
    613 } TOKEN_OWNER,*PTOKEN_OWNER;
    614 
    615 typedef struct _TOKEN_PRIMARY_GROUP {
    616   PSID PrimaryGroup;
    617 } TOKEN_PRIMARY_GROUP,*PTOKEN_PRIMARY_GROUP;
    618 
    619 typedef struct _TOKEN_DEFAULT_DACL {
    620   PACL DefaultDacl;
    621 } TOKEN_DEFAULT_DACL,*PTOKEN_DEFAULT_DACL;
    622 
    623 typedef struct _TOKEN_GROUPS_AND_PRIVILEGES {
    624   ULONG SidCount;
    625   ULONG SidLength;
    626   PSID_AND_ATTRIBUTES Sids;
    627   ULONG RestrictedSidCount;
    628   ULONG RestrictedSidLength;
    629   PSID_AND_ATTRIBUTES RestrictedSids;
    630   ULONG PrivilegeCount;
    631   ULONG PrivilegeLength;
    632   PLUID_AND_ATTRIBUTES Privileges;
    633   LUID AuthenticationId;
    634 } TOKEN_GROUPS_AND_PRIVILEGES, *PTOKEN_GROUPS_AND_PRIVILEGES;
    635 
    636 typedef struct _TOKEN_LINKED_TOKEN {
    637   HANDLE LinkedToken;
    638 } TOKEN_LINKED_TOKEN, *PTOKEN_LINKED_TOKEN;
    639 
    640 typedef struct _TOKEN_ELEVATION {
    641   ULONG TokenIsElevated;
    642 } TOKEN_ELEVATION, *PTOKEN_ELEVATION;
    643 
    644 typedef struct _TOKEN_MANDATORY_LABEL {
    645   SID_AND_ATTRIBUTES Label;
    646 } TOKEN_MANDATORY_LABEL, *PTOKEN_MANDATORY_LABEL;
    647 
    648 #define TOKEN_MANDATORY_POLICY_OFF             0x0
    649 #define TOKEN_MANDATORY_POLICY_NO_WRITE_UP     0x1
    650 #define TOKEN_MANDATORY_POLICY_NEW_PROCESS_MIN 0x2
    651 
    652 #define TOKEN_MANDATORY_POLICY_VALID_MASK    (TOKEN_MANDATORY_POLICY_NO_WRITE_UP | \
    653                                               TOKEN_MANDATORY_POLICY_NEW_PROCESS_MIN)
    654 
    655 typedef struct _TOKEN_MANDATORY_POLICY {
    656   ULONG Policy;
    657 } TOKEN_MANDATORY_POLICY, *PTOKEN_MANDATORY_POLICY;
    658 
    659 typedef struct _TOKEN_ACCESS_INFORMATION {
    660   PSID_AND_ATTRIBUTES_HASH SidHash;
    661   PSID_AND_ATTRIBUTES_HASH RestrictedSidHash;
    662   PTOKEN_PRIVILEGES Privileges;
    663   LUID AuthenticationId;
    664   TOKEN_TYPE TokenType;
    665   SECURITY_IMPERSONATION_LEVEL ImpersonationLevel;
    666   TOKEN_MANDATORY_POLICY MandatoryPolicy;
    667   ULONG Flags;
    668 } TOKEN_ACCESS_INFORMATION, *PTOKEN_ACCESS_INFORMATION;
    669 
    670 #define POLICY_AUDIT_SUBCATEGORY_COUNT (53)
    671 
    672 typedef struct _TOKEN_AUDIT_POLICY {
    673   UCHAR PerUserPolicy[((POLICY_AUDIT_SUBCATEGORY_COUNT) >> 1) + 1];
    674 } TOKEN_AUDIT_POLICY, *PTOKEN_AUDIT_POLICY;
    675 
    676 #define TOKEN_SOURCE_LENGTH 8
    677 
    678 typedef struct _TOKEN_SOURCE {
    679   CHAR SourceName[TOKEN_SOURCE_LENGTH];
    680   LUID SourceIdentifier;
    681 } TOKEN_SOURCE,*PTOKEN_SOURCE;
    682 
    683 typedef struct _TOKEN_STATISTICS {
    684   LUID TokenId;
    685   LUID AuthenticationId;
    686   LARGE_INTEGER ExpirationTime;
    687   TOKEN_TYPE TokenType;
    688   SECURITY_IMPERSONATION_LEVEL ImpersonationLevel;
    689   ULONG DynamicCharged;
    690   ULONG DynamicAvailable;
    691   ULONG GroupCount;
    692   ULONG PrivilegeCount;
    693   LUID ModifiedId;
    694 } TOKEN_STATISTICS, *PTOKEN_STATISTICS;
    695 
    696 typedef struct _TOKEN_CONTROL {
    697   LUID TokenId;
    698   LUID AuthenticationId;
    699   LUID ModifiedId;
    700   TOKEN_SOURCE TokenSource;
    701 } TOKEN_CONTROL,*PTOKEN_CONTROL;
    702 
    703 typedef struct _TOKEN_ORIGIN {
    704   LUID OriginatingLogonSession;
    705 } TOKEN_ORIGIN, *PTOKEN_ORIGIN;
    706 
    707 typedef enum _MANDATORY_LEVEL {
    708   MandatoryLevelUntrusted = 0,
    709   MandatoryLevelLow,
    710   MandatoryLevelMedium,
    711   MandatoryLevelHigh,
    712   MandatoryLevelSystem,
    713   MandatoryLevelSecureProcess,
    714   MandatoryLevelCount
    715 } MANDATORY_LEVEL, *PMANDATORY_LEVEL;
    716 
    717 #define TOKEN_HAS_TRAVERSE_PRIVILEGE    0x0001
    718 #define TOKEN_HAS_BACKUP_PRIVILEGE      0x0002
    719 #define TOKEN_HAS_RESTORE_PRIVILEGE     0x0004
    720 #define TOKEN_WRITE_RESTRICTED          0x0008
    721 #define TOKEN_IS_RESTRICTED             0x0010
    722 #define TOKEN_SESSION_NOT_REFERENCED    0x0020
    723 #define TOKEN_SANDBOX_INERT             0x0040
    724 #define TOKEN_HAS_IMPERSONATE_PRIVILEGE 0x0080
    725 #define SE_BACKUP_PRIVILEGES_CHECKED    0x0100
    726 #define TOKEN_VIRTUALIZE_ALLOWED        0x0200
    727 #define TOKEN_VIRTUALIZE_ENABLED        0x0400
    728 #define TOKEN_IS_FILTERED               0x0800
    729 #define TOKEN_UIACCESS                  0x1000
    730 #define TOKEN_NOT_LOW                   0x2000
    731 
    732 typedef struct _SE_EXPORTS {
    733   LUID SeCreateTokenPrivilege;
    734   LUID SeAssignPrimaryTokenPrivilege;
    735   LUID SeLockMemoryPrivilege;
    736   LUID SeIncreaseQuotaPrivilege;
    737   LUID SeUnsolicitedInputPrivilege;
    738   LUID SeTcbPrivilege;
    739   LUID SeSecurityPrivilege;
    740   LUID SeTakeOwnershipPrivilege;
    741   LUID SeLoadDriverPrivilege;
    742   LUID SeCreatePagefilePrivilege;
    743   LUID SeIncreaseBasePriorityPrivilege;
    744   LUID SeSystemProfilePrivilege;
    745   LUID SeSystemtimePrivilege;
    746   LUID SeProfileSingleProcessPrivilege;
    747   LUID SeCreatePermanentPrivilege;
    748   LUID SeBackupPrivilege;
    749   LUID SeRestorePrivilege;
    750   LUID SeShutdownPrivilege;
    751   LUID SeDebugPrivilege;
    752   LUID SeAuditPrivilege;
    753   LUID SeSystemEnvironmentPrivilege;
    754   LUID SeChangeNotifyPrivilege;
    755   LUID SeRemoteShutdownPrivilege;
    756   PSID SeNullSid;
    757   PSID SeWorldSid;
    758   PSID SeLocalSid;
    759   PSID SeCreatorOwnerSid;
    760   PSID SeCreatorGroupSid;
    761   PSID SeNtAuthoritySid;
    762   PSID SeDialupSid;
    763   PSID SeNetworkSid;
    764   PSID SeBatchSid;
    765   PSID SeInteractiveSid;
    766   PSID SeLocalSystemSid;
    767   PSID SeAliasAdminsSid;
    768   PSID SeAliasUsersSid;
    769   PSID SeAliasGuestsSid;
    770   PSID SeAliasPowerUsersSid;
    771   PSID SeAliasAccountOpsSid;
    772   PSID SeAliasSystemOpsSid;
    773   PSID SeAliasPrintOpsSid;
    774   PSID SeAliasBackupOpsSid;
    775   PSID SeAuthenticatedUsersSid;
    776   PSID SeRestrictedSid;
    777   PSID SeAnonymousLogonSid;
    778   LUID SeUndockPrivilege;
    779   LUID SeSyncAgentPrivilege;
    780   LUID SeEnableDelegationPrivilege;
    781   PSID SeLocalServiceSid;
    782   PSID SeNetworkServiceSid;
    783   LUID SeManageVolumePrivilege;
    784   LUID SeImpersonatePrivilege;
    785   LUID SeCreateGlobalPrivilege;
    786   LUID SeTrustedCredManAccessPrivilege;
    787   LUID SeRelabelPrivilege;
    788   LUID SeIncreaseWorkingSetPrivilege;
    789   LUID SeTimeZonePrivilege;
    790   LUID SeCreateSymbolicLinkPrivilege;
    791   PSID SeIUserSid;
    792   PSID SeUntrustedMandatorySid;
    793   PSID SeLowMandatorySid;
    794   PSID SeMediumMandatorySid;
    795   PSID SeHighMandatorySid;
    796   PSID SeSystemMandatorySid;
    797   PSID SeOwnerRightsSid;
    798 } SE_EXPORTS, *PSE_EXPORTS;
    799 
    800 typedef NTSTATUS
    801 (NTAPI *PSE_LOGON_SESSION_TERMINATED_ROUTINE)(
    802   IN PLUID LogonId);
    803 /******************************************************************************
    804  *                           Runtime Library Types                            *
    805  ******************************************************************************/
    806 
    807 
    808 #define RTL_SYSTEM_VOLUME_INFORMATION_FOLDER    L"System Volume Information"
    809 
    810 typedef PVOID
    811 (NTAPI *PRTL_ALLOCATE_STRING_ROUTINE)(
    812   IN SIZE_T NumberOfBytes);
    813 
    814 #if _WIN32_WINNT >= 0x0600
    815 typedef PVOID
    816 (NTAPI *PRTL_REALLOCATE_STRING_ROUTINE)(
    817   IN SIZE_T NumberOfBytes,
    818   IN PVOID Buffer);
    819 #endif
    820 
    821 typedef VOID
    822 (NTAPI *PRTL_FREE_STRING_ROUTINE)(
    823   IN PVOID Buffer);
    824 
    825 extern const PRTL_ALLOCATE_STRING_ROUTINE RtlAllocateStringRoutine;
    826 extern const PRTL_FREE_STRING_ROUTINE RtlFreeStringRoutine;
    827 
    828 #if _WIN32_WINNT >= 0x0600
    829 extern const PRTL_REALLOCATE_STRING_ROUTINE RtlReallocateStringRoutine;
    830 #endif
    831 
    832 typedef NTSTATUS
    833 (NTAPI * PRTL_HEAP_COMMIT_ROUTINE) (
    834   IN PVOID Base,
    835   IN OUT PVOID *CommitAddress,
    836   IN OUT PSIZE_T CommitSize);
    837 
    838 typedef struct _RTL_HEAP_PARAMETERS {
    839   ULONG Length;
    840   SIZE_T SegmentReserve;
    841   SIZE_T SegmentCommit;
    842   SIZE_T DeCommitFreeBlockThreshold;
    843   SIZE_T DeCommitTotalFreeThreshold;
    844   SIZE_T MaximumAllocationSize;
    845   SIZE_T VirtualMemoryThreshold;
    846   SIZE_T InitialCommit;
    847   SIZE_T InitialReserve;
    848   PRTL_HEAP_COMMIT_ROUTINE CommitRoutine;
    849   SIZE_T Reserved[2];
    850 } RTL_HEAP_PARAMETERS, *PRTL_HEAP_PARAMETERS;
    851 
    852 #if (NTDDI_VERSION >= NTDDI_WIN2K)
    853 
    854 typedef struct _GENERATE_NAME_CONTEXT {
    855   USHORT Checksum;
    856   BOOLEAN CheckSumInserted;
    857   UCHAR NameLength;
    858   WCHAR NameBuffer[8];
    859   ULONG ExtensionLength;
    860   WCHAR ExtensionBuffer[4];
    861   ULONG LastIndexValue;
    862 } GENERATE_NAME_CONTEXT, *PGENERATE_NAME_CONTEXT;
    863 
    864 typedef struct _PREFIX_TABLE_ENTRY {
    865   CSHORT NodeTypeCode;
    866   CSHORT NameLength;
    867   struct _PREFIX_TABLE_ENTRY *NextPrefixTree;
    868   RTL_SPLAY_LINKS Links;
    869   PSTRING Prefix;
    870 } PREFIX_TABLE_ENTRY, *PPREFIX_TABLE_ENTRY;
    871 
    872 typedef struct _PREFIX_TABLE {
    873   CSHORT NodeTypeCode;
    874   CSHORT NameLength;
    875   PPREFIX_TABLE_ENTRY NextPrefixTree;
    876 } PREFIX_TABLE, *PPREFIX_TABLE;
    877 
    878 typedef struct _UNICODE_PREFIX_TABLE_ENTRY {
    879   CSHORT NodeTypeCode;
    880   CSHORT NameLength;
    881   struct _UNICODE_PREFIX_TABLE_ENTRY *NextPrefixTree;
    882   struct _UNICODE_PREFIX_TABLE_ENTRY *CaseMatch;
    883   RTL_SPLAY_LINKS Links;
    884   PUNICODE_STRING Prefix;
    885 } UNICODE_PREFIX_TABLE_ENTRY, *PUNICODE_PREFIX_TABLE_ENTRY;
    886 
    887 typedef struct _UNICODE_PREFIX_TABLE {
    888   CSHORT NodeTypeCode;
    889   CSHORT NameLength;
    890   PUNICODE_PREFIX_TABLE_ENTRY NextPrefixTree;
    891   PUNICODE_PREFIX_TABLE_ENTRY LastNextEntry;
    892 } UNICODE_PREFIX_TABLE, *PUNICODE_PREFIX_TABLE;
    893 
    894 #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
    895 
    896 #if (NTDDI_VERSION >= NTDDI_WINXP)
    897 typedef struct _COMPRESSED_DATA_INFO {
    898   USHORT CompressionFormatAndEngine;
    899   UCHAR CompressionUnitShift;
    900   UCHAR ChunkShift;
    901   UCHAR ClusterShift;
    902   UCHAR Reserved;
    903   USHORT NumberOfChunks;
    904   ULONG CompressedChunkSizes[ANYSIZE_ARRAY];
    905 } COMPRESSED_DATA_INFO, *PCOMPRESSED_DATA_INFO;
    906 #endif
    907 
    908 /******************************************************************************
    909  *                         Runtime Library Functions                          *
    910  ******************************************************************************/
    911 
    912 #if (NTDDI_VERSION >= NTDDI_WIN2K)
    913 
    914 NTSYSAPI
    915 PVOID
    916 NTAPI
    917 RtlAllocateHeap(
    918   IN HANDLE HeapHandle,
    919   IN ULONG Flags OPTIONAL,
    920   IN SIZE_T Size);
    921 
    922 NTSYSAPI
    923 BOOLEAN
    924 NTAPI
    925 RtlFreeHeap(
    926   IN PVOID HeapHandle,
    927   IN ULONG Flags OPTIONAL,
    928   IN PVOID BaseAddress);
    929 
    930 NTSYSAPI
    931 VOID
    932 NTAPI
    933 RtlCaptureContext(
    934   OUT PCONTEXT ContextRecord);
    935 
    936 NTSYSAPI
    937 ULONG
    938 NTAPI
    939 RtlRandom(
    940   IN OUT PULONG Seed);
    941 
    942 NTSYSAPI
    943 BOOLEAN
    944 NTAPI
    945 RtlCreateUnicodeString(
    946   OUT PUNICODE_STRING DestinationString,
    947   IN PCWSTR SourceString);
    948 
    949 NTSYSAPI
    950 NTSTATUS
    951 NTAPI
    952 RtlAppendStringToString(
    953   IN OUT PSTRING Destination,
    954   IN const STRING *Source);
    955 
    956 NTSYSAPI
    957 NTSTATUS
    958 NTAPI
    959 RtlOemStringToUnicodeString(
    960   IN OUT PUNICODE_STRING DestinationString,
    961   IN PCOEM_STRING SourceString,
    962   IN BOOLEAN AllocateDestinationString);
    963 
    964 NTSYSAPI
    965 NTSTATUS
    966 NTAPI
    967 RtlUnicodeStringToOemString(
    968   IN OUT POEM_STRING DestinationString,
    969   IN PCUNICODE_STRING SourceString,
    970   IN BOOLEAN AllocateDestinationString);
    971 
    972 NTSYSAPI
    973 NTSTATUS
    974 NTAPI
    975 RtlUpcaseUnicodeStringToOemString(
    976   IN OUT POEM_STRING DestinationString,
    977   IN PCUNICODE_STRING SourceString,
    978   IN BOOLEAN AllocateDestinationString);
    979 
    980 NTSYSAPI
    981 NTSTATUS
    982 NTAPI
    983 RtlOemStringToCountedUnicodeString(
    984   IN OUT PUNICODE_STRING DestinationString,
    985   IN PCOEM_STRING SourceString,
    986   IN BOOLEAN AllocateDestinationString);
    987 
    988 NTSYSAPI
    989 NTSTATUS
    990 NTAPI
    991 RtlUnicodeStringToCountedOemString(
    992   IN OUT POEM_STRING DestinationString,
    993   IN PCUNICODE_STRING SourceString,
    994   IN BOOLEAN AllocateDestinationString);
    995 
    996 NTSYSAPI
    997 NTSTATUS
    998 NTAPI
    999 RtlUpcaseUnicodeStringToCountedOemString(
   1000   IN OUT POEM_STRING DestinationString,
   1001   IN PCUNICODE_STRING SourceString,
   1002   IN BOOLEAN AllocateDestinationString);
   1003 
   1004 NTSYSAPI
   1005 NTSTATUS
   1006 NTAPI
   1007 RtlDowncaseUnicodeString(
   1008   IN OUT PUNICODE_STRING UniDest,
   1009   IN PCUNICODE_STRING UniSource,
   1010   IN BOOLEAN AllocateDestinationString);
   1011 
   1012 NTSYSAPI
   1013 VOID
   1014 NTAPI
   1015 RtlFreeOemString (
   1016   IN OUT POEM_STRING OemString);
   1017 
   1018 NTSYSAPI
   1019 ULONG
   1020 NTAPI
   1021 RtlxUnicodeStringToOemSize(
   1022   IN PCUNICODE_STRING UnicodeString);
   1023 
   1024 NTSYSAPI
   1025 ULONG
   1026 NTAPI
   1027 RtlxOemStringToUnicodeSize(
   1028   IN PCOEM_STRING OemString);
   1029 
   1030 NTSYSAPI
   1031 NTSTATUS
   1032 NTAPI
   1033 RtlMultiByteToUnicodeN(
   1034   OUT PWCH UnicodeString,
   1035   IN ULONG MaxBytesInUnicodeString,
   1036   OUT PULONG BytesInUnicodeString OPTIONAL,
   1037   IN const CHAR *MultiByteString,
   1038   IN ULONG BytesInMultiByteString);
   1039 
   1040 NTSYSAPI
   1041 NTSTATUS
   1042 NTAPI
   1043 RtlMultiByteToUnicodeSize(
   1044   OUT PULONG BytesInUnicodeString,
   1045   IN const CHAR *MultiByteString,
   1046   IN ULONG BytesInMultiByteString);
   1047 
   1048 NTSYSAPI
   1049 NTSTATUS
   1050 NTAPI
   1051 RtlUnicodeToMultiByteSize(
   1052   OUT PULONG BytesInMultiByteString,
   1053   IN PCWCH UnicodeString,
   1054   IN ULONG BytesInUnicodeString);
   1055 
   1056 NTSYSAPI
   1057 NTSTATUS
   1058 NTAPI
   1059 RtlUnicodeToMultiByteN(
   1060   OUT PCHAR MultiByteString,
   1061   IN ULONG MaxBytesInMultiByteString,
   1062   OUT PULONG BytesInMultiByteString OPTIONAL,
   1063   IN PWCH UnicodeString,
   1064   IN ULONG BytesInUnicodeString);
   1065 
   1066 NTSYSAPI
   1067 NTSTATUS
   1068 NTAPI
   1069 RtlUpcaseUnicodeToMultiByteN(
   1070   OUT PCHAR MultiByteString,
   1071   IN ULONG MaxBytesInMultiByteString,
   1072   OUT PULONG BytesInMultiByteString OPTIONAL,
   1073   IN PCWCH UnicodeString,
   1074   IN ULONG BytesInUnicodeString);
   1075 
   1076 NTSYSAPI
   1077 NTSTATUS
   1078 NTAPI
   1079 RtlOemToUnicodeN(
   1080   OUT PWSTR UnicodeString,
   1081   IN ULONG MaxBytesInUnicodeString,
   1082   OUT PULONG BytesInUnicodeString OPTIONAL,
   1083   IN PCCH OemString,
   1084   IN ULONG BytesInOemString);
   1085 
   1086 NTSYSAPI
   1087 NTSTATUS
   1088 NTAPI
   1089 RtlUnicodeToOemN(
   1090   OUT PCHAR OemString,
   1091   IN ULONG MaxBytesInOemString,
   1092   OUT PULONG BytesInOemString OPTIONAL,
   1093   IN PCWCH UnicodeString,
   1094   IN ULONG BytesInUnicodeString);
   1095 
   1096 NTSYSAPI
   1097 NTSTATUS
   1098 NTAPI
   1099 RtlUpcaseUnicodeToOemN(
   1100   OUT PCHAR OemString,
   1101   IN ULONG MaxBytesInOemString,
   1102   OUT PULONG BytesInOemString OPTIONAL,
   1103   IN PCWCH UnicodeString,
   1104   IN ULONG BytesInUnicodeString);
   1105 
   1106 #if (NTDDI_VERSION >= NTDDI_VISTASP1)
   1107 NTSYSAPI
   1108 NTSTATUS
   1109 NTAPI
   1110 RtlGenerate8dot3Name(
   1111   IN PCUNICODE_STRING Name,
   1112   IN BOOLEAN AllowExtendedCharacters,
   1113   IN OUT PGENERATE_NAME_CONTEXT Context,
   1114   IN OUT PUNICODE_STRING Name8dot3);
   1115 #else
   1116 NTSYSAPI
   1117 VOID
   1118 NTAPI
   1119 RtlGenerate8dot3Name(
   1120   IN PCUNICODE_STRING Name,
   1121   IN BOOLEAN AllowExtendedCharacters,
   1122   IN OUT PGENERATE_NAME_CONTEXT Context,
   1123   IN OUT PUNICODE_STRING Name8dot3);
   1124 #endif
   1125 
   1126 NTSYSAPI
   1127 BOOLEAN
   1128 NTAPI
   1129 RtlIsNameLegalDOS8Dot3(
   1130   IN PCUNICODE_STRING Name,
   1131   IN OUT POEM_STRING OemName OPTIONAL,
   1132   IN OUT PBOOLEAN NameContainsSpaces OPTIONAL);
   1133 
   1134 NTSYSAPI
   1135 BOOLEAN
   1136 NTAPI
   1137 RtlIsValidOemCharacter(
   1138   IN OUT PWCHAR Char);
   1139 
   1140 NTSYSAPI
   1141 VOID
   1142 NTAPI
   1143 PfxInitialize(
   1144   OUT PPREFIX_TABLE PrefixTable);
   1145 
   1146 NTSYSAPI
   1147 BOOLEAN
   1148 NTAPI
   1149 PfxInsertPrefix(
   1150   IN PPREFIX_TABLE PrefixTable,
   1151   IN PSTRING Prefix,
   1152   OUT PPREFIX_TABLE_ENTRY PrefixTableEntry);
   1153 
   1154 NTSYSAPI
   1155 VOID
   1156 NTAPI
   1157 PfxRemovePrefix(
   1158   IN PPREFIX_TABLE PrefixTable,
   1159   IN PPREFIX_TABLE_ENTRY PrefixTableEntry);
   1160 
   1161 NTSYSAPI
   1162 PPREFIX_TABLE_ENTRY
   1163 NTAPI
   1164 PfxFindPrefix(
   1165   IN PPREFIX_TABLE PrefixTable,
   1166   IN PSTRING FullName);
   1167 
   1168 NTSYSAPI
   1169 VOID
   1170 NTAPI
   1171 RtlInitializeUnicodePrefix(
   1172   OUT PUNICODE_PREFIX_TABLE PrefixTable);
   1173 
   1174 NTSYSAPI
   1175 BOOLEAN
   1176 NTAPI
   1177 RtlInsertUnicodePrefix(
   1178   IN PUNICODE_PREFIX_TABLE PrefixTable,
   1179   IN PUNICODE_STRING Prefix,
   1180   OUT PUNICODE_PREFIX_TABLE_ENTRY PrefixTableEntry);
   1181 
   1182 NTSYSAPI
   1183 VOID
   1184 NTAPI
   1185 RtlRemoveUnicodePrefix(
   1186   IN PUNICODE_PREFIX_TABLE PrefixTable,
   1187   IN PUNICODE_PREFIX_TABLE_ENTRY PrefixTableEntry);
   1188 
   1189 NTSYSAPI
   1190 PUNICODE_PREFIX_TABLE_ENTRY
   1191 NTAPI
   1192 RtlFindUnicodePrefix(
   1193   IN PUNICODE_PREFIX_TABLE PrefixTable,
   1194   IN PUNICODE_STRING FullName,
   1195   IN ULONG CaseInsensitiveIndex);
   1196 
   1197 NTSYSAPI
   1198 PUNICODE_PREFIX_TABLE_ENTRY
   1199 NTAPI
   1200 RtlNextUnicodePrefix(
   1201   IN PUNICODE_PREFIX_TABLE PrefixTable,
   1202   IN BOOLEAN Restart);
   1203 
   1204 NTSYSAPI
   1205 SIZE_T
   1206 NTAPI
   1207 RtlCompareMemoryUlong(
   1208   IN PVOID Source,
   1209   IN SIZE_T Length,
   1210   IN ULONG Pattern);
   1211 
   1212 NTSYSAPI
   1213 BOOLEAN
   1214 NTAPI
   1215 RtlTimeToSecondsSince1980(
   1216   IN PLARGE_INTEGER Time,
   1217   OUT PULONG ElapsedSeconds);
   1218 
   1219 NTSYSAPI
   1220 VOID
   1221 NTAPI
   1222 RtlSecondsSince1980ToTime(
   1223   IN ULONG ElapsedSeconds,
   1224   OUT PLARGE_INTEGER Time);
   1225 
   1226 NTSYSAPI
   1227 BOOLEAN
   1228 NTAPI
   1229 RtlTimeToSecondsSince1970(
   1230   IN PLARGE_INTEGER Time,
   1231   OUT PULONG ElapsedSeconds);
   1232 
   1233 NTSYSAPI
   1234 VOID
   1235 NTAPI
   1236 RtlSecondsSince1970ToTime(
   1237   IN ULONG ElapsedSeconds,
   1238   OUT PLARGE_INTEGER Time);
   1239 
   1240 NTSYSAPI
   1241 BOOLEAN
   1242 NTAPI
   1243 RtlValidSid(
   1244   IN PSID Sid);
   1245 
   1246 NTSYSAPI
   1247 BOOLEAN
   1248 NTAPI
   1249 RtlEqualSid(
   1250   IN PSID Sid1,
   1251   IN PSID Sid2);
   1252 
   1253 NTSYSAPI
   1254 BOOLEAN
   1255 NTAPI
   1256 RtlEqualPrefixSid(
   1257   IN PSID Sid1,
   1258   IN PSID Sid2);
   1259 
   1260 NTSYSAPI
   1261 ULONG
   1262 NTAPI
   1263 RtlLengthRequiredSid(
   1264   IN ULONG SubAuthorityCount);
   1265 
   1266 NTSYSAPI
   1267 PVOID
   1268 NTAPI
   1269 RtlFreeSid(
   1270   IN PSID Sid);
   1271 
   1272 NTSYSAPI
   1273 NTSTATUS
   1274 NTAPI
   1275 RtlAllocateAndInitializeSid(
   1276   IN PSID_IDENTIFIER_AUTHORITY IdentifierAuthority,
   1277   IN UCHAR SubAuthorityCount,
   1278   IN ULONG SubAuthority0,
   1279   IN ULONG SubAuthority1,
   1280   IN ULONG SubAuthority2,
   1281   IN ULONG SubAuthority3,
   1282   IN ULONG SubAuthority4,
   1283   IN ULONG SubAuthority5,
   1284   IN ULONG SubAuthority6,
   1285   IN ULONG SubAuthority7,
   1286   OUT PSID *Sid);
   1287 
   1288 NTSYSAPI
   1289 NTSTATUS
   1290 NTAPI
   1291 RtlInitializeSid(
   1292   OUT PSID Sid,
   1293   IN PSID_IDENTIFIER_AUTHORITY IdentifierAuthority,
   1294   IN UCHAR SubAuthorityCount);
   1295 
   1296 NTSYSAPI
   1297 PULONG
   1298 NTAPI
   1299 RtlSubAuthoritySid(
   1300   IN PSID Sid,
   1301   IN ULONG SubAuthority);
   1302 
   1303 NTSYSAPI
   1304 ULONG
   1305 NTAPI
   1306 RtlLengthSid(
   1307   IN PSID Sid);
   1308 
   1309 NTSYSAPI
   1310 NTSTATUS
   1311 NTAPI
   1312 RtlCopySid(
   1313   IN ULONG Length,
   1314   IN PSID Destination,
   1315   IN PSID Source);
   1316 
   1317 NTSYSAPI
   1318 NTSTATUS
   1319 NTAPI
   1320 RtlConvertSidToUnicodeString(
   1321   IN OUT PUNICODE_STRING UnicodeString,
   1322   IN PSID Sid,
   1323   IN BOOLEAN AllocateDestinationString);
   1324 
   1325 NTSYSAPI
   1326 VOID
   1327 NTAPI
   1328 RtlCopyLuid(
   1329   OUT PLUID DestinationLuid,
   1330   IN PLUID SourceLuid);
   1331 
   1332 NTSYSAPI
   1333 NTSTATUS
   1334 NTAPI
   1335 RtlCreateAcl(
   1336   OUT PACL Acl,
   1337   IN ULONG AclLength,
   1338   IN ULONG AclRevision);
   1339 
   1340 NTSYSAPI
   1341 NTSTATUS
   1342 NTAPI
   1343 RtlAddAce(
   1344   IN OUT PACL Acl,
   1345   IN ULONG AceRevision,
   1346   IN ULONG StartingAceIndex,
   1347   IN PVOID AceList,
   1348   IN ULONG AceListLength);
   1349 
   1350 NTSYSAPI
   1351 NTSTATUS
   1352 NTAPI
   1353 RtlDeleteAce(
   1354   IN OUT PACL Acl,
   1355   IN ULONG AceIndex);
   1356 
   1357 NTSYSAPI
   1358 NTSTATUS
   1359 NTAPI
   1360 RtlGetAce(
   1361   IN PACL Acl,
   1362   IN ULONG AceIndex,
   1363   OUT PVOID *Ace);
   1364 
   1365 NTSYSAPI
   1366 NTSTATUS
   1367 NTAPI
   1368 RtlAddAccessAllowedAce(
   1369   IN OUT PACL Acl,
   1370   IN ULONG AceRevision,
   1371   IN ACCESS_MASK AccessMask,
   1372   IN PSID Sid);
   1373 
   1374 NTSYSAPI
   1375 NTSTATUS
   1376 NTAPI
   1377 RtlAddAccessAllowedAceEx(
   1378   IN OUT PACL Acl,
   1379   IN ULONG AceRevision,
   1380   IN ULONG AceFlags,
   1381   IN ACCESS_MASK AccessMask,
   1382   IN PSID Sid);
   1383 
   1384 NTSYSAPI
   1385 NTSTATUS
   1386 NTAPI
   1387 RtlCreateSecurityDescriptorRelative(
   1388   OUT PISECURITY_DESCRIPTOR_RELATIVE SecurityDescriptor,
   1389   IN ULONG Revision);
   1390 
   1391 NTSYSAPI
   1392 NTSTATUS
   1393 NTAPI
   1394 RtlGetDaclSecurityDescriptor(
   1395   IN PSECURITY_DESCRIPTOR SecurityDescriptor,
   1396   OUT PBOOLEAN DaclPresent,
   1397   OUT PACL *Dacl,
   1398   OUT PBOOLEAN DaclDefaulted);
   1399 
   1400 NTSYSAPI
   1401 NTSTATUS
   1402 NTAPI
   1403 RtlSetOwnerSecurityDescriptor(
   1404   IN OUT PSECURITY_DESCRIPTOR SecurityDescriptor,
   1405   IN PSID Owner OPTIONAL,
   1406   IN BOOLEAN OwnerDefaulted);
   1407 
   1408 NTSYSAPI
   1409 NTSTATUS
   1410 NTAPI
   1411 RtlGetOwnerSecurityDescriptor(
   1412   IN PSECURITY_DESCRIPTOR SecurityDescriptor,
   1413   OUT PSID *Owner,
   1414   OUT PBOOLEAN OwnerDefaulted);
   1415 
   1416 NTSYSAPI
   1417 ULONG
   1418 NTAPI
   1419 RtlNtStatusToDosError(
   1420   IN NTSTATUS Status);
   1421 
   1422 NTSYSAPI
   1423 NTSTATUS
   1424 NTAPI
   1425 RtlCustomCPToUnicodeN(
   1426   IN PCPTABLEINFO CustomCP,
   1427   OUT PWCH UnicodeString,
   1428   IN ULONG MaxBytesInUnicodeString,
   1429   OUT PULONG BytesInUnicodeString OPTIONAL,
   1430   IN PCH CustomCPString,
   1431   IN ULONG BytesInCustomCPString);
   1432 
   1433 NTSYSAPI
   1434 NTSTATUS
   1435 NTAPI
   1436 RtlUnicodeToCustomCPN(
   1437   IN PCPTABLEINFO CustomCP,
   1438   OUT PCH CustomCPString,
   1439   IN ULONG MaxBytesInCustomCPString,
   1440   OUT PULONG BytesInCustomCPString OPTIONAL,
   1441   IN PWCH UnicodeString,
   1442   IN ULONG BytesInUnicodeString);
   1443 
   1444 NTSYSAPI
   1445 NTSTATUS
   1446 NTAPI
   1447 RtlUpcaseUnicodeToCustomCPN(
   1448   IN PCPTABLEINFO CustomCP,
   1449   OUT PCH CustomCPString,
   1450   IN ULONG MaxBytesInCustomCPString,
   1451   OUT PULONG BytesInCustomCPString OPTIONAL,
   1452   IN PWCH UnicodeString,
   1453   IN ULONG BytesInUnicodeString);
   1454 
   1455 NTSYSAPI
   1456 VOID
   1457 NTAPI
   1458 RtlInitCodePageTable(
   1459   IN PUSHORT TableBase,
   1460   IN OUT PCPTABLEINFO CodePageTable);
   1461 
   1462 
   1463 #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
   1464 
   1465 
   1466 #if (NTDDI_VERSION >= NTDDI_WINXP)
   1467 
   1468 NTSYSAPI
   1469 PVOID
   1470 NTAPI
   1471 RtlCreateHeap(
   1472   IN ULONG Flags,
   1473   IN PVOID HeapBase OPTIONAL,
   1474   IN SIZE_T ReserveSize OPTIONAL,
   1475   IN SIZE_T CommitSize OPTIONAL,
   1476   IN PVOID Lock OPTIONAL,
   1477   IN PRTL_HEAP_PARAMETERS Parameters OPTIONAL);
   1478 
   1479 NTSYSAPI
   1480 PVOID
   1481 NTAPI
   1482 RtlDestroyHeap(
   1483   IN PVOID HeapHandle);
   1484 
   1485 NTSYSAPI
   1486 USHORT
   1487 NTAPI
   1488 RtlCaptureStackBackTrace(
   1489   IN ULONG FramesToSkip,
   1490   IN ULONG FramesToCapture,
   1491   OUT PVOID *BackTrace,
   1492   OUT PULONG BackTraceHash OPTIONAL);
   1493 
   1494 NTSYSAPI
   1495 ULONG
   1496 NTAPI
   1497 RtlRandomEx(
   1498   IN OUT PULONG Seed);
   1499 
   1500 NTSYSAPI
   1501 NTSTATUS
   1502 NTAPI
   1503 RtlInitUnicodeStringEx(
   1504   OUT PUNICODE_STRING DestinationString,
   1505   IN PCWSTR SourceString OPTIONAL);
   1506 
   1507 NTSYSAPI
   1508 NTSTATUS
   1509 NTAPI
   1510 RtlValidateUnicodeString(
   1511   IN ULONG Flags,
   1512   IN PCUNICODE_STRING String);
   1513 
   1514 NTSYSAPI
   1515 NTSTATUS
   1516 NTAPI
   1517 RtlDuplicateUnicodeString(
   1518   IN ULONG Flags,
   1519   IN PCUNICODE_STRING SourceString,
   1520   OUT PUNICODE_STRING DestinationString);
   1521 
   1522 NTSYSAPI
   1523 NTSTATUS
   1524 NTAPI
   1525 RtlGetCompressionWorkSpaceSize(
   1526   IN USHORT CompressionFormatAndEngine,
   1527   OUT PULONG CompressBufferWorkSpaceSize,
   1528   OUT PULONG CompressFragmentWorkSpaceSize);
   1529 
   1530 NTSYSAPI
   1531 NTSTATUS
   1532 NTAPI
   1533 RtlCompressBuffer(
   1534   IN USHORT CompressionFormatAndEngine,
   1535   IN PUCHAR UncompressedBuffer,
   1536   IN ULONG UncompressedBufferSize,
   1537   OUT PUCHAR CompressedBuffer,
   1538   IN ULONG CompressedBufferSize,
   1539   IN ULONG UncompressedChunkSize,
   1540   OUT PULONG FinalCompressedSize,
   1541   IN PVOID WorkSpace);
   1542 
   1543 NTSYSAPI
   1544 NTSTATUS
   1545 NTAPI
   1546 RtlDecompressBuffer(
   1547   IN USHORT CompressionFormat,
   1548   OUT PUCHAR UncompressedBuffer,
   1549   IN ULONG UncompressedBufferSize,
   1550   IN PUCHAR CompressedBuffer,
   1551   IN ULONG CompressedBufferSize,
   1552   OUT PULONG FinalUncompressedSize);
   1553 
   1554 NTSYSAPI
   1555 NTSTATUS
   1556 NTAPI
   1557 RtlDecompressFragment(
   1558   IN USHORT CompressionFormat,
   1559   OUT PUCHAR UncompressedFragment,
   1560   IN ULONG UncompressedFragmentSize,
   1561   IN PUCHAR CompressedBuffer,
   1562   IN ULONG CompressedBufferSize,
   1563   IN ULONG FragmentOffset,
   1564   OUT PULONG FinalUncompressedSize,
   1565   IN PVOID WorkSpace);
   1566 
   1567 NTSYSAPI
   1568 NTSTATUS
   1569 NTAPI
   1570 RtlDescribeChunk(
   1571   IN USHORT CompressionFormat,
   1572   IN OUT PUCHAR *CompressedBuffer,
   1573   IN PUCHAR EndOfCompressedBufferPlus1,
   1574   OUT PUCHAR *ChunkBuffer,
   1575   OUT PULONG ChunkSize);
   1576 
   1577 NTSYSAPI
   1578 NTSTATUS
   1579 NTAPI
   1580 RtlReserveChunk(
   1581   IN USHORT CompressionFormat,
   1582   IN OUT PUCHAR *CompressedBuffer,
   1583   IN PUCHAR EndOfCompressedBufferPlus1,
   1584   OUT PUCHAR *ChunkBuffer,
   1585   IN ULONG ChunkSize);
   1586 
   1587 NTSYSAPI
   1588 NTSTATUS
   1589 NTAPI
   1590 RtlDecompressChunks(
   1591   OUT PUCHAR UncompressedBuffer,
   1592   IN ULONG UncompressedBufferSize,
   1593   IN PUCHAR CompressedBuffer,
   1594   IN ULONG CompressedBufferSize,
   1595   IN PUCHAR CompressedTail,
   1596   IN ULONG CompressedTailSize,
   1597   IN PCOMPRESSED_DATA_INFO CompressedDataInfo);
   1598 
   1599 NTSYSAPI
   1600 NTSTATUS
   1601 NTAPI
   1602 RtlCompressChunks(
   1603   IN PUCHAR UncompressedBuffer,
   1604   IN ULONG UncompressedBufferSize,
   1605   OUT PUCHAR CompressedBuffer,
   1606   IN ULONG CompressedBufferSize,
   1607   IN OUT PCOMPRESSED_DATA_INFO CompressedDataInfo,
   1608   IN ULONG CompressedDataInfoLength,
   1609   IN PVOID WorkSpace);
   1610 
   1611 NTSYSAPI
   1612 PSID_IDENTIFIER_AUTHORITY
   1613 NTAPI
   1614 RtlIdentifierAuthoritySid(
   1615   IN PSID Sid);
   1616 
   1617 NTSYSAPI
   1618 PUCHAR
   1619 NTAPI
   1620 RtlSubAuthorityCountSid(
   1621   IN PSID Sid);
   1622 
   1623 NTSYSAPI
   1624 ULONG
   1625 NTAPI
   1626 RtlNtStatusToDosErrorNoTeb(
   1627   IN NTSTATUS Status);
   1628 
   1629 NTSYSAPI
   1630 NTSTATUS
   1631 NTAPI
   1632 RtlCreateSystemVolumeInformationFolder(
   1633   IN PCUNICODE_STRING VolumeRootPath);
   1634 
   1635 #if defined(_M_AMD64)
   1636 
   1637 FORCEINLINE
   1638 VOID
   1639 RtlFillMemoryUlong (
   1640   OUT PVOID Destination,
   1641   IN SIZE_T Length,
   1642   IN ULONG Pattern)
   1643 {
   1644   PULONG Address = (PULONG)Destination;
   1645   if ((Length /= 4) != 0) {
   1646     if (((ULONG64)Address & 4) != 0) {
   1647       *Address = Pattern;
   1648       if ((Length -= 1) == 0) {
   1649         return;
   1650       }
   1651       Address += 1;
   1652     }
   1653     __stosq((PULONG64)(Address), Pattern | ((ULONG64)Pattern << 32), Length / 2);
   1654     if ((Length & 1) != 0) Address[Length - 1] = Pattern;
   1655   }
   1656   return;
   1657 }
   1658 
   1659 #define RtlFillMemoryUlonglong(Destination, Length, Pattern)                \
   1660     __stosq((PULONG64)(Destination), Pattern, (Length) / 8)
   1661 
   1662 #else
   1663 
   1664 NTSYSAPI
   1665 VOID
   1666 NTAPI
   1667 RtlFillMemoryUlong(
   1668   OUT PVOID Destination,
   1669   IN SIZE_T Length,
   1670   IN ULONG Pattern);
   1671 
   1672 NTSYSAPI
   1673 VOID
   1674 NTAPI
   1675 RtlFillMemoryUlonglong(
   1676   OUT PVOID Destination,
   1677   IN SIZE_T Length,
   1678   IN ULONGLONG Pattern);
   1679 
   1680 #endif /* defined(_M_AMD64) */
   1681 
   1682 #endif /* (NTDDI_VERSION >= NTDDI_WINXP) */
   1683 
   1684 #if (NTDDI_VERSION >= NTDDI_WS03)
   1685 NTSYSAPI
   1686 NTSTATUS
   1687 NTAPI
   1688 RtlInitAnsiStringEx(
   1689   OUT PANSI_STRING DestinationString,
   1690   IN PCSZ SourceString OPTIONAL);
   1691 #endif
   1692 
   1693 #if (NTDDI_VERSION >= NTDDI_WS03SP1)
   1694 
   1695 NTSYSAPI
   1696 NTSTATUS
   1697 NTAPI
   1698 RtlGetSaclSecurityDescriptor(
   1699   IN PSECURITY_DESCRIPTOR SecurityDescriptor,
   1700   OUT PBOOLEAN SaclPresent,
   1701   OUT PACL *Sacl,
   1702   OUT PBOOLEAN SaclDefaulted);
   1703 
   1704 NTSYSAPI
   1705 NTSTATUS
   1706 NTAPI
   1707 RtlSetGroupSecurityDescriptor(
   1708   IN OUT PSECURITY_DESCRIPTOR SecurityDescriptor,
   1709   IN PSID Group OPTIONAL,
   1710   IN BOOLEAN GroupDefaulted OPTIONAL);
   1711 
   1712 NTSYSAPI
   1713 NTSTATUS
   1714 NTAPI
   1715 RtlGetGroupSecurityDescriptor(
   1716   IN PSECURITY_DESCRIPTOR SecurityDescriptor,
   1717   OUT PSID *Group,
   1718   OUT PBOOLEAN GroupDefaulted);
   1719 
   1720 NTSYSAPI
   1721 NTSTATUS
   1722 NTAPI
   1723 RtlAbsoluteToSelfRelativeSD(
   1724   IN PSECURITY_DESCRIPTOR AbsoluteSecurityDescriptor,
   1725   OUT PSECURITY_DESCRIPTOR SelfRelativeSecurityDescriptor OPTIONAL,
   1726   IN OUT PULONG BufferLength);
   1727 
   1728 NTSYSAPI
   1729 NTSTATUS
   1730 NTAPI
   1731 RtlSelfRelativeToAbsoluteSD(
   1732   IN PSECURITY_DESCRIPTOR SelfRelativeSecurityDescriptor,
   1733   OUT PSECURITY_DESCRIPTOR AbsoluteSecurityDescriptor OPTIONAL,
   1734   IN OUT PULONG AbsoluteSecurityDescriptorSize,
   1735   OUT PACL Dacl OPTIONAL,
   1736   IN OUT PULONG DaclSize,
   1737   OUT PACL Sacl OPTIONAL,
   1738   IN OUT PULONG SaclSize,
   1739   OUT PSID Owner OPTIONAL,
   1740   IN OUT PULONG OwnerSize,
   1741   OUT PSID PrimaryGroup OPTIONAL,
   1742   IN OUT PULONG PrimaryGroupSize);
   1743 
   1744 #endif /* (NTDDI_VERSION >= NTDDI_WS03SP1) */
   1745 
   1746 #if (NTDDI_VERSION >= NTDDI_VISTA)
   1747 
   1748 NTSYSAPI
   1749 NTSTATUS
   1750 NTAPI
   1751 RtlNormalizeString(
   1752   IN ULONG NormForm,
   1753   IN PCWSTR SourceString,
   1754   IN LONG SourceStringLength,
   1755   OUT PWSTR DestinationString,
   1756   IN OUT PLONG DestinationStringLength);
   1757 
   1758 NTSYSAPI
   1759 NTSTATUS
   1760 NTAPI
   1761 RtlIsNormalizedString(
   1762   IN ULONG NormForm,
   1763   IN PCWSTR SourceString,
   1764   IN LONG SourceStringLength,
   1765   OUT PBOOLEAN Normalized);
   1766 
   1767 NTSYSAPI
   1768 NTSTATUS
   1769 NTAPI
   1770 RtlIdnToAscii(
   1771   IN ULONG Flags,
   1772   IN PCWSTR SourceString,
   1773   IN LONG SourceStringLength,
   1774   OUT PWSTR DestinationString,
   1775   IN OUT PLONG DestinationStringLength);
   1776 
   1777 NTSYSAPI
   1778 NTSTATUS
   1779 NTAPI
   1780 RtlIdnToUnicode(
   1781   IN ULONG Flags,
   1782   IN PCWSTR SourceString,
   1783   IN LONG SourceStringLength,
   1784   OUT PWSTR DestinationString,
   1785   IN OUT PLONG DestinationStringLength);
   1786 
   1787 NTSYSAPI
   1788 NTSTATUS
   1789 NTAPI
   1790 RtlIdnToNameprepUnicode(
   1791   IN ULONG Flags,
   1792   IN PCWSTR SourceString,
   1793   IN LONG SourceStringLength,
   1794   OUT PWSTR DestinationString,
   1795   IN OUT PLONG DestinationStringLength);
   1796 
   1797 NTSYSAPI
   1798 NTSTATUS
   1799 NTAPI
   1800 RtlCreateServiceSid(
   1801   IN PUNICODE_STRING ServiceName,
   1802   OUT PSID ServiceSid,
   1803   IN OUT PULONG ServiceSidLength);
   1804 
   1805 NTSYSAPI
   1806 LONG
   1807 NTAPI
   1808 RtlCompareAltitudes(
   1809   IN PCUNICODE_STRING Altitude1,
   1810   IN PCUNICODE_STRING Altitude2);
   1811 
   1812 #endif /* (NTDDI_VERSION >= NTDDI_VISTA) */
   1813 
   1814 #if (NTDDI_VERSION >= NTDDI_WIN7)
   1815 
   1816 NTSYSAPI
   1817 NTSTATUS
   1818 NTAPI
   1819 RtlUnicodeToUTF8N(
   1820   OUT PCHAR UTF8StringDestination,
   1821   IN ULONG UTF8StringMaxByteCount,
   1822   OUT PULONG UTF8StringActualByteCount,
   1823   IN PCWCH UnicodeStringSource,
   1824   IN ULONG UnicodeStringByteCount);
   1825 
   1826 NTSYSAPI
   1827 NTSTATUS
   1828 NTAPI
   1829 RtlUTF8ToUnicodeN(
   1830   OUT PWSTR UnicodeStringDestination,
   1831   IN ULONG UnicodeStringMaxByteCount,
   1832   OUT PULONG UnicodeStringActualByteCount,
   1833   IN PCCH UTF8StringSource,
   1834   IN ULONG UTF8StringByteCount);
   1835 
   1836 NTSYSAPI
   1837 NTSTATUS
   1838 NTAPI
   1839 RtlReplaceSidInSd(
   1840   IN OUT PSECURITY_DESCRIPTOR SecurityDescriptor,
   1841   IN PSID OldSid,
   1842   IN PSID NewSid,
   1843   OUT ULONG *NumChanges);
   1844 
   1845 NTSYSAPI
   1846 NTSTATUS
   1847 NTAPI
   1848 RtlCreateVirtualAccountSid(
   1849   IN PCUNICODE_STRING Name,
   1850   IN ULONG BaseSubAuthority,
   1851   OUT PSID Sid,
   1852   IN OUT PULONG SidLength);
   1853 
   1854 #endif /* (NTDDI_VERSION >= NTDDI_WIN7) */
   1855 
   1856 
   1857 #if defined(_AMD64_) || defined(_IA64_)
   1858 
   1859 
   1860 #endif /* defined(_AMD64_) || defined(_IA64_) */
   1861 
   1862 
   1863 
   1864 #define RTL_DUPLICATE_UNICODE_STRING_NULL_TERMINATE 1
   1865 #define RTL_DUPLICATE_UNICODE_STRING_ALLOCATE_NULL_STRING 2
   1866 
   1867 #define RtlUnicodeStringToOemSize(STRING) (NLS_MB_OEM_CODE_PAGE_TAG ?                                \
   1868                                            RtlxUnicodeStringToOemSize(STRING) :                      \
   1869                                            ((STRING)->Length + sizeof(UNICODE_NULL)) / sizeof(WCHAR) \
   1870 )
   1871 
   1872 #define RtlOemStringToUnicodeSize(STRING) (                 \
   1873     NLS_MB_OEM_CODE_PAGE_TAG ?                              \
   1874     RtlxOemStringToUnicodeSize(STRING) :                    \
   1875     ((STRING)->Length + sizeof(ANSI_NULL)) * sizeof(WCHAR)  \
   1876 )
   1877 
   1878 #define RtlOemStringToCountedUnicodeSize(STRING) (                    \
   1879     (ULONG)(RtlOemStringToUnicodeSize(STRING) - sizeof(UNICODE_NULL)) \
   1880 )
   1881 
   1882 #define RtlOffsetToPointer(B,O) ((PCHAR)(((PCHAR)(B)) + ((ULONG_PTR)(O))))
   1883 #define RtlPointerToOffset(B,P) ((ULONG)(((PCHAR)(P)) - ((PCHAR)(B))))
   1884 
   1885 typedef enum _OBJECT_INFORMATION_CLASS {
   1886   ObjectBasicInformation = 0,
   1887   ObjectNameInformation = 1, /* FIXME, not in WDK */
   1888   ObjectTypeInformation = 2,
   1889   ObjectTypesInformation = 3, /* FIXME, not in WDK */
   1890   ObjectHandleFlagInformation = 4, /* FIXME, not in WDK */
   1891   ObjectSessionInformation = 5, /* FIXME, not in WDK */
   1892   MaxObjectInfoClass /* FIXME, not in WDK */
   1893 } OBJECT_INFORMATION_CLASS;
   1894 
   1895 NTSYSCALLAPI
   1896 NTSTATUS
   1897 NTAPI
   1898 NtQueryObject(
   1899   IN HANDLE Handle OPTIONAL,
   1900   IN OBJECT_INFORMATION_CLASS ObjectInformationClass,
   1901   OUT PVOID ObjectInformation OPTIONAL,
   1902   IN ULONG ObjectInformationLength,
   1903   OUT PULONG ReturnLength OPTIONAL);
   1904 
   1905 #if (NTDDI_VERSION >= NTDDI_WIN2K)
   1906 
   1907 NTSYSCALLAPI
   1908 NTSTATUS
   1909 NTAPI
   1910 NtOpenThreadToken(
   1911   IN HANDLE ThreadHandle,
   1912   IN ACCESS_MASK DesiredAccess,
   1913   IN BOOLEAN OpenAsSelf,
   1914   OUT PHANDLE TokenHandle);
   1915 
   1916 NTSYSCALLAPI
   1917 NTSTATUS
   1918 NTAPI
   1919 NtOpenProcessToken(
   1920   IN HANDLE ProcessHandle,
   1921   IN ACCESS_MASK DesiredAccess,
   1922   OUT PHANDLE TokenHandle);
   1923 
   1924 NTSYSCALLAPI
   1925 NTSTATUS
   1926 NTAPI
   1927 NtQueryInformationToken(
   1928   IN HANDLE TokenHandle,
   1929   IN TOKEN_INFORMATION_CLASS TokenInformationClass,
   1930   OUT PVOID TokenInformation OPTIONAL,
   1931   IN ULONG TokenInformationLength,
   1932   OUT PULONG ReturnLength);
   1933 
   1934 NTSYSCALLAPI
   1935 NTSTATUS
   1936 NTAPI
   1937 NtAdjustPrivilegesToken(
   1938   IN HANDLE TokenHandle,
   1939   IN BOOLEAN DisableAllPrivileges,
   1940   IN PTOKEN_PRIVILEGES NewState OPTIONAL,
   1941   IN ULONG BufferLength,
   1942   OUT PTOKEN_PRIVILEGES PreviousState,
   1943   OUT PULONG ReturnLength OPTIONAL);
   1944 
   1945 NTSYSCALLAPI
   1946 NTSTATUS
   1947 NTAPI
   1948 NtCreateFile(
   1949   OUT PHANDLE FileHandle,
   1950   IN ACCESS_MASK DesiredAccess,
   1951   IN POBJECT_ATTRIBUTES ObjectAttributes,
   1952   OUT PIO_STATUS_BLOCK IoStatusBlock,
   1953   IN PLARGE_INTEGER AllocationSize OPTIONAL,
   1954   IN ULONG FileAttributes,
   1955   IN ULONG ShareAccess,
   1956   IN ULONG CreateDisposition,
   1957   IN ULONG CreateOptions,
   1958   IN PVOID EaBuffer,
   1959   IN ULONG EaLength);
   1960 
   1961 NTSYSCALLAPI
   1962 NTSTATUS
   1963 NTAPI
   1964 NtDeviceIoControlFile(
   1965   IN HANDLE FileHandle,
   1966   IN HANDLE Event OPTIONAL,
   1967   IN PIO_APC_ROUTINE ApcRoutine OPTIONAL,
   1968   IN PVOID ApcContext OPTIONAL,
   1969   OUT PIO_STATUS_BLOCK IoStatusBlock,
   1970   IN ULONG IoControlCode,
   1971   IN PVOID InputBuffer OPTIONAL,
   1972   IN ULONG InputBufferLength,
   1973   OUT PVOID OutputBuffer OPTIONAL,
   1974   IN ULONG OutputBufferLength);
   1975 
   1976 NTSYSCALLAPI
   1977 NTSTATUS
   1978 NTAPI
   1979 NtFsControlFile(
   1980   IN HANDLE FileHandle,
   1981   IN HANDLE Event OPTIONAL,
   1982   IN PIO_APC_ROUTINE ApcRoutine OPTIONAL,
   1983   IN PVOID ApcContext OPTIONAL,
   1984   OUT PIO_STATUS_BLOCK IoStatusBlock,
   1985   IN ULONG FsControlCode,
   1986   IN PVOID InputBuffer OPTIONAL,
   1987   IN ULONG InputBufferLength,
   1988   OUT PVOID OutputBuffer OPTIONAL,
   1989   IN ULONG OutputBufferLength);
   1990 
   1991 NTSYSCALLAPI
   1992 NTSTATUS
   1993 NTAPI
   1994 NtLockFile(
   1995   IN HANDLE FileHandle,
   1996   IN HANDLE Event OPTIONAL,
   1997   IN PIO_APC_ROUTINE ApcRoutine OPTIONAL,
   1998   IN PVOID ApcContext OPTIONAL,
   1999   OUT PIO_STATUS_BLOCK IoStatusBlock,
   2000   IN PLARGE_INTEGER ByteOffset,
   2001   IN PLARGE_INTEGER Length,
   2002   IN ULONG Key,
   2003   IN BOOLEAN FailImmediately,
   2004   IN BOOLEAN ExclusiveLock);
   2005 
   2006 NTSYSCALLAPI
   2007 NTSTATUS
   2008 NTAPI
   2009 NtOpenFile(
   2010   OUT PHANDLE FileHandle,
   2011   IN ACCESS_MASK DesiredAccess,
   2012   IN POBJECT_ATTRIBUTES ObjectAttributes,
   2013   OUT PIO_STATUS_BLOCK IoStatusBlock,
   2014   IN ULONG ShareAccess,
   2015   IN ULONG OpenOptions);
   2016 
   2017 NTSYSCALLAPI
   2018 NTSTATUS
   2019 NTAPI
   2020 NtQueryDirectoryFile(
   2021   IN HANDLE FileHandle,
   2022   IN HANDLE Event OPTIONAL,
   2023   IN PIO_APC_ROUTINE ApcRoutine OPTIONAL,
   2024   IN PVOID ApcContext OPTIONAL,
   2025   OUT PIO_STATUS_BLOCK IoStatusBlock,
   2026   OUT PVOID FileInformation,
   2027   IN ULONG Length,
   2028   IN FILE_INFORMATION_CLASS FileInformationClass,
   2029   IN BOOLEAN ReturnSingleEntry,
   2030   IN PUNICODE_STRING FileName OPTIONAL,
   2031   IN BOOLEAN RestartScan);
   2032 
   2033 NTSYSCALLAPI
   2034 NTSTATUS
   2035 NTAPI
   2036 NtQueryInformationFile(
   2037   IN HANDLE FileHandle,
   2038   OUT PIO_STATUS_BLOCK IoStatusBlock,
   2039   OUT PVOID FileInformation,
   2040   IN ULONG Length,
   2041   IN FILE_INFORMATION_CLASS FileInformationClass);
   2042 
   2043 NTSYSCALLAPI
   2044 NTSTATUS
   2045 NTAPI
   2046 NtQueryQuotaInformationFile(
   2047   IN HANDLE FileHandle,
   2048   OUT PIO_STATUS_BLOCK IoStatusBlock,
   2049   OUT PVOID Buffer,
   2050   IN ULONG Length,
   2051   IN BOOLEAN ReturnSingleEntry,
   2052   IN PVOID SidList,
   2053   IN ULONG SidListLength,
   2054   IN PSID StartSid OPTIONAL,
   2055   IN BOOLEAN RestartScan);
   2056 
   2057 NTSYSCALLAPI
   2058 NTSTATUS
   2059 NTAPI
   2060 NtQueryVolumeInformationFile(
   2061   IN HANDLE FileHandle,
   2062   OUT PIO_STATUS_BLOCK IoStatusBlock,
   2063   OUT PVOID FsInformation,
   2064   IN ULONG Length,
   2065   IN FS_INFORMATION_CLASS FsInformationClass);
   2066 
   2067 NTSYSCALLAPI
   2068 NTSTATUS
   2069 NTAPI
   2070 NtReadFile(
   2071   IN HANDLE FileHandle,
   2072   IN HANDLE Event OPTIONAL,
   2073   IN PIO_APC_ROUTINE ApcRoutine OPTIONAL,
   2074   IN PVOID ApcContext OPTIONAL,
   2075   OUT PIO_STATUS_BLOCK IoStatusBlock,
   2076   OUT PVOID Buffer,
   2077   IN ULONG Length,
   2078   IN PLARGE_INTEGER ByteOffset OPTIONAL,
   2079   IN PULONG Key OPTIONAL);
   2080 
   2081 NTSYSCALLAPI
   2082 NTSTATUS
   2083 NTAPI
   2084 NtSetInformationFile(
   2085   IN HANDLE FileHandle,
   2086   OUT PIO_STATUS_BLOCK IoStatusBlock,
   2087   IN PVOID FileInformation,
   2088   IN ULONG Length,
   2089   IN FILE_INFORMATION_CLASS FileInformationClass);
   2090 
   2091 NTSYSCALLAPI
   2092 NTSTATUS
   2093 NTAPI
   2094 NtSetQuotaInformationFile(
   2095   IN HANDLE FileHandle,
   2096   OUT PIO_STATUS_BLOCK IoStatusBlock,
   2097   IN PVOID Buffer,
   2098   IN ULONG Length);
   2099 
   2100 NTSYSCALLAPI
   2101 NTSTATUS
   2102 NTAPI
   2103 NtSetVolumeInformationFile(
   2104   IN HANDLE FileHandle,
   2105   OUT PIO_STATUS_BLOCK IoStatusBlock,
   2106   IN PVOID FsInformation,
   2107   IN ULONG Length,
   2108   IN FS_INFORMATION_CLASS FsInformationClass);
   2109 
   2110 NTSYSCALLAPI
   2111 NTSTATUS
   2112 NTAPI
   2113 NtWriteFile(
   2114   IN HANDLE FileHandle,
   2115   IN HANDLE Event OPTIONAL,
   2116   IN PIO_APC_ROUTINE ApcRoutine OPTIONAL,
   2117   IN PVOID ApcContext OPTIONAL,
   2118   OUT PIO_STATUS_BLOCK IoStatusBlock,
   2119   IN PVOID Buffer,
   2120   IN ULONG Length,
   2121   IN PLARGE_INTEGER ByteOffset OPTIONAL,
   2122   IN PULONG Key OPTIONAL);
   2123 
   2124 NTSYSCALLAPI
   2125 NTSTATUS
   2126 NTAPI
   2127 NtUnlockFile(
   2128   IN HANDLE FileHandle,
   2129   OUT PIO_STATUS_BLOCK IoStatusBlock,
   2130   IN PLARGE_INTEGER ByteOffset,
   2131   IN PLARGE_INTEGER Length,
   2132   IN ULONG Key);
   2133 
   2134 NTSYSCALLAPI
   2135 NTSTATUS
   2136 NTAPI
   2137 NtSetSecurityObject(
   2138   IN HANDLE Handle,
   2139   IN SECURITY_INFORMATION SecurityInformation,
   2140   IN PSECURITY_DESCRIPTOR SecurityDescriptor);
   2141 
   2142 NTSYSCALLAPI
   2143 NTSTATUS
   2144 NTAPI
   2145 NtQuerySecurityObject(
   2146   IN HANDLE Handle,
   2147   IN SECURITY_INFORMATION SecurityInformation,
   2148   OUT PSECURITY_DESCRIPTOR SecurityDescriptor,
   2149   IN ULONG Length,
   2150   OUT PULONG LengthNeeded);
   2151 
   2152 NTSYSCALLAPI
   2153 NTSTATUS
   2154 NTAPI
   2155 NtClose(
   2156   IN HANDLE Handle);
   2157 
   2158 NTSYSCALLAPI
   2159 NTSTATUS
   2160 NTAPI
   2161 NtAllocateVirtualMemory(
   2162   IN HANDLE ProcessHandle,
   2163   IN OUT PVOID *BaseAddress,
   2164   IN ULONG_PTR ZeroBits,
   2165   IN OUT PSIZE_T RegionSize,
   2166   IN ULONG AllocationType,
   2167   IN ULONG Protect);
   2168 
   2169 NTSYSCALLAPI
   2170 NTSTATUS
   2171 NTAPI
   2172 NtFreeVirtualMemory(
   2173   IN HANDLE ProcessHandle,
   2174   IN OUT PVOID *BaseAddress,
   2175   IN OUT PSIZE_T RegionSize,
   2176   IN ULONG FreeType);
   2177 
   2178 #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
   2179 
   2180 #if (NTDDI_VERSION >= NTDDI_WINXP)
   2181 
   2182 NTSYSCALLAPI
   2183 NTSTATUS
   2184 NTAPI
   2185 NtOpenThreadTokenEx(
   2186   IN HANDLE ThreadHandle,
   2187   IN ACCESS_MASK DesiredAccess,
   2188   IN BOOLEAN OpenAsSelf,
   2189   IN ULONG HandleAttributes,
   2190   OUT PHANDLE TokenHandle);
   2191 
   2192 NTSYSCALLAPI
   2193 NTSTATUS
   2194 NTAPI
   2195 NtOpenProcessTokenEx(
   2196   IN HANDLE ProcessHandle,
   2197   IN ACCESS_MASK DesiredAccess,
   2198   IN ULONG HandleAttributes,
   2199   OUT PHANDLE TokenHandle);
   2200 
   2201 NTSYSAPI
   2202 NTSTATUS
   2203 NTAPI
   2204 NtOpenJobObjectToken(
   2205   IN HANDLE JobHandle,
   2206   IN ACCESS_MASK DesiredAccess,
   2207   OUT PHANDLE TokenHandle);
   2208 
   2209 NTSYSCALLAPI
   2210 NTSTATUS
   2211 NTAPI
   2212 NtDuplicateToken(
   2213   IN HANDLE ExistingTokenHandle,
   2214   IN ACCESS_MASK DesiredAccess,
   2215   IN POBJECT_ATTRIBUTES ObjectAttributes,
   2216   IN BOOLEAN EffectiveOnly,
   2217   IN TOKEN_TYPE TokenType,
   2218   OUT PHANDLE NewTokenHandle);
   2219 
   2220 NTSYSCALLAPI
   2221 NTSTATUS
   2222 NTAPI
   2223 NtFilterToken(
   2224   IN HANDLE ExistingTokenHandle,
   2225   IN ULONG Flags,
   2226   IN PTOKEN_GROUPS SidsToDisable OPTIONAL,
   2227   IN PTOKEN_PRIVILEGES PrivilegesToDelete OPTIONAL,
   2228   IN PTOKEN_GROUPS RestrictedSids OPTIONAL,
   2229   OUT PHANDLE NewTokenHandle);
   2230 
   2231 NTSYSCALLAPI
   2232 NTSTATUS
   2233 NTAPI
   2234 NtImpersonateAnonymousToken(
   2235   IN HANDLE ThreadHandle);
   2236 
   2237 NTSYSCALLAPI
   2238 NTSTATUS
   2239 NTAPI
   2240 NtSetInformationToken(
   2241   IN HANDLE TokenHandle,
   2242   IN TOKEN_INFORMATION_CLASS TokenInformationClass,
   2243   IN PVOID TokenInformation,
   2244   IN ULONG TokenInformationLength);
   2245 
   2246 NTSYSCALLAPI
   2247 NTSTATUS
   2248 NTAPI
   2249 NtAdjustGroupsToken(
   2250   IN HANDLE TokenHandle,
   2251   IN BOOLEAN ResetToDefault,
   2252   IN PTOKEN_GROUPS NewState OPTIONAL,
   2253   IN ULONG BufferLength OPTIONAL,
   2254   OUT PTOKEN_GROUPS PreviousState,
   2255   OUT PULONG ReturnLength);
   2256 
   2257 NTSYSCALLAPI
   2258 NTSTATUS
   2259 NTAPI
   2260 NtPrivilegeCheck(
   2261   IN HANDLE ClientToken,
   2262   IN OUT PPRIVILEGE_SET RequiredPrivileges,
   2263   OUT PBOOLEAN Result);
   2264 
   2265 NTSYSCALLAPI
   2266 NTSTATUS
   2267 NTAPI
   2268 NtAccessCheckAndAuditAlarm(
   2269   IN PUNICODE_STRING SubsystemName,
   2270   IN PVOID HandleId OPTIONAL,
   2271   IN PUNICODE_STRING ObjectTypeName,
   2272   IN PUNICODE_STRING ObjectName,
   2273   IN PSECURITY_DESCRIPTOR SecurityDescriptor,
   2274   IN ACCESS_MASK DesiredAccess,
   2275   IN PGENERIC_MAPPING GenericMapping,
   2276   IN BOOLEAN ObjectCreation,
   2277   OUT PACCESS_MASK GrantedAccess,
   2278   OUT PNTSTATUS AccessStatus,
   2279   OUT PBOOLEAN GenerateOnClose);
   2280 
   2281 NTSYSCALLAPI
   2282 NTSTATUS
   2283 NTAPI
   2284 NtAccessCheckByTypeAndAuditAlarm(
   2285   IN PUNICODE_STRING SubsystemName,
   2286   IN PVOID HandleId,
   2287   IN PUNICODE_STRING ObjectTypeName,
   2288   IN PUNICODE_STRING ObjectName,
   2289   IN PSECURITY_DESCRIPTOR SecurityDescriptor,
   2290   IN PSID PrincipalSelfSid OPTIONAL,
   2291   IN ACCESS_MASK DesiredAccess,
   2292   IN AUDIT_EVENT_TYPE AuditType,
   2293   IN ULONG Flags,
   2294   IN POBJECT_TYPE_LIST ObjectTypeList OPTIONAL,
   2295   IN ULONG ObjectTypeLength,
   2296   IN PGENERIC_MAPPING GenericMapping,
   2297   IN BOOLEAN ObjectCreation,
   2298   OUT PACCESS_MASK GrantedAccess,
   2299   OUT PNTSTATUS AccessStatus,
   2300   OUT PBOOLEAN GenerateOnClose);
   2301 
   2302 NTSYSCALLAPI
   2303 NTSTATUS
   2304 NTAPI
   2305 NtAccessCheckByTypeResultListAndAuditAlarm(
   2306   IN PUNICODE_STRING SubsystemName,
   2307   IN PVOID HandleId OPTIONAL,
   2308   IN PUNICODE_STRING ObjectTypeName,
   2309   IN PUNICODE_STRING ObjectName,
   2310   IN PSECURITY_DESCRIPTOR SecurityDescriptor,
   2311   IN PSID PrincipalSelfSid OPTIONAL,
   2312   IN ACCESS_MASK DesiredAccess,
   2313   IN AUDIT_EVENT_TYPE AuditType,
   2314   IN ULONG Flags,
   2315   IN POBJECT_TYPE_LIST ObjectTypeList OPTIONAL,
   2316   IN ULONG ObjectTypeLength,
   2317   IN PGENERIC_MAPPING GenericMapping,
   2318   IN BOOLEAN ObjectCreation,
   2319   OUT PACCESS_MASK GrantedAccess,
   2320   OUT PNTSTATUS AccessStatus,
   2321   OUT PBOOLEAN GenerateOnClose);
   2322 
   2323 NTSTATUS
   2324 NTAPI
   2325 NtAccessCheckByTypeResultListAndAuditAlarmByHandle(
   2326   IN PUNICODE_STRING SubsystemName,
   2327   IN PVOID HandleId OPTIONAL,
   2328   IN HANDLE ClientToken,
   2329   IN PUNICODE_STRING ObjectTypeName,
   2330   IN PUNICODE_STRING ObjectName,
   2331   IN PSECURITY_DESCRIPTOR SecurityDescriptor,
   2332   IN PSID PrincipalSelfSid OPTIONAL,
   2333   IN ACCESS_MASK DesiredAccess,
   2334   IN AUDIT_EVENT_TYPE AuditType,
   2335   IN ULONG Flags,
   2336   IN POBJECT_TYPE_LIST ObjectTypeList OPTIONAL,
   2337   IN ULONG ObjectTypeLength,
   2338   IN PGENERIC_MAPPING GenericMapping,
   2339   IN BOOLEAN ObjectCreation,
   2340   OUT PACCESS_MASK GrantedAccess,
   2341   OUT PNTSTATUS AccessStatus,
   2342   OUT PBOOLEAN GenerateOnClose);
   2343 
   2344 NTSYSCALLAPI
   2345 NTSTATUS
   2346 NTAPI
   2347 NtOpenObjectAuditAlarm(
   2348   IN PUNICODE_STRING SubsystemName,
   2349   IN PVOID HandleId OPTIONAL,
   2350   IN PUNICODE_STRING ObjectTypeName,
   2351   IN PUNICODE_STRING ObjectName,
   2352   IN PSECURITY_DESCRIPTOR SecurityDescriptor OPTIONAL,
   2353   IN HANDLE ClientToken,
   2354   IN ACCESS_MASK DesiredAccess,
   2355   IN ACCESS_MASK GrantedAccess,
   2356   IN PPRIVILEGE_SET Privileges OPTIONAL,
   2357   IN BOOLEAN ObjectCreation,
   2358   IN BOOLEAN AccessGranted,
   2359   OUT PBOOLEAN GenerateOnClose);
   2360 
   2361 NTSYSCALLAPI
   2362 NTSTATUS
   2363 NTAPI
   2364 NtPrivilegeObjectAuditAlarm(
   2365   IN PUNICODE_STRING SubsystemName,
   2366   IN PVOID HandleId OPTIONAL,
   2367   IN HANDLE ClientToken,
   2368   IN ACCESS_MASK DesiredAccess,
   2369   IN PPRIVILEGE_SET Privileges,
   2370   IN BOOLEAN AccessGranted);
   2371 
   2372 NTSYSCALLAPI
   2373 NTSTATUS
   2374 NTAPI
   2375 NtCloseObjectAuditAlarm(
   2376   IN PUNICODE_STRING SubsystemName,
   2377   IN PVOID HandleId OPTIONAL,
   2378   IN BOOLEAN GenerateOnClose);
   2379 
   2380 NTSYSCALLAPI
   2381 NTSTATUS
   2382 NTAPI
   2383 NtDeleteObjectAuditAlarm(
   2384   IN PUNICODE_STRING SubsystemName,
   2385   IN PVOID HandleId OPTIONAL,
   2386   IN BOOLEAN GenerateOnClose);
   2387 
   2388 NTSYSCALLAPI
   2389 NTSTATUS
   2390 NTAPI
   2391 NtPrivilegedServiceAuditAlarm(
   2392   IN PUNICODE_STRING SubsystemName,
   2393   IN PUNICODE_STRING ServiceName,
   2394   IN HANDLE ClientToken,
   2395   IN PPRIVILEGE_SET Privileges,
   2396   IN BOOLEAN AccessGranted);
   2397 
   2398 NTSYSCALLAPI
   2399 NTSTATUS
   2400 NTAPI
   2401 NtSetInformationThread(
   2402   IN HANDLE ThreadHandle,
   2403   IN THREADINFOCLASS ThreadInformationClass,
   2404   IN PVOID ThreadInformation,
   2405   IN ULONG ThreadInformationLength);
   2406 
   2407 NTSYSCALLAPI
   2408 NTSTATUS
   2409 NTAPI
   2410 NtCreateSection(
   2411   OUT PHANDLE SectionHandle,
   2412   IN ACCESS_MASK DesiredAccess,
   2413   IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,
   2414   IN PLARGE_INTEGER MaximumSize OPTIONAL,
   2415   IN ULONG SectionPageProtection,
   2416   IN ULONG AllocationAttributes,
   2417   IN HANDLE FileHandle OPTIONAL);
   2418 
   2419 #endif /* (NTDDI_VERSION >= NTDDI_WINXP) */
   2420 
   2421 #define COMPRESSION_FORMAT_NONE         (0x0000)
   2422 #define COMPRESSION_FORMAT_DEFAULT      (0x0001)
   2423 #define COMPRESSION_FORMAT_LZNT1        (0x0002)
   2424 #define COMPRESSION_ENGINE_STANDARD     (0x0000)
   2425 #define COMPRESSION_ENGINE_MAXIMUM      (0x0100)
   2426 #define COMPRESSION_ENGINE_HIBER        (0x0200)
   2427 
   2428 #define MAX_UNICODE_STACK_BUFFER_LENGTH 256
   2429 
   2430 #define METHOD_FROM_CTL_CODE(ctrlCode)  ((ULONG)(ctrlCode & 3))
   2431 
   2432 #define METHOD_DIRECT_TO_HARDWARE       METHOD_IN_DIRECT
   2433 #define METHOD_DIRECT_FROM_HARDWARE     METHOD_OUT_DIRECT
   2434 
   2435 typedef ULONG LSA_OPERATIONAL_MODE, *PLSA_OPERATIONAL_MODE;
   2436 
   2437 typedef enum _SECURITY_LOGON_TYPE {
   2438   UndefinedLogonType = 0,
   2439   Interactive = 2,
   2440   Network,
   2441   Batch,
   2442   Service,
   2443   Proxy,
   2444   Unlock,
   2445   NetworkCleartext,
   2446   NewCredentials,
   2447 #if (_WIN32_WINNT >= 0x0501)
   2448   RemoteInteractive,
   2449   CachedInteractive,
   2450 #endif
   2451 #if (_WIN32_WINNT >= 0x0502)
   2452   CachedRemoteInteractive,
   2453   CachedUnlock
   2454 #endif
   2455 } SECURITY_LOGON_TYPE, *PSECURITY_LOGON_TYPE;
   2456 
   2457 #ifndef _NTLSA_AUDIT_
   2458 #define _NTLSA_AUDIT_
   2459 
   2460 #ifndef GUID_DEFINED
   2461 #include <guiddef.h>
   2462 #endif
   2463 
   2464 #endif /* _NTLSA_AUDIT_ */
   2465 
   2466 NTSTATUS
   2467 NTAPI
   2468 LsaRegisterLogonProcess(
   2469   IN PLSA_STRING LogonProcessName,
   2470   OUT PHANDLE LsaHandle,
   2471   OUT PLSA_OPERATIONAL_MODE SecurityMode);
   2472 
   2473 NTSTATUS
   2474 NTAPI
   2475 LsaLogonUser(
   2476   IN HANDLE LsaHandle,
   2477   IN PLSA_STRING OriginName,
   2478   IN SECURITY_LOGON_TYPE LogonType,
   2479   IN ULONG AuthenticationPackage,
   2480   IN PVOID AuthenticationInformation,
   2481   IN ULONG AuthenticationInformationLength,
   2482   IN PTOKEN_GROUPS LocalGroups OPTIONAL,
   2483   IN PTOKEN_SOURCE SourceContext,
   2484   OUT PVOID *ProfileBuffer,
   2485   OUT PULONG ProfileBufferLength,
   2486   OUT PLUID LogonId,
   2487   OUT PHANDLE Token,
   2488   OUT PQUOTA_LIMITS Quotas,
   2489   OUT PNTSTATUS SubStatus);
   2490 
   2491 NTSTATUS
   2492 NTAPI
   2493 LsaFreeReturnBuffer(
   2494   IN PVOID Buffer);
   2495 
   2496 #ifndef _NTLSA_IFS_
   2497 #define _NTLSA_IFS_
   2498 #endif
   2499 
   2500 #define MSV1_0_PACKAGE_NAME     "MICROSOFT_AUTHENTICATION_PACKAGE_V1_0"
   2501 #define MSV1_0_PACKAGE_NAMEW    L"MICROSOFT_AUTHENTICATION_PACKAGE_V1_0"
   2502 #define MSV1_0_PACKAGE_NAMEW_LENGTH sizeof(MSV1_0_PACKAGE_NAMEW) - sizeof(WCHAR)
   2503 
   2504 #define MSV1_0_SUBAUTHENTICATION_KEY "SYSTEM\\CurrentControlSet\\Control\\Lsa\\MSV1_0"
   2505 #define MSV1_0_SUBAUTHENTICATION_VALUE "Auth"
   2506 
   2507 #define MSV1_0_CHALLENGE_LENGTH                8
   2508 #define MSV1_0_USER_SESSION_KEY_LENGTH         16
   2509 #define MSV1_0_LANMAN_SESSION_KEY_LENGTH       8
   2510 
   2511 #define MSV1_0_CLEARTEXT_PASSWORD_ALLOWED      0x02
   2512 #define MSV1_0_UPDATE_LOGON_STATISTICS         0x04
   2513 #define MSV1_0_RETURN_USER_PARAMETERS          0x08
   2514 #define MSV1_0_DONT_TRY_GUEST_ACCOUNT          0x10
   2515 #define MSV1_0_ALLOW_SERVER_TRUST_ACCOUNT      0x20
   2516 #define MSV1_0_RETURN_PASSWORD_EXPIRY          0x40
   2517 #define MSV1_0_USE_CLIENT_CHALLENGE            0x80
   2518 #define MSV1_0_TRY_GUEST_ACCOUNT_ONLY          0x100
   2519 #define MSV1_0_RETURN_PROFILE_PATH             0x200
   2520 #define MSV1_0_TRY_SPECIFIED_DOMAIN_ONLY       0x400
   2521 #define MSV1_0_ALLOW_WORKSTATION_TRUST_ACCOUNT 0x800
   2522 
   2523 #define MSV1_0_DISABLE_PERSONAL_FALLBACK     0x00001000
   2524 #define MSV1_0_ALLOW_FORCE_GUEST             0x00002000
   2525 
   2526 #if (_WIN32_WINNT >= 0x0502)
   2527 #define MSV1_0_CLEARTEXT_PASSWORD_SUPPLIED   0x00004000
   2528 #define MSV1_0_USE_DOMAIN_FOR_ROUTING_ONLY   0x00008000
   2529 #endif
   2530 
   2531 #define MSV1_0_SUBAUTHENTICATION_DLL_EX      0x00100000
   2532 #define MSV1_0_ALLOW_MSVCHAPV2               0x00010000
   2533 
   2534 #if (_WIN32_WINNT >= 0x0600)
   2535 #define MSV1_0_S4U2SELF                      0x00020000
   2536 #define MSV1_0_CHECK_LOGONHOURS_FOR_S4U      0x00040000
   2537 #endif
   2538 
   2539 #define MSV1_0_SUBAUTHENTICATION_DLL         0xFF000000
   2540 #define MSV1_0_SUBAUTHENTICATION_DLL_SHIFT   24
   2541 #define MSV1_0_MNS_LOGON                     0x01000000
   2542 
   2543 #define MSV1_0_SUBAUTHENTICATION_DLL_RAS     2
   2544 #define MSV1_0_SUBAUTHENTICATION_DLL_IIS     132
   2545 
   2546 #define LOGON_GUEST                 0x01
   2547 #define LOGON_NOENCRYPTION          0x02
   2548 #define LOGON_CACHED_ACCOUNT        0x04
   2549 #define LOGON_USED_LM_PASSWORD      0x08
   2550 #define LOGON_EXTRA_SIDS            0x20
   2551 #define LOGON_SUBAUTH_SESSION_KEY   0x40
   2552 #define LOGON_SERVER_TRUST_ACCOUNT  0x80
   2553 #define LOGON_NTLMV2_ENABLED        0x100
   2554 #define LOGON_RESOURCE_GROUPS       0x200
   2555 #define LOGON_PROFILE_PATH_RETURNED 0x400
   2556 #define LOGON_NT_V2                 0x800
   2557 #define LOGON_LM_V2                 0x1000
   2558 #define LOGON_NTLM_V2               0x2000
   2559 
   2560 #if (_WIN32_WINNT >= 0x0600)
   2561 
   2562 #define LOGON_OPTIMIZED             0x4000
   2563 #define LOGON_WINLOGON              0x8000
   2564 #define LOGON_PKINIT               0x10000
   2565 #define LOGON_NO_OPTIMIZED         0x20000
   2566 
   2567 #endif
   2568 
   2569 #define MSV1_0_SUBAUTHENTICATION_FLAGS 0xFF000000
   2570 
   2571 #define LOGON_GRACE_LOGON              0x01000000
   2572 
   2573 #define MSV1_0_OWF_PASSWORD_LENGTH 16
   2574 #define MSV1_0_CRED_LM_PRESENT 0x1
   2575 #define MSV1_0_CRED_NT_PRESENT 0x2
   2576 #define MSV1_0_CRED_VERSION 0
   2577 
   2578 #define MSV1_0_NTLM3_RESPONSE_LENGTH 16
   2579 #define MSV1_0_NTLM3_OWF_LENGTH 16
   2580 
   2581 #if (_WIN32_WINNT == 0x0500)
   2582 #define MSV1_0_MAX_NTLM3_LIFE 1800
   2583 #else
   2584 #define MSV1_0_MAX_NTLM3_LIFE 129600
   2585 #endif
   2586 #define MSV1_0_MAX_AVL_SIZE 64000
   2587 
   2588 #if (_WIN32_WINNT >= 0x0501)
   2589 
   2590 #define MSV1_0_AV_FLAG_FORCE_GUEST                  0x00000001
   2591 
   2592 #if (_WIN32_WINNT >= 0x0600)
   2593 #define MSV1_0_AV_FLAG_MIC_HANDSHAKE_MESSAGES       0x00000002
   2594 #endif
   2595 
   2596 #endif
   2597 
   2598 #define MSV1_0_NTLM3_INPUT_LENGTH (sizeof(MSV1_0_NTLM3_RESPONSE) - MSV1_0_NTLM3_RESPONSE_LENGTH)
   2599 
   2600 #if(_WIN32_WINNT >= 0x0502)
   2601 #define MSV1_0_NTLM3_MIN_NT_RESPONSE_LENGTH RTL_SIZEOF_THROUGH_FIELD(MSV1_0_NTLM3_RESPONSE, AvPairsOff)
   2602 #endif
   2603 
   2604 #define USE_PRIMARY_PASSWORD            0x01
   2605 #define RETURN_PRIMARY_USERNAME         0x02
   2606 #define RETURN_PRIMARY_LOGON_DOMAINNAME 0x04
   2607 #define RETURN_NON_NT_USER_SESSION_KEY  0x08
   2608 #define GENERATE_CLIENT_CHALLENGE       0x10
   2609 #define GCR_NTLM3_PARMS                 0x20
   2610 #define GCR_TARGET_INFO                 0x40
   2611 #define RETURN_RESERVED_PARAMETER       0x80
   2612 #define GCR_ALLOW_NTLM                 0x100
   2613 #define GCR_USE_OEM_SET                0x200
   2614 #define GCR_MACHINE_CREDENTIAL         0x400
   2615 #define GCR_USE_OWF_PASSWORD           0x800
   2616 #define GCR_ALLOW_LM                  0x1000
   2617 #define GCR_ALLOW_NO_TARGET           0x2000
   2618 
   2619 typedef enum _MSV1_0_LOGON_SUBMIT_TYPE {
   2620   MsV1_0InteractiveLogon = 2,
   2621   MsV1_0Lm20Logon,
   2622   MsV1_0NetworkLogon,
   2623   MsV1_0SubAuthLogon,
   2624   MsV1_0WorkstationUnlockLogon = 7,
   2625   MsV1_0S4ULogon = 12,
   2626   MsV1_0VirtualLogon = 82
   2627 } MSV1_0_LOGON_SUBMIT_TYPE, *PMSV1_0_LOGON_SUBMIT_TYPE;
   2628 
   2629 typedef enum _MSV1_0_PROFILE_BUFFER_TYPE {
   2630   MsV1_0InteractiveProfile = 2,
   2631   MsV1_0Lm20LogonProfile,
   2632   MsV1_0SmartCardProfile
   2633 } MSV1_0_PROFILE_BUFFER_TYPE, *PMSV1_0_PROFILE_BUFFER_TYPE;
   2634 
   2635 typedef struct _MSV1_0_INTERACTIVE_LOGON {
   2636   MSV1_0_LOGON_SUBMIT_TYPE MessageType;
   2637   UNICODE_STRING LogonDomainName;
   2638   UNICODE_STRING UserName;
   2639   UNICODE_STRING Password;
   2640 } MSV1_0_INTERACTIVE_LOGON, *PMSV1_0_INTERACTIVE_LOGON;
   2641 
   2642 typedef struct _MSV1_0_INTERACTIVE_PROFILE {
   2643   MSV1_0_PROFILE_BUFFER_TYPE MessageType;
   2644   USHORT LogonCount;
   2645   USHORT BadPasswordCount;
   2646   LARGE_INTEGER LogonTime;
   2647   LARGE_INTEGER LogoffTime;
   2648   LARGE_INTEGER KickOffTime;
   2649   LARGE_INTEGER PasswordLastSet;
   2650   LARGE_INTEGER PasswordCanChange;
   2651   LARGE_INTEGER PasswordMustChange;
   2652   UNICODE_STRING LogonScript;
   2653   UNICODE_STRING HomeDirectory;
   2654   UNICODE_STRING FullName;
   2655   UNICODE_STRING ProfilePath;
   2656   UNICODE_STRING HomeDirectoryDrive;
   2657   UNICODE_STRING LogonServer;
   2658   ULONG UserFlags;
   2659 } MSV1_0_INTERACTIVE_PROFILE, *PMSV1_0_INTERACTIVE_PROFILE;
   2660 
   2661 typedef struct _MSV1_0_LM20_LOGON {
   2662   MSV1_0_LOGON_SUBMIT_TYPE MessageType;
   2663   UNICODE_STRING LogonDomainName;
   2664   UNICODE_STRING UserName;
   2665   UNICODE_STRING Workstation;
   2666   UCHAR ChallengeToClient[MSV1_0_CHALLENGE_LENGTH];
   2667   STRING CaseSensitiveChallengeResponse;
   2668   STRING CaseInsensitiveChallengeResponse;
   2669   ULONG ParameterControl;
   2670 } MSV1_0_LM20_LOGON, * PMSV1_0_LM20_LOGON;
   2671 
   2672 typedef struct _MSV1_0_SUBAUTH_LOGON {
   2673   MSV1_0_LOGON_SUBMIT_TYPE MessageType;
   2674   UNICODE_STRING LogonDomainName;
   2675   UNICODE_STRING UserName;
   2676   UNICODE_STRING Workstation;
   2677   UCHAR ChallengeToClient[MSV1_0_CHALLENGE_LENGTH];
   2678   STRING AuthenticationInfo1;
   2679   STRING AuthenticationInfo2;
   2680   ULONG ParameterControl;
   2681   ULONG SubAuthPackageId;
   2682 } MSV1_0_SUBAUTH_LOGON, * PMSV1_0_SUBAUTH_LOGON;
   2683 
   2684 #if (_WIN32_WINNT >= 0x0600)
   2685 
   2686 #define MSV1_0_S4U_LOGON_FLAG_CHECK_LOGONHOURS 0x2
   2687 
   2688 typedef struct _MSV1_0_S4U_LOGON {
   2689   MSV1_0_LOGON_SUBMIT_TYPE MessageType;
   2690   ULONG Flags;
   2691   UNICODE_STRING UserPrincipalName;
   2692   UNICODE_STRING DomainName;
   2693 } MSV1_0_S4U_LOGON, *PMSV1_0_S4U_LOGON;
   2694 
   2695 #endif
   2696 
   2697 typedef struct _MSV1_0_LM20_LOGON_PROFILE {
   2698   MSV1_0_PROFILE_BUFFER_TYPE MessageType;
   2699   LARGE_INTEGER KickOffTime;
   2700   LARGE_INTEGER LogoffTime;
   2701   ULONG UserFlags;
   2702   UCHAR UserSessionKey[MSV1_0_USER_SESSION_KEY_LENGTH];
   2703   UNICODE_STRING LogonDomainName;
   2704   UCHAR LanmanSessionKey[MSV1_0_LANMAN_SESSION_KEY_LENGTH];
   2705   UNICODE_STRING LogonServer;
   2706   UNICODE_STRING UserParameters;
   2707 } MSV1_0_LM20_LOGON_PROFILE, * PMSV1_0_LM20_LOGON_PROFILE;
   2708 
   2709 typedef struct _MSV1_0_SUPPLEMENTAL_CREDENTIAL {
   2710   ULONG Version;
   2711   ULONG Flags;
   2712   UCHAR LmPassword[MSV1_0_OWF_PASSWORD_LENGTH];
   2713   UCHAR NtPassword[MSV1_0_OWF_PASSWORD_LENGTH];
   2714 } MSV1_0_SUPPLEMENTAL_CREDENTIAL, *PMSV1_0_SUPPLEMENTAL_CREDENTIAL;
   2715 
   2716 typedef struct _MSV1_0_NTLM3_RESPONSE {
   2717   UCHAR Response[MSV1_0_NTLM3_RESPONSE_LENGTH];
   2718   UCHAR RespType;
   2719   UCHAR HiRespType;
   2720   USHORT Flags;
   2721   ULONG MsgWord;
   2722   ULONGLONG TimeStamp;
   2723   UCHAR ChallengeFromClient[MSV1_0_CHALLENGE_LENGTH];
   2724   ULONG AvPairsOff;
   2725   UCHAR Buffer[1];
   2726 } MSV1_0_NTLM3_RESPONSE, *PMSV1_0_NTLM3_RESPONSE;
   2727 
   2728 typedef enum _MSV1_0_AVID {
   2729   MsvAvEOL,
   2730   MsvAvNbComputerName,
   2731   MsvAvNbDomainName,
   2732   MsvAvDnsComputerName,
   2733   MsvAvDnsDomainName,
   2734 #if (_WIN32_WINNT >= 0x0501)
   2735   MsvAvDnsTreeName,
   2736   MsvAvFlags,
   2737 #if (_WIN32_WINNT >= 0x0600)
   2738   MsvAvTimestamp,
   2739   MsvAvRestrictions,
   2740   MsvAvTargetName,
   2741   MsvAvChannelBindings,
   2742 #endif
   2743 #endif
   2744 } MSV1_0_AVID;
   2745 
   2746 typedef struct _MSV1_0_AV_PAIR {
   2747   USHORT AvId;
   2748   USHORT AvLen;
   2749 } MSV1_0_AV_PAIR, *PMSV1_0_AV_PAIR;
   2750 
   2751 typedef enum _MSV1_0_PROTOCOL_MESSAGE_TYPE {
   2752   MsV1_0Lm20ChallengeRequest = 0,
   2753   MsV1_0Lm20GetChallengeResponse,
   2754   MsV1_0EnumerateUsers,
   2755   MsV1_0GetUserInfo,
   2756   MsV1_0ReLogonUsers,
   2757   MsV1_0ChangePassword,
   2758   MsV1_0ChangeCachedPassword,
   2759   MsV1_0GenericPassthrough,
   2760   MsV1_0CacheLogon,
   2761   MsV1_0SubAuth,
   2762   MsV1_0DeriveCredential,
   2763   MsV1_0CacheLookup,
   2764 #if (_WIN32_WINNT >= 0x0501)
   2765   MsV1_0SetProcessOption,
   2766 #endif
   2767 #if (_WIN32_WINNT >= 0x0600)
   2768   MsV1_0ConfigLocalAliases,
   2769   MsV1_0ClearCachedCredentials,
   2770 #endif
   2771 } MSV1_0_PROTOCOL_MESSAGE_TYPE, *PMSV1_0_PROTOCOL_MESSAGE_TYPE;
   2772 
   2773 typedef struct _MSV1_0_LM20_CHALLENGE_REQUEST {
   2774   MSV1_0_PROTOCOL_MESSAGE_TYPE MessageType;
   2775 } MSV1_0_LM20_CHALLENGE_REQUEST, *PMSV1_0_LM20_CHALLENGE_REQUEST;
   2776 
   2777 typedef struct _MSV1_0_LM20_CHALLENGE_RESPONSE {
   2778   MSV1_0_PROTOCOL_MESSAGE_TYPE MessageType;
   2779   UCHAR ChallengeToClient[MSV1_0_CHALLENGE_LENGTH];
   2780 } MSV1_0_LM20_CHALLENGE_RESPONSE, *PMSV1_0_LM20_CHALLENGE_RESPONSE;
   2781 
   2782 typedef struct _MSV1_0_GETCHALLENRESP_REQUEST_V1 {
   2783   MSV1_0_PROTOCOL_MESSAGE_TYPE MessageType;
   2784   ULONG ParameterControl;
   2785   LUID LogonId;
   2786   UNICODE_STRING Password;
   2787   UCHAR ChallengeToClient[MSV1_0_CHALLENGE_LENGTH];
   2788 } MSV1_0_GETCHALLENRESP_REQUEST_V1, *PMSV1_0_GETCHALLENRESP_REQUEST_V1;
   2789 
   2790 typedef struct _MSV1_0_GETCHALLENRESP_REQUEST {
   2791   MSV1_0_PROTOCOL_MESSAGE_TYPE MessageType;
   2792   ULONG ParameterControl;
   2793   LUID LogonId;
   2794   UNICODE_STRING Password;
   2795   UCHAR ChallengeToClient[MSV1_0_CHALLENGE_LENGTH];
   2796   UNICODE_STRING UserName;
   2797   UNICODE_STRING LogonDomainName;
   2798   UNICODE_STRING ServerName;
   2799 } MSV1_0_GETCHALLENRESP_REQUEST, *PMSV1_0_GETCHALLENRESP_REQUEST;
   2800 
   2801 typedef struct _MSV1_0_GETCHALLENRESP_RESPONSE {
   2802   MSV1_0_PROTOCOL_MESSAGE_TYPE MessageType;
   2803   STRING CaseSensitiveChallengeResponse;
   2804   STRING CaseInsensitiveChallengeResponse;
   2805   UNICODE_STRING UserName;
   2806   UNICODE_STRING LogonDomainName;
   2807   UCHAR UserSessionKey[MSV1_0_USER_SESSION_KEY_LENGTH];
   2808   UCHAR LanmanSessionKey[MSV1_0_LANMAN_SESSION_KEY_LENGTH];
   2809 } MSV1_0_GETCHALLENRESP_RESPONSE, *PMSV1_0_GETCHALLENRESP_RESPONSE;
   2810 
   2811 typedef struct _MSV1_0_ENUMUSERS_REQUEST {
   2812   MSV1_0_PROTOCOL_MESSAGE_TYPE MessageType;
   2813 } MSV1_0_ENUMUSERS_REQUEST, *PMSV1_0_ENUMUSERS_REQUEST;
   2814 
   2815 typedef struct _MSV1_0_ENUMUSERS_RESPONSE {
   2816   MSV1_0_PROTOCOL_MESSAGE_TYPE MessageType;
   2817   ULONG NumberOfLoggedOnUsers;
   2818   PLUID LogonIds;
   2819   PULONG EnumHandles;
   2820 } MSV1_0_ENUMUSERS_RESPONSE, *PMSV1_0_ENUMUSERS_RESPONSE;
   2821 
   2822 typedef struct _MSV1_0_GETUSERINFO_REQUEST {
   2823   MSV1_0_PROTOCOL_MESSAGE_TYPE MessageType;
   2824   LUID LogonId;
   2825 } MSV1_0_GETUSERINFO_REQUEST, *PMSV1_0_GETUSERINFO_REQUEST;
   2826 
   2827 typedef struct _MSV1_0_GETUSERINFO_RESPONSE {
   2828   MSV1_0_PROTOCOL_MESSAGE_TYPE MessageType;
   2829   PSID UserSid;
   2830   UNICODE_STRING UserName;
   2831   UNICODE_STRING LogonDomainName;
   2832   UNICODE_STRING LogonServer;
   2833   SECURITY_LOGON_TYPE LogonType;
   2834 } MSV1_0_GETUSERINFO_RESPONSE, *PMSV1_0_GETUSERINFO_RESPONSE;
   2835 
   2836 
   2837 
   2838 #define FILE_OPLOCK_BROKEN_TO_LEVEL_2   0x00000007
   2839 #define FILE_OPLOCK_BROKEN_TO_NONE      0x00000008
   2840 #define FILE_OPBATCH_BREAK_UNDERWAY     0x00000009
   2841 
   2842 /* also in winnt.h */
   2843 #define FILE_NOTIFY_CHANGE_FILE_NAME    0x00000001
   2844 #define FILE_NOTIFY_CHANGE_DIR_NAME     0x00000002
   2845 #define FILE_NOTIFY_CHANGE_NAME         0x00000003
   2846 #define FILE_NOTIFY_CHANGE_ATTRIBUTES   0x00000004
   2847 #define FILE_NOTIFY_CHANGE_SIZE         0x00000008
   2848 #define FILE_NOTIFY_CHANGE_LAST_WRITE   0x00000010
   2849 #define FILE_NOTIFY_CHANGE_LAST_ACCESS  0x00000020
   2850 #define FILE_NOTIFY_CHANGE_CREATION     0x00000040
   2851 #define FILE_NOTIFY_CHANGE_EA           0x00000080
   2852 #define FILE_NOTIFY_CHANGE_SECURITY     0x00000100
   2853 #define FILE_NOTIFY_CHANGE_STREAM_NAME  0x00000200
   2854 #define FILE_NOTIFY_CHANGE_STREAM_SIZE  0x00000400
   2855 #define FILE_NOTIFY_CHANGE_STREAM_WRITE 0x00000800
   2856 #define FILE_NOTIFY_VALID_MASK          0x00000fff
   2857 
   2858 #define FILE_ACTION_ADDED                   0x00000001
   2859 #define FILE_ACTION_REMOVED                 0x00000002
   2860 #define FILE_ACTION_MODIFIED                0x00000003
   2861 #define FILE_ACTION_RENAMED_OLD_NAME        0x00000004
   2862 #define FILE_ACTION_RENAMED_NEW_NAME        0x00000005
   2863 #define FILE_ACTION_ADDED_STREAM            0x00000006
   2864 #define FILE_ACTION_REMOVED_STREAM          0x00000007
   2865 #define FILE_ACTION_MODIFIED_STREAM         0x00000008
   2866 #define FILE_ACTION_REMOVED_BY_DELETE       0x00000009
   2867 #define FILE_ACTION_ID_NOT_TUNNELLED        0x0000000A
   2868 #define FILE_ACTION_TUNNELLED_ID_COLLISION  0x0000000B
   2869 /* end  winnt.h */
   2870 
   2871 #define FILE_PIPE_BYTE_STREAM_TYPE          0x00000000
   2872 #define FILE_PIPE_MESSAGE_TYPE              0x00000001
   2873 
   2874 #define FILE_PIPE_ACCEPT_REMOTE_CLIENTS     0x00000000
   2875 #define FILE_PIPE_REJECT_REMOTE_CLIENTS     0x00000002
   2876 
   2877 #define FILE_PIPE_TYPE_VALID_MASK           0x00000003
   2878 
   2879 #define FILE_PIPE_BYTE_STREAM_MODE          0x00000000
   2880 #define FILE_PIPE_MESSAGE_MODE              0x00000001
   2881 
   2882 #define FILE_PIPE_QUEUE_OPERATION           0x00000000
   2883 #define FILE_PIPE_COMPLETE_OPERATION        0x00000001
   2884 
   2885 #define FILE_PIPE_INBOUND                   0x00000000
   2886 #define FILE_PIPE_OUTBOUND                  0x00000001
   2887 #define FILE_PIPE_FULL_DUPLEX               0x00000002
   2888 
   2889 #define FILE_PIPE_DISCONNECTED_STATE        0x00000001
   2890 #define FILE_PIPE_LISTENING_STATE           0x00000002
   2891 #define FILE_PIPE_CONNECTED_STATE           0x00000003
   2892 #define FILE_PIPE_CLOSING_STATE             0x00000004
   2893 
   2894 #define FILE_PIPE_CLIENT_END                0x00000000
   2895 #define FILE_PIPE_SERVER_END                0x00000001
   2896 
   2897 #define FILE_CASE_SENSITIVE_SEARCH          0x00000001
   2898 #define FILE_CASE_PRESERVED_NAMES           0x00000002
   2899 #define FILE_UNICODE_ON_DISK                0x00000004
   2900 #define FILE_PERSISTENT_ACLS                0x00000008
   2901 #define FILE_FILE_COMPRESSION               0x00000010
   2902 #define FILE_VOLUME_QUOTAS                  0x00000020
   2903 #define FILE_SUPPORTS_SPARSE_FILES          0x00000040
   2904 #define FILE_SUPPORTS_REPARSE_POINTS        0x00000080
   2905 #define FILE_SUPPORTS_REMOTE_STORAGE        0x00000100
   2906 #define FILE_VOLUME_IS_COMPRESSED           0x00008000
   2907 #define FILE_SUPPORTS_OBJECT_IDS            0x00010000
   2908 #define FILE_SUPPORTS_ENCRYPTION            0x00020000
   2909 #define FILE_NAMED_STREAMS                  0x00040000
   2910 #define FILE_READ_ONLY_VOLUME               0x00080000
   2911 #define FILE_SEQUENTIAL_WRITE_ONCE          0x00100000
   2912 #define FILE_SUPPORTS_TRANSACTIONS          0x00200000
   2913 #define FILE_SUPPORTS_HARD_LINKS            0x00400000
   2914 #define FILE_SUPPORTS_EXTENDED_ATTRIBUTES   0x00800000
   2915 #define FILE_SUPPORTS_OPEN_BY_FILE_ID       0x01000000
   2916 #define FILE_SUPPORTS_USN_JOURNAL           0x02000000
   2917 
   2918 #define FILE_NEED_EA                    0x00000080
   2919 
   2920 #define FILE_EA_TYPE_BINARY             0xfffe
   2921 #define FILE_EA_TYPE_ASCII              0xfffd
   2922 #define FILE_EA_TYPE_BITMAP             0xfffb
   2923 #define FILE_EA_TYPE_METAFILE           0xfffa
   2924 #define FILE_EA_TYPE_ICON               0xfff9
   2925 #define FILE_EA_TYPE_EA                 0xffee
   2926 #define FILE_EA_TYPE_MVMT               0xffdf
   2927 #define FILE_EA_TYPE_MVST               0xffde
   2928 #define FILE_EA_TYPE_ASN1               0xffdd
   2929 #define FILE_EA_TYPE_FAMILY_IDS         0xff01
   2930 
   2931 typedef struct _FILE_NOTIFY_INFORMATION {
   2932   ULONG NextEntryOffset;
   2933   ULONG Action;
   2934   ULONG FileNameLength;
   2935   WCHAR FileName[1];
   2936 } FILE_NOTIFY_INFORMATION, *PFILE_NOTIFY_INFORMATION;
   2937 
   2938 typedef struct _FILE_DIRECTORY_INFORMATION {
   2939   ULONG NextEntryOffset;
   2940   ULONG FileIndex;
   2941   LARGE_INTEGER CreationTime;
   2942   LARGE_INTEGER LastAccessTime;
   2943   LARGE_INTEGER LastWriteTime;
   2944   LARGE_INTEGER ChangeTime;
   2945   LARGE_INTEGER EndOfFile;
   2946   LARGE_INTEGER AllocationSize;
   2947   ULONG FileAttributes;
   2948   ULONG FileNameLength;
   2949   WCHAR FileName[1];
   2950 } FILE_DIRECTORY_INFORMATION, *PFILE_DIRECTORY_INFORMATION;
   2951 
   2952 typedef struct _FILE_FULL_DIR_INFORMATION {
   2953   ULONG NextEntryOffset;
   2954   ULONG FileIndex;
   2955   LARGE_INTEGER CreationTime;
   2956   LARGE_INTEGER LastAccessTime;
   2957   LARGE_INTEGER LastWriteTime;
   2958   LARGE_INTEGER ChangeTime;
   2959   LARGE_INTEGER EndOfFile;
   2960   LARGE_INTEGER AllocationSize;
   2961   ULONG FileAttributes;
   2962   ULONG FileNameLength;
   2963   ULONG EaSize;
   2964   WCHAR FileName[1];
   2965 } FILE_FULL_DIR_INFORMATION, *PFILE_FULL_DIR_INFORMATION;
   2966 
   2967 typedef struct _FILE_ID_FULL_DIR_INFORMATION {
   2968   ULONG NextEntryOffset;
   2969   ULONG FileIndex;
   2970   LARGE_INTEGER CreationTime;
   2971   LARGE_INTEGER LastAccessTime;
   2972   LARGE_INTEGER LastWriteTime;
   2973   LARGE_INTEGER ChangeTime;
   2974   LARGE_INTEGER EndOfFile;
   2975   LARGE_INTEGER AllocationSize;
   2976   ULONG FileAttributes;
   2977   ULONG FileNameLength;
   2978   ULONG EaSize;
   2979   LARGE_INTEGER FileId;
   2980   WCHAR FileName[1];
   2981 } FILE_ID_FULL_DIR_INFORMATION, *PFILE_ID_FULL_DIR_INFORMATION;
   2982 
   2983 typedef struct _FILE_BOTH_DIR_INFORMATION {
   2984   ULONG NextEntryOffset;
   2985   ULONG FileIndex;
   2986   LARGE_INTEGER CreationTime;
   2987   LARGE_INTEGER LastAccessTime;
   2988   LARGE_INTEGER LastWriteTime;
   2989   LARGE_INTEGER ChangeTime;
   2990   LARGE_INTEGER EndOfFile;
   2991   LARGE_INTEGER AllocationSize;
   2992   ULONG FileAttributes;
   2993   ULONG FileNameLength;
   2994   ULONG EaSize;
   2995   CCHAR ShortNameLength;
   2996   WCHAR ShortName[12];
   2997   WCHAR FileName[1];
   2998 } FILE_BOTH_DIR_INFORMATION, *PFILE_BOTH_DIR_INFORMATION;
   2999 
   3000 typedef struct _FILE_ID_BOTH_DIR_INFORMATION {
   3001   ULONG NextEntryOffset;
   3002   ULONG FileIndex;
   3003   LARGE_INTEGER CreationTime;
   3004   LARGE_INTEGER LastAccessTime;
   3005   LARGE_INTEGER LastWriteTime;
   3006   LARGE_INTEGER ChangeTime;
   3007   LARGE_INTEGER EndOfFile;
   3008   LARGE_INTEGER AllocationSize;
   3009   ULONG FileAttributes;
   3010   ULONG FileNameLength;
   3011   ULONG EaSize;
   3012   CCHAR ShortNameLength;
   3013   WCHAR ShortName[12];
   3014   LARGE_INTEGER FileId;
   3015   WCHAR FileName[1];
   3016 } FILE_ID_BOTH_DIR_INFORMATION, *PFILE_ID_BOTH_DIR_INFORMATION;
   3017 
   3018 typedef struct _FILE_NAMES_INFORMATION {
   3019   ULONG NextEntryOffset;
   3020   ULONG FileIndex;
   3021   ULONG FileNameLength;
   3022   WCHAR FileName[1];
   3023 } FILE_NAMES_INFORMATION, *PFILE_NAMES_INFORMATION;
   3024 
   3025 typedef struct _FILE_ID_GLOBAL_TX_DIR_INFORMATION {
   3026   ULONG NextEntryOffset;
   3027   ULONG FileIndex;
   3028   LARGE_INTEGER CreationTime;
   3029   LARGE_INTEGER LastAccessTime;
   3030   LARGE_INTEGER LastWriteTime;
   3031   LARGE_INTEGER ChangeTime;
   3032   LARGE_INTEGER EndOfFile;
   3033   LARGE_INTEGER AllocationSize;
   3034   ULONG FileAttributes;
   3035   ULONG FileNameLength;
   3036   LARGE_INTEGER FileId;
   3037   GUID LockingTransactionId;
   3038   ULONG TxInfoFlags;
   3039   WCHAR FileName[1];
   3040 } FILE_ID_GLOBAL_TX_DIR_INFORMATION, *PFILE_ID_GLOBAL_TX_DIR_INFORMATION;
   3041 
   3042 #define FILE_ID_GLOBAL_TX_DIR_INFO_FLAG_WRITELOCKED         0x00000001
   3043 #define FILE_ID_GLOBAL_TX_DIR_INFO_FLAG_VISIBLE_TO_TX       0x00000002
   3044 #define FILE_ID_GLOBAL_TX_DIR_INFO_FLAG_VISIBLE_OUTSIDE_TX  0x00000004
   3045 
   3046 typedef struct _FILE_OBJECTID_INFORMATION {
   3047   LONGLONG FileReference;
   3048   UCHAR ObjectId[16];
   3049   _ANONYMOUS_UNION union {
   3050     _ANONYMOUS_STRUCT struct {
   3051       UCHAR BirthVolumeId[16];
   3052       UCHAR BirthObjectId[16];
   3053       UCHAR DomainId[16];
   3054     } DUMMYSTRUCTNAME;
   3055     UCHAR ExtendedInfo[48];
   3056   } DUMMYUNIONNAME;
   3057 } FILE_OBJECTID_INFORMATION, *PFILE_OBJECTID_INFORMATION;
   3058 
   3059 #define ANSI_DOS_STAR                   ('<')
   3060 #define ANSI_DOS_QM                     ('>')
   3061 #define ANSI_DOS_DOT                    ('"')
   3062 
   3063 #define DOS_STAR                        (L'<')
   3064 #define DOS_QM                          (L'>')
   3065 #define DOS_DOT                         (L'"')
   3066 
   3067 typedef struct _FILE_INTERNAL_INFORMATION {
   3068   LARGE_INTEGER IndexNumber;
   3069 } FILE_INTERNAL_INFORMATION, *PFILE_INTERNAL_INFORMATION;
   3070 
   3071 typedef struct _FILE_EA_INFORMATION {
   3072   ULONG EaSize;
   3073 } FILE_EA_INFORMATION, *PFILE_EA_INFORMATION;
   3074 
   3075 typedef struct _FILE_ACCESS_INFORMATION {
   3076   ACCESS_MASK AccessFlags;
   3077 } FILE_ACCESS_INFORMATION, *PFILE_ACCESS_INFORMATION;
   3078 
   3079 typedef struct _FILE_MODE_INFORMATION {
   3080   ULONG Mode;
   3081 } FILE_MODE_INFORMATION, *PFILE_MODE_INFORMATION;
   3082 
   3083 typedef struct _FILE_ALL_INFORMATION {
   3084   FILE_BASIC_INFORMATION BasicInformation;
   3085   FILE_STANDARD_INFORMATION StandardInformation;
   3086   FILE_INTERNAL_INFORMATION InternalInformation;
   3087   FILE_EA_INFORMATION EaInformation;
   3088   FILE_ACCESS_INFORMATION AccessInformation;
   3089   FILE_POSITION_INFORMATION PositionInformation;
   3090   FILE_MODE_INFORMATION ModeInformation;
   3091   FILE_ALIGNMENT_INFORMATION AlignmentInformation;
   3092   FILE_NAME_INFORMATION NameInformation;
   3093 } FILE_ALL_INFORMATION, *PFILE_ALL_INFORMATION;
   3094 
   3095 typedef struct _FILE_ALLOCATION_INFORMATION {
   3096   LARGE_INTEGER AllocationSize;
   3097 } FILE_ALLOCATION_INFORMATION, *PFILE_ALLOCATION_INFORMATION;
   3098 
   3099 typedef struct _FILE_COMPRESSION_INFORMATION {
   3100   LARGE_INTEGER CompressedFileSize;
   3101   USHORT CompressionFormat;
   3102   UCHAR CompressionUnitShift;
   3103   UCHAR ChunkShift;
   3104   UCHAR ClusterShift;
   3105   UCHAR Reserved[3];
   3106 } FILE_COMPRESSION_INFORMATION, *PFILE_COMPRESSION_INFORMATION;
   3107 
   3108 typedef struct _FILE_LINK_INFORMATION {
   3109   BOOLEAN ReplaceIfExists;
   3110   HANDLE RootDirectory;
   3111   ULONG FileNameLength;
   3112   WCHAR FileName[1];
   3113 } FILE_LINK_INFORMATION, *PFILE_LINK_INFORMATION;
   3114 
   3115 typedef struct _FILE_MOVE_CLUSTER_INFORMATION {
   3116   ULONG ClusterCount;
   3117   HANDLE RootDirectory;
   3118   ULONG FileNameLength;
   3119   WCHAR FileName[1];
   3120 } FILE_MOVE_CLUSTER_INFORMATION, *PFILE_MOVE_CLUSTER_INFORMATION;
   3121 
   3122 typedef struct _FILE_RENAME_INFORMATION {
   3123   BOOLEAN ReplaceIfExists;
   3124   HANDLE RootDirectory;
   3125   ULONG FileNameLength;
   3126   WCHAR FileName[1];
   3127 } FILE_RENAME_INFORMATION, *PFILE_RENAME_INFORMATION;
   3128 
   3129 typedef struct _FILE_STREAM_INFORMATION {
   3130   ULONG NextEntryOffset;
   3131   ULONG StreamNameLength;
   3132   LARGE_INTEGER StreamSize;
   3133   LARGE_INTEGER StreamAllocationSize;
   3134   WCHAR StreamName[1];
   3135 } FILE_STREAM_INFORMATION, *PFILE_STREAM_INFORMATION;
   3136 
   3137 typedef struct _FILE_TRACKING_INFORMATION {
   3138   HANDLE DestinationFile;
   3139   ULONG ObjectInformationLength;
   3140   CHAR ObjectInformation[1];
   3141 } FILE_TRACKING_INFORMATION, *PFILE_TRACKING_INFORMATION;
   3142 
   3143 typedef struct _FILE_COMPLETION_INFORMATION {
   3144   HANDLE Port;
   3145   PVOID Key;
   3146 } FILE_COMPLETION_INFORMATION, *PFILE_COMPLETION_INFORMATION;
   3147 
   3148 typedef struct _FILE_PIPE_INFORMATION {
   3149   ULONG ReadMode;
   3150   ULONG CompletionMode;
   3151 } FILE_PIPE_INFORMATION, *PFILE_PIPE_INFORMATION;
   3152 
   3153 typedef struct _FILE_PIPE_LOCAL_INFORMATION {
   3154   ULONG NamedPipeType;
   3155   ULONG NamedPipeConfiguration;
   3156   ULONG MaximumInstances;
   3157   ULONG CurrentInstances;
   3158   ULONG InboundQuota;
   3159   ULONG ReadDataAvailable;
   3160   ULONG OutboundQuota;
   3161   ULONG WriteQuotaAvailable;
   3162   ULONG NamedPipeState;
   3163   ULONG NamedPipeEnd;
   3164 } FILE_PIPE_LOCAL_INFORMATION, *PFILE_PIPE_LOCAL_INFORMATION;
   3165 
   3166 typedef struct _FILE_PIPE_REMOTE_INFORMATION {
   3167   LARGE_INTEGER CollectDataTime;
   3168   ULONG MaximumCollectionCount;
   3169 } FILE_PIPE_REMOTE_INFORMATION, *PFILE_PIPE_REMOTE_INFORMATION;
   3170 
   3171 typedef struct _FILE_MAILSLOT_QUERY_INFORMATION {
   3172   ULONG MaximumMessageSize;
   3173   ULONG MailslotQuota;
   3174   ULONG NextMessageSize;
   3175   ULONG MessagesAvailable;
   3176   LARGE_INTEGER ReadTimeout;
   3177 } FILE_MAILSLOT_QUERY_INFORMATION, *PFILE_MAILSLOT_QUERY_INFORMATION;
   3178 
   3179 typedef struct _FILE_MAILSLOT_SET_INFORMATION {
   3180   PLARGE_INTEGER ReadTimeout;
   3181 } FILE_MAILSLOT_SET_INFORMATION, *PFILE_MAILSLOT_SET_INFORMATION;
   3182 
   3183 typedef struct _FILE_REPARSE_POINT_INFORMATION {
   3184   LONGLONG FileReference;
   3185   ULONG Tag;
   3186 } FILE_REPARSE_POINT_INFORMATION, *PFILE_REPARSE_POINT_INFORMATION;
   3187 
   3188 typedef struct _FILE_LINK_ENTRY_INFORMATION {
   3189   ULONG NextEntryOffset;
   3190   LONGLONG ParentFileId;
   3191   ULONG FileNameLength;
   3192   WCHAR FileName[1];
   3193 } FILE_LINK_ENTRY_INFORMATION, *PFILE_LINK_ENTRY_INFORMATION;
   3194 
   3195 typedef struct _FILE_LINKS_INFORMATION {
   3196   ULONG BytesNeeded;
   3197   ULONG EntriesReturned;
   3198   FILE_LINK_ENTRY_INFORMATION Entry;
   3199 } FILE_LINKS_INFORMATION, *PFILE_LINKS_INFORMATION;
   3200 
   3201 typedef struct _FILE_NETWORK_PHYSICAL_NAME_INFORMATION {
   3202   ULONG FileNameLength;
   3203   WCHAR FileName[1];
   3204 } FILE_NETWORK_PHYSICAL_NAME_INFORMATION, *PFILE_NETWORK_PHYSICAL_NAME_INFORMATION;
   3205 
   3206 typedef struct _FILE_STANDARD_LINK_INFORMATION {
   3207   ULONG NumberOfAccessibleLinks;
   3208   ULONG TotalNumberOfLinks;
   3209   BOOLEAN DeletePending;
   3210   BOOLEAN Directory;
   3211 } FILE_STANDARD_LINK_INFORMATION, *PFILE_STANDARD_LINK_INFORMATION;
   3212 
   3213 typedef struct _FILE_GET_EA_INFORMATION {
   3214   ULONG NextEntryOffset;
   3215   UCHAR EaNameLength;
   3216   CHAR  EaName[1];
   3217 } FILE_GET_EA_INFORMATION, *PFILE_GET_EA_INFORMATION;
   3218 
   3219 #define REMOTE_PROTOCOL_FLAG_LOOPBACK       0x00000001
   3220 #define REMOTE_PROTOCOL_FLAG_OFFLINE        0x00000002
   3221 
   3222 typedef struct _FILE_REMOTE_PROTOCOL_INFORMATION {
   3223   USHORT StructureVersion;
   3224   USHORT StructureSize;
   3225   ULONG  Protocol;
   3226   USHORT ProtocolMajorVersion;
   3227   USHORT ProtocolMinorVersion;
   3228   USHORT ProtocolRevision;
   3229   USHORT Reserved;
   3230   ULONG  Flags;
   3231   struct {
   3232     ULONG Reserved[8];
   3233   } GenericReserved;
   3234   struct {
   3235     ULONG Reserved[16];
   3236   } ProtocolSpecificReserved;
   3237 } FILE_REMOTE_PROTOCOL_INFORMATION, *PFILE_REMOTE_PROTOCOL_INFORMATION;
   3238 
   3239 typedef struct _FILE_GET_QUOTA_INFORMATION {
   3240   ULONG NextEntryOffset;
   3241   ULONG SidLength;
   3242   SID Sid;
   3243 } FILE_GET_QUOTA_INFORMATION, *PFILE_GET_QUOTA_INFORMATION;
   3244 
   3245 typedef struct _FILE_QUOTA_INFORMATION {
   3246   ULONG NextEntryOffset;
   3247   ULONG SidLength;
   3248   LARGE_INTEGER ChangeTime;
   3249   LARGE_INTEGER QuotaUsed;
   3250   LARGE_INTEGER QuotaThreshold;
   3251   LARGE_INTEGER QuotaLimit;
   3252   SID Sid;
   3253 } FILE_QUOTA_INFORMATION, *PFILE_QUOTA_INFORMATION;
   3254 
   3255 typedef struct _FILE_FS_ATTRIBUTE_INFORMATION {
   3256   ULONG FileSystemAttributes;
   3257   ULONG MaximumComponentNameLength;
   3258   ULONG FileSystemNameLength;
   3259   WCHAR FileSystemName[1];
   3260 } FILE_FS_ATTRIBUTE_INFORMATION, *PFILE_FS_ATTRIBUTE_INFORMATION;
   3261 
   3262 typedef struct _FILE_FS_DRIVER_PATH_INFORMATION {
   3263   BOOLEAN DriverInPath;
   3264   ULONG DriverNameLength;
   3265   WCHAR DriverName[1];
   3266 } FILE_FS_DRIVER_PATH_INFORMATION, *PFILE_FS_DRIVER_PATH_INFORMATION;
   3267 
   3268 typedef struct _FILE_FS_VOLUME_FLAGS_INFORMATION {
   3269   ULONG Flags;
   3270 } FILE_FS_VOLUME_FLAGS_INFORMATION, *PFILE_FS_VOLUME_FLAGS_INFORMATION;
   3271 
   3272 #define FILE_VC_QUOTA_NONE              0x00000000
   3273 #define FILE_VC_QUOTA_TRACK             0x00000001
   3274 #define FILE_VC_QUOTA_ENFORCE           0x00000002
   3275 #define FILE_VC_QUOTA_MASK              0x00000003
   3276 #define FILE_VC_CONTENT_INDEX_DISABLED  0x00000008
   3277 #define FILE_VC_LOG_QUOTA_THRESHOLD     0x00000010
   3278 #define FILE_VC_LOG_QUOTA_LIMIT         0x00000020
   3279 #define FILE_VC_LOG_VOLUME_THRESHOLD    0x00000040
   3280 #define FILE_VC_LOG_VOLUME_LIMIT        0x00000080
   3281 #define FILE_VC_QUOTAS_INCOMPLETE       0x00000100
   3282 #define FILE_VC_QUOTAS_REBUILDING       0x00000200
   3283 #define FILE_VC_VALID_MASK              0x000003ff
   3284 
   3285 typedef struct _FILE_FS_CONTROL_INFORMATION {
   3286   LARGE_INTEGER FreeSpaceStartFiltering;
   3287   LARGE_INTEGER FreeSpaceThreshold;
   3288   LARGE_INTEGER FreeSpaceStopFiltering;
   3289   LARGE_INTEGER DefaultQuotaThreshold;
   3290   LARGE_INTEGER DefaultQuotaLimit;
   3291   ULONG FileSystemControlFlags;
   3292 } FILE_FS_CONTROL_INFORMATION, *PFILE_FS_CONTROL_INFORMATION;
   3293 
   3294 #ifndef _FILESYSTEMFSCTL_
   3295 #define _FILESYSTEMFSCTL_
   3296 
   3297 #define FSCTL_REQUEST_OPLOCK_LEVEL_1    CTL_CODE(FILE_DEVICE_FILE_SYSTEM,  0, METHOD_BUFFERED, FILE_ANY_ACCESS)
   3298 #define FSCTL_REQUEST_OPLOCK_LEVEL_2    CTL_CODE(FILE_DEVICE_FILE_SYSTEM,  1, METHOD_BUFFERED, FILE_ANY_ACCESS)
   3299 #define FSCTL_REQUEST_BATCH_OPLOCK      CTL_CODE(FILE_DEVICE_FILE_SYSTEM,  2, METHOD_BUFFERED, FILE_ANY_ACCESS)
   3300 #define FSCTL_OPLOCK_BREAK_ACKNOWLEDGE  CTL_CODE(FILE_DEVICE_FILE_SYSTEM,  3, METHOD_BUFFERED, FILE_ANY_ACCESS)
   3301 #define FSCTL_OPBATCH_ACK_CLOSE_PENDING CTL_CODE(FILE_DEVICE_FILE_SYSTEM,  4, METHOD_BUFFERED, FILE_ANY_ACCESS)
   3302 #define FSCTL_OPLOCK_BREAK_NOTIFY       CTL_CODE(FILE_DEVICE_FILE_SYSTEM,  5, METHOD_BUFFERED, FILE_ANY_ACCESS)
   3303 #define FSCTL_LOCK_VOLUME               CTL_CODE(FILE_DEVICE_FILE_SYSTEM,  6, METHOD_BUFFERED, FILE_ANY_ACCESS)
   3304 #define FSCTL_UNLOCK_VOLUME             CTL_CODE(FILE_DEVICE_FILE_SYSTEM,  7, METHOD_BUFFERED, FILE_ANY_ACCESS)
   3305 #define FSCTL_DISMOUNT_VOLUME           CTL_CODE(FILE_DEVICE_FILE_SYSTEM,  8, METHOD_BUFFERED, FILE_ANY_ACCESS)
   3306 #define FSCTL_IS_VOLUME_MOUNTED         CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 10, METHOD_BUFFERED, FILE_ANY_ACCESS)
   3307 #define FSCTL_IS_PATHNAME_VALID         CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 11, METHOD_BUFFERED, FILE_ANY_ACCESS)
   3308 #define FSCTL_MARK_VOLUME_DIRTY         CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 12, METHOD_BUFFERED, FILE_ANY_ACCESS)
   3309 #define FSCTL_QUERY_RETRIEVAL_POINTERS  CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 14, METHOD_NEITHER,  FILE_ANY_ACCESS)
   3310 #define FSCTL_GET_COMPRESSION           CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 15, METHOD_BUFFERED, FILE_ANY_ACCESS)
   3311 #define FSCTL_SET_COMPRESSION           CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 16, METHOD_BUFFERED, FILE_READ_DATA | FILE_WRITE_DATA)
   3312 #define FSCTL_SET_BOOTLOADER_ACCESSED   CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 19, METHOD_NEITHER,  FILE_ANY_ACCESS)
   3313 
   3314 #define FSCTL_OPLOCK_BREAK_ACK_NO_2     CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 20, METHOD_BUFFERED, FILE_ANY_ACCESS)
   3315 #define FSCTL_INVALIDATE_VOLUMES        CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 21, METHOD_BUFFERED, FILE_ANY_ACCESS)
   3316 #define FSCTL_QUERY_FAT_BPB             CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 22, METHOD_BUFFERED, FILE_ANY_ACCESS)
   3317 #define FSCTL_REQUEST_FILTER_OPLOCK     CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 23, METHOD_BUFFERED, FILE_ANY_ACCESS)
   3318 #define FSCTL_FILESYSTEM_GET_STATISTICS CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 24, METHOD_BUFFERED, FILE_ANY_ACCESS)
   3319 
   3320 #if (_WIN32_WINNT >= 0x0400)
   3321 
   3322 #define FSCTL_GET_NTFS_VOLUME_DATA      CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 25, METHOD_BUFFERED, FILE_ANY_ACCESS)
   3323 #define FSCTL_GET_NTFS_FILE_RECORD      CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 26, METHOD_BUFFERED, FILE_ANY_ACCESS)
   3324 #define FSCTL_GET_VOLUME_BITMAP         CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 27, METHOD_NEITHER,  FILE_ANY_ACCESS)
   3325 #define FSCTL_GET_RETRIEVAL_POINTERS    CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 28, METHOD_NEITHER,  FILE_ANY_ACCESS)
   3326 #define FSCTL_MOVE_FILE                 CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 29, METHOD_BUFFERED, FILE_ANY_ACCESS)
   3327 #define FSCTL_IS_VOLUME_DIRTY           CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 30, METHOD_BUFFERED, FILE_ANY_ACCESS)
   3328 #define FSCTL_ALLOW_EXTENDED_DASD_IO    CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 32, METHOD_NEITHER,  FILE_ANY_ACCESS)
   3329 
   3330 #endif
   3331 
   3332 #if (_WIN32_WINNT >= 0x0500)
   3333 
   3334 #define FSCTL_FIND_FILES_BY_SID         CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 35, METHOD_NEITHER,  FILE_ANY_ACCESS)
   3335 #define FSCTL_SET_OBJECT_ID             CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 38, METHOD_BUFFERED, FILE_WRITE_DATA)
   3336 #define FSCTL_GET_OBJECT_ID             CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 39, METHOD_BUFFERED, FILE_ANY_ACCESS)
   3337 #define FSCTL_DELETE_OBJECT_ID          CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 40, METHOD_BUFFERED, FILE_WRITE_DATA)
   3338 #define FSCTL_SET_REPARSE_POINT         CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 41, METHOD_BUFFERED, FILE_WRITE_DATA)
   3339 #define FSCTL_GET_REPARSE_POINT         CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 42, METHOD_BUFFERED, FILE_ANY_ACCESS)
   3340 #define FSCTL_DELETE_REPARSE_POINT      CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 43, METHOD_BUFFERED, FILE_WRITE_DATA)
   3341 #define FSCTL_ENUM_USN_DATA             CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 44, METHOD_NEITHER,  FILE_READ_DATA)
   3342 #define FSCTL_SECURITY_ID_CHECK         CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 45, METHOD_NEITHER,  FILE_READ_DATA)
   3343 #define FSCTL_READ_USN_JOURNAL          CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 46, METHOD_NEITHER,  FILE_READ_DATA)
   3344 #define FSCTL_SET_OBJECT_ID_EXTENDED    CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 47, METHOD_BUFFERED, FILE_WRITE_DATA)
   3345 #define FSCTL_CREATE_OR_GET_OBJECT_ID   CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 48, METHOD_BUFFERED, FILE_ANY_ACCESS)
   3346 #define FSCTL_SET_SPARSE                CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 49, METHOD_BUFFERED, FILE_WRITE_DATA)
   3347 #define FSCTL_SET_ZERO_DATA             CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 50, METHOD_BUFFERED, FILE_WRITE_DATA)
   3348 #define FSCTL_QUERY_ALLOCATED_RANGES    CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 51, METHOD_NEITHER,  FILE_READ_DATA)
   3349 #define FSCTL_ENABLE_UPGRADE            CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 52, METHOD_BUFFERED, FILE_WRITE_DATA)
   3350 #define FSCTL_SET_ENCRYPTION            CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 53, METHOD_BUFFERED, FILE_ANY_ACCESS)
   3351 #define FSCTL_ENCRYPTION_FSCTL_IO       CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 54, METHOD_NEITHER,  FILE_ANY_ACCESS)
   3352 #define FSCTL_WRITE_RAW_ENCRYPTED       CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 55, METHOD_NEITHER,  FILE_ANY_ACCESS)
   3353 #define FSCTL_READ_RAW_ENCRYPTED        CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 56, METHOD_NEITHER,  FILE_ANY_ACCESS)
   3354 #define FSCTL_CREATE_USN_JOURNAL        CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 57, METHOD_NEITHER,  FILE_READ_DATA)
   3355 #define FSCTL_READ_FILE_USN_DATA        CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 58, METHOD_NEITHER,  FILE_READ_DATA)
   3356 #define FSCTL_WRITE_USN_CLOSE_RECORD    CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 59, METHOD_NEITHER,  FILE_READ_DATA)
   3357 #define FSCTL_EXTEND_VOLUME             CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 60, METHOD_BUFFERED, FILE_ANY_ACCESS)
   3358 #define FSCTL_QUERY_USN_JOURNAL         CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 61, METHOD_BUFFERED, FILE_ANY_ACCESS)
   3359 #define FSCTL_DELETE_USN_JOURNAL        CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 62, METHOD_BUFFERED, FILE_ANY_ACCESS)
   3360 #define FSCTL_MARK_HANDLE               CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 63, METHOD_BUFFERED, FILE_ANY_ACCESS)
   3361 #define FSCTL_SIS_COPYFILE              CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 64, METHOD_BUFFERED, FILE_ANY_ACCESS)
   3362 #define FSCTL_SIS_LINK_FILES            CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 65, METHOD_BUFFERED, FILE_READ_DATA | FILE_WRITE_DATA)
   3363 #define FSCTL_RECALL_FILE               CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 69, METHOD_NEITHER, FILE_ANY_ACCESS)
   3364 #define FSCTL_READ_FROM_PLEX            CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 71, METHOD_OUT_DIRECT, FILE_READ_DATA)
   3365 #define FSCTL_FILE_PREFETCH             CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 72, METHOD_BUFFERED, FILE_SPECIAL_ACCESS)
   3366 
   3367 #endif
   3368 
   3369 #if (_WIN32_WINNT >= 0x0600)
   3370 
   3371 #define FSCTL_MAKE_MEDIA_COMPATIBLE         CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 76, METHOD_BUFFERED, FILE_WRITE_DATA)
   3372 #define FSCTL_SET_DEFECT_MANAGEMENT         CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 77, METHOD_BUFFERED, FILE_WRITE_DATA)
   3373 #define FSCTL_QUERY_SPARING_INFO            CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 78, METHOD_BUFFERED, FILE_ANY_ACCESS)
   3374 #define FSCTL_QUERY_ON_DISK_VOLUME_INFO     CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 79, METHOD_BUFFERED, FILE_ANY_ACCESS)
   3375 #define FSCTL_SET_VOLUME_COMPRESSION_STATE  CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 80, METHOD_BUFFERED, FILE_SPECIAL_ACCESS)
   3376 #define FSCTL_TXFS_MODIFY_RM                CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 81, METHOD_BUFFERED, FILE_WRITE_DATA)
   3377 #define FSCTL_TXFS_QUERY_RM_INFORMATION     CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 82, METHOD_BUFFERED, FILE_READ_DATA)
   3378 #define FSCTL_TXFS_ROLLFORWARD_REDO         CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 84, METHOD_BUFFERED, FILE_WRITE_DATA)
   3379 #define FSCTL_TXFS_ROLLFORWARD_UNDO         CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 85, METHOD_BUFFERED, FILE_WRITE_DATA)
   3380 #define FSCTL_TXFS_START_RM                 CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 86, METHOD_BUFFERED, FILE_WRITE_DATA)
   3381 #define FSCTL_TXFS_SHUTDOWN_RM              CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 87, METHOD_BUFFERED, FILE_WRITE_DATA)
   3382 #define FSCTL_TXFS_READ_BACKUP_INFORMATION  CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 88, METHOD_BUFFERED, FILE_READ_DATA)
   3383 #define FSCTL_TXFS_WRITE_BACKUP_INFORMATION CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 89, METHOD_BUFFERED, FILE_WRITE_DATA)
   3384 #define FSCTL_TXFS_CREATE_SECONDARY_RM      CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 90, METHOD_BUFFERED, FILE_WRITE_DATA)
   3385 #define FSCTL_TXFS_GET_METADATA_INFO        CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 91, METHOD_BUFFERED, FILE_READ_DATA)
   3386 #define FSCTL_TXFS_GET_TRANSACTED_VERSION   CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 92, METHOD_BUFFERED, FILE_READ_DATA)
   3387 #define FSCTL_TXFS_SAVEPOINT_INFORMATION    CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 94, METHOD_BUFFERED, FILE_WRITE_DATA)
   3388 #define FSCTL_TXFS_CREATE_MINIVERSION       CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 95, METHOD_BUFFERED, FILE_WRITE_DATA)
   3389 #define FSCTL_TXFS_TRANSACTION_ACTIVE       CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 99, METHOD_BUFFERED, FILE_READ_DATA)
   3390 #define FSCTL_SET_ZERO_ON_DEALLOCATION      CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 101, METHOD_BUFFERED, FILE_SPECIAL_ACCESS)
   3391 #define FSCTL_SET_REPAIR                    CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 102, METHOD_BUFFERED, FILE_ANY_ACCESS)
   3392 #define FSCTL_GET_REPAIR                    CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 103, METHOD_BUFFERED, FILE_ANY_ACCESS)
   3393 #define FSCTL_WAIT_FOR_REPAIR               CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 104, METHOD_BUFFERED, FILE_ANY_ACCESS)
   3394 #define FSCTL_INITIATE_REPAIR               CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 106, METHOD_BUFFERED, FILE_ANY_ACCESS)
   3395 #define FSCTL_CSC_INTERNAL                  CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 107, METHOD_NEITHER,  FILE_ANY_ACCESS)
   3396 #define FSCTL_SHRINK_VOLUME                 CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 108, METHOD_BUFFERED, FILE_SPECIAL_ACCESS)
   3397 #define FSCTL_SET_SHORT_NAME_BEHAVIOR       CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 109, METHOD_BUFFERED, FILE_ANY_ACCESS)
   3398 #define FSCTL_DFSR_SET_GHOST_HANDLE_STATE   CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 110, METHOD_BUFFERED, FILE_ANY_ACCESS)
   3399 
   3400 #define FSCTL_TXFS_LIST_TRANSACTION_LOCKED_FILES \
   3401                                             CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 120, METHOD_BUFFERED, FILE_READ_DATA)
   3402 #define FSCTL_TXFS_LIST_TRANSACTIONS        CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 121, METHOD_BUFFERED, FILE_READ_DATA)
   3403 #define FSCTL_QUERY_PAGEFILE_ENCRYPTION     CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 122, METHOD_BUFFERED, FILE_ANY_ACCESS)
   3404 #define FSCTL_RESET_VOLUME_ALLOCATION_HINTS CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 123, METHOD_BUFFERED, FILE_ANY_ACCESS)
   3405 #define FSCTL_TXFS_READ_BACKUP_INFORMATION2 CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 126, METHOD_BUFFERED, FILE_ANY_ACCESS)
   3406 
   3407 #endif
   3408 
   3409 #if (_WIN32_WINNT >= 0x0601)
   3410 
   3411 #define FSCTL_QUERY_DEPENDENT_VOLUME        CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 124, METHOD_BUFFERED, FILE_ANY_ACCESS)
   3412 #define FSCTL_SD_GLOBAL_CHANGE              CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 125, METHOD_BUFFERED, FILE_ANY_ACCESS)
   3413 #define FSCTL_LOOKUP_STREAM_FROM_CLUSTER    CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 127, METHOD_BUFFERED, FILE_ANY_ACCESS)
   3414 #define FSCTL_TXFS_WRITE_BACKUP_INFORMATION2 CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 128, METHOD_BUFFERED, FILE_ANY_ACCESS)
   3415 #define FSCTL_FILE_TYPE_NOTIFICATION        CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 129, METHOD_BUFFERED, FILE_ANY_ACCESS)
   3416 #define FSCTL_GET_BOOT_AREA_INFO            CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 140, METHOD_BUFFERED, FILE_ANY_ACCESS)
   3417 #define FSCTL_GET_RETRIEVAL_POINTER_BASE    CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 141, METHOD_BUFFERED, FILE_ANY_ACCESS)
   3418 #define FSCTL_SET_PERSISTENT_VOLUME_STATE   CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 142, METHOD_BUFFERED, FILE_ANY_ACCESS)
   3419 #define FSCTL_QUERY_PERSISTENT_VOLUME_STATE CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 143, METHOD_BUFFERED, FILE_ANY_ACCESS)
   3420 
   3421 #define FSCTL_REQUEST_OPLOCK                CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 144, METHOD_BUFFERED, FILE_ANY_ACCESS)
   3422 
   3423 #define FSCTL_CSV_TUNNEL_REQUEST            CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 145, METHOD_BUFFERED, FILE_ANY_ACCESS)
   3424 #define FSCTL_IS_CSV_FILE                   CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 146, METHOD_BUFFERED, FILE_ANY_ACCESS)
   3425 
   3426 #define FSCTL_QUERY_FILE_SYSTEM_RECOGNITION CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 147, METHOD_BUFFERED, FILE_ANY_ACCESS)
   3427 #define FSCTL_CSV_GET_VOLUME_PATH_NAME      CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 148, METHOD_BUFFERED, FILE_ANY_ACCESS)
   3428 #define FSCTL_CSV_GET_VOLUME_NAME_FOR_VOLUME_MOUNT_POINT CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 149, METHOD_BUFFERED, FILE_ANY_ACCESS)
   3429 #define FSCTL_CSV_GET_VOLUME_PATH_NAMES_FOR_VOLUME_NAME CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 150,  METHOD_BUFFERED, FILE_ANY_ACCESS)
   3430 #define FSCTL_IS_FILE_ON_CSV_VOLUME         CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 151,  METHOD_BUFFERED, FILE_ANY_ACCESS)
   3431 
   3432 typedef struct _CSV_NAMESPACE_INFO {
   3433   ULONG Version;
   3434   ULONG DeviceNumber;
   3435   LARGE_INTEGER StartingOffset;
   3436   ULONG SectorSize;
   3437 } CSV_NAMESPACE_INFO, *PCSV_NAMESPACE_INFO;
   3438 
   3439 #define CSV_NAMESPACE_INFO_V1 (sizeof(CSV_NAMESPACE_INFO))
   3440 #define CSV_INVALID_DEVICE_NUMBER 0xFFFFFFFF
   3441 
   3442 #endif
   3443 
   3444 #define FSCTL_MARK_AS_SYSTEM_HIVE           FSCTL_SET_BOOTLOADER_ACCESSED
   3445 
   3446 typedef struct _PATHNAME_BUFFER {
   3447   ULONG PathNameLength;
   3448   WCHAR Name[1];
   3449 } PATHNAME_BUFFER, *PPATHNAME_BUFFER;
   3450 
   3451 typedef struct _FSCTL_QUERY_FAT_BPB_BUFFER {
   3452   UCHAR First0x24BytesOfBootSector[0x24];
   3453 } FSCTL_QUERY_FAT_BPB_BUFFER, *PFSCTL_QUERY_FAT_BPB_BUFFER;
   3454 
   3455 #if (_WIN32_WINNT >= 0x0400)
   3456 
   3457 typedef struct _NTFS_VOLUME_DATA_BUFFER {
   3458   LARGE_INTEGER VolumeSerialNumber;
   3459   LARGE_INTEGER NumberSectors;
   3460   LARGE_INTEGER TotalClusters;
   3461   LARGE_INTEGER FreeClusters;
   3462   LARGE_INTEGER TotalReserved;
   3463   ULONG BytesPerSector;
   3464   ULONG BytesPerCluster;
   3465   ULONG BytesPerFileRecordSegment;
   3466   ULONG ClustersPerFileRecordSegment;
   3467   LARGE_INTEGER MftValidDataLength;
   3468   LARGE_INTEGER MftStartLcn;
   3469   LARGE_INTEGER Mft2StartLcn;
   3470   LARGE_INTEGER MftZoneStart;
   3471   LARGE_INTEGER MftZoneEnd;
   3472 } NTFS_VOLUME_DATA_BUFFER, *PNTFS_VOLUME_DATA_BUFFER;
   3473 
   3474 typedef struct _NTFS_EXTENDED_VOLUME_DATA {
   3475   ULONG ByteCount;
   3476   USHORT MajorVersion;
   3477   USHORT MinorVersion;
   3478 } NTFS_EXTENDED_VOLUME_DATA, *PNTFS_EXTENDED_VOLUME_DATA;
   3479 
   3480 typedef struct _STARTING_LCN_INPUT_BUFFER {
   3481   LARGE_INTEGER StartingLcn;
   3482 } STARTING_LCN_INPUT_BUFFER, *PSTARTING_LCN_INPUT_BUFFER;
   3483 
   3484 typedef struct _VOLUME_BITMAP_BUFFER {
   3485   LARGE_INTEGER StartingLcn;
   3486   LARGE_INTEGER BitmapSize;
   3487   UCHAR Buffer[1];
   3488 } VOLUME_BITMAP_BUFFER, *PVOLUME_BITMAP_BUFFER;
   3489 
   3490 typedef struct _STARTING_VCN_INPUT_BUFFER {
   3491   LARGE_INTEGER StartingVcn;
   3492 } STARTING_VCN_INPUT_BUFFER, *PSTARTING_VCN_INPUT_BUFFER;
   3493 
   3494 typedef struct _RETRIEVAL_POINTERS_BUFFER {
   3495   ULONG ExtentCount;
   3496   LARGE_INTEGER StartingVcn;
   3497   struct {
   3498     LARGE_INTEGER NextVcn;
   3499     LARGE_INTEGER Lcn;
   3500   } Extents[1];
   3501 } RETRIEVAL_POINTERS_BUFFER, *PRETRIEVAL_POINTERS_BUFFER;
   3502 
   3503 typedef struct _NTFS_FILE_RECORD_INPUT_BUFFER {
   3504   LARGE_INTEGER FileReferenceNumber;
   3505 } NTFS_FILE_RECORD_INPUT_BUFFER, *PNTFS_FILE_RECORD_INPUT_BUFFER;
   3506 
   3507 typedef struct _NTFS_FILE_RECORD_OUTPUT_BUFFER {
   3508   LARGE_INTEGER FileReferenceNumber;
   3509   ULONG FileRecordLength;
   3510   UCHAR FileRecordBuffer[1];
   3511 } NTFS_FILE_RECORD_OUTPUT_BUFFER, *PNTFS_FILE_RECORD_OUTPUT_BUFFER;
   3512 
   3513 typedef struct _MOVE_FILE_DATA {
   3514   HANDLE FileHandle;
   3515   LARGE_INTEGER StartingVcn;
   3516   LARGE_INTEGER StartingLcn;
   3517   ULONG ClusterCount;
   3518 } MOVE_FILE_DATA, *PMOVE_FILE_DATA;
   3519 
   3520 typedef struct _MOVE_FILE_RECORD_DATA {
   3521   HANDLE FileHandle;
   3522   LARGE_INTEGER SourceFileRecord;
   3523   LARGE_INTEGER TargetFileRecord;
   3524 } MOVE_FILE_RECORD_DATA, *PMOVE_FILE_RECORD_DATA;
   3525 
   3526 #if defined(_WIN64)
   3527 typedef struct _MOVE_FILE_DATA32 {
   3528   UINT32 FileHandle;
   3529   LARGE_INTEGER StartingVcn;
   3530   LARGE_INTEGER StartingLcn;
   3531   ULONG ClusterCount;
   3532 } MOVE_FILE_DATA32, *PMOVE_FILE_DATA32;
   3533 #endif
   3534 
   3535 #endif /* (_WIN32_WINNT >= 0x0400) */
   3536 
   3537 #if (_WIN32_WINNT >= 0x0500)
   3538 
   3539 typedef struct _FIND_BY_SID_DATA {
   3540   ULONG Restart;
   3541   SID Sid;
   3542 } FIND_BY_SID_DATA, *PFIND_BY_SID_DATA;
   3543 
   3544 typedef struct _FIND_BY_SID_OUTPUT {
   3545   ULONG NextEntryOffset;
   3546   ULONG FileIndex;
   3547   ULONG FileNameLength;
   3548   WCHAR FileName[1];
   3549 } FIND_BY_SID_OUTPUT, *PFIND_BY_SID_OUTPUT;
   3550 
   3551 typedef struct _MFT_ENUM_DATA {
   3552   ULONGLONG StartFileReferenceNumber;
   3553   USN LowUsn;
   3554   USN HighUsn;
   3555 } MFT_ENUM_DATA, *PMFT_ENUM_DATA;
   3556 
   3557 typedef struct _CREATE_USN_JOURNAL_DATA {
   3558   ULONGLONG MaximumSize;
   3559   ULONGLONG AllocationDelta;
   3560 } CREATE_USN_JOURNAL_DATA, *PCREATE_USN_JOURNAL_DATA;
   3561 
   3562 typedef struct _READ_USN_JOURNAL_DATA {
   3563   USN StartUsn;
   3564   ULONG ReasonMask;
   3565   ULONG ReturnOnlyOnClose;
   3566   ULONGLONG Timeout;
   3567   ULONGLONG BytesToWaitFor;
   3568   ULONGLONG UsnJournalID;
   3569 } READ_USN_JOURNAL_DATA, *PREAD_USN_JOURNAL_DATA;
   3570 
   3571 typedef struct _USN_RECORD {
   3572   ULONG RecordLength;
   3573   USHORT MajorVersion;
   3574   USHORT MinorVersion;
   3575   ULONGLONG FileReferenceNumber;
   3576   ULONGLONG ParentFileReferenceNumber;
   3577   USN Usn;
   3578   LARGE_INTEGER TimeStamp;
   3579   ULONG Reason;
   3580   ULONG SourceInfo;
   3581   ULONG SecurityId;
   3582   ULONG FileAttributes;
   3583   USHORT FileNameLength;
   3584   USHORT FileNameOffset;
   3585   WCHAR FileName[1];
   3586 } USN_RECORD, *PUSN_RECORD;
   3587 
   3588 #define USN_PAGE_SIZE                    (0x1000)
   3589 
   3590 #define USN_REASON_DATA_OVERWRITE        (0x00000001)
   3591 #define USN_REASON_DATA_EXTEND           (0x00000002)
   3592 #define USN_REASON_DATA_TRUNCATION       (0x00000004)
   3593 #define USN_REASON_NAMED_DATA_OVERWRITE  (0x00000010)
   3594 #define USN_REASON_NAMED_DATA_EXTEND     (0x00000020)
   3595 #define USN_REASON_NAMED_DATA_TRUNCATION (0x00000040)
   3596 #define USN_REASON_FILE_CREATE           (0x00000100)
   3597 #define USN_REASON_FILE_DELETE           (0x00000200)
   3598 #define USN_REASON_EA_CHANGE             (0x00000400)
   3599 #define USN_REASON_SECURITY_CHANGE       (0x00000800)
   3600 #define USN_REASON_RENAME_OLD_NAME       (0x00001000)
   3601 #define USN_REASON_RENAME_NEW_NAME       (0x00002000)
   3602 #define USN_REASON_INDEXABLE_CHANGE      (0x00004000)
   3603 #define USN_REASON_BASIC_INFO_CHANGE     (0x00008000)
   3604 #define USN_REASON_HARD_LINK_CHANGE      (0x00010000)
   3605 #define USN_REASON_COMPRESSION_CHANGE    (0x00020000)
   3606 #define USN_REASON_ENCRYPTION_CHANGE     (0x00040000)
   3607 #define USN_REASON_OBJECT_ID_CHANGE      (0x00080000)
   3608 #define USN_REASON_REPARSE_POINT_CHANGE  (0x00100000)
   3609 #define USN_REASON_STREAM_CHANGE         (0x00200000)
   3610 #define USN_REASON_TRANSACTED_CHANGE     (0x00400000)
   3611 #define USN_REASON_CLOSE                 (0x80000000)
   3612 
   3613 typedef struct _USN_JOURNAL_DATA {
   3614   ULONGLONG UsnJournalID;
   3615   USN FirstUsn;
   3616   USN NextUsn;
   3617   USN LowestValidUsn;
   3618   USN MaxUsn;
   3619   ULONGLONG MaximumSize;
   3620   ULONGLONG AllocationDelta;
   3621 } USN_JOURNAL_DATA, *PUSN_JOURNAL_DATA;
   3622 
   3623 typedef struct _DELETE_USN_JOURNAL_DATA {
   3624   ULONGLONG UsnJournalID;
   3625   ULONG DeleteFlags;
   3626 } DELETE_USN_JOURNAL_DATA, *PDELETE_USN_JOURNAL_DATA;
   3627 
   3628 #define USN_DELETE_FLAG_DELETE              (0x00000001)
   3629 #define USN_DELETE_FLAG_NOTIFY              (0x00000002)
   3630 #define USN_DELETE_VALID_FLAGS              (0x00000003)
   3631 
   3632 typedef struct _MARK_HANDLE_INFO {
   3633   ULONG UsnSourceInfo;
   3634   HANDLE VolumeHandle;
   3635   ULONG HandleInfo;
   3636 } MARK_HANDLE_INFO, *PMARK_HANDLE_INFO;
   3637 
   3638 #if defined(_WIN64)
   3639 typedef struct _MARK_HANDLE_INFO32 {
   3640   ULONG UsnSourceInfo;
   3641   UINT32 VolumeHandle;
   3642   ULONG HandleInfo;
   3643 } MARK_HANDLE_INFO32, *PMARK_HANDLE_INFO32;
   3644 #endif
   3645 
   3646 #define USN_SOURCE_DATA_MANAGEMENT          (0x00000001)
   3647 #define USN_SOURCE_AUXILIARY_DATA           (0x00000002)
   3648 #define USN_SOURCE_REPLICATION_MANAGEMENT   (0x00000004)
   3649 
   3650 #define MARK_HANDLE_PROTECT_CLUSTERS        (0x00000001)
   3651 #define MARK_HANDLE_TXF_SYSTEM_LOG          (0x00000004)
   3652 #define MARK_HANDLE_NOT_TXF_SYSTEM_LOG      (0x00000008)
   3653 
   3654 typedef struct _BULK_SECURITY_TEST_DATA {
   3655   ACCESS_MASK DesiredAccess;
   3656   ULONG SecurityIds[1];
   3657 } BULK_SECURITY_TEST_DATA, *PBULK_SECURITY_TEST_DATA;
   3658 
   3659 #define VOLUME_IS_DIRTY                  (0x00000001)
   3660 #define VOLUME_UPGRADE_SCHEDULED         (0x00000002)
   3661 #define VOLUME_SESSION_OPEN              (0x00000004)
   3662 
   3663 typedef struct _FILE_PREFETCH {
   3664   ULONG Type;
   3665   ULONG Count;
   3666   ULONGLONG Prefetch[1];
   3667 } FILE_PREFETCH, *PFILE_PREFETCH;
   3668 
   3669 typedef struct _FILE_PREFETCH_EX {
   3670   ULONG Type;
   3671   ULONG Count;
   3672   PVOID Context;
   3673   ULONGLONG Prefetch[1];
   3674 } FILE_PREFETCH_EX, *PFILE_PREFETCH_EX;
   3675 
   3676 #define FILE_PREFETCH_TYPE_FOR_CREATE       0x1
   3677 #define FILE_PREFETCH_TYPE_FOR_DIRENUM      0x2
   3678 #define FILE_PREFETCH_TYPE_FOR_CREATE_EX    0x3
   3679 #define FILE_PREFETCH_TYPE_FOR_DIRENUM_EX   0x4
   3680 
   3681 #define FILE_PREFETCH_TYPE_MAX              0x4
   3682 
   3683 typedef struct _FILE_OBJECTID_BUFFER {
   3684   UCHAR ObjectId[16];
   3685   _ANONYMOUS_UNION union {
   3686     _ANONYMOUS_STRUCT struct {
   3687       UCHAR BirthVolumeId[16];
   3688       UCHAR BirthObjectId[16];
   3689       UCHAR DomainId[16];
   3690     } DUMMYSTRUCTNAME;
   3691     UCHAR ExtendedInfo[48];
   3692   } DUMMYUNIONNAME;
   3693 } FILE_OBJECTID_BUFFER, *PFILE_OBJECTID_BUFFER;
   3694 
   3695 typedef struct _FILE_SET_SPARSE_BUFFER {
   3696   BOOLEAN SetSparse;
   3697 } FILE_SET_SPARSE_BUFFER, *PFILE_SET_SPARSE_BUFFER;
   3698 
   3699 typedef struct _FILE_ZERO_DATA_INFORMATION {
   3700   LARGE_INTEGER FileOffset;
   3701   LARGE_INTEGER BeyondFinalZero;
   3702 } FILE_ZERO_DATA_INFORMATION, *PFILE_ZERO_DATA_INFORMATION;
   3703 
   3704 typedef struct _FILE_ALLOCATED_RANGE_BUFFER {
   3705   LARGE_INTEGER FileOffset;
   3706   LARGE_INTEGER Length;
   3707 } FILE_ALLOCATED_RANGE_BUFFER, *PFILE_ALLOCATED_RANGE_BUFFER;
   3708 
   3709 typedef struct _ENCRYPTION_BUFFER {
   3710   ULONG EncryptionOperation;
   3711   UCHAR Private[1];
   3712 } ENCRYPTION_BUFFER, *PENCRYPTION_BUFFER;
   3713 
   3714 #define FILE_SET_ENCRYPTION         0x00000001
   3715 #define FILE_CLEAR_ENCRYPTION       0x00000002
   3716 #define STREAM_SET_ENCRYPTION       0x00000003
   3717 #define STREAM_CLEAR_ENCRYPTION     0x00000004
   3718 
   3719 #define MAXIMUM_ENCRYPTION_VALUE    0x00000004
   3720 
   3721 typedef struct _DECRYPTION_STATUS_BUFFER {
   3722   BOOLEAN NoEncryptedStreams;
   3723 } DECRYPTION_STATUS_BUFFER, *PDECRYPTION_STATUS_BUFFER;
   3724 
   3725 #define ENCRYPTION_FORMAT_DEFAULT        (0x01)
   3726 
   3727 #define COMPRESSION_FORMAT_SPARSE        (0x4000)
   3728 
   3729 typedef struct _REQUEST_RAW_ENCRYPTED_DATA {
   3730   LONGLONG FileOffset;
   3731   ULONG Length;
   3732 } REQUEST_RAW_ENCRYPTED_DATA, *PREQUEST_RAW_ENCRYPTED_DATA;
   3733 
   3734 typedef struct _ENCRYPTED_DATA_INFO {
   3735   ULONGLONG StartingFileOffset;
   3736   ULONG OutputBufferOffset;
   3737   ULONG BytesWithinFileSize;
   3738   ULONG BytesWithinValidDataLength;
   3739   USHORT CompressionFormat;
   3740   UCHAR DataUnitShift;
   3741   UCHAR ChunkShift;
   3742   UCHAR ClusterShift;
   3743   UCHAR EncryptionFormat;
   3744   USHORT NumberOfDataBlocks;
   3745   ULONG DataBlockSize[ANYSIZE_ARRAY];
   3746 } ENCRYPTED_DATA_INFO, *PENCRYPTED_DATA_INFO;
   3747 
   3748 typedef struct _PLEX_READ_DATA_REQUEST {
   3749   LARGE_INTEGER ByteOffset;
   3750   ULONG ByteLength;
   3751   ULONG PlexNumber;
   3752 } PLEX_READ_DATA_REQUEST, *PPLEX_READ_DATA_REQUEST;
   3753 
   3754 typedef struct _SI_COPYFILE {
   3755   ULONG SourceFileNameLength;
   3756   ULONG DestinationFileNameLength;
   3757   ULONG Flags;
   3758   WCHAR FileNameBuffer[1];
   3759 } SI_COPYFILE, *PSI_COPYFILE;
   3760 
   3761 #define COPYFILE_SIS_LINK       0x0001
   3762 #define COPYFILE_SIS_REPLACE    0x0002
   3763 #define COPYFILE_SIS_FLAGS      0x0003
   3764 
   3765 #endif /* (_WIN32_WINNT >= 0x0500) */
   3766 
   3767 #if (_WIN32_WINNT >= 0x0600)
   3768 
   3769 typedef struct _FILE_MAKE_COMPATIBLE_BUFFER {
   3770   BOOLEAN CloseDisc;
   3771 } FILE_MAKE_COMPATIBLE_BUFFER, *PFILE_MAKE_COMPATIBLE_BUFFER;
   3772 
   3773 typedef struct _FILE_SET_DEFECT_MGMT_BUFFER {
   3774   BOOLEAN Disable;
   3775 } FILE_SET_DEFECT_MGMT_BUFFER, *PFILE_SET_DEFECT_MGMT_BUFFER;
   3776 
   3777 typedef struct _FILE_QUERY_SPARING_BUFFER {
   3778   ULONG SparingUnitBytes;
   3779   BOOLEAN SoftwareSparing;
   3780   ULONG TotalSpareBlocks;
   3781   ULONG FreeSpareBlocks;
   3782 } FILE_QUERY_SPARING_BUFFER, *PFILE_QUERY_SPARING_BUFFER;
   3783 
   3784 typedef struct _FILE_QUERY_ON_DISK_VOL_INFO_BUFFER {
   3785   LARGE_INTEGER DirectoryCount;
   3786   LARGE_INTEGER FileCount;
   3787   USHORT FsFormatMajVersion;
   3788   USHORT FsFormatMinVersion;
   3789   WCHAR FsFormatName[12];
   3790   LARGE_INTEGER FormatTime;
   3791   LARGE_INTEGER LastUpdateTime;
   3792   WCHAR CopyrightInfo[34];
   3793   WCHAR AbstractInfo[34];
   3794   WCHAR FormattingImplementationInfo[34];
   3795   WCHAR LastModifyingImplementationInfo[34];
   3796 } FILE_QUERY_ON_DISK_VOL_INFO_BUFFER, *PFILE_QUERY_ON_DISK_VOL_INFO_BUFFER;
   3797 
   3798 #define SET_REPAIR_ENABLED                                      (0x00000001)
   3799 #define SET_REPAIR_VOLUME_BITMAP_SCAN                           (0x00000002)
   3800 #define SET_REPAIR_DELETE_CROSSLINK                             (0x00000004)
   3801 #define SET_REPAIR_WARN_ABOUT_DATA_LOSS                         (0x00000008)
   3802 #define SET_REPAIR_DISABLED_AND_BUGCHECK_ON_CORRUPT             (0x00000010)
   3803 #define SET_REPAIR_VALID_MASK                                   (0x0000001F)
   3804 
   3805 typedef enum _SHRINK_VOLUME_REQUEST_TYPES {
   3806   ShrinkPrepare = 1,
   3807   ShrinkCommit,
   3808   ShrinkAbort
   3809 } SHRINK_VOLUME_REQUEST_TYPES, *PSHRINK_VOLUME_REQUEST_TYPES;
   3810 
   3811 typedef struct _SHRINK_VOLUME_INFORMATION {
   3812   SHRINK_VOLUME_REQUEST_TYPES ShrinkRequestType;
   3813   ULONGLONG Flags;
   3814   LONGLONG NewNumberOfSectors;
   3815 } SHRINK_VOLUME_INFORMATION, *PSHRINK_VOLUME_INFORMATION;
   3816 
   3817 #define TXFS_RM_FLAG_LOGGING_MODE                           0x00000001
   3818 #define TXFS_RM_FLAG_RENAME_RM                              0x00000002
   3819 #define TXFS_RM_FLAG_LOG_CONTAINER_COUNT_MAX                0x00000004
   3820 #define TXFS_RM_FLAG_LOG_CONTAINER_COUNT_MIN                0x00000008
   3821 #define TXFS_RM_FLAG_LOG_GROWTH_INCREMENT_NUM_CONTAINERS    0x00000010
   3822 #define TXFS_RM_FLAG_LOG_GROWTH_INCREMENT_PERCENT           0x00000020
   3823 #define TXFS_RM_FLAG_LOG_AUTO_SHRINK_PERCENTAGE             0x00000040
   3824 #define TXFS_RM_FLAG_LOG_NO_CONTAINER_COUNT_MAX             0x00000080
   3825 #define TXFS_RM_FLAG_LOG_NO_CONTAINER_COUNT_MIN             0x00000100
   3826 #define TXFS_RM_FLAG_GROW_LOG                               0x00000400
   3827 #define TXFS_RM_FLAG_SHRINK_LOG                             0x00000800
   3828 #define TXFS_RM_FLAG_ENFORCE_MINIMUM_SIZE                   0x00001000
   3829 #define TXFS_RM_FLAG_PRESERVE_CHANGES                       0x00002000
   3830 #define TXFS_RM_FLAG_RESET_RM_AT_NEXT_START                 0x00004000
   3831 #define TXFS_RM_FLAG_DO_NOT_RESET_RM_AT_NEXT_START          0x00008000
   3832 #define TXFS_RM_FLAG_PREFER_CONSISTENCY                     0x00010000
   3833 #define TXFS_RM_FLAG_PREFER_AVAILABILITY                    0x00020000
   3834 
   3835 #define TXFS_LOGGING_MODE_SIMPLE        (0x0001)
   3836 #define TXFS_LOGGING_MODE_FULL          (0x0002)
   3837 
   3838 #define TXFS_TRANSACTION_STATE_NONE         0x00
   3839 #define TXFS_TRANSACTION_STATE_ACTIVE       0x01
   3840 #define TXFS_TRANSACTION_STATE_PREPARED     0x02
   3841 #define TXFS_TRANSACTION_STATE_NOTACTIVE    0x03
   3842 
   3843 #define TXFS_MODIFY_RM_VALID_FLAGS (TXFS_RM_FLAG_LOGGING_MODE                        | \
   3844                                     TXFS_RM_FLAG_RENAME_RM                           | \
   3845                                     TXFS_RM_FLAG_LOG_CONTAINER_COUNT_MAX             | \
   3846                                     TXFS_RM_FLAG_LOG_CONTAINER_COUNT_MIN             | \
   3847                                     TXFS_RM_FLAG_LOG_GROWTH_INCREMENT_NUM_CONTAINERS | \
   3848                                     TXFS_RM_FLAG_LOG_GROWTH_INCREMENT_PERCENT        | \
   3849                                     TXFS_RM_FLAG_LOG_AUTO_SHRINK_PERCENTAGE          | \
   3850                                     TXFS_RM_FLAG_LOG_NO_CONTAINER_COUNT_MAX          | \
   3851                                     TXFS_RM_FLAG_LOG_NO_CONTAINER_COUNT_MIN          | \
   3852                                     TXFS_RM_FLAG_SHRINK_LOG                          | \
   3853                                     TXFS_RM_FLAG_GROW_LOG                            | \
   3854                                     TXFS_RM_FLAG_ENFORCE_MINIMUM_SIZE                | \
   3855                                     TXFS_RM_FLAG_PRESERVE_CHANGES                    | \
   3856                                     TXFS_RM_FLAG_RESET_RM_AT_NEXT_START              | \
   3857                                     TXFS_RM_FLAG_DO_NOT_RESET_RM_AT_NEXT_START       | \
   3858                                     TXFS_RM_FLAG_PREFER_CONSISTENCY                  | \
   3859                                     TXFS_RM_FLAG_PREFER_AVAILABILITY)
   3860 
   3861 typedef struct _TXFS_MODIFY_RM {
   3862   ULONG Flags;
   3863   ULONG LogContainerCountMax;
   3864   ULONG LogContainerCountMin;
   3865   ULONG LogContainerCount;
   3866   ULONG LogGrowthIncrement;
   3867   ULONG LogAutoShrinkPercentage;
   3868   ULONGLONG Reserved;
   3869   USHORT LoggingMode;
   3870 } TXFS_MODIFY_RM, *PTXFS_MODIFY_RM;
   3871 
   3872 #define TXFS_RM_STATE_NOT_STARTED       0
   3873 #define TXFS_RM_STATE_STARTING          1
   3874 #define TXFS_RM_STATE_ACTIVE            2
   3875 #define TXFS_RM_STATE_SHUTTING_DOWN     3
   3876 
   3877 #define TXFS_QUERY_RM_INFORMATION_VALID_FLAGS                           \
   3878                 (TXFS_RM_FLAG_LOG_GROWTH_INCREMENT_NUM_CONTAINERS   |   \
   3879                  TXFS_RM_FLAG_LOG_GROWTH_INCREMENT_PERCENT          |   \
   3880                  TXFS_RM_FLAG_LOG_NO_CONTAINER_COUNT_MAX            |   \
   3881                  TXFS_RM_FLAG_LOG_NO_CONTAINER_COUNT_MIN            |   \
   3882                  TXFS_RM_FLAG_RESET_RM_AT_NEXT_START                |   \
   3883                  TXFS_RM_FLAG_DO_NOT_RESET_RM_AT_NEXT_START         |   \
   3884                  TXFS_RM_FLAG_PREFER_CONSISTENCY                    |   \
   3885                  TXFS_RM_FLAG_PREFER_AVAILABILITY)
   3886 
   3887 typedef struct _TXFS_QUERY_RM_INFORMATION {
   3888   ULONG BytesRequired;
   3889   ULONGLONG TailLsn;
   3890   ULONGLONG CurrentLsn;
   3891   ULONGLONG ArchiveTailLsn;
   3892   ULONGLONG LogContainerSize;
   3893   LARGE_INTEGER HighestVirtualClock;
   3894   ULONG LogContainerCount;
   3895   ULONG LogContainerCountMax;
   3896   ULONG LogContainerCountMin;
   3897   ULONG LogGrowthIncrement;
   3898   ULONG LogAutoShrinkPercentage;
   3899   ULONG Flags;
   3900   USHORT LoggingMode;
   3901   USHORT Reserved;
   3902   ULONG RmState;
   3903   ULONGLONG LogCapacity;
   3904   ULONGLONG LogFree;
   3905   ULONGLONG TopsSize;
   3906   ULONGLONG TopsUsed;
   3907   ULONGLONG TransactionCount;
   3908   ULONGLONG OnePCCount;
   3909   ULONGLONG TwoPCCount;
   3910   ULONGLONG NumberLogFileFull;
   3911   ULONGLONG OldestTransactionAge;
   3912   GUID RMName;
   3913   ULONG TmLogPathOffset;
   3914 } TXFS_QUERY_RM_INFORMATION, *PTXFS_QUERY_RM_INFORMATION;
   3915 
   3916 #define TXFS_ROLLFORWARD_REDO_FLAG_USE_LAST_REDO_LSN        0x01
   3917 #define TXFS_ROLLFORWARD_REDO_FLAG_USE_LAST_VIRTUAL_CLOCK   0x02
   3918 
   3919 #define TXFS_ROLLFORWARD_REDO_VALID_FLAGS                               \
   3920                 (TXFS_ROLLFORWARD_REDO_FLAG_USE_LAST_REDO_LSN |         \
   3921                  TXFS_ROLLFORWARD_REDO_FLAG_USE_LAST_VIRTUAL_CLOCK)
   3922 
   3923 typedef struct _TXFS_ROLLFORWARD_REDO_INFORMATION {
   3924   LARGE_INTEGER LastVirtualClock;
   3925   ULONGLONG LastRedoLsn;
   3926   ULONGLONG HighestRecoveryLsn;
   3927   ULONG Flags;
   3928 } TXFS_ROLLFORWARD_REDO_INFORMATION, *PTXFS_ROLLFORWARD_REDO_INFORMATION;
   3929 
   3930 #define TXFS_START_RM_FLAG_LOG_CONTAINER_COUNT_MAX              0x00000001
   3931 #define TXFS_START_RM_FLAG_LOG_CONTAINER_COUNT_MIN              0x00000002
   3932 #define TXFS_START_RM_FLAG_LOG_CONTAINER_SIZE                   0x00000004
   3933 #define TXFS_START_RM_FLAG_LOG_GROWTH_INCREMENT_NUM_CONTAINERS  0x00000008
   3934 #define TXFS_START_RM_FLAG_LOG_GROWTH_INCREMENT_PERCENT         0x00000010
   3935 #define TXFS_START_RM_FLAG_LOG_AUTO_SHRINK_PERCENTAGE           0x00000020
   3936 #define TXFS_START_RM_FLAG_LOG_NO_CONTAINER_COUNT_MAX           0x00000040
   3937 #define TXFS_START_RM_FLAG_LOG_NO_CONTAINER_COUNT_MIN           0x00000080
   3938 
   3939 #define TXFS_START_RM_FLAG_RECOVER_BEST_EFFORT                  0x00000200
   3940 #define TXFS_START_RM_FLAG_LOGGING_MODE                         0x00000400
   3941 #define TXFS_START_RM_FLAG_PRESERVE_CHANGES                     0x00000800
   3942 
   3943 #define TXFS_START_RM_FLAG_PREFER_CONSISTENCY                   0x00001000
   3944 #define TXFS_START_RM_FLAG_PREFER_AVAILABILITY                  0x00002000
   3945 
   3946 #define TXFS_START_RM_VALID_FLAGS                                           \
   3947                 (TXFS_START_RM_FLAG_LOG_CONTAINER_COUNT_MAX             |   \
   3948                  TXFS_START_RM_FLAG_LOG_CONTAINER_COUNT_MIN             |   \
   3949                  TXFS_START_RM_FLAG_LOG_CONTAINER_SIZE                  |   \
   3950                  TXFS_START_RM_FLAG_LOG_GROWTH_INCREMENT_NUM_CONTAINERS |   \
   3951                  TXFS_START_RM_FLAG_LOG_GROWTH_INCREMENT_PERCENT        |   \
   3952                  TXFS_START_RM_FLAG_LOG_AUTO_SHRINK_PERCENTAGE          |   \
   3953                  TXFS_START_RM_FLAG_RECOVER_BEST_EFFORT                 |   \
   3954                  TXFS_START_RM_FLAG_LOG_NO_CONTAINER