/*
 * ntifs.h
 *
 * Windows NT Filesystem Driver Developer Kit
 *
 * This file is part of the w32api package.
 *
 * Contributors:
 *   Created by Bo Brantén <bosse@acc.umu.se>
 *
 * THIS SOFTWARE IS NOT COPYRIGHTED
 *
 * This source code is offered for use in the public domain. You may
 * use, modify or distribute it freely.
 *
 * This code is distributed in the hope that it will be useful but
 * WITHOUT ANY WARRANTY. ALL WARRANTIES, EXPRESS OR IMPLIED ARE HEREBY
 * DISCLAIMED. This includes but is not limited to warranties of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 *
 */

#ifndef _NTIFS_
#define _NTIFS_
#define _GNU_NTIFS_

#if __GNUC__ >= 3
#pragma GCC system_header
#endif

#ifdef __cplusplus
extern "C" {
#endif

#include "ntddk.h"
#include "ntapi.h"

#define VER_PRODUCTBUILD 10000

#ifndef NTSYSAPI
#define NTSYSAPI
#endif

#ifndef NTKERNELAPI
#define NTKERNELAPI STDCALL
#endif

typedef struct _SE_EXPORTS                  *PSE_EXPORTS;

extern PUCHAR                       *FsRtlLegalAnsiCharacterArray;
extern PSE_EXPORTS                  SeExports;
extern PACL                         SePublicDefaultDacl;
extern PACL                         SeSystemDefaultDacl;

#define ANSI_DOS_STAR                   ('<')
#define ANSI_DOS_QM                     ('>')
#define ANSI_DOS_DOT                    ('"')

#define DOS_STAR                        (L'<')
#define DOS_QM                          (L'>')
#define DOS_DOT                         (L'"')

/* also in winnt.h */
#define ACCESS_ALLOWED_ACE_TYPE         (0x0)
#define ACCESS_DENIED_ACE_TYPE          (0x1)
#define SYSTEM_AUDIT_ACE_TYPE           (0x2)
#define SYSTEM_ALARM_ACE_TYPE           (0x3)

#define COMPRESSION_FORMAT_NONE         (0x0000)
#define COMPRESSION_FORMAT_DEFAULT      (0x0001)
#define COMPRESSION_FORMAT_LZNT1        (0x0002)
#define COMPRESSION_ENGINE_STANDARD     (0x0000)
#define COMPRESSION_ENGINE_MAXIMUM      (0x0100)
#define COMPRESSION_ENGINE_HIBER        (0x0200)

#define FILE_ACTION_ADDED                   0x00000001
#define FILE_ACTION_REMOVED                 0x00000002
#define FILE_ACTION_MODIFIED                0x00000003
#define FILE_ACTION_RENAMED_OLD_NAME        0x00000004
#define FILE_ACTION_RENAMED_NEW_NAME        0x00000005
#define FILE_ACTION_ADDED_STREAM            0x00000006
#define FILE_ACTION_REMOVED_STREAM          0x00000007
#define FILE_ACTION_MODIFIED_STREAM         0x00000008
#define FILE_ACTION_REMOVED_BY_DELETE       0x00000009
#define FILE_ACTION_ID_NOT_TUNNELLED        0x0000000A
#define FILE_ACTION_TUNNELLED_ID_COLLISION  0x0000000B
/* end  winnt.h */

#define FILE_EA_TYPE_BINARY             0xfffe
#define FILE_EA_TYPE_ASCII              0xfffd
#define FILE_EA_TYPE_BITMAP             0xfffb
#define FILE_EA_TYPE_METAFILE           0xfffa
#define FILE_EA_TYPE_ICON               0xfff9
#define FILE_EA_TYPE_EA                 0xffee
#define FILE_EA_TYPE_MVMT               0xffdf
#define FILE_EA_TYPE_MVST               0xffde
#define FILE_EA_TYPE_ASN1               0xffdd
#define FILE_EA_TYPE_FAMILY_IDS         0xff01

#define FILE_NEED_EA                    0x00000080

/* also in winnt.h */
#define FILE_NOTIFY_CHANGE_FILE_NAME    0x00000001
#define FILE_NOTIFY_CHANGE_DIR_NAME     0x00000002
#define FILE_NOTIFY_CHANGE_NAME         0x00000003
#define FILE_NOTIFY_CHANGE_ATTRIBUTES   0x00000004
#define FILE_NOTIFY_CHANGE_SIZE         0x00000008
#define FILE_NOTIFY_CHANGE_LAST_WRITE   0x00000010
#define FILE_NOTIFY_CHANGE_LAST_ACCESS  0x00000020
#define FILE_NOTIFY_CHANGE_CREATION     0x00000040
#define FILE_NOTIFY_CHANGE_EA           0x00000080
#define FILE_NOTIFY_CHANGE_SECURITY     0x00000100
#define FILE_NOTIFY_CHANGE_STREAM_NAME  0x00000200
#define FILE_NOTIFY_CHANGE_STREAM_SIZE  0x00000400
#define FILE_NOTIFY_CHANGE_STREAM_WRITE 0x00000800
#define FILE_NOTIFY_VALID_MASK          0x00000fff
/* end winnt.h */

#define FILE_OPLOCK_BROKEN_TO_LEVEL_2   0x00000007
#define FILE_OPLOCK_BROKEN_TO_NONE      0x00000008

#define FILE_OPBATCH_BREAK_UNDERWAY     0x00000009

#define FILE_CASE_SENSITIVE_SEARCH      0x00000001
#define FILE_CASE_PRESERVED_NAMES       0x00000002
#define FILE_UNICODE_ON_DISK            0x00000004
#define FILE_PERSISTENT_ACLS            0x00000008
#define FILE_FILE_COMPRESSION           0x00000010
#define FILE_VOLUME_QUOTAS              0x00000020
#define FILE_SUPPORTS_SPARSE_FILES      0x00000040
#define FILE_SUPPORTS_REPARSE_POINTS    0x00000080
#define FILE_SUPPORTS_REMOTE_STORAGE    0x00000100
#define FS_LFN_APIS                     0x00004000
#define FILE_VOLUME_IS_COMPRESSED       0x00008000
#define FILE_SUPPORTS_OBJECT_IDS        0x00010000
#define FILE_SUPPORTS_ENCRYPTION        0x00020000
#define FILE_NAMED_STREAMS              0x00040000
#define FILE_READ_ONLY_VOLUME           0x00080000
#define FILE_SEQUENTIAL_WRITE_ONCE      0x00100000
#define FILE_SUPPORTS_TRANSACTIONS      0x00200000
/* Note: These flags only have a meaning starting with Windows 7/2008 R2.
   Their absence on older OSes does NOT mean that a filesystem is missing
   that property. */
#define FILE_SUPPORTS_HARD_LINKS        0x00400000
#define FILE_SUPPORTS_EXTENDED_ATTRIBUTES 0x00800000
#define FILE_SUPPORTS_OPEN_BY_FILE_ID   0x01000000
#define FILE_SUPPORTS_USN_JOURNAL       0x02000000

#define FILE_PIPE_BYTE_STREAM_TYPE      0x00000000
#define FILE_PIPE_MESSAGE_TYPE          0x00000001

#define FILE_PIPE_BYTE_STREAM_MODE      0x00000000
#define FILE_PIPE_MESSAGE_MODE          0x00000001

#define FILE_PIPE_QUEUE_OPERATION       0x00000000
#define FILE_PIPE_COMPLETE_OPERATION    0x00000001

#define FILE_PIPE_INBOUND               0x00000000
#define FILE_PIPE_OUTBOUND              0x00000001
#define FILE_PIPE_FULL_DUPLEX           0x00000002

#define FILE_PIPE_DISCONNECTED_STATE    0x00000001
#define FILE_PIPE_LISTENING_STATE       0x00000002
#define FILE_PIPE_CONNECTED_STATE       0x00000003
#define FILE_PIPE_CLOSING_STATE         0x00000004

#define FILE_PIPE_CLIENT_END            0x00000000
#define FILE_PIPE_SERVER_END            0x00000001

#define FILE_PIPE_READ_DATA             0x00000000
#define FILE_PIPE_WRITE_SPACE           0x00000001

#define FILE_STORAGE_TYPE_SPECIFIED             0x00000041  /* FILE_DIRECTORY_FILE | FILE_NON_DIRECTORY_FILE */
#define FILE_STORAGE_TYPE_DEFAULT               (StorageTypeDefault << FILE_STORAGE_TYPE_SHIFT)
#define FILE_STORAGE_TYPE_DIRECTORY             (StorageTypeDirectory << FILE_STORAGE_TYPE_SHIFT)
#define FILE_STORAGE_TYPE_FILE                  (StorageTypeFile << FILE_STORAGE_TYPE_SHIFT)
#define FILE_STORAGE_TYPE_DOCFILE               (StorageTypeDocfile << FILE_STORAGE_TYPE_SHIFT)
#define FILE_STORAGE_TYPE_JUNCTION_POINT        (StorageTypeJunctionPoint << FILE_STORAGE_TYPE_SHIFT)
#define FILE_STORAGE_TYPE_CATALOG               (StorageTypeCatalog << FILE_STORAGE_TYPE_SHIFT)
#define FILE_STORAGE_TYPE_STRUCTURED_STORAGE    (StorageTypeStructuredStorage << FILE_STORAGE_TYPE_SHIFT)
#define FILE_STORAGE_TYPE_EMBEDDING             (StorageTypeEmbedding << FILE_STORAGE_TYPE_SHIFT)
#define FILE_STORAGE_TYPE_STREAM                (StorageTypeStream << FILE_STORAGE_TYPE_SHIFT)
#define FILE_MINIMUM_STORAGE_TYPE               FILE_STORAGE_TYPE_DEFAULT
#define FILE_MAXIMUM_STORAGE_TYPE               FILE_STORAGE_TYPE_STREAM
#define FILE_STORAGE_TYPE_MASK                  0x000f0000
#define FILE_STORAGE_TYPE_SHIFT                 16

#define FILE_VC_QUOTA_NONE              0x00000000
#define FILE_VC_QUOTA_TRACK             0x00000001
#define FILE_VC_QUOTA_ENFORCE           0x00000002
#define FILE_VC_QUOTA_MASK              0x00000003

#define FILE_VC_QUOTAS_LOG_VIOLATIONS   0x00000004
#define FILE_VC_CONTENT_INDEX_DISABLED  0x00000008

#define FILE_VC_LOG_QUOTA_THRESHOLD     0x00000010
#define FILE_VC_LOG_QUOTA_LIMIT         0x00000020
#define FILE_VC_LOG_VOLUME_THRESHOLD    0x00000040
#define FILE_VC_LOG_VOLUME_LIMIT        0x00000080

#define FILE_VC_QUOTAS_INCOMPLETE       0x00000100
#define FILE_VC_QUOTAS_REBUILDING       0x00000200

#define FILE_VC_VALID_MASK              0x000003ff

#define FSRTL_FLAG_FILE_MODIFIED        (0x01)
#define FSRTL_FLAG_FILE_LENGTH_CHANGED  (0x02)
#define FSRTL_FLAG_LIMIT_MODIFIED_PAGES (0x04)
#define FSRTL_FLAG_ACQUIRE_MAIN_RSRC_EX (0x08)
#define FSRTL_FLAG_ACQUIRE_MAIN_RSRC_SH (0x10)
#define FSRTL_FLAG_USER_MAPPED_FILE     (0x20)
#define FSRTL_FLAG_EOF_ADVANCE_ACTIVE   (0x80)

#define FSRTL_FLAG2_DO_MODIFIED_WRITE   (0x01)

#define FSRTL_FSP_TOP_LEVEL_IRP         (0x01)
#define FSRTL_CACHE_TOP_LEVEL_IRP       (0x02)
#define FSRTL_MOD_WRITE_TOP_LEVEL_IRP   (0x03)
#define FSRTL_FAST_IO_TOP_LEVEL_IRP     (0x04)
#define FSRTL_MAX_TOP_LEVEL_IRP_FLAG    (0x04)

#define FSRTL_VOLUME_DISMOUNT           1
#define FSRTL_VOLUME_DISMOUNT_FAILED    2
#define FSRTL_VOLUME_LOCK               3
#define FSRTL_VOLUME_LOCK_FAILED        4
#define FSRTL_VOLUME_UNLOCK             5
#define FSRTL_VOLUME_MOUNT              6

#define FSRTL_WILD_CHARACTER            0x08

#ifdef _X86_
#define HARDWARE_PTE    HARDWARE_PTE_X86
#define PHARDWARE_PTE   PHARDWARE_PTE_X86
#else
#define HARDWARE_PTE    ULONG
#define PHARDWARE_PTE   PULONG
#endif

#define IO_CHECK_CREATE_PARAMETERS      0x0200
#define IO_ATTACH_DEVICE                0x0400

#define IO_ATTACH_DEVICE_API            0x80000000
/* also in winnt.h */
#define IO_COMPLETION_QUERY_STATE       0x0001
#define IO_COMPLETION_MODIFY_STATE      0x0002
#define IO_COMPLETION_ALL_ACCESS        (STANDARD_RIGHTS_REQUIRED|SYNCHRONIZE|0x3)
/* end winnt.h */
#define IO_FILE_OBJECT_NON_PAGED_POOL_CHARGE    64
#define IO_FILE_OBJECT_PAGED_POOL_CHARGE        1024

#define IO_TYPE_APC                     18
#define IO_TYPE_DPC                     19
#define IO_TYPE_DEVICE_QUEUE            20
#define IO_TYPE_EVENT_PAIR              21
#define IO_TYPE_INTERRUPT               22
#define IO_TYPE_PROFILE                 23

#define IRP_BEING_VERIFIED              0x10

#define MAILSLOT_CLASS_FIRSTCLASS       1
#define MAILSLOT_CLASS_SECONDCLASS      2

#define MAILSLOT_SIZE_AUTO              0

#define MAP_PROCESS                     1L
#define MAP_SYSTEM                      2L
#define MEM_DOS_LIM                     0x40000000
/* also in winnt.h */
#define MEM_IMAGE                       SEC_IMAGE
/* end winnt.h */
#define OB_TYPE_TYPE                    1
#define OB_TYPE_DIRECTORY               2
#define OB_TYPE_SYMBOLIC_LINK           3
#define OB_TYPE_TOKEN                   4
#define OB_TYPE_PROCESS                 5
#define OB_TYPE_THREAD                  6
#define OB_TYPE_EVENT                   7
#define OB_TYPE_EVENT_PAIR              8
#define OB_TYPE_MUTANT                  9
#define OB_TYPE_SEMAPHORE               10
#define OB_TYPE_TIMER                   11
#define OB_TYPE_PROFILE                 12
#define OB_TYPE_WINDOW_STATION          13
#define OB_TYPE_DESKTOP                 14
#define OB_TYPE_SECTION                 15
#define OB_TYPE_KEY                     16
#define OB_TYPE_PORT                    17
#define OB_TYPE_ADAPTER                 18
#define OB_TYPE_CONTROLLER              19
#define OB_TYPE_DEVICE                  20
#define OB_TYPE_DRIVER                  21
#define OB_TYPE_IO_COMPLETION           22
#define OB_TYPE_FILE                    23

#define PIN_WAIT                        (1)
#define PIN_EXCLUSIVE                   (2)
#define PIN_NO_READ                     (4)
#define PIN_IF_BCB                      (8)

#define PORT_CONNECT                    0x0001
#define PORT_ALL_ACCESS                 (STANDARD_RIGHTS_ALL |\
                                         PORT_CONNECT)
/* also in winnt.h */
#define SEC_BASED	0x00200000
#define SEC_NO_CHANGE	0x00400000
#define SEC_FILE	0x00800000
#define SEC_IMAGE	0x01000000
#define SEC_VLM		0x02000000
#define SEC_RESERVE	0x04000000
#define SEC_COMMIT	0x08000000
#define SEC_NOCACHE	0x10000000

#define SECURITY_WORLD_SID_AUTHORITY    {0,0,0,0,0,1}
#define SECURITY_WORLD_RID              (0x00000000L)

#define SID_REVISION                    1

#define TOKEN_ASSIGN_PRIMARY            (0x0001)
#define TOKEN_DUPLICATE                 (0x0002)
#define TOKEN_IMPERSONATE               (0x0004)
#define TOKEN_QUERY                     (0x0008)
#define TOKEN_QUERY_SOURCE              (0x0010)
#define TOKEN_ADJUST_PRIVILEGES         (0x0020)
#define TOKEN_ADJUST_GROUPS             (0x0040)
#define TOKEN_ADJUST_DEFAULT            (0x0080)

#define TOKEN_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED |\
                          TOKEN_ASSIGN_PRIMARY     |\
                          TOKEN_DUPLICATE          |\
                          TOKEN_IMPERSONATE        |\
                          TOKEN_QUERY              |\
                          TOKEN_QUERY_SOURCE       |\
                          TOKEN_ADJUST_PRIVILEGES  |\
                          TOKEN_ADJUST_GROUPS      |\
                          TOKEN_ADJUST_DEFAULT)

#define TOKEN_READ       (STANDARD_RIGHTS_READ     |\
                          TOKEN_QUERY)

#define TOKEN_WRITE      (STANDARD_RIGHTS_WRITE    |\
                          TOKEN_ADJUST_PRIVILEGES  |\
                          TOKEN_ADJUST_GROUPS      |\
                          TOKEN_ADJUST_DEFAULT)

#define TOKEN_EXECUTE    (STANDARD_RIGHTS_EXECUTE)

#define TOKEN_SOURCE_LENGTH 8
/* end winnt.h */

#define TOKEN_HAS_TRAVERSE_PRIVILEGE    0x01
#define TOKEN_HAS_BACKUP_PRIVILEGE      0x02
#define TOKEN_HAS_RESTORE_PRIVILEGE     0x04
#define TOKEN_HAS_ADMIN_GROUP           0x08
#define TOKEN_IS_RESTRICTED             0x10

#define VACB_MAPPING_GRANULARITY        (0x40000)
#define VACB_OFFSET_SHIFT               (18)

#define FSCTL_REQUEST_OPLOCK_LEVEL_1    CTL_CODE(FILE_DEVICE_FILE_SYSTEM,  0, METHOD_BUFFERED, FILE_ANY_ACCESS)
#define FSCTL_REQUEST_OPLOCK_LEVEL_2    CTL_CODE(FILE_DEVICE_FILE_SYSTEM,  1, METHOD_BUFFERED, FILE_ANY_ACCESS)
#define FSCTL_REQUEST_BATCH_OPLOCK      CTL_CODE(FILE_DEVICE_FILE_SYSTEM,  2, METHOD_BUFFERED, FILE_ANY_ACCESS)
#define FSCTL_OPLOCK_BREAK_ACKNOWLEDGE  CTL_CODE(FILE_DEVICE_FILE_SYSTEM,  3, METHOD_BUFFERED, FILE_ANY_ACCESS)
#define FSCTL_OPBATCH_ACK_CLOSE_PENDING CTL_CODE(FILE_DEVICE_FILE_SYSTEM,  4, METHOD_BUFFERED, FILE_ANY_ACCESS)
#define FSCTL_OPLOCK_BREAK_NOTIFY       CTL_CODE(FILE_DEVICE_FILE_SYSTEM,  5, METHOD_BUFFERED, FILE_ANY_ACCESS)
#define FSCTL_LOCK_VOLUME               CTL_CODE(FILE_DEVICE_FILE_SYSTEM,  6, METHOD_BUFFERED, FILE_ANY_ACCESS)
#define FSCTL_UNLOCK_VOLUME             CTL_CODE(FILE_DEVICE_FILE_SYSTEM,  7, METHOD_BUFFERED, FILE_ANY_ACCESS)
#define FSCTL_DISMOUNT_VOLUME           CTL_CODE(FILE_DEVICE_FILE_SYSTEM,  8, METHOD_BUFFERED, FILE_ANY_ACCESS)

#define FSCTL_IS_VOLUME_MOUNTED         CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 10, METHOD_BUFFERED, FILE_ANY_ACCESS)
#define FSCTL_IS_PATHNAME_VALID         CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 11, METHOD_BUFFERED, FILE_ANY_ACCESS)
#define FSCTL_MARK_VOLUME_DIRTY         CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 12, METHOD_BUFFERED, FILE_ANY_ACCESS)

#define FSCTL_QUERY_RETRIEVAL_POINTERS  CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 14,  METHOD_NEITHER, FILE_ANY_ACCESS)
#define FSCTL_GET_COMPRESSION           CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 15, METHOD_BUFFERED, FILE_ANY_ACCESS)
#define FSCTL_SET_COMPRESSION           CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 16, METHOD_BUFFERED, FILE_READ_DATA | FILE_WRITE_DATA)


#define FSCTL_MARK_AS_SYSTEM_HIVE       CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 19,  METHOD_NEITHER, FILE_ANY_ACCESS)
#define FSCTL_OPLOCK_BREAK_ACK_NO_2     CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 20, METHOD_BUFFERED, FILE_ANY_ACCESS)
#define FSCTL_INVALIDATE_VOLUMES        CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 21, METHOD_BUFFERED, FILE_ANY_ACCESS)
#define FSCTL_QUERY_FAT_BPB             CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 22, METHOD_BUFFERED, FILE_ANY_ACCESS)
#define FSCTL_REQUEST_FILTER_OPLOCK     CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 23, METHOD_BUFFERED, FILE_ANY_ACCESS)
#define FSCTL_FILESYSTEM_GET_STATISTICS CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 24, METHOD_BUFFERED, FILE_ANY_ACCESS)

#if (VER_PRODUCTBUILD >= 1381)

#define FSCTL_GET_NTFS_VOLUME_DATA      CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 25, METHOD_BUFFERED, FILE_ANY_ACCESS)
#define FSCTL_GET_NTFS_FILE_RECORD      CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 26, METHOD_BUFFERED, FILE_ANY_ACCESS)
#define FSCTL_GET_VOLUME_BITMAP         CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 27,  METHOD_NEITHER, FILE_ANY_ACCESS)
#define FSCTL_GET_RETRIEVAL_POINTERS    CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 28,  METHOD_NEITHER, FILE_ANY_ACCESS)
#define FSCTL_MOVE_FILE                 CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 29, METHOD_BUFFERED, FILE_ANY_ACCESS)
#define FSCTL_IS_VOLUME_DIRTY           CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 30, METHOD_BUFFERED, FILE_ANY_ACCESS)
#define FSCTL_GET_HFS_INFORMATION       CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 31, METHOD_BUFFERED, FILE_ANY_ACCESS)
#define FSCTL_ALLOW_EXTENDED_DASD_IO    CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 32, METHOD_NEITHER,  FILE_ANY_ACCESS)

#endif /* (VER_PRODUCTBUILD >= 1381) */

#if (VER_PRODUCTBUILD >= 2195)

#define FSCTL_READ_PROPERTY_DATA        CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 33, METHOD_NEITHER, FILE_ANY_ACCESS)
#define FSCTL_WRITE_PROPERTY_DATA       CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 34, METHOD_NEITHER, FILE_ANY_ACCESS)
#define FSCTL_FIND_FILES_BY_SID         CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 35, METHOD_NEITHER, FILE_ANY_ACCESS)

#define FSCTL_DUMP_PROPERTY_DATA        CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 37,  METHOD_NEITHER, FILE_ANY_ACCESS)
#define FSCTL_SET_OBJECT_ID             CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 38, METHOD_BUFFERED, FILE_WRITE_DATA)
#define FSCTL_GET_OBJECT_ID             CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 39, METHOD_BUFFERED, FILE_ANY_ACCESS)
#define FSCTL_DELETE_OBJECT_ID          CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 40, METHOD_BUFFERED, FILE_WRITE_DATA)
#define FSCTL_SET_REPARSE_POINT         CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 41, METHOD_BUFFERED, FILE_WRITE_DATA)
#define FSCTL_GET_REPARSE_POINT         CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 42, METHOD_BUFFERED, FILE_ANY_ACCESS)
#define FSCTL_DELETE_REPARSE_POINT      CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 43, METHOD_BUFFERED, FILE_WRITE_DATA)
#define FSCTL_ENUM_USN_DATA             CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 44,  METHOD_NEITHER, FILE_READ_DATA)
#define FSCTL_SECURITY_ID_CHECK         CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 45,  METHOD_NEITHER, FILE_READ_DATA)
#define FSCTL_READ_USN_JOURNAL          CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 46,  METHOD_NEITHER, FILE_READ_DATA)
#define FSCTL_SET_OBJECT_ID_EXTENDED    CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 47, METHOD_BUFFERED, FILE_WRITE_DATA)
#define FSCTL_CREATE_OR_GET_OBJECT_ID   CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 48, METHOD_BUFFERED, FILE_ANY_ACCESS)
#define FSCTL_SET_SPARSE                CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 49, METHOD_BUFFERED, FILE_WRITE_DATA)
#define FSCTL_SET_ZERO_DATA             CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 50, METHOD_BUFFERED, FILE_WRITE_DATA)
#define FSCTL_QUERY_ALLOCATED_RANGES    CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 51,  METHOD_NEITHER, FILE_READ_DATA)
#define FSCTL_ENABLE_UPGRADE            CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 52, METHOD_BUFFERED, FILE_WRITE_DATA)
#define FSCTL_SET_ENCRYPTION            CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 53, METHOD_BUFFERED, FILE_ANY_ACCESS)
#define FSCTL_ENCRYPTION_FSCTL_IO       CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 54,  METHOD_NEITHER, FILE_ANY_ACCESS)
#define FSCTL_WRITE_RAW_ENCRYPTED       CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 55,  METHOD_NEITHER, FILE_ANY_ACCESS)
#define FSCTL_READ_RAW_ENCRYPTED        CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 56,  METHOD_NEITHER, FILE_ANY_ACCESS)
#define FSCTL_CREATE_USN_JOURNAL        CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 57,  METHOD_NEITHER, FILE_READ_DATA)
#define FSCTL_READ_FILE_USN_DATA        CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 58,  METHOD_NEITHER, FILE_READ_DATA)
#define FSCTL_WRITE_USN_CLOSE_RECORD    CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 59,  METHOD_NEITHER, FILE_READ_DATA)
#define FSCTL_EXTEND_VOLUME             CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 60, METHOD_BUFFERED, FILE_ANY_ACCESS)
#define FSCTL_QUERY_USN_JOURNAL         CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 61, METHOD_BUFFERED, FILE_ANY_ACCESS)
#define FSCTL_DELETE_USN_JOURNAL        CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 62, METHOD_BUFFERED, FILE_ANY_ACCESS)
#define FSCTL_MARK_HANDLE               CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 63, METHOD_BUFFERED, FILE_ANY_ACCESS)
#define FSCTL_SIS_COPYFILE              CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 64, METHOD_BUFFERED, FILE_ANY_ACCESS)
#define FSCTL_SIS_LINK_FILES            CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 65, METHOD_BUFFERED, FILE_READ_DATA | FILE_WRITE_DATA)
#define FSCTL_HSM_MSG                   CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 66, METHOD_BUFFERED, FILE_READ_DATA | FILE_WRITE_DATA)
#define FSCTL_NSS_CONTROL               CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 67, METHOD_BUFFERED, FILE_WRITE_DATA)
#define FSCTL_HSM_DATA                  CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 68, METHOD_NEITHER, FILE_READ_DATA | FILE_WRITE_DATA)
#define FSCTL_RECALL_FILE               CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 69, METHOD_NEITHER, FILE_ANY_ACCESS)
#define FSCTL_NSS_RCONTROL              CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 70, METHOD_BUFFERED, FILE_READ_DATA)
#define FSCTL_READ_FROM_PLEX            CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 71, METHOD_OUT_DIRECT, FILE_READ_DATA)
#define FSCTL_FILE_PREFETCH             CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 72, METHOD_BUFFERED, FILE_SPECIAL_ACCESS)

#endif /* (VER_PRODUCTBUILD >= 2195) */

#define FSCTL_MAILSLOT_PEEK             CTL_CODE(FILE_DEVICE_MAILSLOT, 0, METHOD_NEITHER, FILE_READ_DATA)

#define FSCTL_NETWORK_SET_CONFIGURATION_INFO    CTL_CODE(FILE_DEVICE_NETWORK_FILE_SYSTEM, 102, METHOD_IN_DIRECT, FILE_ANY_ACCESS)
#define FSCTL_NETWORK_GET_CONFIGURATION_INFO    CTL_CODE(FILE_DEVICE_NETWORK_FILE_SYSTEM, 103, METHOD_OUT_DIRECT, FILE_ANY_ACCESS)
#define FSCTL_NETWORK_GET_CONNECTION_INFO       CTL_CODE(FILE_DEVICE_NETWORK_FILE_SYSTEM, 104, METHOD_NEITHER, FILE_ANY_ACCESS)
#define FSCTL_NETWORK_ENUMERATE_CONNECTIONS     CTL_CODE(FILE_DEVICE_NETWORK_FILE_SYSTEM, 105, METHOD_NEITHER, FILE_ANY_ACCESS)
#define FSCTL_NETWORK_DELETE_CONNECTION         CTL_CODE(FILE_DEVICE_NETWORK_FILE_SYSTEM, 107, METHOD_BUFFERED, FILE_ANY_ACCESS)
#define FSCTL_NETWORK_GET_STATISTICS            CTL_CODE(FILE_DEVICE_NETWORK_FILE_SYSTEM, 116, METHOD_BUFFERED, FILE_ANY_ACCESS)
#define FSCTL_NETWORK_SET_DOMAIN_NAME           CTL_CODE(FILE_DEVICE_NETWORK_FILE_SYSTEM, 120, METHOD_BUFFERED, FILE_ANY_ACCESS)
#define FSCTL_NETWORK_REMOTE_BOOT_INIT_SCRT     CTL_CODE(FILE_DEVICE_NETWORK_FILE_SYSTEM, 250, METHOD_BUFFERED, FILE_ANY_ACCESS)

#define FSCTL_PIPE_ASSIGN_EVENT         CTL_CODE(FILE_DEVICE_NAMED_PIPE, 0, METHOD_BUFFERED, FILE_ANY_ACCESS)
#define FSCTL_PIPE_DISCONNECT           CTL_CODE(FILE_DEVICE_NAMED_PIPE, 1, METHOD_BUFFERED, FILE_ANY_ACCESS)
#define FSCTL_PIPE_LISTEN               CTL_CODE(FILE_DEVICE_NAMED_PIPE, 2, METHOD_BUFFERED, FILE_ANY_ACCESS)
#define FSCTL_PIPE_PEEK                 CTL_CODE(FILE_DEVICE_NAMED_PIPE, 3, METHOD_BUFFERED, FILE_READ_DATA)
#define FSCTL_PIPE_QUERY_EVENT          CTL_CODE(FILE_DEVICE_NAMED_PIPE, 4, METHOD_BUFFERED, FILE_ANY_ACCESS)
#define FSCTL_PIPE_TRANSCEIVE           CTL_CODE(FILE_DEVICE_NAMED_PIPE, 5, METHOD_NEITHER,  FILE_READ_DATA | FILE_WRITE_DATA)
#define FSCTL_PIPE_WAIT                 CTL_CODE(FILE_DEVICE_NAMED_PIPE, 6, METHOD_BUFFERED, FILE_ANY_ACCESS)
#define FSCTL_PIPE_IMPERSONATE          CTL_CODE(FILE_DEVICE_NAMED_PIPE, 7, METHOD_BUFFERED, FILE_ANY_ACCESS)
#define FSCTL_PIPE_SET_CLIENT_PROCESS   CTL_CODE(FILE_DEVICE_NAMED_PIPE, 8, METHOD_BUFFERED, FILE_ANY_ACCESS)
#define FSCTL_PIPE_QUERY_CLIENT_PROCESS CTL_CODE(FILE_DEVICE_NAMED_PIPE, 9, METHOD_BUFFERED, FILE_ANY_ACCESS)
#define FSCTL_PIPE_INTERNAL_READ        CTL_CODE(FILE_DEVICE_NAMED_PIPE, 2045, METHOD_BUFFERED, FILE_READ_DATA)
#define FSCTL_PIPE_INTERNAL_WRITE       CTL_CODE(FILE_DEVICE_NAMED_PIPE, 2046, METHOD_BUFFERED, FILE_WRITE_DATA)
#define FSCTL_PIPE_INTERNAL_TRANSCEIVE  CTL_CODE(FILE_DEVICE_NAMED_PIPE, 2047, METHOD_NEITHER, FILE_READ_DATA | FILE_WRITE_DATA)
#define FSCTL_PIPE_INTERNAL_READ_OVFLOW CTL_CODE(FILE_DEVICE_NAMED_PIPE, 2048, METHOD_BUFFERED, FILE_READ_DATA)

#define IOCTL_REDIR_QUERY_PATH          CTL_CODE(FILE_DEVICE_NETWORK_FILE_SYSTEM, 99, METHOD_NEITHER, FILE_ANY_ACCESS)

typedef PVOID PEJOB;
typedef PVOID OPLOCK, *POPLOCK;
typedef PVOID PWOW64_PROCESS;

typedef struct _CACHE_MANAGER_CALLBACKS         *PCACHE_MANAGER_CALLBACKS;
typedef struct _EPROCESS_QUOTA_BLOCK            *PEPROCESS_QUOTA_BLOCK;
typedef struct _FILE_GET_QUOTA_INFORMATION      *PFILE_GET_QUOTA_INFORMATION;
typedef struct _HANDLE_TABLE                    *PHANDLE_TABLE;
typedef struct _KEVENT_PAIR                     *PKEVENT_PAIR;
typedef struct _KPROCESS                        *PKPROCESS;
typedef struct _KQUEUE                          *PKQUEUE;
typedef struct _KTRAP_FRAME                     *PKTRAP_FRAME;
typedef struct _MAILSLOT_CREATE_PARAMETERS      *PMAILSLOT_CREATE_PARAMETERS;
typedef struct _MMWSL                           *PMMWSL;
typedef struct _NAMED_PIPE_CREATE_PARAMETERS    *PNAMED_PIPE_CREATE_PARAMETERS;
typedef struct _OBJECT_DIRECTORY                *POBJECT_DIRECTORY;
typedef struct _PAGEFAULT_HISTORY               *PPAGEFAULT_HISTORY;
typedef struct _PS_IMPERSONATION_INFORMATION    *PPS_IMPERSONATION_INFORMATION;
typedef struct _SECTION_OBJECT                  *PSECTION_OBJECT;
typedef struct _SHARED_CACHE_MAP                *PSHARED_CACHE_MAP;
typedef struct _TERMINATION_PORT                *PTERMINATION_PORT;
typedef struct _VACB                            *PVACB;
typedef struct _VAD_HEADER                      *PVAD_HEADER;

typedef struct _NOTIFY_SYNC
{
    ULONG Unknown0;
    ULONG Unknown1;
    ULONG Unknown2;
    USHORT Unknown3;
    USHORT Unknown4;
    ULONG Unknown5;
    ULONG Unknown6;
    ULONG Unknown7;
    ULONG Unknown8;
    ULONG Unknown9;
    ULONG Unknown10;
} NOTIFY_SYNC, * PNOTIFY_SYNC;

typedef enum _FAST_IO_POSSIBLE {
    FastIoIsNotPossible,
    FastIoIsPossible,
    FastIoIsQuestionable
} FAST_IO_POSSIBLE;

typedef enum _FILE_STORAGE_TYPE {
    StorageTypeDefault = 1,
    StorageTypeDirectory,
    StorageTypeFile,
    StorageTypeJunctionPoint,
    StorageTypeCatalog,
    StorageTypeStructuredStorage,
    StorageTypeEmbedding,
    StorageTypeStream
} FILE_STORAGE_TYPE;

typedef enum _IO_COMPLETION_INFORMATION_CLASS {
    IoCompletionBasicInformation
} IO_COMPLETION_INFORMATION_CLASS;

typedef enum _OBJECT_INFO_CLASS {
    ObjectBasicInfo,
    ObjectNameInfo,
    ObjectTypeInfo,
    ObjectAllTypesInfo,
    ObjectProtectionInfo
} OBJECT_INFO_CLASS;

typedef struct _HARDWARE_PTE_X86 {
    ULONG Valid             : 1;
    ULONG Write             : 1;
    ULONG Owner             : 1;
    ULONG WriteThrough      : 1;
    ULONG CacheDisable      : 1;
    ULONG Accessed          : 1;
    ULONG Dirty             : 1;
    ULONG LargePage         : 1;
    ULONG Global            : 1;
    ULONG CopyOnWrite       : 1;
    ULONG Prototype         : 1;
    ULONG reserved          : 1;
    ULONG PageFrameNumber   : 20;
} HARDWARE_PTE_X86, *PHARDWARE_PTE_X86;

typedef struct _KAPC_STATE {
    LIST_ENTRY  ApcListHead[2];
    PKPROCESS   Process;
    BOOLEAN     KernelApcInProgress;
    BOOLEAN     KernelApcPending;
    BOOLEAN     UserApcPending;
} KAPC_STATE, *PKAPC_STATE;

typedef struct _KGDTENTRY {
    USHORT LimitLow;
    USHORT BaseLow;
    union {
        struct {
            UCHAR BaseMid;
            UCHAR Flags1;
            UCHAR Flags2;
            UCHAR BaseHi;
        } Bytes;
        struct {
            ULONG BaseMid       : 8;
            ULONG Type          : 5;
            ULONG Dpl           : 2;
            ULONG Pres          : 1;
            ULONG LimitHi       : 4;
            ULONG Sys           : 1;
            ULONG Reserved_0    : 1;
            ULONG Default_Big   : 1;
            ULONG Granularity   : 1;
            ULONG BaseHi        : 8;
        } Bits;
    } HighWord;
} KGDTENTRY, *PKGDTENTRY;

typedef struct _KIDTENTRY {
    USHORT Offset;
    USHORT Selector;
    USHORT Access;
    USHORT ExtendedOffset;
} KIDTENTRY, *PKIDTENTRY;

#if (VER_PRODUCTBUILD >= 2600)

typedef struct _MMSUPPORT_FLAGS {
    ULONG SessionSpace              : 1;
    ULONG BeingTrimmed              : 1;
    ULONG SessionLeader             : 1;
    ULONG TrimHard                  : 1;
    ULONG WorkingSetHard            : 1;
    ULONG AddressSpaceBeingDeleted  : 1;
    ULONG Available                 : 10;
    ULONG AllowWorkingSetAdjustment : 8;
    ULONG MemoryPriority            : 8;
} MMSUPPORT_FLAGS, *PMMSUPPORT_FLAGS;

#else

typedef struct _MMSUPPORT_FLAGS {
    ULONG SessionSpace      : 1;
    ULONG BeingTrimmed      : 1;
    ULONG ProcessInSession  : 1;
    ULONG SessionLeader     : 1;
    ULONG TrimHard          : 1;
    ULONG WorkingSetHard    : 1;
    ULONG WriteWatch        : 1;
    ULONG Filler            : 25;
} MMSUPPORT_FLAGS, *PMMSUPPORT_FLAGS;

#endif

#if (VER_PRODUCTBUILD >= 2600)

typedef struct _MMSUPPORT {
    LARGE_INTEGER   LastTrimTime;
    MMSUPPORT_FLAGS Flags;
    ULONG           PageFaultCount;
    ULONG           PeakWorkingSetSize;
    ULONG           WorkingSetSize;
    ULONG           MinimumWorkingSetSize;
    ULONG           MaximumWorkingSetSize;
    PMMWSL          VmWorkingSetList;
    LIST_ENTRY      WorkingSetExpansionLinks;
    ULONG           Claim;
    ULONG           NextEstimationSlot;
    ULONG           NextAgingSlot;
    ULONG           EstimatedAvailable;
    ULONG           GrowthSinceLastEstimate;
} MMSUPPORT, *PMMSUPPORT;

#else

typedef struct _MMSUPPORT {
    LARGE_INTEGER   LastTrimTime;
    ULONG           LastTrimFaultCount;
    ULONG           PageFaultCount;
    ULONG           PeakWorkingSetSize;
    ULONG           WorkingSetSize;
    ULONG           MinimumWorkingSetSize;
    ULONG           MaximumWorkingSetSize;
    PMMWSL          VmWorkingSetList;
    LIST_ENTRY      WorkingSetExpansionLinks;
    BOOLEAN         AllowWorkingSetAdjustment;
    BOOLEAN         AddressSpaceBeingDeleted;
    UCHAR           ForegroundSwitchCount;
    UCHAR           MemoryPriority;
#if (VER_PRODUCTBUILD >= 2195)
    union {
        ULONG           LongFlags;
        MMSUPPORT_FLAGS Flags;
    } u;
    ULONG           Claim;
    ULONG           NextEstimationSlot;
    ULONG           NextAgingSlot;
    ULONG           EstimatedAvailable;
    ULONG           GrowthSinceLastEstimate;
#endif /* (VER_PRODUCTBUILD >= 2195) */
} MMSUPPORT, *PMMSUPPORT;

#endif

typedef struct _SE_AUDIT_PROCESS_CREATION_INFO {
    POBJECT_NAME_INFORMATION ImageFileName;
} SE_AUDIT_PROCESS_CREATION_INFO, *PSE_AUDIT_PROCESS_CREATION_INFO;

typedef struct _BITMAP_RANGE {
    LIST_ENTRY      Links;
    LARGE_INTEGER   BasePage;
    ULONG           FirstDirtyPage;
    ULONG           LastDirtyPage;
    ULONG           DirtyPages;
    PULONG          Bitmap;
} BITMAP_RANGE, *PBITMAP_RANGE;

typedef struct _CACHE_UNINITIALIZE_EVENT {
    struct _CACHE_UNINITIALIZE_EVENT    *Next;
    KEVENT                              Event;
} CACHE_UNINITIALIZE_EVENT, *PCACHE_UNINITIALIZE_EVENT;

typedef struct _CC_FILE_SIZES {
    LARGE_INTEGER AllocationSize;
    LARGE_INTEGER FileSize;
    LARGE_INTEGER ValidDataLength;
} CC_FILE_SIZES, *PCC_FILE_SIZES;

typedef struct _COMPRESSED_DATA_INFO {
    USHORT  CompressionFormatAndEngine;
    UCHAR   CompressionUnitShift;
    UCHAR   ChunkShift;
    UCHAR   ClusterShift;
    UCHAR   Reserved;
    USHORT  NumberOfChunks;
    ULONG   CompressedChunkSizes[ANYSIZE_ARRAY];
} COMPRESSED_DATA_INFO, *PCOMPRESSED_DATA_INFO;

typedef struct _DEVICE_MAP {
    POBJECT_DIRECTORY   DosDevicesDirectory;
    POBJECT_DIRECTORY   GlobalDosDevicesDirectory;
    ULONG               ReferenceCount;
    ULONG               DriveMap;
    UCHAR               DriveType[32];
} DEVICE_MAP, *PDEVICE_MAP;

#if (VER_PRODUCTBUILD >= 2600)

typedef struct _EX_FAST_REF {
    _ANONYMOUS_UNION union {
        PVOID Object;
        ULONG RefCnt : 3;
        ULONG Value;
    } DUMMYUNIONNAME;
} EX_FAST_REF, *PEX_FAST_REF;

typedef struct _EX_PUSH_LOCK {
    _ANONYMOUS_UNION union {
        _ANONYMOUS_STRUCT struct {
            ULONG   Waiting     : 1;
            ULONG   Exclusive   : 1;
            ULONG   Shared      : 30;
        } DUMMYSTRUCTNAME;
        ULONG   Value;
        PVOID   Ptr;
    } DUMMYUNIONNAME;
} EX_PUSH_LOCK, *PEX_PUSH_LOCK;

typedef struct _EX_RUNDOWN_REF {
    _ANONYMOUS_UNION union {
        ULONG Count;
        PVOID Ptr;
    } DUMMYUNIONNAME;
} EX_RUNDOWN_REF, *PEX_RUNDOWN_REF;

#endif

typedef struct _EPROCESS_QUOTA_ENTRY {
    ULONG Usage;
    ULONG Limit;
    ULONG Peak;
    ULONG Return;
} EPROCESS_QUOTA_ENTRY, *PEPROCESS_QUOTA_ENTRY;

typedef struct _EPROCESS_QUOTA_BLOCK {
    EPROCESS_QUOTA_ENTRY    QuotaEntry[3];
    LIST_ENTRY              QuotaList;
    ULONG                   ReferenceCount;
    ULONG                   ProcessCount;
} EPROCESS_QUOTA_BLOCK, *PEPROCESS_QUOTA_BLOCK;

/*
 * When needing these parameters cast your PIO_STACK_LOCATION to
 * PEXTENDED_IO_STACK_LOCATION
 */
#if !defined(_ALPHA_) && !defined(_M_ALPHA)
#include <pshpack4.h>
#endif
typedef struct _EXTENDED_IO_STACK_LOCATION {

    /* Included for padding */
    UCHAR MajorFunction;
    UCHAR MinorFunction;
    UCHAR Flags;
    UCHAR Control;

    union {

       struct {
          PIO_SECURITY_CONTEXT              SecurityContext;
          ULONG                             Options;
          USHORT                            Reserved;
          USHORT                            ShareAccess;
          PMAILSLOT_CREATE_PARAMETERS       Parameters;
       } CreateMailslot;

        struct {
            PIO_SECURITY_CONTEXT            SecurityContext;
            ULONG                           Options;
            USHORT                          Reserved;
            USHORT                          ShareAccess;
            PNAMED_PIPE_CREATE_PARAMETERS   Parameters;
        } CreatePipe;

        struct {
            ULONG                           OutputBufferLength;
            ULONG                           InputBufferLength;
            ULONG                           FsControlCode;
            PVOID                           Type3InputBuffer;
        } FileSystemControl;

        struct {
            PLARGE_INTEGER                  Length;
            ULONG                           Key;
            LARGE_INTEGER                   ByteOffset;
        } LockControl;

        struct {
            ULONG                           Length;
            ULONG                           CompletionFilter;
        } NotifyDirectory;

        struct {
            ULONG                           Length;
            PUNICODE_STRING                 FileName;
            FILE_INFORMATION_CLASS          FileInformationClass;
            ULONG                           FileIndex;
        } QueryDirectory;

        struct {
            ULONG                           Length;
            PVOID                           EaList;
            ULONG                           EaListLength;
            ULONG                           EaIndex;
        } QueryEa;

        struct {
            ULONG                           Length;
            PSID                            StartSid;
            PFILE_GET_QUOTA_INFORMATION     SidList;
            ULONG                           SidListLength;
        } QueryQuota;

        struct {
            ULONG                           Length;
        } SetEa;

        struct {
            ULONG                           Length;
        } SetQuota;

        struct {
            ULONG                           Length;
            FS_INFORMATION_CLASS            FsInformationClass;
        } SetVolume;

    } Parameters;
    PDEVICE_OBJECT  DeviceObject;
    PFILE_OBJECT  FileObject;
    PIO_COMPLETION_ROUTINE  CompletionRoutine;
    PVOID  Context;

} EXTENDED_IO_STACK_LOCATION, *PEXTENDED_IO_STACK_LOCATION;
#if !defined(_ALPHA_) && !defined(_M_ALPHA)
#include <poppack.h>
#endif

typedef struct _FILE_ACCESS_INFORMATION {
    ACCESS_MASK AccessFlags;
} FILE_ACCESS_INFORMATION, *PFILE_ACCESS_INFORMATION;

typedef struct _FILE_ALLOCATION_INFORMATION {
    LARGE_INTEGER AllocationSize;
} FILE_ALLOCATION_INFORMATION, *PFILE_ALLOCATION_INFORMATION;

typedef struct _FILE_BOTH_DIR_INFORMATION {
    ULONG           NextEntryOffset;
    ULONG           FileIndex;
    LARGE_INTEGER   CreationTime;
    LARGE_INTEGER   LastAccessTime;
    LARGE_INTEGER   LastWriteTime;
    LARGE_INTEGER   ChangeTime;
    LARGE_INTEGER   EndOfFile;
    LARGE_INTEGER   AllocationSize;
    ULONG           FileAttributes;
    ULONG           FileNameLength;
    ULONG           EaSize;
    CCHAR           ShortNameLength;
    WCHAR           ShortName[12];
    WCHAR           FileName[1];
} FILE_BOTH_DIR_INFORMATION, *PFILE_BOTH_DIR_INFORMATION;

typedef struct _FILE_COMPLETION_INFORMATION {
    HANDLE  Port;
    ULONG   Key;
} FILE_COMPLETION_INFORMATION, *PFILE_COMPLETION_INFORMATION;

typedef struct _FILE_COMPRESSION_INFORMATION {
    LARGE_INTEGER   CompressedFileSize;
    USHORT          CompressionFormat;
    UCHAR           CompressionUnitShift;
    UCHAR           ChunkShift;
    UCHAR           ClusterShift;
    UCHAR           Reserved[3];
} FILE_COMPRESSION_INFORMATION, *PFILE_COMPRESSION_INFORMATION;

typedef struct _FILE_COPY_ON_WRITE_INFORMATION {
    BOOLEAN ReplaceIfExists;
    HANDLE  RootDirectory;
    ULONG   FileNameLength;
    WCHAR   FileName[1];
} FILE_COPY_ON_WRITE_INFORMATION, *PFILE_COPY_ON_WRITE_INFORMATION;

typedef struct _FILE_DIRECTORY_INFORMATION {
    ULONG           NextEntryOffset;
    ULONG           FileIndex;
    LARGE_INTEGER   CreationTime;
    LARGE_INTEGER   LastAccessTime;
    LARGE_INTEGER   LastWriteTime;
    LARGE_INTEGER   ChangeTime;
    LARGE_INTEGER   EndOfFile;
    LARGE_INTEGER   AllocationSize;
    ULONG           FileAttributes;
    ULONG           FileNameLength;
    WCHAR           FileName[1];
} FILE_DIRECTORY_INFORMATION, *PFILE_DIRECTORY_INFORMATION;

typedef struct _FILE_FULL_DIRECTORY_INFORMATION {
		ULONG	          NextEntryOffset;
		ULONG	          FileIndex;
		LARGE_INTEGER   CreationTime;
		LARGE_INTEGER   LastAccessTime;
		LARGE_INTEGER   LastWriteTime;
		LARGE_INTEGER   ChangeTime;
		LARGE_INTEGER   EndOfFile;
		LARGE_INTEGER   AllocationSize;
		ULONG           FileAttributes;
		ULONG           FileNameLength;
		ULONG           EaSize;
		WCHAR           FileName[0];
} FILE_FULL_DIRECTORY_INFORMATION, *PFILE_FULL_DIRECTORY_INFORMATION;

typedef struct _FILE_BOTH_DIRECTORY_INFORMATION {
		ULONG         NextEntryOffset;
		ULONG	        FileIndex;
		LARGE_INTEGER CreationTime;
		LARGE_INTEGER LastAccessTime;
		LARGE_INTEGER LastWriteTime;
		LARGE_INTEGER ChangeTime;
		LARGE_INTEGER EndOfFile;
		LARGE_INTEGER AllocationSize;
		ULONG         FileAttributes;
		ULONG         FileNameLength;
		ULONG         EaSize;
		CHAR          ShortNameLength;
		WCHAR         ShortName[12];
		WCHAR         FileName[0];
} FILE_BOTH_DIRECTORY_INFORMATION, *PFILE_BOTH_DIRECTORY_INFORMATION;

#if (VER_PRODUCTBUILD >= 2600)

typedef struct _FILE_ID_FULL_DIRECTORY_INFORMATION {
		ULONG	          NextEntryOffset;
		ULONG	          FileIndex;
		LARGE_INTEGER   CreationTime;
		LARGE_INTEGER   LastAccessTime;
		LARGE_INTEGER   LastWriteTime;
		LARGE_INTEGER   ChangeTime;
		LARGE_INTEGER   EndOfFile;
		LARGE_INTEGER   AllocationSize;
		ULONG           FileAttributes;
		ULONG           FileNameLength;
		ULONG           EaSize;
		LARGE_INTEGER   FileId;
		WCHAR           FileName[0];
} FILE_ID_FULL_DIRECTORY_INFORMATION, *PFILE_ID_FULL_DIRECTORY_INFORMATION;

typedef struct _FILE_ID_BOTH_DIRECTORY_INFORMATION {
		ULONG         NextEntryOffset;
		ULONG	        FileIndex;
		LARGE_INTEGER CreationTime;
		LARGE_INTEGER LastAccessTime;
		LARGE_INTEGER LastWriteTime;
		LARGE_INTEGER ChangeTime;
		LARGE_INTEGER EndOfFile;
		LARGE_INTEGER AllocationSize;
		ULONG         FileAttributes;
		ULONG         FileNameLength;
		ULONG         EaSize;
		CHAR          ShortNameLength;
		WCHAR         ShortName[12];
		LARGE_INTEGER FileId;
		WCHAR         FileName[0];
} FILE_ID_BOTH_DIRECTORY_INFORMATION, *PFILE_ID_BOTH_DIRECTORY_INFORMATION;

#endif

typedef struct _FILE_EA_INFORMATION {
    ULONG EaSize;
} FILE_EA_INFORMATION, *PFILE_EA_INFORMATION;

typedef struct _FILE_FS_ATTRIBUTE_INFORMATION {
    ULONG   FileSystemAttributes;
    ULONG   MaximumComponentNameLength;
    ULONG   FileSystemNameLength;
    WCHAR   FileSystemName[1];
} FILE_FS_ATTRIBUTE_INFORMATION, *PFILE_FS_ATTRIBUTE_INFORMATION;

typedef struct _FILE_FS_CONTROL_INFORMATION {
    LARGE_INTEGER   FreeSpaceStartFiltering;
    LARGE_INTEGER   FreeSpaceThreshold;
    LARGE_INTEGER   FreeSpaceStopFiltering;
    LARGE_INTEGER   DefaultQuotaThreshold;
    LARGE_INTEGER   DefaultQuotaLimit;
    ULONG           FileSystemControlFlags;
} FILE_FS_CONTROL_INFORMATION, *PFILE_FS_CONTROL_INFORMATION;

typedef struct _FILE_FS_FULL_SIZE_INFORMATION {
    LARGE_INTEGER   TotalAllocationUnits;
    LARGE_INTEGER   CallerAvailableAllocationUnits;
    LARGE_INTEGER   ActualAvailableAllocationUnits;
    ULONG           SectorsPerAllocationUnit;
    ULONG           BytesPerSector;
} FILE_FS_FULL_SIZE_INFORMATION, *PFILE_FS_FULL_SIZE_INFORMATION;

typedef struct _FILE_FS_LABEL_INFORMATION {
    ULONG VolumeLabelLength;
    WCHAR VolumeLabel[1];
} FILE_FS_LABEL_INFORMATION, *PFILE_FS_LABEL_INFORMATION;

#if (VER_PRODUCTBUILD >= 2195)

typedef struct _FILE_FS_OBJECT_ID_INFORMATION {
    UCHAR ObjectId[16];
    UCHAR ExtendedInfo[48];
} FILE_FS_OBJECT_ID_INFORMATION, *PFILE_FS_OBJECT_ID_INFORMATION;

#endif /* (VER_PRODUCTBUILD >= 2195) */

typedef struct _FILE_FS_SIZE_INFORMATION {
    LARGE_INTEGER   TotalAllocationUnits;
    LARGE_INTEGER   AvailableAllocationUnits;
    ULONG           SectorsPerAllocationUnit;
    ULONG           BytesPerSector;
} FILE_FS_SIZE_INFORMATION, *PFILE_FS_SIZE_INFORMATION;

typedef struct _FILE_FS_VOLUME_INFORMATION {
    LARGE_INTEGER   VolumeCreationTime;
    ULONG           VolumeSerialNumber;
    ULONG           VolumeLabelLength;
    BOOLEAN         SupportsObjects;
    WCHAR           VolumeLabel[1];
} FILE_FS_VOLUME_INFORMATION, *PFILE_FS_VOLUME_INFORMATION;

typedef struct _FILE_FULL_DIR_INFORMATION {
    ULONG           NextEntryOffset;
    ULONG           FileIndex;
    LARGE_INTEGER   CreationTime;
    LARGE_INTEGER   LastAccessTime;
    LARGE_INTEGER   LastWriteTime;
    LARGE_INTEGER   ChangeTime;
    LARGE_INTEGER   EndOfFile;
    LARGE_INTEGER   AllocationSize;
    ULONG           FileAttributes;
    ULONG           FileNameLength;
    ULONG           EaSize;
    WCHAR           FileName[1];
} FILE_FULL_DIR_INFORMATION, *PFILE_FULL_DIR_INFORMATION;

typedef struct _FILE_GET_EA_INFORMATION {
    ULONG   NextEntryOffset;
    UCHAR   EaNameLength;
    CHAR    EaName[1];
} FILE_GET_EA_INFORMATION, *PFILE_GET_EA_INFORMATION;

typedef struct _FILE_GET_QUOTA_INFORMATION {
    ULONG   NextEntryOffset;
    ULONG   SidLength;
    SID     Sid;
} FILE_GET_QUOTA_INFORMATION, *PFILE_GET_QUOTA_INFORMATION;

typedef struct _FILE_INTERNAL_INFORMATION {
    LARGE_INTEGER IndexNumber;
} FILE_INTERNAL_INFORMATION, *PFILE_INTERNAL_INFORMATION;

typedef struct _FILE_LINK_INFORMATION {
    BOOLEAN ReplaceIfExists;
    HANDLE  RootDirectory;
    ULONG   FileNameLength;
    WCHAR   FileName[1];
} FILE_LINK_INFORMATION, *PFILE_LINK_INFORMATION;

typedef struct _FILE_LOCK_INFO {
    LARGE_INTEGER   StartingByte;
    LARGE_INTEGER   Length;
    BOOLEAN         ExclusiveLock;
    ULONG           Key;
    PFILE_OBJECT    FileObject;
    PEPROCESS       Process;
    LARGE_INTEGER   EndingByte;
} FILE_LOCK_INFO, *PFILE_LOCK_INFO;

/* raw internal file lock struct returned from FsRtlGetNextFileLock */
typedef struct _FILE_SHARED_LOCK_ENTRY {
    PVOID           Unknown1;
    PVOID           Unknown2;
    FILE_LOCK_INFO  FileLock;
} FILE_SHARED_LOCK_ENTRY, *PFILE_SHARED_LOCK_ENTRY;

/* raw internal file lock struct returned from FsRtlGetNextFileLock */
typedef struct _FILE_EXCLUSIVE_LOCK_ENTRY {
    LIST_ENTRY      ListEntry;
    PVOID           Unknown1;
    PVOID           Unknown2;
    FILE_LOCK_INFO  FileLock;
} FILE_EXCLUSIVE_LOCK_ENTRY, *PFILE_EXCLUSIVE_LOCK_ENTRY;

typedef NTSTATUS (*PCOMPLETE_LOCK_IRP_ROUTINE) (
  /*IN*/ PVOID    Context,
  /*IN*/ PIRP     Irp
);

typedef VOID (NTAPI *PUNLOCK_ROUTINE) (
  /*IN*/ PVOID            Context,
  /*IN*/ PFILE_LOCK_INFO  FileLockInfo
);

typedef struct _FILE_LOCK {
    PCOMPLETE_LOCK_IRP_ROUTINE  CompleteLockIrpRoutine;
    PUNLOCK_ROUTINE             UnlockRoutine;
    BOOLEAN                     FastIoIsQuestionable;
    BOOLEAN                     Pad[3];
    PVOID                       LockInformation;
    FILE_LOCK_INFO              LastReturnedLockInfo;
    PVOID                       LastReturnedLock;
} FILE_LOCK, *PFILE_LOCK;

typedef struct _FILE_MAILSLOT_PEEK_BUFFER {
    ULONG ReadDataAvailable;
    ULONG NumberOfMessages;
    ULONG MessageLength;
} FILE_MAILSLOT_PEEK_BUFFER, *PFILE_MAILSLOT_PEEK_BUFFER;

typedef struct _FILE_MAILSLOT_QUERY_INFORMATION {
    ULONG           MaximumMessageSize;
    ULONG           MailslotQuota;
    ULONG           NextMessageSize;
    ULONG           MessagesAvailable;
    LARGE_INTEGER   ReadTimeout;
} FILE_MAILSLOT_QUERY_INFORMATION, *PFILE_MAILSLOT_QUERY_INFORMATION;

typedef struct _FILE_MAILSLOT_SET_INFORMATION {
    LARGE_INTEGER ReadTimeout;
} FILE_MAILSLOT_SET_INFORMATION, *PFILE_MAILSLOT_SET_INFORMATION;

typedef struct _FILE_MODE_INFORMATION {
    ULONG Mode;
} FILE_MODE_INFORMATION, *PFILE_MODE_INFORMATION;

typedef struct _FILE_ALL_INFORMATION {
    FILE_BASIC_INFORMATION      BasicInformation;
    FILE_STANDARD_INFORMATION   StandardInformation;
    FILE_INTERNAL_INFORMATION   InternalInformation;
    FILE_EA_INFORMATION         EaInformation;
    FILE_ACCESS_INFORMATION     AccessInformation;
    FILE_POSITION_INFORMATION   PositionInformation;
    FILE_MODE_INFORMATION       ModeInformation;
    FILE_ALIGNMENT_INFORMATION  AlignmentInformation;
    FILE_NAME_INFORMATION       NameInformation;
} FILE_ALL_INFORMATION, *PFILE_ALL_INFORMATION;

typedef struct _FILE_NAMES_INFORMATION {
    ULONG NextEntryOffset;
    ULONG FileIndex;
    ULONG FileNameLength;
    WCHAR FileName[1];
} FILE_NAMES_INFORMATION, *PFILE_NAMES_INFORMATION;

typedef struct _FILE_OBJECTID_INFORMATION {
    LONGLONG        FileReference;
    UCHAR           ObjectId[16];
    _ANONYMOUS_UNION union {
        struct {
            UCHAR   BirthVolumeId[16];
            UCHAR   BirthObjectId[16];
            UCHAR   DomainId[16];
        } ;
        UCHAR       ExtendedInfo[48];
    } DUMMYUNIONNAME;
} FILE_OBJECTID_INFORMATION, *PFILE_OBJECTID_INFORMATION;

typedef struct _FILE_OLE_CLASSID_INFORMATION {
    GUID ClassId;
} FILE_OLE_CLASSID_INFORMATION, *PFILE_OLE_CLASSID_INFORMATION;

typedef struct _FILE_OLE_ALL_INFORMATION {
    FILE_BASIC_INFORMATION          BasicInformation;
    FILE_STANDARD_INFORMATION       StandardInformation;
    FILE_INTERNAL_INFORMATION       InternalInformation;
    FILE_EA_INFORMATION             EaInformation;
    FILE_ACCESS_INFORMATION         AccessInformation;
    FILE_POSITION_INFORMATION       PositionInformation;
    FILE_MODE_INFORMATION           ModeInformation;
    FILE_ALIGNMENT_INFORMATION      AlignmentInformation;
    USN                             LastChangeUsn;
    USN                             ReplicationUsn;
    LARGE_INTEGER                   SecurityChangeTime;
    FILE_OLE_CLASSID_INFORMATION    OleClassIdInformation;
    FILE_OBJECTID_INFORMATION       ObjectIdInformation;
    FILE_STORAGE_TYPE               StorageType;
    ULONG                           OleStateBits;
    ULONG                           OleId;
    ULONG                           NumberOfStreamReferences;
    ULONG                           StreamIndex;
    ULONG                           SecurityId;
    BOOLEAN                         ContentIndexDisable;
    BOOLEAN                         InheritContentIndexDisable;
    FILE_NAME_INFORMATION           NameInformation;
} FILE_OLE_ALL_INFORMATION, *PFILE_OLE_ALL_INFORMATION;

typedef struct _FILE_OLE_DIR_INFORMATION {
    ULONG               NextEntryOffset;
    ULONG               FileIndex;
    LARGE_INTEGER       CreationTime;
    LARGE_INTEGER       LastAccessTime;
    LARGE_INTEGER       LastWriteTime;
    LARGE_INTEGER       ChangeTime;
    LARGE_INTEGER       EndOfFile;
    LARGE_INTEGER       AllocationSize;
    ULONG               FileAttributes;
    ULONG               FileNameLength;
    FILE_STORAGE_TYPE   StorageType;
    GUID                OleClassId;
    ULONG               OleStateBits;
    BOOLEAN             ContentIndexDisable;
    BOOLEAN             InheritContentIndexDisable;
    WCHAR               FileName[1];
} FILE_OLE_DIR_INFORMATION, *PFILE_OLE_DIR_INFORMATION;

typedef struct _FILE_OLE_INFORMATION {
    LARGE_INTEGER                   SecurityChangeTime;
    FILE_OLE_CLASSID_INFORMATION    OleClassIdInformation;
    FILE_OBJECTID_INFORMATION       ObjectIdInformation;
    FILE_STORAGE_TYPE               StorageType;
    ULONG                           OleStateBits;
    BOOLEAN                         ContentIndexDisable;
    BOOLEAN                         InheritContentIndexDisable;
} FILE_OLE_INFORMATION, *PFILE_OLE_INFORMATION;

typedef struct _FILE_OLE_STATE_BITS_INFORMATION {
    ULONG StateBits;
    ULONG StateBitsMask;
} FILE_OLE_STATE_BITS_INFORMATION, *PFILE_OLE_STATE_BITS_INFORMATION;

typedef struct _FILE_PIPE_ASSIGN_EVENT_BUFFER {
    HANDLE  EventHandle;
    ULONG   KeyValue;
} FILE_PIPE_ASSIGN_EVENT_BUFFER, *PFILE_PIPE_ASSIGN_EVENT_BUFFER;

typedef struct _FILE_PIPE_CLIENT_PROCESS_BUFFER {
    PVOID ClientSession;
    PVOID ClientProcess;
} FILE_PIPE_CLIENT_PROCESS_BUFFER, *PFILE_PIPE_CLIENT_PROCESS_BUFFER;

typedef struct _FILE_PIPE_EVENT_BUFFER {
    ULONG NamedPipeState;
    ULONG EntryType;
    ULONG ByteCount;
    ULONG KeyValue;
    ULONG NumberRequests;
} FILE_PIPE_EVENT_BUFFER, *PFILE_PIPE_EVENT_BUFFER;

typedef struct _FILE_PIPE_INFORMATION {
    ULONG ReadMode;
    ULONG CompletionMode;
} FILE_PIPE_INFORMATION, *PFILE_PIPE_INFORMATION;

typedef struct _FILE_PIPE_LOCAL_INFORMATION {
    ULONG NamedPipeType;
    ULONG NamedPipeConfiguration;
    ULONG MaximumInstances;
    ULONG CurrentInstances;
    ULONG InboundQuota;
    ULONG ReadDataAvailable;
    ULONG OutboundQuota;
    ULONG WriteQuotaAvailable;
    ULONG NamedPipeState;
    ULONG NamedPipeEnd;
} FILE_PIPE_LOCAL_INFORMATION, *PFILE_PIPE_LOCAL_INFORMATION;

typedef struct _FILE_PIPE_REMOTE_INFORMATION {
    LARGE_INTEGER   CollectDataTime;
    ULONG           MaximumCollectionCount;
} FILE_PIPE_REMOTE_INFORMATION, *PFILE_PIPE_REMOTE_INFORMATION;

typedef struct _FILE_PIPE_WAIT_FOR_BUFFER {
    LARGE_INTEGER   Timeout;
    ULONG           NameLength;
    BOOLEAN         TimeoutSpecified;
    WCHAR           Name[1];
} FILE_PIPE_WAIT_FOR_BUFFER, *PFILE_PIPE_WAIT_FOR_BUFFER;

typedef struct _FILE_QUOTA_INFORMATION {
    ULONG           NextEntryOffset;
    ULONG           SidLength;
    LARGE_INTEGER   ChangeTime;
    LARGE_INTEGER   QuotaUsed;
    LARGE_INTEGER   QuotaThreshold;
    LARGE_INTEGER   QuotaLimit;
    SID             Sid;
} FILE_QUOTA_INFORMATION, *PFILE_QUOTA_INFORMATION;

typedef struct _FILE_RENAME_INFORMATION {
    BOOLEAN ReplaceIfExists;
    HANDLE  RootDirectory;
    ULONG   FileNameLength;
    WCHAR   FileName[1];
} FILE_RENAME_INFORMATION, *PFILE_RENAME_INFORMATION;

typedef struct _FILE_STREAM_INFORMATION {
    ULONG           NextEntryOffset;
    ULONG           StreamNameLength;
    LARGE_INTEGER   StreamSize;
    LARGE_INTEGER   StreamAllocationSize;
    WCHAR           StreamName[1];
} FILE_STREAM_INFORMATION, *PFILE_STREAM_INFORMATION;

typedef struct _FILE_TRACKING_INFORMATION {
    HANDLE  DestinationFile;
    ULONG   ObjectInformationLength;
    CHAR    ObjectInformation[1];
} FILE_TRACKING_INFORMATION, *PFILE_TRACKING_INFORMATION;

typedef struct _FSRTL_COMMON_FCB_HEADER {
    CSHORT          NodeTypeCode;
    CSHORT          NodeByteSize;
    UCHAR           Flags;
    UCHAR           IsFastIoPossible;
#if (VER_PRODUCTBUILD >= 1381)
    UCHAR           Flags2;
    UCHAR           Reserved;
#endif /* (VER_PRODUCTBUILD >= 1381) */
    PERESOURCE      Resource;
    PERESOURCE      PagingIoResource;
    LARGE_INTEGER   AllocationSize;
    LARGE_INTEGER   FileSize;
    LARGE_INTEGER   ValidDataLength;
} FSRTL_COMMON_FCB_HEADER, *PFSRTL_COMMON_FCB_HEADER;

typedef struct _GENERATE_NAME_CONTEXT {
    USHORT  Checksum;
    BOOLEAN CheckSumInserted;
    UCHAR   NameLength;
    WCHAR   NameBuffer[8];
    ULONG   ExtensionLength;
    WCHAR   ExtensionBuffer[4];
    ULONG   LastIndexValue;
} GENERATE_NAME_CONTEXT, *PGENERATE_NAME_CONTEXT;

typedef struct _HANDLE_TABLE_ENTRY {
    PVOID   Object;
    ULONG   ObjectAttributes;
    ULONG   GrantedAccess;
    USHORT  GrantedAccessIndex;
    USHORT  CreatorBackTraceIndex;
    ULONG   NextFreeTableEntry;
} HANDLE_TABLE_ENTRY, *PHANDLE_TABLE_ENTRY;

typedef struct _MAPPING_PAIR {
    ULONGLONG Vcn;
    ULONGLONG Lcn;
} MAPPING_PAIR, *PMAPPING_PAIR;

typedef struct _GET_RETRIEVAL_DESCRIPTOR {
    ULONG           NumberOfPairs;
    ULONGLONG       StartVcn;
    MAPPING_PAIR    Pair[1];
} GET_RETRIEVAL_DESCRIPTOR, *PGET_RETRIEVAL_DESCRIPTOR;

typedef struct _IO_CLIENT_EXTENSION {
    struct _IO_CLIENT_EXTENSION *NextExtension;
    PVOID                       ClientIdentificationAddress;
} IO_CLIENT_EXTENSION, *PIO_CLIENT_EXTENSION;

typedef struct _IO_COMPLETION_BASIC_INFORMATION {
    LONG Depth;
} IO_COMPLETION_BASIC_INFORMATION, *PIO_COMPLETION_BASIC_INFORMATION;

typedef struct _KEVENT_PAIR {
    USHORT Type;
    USHORT Size;
    KEVENT Event1;
    KEVENT Event2;
} KEVENT_PAIR, *PKEVENT_PAIR;

typedef struct _KQUEUE {
    DISPATCHER_HEADER   Header;
    LIST_ENTRY          EntryListHead;
    ULONG               CurrentCount;
    ULONG               MaximumCount;
    LIST_ENTRY          ThreadListHead;
} KQUEUE, *PKQUEUE, *RESTRICTED_POINTER PRKQUEUE;

typedef struct _MAILSLOT_CREATE_PARAMETERS {
    ULONG           MailslotQuota;
    ULONG           MaximumMessageSize;
    LARGE_INTEGER   ReadTimeout;
    BOOLEAN         TimeoutSpecified;
} MAILSLOT_CREATE_PARAMETERS, *PMAILSLOT_CREATE_PARAMETERS;

typedef struct _MBCB {
    CSHORT          NodeTypeCode;
    CSHORT          NodeIsInZone;
    ULONG           PagesToWrite;
    ULONG           DirtyPages;
    ULONG           Reserved;
    LIST_ENTRY      BitmapRanges;
    LONGLONG        ResumeWritePage;
    BITMAP_RANGE    BitmapRange1;
    BITMAP_RANGE    BitmapRange2;
    BITMAP_RANGE    BitmapRange3;
} MBCB, *PMBCB;

typedef struct _MOVEFILE_DESCRIPTOR {
     HANDLE         FileHandle;
     ULONG          Reserved;
     LARGE_INTEGER  StartVcn;
     LARGE_INTEGER  TargetLcn;
     ULONG          NumVcns;
     ULONG          Reserved1;
} MOVEFILE_DESCRIPTOR, *PMOVEFILE_DESCRIPTOR;

typedef struct _NAMED_PIPE_CREATE_PARAMETERS {
    ULONG           NamedPipeType;
    ULONG           ReadMode;
    ULONG           CompletionMode;
    ULONG           MaximumInstances;
    ULONG           InboundQuota;
    ULONG           OutboundQuota;
    LARGE_INTEGER   DefaultTimeout;
    BOOLEAN         TimeoutSpecified;
} NAMED_PIPE_CREATE_PARAMETERS, *PNAMED_PIPE_CREATE_PARAMETERS;

typedef struct _OBJECT_BASIC_INFO {
    ULONG           Attributes;
    ACCESS_MASK     GrantedAccess;
    ULONG           HandleCount;
    ULONG           ReferenceCount;
    ULONG           PagedPoolUsage;
    ULONG           NonPagedPoolUsage;
    ULONG           Reserved[3];
    ULONG           NameInformationLength;
    ULONG           TypeInformationLength;
    ULONG           SecurityDescriptorLength;
    LARGE_INTEGER   CreateTime;
} OBJECT_BASIC_INFO, *POBJECT_BASIC_INFO;

typedef struct _OBJECT_HANDLE_ATTRIBUTE_INFO {
    BOOLEAN Inherit;
    BOOLEAN ProtectFromClose;
} OBJECT_HANDLE_ATTRIBUTE_INFO, *POBJECT_HANDLE_ATTRIBUTE_INFO;

typedef struct _OBJECT_NAME_INFO {
    UNICODE_STRING  ObjectName;
    WCHAR           ObjectNameBuffer[1];
} OBJECT_NAME_INFO, *POBJECT_NAME_INFO;

typedef struct _OBJECT_PROTECTION_INFO {
    BOOLEAN Inherit;
    BOOLEAN ProtectHandle;
} OBJECT_PROTECTION_INFO, *POBJECT_PROTECTION_INFO;

typedef struct _OBJECT_TYPE_INFO {
    UNICODE_STRING  ObjectTypeName;
    UCHAR           Unknown[0x58];
    WCHAR           ObjectTypeNameBuffer[1];
} OBJECT_TYPE_INFO, *POBJECT_TYPE_INFO;

typedef struct _OBJECT_ALL_TYPES_INFO {
    ULONG               NumberOfObjectTypes;
    OBJECT_TYPE_INFO    ObjectsTypeInfo[1];
} OBJECT_ALL_TYPES_INFO, *POBJECT_ALL_TYPES_INFO;

typedef struct _PAGEFAULT_HISTORY {
    ULONG                           CurrentIndex;
    ULONG                           MaxIndex;
    KSPIN_LOCK                      SpinLock;
    PVOID                           Reserved;
    PROCESS_WS_WATCH_INFORMATION    WatchInfo[1];
} PAGEFAULT_HISTORY, *PPAGEFAULT_HISTORY;

typedef struct _PATHNAME_BUFFER {
    ULONG PathNameLength;
    WCHAR Name[1];
} PATHNAME_BUFFER, *PPATHNAME_BUFFER;

#if (VER_PRODUCTBUILD >= 2600)

typedef struct _PRIVATE_CACHE_MAP_FLAGS {
    ULONG DontUse           : 16;
    ULONG ReadAheadActive   : 1;
    ULONG ReadAheadEnabled  : 1;
    ULONG Available         : 14;
} PRIVATE_CACHE_MAP_FLAGS, *PPRIVATE_CACHE_MAP_FLAGS;

typedef struct _PRIVATE_CACHE_MAP {
    _ANONYMOUS_UNION union {
        CSHORT                  NodeTypeCode;
        PRIVATE_CACHE_MAP_FLAGS Flags;
        ULONG                   UlongFlags;
    } DUMMYUNIONNAME;
    ULONG                       ReadAheadMask;
    PFILE_OBJECT                FileObject;
    LARGE_INTEGER               FileOffset1;
    LARGE_INTEGER               BeyondLastByte1;
    LARGE_INTEGER               FileOffset2;
    LARGE_INTEGER               BeyondLastByte2;
    LARGE_INTEGER               ReadAheadOffset[2];
    ULONG                       ReadAheadLength[2];
    KSPIN_LOCK                  ReadAheadSpinLock;
    LIST_ENTRY                  PrivateLinks;
} PRIVATE_CACHE_MAP, *PPRIVATE_CACHE_MAP;

#endif

typedef struct _PS_IMPERSONATION_INFORMATION {
    PACCESS_TOKEN                   Token;
    BOOLEAN                         CopyOnOpen;
    BOOLEAN                         EffectiveOnly;
    SECURITY_IMPERSONATION_LEVEL    ImpersonationLevel;
} PS_IMPERSONATION_INFORMATION, *PPS_IMPERSONATION_INFORMATION;

typedef struct _PUBLIC_BCB {
    CSHORT          NodeTypeCode;
    CSHORT          NodeByteSize;
    ULONG           MappedLength;
    LARGE_INTEGER   MappedFileOffset;
} PUBLIC_BCB, *PPUBLIC_BCB;

typedef struct _QUERY_PATH_REQUEST {
    ULONG                   PathNameLength;
    PIO_SECURITY_CONTEXT    SecurityContext;
    WCHAR                   FilePathName[1];
} QUERY_PATH_REQUEST, *PQUERY_PATH_REQUEST;

typedef struct _QUERY_PATH_RESPONSE {
    ULONG LengthAccepted;
} QUERY_PATH_RESPONSE, *PQUERY_PATH_RESPONSE;

typedef struct _RETRIEVAL_POINTERS_BUFFER {
    ULONG               ExtentCount;
    LARGE_INTEGER       StartingVcn;
    struct {
        LARGE_INTEGER   NextVcn;
        LARGE_INTEGER   Lcn;
    } Extents[1];
} RETRIEVAL_POINTERS_BUFFER, *PRETRIEVAL_POINTERS_BUFFER;

typedef struct _RTL_SPLAY_LINKS {
    struct _RTL_SPLAY_LINKS *Parent;
    struct _RTL_SPLAY_LINKS *LeftChild;
    struct _RTL_SPLAY_LINKS *RightChild;
} RTL_SPLAY_LINKS, *PRTL_SPLAY_LINKS;

typedef struct _SE_EXPORTS {

    LUID    SeCreateTokenPrivilege;
    LUID    SeAssignPrimaryTokenPrivilege;
    LUID    SeLockMemoryPrivilege;
    LUID    SeIncreaseQuotaPrivilege;
    LUID    SeUnsolicitedInputPrivilege;
    LUID    SeTcbPrivilege;
    LUID    SeSecurityPrivilege;
    LUID    SeTakeOwnershipPrivilege;
    LUID    SeLoadDriverPrivilege;
    LUID    SeCreatePagefilePrivilege;
    LUID    SeIncreaseBasePriorityPrivilege;
    LUID    SeSystemProfilePrivilege;
    LUID    SeSystemtimePrivilege;
    LUID    SeProfileSingleProcessPrivilege;
    LUID    SeCreatePermanentPrivilege;
    LUID    SeBackupPrivilege;
    LUID    SeRestorePrivilege;
    LUID    SeShutdownPrivilege;
    LUID    SeDebugPrivilege;
    LUID    SeAuditPrivilege;
    LUID    SeSystemEnvironmentPrivilege;
    LUID    SeChangeNotifyPrivilege;
    LUID    SeRemoteShutdownPrivilege;

    PSID    SeNullSid;
    PSID    SeWorldSid;
    PSID    SeLocalSid;
    PSID    SeCreatorOwnerSid;
    PSID    SeCreatorGroupSid;

    PSID    SeNtAuthoritySid;
    PSID    SeDialupSid;
    PSID    SeNetworkSid;
    PSID    SeBatchSid;
    PSID    SeInteractiveSid;
    PSID    SeLocalSystemSid;
    PSID    SeAliasAdminsSid;
    PSID    SeAliasUsersSid;
    PSID    SeAliasGuestsSid;
    PSID    SeAliasPowerUsersSid;
    PSID    SeAliasAccountOpsSid;
    PSID    SeAliasSystemOpsSid;
    PSID    SeAliasPrintOpsSid;
    PSID    SeAliasBackupOpsSid;

    PSID    SeAuthenticatedUsersSid;

    PSID    SeRestrictedSid;
    PSID    SeAnonymousLogonSid;

    LUID    SeUndockPrivilege;
    LUID    SeSyncAgentPrivilege;
    LUID    SeEnableDelegationPrivilege;

} SE_EXPORTS, *PSE_EXPORTS;

typedef struct _SECTION_BASIC_INFORMATION {
    PVOID           BaseAddress;
    ULONG           Attributes;
    LARGE_INTEGER   Size;
} SECTION_BASIC_INFORMATION, *PSECTION_BASIC_INFORMATION;

typedef struct _SECTION_IMAGE_INFORMATION {
    PVOID   EntryPoint;
    ULONG   Unknown1;
    ULONG   StackReserve;
    ULONG   StackCommit;
    ULONG   Subsystem;
    USHORT  MinorSubsystemVersion;
    USHORT  MajorSubsystemVersion;
    ULONG   Unknown2;
    ULONG   Characteristics;
    USHORT  ImageNumber;
    BOOLEAN Executable;
    UCHAR   Unknown3;
    ULONG   Unknown4[3];
} SECTION_IMAGE_INFORMATION, *PSECTION_IMAGE_INFORMATION;

#if (VER_PRODUCTBUILD >= 2600)

typedef struct _SHARED_CACHE_MAP {
    CSHORT                      NodeTypeCode;
    CSHORT                      NodeByteSize;
    ULONG                       OpenCount;
    LARGE_INTEGER               FileSize;
    LIST_ENTRY                  BcbList;
    LARGE_INTEGER               SectionSize;
    LARGE_INTEGER               ValidDataLength;
    LARGE_INTEGER               ValidDataGoal;
    PVACB                       InitialVacbs[4];
    PVACB                       *Vacbs;
    PFILE_OBJECT                FileObject;
    PVACB                       ActiveVacb;
    PVOID                       NeedToZero;
    ULONG                       ActivePage;
    ULONG                       NeedToZeroPage;
    KSPIN_LOCK                  ActiveVacbSpinLock;
    ULONG                       VacbActiveCount;
    ULONG                       DirtyPages;
    LIST_ENTRY                  SharedCacheMapLinks;
    ULONG                       Flags;
    NTSTATUS                    Status;
    PMBCB                       Mbcb;
    PVOID                       Section;
    PKEVENT                     CreateEvent;
    PKEVENT                     WaitOnActiveCount;
    ULONG                       PagesToWrite;
    LONGLONG                    BeyondLastFlush;
    PCACHE_MANAGER_CALLBACKS    Callbacks;
    PVOID                       LazyWriteContext;
    LIST_ENTRY                  PrivateList;
    PVOID                       LogHandle;
    PVOID                       FlushToLsnRoutine;
    ULONG                       DirtyPageThreshold;
    ULONG                       LazyWritePassCount;
    PCACHE_UNINITIALIZE_EVENT   UninitializeEvent;
    PVACB                       NeedToZeroVacb;
    KSPIN_LOCK                  BcbSpinLock;
    PVOID                       Reserved;
    KEVENT                      Event;
    EX_PUSH_LOCK                VacbPushLock;
    PRIVATE_CACHE_MAP           PrivateCacheMap;
} SHARED_CACHE_MAP, *PSHARED_CACHE_MAP;

#endif

typedef struct _STARTING_VCN_INPUT_BUFFER {
    LARGE_INTEGER StartingVcn;
} STARTING_VCN_INPUT_BUFFER, *PSTARTING_VCN_INPUT_BUFFER;

typedef struct _SYSTEM_CACHE_INFORMATION {
    ULONG CurrentSize;
    ULONG PeakSize;
    ULONG PageFaultCount;
    ULONG MinimumWorkingSet;
    ULONG MaximumWorkingSet;
    ULONG Unused[4];
} SYSTEM_CACHE_INFORMATION, *PSYSTEM_CACHE_INFORMATION;

typedef struct _TERMINATION_PORT {
    struct _TERMINATION_PORT*   Next;
    PVOID                       Port;
} TERMINATION_PORT, *PTERMINATION_PORT;

typedef struct _SECURITY_CLIENT_CONTEXT {
    SECURITY_QUALITY_OF_SERVICE SecurityQos;
    PACCESS_TOKEN               ClientToken;
    BOOLEAN                     DirectlyAccessClientToken;
    BOOLEAN                     DirectAccessEffectiveOnly;
    BOOLEAN                     ServerIsRemote;
    TOKEN_CONTROL               ClientTokenControl;
} SECURITY_CLIENT_CONTEXT, *PSECURITY_CLIENT_CONTEXT;

typedef struct _TUNNEL {
    FAST_MUTEX          Mutex;
    PRTL_SPLAY_LINKS    Cache;
    LIST_ENTRY          TimerQueue;
    USHORT              NumEntries;
} TUNNEL, *PTUNNEL;

typedef struct _VACB {
    PVOID               BaseAddress;
    PSHARED_CACHE_MAP   SharedCacheMap;
    union {
        LARGE_INTEGER   FileOffset;
        USHORT          ActiveCount;
    } Overlay;
    LIST_ENTRY          LruList;
} VACB, *PVACB;

typedef struct _VAD_HEADER {
    PVOID       StartVPN;
    PVOID       EndVPN;
    PVAD_HEADER ParentLink;
    PVAD_HEADER LeftLink;
    PVAD_HEADER RightLink;
    ULONG       Flags;          /* LSB = CommitCharge */
    PVOID       ControlArea;
    PVOID       FirstProtoPte;
    PVOID       LastPTE;
    ULONG       Unknown;
    LIST_ENTRY  Secured;
} VAD_HEADER, *PVAD_HEADER;

NTKERNELAPI
BOOLEAN
NTAPI
CcCanIWrite (
  /*IN*/ PFILE_OBJECT FileObject,
  /*IN*/ ULONG        BytesToWrite,
  /*IN*/ BOOLEAN      Wait,
  /*IN*/ BOOLEAN      Retrying
);

NTKERNELAPI
BOOLEAN
NTAPI
CcCopyRead (
  /*IN*/ PFILE_OBJECT         FileObject,
  /*IN*/ PLARGE_INTEGER       FileOffset,
  /*IN*/ ULONG                Length,
  /*IN*/ BOOLEAN              Wait,
  /*OUT*/ PVOID               Buffer,
  /*OUT*/ PIO_STATUS_BLOCK    IoStatus
);

NTKERNELAPI
BOOLEAN
NTAPI
CcCopyWrite (
  /*IN*/ PFILE_OBJECT     FileObject,
  /*IN*/ PLARGE_INTEGER   FileOffset,
  /*IN*/ ULONG            Length,
  /*IN*/ BOOLEAN          Wait,
  /*IN*/ PVOID            Buffer
);

#define CcCopyWriteWontFlush(FO, FOFF, LEN) ((LEN) <= 0x10000)

typedef VOID (NTAPI *PCC_POST_DEFERRED_WRITE) (
  /*IN*/ PVOID Context1,
  /*IN*/ PVOID Context2
);

NTKERNELAPI
VOID
NTAPI
CcDeferWrite (
  /*IN*/ PFILE_OBJECT             FileObject,
  /*IN*/ PCC_POST_DEFERRED_WRITE  PostRoutine,
  /*IN*/ PVOID                    Context1,
  /*IN*/ PVOID                    Context2,
  /*IN*/ ULONG                    BytesToWrite,
  /*IN*/ BOOLEAN                  Retrying
);

NTKERNELAPI
VOID
NTAPI
CcFastCopyRead (
  /*IN*/ PFILE_OBJECT         FileObject,
  /*IN*/ ULONG                FileOffset,
  /*IN*/ ULONG                Length,
  /*IN*/ ULONG                PageCount,
  /*OUT*/ PVOID               Buffer,
  /*OUT*/ PIO_STATUS_BLOCK    IoStatus
);

NTKERNELAPI
VOID
NTAPI
CcFastCopyWrite (
  /*IN*/ PFILE_OBJECT FileObject,
  /*IN*/ ULONG        FileOffset,
  /*IN*/ ULONG        Length,
  /*IN*/ PVOID        Buffer
);

NTKERNELAPI
VOID
NTAPI
CcFlushCache (
  /*IN*/ PSECTION_OBJECT_POINTERS SectionObjectPointer,
  /*IN*/ PLARGE_INTEGER           FileOffset /*OPTIONAL*/,
  /*IN*/ ULONG                    Length,
  /*OUT*/ PIO_STATUS_BLOCK        IoStatus /*OPTIONAL*/
);

typedef VOID (*PDIRTY_PAGE_ROUTINE) (
  /*IN*/ PFILE_OBJECT     FileObject,
  /*IN*/ PLARGE_INTEGER   FileOffset,
  /*IN*/ ULONG            Length,
  /*IN*/ PLARGE_INTEGER   OldestLsn,
  /*IN*/ PLARGE_INTEGER   NewestLsn,
  /*IN*/ PVOID            Context1,
  /*IN*/ PVOID            Context2
);

NTKERNELAPI
LARGE_INTEGER
NTAPI
CcGetDirtyPages (
  /*IN*/ PVOID                LogHandle,
  /*IN*/ PDIRTY_PAGE_ROUTINE  DirtyPageRoutine,
  /*IN*/ PVOID                Context1,
  /*IN*/ PVOID                Context2
);

NTKERNELAPI
PFILE_OBJECT
NTAPI
CcGetFileObjectFromBcb (
  /*IN*/ PVOID Bcb
);

NTKERNELAPI
PFILE_OBJECT
NTAPI
CcGetFileObjectFromSectionPtrs (
  /*IN*/ PSECTION_OBJECT_POINTERS SectionObjectPointer
);

#define CcGetFileSizePointer(FO) (                                     \
    ((PLARGE_INTEGER)((FO)->SectionObjectPointer->SharedCacheMap) + 1) \
)

#if (VER_PRODUCTBUILD >= 2195)

NTKERNELAPI
LARGE_INTEGER
NTAPI
CcGetFlushedValidData (
  /*IN*/ PSECTION_OBJECT_POINTERS SectionObjectPointer,
  /*IN*/ BOOLEAN                  BcbListHeld
);

#endif /* (VER_PRODUCTBUILD >= 2195) */

NTKERNELAPI
LARGE_INTEGER
CcGetLsnForFileObject (
  /*IN*/ PFILE_OBJECT     FileObject,
  /*OUT*/ PLARGE_INTEGER  OldestLsn /*OPTIONAL*/
);

typedef BOOLEAN (NTAPI *PACQUIRE_FOR_LAZY_WRITE) (
  /*IN*/ PVOID    Context,
  /*IN*/ BOOLEAN  Wait
);

typedef VOID (NTAPI *PRELEASE_FROM_LAZY_WRITE) (
  /*IN*/ PVOID Context
);

typedef BOOLEAN (NTAPI *PACQUIRE_FOR_READ_AHEAD) (
  /*IN*/ PVOID    Context,
  /*IN*/ BOOLEAN  Wait
);

typedef VOID (NTAPI *PRELEASE_FROM_READ_AHEAD) (
  /*IN*/ PVOID Context
);

typedef struct _CACHE_MANAGER_CALLBACKS {
    PACQUIRE_FOR_LAZY_WRITE     AcquireForLazyWrite;
    PRELEASE_FROM_LAZY_WRITE    ReleaseFromLazyWrite;
    PACQUIRE_FOR_READ_AHEAD     AcquireForReadAhead;
    PRELEASE_FROM_READ_AHEAD    ReleaseFromReadAhead;
} CACHE_MANAGER_CALLBACKS, *PCACHE_MANAGER_CALLBACKS;

NTKERNELAPI
VOID
NTAPI
CcInitializeCacheMap (
  /*IN*/ PFILE_OBJECT             FileObject,
  /*IN*/ PCC_FILE_SIZES           FileSizes,
  /*IN*/ BOOLEAN                  PinAccess,
  /*IN*/ PCACHE_MANAGER_CALLBACKS Callbacks,
  /*IN*/ PVOID                    LazyWriteContext
);

#define CcIsFileCached(FO) (                                                         \
    ((FO)->SectionObjectPointer != NULL) &&                                          \
    (((PSECTION_OBJECT_POINTERS)(FO)->SectionObjectPointer)->SharedCacheMap != NULL) \
)

NTKERNELAPI
BOOLEAN
NTAPI
CcIsThereDirtyData (
  /*IN*/ PVPB Vpb
);

NTKERNELAPI
BOOLEAN
NTAPI
CcMapData (
  /*IN*/ PFILE_OBJECT     FileObject,
  /*IN*/ PLARGE_INTEGER   FileOffset,
  /*IN*/ ULONG            Length,
  /*IN*/ BOOLEAN          Wait,
  /*OUT*/ PVOID           *Bcb,
  /*OUT*/ PVOID           *Buffer
);

NTKERNELAPI
VOID
NTAPI
CcMdlRead (
  /*IN*/ PFILE_OBJECT         FileObject,
  /*IN*/ PLARGE_INTEGER       FileOffset,
  /*IN*/ ULONG                Length,
  /*OUT*/ PMDL                *MdlChain,
  /*OUT*/ PIO_STATUS_BLOCK    IoStatus
);

NTKERNELAPI
VOID
NTAPI
CcMdlReadComplete (
  /*IN*/ PFILE_OBJECT FileObject,
  /*IN*/ PMDL         MdlChain
);

NTKERNELAPI
VOID
NTAPI
CcMdlWriteComplete (
  /*IN*/ PFILE_OBJECT     FileObject,
  /*IN*/ PLARGE_INTEGER   FileOffset,
  /*IN*/ PMDL             MdlChain
);

NTKERNELAPI
BOOLEAN
NTAPI
CcPinMappedData (
  /*IN*/ PFILE_OBJECT     FileObject,
  /*IN*/ PLARGE_INTEGER   FileOffset,
  /*IN*/ ULONG            Length,
#if (VER_PRODUCTBUILD >= 2195)
  /*IN*/ ULONG            Flags,
#else
  /*IN*/ BOOLEAN          Wait,
#endif
  /*IN OUT*/ PVOID        *Bcb
);

NTKERNELAPI
BOOLEAN
NTAPI
CcPinRead (
  /*IN*/ PFILE_OBJECT     FileObject,
  /*IN*/ PLARGE_INTEGER   FileOffset,
  /*IN*/ ULONG            Length,
#if (VER_PRODUCTBUILD >= 2195)
  /*IN*/ ULONG            Flags,
#else
  /*IN*/ BOOLEAN          Wait,
#endif
  /*OUT*/ PVOID           *Bcb,
  /*OUT*/ PVOID           *Buffer
);

NTKERNELAPI
VOID
NTAPI
CcPrepareMdlWrite (
  /*IN*/ PFILE_OBJECT         FileObject,
  /*IN*/ PLARGE_INTEGER       FileOffset,
  /*IN*/ ULONG                Length,
  /*OUT*/ PMDL                *MdlChain,
  /*OUT*/ PIO_STATUS_BLOCK    IoStatus
);

NTKERNELAPI
BOOLEAN
NTAPI
CcPreparePinWrite (
  /*IN*/ PFILE_OBJECT     FileObject,
  /*IN*/ PLARGE_INTEGER   FileOffset,
  /*IN*/ ULONG            Length,
  /*IN*/ BOOLEAN          Zero,
#if (VER_PRODUCTBUILD >= 2195)
  /*IN*/ ULONG            Flags,
#else
  /*IN*/ BOOLEAN          Wait,
#endif
  /*OUT*/ PVOID           *Bcb,
  /*OUT*/ PVOID           *Buffer
);

NTKERNELAPI
BOOLEAN
NTAPI
CcPurgeCacheSection (
  /*IN*/ PSECTION_OBJECT_POINTERS SectionObjectPointer,
  /*IN*/ PLARGE_INTEGER           FileOffset /*OPTIONAL*/,
  /*IN*/ ULONG                    Length,
  /*IN*/ BOOLEAN                  UninitializeCacheMaps
);

#define CcReadAhead(FO, FOFF, LEN) (                \
    if ((LEN) >= 256) {                             \
        CcScheduleReadAhead((FO), (FOFF), (LEN));   \
    }                                               \
)

#if (VER_PRODUCTBUILD >= 2195)

NTKERNELAPI
PVOID
NTAPI
CcRemapBcb (
  /*IN*/ PVOID Bcb
);

#endif /* (VER_PRODUCTBUILD >= 2195) */

NTKERNELAPI
VOID
NTAPI
CcRepinBcb (
  /*IN*/ PVOID Bcb
);

NTKERNELAPI
VOID
NTAPI
CcScheduleReadAhead (
  /*IN*/ PFILE_OBJECT     FileObject,
  /*IN*/ PLARGE_INTEGER   FileOffset,
  /*IN*/ ULONG            Length
);

NTKERNELAPI
VOID
NTAPI
CcSetAdditionalCacheAttributes (
  /*IN*/ PFILE_OBJECT FileObject,
  /*IN*/ BOOLEAN      DisableReadAhead,
  /*IN*/ BOOLEAN      DisableWriteBehind
);

NTKERNELAPI
VOID
NTAPI
CcSetBcbOwnerPointer (
  /*IN*/ PVOID Bcb,
  /*IN*/ PVOID OwnerPointer
);

NTKERNELAPI
VOID
NTAPI
CcSetDirtyPageThreshold (
  /*IN*/ PFILE_OBJECT FileObject,
  /*IN*/ ULONG        DirtyPageThreshold
);

NTKERNELAPI
VOID
NTAPI
CcSetDirtyPinnedData (
  /*IN*/ PVOID            BcbVoid,
  /*IN*/ PLARGE_INTEGER   Lsn /*OPTIONAL*/
);

NTKERNELAPI
VOID
NTAPI
CcSetFileSizes (
  /*IN*/ PFILE_OBJECT     FileObject,
  /*IN*/ PCC_FILE_SIZES   FileSizes
);

typedef VOID (NTAPI *PFLUSH_TO_LSN) (
  /*IN*/ PVOID            LogHandle,
  /*IN*/ PLARGE_INTEGER   Lsn
);

NTKERNELAPI
VOID
NTAPI
CcSetLogHandleForFile (
  /*IN*/ PFILE_OBJECT     FileObject,
  /*IN*/ PVOID            LogHandle,
  /*IN*/ PFLUSH_TO_LSN    FlushToLsnRoutine
);

NTKERNELAPI
VOID
NTAPI
CcSetReadAheadGranularity (
  /*IN*/ PFILE_OBJECT FileObject,
  /*IN*/ ULONG        Granularity     /* default: PAGE_SIZE */
                                    /* allowed: 2^n * PAGE_SIZE */
);

NTKERNELAPI
BOOLEAN
NTAPI
CcUninitializeCacheMap (
  /*IN*/ PFILE_OBJECT                 FileObject,
  /*IN*/ PLARGE_INTEGER               TruncateSize /*OPTIONAL*/,
  /*IN*/ PCACHE_UNINITIALIZE_EVENT    UninitializeCompleteEvent /*OPTIONAL*/
);

NTKERNELAPI
VOID
NTAPI
CcUnpinData (
  /*IN*/ PVOID Bcb
);

NTKERNELAPI
VOID
NTAPI
CcUnpinDataForThread (
  /*IN*/ PVOID            Bcb,
  /*IN*/ ERESOURCE_THREAD ResourceThreadId
);

NTKERNELAPI
VOID
NTAPI
CcUnpinRepinnedBcb (
  /*IN*/ PVOID                Bcb,
  /*IN*/ BOOLEAN              WriteThrough,
  /*OUT*/ PIO_STATUS_BLOCK    IoStatus
);

#if (VER_PRODUCTBUILD >= 2195)

NTKERNELAPI
NTSTATUS
NTAPI
CcWaitForCurrentLazyWriterActivity (
    VOID
);

#endif /* (VER_PRODUCTBUILD >= 2195) */

NTKERNELAPI
BOOLEAN
NTAPI
CcZeroData (
  /*IN*/ PFILE_OBJECT     FileObject,
  /*IN*/ PLARGE_INTEGER   StartOffset,
  /*IN*/ PLARGE_INTEGER   EndOffset,
  /*IN*/ BOOLEAN          Wait
);

NTKERNELAPI
VOID
NTAPI
ExDisableResourceBoostLite (
  /*IN*/ PERESOURCE Resource
);

NTKERNELAPI
ULONG
NTAPI
ExQueryPoolBlockSize (
  /*IN*/ PVOID        PoolBlock,
  /*OUT*/ PBOOLEAN    QuotaCharged
);

#define FlagOn(x, f) ((x) & (f))

NTKERNELAPI
VOID
NTAPI
FsRtlAddToTunnelCache (
  /*IN*/ PTUNNEL          Cache,
  /*IN*/ ULONGLONG        DirectoryKey,
  /*IN*/ PUNICODE_STRING  ShortName,
  /*IN*/ PUNICODE_STRING  LongName,
  /*IN*/ BOOLEAN          KeyByShortName,
  /*IN*/ ULONG            DataLength,
  /*IN*/ PVOID            Data
);

#if (VER_PRODUCTBUILD >= 2195)

PFILE_LOCK
NTAPI
FsRtlAllocateFileLock (
  /*IN*/ PCOMPLETE_LOCK_IRP_ROUTINE   CompleteLockIrpRoutine /*OPTIONAL*/,
  /*IN*/ PUNLOCK_ROUTINE              UnlockRoutine /*OPTIONAL*/
);

#endif /* (VER_PRODUCTBUILD >= 2195) */

NTKERNELAPI
PVOID
NTAPI
FsRtlAllocatePool (
  /*IN*/ POOL_TYPE    PoolType,
  /*IN*/ ULONG        NumberOfBytes
);

NTKERNELAPI
PVOID
NTAPI
FsRtlAllocatePoolWithQuota (
  /*IN*/ POOL_TYPE    PoolType,
  /*IN*/ ULONG        NumberOfBytes
);

NTKERNELAPI
PVOID
NTAPI
FsRtlAllocatePoolWithQuotaTag (
  /*IN*/ POOL_TYPE    PoolType,
  /*IN*/ ULONG        NumberOfBytes,
  /*IN*/ ULONG        Tag
);

NTKERNELAPI
PVOID
NTAPI
FsRtlAllocatePoolWithTag (
  /*IN*/ POOL_TYPE    PoolType,
  /*IN*/ ULONG        NumberOfBytes,
  /*IN*/ ULONG        Tag
);

NTKERNELAPI
BOOLEAN
NTAPI
FsRtlAreNamesEqual (
  /*IN*/ PUNICODE_STRING  Name1,
  /*IN*/ PUNICODE_STRING  Name2,
  /*IN*/ BOOLEAN          IgnoreCase,
  /*IN*/ PWCHAR           UpcaseTable /*OPTIONAL*/
);

#define FsRtlAreThereCurrentFileLocks(FL) ( \
    ((FL)->FastIoIsQuestionable)            \
)

/*
  FsRtlCheckLockForReadAccess:

  All this really does is pick out the lock parameters from the irp (io stack
  location?), get IoGetRequestorProcess, and pass values on to
  FsRtlFastCheckLockForRead.
*/
NTKERNELAPI
BOOLEAN
NTAPI
FsRtlCheckLockForReadAccess (
  /*IN*/ PFILE_LOCK   FileLock,
  /*IN*/ PIRP         Irp
);

/*
  FsRtlCheckLockForWriteAccess:

  All this really does is pick out the lock parameters from the irp (io stack
  location?), get IoGetRequestorProcess, and pass values on to
  FsRtlFastCheckLockForWrite.
*/
NTKERNELAPI
BOOLEAN
NTAPI
FsRtlCheckLockForWriteAccess (
  /*IN*/ PFILE_LOCK   FileLock,
  /*IN*/ PIRP         Irp
);

typedef
VOID NTAPI
(*POPLOCK_WAIT_COMPLETE_ROUTINE) (
  /*IN*/ PVOID    Context,
  /*IN*/ PIRP     Irp
);

typedef
VOID NTAPI
(*POPLOCK_FS_PREPOST_IRP) (
  /*IN*/ PVOID    Context,
  /*IN*/ PIRP     Irp
);

NTKERNELAPI
NTSTATUS
NTAPI
FsRtlCheckOplock (
  /*IN*/ POPLOCK                          Oplock,
  /*IN*/ PIRP                             Irp,
  /*IN*/ PVOID                            Context,
  /*IN*/ POPLOCK_WAIT_COMPLETE_ROUTINE    CompletionRoutine /*OPTIONAL*/,
  /*IN*/ POPLOCK_FS_PREPOST_IRP           PostIrpRoutine /*OPTIONAL*/
);

NTKERNELAPI
BOOLEAN
NTAPI
FsRtlCopyRead (
  /*IN*/ PFILE_OBJECT         FileObject,
  /*IN*/ PLARGE_INTEGER       FileOffset,
  /*IN*/ ULONG                Length,
  /*IN*/ BOOLEAN              Wait,
  /*IN*/ ULONG                LockKey,
  /*OUT*/ PVOID               Buffer,
  /*OUT*/ PIO_STATUS_BLOCK    IoStatus,
  /*IN*/ PDEVICE_OBJECT       DeviceObject
);

NTKERNELAPI
BOOLEAN
NTAPI
FsRtlCopyWrite (
  /*IN*/ PFILE_OBJECT         FileObject,
  /*IN*/ PLARGE_INTEGER       FileOffset,
  /*IN*/ ULONG                Length,
  /*IN*/ BOOLEAN              Wait,
  /*IN*/ ULONG                LockKey,
  /*IN*/ PVOID                Buffer,
  /*OUT*/ PIO_STATUS_BLOCK    IoStatus,
  /*IN*/ PDEVICE_OBJECT       DeviceObject
);

NTKERNELAPI
BOOLEAN
NTAPI
FsRtlCurrentBatchOplock (
  /*IN*/ POPLOCK Oplock
);

NTKERNELAPI
VOID
NTAPI
FsRtlDeleteKeyFromTunnelCache (
  /*IN*/ PTUNNEL      Cache,
  /*IN*/ ULONGLONG    DirectoryKey
);

NTKERNELAPI
VOID
NTAPI
FsRtlDeleteTunnelCache (
  /*IN*/ PTUNNEL Cache
);

NTKERNELAPI
VOID
NTAPI
FsRtlDeregisterUncProvider (
  /*IN*/ HANDLE Handle
);

NTKERNELAPI
BOOLEAN
NTAPI
FsRtlDoesNameContainWildCards (
  /*IN*/ PUNICODE_STRING Name
);

#define FsRtlEnterFileSystem    KeEnterCriticalRegion

#define FsRtlExitFileSystem     KeLeaveCriticalRegion

NTKERNELAPI
BOOLEAN
NTAPI
FsRtlFastCheckLockForRead (
  /*IN*/ PFILE_LOCK           FileLock,
  /*IN*/ PLARGE_INTEGER       FileOffset,
  /*IN*/ PLARGE_INTEGER       Length,
  /*IN*/ ULONG                Key,
  /*IN*/ PFILE_OBJECT         FileObject,
  /*IN*/ PEPROCESS            Process
);

NTKERNELAPI
BOOLEAN
NTAPI
FsRtlFastCheckLockForWrite (
  /*IN*/ PFILE_LOCK           FileLock,
  /*IN*/ PLARGE_INTEGER       FileOffset,
  /*IN*/ PLARGE_INTEGER       Length,
  /*IN*/ ULONG                Key,
  /*IN*/ PFILE_OBJECT         FileObject,
  /*IN*/ PEPROCESS            Process
);

#define FsRtlFastLock(A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11) (       \
     FsRtlPrivateLock(A1, A2, A3, A4, A5, A6, A7, A8, A9, NULL, A10, A11)   \
)

NTKERNELAPI
NTSTATUS
NTAPI
FsRtlFastUnlockAll (
  /*IN*/ PFILE_LOCK           FileLock,
  /*IN*/ PFILE_OBJECT         FileObject,
  /*IN*/ PEPROCESS            Process,
  /*IN*/ PVOID                Context /*OPTIONAL*/
);
/* ret: STATUS_RANGE_NOT_LOCKED */

NTKERNELAPI
NTSTATUS
NTAPI
FsRtlFastUnlockAllByKey (
  /*IN*/ PFILE_LOCK           FileLock,
  /*IN*/ PFILE_OBJECT         FileObject,
  /*IN*/ PEPROCESS            Process,
  /*IN*/ ULONG                Key,
  /*IN*/ PVOID                Context /*OPTIONAL*/
);
/* ret: STATUS_RANGE_NOT_LOCKED */

NTKERNELAPI
NTSTATUS
NTAPI
FsRtlFastUnlockSingle (
  /*IN*/ PFILE_LOCK           FileLock,
  /*IN*/ PFILE_OBJECT         FileObject,
  /*IN*/ PLARGE_INTEGER       FileOffset,
  /*IN*/ PLARGE_INTEGER       Length,
  /*IN*/ PEPROCESS            Process,
  /*IN*/ ULONG                Key,
  /*IN*/ PVOID                Context /*OPTIONAL*/,
  /*IN*/ BOOLEAN              AlreadySynchronized
);
/* ret:  STATUS_RANGE_NOT_LOCKED */

NTKERNELAPI
BOOLEAN
NTAPI
FsRtlFindInTunnelCache (
  /*IN*/ PTUNNEL          Cache,
  /*IN*/ ULONGLONG        DirectoryKey,
  /*IN*/ PUNICODE_STRING  Name,
  /*OUT*/ PUNICODE_STRING ShortName,
  /*OUT*/ PUNICODE_STRING LongName,
  /*IN OUT*/ PULONG       DataLength,
  /*OUT*/ PVOID           Data
);

#if (VER_PRODUCTBUILD >= 2195)

NTKERNELAPI
VOID
NTAPI
FsRtlFreeFileLock (
  /*IN*/ PFILE_LOCK FileLock
);

#endif /* (VER_PRODUCTBUILD >= 2195) */

NTKERNELAPI
NTSTATUS
NTAPI
FsRtlGetFileSize (
  /*IN*/ PFILE_OBJECT         FileObject,
  /*IN OUT*/ PLARGE_INTEGER   FileSize
);

/*
  FsRtlGetNextFileLock:

  ret: NULL if no more locks

  Internals:
    FsRtlGetNextFileLock uses FileLock->LastReturnedLockInfo and
    FileLock->LastReturnedLock as storage.
    LastReturnedLock is a pointer to the 'raw' lock inkl. double linked
    list, and FsRtlGetNextFileLock needs this to get next lock on subsequent
    calls with Restart = FALSE.
*/
NTKERNELAPI
PFILE_LOCK_INFO
NTAPI
FsRtlGetNextFileLock (
  /*IN*/ PFILE_LOCK   FileLock,
  /*IN*/ BOOLEAN      Restart
);

NTKERNELAPI
VOID
NTAPI
FsRtlInitializeFileLock (
  /*IN*/ PFILE_LOCK                   FileLock,
  /*IN*/ PCOMPLETE_LOCK_IRP_ROUTINE   CompleteLockIrpRoutine /*OPTIONAL*/,
  /*IN*/ PUNLOCK_ROUTINE              UnlockRoutine /*OPTIONAL*/
);

NTKERNELAPI
VOID
NTAPI
FsRtlInitializeOplock (
  /*IN OUT*/ POPLOCK Oplock
);

NTKERNELAPI
VOID
NTAPI
FsRtlInitializeTunnelCache (
  /*IN*/ PTUNNEL Cache
);

NTKERNELAPI
BOOLEAN
NTAPI
FsRtlIsNameInExpression (
  /*IN*/ PUNICODE_STRING  Expression,
  /*IN*/ PUNICODE_STRING  Name,
  /*IN*/ BOOLEAN          IgnoreCase,
  /*IN*/ PWCHAR           UpcaseTable /*OPTIONAL*/
);

NTKERNELAPI
BOOLEAN
NTAPI
FsRtlIsNtstatusExpected (
  /*IN*/ NTSTATUS Ntstatus
);

#define FsRtlIsUnicodeCharacterWild(C) (                                    \
    (((C) >= 0x40) ?                                                        \
    FALSE :                                                                 \
    FlagOn((*FsRtlLegalAnsiCharacterArray)[(C)], FSRTL_WILD_CHARACTER ))    \
)

NTKERNELAPI
BOOLEAN
NTAPI
FsRtlMdlReadComplete (
  /*IN*/ PFILE_OBJECT     FileObject,
  /*IN*/ PMDL             MdlChain
);

NTKERNELAPI
BOOLEAN
NTAPI
FsRtlMdlReadCompleteDev (
  /*IN*/ PFILE_OBJECT     FileObject,
  /*IN*/ PMDL             MdlChain,
  /*IN*/ PDEVICE_OBJECT   DeviceObject
);

NTKERNELAPI
BOOLEAN
NTAPI
FsRtlMdlWriteComplete (
  /*IN*/ PFILE_OBJECT     FileObject,
  /*IN*/ PLARGE_INTEGER   FileOffset,
  /*IN*/ PMDL             MdlChain
);

NTKERNELAPI
BOOLEAN
NTAPI
FsRtlMdlWriteCompleteDev (
  /*IN*/ PFILE_OBJECT     FileObject,
  /*IN*/ PLARGE_INTEGER   FileOffset,
  /*IN*/ PMDL             MdlChain,
  /*IN*/ PDEVICE_OBJECT   DeviceObject
);

NTKERNELAPI
NTSTATUS
NTAPI
FsRtlNormalizeNtstatus (
  /*IN*/ NTSTATUS Exception,
  /*IN*/ NTSTATUS GenericException
);

NTKERNELAPI
VOID
NTAPI
FsRtlNotifyChangeDirectory (
  /*IN*/ PNOTIFY_SYNC NotifySync,
  /*IN*/ PVOID        FsContext,
  /*IN*/ PSTRING      FullDirectoryName,
  /*IN*/ PLIST_ENTRY  NotifyList,
  /*IN*/ BOOLEAN      WatchTree,
  /*IN*/ ULONG        CompletionFilter,
  /*IN*/ PIRP         NotifyIrp
);

NTKERNELAPI
VOID
NTAPI
FsRtlNotifyCleanup (
  /*IN*/ PNOTIFY_SYNC NotifySync,
  /*IN*/ PLIST_ENTRY  NotifyList,
  /*IN*/ PVOID        FsContext
);

typedef BOOLEAN (*PCHECK_FOR_TRAVERSE_ACCESS) (
  /*IN*/ PVOID                        NotifyContext,
  /*IN*/ PVOID                        TargetContext,
  /*IN*/ PSECURITY_SUBJECT_CONTEXT    SubjectContext
);

NTKERNELAPI
VOID
NTAPI
FsRtlNotifyFullChangeDirectory (
  /*IN*/ PNOTIFY_SYNC                 NotifySync,
  /*IN*/ PLIST_ENTRY                  NotifyList,
  /*IN*/ PVOID                        FsContext,
  /*IN*/ PSTRING                      FullDirectoryName,
  /*IN*/ BOOLEAN                      WatchTree,
  /*IN*/ BOOLEAN                      IgnoreBuffer,
  /*IN*/ ULONG                        CompletionFilter,
  /*IN*/ PIRP                         NotifyIrp,
  /*IN*/ PCHECK_FOR_TRAVERSE_ACCESS   TraverseCallback /*OPTIONAL*/,
  /*IN*/ PSECURITY_SUBJECT_CONTEXT    SubjectContext /*OPTIONAL*/
);

NTKERNELAPI
VOID
NTAPI
FsRtlNotifyFullReportChange (
  /*IN*/ PNOTIFY_SYNC NotifySync,
  /*IN*/ PLIST_ENTRY  NotifyList,
  /*IN*/ PSTRING      FullTargetName,
  /*IN*/ USHORT       TargetNameOffset,
  /*IN*/ PSTRING      StreamName /*OPTIONAL*/,
  /*IN*/ PSTRING      NormalizedParentName /*OPTIONAL*/,
  /*IN*/ ULONG        FilterMatch,
  /*IN*/ ULONG        Action,
  /*IN*/ PVOID        TargetContext
);

NTKERNELAPI
VOID
NTAPI
FsRtlNotifyInitializeSync (
  /*IN*/ PNOTIFY_SYNC NotifySync
);

NTKERNELAPI
VOID
NTAPI
FsRtlNotifyReportChange (
  /*IN*/ PNOTIFY_SYNC NotifySync,
  /*IN*/ PLIST_ENTRY  NotifyList,
  /*IN*/ PSTRING      FullTargetName,
  /*IN*/ PUSHORT      FileNamePartLength,
  /*IN*/ ULONG        FilterMatch
);

NTKERNELAPI
VOID
NTAPI
FsRtlNotifyUninitializeSync (
  /*IN*/ PNOTIFY_SYNC NotifySync
);

#if (VER_PRODUCTBUILD >= 2195)

NTKERNELAPI
NTSTATUS
NTAPI
FsRtlNotifyVolumeEvent (
  /*IN*/ PFILE_OBJECT FileObject,
  /*IN*/ ULONG        EventCode
);

#endif /* (VER_PRODUCTBUILD >= 2195) */

NTKERNELAPI
NTSTATUS
NTAPI
FsRtlOplockFsctrl (
  /*IN*/ POPLOCK  Oplock,
  /*IN*/ PIRP     Irp,
  /*IN*/ ULONG    OpenCount
);

NTKERNELAPI
BOOLEAN
NTAPI
FsRtlOplockIsFastIoPossible (
  /*IN*/ POPLOCK Oplock
);

/*
  FsRtlPrivateLock:

  ret: IoStatus->Status: STATUS_PENDING, STATUS_LOCK_NOT_GRANTED

  Internals:
    -Calls IoCompleteRequest if Irp
    -Uses exception handling / ExRaiseStatus with STATUS_INSUFFICIENT_RESOURCES
*/
NTKERNELAPI
BOOLEAN
NTAPI
FsRtlPrivateLock (
  /*IN*/ PFILE_LOCK           FileLock,
  /*IN*/ PFILE_OBJECT         FileObject,
  /*IN*/ PLARGE_INTEGER       FileOffset,
  /*IN*/ PLARGE_INTEGER       Length,
  /*IN*/ PEPROCESS            Process,
  /*IN*/ ULONG                Key,
  /*IN*/ BOOLEAN              FailImmediately,
  /*IN*/ BOOLEAN              ExclusiveLock,
  /*OUT*/ PIO_STATUS_BLOCK    IoStatus,
  /*IN*/ PIRP                 Irp /*OPTIONAL*/,
  /*IN*/ PVOID                Context,
  /*IN*/ BOOLEAN              AlreadySynchronized
);

/*
  FsRtlProcessFileLock:

  ret:
    -STATUS_INVALID_DEVICE_REQUEST
    -STATUS_RANGE_NOT_LOCKED from unlock routines.
    -STATUS_PENDING, STATUS_LOCK_NOT_GRANTED from FsRtlPrivateLock
    (redirected IoStatus->Status).

  Internals:
    -switch ( Irp->CurrentStackLocation->MinorFunction )
        lock: return FsRtlPrivateLock;
        unlocksingle: return FsRtlFastUnlockSingle;
        unlockall: return FsRtlFastUnlockAll;
        unlockallbykey: return FsRtlFastUnlockAllByKey;
        default: IofCompleteRequest with STATUS_INVALID_DEVICE_REQUEST;
                 return STATUS_INVALID_DEVICE_REQUEST;

    -'AllwaysZero' is passed thru as 'AllwaysZero' to lock / unlock routines.
    -'Irp' is passet thru as 'Irp' to FsRtlPrivateLock.
*/
NTKERNELAPI
NTSTATUS
NTAPI
FsRtlProcessFileLock (
  /*IN*/ PFILE_LOCK   FileLock,
  /*IN*/ PIRP         Irp,
  /*IN*/ PVOID        Context /*OPTIONAL*/
);

NTKERNELAPI
NTSTATUS
NTAPI
FsRtlRegisterUncProvider (
  /*IN OUT*/ PHANDLE      MupHandle,
  /*IN*/ PUNICODE_STRING  RedirectorDeviceName,
  /*IN*/ BOOLEAN          MailslotsSupported
);

NTKERNELAPI
VOID
NTAPI
FsRtlUninitializeFileLock (
  /*IN*/ PFILE_LOCK FileLock
);

NTKERNELAPI
VOID
NTAPI
FsRtlUninitializeOplock (
  /*IN OUT*/ POPLOCK Oplock
);

NTSYSAPI
VOID
NTAPI
HalDisplayString (
  /*IN*/ PCHAR String
);

NTSYSAPI
VOID
NTAPI
HalQueryRealTimeClock (
  /*IN OUT*/ PTIME_FIELDS TimeFields
);

NTSYSAPI
VOID
NTAPI
HalSetRealTimeClock (
  /*IN*/ PTIME_FIELDS TimeFields
);

#define InitializeMessageHeader(m, l, t) {                  \
    (m)->Length = (USHORT)(l);                              \
    (m)->DataLength = (USHORT)(l - sizeof( LPC_MESSAGE ));  \
    (m)->MessageType = (USHORT)(t);                         \
    (m)->DataInfoOffset = 0;                                \
}

NTKERNELAPI
VOID
NTAPI
IoAcquireVpbSpinLock (
  /*OUT*/ PKIRQL Irql
);

NTKERNELAPI
NTSTATUS
NTAPI
IoCheckDesiredAccess (
  /*IN OUT*/ PACCESS_MASK DesiredAccess,
  /*IN*/ ACCESS_MASK      GrantedAccess
);

NTKERNELAPI
NTSTATUS
NTAPI
IoCheckEaBufferValidity (
  /*IN*/ PFILE_FULL_EA_INFORMATION    EaBuffer,
  /*IN*/ ULONG                        EaLength,
  /*OUT*/ PULONG                      ErrorOffset
);

NTKERNELAPI
NTSTATUS
NTAPI
IoCheckFunctionAccess (
  /*IN*/ ACCESS_MASK              GrantedAccess,
  /*IN*/ UCHAR                    MajorFunction,
  /*IN*/ UCHAR                    MinorFunction,
  /*IN*/ ULONG                    IoControlCode,
  /*IN*/ PFILE_INFORMATION_CLASS  FileInformationClass /*OPTIONAL*/,
  /*IN*/ PFS_INFORMATION_CLASS    FsInformationClass /*OPTIONAL*/
);

#if (VER_PRODUCTBUILD >= 2195)

NTKERNELAPI
NTSTATUS
NTAPI
IoCheckQuotaBufferValidity (
  /*IN*/ PFILE_QUOTA_INFORMATION  QuotaBuffer,
  /*IN*/ ULONG                    QuotaLength,
  /*OUT*/ PULONG                  ErrorOffset
);

#endif /* (VER_PRODUCTBUILD >= 2195) */

NTKERNELAPI
PFILE_OBJECT
NTAPI
IoCreateStreamFileObject (
  /*IN*/ PFILE_OBJECT     FileObject /*OPTIONAL*/,
  /*IN*/ PDEVICE_OBJECT   DeviceObject /*OPTIONAL*/
);

#if (VER_PRODUCTBUILD >= 2195)

NTKERNELAPI
PFILE_OBJECT
NTAPI
IoCreateStreamFileObjectLite (
  /*IN*/ PFILE_OBJECT     FileObject /*OPTIONAL*/,
  /*IN*/ PDEVICE_OBJECT   DeviceObject /*OPTIONAL*/
);

#endif /* (VER_PRODUCTBUILD >= 2195) */

NTKERNELAPI
BOOLEAN
NTAPI
IoFastQueryNetworkAttributes (
  /*IN*/ POBJECT_ATTRIBUTES               ObjectAttributes,
  /*IN*/ ACCESS_MASK                      DesiredAccess,
  /*IN*/ ULONG                            OpenOptions,
  /*OUT*/ PIO_STATUS_BLOCK                IoStatus,
  /*OUT*/ PFILE_NETWORK_OPEN_INFORMATION  Buffer
);

NTKERNELAPI
PDEVICE_OBJECT
NTAPI
IoGetAttachedDevice (
  /*IN*/ PDEVICE_OBJECT DeviceObject
);

NTKERNELAPI
PDEVICE_OBJECT
NTAPI
IoGetBaseFileSystemDeviceObject (
  /*IN*/ PFILE_OBJECT FileObject
);

NTKERNELAPI
PEPROCESS
NTAPI
IoGetRequestorProcess (
  /*IN*/ PIRP Irp
);

#if (VER_PRODUCTBUILD >= 2195)

NTKERNELAPI
ULONG
NTAPI
IoGetRequestorProcessId (
  /*IN*/ PIRP Irp
);

#endif /* (VER_PRODUCTBUILD >= 2195) */

NTKERNELAPI
PIRP
NTAPI
IoGetTopLevelIrp (
    VOID
);

#define IoIsFileOpenedExclusively(FileObject) ( \
    (BOOLEAN) !(                                \
    (FileObject)->SharedRead ||                 \
    (FileObject)->SharedWrite ||                \
    (FileObject)->SharedDelete                  \
    )                                           \
)

NTKERNELAPI
BOOLEAN
NTAPI
IoIsOperationSynchronous (
  /*IN*/ PIRP Irp
);

NTKERNELAPI
BOOLEAN
NTAPI
IoIsSystemThread (
  /*IN*/ PETHREAD Thread
);

#if (VER_PRODUCTBUILD >= 2195)

NTKERNELAPI
BOOLEAN
NTAPI
IoIsValidNameGraftingBuffer (
  /*IN*/ PIRP                 Irp,
  /*IN*/ PREPARSE_DATA_BUFFER ReparseBuffer
);

#endif /* (VER_PRODUCTBUILD >= 2195) */

NTKERNELAPI
NTSTATUS
NTAPI
IoPageRead (
  /*IN*/ PFILE_OBJECT         FileObject,
  /*IN*/ PMDL                 Mdl,
  /*IN*/ PLARGE_INTEGER       Offset,
  /*IN*/ PKEVENT              Event,
  /*OUT*/ PIO_STATUS_BLOCK    IoStatusBlock
);

NTKERNELAPI
NTSTATUS
NTAPI
IoQueryFileInformation (
  /*IN*/ PFILE_OBJECT             FileObject,
  /*IN*/ FILE_INFORMATION_CLASS   FileInformationClass,
  /*IN*/ ULONG                    Length,
  /*OUT*/ PVOID                   FileInformation,
  /*OUT*/ PULONG                  ReturnedLength
);

NTKERNELAPI
NTSTATUS
NTAPI
IoQueryVolumeInformation (
  /*IN*/ PFILE_OBJECT         FileObject,
  /*IN*/ FS_INFORMATION_CLASS FsInformationClass,
  /*IN*/ ULONG                Length,
  /*OUT*/ PVOID               FsInformation,
  /*OUT*/ PULONG              ReturnedLength
);

NTKERNELAPI
VOID
NTAPI
IoRegisterFileSystem (
  /*IN OUT*/ PDEVICE_OBJECT DeviceObject
);

#if (VER_PRODUCTBUILD >= 1381)

typedef VOID (NTAPI *PDRIVER_FS_NOTIFICATION) (
  /*IN*/ PDEVICE_OBJECT DeviceObject,
  /*IN*/ BOOLEAN        DriverActive
);

NTKERNELAPI
NTSTATUS
NTAPI
IoRegisterFsRegistrationChange (
  /*IN*/ PDRIVER_OBJECT           DriverObject,
  /*IN*/ PDRIVER_FS_NOTIFICATION  DriverNotificationRoutine
);

#endif /* (VER_PRODUCTBUILD >= 1381) */

NTKERNELAPI
VOID
NTAPI
IoReleaseVpbSpinLock (
  /*IN*/ KIRQL Irql
);

NTKERNELAPI
VOID
NTAPI
IoSetDeviceToVerify (
  /*IN*/ PETHREAD         Thread,
  /*IN*/ PDEVICE_OBJECT   DeviceObject
);

NTKERNELAPI
NTSTATUS
NTAPI
IoSetInformation (
  /*IN*/ PFILE_OBJECT             FileObject,
  /*IN*/ FILE_INFORMATION_CLASS   FileInformationClass,
  /*IN*/ ULONG                    Length,
  /*IN*/ PVOID                    FileInformation
);

NTKERNELAPI
VOID
NTAPI
IoSetTopLevelIrp (
  /*IN*/ PIRP Irp
);

NTKERNELAPI
NTSTATUS
NTAPI
IoSynchronousPageWrite (
  /*IN*/ PFILE_OBJECT         FileObject,
  /*IN*/ PMDL                 Mdl,
  /*IN*/ PLARGE_INTEGER       FileOffset,
  /*IN*/ PKEVENT              Event,
  /*OUT*/ PIO_STATUS_BLOCK    IoStatusBlock
);

NTKERNELAPI
PEPROCESS
NTAPI
IoThreadToProcess (
  /*IN*/ PETHREAD Thread
);

NTKERNELAPI
VOID
NTAPI
IoUnregisterFileSystem (
  /*IN OUT*/ PDEVICE_OBJECT DeviceObject
);

#if (VER_PRODUCTBUILD >= 1381)

NTKERNELAPI
NTSTATUS
NTAPI
IoUnregisterFsRegistrationChange (
  /*IN*/ PDRIVER_OBJECT           DriverObject,
  /*IN*/ PDRIVER_FS_NOTIFICATION  DriverNotificationRoutine
);

#endif /* (VER_PRODUCTBUILD >= 1381) */

NTKERNELAPI
NTSTATUS
NTAPI
IoVerifyVolume (
  /*IN*/ PDEVICE_OBJECT   DeviceObject,
  /*IN*/ BOOLEAN          AllowRawMount
);

NTKERNELAPI
VOID
NTAPI
KeAttachProcess (
  /*IN*/ PEPROCESS Process
);

NTKERNELAPI
VOID
NTAPI
KeDetachProcess (
    VOID
);

NTKERNELAPI
VOID
NTAPI
KeInitializeQueue (
  /*IN*/ PRKQUEUE Queue,
  /*IN*/ ULONG    Count /*OPTIONAL*/
);

NTKERNELAPI
LONG
NTAPI
KeInsertHeadQueue (
  /*IN*/ PRKQUEUE     Queue,
  /*IN*/ PLIST_ENTRY  Entry
);

NTKERNELAPI
LONG
NTAPI
KeInsertQueue (
  /*IN*/ PRKQUEUE     Queue,
  /*IN*/ PLIST_ENTRY  Entry
);

NTKERNELAPI
BOOLEAN
NTAPI
KeInsertQueueApc (
  /*IN*/ PKAPC      Apc,
  /*IN*/ PVOID      SystemArgument1,
  /*IN*/ PVOID      SystemArgument2,
  /*IN*/ KPRIORITY  PriorityBoost
);

NTKERNELAPI
LONG
NTAPI
KeReadStateQueue (
  /*IN*/ PRKQUEUE Queue
);

NTKERNELAPI
PLIST_ENTRY
NTAPI
KeRemoveQueue (
  /*IN*/ PRKQUEUE         Queue,
  /*IN*/ KPROCESSOR_MODE  WaitMode,
  /*IN*/ PLARGE_INTEGER   Timeout /*OPTIONAL*/
);

NTKERNELAPI
PLIST_ENTRY
NTAPI
KeRundownQueue (
  /*IN*/ PRKQUEUE Queue
);

#if (VER_PRODUCTBUILD >= 2195)

NTKERNELAPI
VOID
NTAPI
KeStackAttachProcess (
  /*IN*/ PKPROCESS    Process,
  /*OUT*/ PKAPC_STATE ApcState
);

NTKERNELAPI
VOID
NTAPI
KeUnstackDetachProcess (
  /*IN*/ PKAPC_STATE ApcState
);

#endif /* (VER_PRODUCTBUILD >= 2195) */

NTKERNELAPI
BOOLEAN
NTAPI
MmCanFileBeTruncated (
  /*IN*/ PSECTION_OBJECT_POINTERS     SectionObjectPointer,
  /*IN*/ PLARGE_INTEGER               NewFileSize
);

NTKERNELAPI
BOOLEAN
NTAPI
MmFlushImageSection (
  /*IN*/ PSECTION_OBJECT_POINTERS     SectionObjectPointer,
  /*IN*/ MMFLUSH_TYPE                 FlushType
);

NTKERNELAPI
BOOLEAN
NTAPI
MmForceSectionClosed (
  /*IN*/ PSECTION_OBJECT_POINTERS SectionObjectPointer,
  /*IN*/ BOOLEAN                  DelayClose
);

#if (VER_PRODUCTBUILD >= 1381)

NTKERNELAPI
BOOLEAN
NTAPI
MmIsRecursiveIoFault (
    VOID
);

#else

#define MmIsRecursiveIoFault() (                            \
    (PsGetCurrentThread()->DisablePageFaultClustering) |    \
    (PsGetCurrentThread()->ForwardClusterOnly)              \
)

#endif

NTKERNELAPI
NTSTATUS
NTAPI
MmMapViewOfSection (
  /*IN*/ PVOID                SectionObject,
  /*IN*/ PEPROCESS            Process,
  /*IN OUT*/ PVOID            *BaseAddress,
  /*IN*/ ULONG                ZeroBits,
  /*IN*/ ULONG                CommitSize,
  /*IN OUT*/ PLARGE_INTEGER   SectionOffset /*OPTIONAL*/,
  /*IN OUT*/ PULONG           ViewSize,
  /*IN*/ SECTION_INHERIT      InheritDisposition,
  /*IN*/ ULONG                AllocationType,
  /*IN*/ ULONG                Protect
);

NTKERNELAPI
BOOLEAN
NTAPI
MmSetAddressRangeModified (
  /*IN*/ PVOID    Address,
  /*IN*/ ULONG    Length
);

NTKERNELAPI
NTSTATUS
NTAPI
ObCreateObject (
  /*IN*/ KPROCESSOR_MODE      ObjectAttributesAccessMode /*OPTIONAL*/,
  /*IN*/ POBJECT_TYPE         ObjectType,
  /*IN*/ POBJECT_ATTRIBUTES   ObjectAttributes /*OPTIONAL*/,
  /*IN*/ KPROCESSOR_MODE      AccessMode,
  /*IN OUT*/ PVOID            ParseContext /*OPTIONAL*/,
  /*IN*/ ULONG                ObjectSize,
  /*IN*/ ULONG                PagedPoolCharge /*OPTIONAL*/,
  /*IN*/ ULONG                NonPagedPoolCharge /*OPTIONAL*/,
  /*OUT*/ PVOID               *Object
);

NTKERNELAPI
ULONG
NTAPI
ObGetObjectPointerCount (
  /*IN*/ PVOID Object
);

NTKERNELAPI
NTSTATUS
NTAPI
ObInsertObject (
  /*IN*/ PVOID            Object,
  /*IN*/ PACCESS_STATE    PassedAccessState /*OPTIONAL*/,
  /*IN*/ ACCESS_MASK      DesiredAccess,
  /*IN*/ ULONG            AdditionalReferences,
  /*OUT*/ PVOID           *ReferencedObject /*OPTIONAL*/,
  /*OUT*/ PHANDLE         Handle
);

NTKERNELAPI
VOID
NTAPI
ObMakeTemporaryObject (
  /*IN*/ PVOID Object
);

NTKERNELAPI
NTSTATUS
NTAPI
ObOpenObjectByPointer (
  /*IN*/ PVOID            Object,
  /*IN*/ ULONG            HandleAttributes,
  /*IN*/ PACCESS_STATE    PassedAccessState /*OPTIONAL*/,
  /*IN*/ ACCESS_MASK      DesiredAccess /*OPTIONAL*/,
  /*IN*/ POBJECT_TYPE     ObjectType /*OPTIONAL*/,
  /*IN*/ KPROCESSOR_MODE  AccessMode,
  /*OUT*/ PHANDLE         Handle
);

NTKERNELAPI
NTSTATUS
NTAPI
ObQueryNameString (
  /*IN*/ PVOID                        Object,
  /*OUT*/ POBJECT_NAME_INFORMATION    ObjectNameInfo,
  /*IN*/ ULONG                        Length,
  /*OUT*/ PULONG                      ReturnLength
);

NTKERNELAPI
NTSTATUS
NTAPI
ObQueryObjectAuditingByHandle (
  /*IN*/ HANDLE       Handle,
  /*OUT*/ PBOOLEAN    GenerateOnClose
);

NTKERNELAPI
NTSTATUS
NTAPI
ObReferenceObjectByName (
  /*IN*/ PUNICODE_STRING  ObjectName,
  /*IN*/ ULONG            Attributes,
  /*IN*/ PACCESS_STATE    PassedAccessState /*OPTIONAL*/,
  /*IN*/ ACCESS_MASK      DesiredAccess /*OPTIONAL*/,
  /*IN*/ POBJECT_TYPE     ObjectType,
  /*IN*/ KPROCESSOR_MODE  AccessMode,
  /*IN OUT*/ PVOID        ParseContext /*OPTIONAL*/,
  /*OUT*/ PVOID           *Object
);

NTKERNELAPI
VOID
NTAPI
PsChargePoolQuota (
  /*IN*/ PEPROCESS    Process,
  /*IN*/ POOL_TYPE    PoolType,
  /*IN*/ ULONG        Amount
);

#define PsDereferenceImpersonationToken(T)  \
            {if (ARGUMENT_PRESENT(T)) {     \
                (ObDereferenceObject((T))); \
            } else {                        \
                ;                           \
            }                               \
}

#define PsDereferencePrimaryToken(T) (ObDereferenceObject((T)))

NTKERNELAPI
ULONGLONG
NTAPI
PsGetProcessExitTime (
    VOID
);

NTKERNELAPI
BOOLEAN
NTAPI
PsIsThreadTerminating (
  /*IN*/ PETHREAD Thread
);

NTKERNELAPI
NTSTATUS
NTAPI
PsLookupProcessByProcessId (
  /*IN*/ PVOID        ProcessId,
  /*OUT*/ PEPROCESS   *Process
);

NTKERNELAPI
NTSTATUS
NTAPI
PsLookupProcessThreadByCid (
  /*IN*/ PCLIENT_ID   Cid,
  /*OUT*/ PEPROCESS   *Process /*OPTIONAL*/,
  /*OUT*/ PETHREAD    *Thread
);

NTKERNELAPI
NTSTATUS
NTAPI
PsLookupThreadByThreadId (
  /*IN*/ PVOID        UniqueThreadId,
  /*OUT*/ PETHREAD    *Thread
);

NTKERNELAPI
PACCESS_TOKEN
NTAPI
PsReferenceImpersonationToken (
  /*IN*/ PETHREAD                         Thread,
  /*OUT*/ PBOOLEAN                        CopyOnUse,
  /*OUT*/ PBOOLEAN                        EffectiveOnly,
  /*OUT*/ PSECURITY_IMPERSONATION_LEVEL   Level
);

NTKERNELAPI
HANDLE
NTAPI
PsReferencePrimaryToken (
  /*IN*/ PEPROCESS Process
);

NTKERNELAPI
VOID
NTAPI
PsReturnPoolQuota (
  /*IN*/ PEPROCESS    Process,
  /*IN*/ POOL_TYPE    PoolType,
  /*IN*/ ULONG        Amount
);

NTKERNELAPI
VOID
NTAPI
PsRevertToSelf (
    VOID
);

NTSYSAPI
NTSTATUS
NTAPI
RtlAbsoluteToSelfRelativeSD (
  /*IN*/ PSECURITY_DESCRIPTOR     AbsoluteSecurityDescriptor,
  /*IN OUT*/ PSECURITY_DESCRIPTOR SelfRelativeSecurityDescriptor,
  /*IN*/ PULONG                   BufferLength
);

NTSYSAPI
PVOID
NTAPI
RtlAllocateHeap (
  /*IN*/ HANDLE  HeapHandle,
  /*IN*/ ULONG   Flags,
  /*IN*/ ULONG   Size
);

NTSYSAPI
NTSTATUS
NTAPI
RtlCompressBuffer (
  /*IN*/ USHORT   CompressionFormatAndEngine,
  /*IN*/ PUCHAR   UncompressedBuffer,
  /*IN*/ ULONG    UncompressedBufferSize,
  /*OUT*/ PUCHAR  CompressedBuffer,
  /*IN*/ ULONG    CompressedBufferSize,
  /*IN*/ ULONG    UncompressedChunkSize,
  /*OUT*/ PULONG  FinalCompressedSize,
  /*IN*/ PVOID    WorkSpace
);

NTSYSAPI
NTSTATUS
NTAPI
RtlCompressChunks (
  /*IN*/ PUCHAR                       UncompressedBuffer,
  /*IN*/ ULONG                        UncompressedBufferSize,
  /*OUT*/ PUCHAR                      CompressedBuffer,
  /*IN*/ ULONG                        CompressedBufferSize,
  /*IN OUT*/ PCOMPRESSED_DATA_INFO    CompressedDataInfo,
  /*IN*/ ULONG                        CompressedDataInfoLength,
  /*IN*/ PVOID                        WorkSpace
);

NTSYSAPI
NTSTATUS
NTAPI
RtlConvertSidToUnicodeString (
  /*OUT*/ PUNICODE_STRING DestinationString,
  /*IN*/ PSID             Sid,
  /*IN*/ BOOLEAN          AllocateDestinationString
);

NTSYSAPI
NTSTATUS
NTAPI
RtlCopySid (
  /*IN*/ ULONG   Length,
  /*IN*/ PSID    Destination,
  /*IN*/ PSID    Source
);

NTSYSAPI
NTSTATUS
NTAPI
RtlDecompressBuffer (
  /*IN*/ USHORT   CompressionFormat,
  /*OUT*/ PUCHAR  UncompressedBuffer,
  /*IN*/ ULONG    UncompressedBufferSize,
  /*IN*/ PUCHAR   CompressedBuffer,
  /*IN*/ ULONG    CompressedBufferSize,
  /*OUT*/ PULONG  FinalUncompressedSize
);

NTSYSAPI
NTSTATUS
NTAPI
RtlDecompressChunks (
  /*OUT*/ PUCHAR                  UncompressedBuffer,
  /*IN*/ ULONG                    UncompressedBufferSize,
  /*IN*/ PUCHAR                   CompressedBuffer,
  /*IN*/ ULONG                    CompressedBufferSize,
  /*IN*/ PUCHAR                   CompressedTail,
  /*IN*/ ULONG                    CompressedTailSize,
  /*IN*/ PCOMPRESSED_DATA_INFO    CompressedDataInfo
);

NTSYSAPI
NTSTATUS
NTAPI
RtlDecompressFragment (
  /*IN*/ USHORT   CompressionFormat,
  /*OUT*/ PUCHAR  UncompressedFragment,
  /*IN*/ ULONG    UncompressedFragmentSize,
  /*IN*/ PUCHAR   CompressedBuffer,
  /*IN*/ ULONG    CompressedBufferSize,
  /*IN*/ ULONG    FragmentOffset,
  /*OUT*/ PULONG  FinalUncompressedSize,
  /*IN*/ PVOID    WorkSpace
);

NTSYSAPI
NTSTATUS
NTAPI
RtlDescribeChunk (
  /*IN*/ USHORT       CompressionFormat,
  /*IN OUT*/ PUCHAR   *CompressedBuffer,
  /*IN*/ PUCHAR       EndOfCompressedBufferPlus1,
  /*OUT*/ PUCHAR      *ChunkBuffer,
  /*OUT*/ PULONG      ChunkSize
);

NTSYSAPI
BOOLEAN
NTAPI
RtlEqualSid (
  /*IN*/ PSID Sid1,
  /*IN*/ PSID Sid2
);

NTSYSAPI
VOID
NTAPI
RtlFillMemoryUlong (
  /*IN*/ PVOID    Destination,
  /*IN*/ ULONG    Length,
  /*IN*/ ULONG    Fill
);

NTSYSAPI
BOOLEAN
NTAPI
RtlFreeHeap (
  /*IN*/ HANDLE  HeapHandle,
  /*IN*/ ULONG   Flags,
  /*IN*/ PVOID   P
);

NTSYSAPI
VOID
NTAPI
RtlGenerate8dot3Name (
  /*IN*/ PUNICODE_STRING              Name,
  /*IN*/ BOOLEAN                      AllowExtendedCharacters,
  /*IN OUT*/ PGENERATE_NAME_CONTEXT   Context,
  /*OUT*/ PUNICODE_STRING             Name8dot3
);

NTSYSAPI
NTSTATUS
NTAPI
RtlGetCompressionWorkSpaceSize (
  /*IN*/ USHORT   CompressionFormatAndEngine,
  /*OUT*/ PULONG  CompressBufferWorkSpaceSize,
  /*OUT*/ PULONG  CompressFragmentWorkSpaceSize
);

NTSYSAPI
NTSTATUS
NTAPI
RtlGetDaclSecurityDescriptor (
  /*IN*/ PSECURITY_DESCRIPTOR SecurityDescriptor,
  /*OUT*/ PBOOLEAN            DaclPresent,
  /*OUT*/ PACL                *Dacl,
  /*OUT*/ PBOOLEAN            DaclDefaulted
);

NTSYSAPI
NTSTATUS
NTAPI
RtlGetGroupSecurityDescriptor (
  /*IN*/ PSECURITY_DESCRIPTOR SecurityDescriptor,
  /*OUT*/ PSID                *Group,
  /*OUT*/ PBOOLEAN            GroupDefaulted
);

NTSYSAPI
NTSTATUS
NTAPI
RtlGetOwnerSecurityDescriptor (
  /*IN*/ PSECURITY_DESCRIPTOR SecurityDescriptor,
  /*OUT*/ PSID                *Owner,
  /*OUT*/ PBOOLEAN            OwnerDefaulted
);

NTSYSAPI
NTSTATUS
NTAPI
RtlInitializeSid (
  /*IN OUT*/ PSID                     Sid,
  /*IN*/ PSID_IDENTIFIER_AUTHORITY    IdentifierAuthority,
  /*IN*/ UCHAR                        SubAuthorityCount
);

NTSYSAPI
BOOLEAN
NTAPI
RtlIsNameLegalDOS8Dot3 (
  /*IN*/ PUNICODE_STRING UnicodeName,
  /*IN*/ PANSI_STRING    AnsiName,
    PBOOLEAN           Unknown
);

NTSYSAPI
ULONG
NTAPI
RtlLengthRequiredSid (
  /*IN*/ UCHAR SubAuthorityCount
);

NTSYSAPI
ULONG
NTAPI
RtlLengthSid (
  /*IN*/ PSID Sid
);

NTSYSAPI
ULONG
NTAPI
RtlNtStatusToDosError (
  /*IN*/ NTSTATUS Status
);

NTSYSAPI
NTSTATUS
NTAPI
RtlReserveChunk (
  /*IN*/ USHORT       CompressionFormat,
  /*IN OUT*/ PUCHAR   *CompressedBuffer,
  /*IN*/ PUCHAR       EndOfCompressedBufferPlus1,
  /*OUT*/ PUCHAR      *ChunkBuffer,
  /*IN*/ ULONG        ChunkSize
);

NTSYSAPI
VOID
NTAPI
RtlSecondsSince1970ToTime (
  /*IN*/ ULONG            SecondsSince1970,
  /*OUT*/ PLARGE_INTEGER  Time
);

#if (VER_PRODUCTBUILD >= 2195)

NTSYSAPI
NTSTATUS
NTAPI
RtlSelfRelativeToAbsoluteSD (
  /*IN*/ PSECURITY_DESCRIPTOR     SelfRelativeSD,
  /*OUT*/ PSECURITY_DESCRIPTOR    AbsoluteSD,
  /*IN*/ PULONG                   AbsoluteSDSize,
  /*IN*/ PACL                     Dacl,
  /*IN*/ PULONG                   DaclSize,
  /*IN*/ PACL                     Sacl,
  /*IN*/ PULONG                   SaclSize,
  /*IN*/ PSID                     Owner,
  /*IN*/ PULONG                   OwnerSize,
  /*IN*/ PSID                     PrimaryGroup,
  /*IN*/ PULONG                   PrimaryGroupSize
);

#endif /* (VER_PRODUCTBUILD >= 2195) */

NTSYSAPI
NTSTATUS
NTAPI
RtlSetGroupSecurityDescriptor (
  /*IN OUT*/ PSECURITY_DESCRIPTOR SecurityDescriptor,
  /*IN*/ PSID                     Group,
  /*IN*/ BOOLEAN                  GroupDefaulted
);

NTSYSAPI
NTSTATUS
NTAPI
RtlSetOwnerSecurityDescriptor (
  /*IN OUT*/ PSECURITY_DESCRIPTOR SecurityDescriptor,
  /*IN*/ PSID                     Owner,
  /*IN*/ BOOLEAN                  OwnerDefaulted
);

NTSYSAPI
NTSTATUS
NTAPI
RtlSetSaclSecurityDescriptor (
  /*IN OUT*/ PSECURITY_DESCRIPTOR SecurityDescriptor,
  /*IN*/ BOOLEAN                  SaclPresent,
  /*IN*/ PACL                     Sacl,
  /*IN*/ BOOLEAN                  SaclDefaulted
);

NTSYSAPI
PUCHAR
NTAPI
RtlSubAuthorityCountSid (
  /*IN*/ PSID Sid
);

NTSYSAPI
PULONG
NTAPI
RtlSubAuthoritySid (
  /*IN*/ PSID    Sid,
  /*IN*/ ULONG   SubAuthority
);

NTSYSAPI
BOOLEAN
NTAPI
RtlValidSid (
  /*IN*/ PSID Sid
);

NTKERNELAPI
NTSTATUS
NTAPI
SeAppendPrivileges (
    PACCESS_STATE   AccessState,
    PPRIVILEGE_SET  Privileges
);

NTKERNELAPI
BOOLEAN
NTAPI
SeAuditingFileEvents (
  /*IN*/ BOOLEAN              AccessGranted,
  /*IN*/ PSECURITY_DESCRIPTOR SecurityDescriptor
);

NTKERNELAPI
BOOLEAN
NTAPI
SeAuditingFileOrGlobalEvents (
  /*IN*/ BOOLEAN                      AccessGranted,
  /*IN*/ PSECURITY_DESCRIPTOR         SecurityDescriptor,
  /*IN*/ PSECURITY_SUBJECT_CONTEXT    SubjectContext
);

NTKERNELAPI
VOID
NTAPI
SeCaptureSubjectContext (
  /*OUT*/ PSECURITY_SUBJECT_CONTEXT SubjectContext
);

NTKERNELAPI
NTSTATUS
NTAPI
SeCreateAccessState (
  /*OUT*/ PACCESS_STATE   AccessState,
  /*IN*/ PVOID            AuxData,
  /*IN*/ ACCESS_MASK      AccessMask,
  /*IN*/ PGENERIC_MAPPING Mapping
);

NTKERNELAPI
NTSTATUS
NTAPI
SeCreateClientSecurity (
  /*IN*/ PETHREAD                     Thread,
  /*IN*/ PSECURITY_QUALITY_OF_SERVICE QualityOfService,
  /*IN*/ BOOLEAN                      RemoteClient,
  /*OUT*/ PSECURITY_CLIENT_CONTEXT    ClientContext
);

#if (VER_PRODUCTBUILD >= 2195)

NTKERNELAPI
NTSTATUS
NTAPI
SeCreateClientSecurityFromSubjectContext (
  /*IN*/ PSECURITY_SUBJECT_CONTEXT    SubjectContext,
  /*IN*/ PSECURITY_QUALITY_OF_SERVICE QualityOfService,
  /*IN*/ BOOLEAN                      ServerIsRemote,
  /*OUT*/ PSECURITY_CLIENT_CONTEXT    ClientContext
);

#endif /* (VER_PRODUCTBUILD >= 2195) */

#define SeDeleteClientSecurity(C)  {                                           \
            if (SeTokenType((C)->ClientToken) == TokenPrimary) {               \
                PsDereferencePrimaryToken( (C)->ClientToken );                 \
            } else {                                                           \
                PsDereferenceImpersonationToken( (C)->ClientToken );           \
            }                                                                  \
}

NTKERNELAPI
VOID
NTAPI
SeDeleteObjectAuditAlarm (
  /*IN*/ PVOID    Object,
  /*IN*/ HANDLE   Handle
);

#define SeEnableAccessToExports() SeExports = *(PSE_EXPORTS *)SeExports;

NTKERNELAPI
VOID
NTAPI
SeFreePrivileges (
  /*IN*/ PPRIVILEGE_SET Privileges
);

NTKERNELAPI
VOID
NTAPI
SeImpersonateClient (
  /*IN*/ PSECURITY_CLIENT_CONTEXT ClientContext,
  /*IN*/ PETHREAD                 ServerThread /*OPTIONAL*/
);

#if (VER_PRODUCTBUILD >= 2195)

NTKERNELAPI
NTSTATUS
NTAPI
SeImpersonateClientEx (
  /*IN*/ PSECURITY_CLIENT_CONTEXT ClientContext,
  /*IN*/ PETHREAD                 ServerThread /*OPTIONAL*/
);

#endif /* (VER_PRODUCTBUILD >= 2195) */

NTKERNELAPI
VOID
NTAPI
SeLockSubjectContext (
  /*IN*/ PSECURITY_SUBJECT_CONTEXT SubjectContext
);

NTKERNELAPI
NTSTATUS
NTAPI
SeMarkLogonSessionForTerminationNotification (
  /*IN*/ PLUID LogonId
);

NTKERNELAPI
VOID
NTAPI
SeOpenObjectAuditAlarm (
  /*IN*/ PUNICODE_STRING      ObjectTypeName,
  /*IN*/ PVOID                Object /*OPTIONAL*/,
  /*IN*/ PUNICODE_STRING      AbsoluteObjectName /*OPTIONAL*/,
  /*IN*/ PSECURITY_DESCRIPTOR SecurityDescriptor,
  /*IN*/ PACCESS_STATE        AccessState,
  /*IN*/ BOOLEAN              ObjectCreated,
  /*IN*/ BOOLEAN              AccessGranted,
  /*IN*/ KPROCESSOR_MODE      AccessMode,
  /*OUT*/ PBOOLEAN            GenerateOnClose
);

NTKERNELAPI
VOID
NTAPI
SeOpenObjectForDeleteAuditAlarm (
  /*IN*/ PUNICODE_STRING      ObjectTypeName,
  /*IN*/ PVOID                Object /*OPTIONAL*/,
  /*IN*/ PUNICODE_STRING      AbsoluteObjectName /*OPTIONAL*/,
  /*IN*/ PSECURITY_DESCRIPTOR SecurityDescriptor,
  /*IN*/ PACCESS_STATE        AccessState,
  /*IN*/ BOOLEAN              ObjectCreated,
  /*IN*/ BOOLEAN              AccessGranted,
  /*IN*/ KPROCESSOR_MODE      AccessMode,
  /*OUT*/ PBOOLEAN            GenerateOnClose
);

NTKERNELAPI
BOOLEAN
NTAPI
SePrivilegeCheck (
  /*IN OUT*/ PPRIVILEGE_SET           RequiredPrivileges,
  /*IN*/ PSECURITY_SUBJECT_CONTEXT    SubjectContext,
  /*IN*/ KPROCESSOR_MODE              AccessMode
);

NTKERNELAPI
NTSTATUS
NTAPI
SeQueryAuthenticationIdToken (
  /*IN*/ PACCESS_TOKEN    Token,
  /*OUT*/ PLUID           LogonId
);

#if (VER_PRODUCTBUILD >= 2195)

NTKERNELAPI
NTSTATUS
NTAPI
SeQueryInformationToken (
  /*IN*/ PACCESS_TOKEN           Token,
  /*IN*/ TOKEN_INFORMATION_CLASS TokenInformationClass,
  /*OUT*/ PVOID                  *TokenInformation
);

#endif /* (VER_PRODUCTBUILD >= 2195) */

NTKERNELAPI
NTSTATUS
NTAPI
SeQuerySecurityDescriptorInfo (
  /*IN*/ PSECURITY_INFORMATION    SecurityInformation,
  /*OUT*/ PSECURITY_DESCRIPTOR    SecurityDescriptor,
  /*IN OUT*/ PULONG               Length,
  /*IN*/ PSECURITY_DESCRIPTOR     *ObjectsSecurityDescriptor
);

#if (VER_PRODUCTBUILD >= 2195)

NTKERNELAPI
NTSTATUS
NTAPI
SeQuerySessionIdToken (
  /*IN*/ PACCESS_TOKEN    Token,
  /*IN*/ PULONG           SessionId
);

#endif /* (VER_PRODUCTBUILD >= 2195) */

#define SeQuerySubjectContextToken( SubjectContext )                \
    ( ARGUMENT_PRESENT(                                             \
        ((PSECURITY_SUBJECT_CONTEXT) SubjectContext)->ClientToken   \
        ) ?                                                         \
    ((PSECURITY_SUBJECT_CONTEXT) SubjectContext)->ClientToken :     \
    ((PSECURITY_SUBJECT_CONTEXT) SubjectContext)->PrimaryToken )

typedef NTSTATUS (*PSE_LOGON_SESSION_TERMINATED_ROUTINE) (
  /*IN*/ PLUID LogonId
);

NTKERNELAPI
NTSTATUS
NTAPI
SeRegisterLogonSessionTerminatedRoutine (
  /*IN*/ PSE_LOGON_SESSION_TERMINATED_ROUTINE CallbackRoutine
);

NTKERNELAPI
VOID
NTAPI
SeReleaseSubjectContext (
  /*IN*/ PSECURITY_SUBJECT_CONTEXT SubjectContext
);

NTKERNELAPI
VOID
NTAPI
SeSetAccessStateGenericMapping (
    PACCESS_STATE       AccessState,
    PGENERIC_MAPPING    GenericMapping
);

NTKERNELAPI
NTSTATUS
NTAPI
SeSetSecurityDescriptorInfo (
  /*IN*/ PVOID                    Object /*OPTIONAL*/,
  /*IN*/ PSECURITY_INFORMATION    SecurityInformation,
  /*IN*/ PSECURITY_DESCRIPTOR     SecurityDescriptor,
  /*IN OUT*/ PSECURITY_DESCRIPTOR *ObjectsSecurityDescriptor,
  /*IN*/ POOL_TYPE                PoolType,
  /*IN*/ PGENERIC_MAPPING         GenericMapping
);

#if (VER_PRODUCTBUILD >= 2195)

NTKERNELAPI
NTSTATUS
NTAPI
SeSetSecurityDescriptorInfoEx (
  /*IN*/ PVOID                    Object /*OPTIONAL*/,
  /*IN*/ PSECURITY_INFORMATION    SecurityInformation,
  /*IN*/ PSECURITY_DESCRIPTOR     ModificationDescriptor,
  /*IN OUT*/ PSECURITY_DESCRIPTOR *ObjectsSecurityDescriptor,
  /*IN*/ ULONG                    AutoInheritFlags,
  /*IN*/ POOL_TYPE                PoolType,
  /*IN*/ PGENERIC_MAPPING         GenericMapping
);

NTKERNELAPI
BOOLEAN
NTAPI
SeTokenIsAdmin (
  /*IN*/ PACCESS_TOKEN Token
);

NTKERNELAPI
BOOLEAN
NTAPI
SeTokenIsRestricted (
  /*IN*/ PACCESS_TOKEN Token
);

#endif /* (VER_PRODUCTBUILD >= 2195) */

NTKERNELAPI
TOKEN_TYPE
NTAPI
SeTokenType (
  /*IN*/ PACCESS_TOKEN Token
);

NTKERNELAPI
VOID
NTAPI
SeUnlockSubjectContext (
  /*IN*/ PSECURITY_SUBJECT_CONTEXT SubjectContext
);

NTKERNELAPI
NTSTATUS
SeUnregisterLogonSessionTerminatedRoutine (
  /*IN*/ PSE_LOGON_SESSION_TERMINATED_ROUTINE CallbackRoutine
);

#if (VER_PRODUCTBUILD >= 2195)

NTSYSAPI
NTSTATUS
NTAPI
NtAdjustPrivilegesToken (
  /*IN*/ HANDLE               TokenHandle,
  /*IN*/ BOOLEAN              DisableAllPrivileges,
  /*IN*/ PTOKEN_PRIVILEGES    NewState,
  /*IN*/ ULONG                BufferLength,
  /*OUT*/ PTOKEN_PRIVILEGES   PreviousState /*OPTIONAL*/,
  /*OUT*/ PULONG              ReturnLength
);

NTSYSAPI
NTSTATUS
NTAPI
ZwAdjustPrivilegesToken (
  /*IN*/ HANDLE               TokenHandle,
  /*IN*/ BOOLEAN              DisableAllPrivileges,
  /*IN*/ PTOKEN_PRIVILEGES    NewState,
  /*IN*/ ULONG                BufferLength,
  /*OUT*/ PTOKEN_PRIVILEGES   PreviousState /*OPTIONAL*/,
  /*OUT*/ PULONG              ReturnLength
);

#endif /* (VER_PRODUCTBUILD >= 2195) */

NTSYSAPI
NTSTATUS
NTAPI
NtAlertThread (
  /*IN*/ HANDLE ThreadHandle
);

NTSYSAPI
NTSTATUS
NTAPI
ZwAlertThread (
  /*IN*/ HANDLE ThreadHandle
);

NTSYSAPI
NTSTATUS
NTAPI
NtAllocateVirtualMemory (
  /*IN*/ HANDLE       ProcessHandle,
  /*IN OUT*/ PVOID    *BaseAddress,
  /*IN*/ ULONG        ZeroBits,
  /*IN OUT*/ PULONG   RegionSize,
  /*IN*/ ULONG        AllocationType,
  /*IN*/ ULONG        Protect
);

NTSYSAPI
NTSTATUS
NTAPI
ZwAllocateVirtualMemory (
  /*IN*/ HANDLE       ProcessHandle,
  /*IN OUT*/ PVOID    *BaseAddress,
  /*IN*/ ULONG        ZeroBits,
  /*IN OUT*/ PULONG   RegionSize,
  /*IN*/ ULONG        AllocationType,
  /*IN*/ ULONG        Protect
);

NTSYSAPI
NTSTATUS
NTAPI
NtAccessCheckAndAuditAlarm (
  /*IN*/ PUNICODE_STRING      SubsystemName,
  /*IN*/ PVOID                HandleId,
  /*IN*/ PUNICODE_STRING      ObjectTypeName,
  /*IN*/ PUNICODE_STRING      ObjectName,
  /*IN*/ PSECURITY_DESCRIPTOR SecurityDescriptor,
  /*IN*/ ACCESS_MASK          DesiredAccess,
  /*IN*/ PGENERIC_MAPPING     GenericMapping,
  /*IN*/ BOOLEAN              ObjectCreation,
  /*OUT*/ PACCESS_MASK        GrantedAccess,
  /*OUT*/ PBOOLEAN            AccessStatus,
  /*OUT*/ PBOOLEAN            GenerateOnClose
);

NTSYSAPI
NTSTATUS
NTAPI
ZwAccessCheckAndAuditAlarm (
  /*IN*/ PUNICODE_STRING      SubsystemName,
  /*IN*/ PVOID                HandleId,
  /*IN*/ PUNICODE_STRING      ObjectTypeName,
  /*IN*/ PUNICODE_STRING      ObjectName,
  /*IN*/ PSECURITY_DESCRIPTOR SecurityDescriptor,
  /*IN*/ ACCESS_MASK          DesiredAccess,
  /*IN*/ PGENERIC_MAPPING     GenericMapping,
  /*IN*/ BOOLEAN              ObjectCreation,
  /*OUT*/ PACCESS_MASK        GrantedAccess,
  /*OUT*/ PBOOLEAN            AccessStatus,
  /*OUT*/ PBOOLEAN            GenerateOnClose
);

#if (VER_PRODUCTBUILD >= 2195)

NTSYSAPI
NTSTATUS
NTAPI
NtCancelIoFile (
  /*IN*/ HANDLE               FileHandle,
  /*OUT*/ PIO_STATUS_BLOCK    IoStatusBlock
);

NTSYSAPI
NTSTATUS
NTAPI
ZwCancelIoFile (
  /*IN*/ HANDLE               FileHandle,
  /*OUT*/ PIO_STATUS_BLOCK    IoStatusBlock
);

#endif /* (VER_PRODUCTBUILD >= 2195) */

NTSYSAPI
NTSTATUS
NTAPI
NtClearEvent (
  /*IN*/ HANDLE EventHandle
);

NTSYSAPI
NTSTATUS
NTAPI
ZwClearEvent (
  /*IN*/ HANDLE EventHandle
);

NTSYSAPI
NTSTATUS
NTAPI
NtCloseObjectAuditAlarm (
  /*IN*/ PUNICODE_STRING  SubsystemName,
  /*IN*/ PVOID            HandleId,
  /*IN*/ BOOLEAN          GenerateOnClose
);

NTSYSAPI
NTSTATUS
NTAPI
ZwCloseObjectAuditAlarm (
  /*IN*/ PUNICODE_STRING  SubsystemName,
  /*IN*/ PVOID            HandleId,
  /*IN*/ BOOLEAN          GenerateOnClose
);

NTSYSAPI
NTSTATUS
NTAPI
NtCreateSection (
  /*OUT*/ PHANDLE             SectionHandle,
  /*IN*/ ACCESS_MASK          DesiredAccess,
  /*IN*/ POBJECT_ATTRIBUTES   ObjectAttributes /*OPTIONAL*/,
  /*IN*/ PLARGE_INTEGER       MaximumSize /*OPTIONAL*/,
  /*IN*/ ULONG                SectionPageProtection,
  /*IN*/ ULONG                AllocationAttributes,
  /*IN*/ HANDLE               FileHandle /*OPTIONAL*/
);

NTSYSAPI
NTSTATUS
NTAPI
ZwCreateSection (
  /*OUT*/ PHANDLE             SectionHandle,
  /*IN*/ ACCESS_MASK          DesiredAccess,
  /*IN*/ POBJECT_ATTRIBUTES   ObjectAttributes /*OPTIONAL*/,
  /*IN*/ PLARGE_INTEGER       MaximumSize /*OPTIONAL*/,
  /*IN*/ ULONG                SectionPageProtection,
  /*IN*/ ULONG                AllocationAttributes,
  /*IN*/ HANDLE               FileHandle /*OPTIONAL*/
);

NTSYSAPI
NTSTATUS
NTAPI
NtCreateSymbolicLinkObject (
  /*OUT*/ PHANDLE             SymbolicLinkHandle,
  /*IN*/ ACCESS_MASK          DesiredAccess,
  /*IN*/ POBJECT_ATTRIBUTES   ObjectAttributes,
  /*IN*/ PUNICODE_STRING      TargetName
);

NTSYSAPI
NTSTATUS
NTAPI
ZwCreateSymbolicLinkObject (
  /*OUT*/ PHANDLE             SymbolicLinkHandle,
  /*IN*/ ACCESS_MASK          DesiredAccess,
  /*IN*/ POBJECT_ATTRIBUTES   ObjectAttributes,
  /*IN*/ PUNICODE_STRING      TargetName
);

NTSYSAPI
NTSTATUS
NTAPI
NtDeleteFile (
  /*IN*/ POBJECT_ATTRIBUTES ObjectAttributes
);

NTSYSAPI
NTSTATUS
NTAPI
ZwDeleteFile (
  /*IN*/ POBJECT_ATTRIBUTES ObjectAttributes
);

NTSYSAPI
NTSTATUS
NTAPI
NtDeleteValueKey (
  /*IN*/ HANDLE           Handle,
  /*IN*/ PUNICODE_STRING  Name
);

NTSYSAPI
NTSTATUS
NTAPI
ZwDeleteValueKey (
  /*IN*/ HANDLE           Handle,
  /*IN*/ PUNICODE_STRING  Name
);

NTSYSAPI
NTSTATUS
NTAPI
NtDeviceIoControlFile (
  /*IN*/ HANDLE               FileHandle,
  /*IN*/ HANDLE               Event /*OPTIONAL*/,
  /*IN*/ PIO_APC_ROUTINE      ApcRoutine /*OPTIONAL*/,
  /*IN*/ PVOID                ApcContext /*OPTIONAL*/,
  /*OUT*/ PIO_STATUS_BLOCK    IoStatusBlock,
  /*IN*/ ULONG                IoControlCode,
  /*IN*/ PVOID                InputBuffer /*OPTIONAL*/,
  /*IN*/ ULONG                InputBufferLength,
  /*OUT*/ PVOID               OutputBuffer /*OPTIONAL*/,
  /*IN*/ ULONG                OutputBufferLength
);

NTSYSAPI
NTSTATUS
NTAPI
ZwDeviceIoControlFile (
  /*IN*/ HANDLE               FileHandle,
  /*IN*/ HANDLE               Event /*OPTIONAL*/,
  /*IN*/ PIO_APC_ROUTINE      ApcRoutine /*OPTIONAL*/,
  /*IN*/ PVOID                ApcContext /*OPTIONAL*/,
  /*OUT*/ PIO_STATUS_BLOCK    IoStatusBlock,
  /*IN*/ ULONG                IoControlCode,
  /*IN*/ PVOID                InputBuffer /*OPTIONAL*/,
  /*IN*/ ULONG                InputBufferLength,
  /*OUT*/ PVOID               OutputBuffer /*OPTIONAL*/,
  /*IN*/ ULONG                OutputBufferLength
);

NTSYSAPI
NTSTATUS
NTAPI
NtDisplayString (
  /*IN*/ PUNICODE_STRING String
);

NTSYSAPI
NTSTATUS
NTAPI
ZwDisplayString (
  /*IN*/ PUNICODE_STRING String
);

NTSYSAPI
NTSTATUS
NTAPI
NtDuplicateObject (
  /*IN*/ HANDLE       SourceProcessHandle,
  /*IN*/ HANDLE       SourceHandle,
  /*IN*/ HANDLE       TargetProcessHandle /*OPTIONAL*/,
  /*OUT*/ PHANDLE     TargetHandle /*OPTIONAL*/,
  /*IN*/ ACCESS_MASK  DesiredAccess,
  /*IN*/ ULONG        HandleAttributes,
  /*IN*/ ULONG        Options
);

NTSYSAPI
NTSTATUS
NTAPI
ZwDuplicateObject (
  /*IN*/ HANDLE       SourceProcessHandle,
  /*IN*/ HANDLE       SourceHandle,
  /*IN*/ HANDLE       TargetProcessHandle /*OPTIONAL*/,
  /*OUT*/ PHANDLE     TargetHandle /*OPTIONAL*/,
  /*IN*/ ACCESS_MASK  DesiredAccess,
  /*IN*/ ULONG        HandleAttributes,
  /*IN*/ ULONG        Options
);

NTSYSAPI
NTSTATUS
NTAPI
NtDuplicateToken (
  /*IN*/ HANDLE               ExistingTokenHandle,
  /*IN*/ ACCESS_MASK          DesiredAccess,
  /*IN*/ POBJECT_ATTRIBUTES   ObjectAttributes,
  /*IN*/ BOOLEAN              EffectiveOnly,
  /*IN*/ TOKEN_TYPE           TokenType,
  /*OUT*/ PHANDLE             NewTokenHandle
);

NTSYSAPI
NTSTATUS
NTAPI
ZwDuplicateToken (
  /*IN*/ HANDLE               ExistingTokenHandle,
  /*IN*/ ACCESS_MASK          DesiredAccess,
  /*IN*/ POBJECT_ATTRIBUTES   ObjectAttributes,
  /*IN*/ BOOLEAN              EffectiveOnly,
  /*IN*/ TOKEN_TYPE           TokenType,
  /*OUT*/ PHANDLE             NewTokenHandle
);

NTSYSAPI
NTSTATUS
NTAPI
NtFlushInstructionCache (
  /*IN*/ HANDLE   ProcessHandle,
  /*IN*/ PVOID    BaseAddress /*OPTIONAL*/,
  /*IN*/ ULONG    FlushSize
);

NTSYSAPI
NTSTATUS
NTAPI
ZwFlushInstructionCache (
  /*IN*/ HANDLE   ProcessHandle,
  /*IN*/ PVOID    BaseAddress /*OPTIONAL*/,
  /*IN*/ ULONG    FlushSize
);

#if (VER_PRODUCTBUILD >= 2195)

NTSYSAPI
NTSTATUS
NTAPI
NtFlushVirtualMemory (
  /*IN*/ HANDLE               ProcessHandle,
  /*IN OUT*/ PVOID            *BaseAddress,
  /*IN OUT*/ PULONG           FlushSize,
  /*OUT*/ PIO_STATUS_BLOCK    IoStatusBlock
);

NTSYSAPI
NTSTATUS
NTAPI
ZwFlushVirtualMemory (
  /*IN*/ HANDLE               ProcessHandle,
  /*IN OUT*/ PVOID            *BaseAddress,
  /*IN OUT*/ PULONG           FlushSize,
  /*OUT*/ PIO_STATUS_BLOCK    IoStatusBlock
);

#endif /* (VER_PRODUCTBUILD >= 2195) */

NTSYSAPI
NTSTATUS
NTAPI
NtFreeVirtualMemory (
  /*IN*/ HANDLE       ProcessHandle,
  /*IN OUT*/ PVOID    *BaseAddress,
  /*IN OUT*/ PULONG   RegionSize,
  /*IN*/ ULONG        FreeType
);

NTSYSAPI
NTSTATUS
NTAPI
ZwFreeVirtualMemory (
  /*IN*/ HANDLE       ProcessHandle,
  /*IN OUT*/ PVOID    *BaseAddress,
  /*IN OUT*/ PULONG   RegionSize,
  /*IN*/ ULONG        FreeType
);

NTSYSAPI
NTSTATUS
NTAPI
NtFsControlFile (
  /*IN*/ HANDLE               FileHandle,
  /*IN*/ HANDLE               Event /*OPTIONAL*/,
  /*IN*/ PIO_APC_ROUTINE      ApcRoutine /*OPTIONAL*/,
  /*IN*/ PVOID                ApcContext /*OPTIONAL*/,
  /*OUT*/ PIO_STATUS_BLOCK    IoStatusBlock,
  /*IN*/ ULONG                FsControlCode,
  /*IN*/ PVOID                InputBuffer /*OPTIONAL*/,
  /*IN*/ ULONG                InputBufferLength,
  /*OUT*/ PVOID               OutputBuffer /*OPTIONAL*/,
  /*IN*/ ULONG                OutputBufferLength
);

NTSYSAPI
NTSTATUS
NTAPI
ZwFsControlFile (
  /*IN*/ HANDLE               FileHandle,
  /*IN*/ HANDLE               Event /*OPTIONAL*/,
  /*IN*/ PIO_APC_ROUTINE      ApcRoutine /*OPTIONAL*/,
  /*IN*/ PVOID                ApcContext /*OPTIONAL*/,
  /*OUT*/ PIO_STATUS_BLOCK    IoStatusBlock,
  /*IN*/ ULONG                FsControlCode,
  /*IN*/ PVOID                InputBuffer /*OPTIONAL*/,
  /*IN*/ ULONG                InputBufferLength,
  /*OUT*/ PVOID               OutputBuffer /*OPTIONAL*/,
  /*IN*/ ULONG                OutputBufferLength
);

#if (VER_PRODUCTBUILD >= 2195)

NTSYSAPI
NTSTATUS
NTAPI
NtInitiatePowerAction (
  /*IN*/ POWER_ACTION         SystemAction,
  /*IN*/ SYSTEM_POWER_STATE   MinSystemState,
  /*IN*/ ULONG                Flags,
  /*IN*/ BOOLEAN              Asynchronous
);

NTSYSAPI
NTSTATUS
NTAPI
ZwInitiatePowerAction (
  /*IN*/ POWER_ACTION         SystemAction,
  /*IN*/ SYSTEM_POWER_STATE   MinSystemState,
  /*IN*/ ULONG                Flags,
  /*IN*/ BOOLEAN              Asynchronous
);

#endif /* (VER_PRODUCTBUILD >= 2195) */

NTSYSAPI
NTSTATUS
NTAPI
NtLoadDriver (
    /* "\\Registry\\Machine\\System\\CurrentControlSet\\Services\\<DriverName>" */
  /*IN*/ PUNICODE_STRING RegistryPath
);

NTSYSAPI
NTSTATUS
NTAPI
ZwLoadDriver (
    /* "\\Registry\\Machine\\System\\CurrentControlSet\\Services\\<DriverName>" */
  /*IN*/ PUNICODE_STRING RegistryPath
);

NTSYSAPI
NTSTATUS
NTAPI
NtLoadKey (
  /*IN*/ POBJECT_ATTRIBUTES KeyObjectAttributes,
  /*IN*/ POBJECT_ATTRIBUTES FileObjectAttributes
);

NTSYSAPI
NTSTATUS
NTAPI
ZwLoadKey (
  /*IN*/ POBJECT_ATTRIBUTES KeyObjectAttributes,
  /*IN*/ POBJECT_ATTRIBUTES FileObjectAttributes
);

NTSYSAPI
NTSTATUS
NTAPI
NtNotifyChangeKey (
  /*IN*/ HANDLE               KeyHandle,
  /*IN*/ HANDLE               EventHandle /*OPTIONAL*/,
  /*IN*/ PIO_APC_ROUTINE      ApcRoutine /*OPTIONAL*/,
  /*IN*/ PVOID                ApcContext /*OPTIONAL*/,
  /*OUT*/ PIO_STATUS_BLOCK    IoStatusBlock,
  /*IN*/ ULONG                NotifyFilter,
  /*IN*/ BOOLEAN              WatchSubtree,
  /*IN*/ PVOID                Buffer,
  /*IN*/ ULONG                BufferLength,
  /*IN*/ BOOLEAN              Asynchronous
);

NTSYSAPI
NTSTATUS
NTAPI
ZwNotifyChangeKey (
  /*IN*/ HANDLE               KeyHandle,
  /*IN*/ HANDLE               EventHandle /*OPTIONAL*/,
  /*IN*/ PIO_APC_ROUTINE      ApcRoutine /*OPTIONAL*/,
  /*IN*/ PVOID                ApcContext /*OPTIONAL*/,
  /*OUT*/ PIO_STATUS_BLOCK    IoStatusBlock,
  /*IN*/ ULONG                NotifyFilter,
  /*IN*/ BOOLEAN              WatchSubtree,
  /*IN*/ PVOID                Buffer,
  /*IN*/ ULONG                BufferLength,
  /*IN*/ BOOLEAN              Asynchronous
);

NTSYSAPI
NTSTATUS
NTAPI
NtOpenDirectoryObject (
  /*OUT*/ PHANDLE             DirectoryHandle,
  /*IN*/ ACCESS_MASK          DesiredAccess,
  /*IN*/ POBJECT_ATTRIBUTES   ObjectAttributes
);

NTSYSAPI
NTSTATUS
NTAPI
ZwOpenDirectoryObject (
  /*OUT*/ PHANDLE             DirectoryHandle,
  /*IN*/ ACCESS_MASK          DesiredAccess,
  /*IN*/ POBJECT_ATTRIBUTES   ObjectAttributes
);

NTSYSAPI
NTSTATUS
NTAPI
NtOpenEvent (
  /*OUT*/ PHANDLE             EventHandle,
  /*IN*/ ACCESS_MASK          DesiredAccess,
  /*IN*/ POBJECT_ATTRIBUTES   ObjectAttributes
);

NTSYSAPI
NTSTATUS
NTAPI
ZwOpenEvent (
  /*OUT*/ PHANDLE             EventHandle,
  /*IN*/ ACCESS_MASK          DesiredAccess,
  /*IN*/ POBJECT_ATTRIBUTES   ObjectAttributes
);

NTSYSAPI
NTSTATUS
NTAPI
NtOpenProcess (
  /*OUT*/ PHANDLE             ProcessHandle,
  /*IN*/ ACCESS_MASK          DesiredAccess,
  /*IN*/ POBJECT_ATTRIBUTES   ObjectAttributes,
  /*IN*/ PCLIENT_ID           ClientId /*OPTIONAL*/
);

NTSYSAPI
NTSTATUS
NTAPI
ZwOpenProcess (
  /*OUT*/ PHANDLE             ProcessHandle,
  /*IN*/ ACCESS_MASK          DesiredAccess,
  /*IN*/ POBJECT_ATTRIBUTES   ObjectAttributes,
  /*IN*/ PCLIENT_ID           ClientId /*OPTIONAL*/
);

NTSYSAPI
NTSTATUS
NTAPI
NtOpenProcessToken (
  /*IN*/ HANDLE       ProcessHandle,
  /*IN*/ ACCESS_MASK  DesiredAccess,
  /*OUT*/ PHANDLE     TokenHandle
);

NTSYSAPI
NTSTATUS
NTAPI
ZwOpenProcessToken (
  /*IN*/ HANDLE       ProcessHandle,
  /*IN*/ ACCESS_MASK  DesiredAccess,
  /*OUT*/ PHANDLE     TokenHandle
);

NTSYSAPI
NTSTATUS
NTAPI
NtOpenThread (
  /*OUT*/ PHANDLE             ThreadHandle,
  /*IN*/ ACCESS_MASK          DesiredAccess,
  /*IN*/ POBJECT_ATTRIBUTES   ObjectAttributes,
  /*IN*/ PCLIENT_ID           ClientId
);

NTSYSAPI
NTSTATUS
NTAPI
ZwOpenThread (
  /*OUT*/ PHANDLE             ThreadHandle,
  /*IN*/ ACCESS_MASK          DesiredAccess,
  /*IN*/ POBJECT_ATTRIBUTES   ObjectAttributes,
  /*IN*/ PCLIENT_ID           ClientId
);

NTSYSAPI
NTSTATUS
NTAPI
NtOpenThreadToken (
  /*IN*/ HANDLE       ThreadHandle,
  /*IN*/ ACCESS_MASK  DesiredAccess,
  /*IN*/ BOOLEAN      OpenAsSelf,
  /*OUT*/ PHANDLE     TokenHandle
);

NTSYSAPI
NTSTATUS
NTAPI
ZwOpenThreadToken (
  /*IN*/ HANDLE       ThreadHandle,
  /*IN*/ ACCESS_MASK  DesiredAccess,
  /*IN*/ BOOLEAN      OpenAsSelf,
  /*OUT*/ PHANDLE     TokenHandle
);

#if (VER_PRODUCTBUILD >= 2195)

NTSYSAPI
NTSTATUS
NTAPI
NtPowerInformation (
  /*IN*/ POWER_INFORMATION_LEVEL  PowerInformationLevel,
  /*IN*/ PVOID                    InputBuffer /*OPTIONAL*/,
  /*IN*/ ULONG                    InputBufferLength,
  /*OUT*/ PVOID                   OutputBuffer /*OPTIONAL*/,
  /*IN*/ ULONG                    OutputBufferLength
);

NTSYSAPI
NTSTATUS
NTAPI
ZwPowerInformation (
  /*IN*/ POWER_INFORMATION_LEVEL  PowerInformationLevel,
  /*IN*/ PVOID                    InputBuffer /*OPTIONAL*/,
  /*IN*/ ULONG                    InputBufferLength,
  /*OUT*/ PVOID                   OutputBuffer /*OPTIONAL*/,
  /*IN*/ ULONG                    OutputBufferLength
);

#endif /* (VER_PRODUCTBUILD >= 2195) */

NTSYSAPI
NTSTATUS
NTAPI
NtPulseEvent (
  /*IN*/ HANDLE   EventHandle,
  /*OUT*/ PULONG  PreviousState /*OPTIONAL*/
);

NTSYSAPI
NTSTATUS
NTAPI
ZwPulseEvent (
  /*IN*/ HANDLE   EventHandle,
  /*OUT*/ PULONG  PreviousState /*OPTIONAL*/
);

NTSYSAPI
NTSTATUS
NTAPI
NtQueryDefaultLocale (
  /*IN*/ BOOLEAN  ThreadOrSystem,
  /*OUT*/ PLCID   Locale
);

NTSYSAPI
NTSTATUS
NTAPI
ZwQueryDefaultLocale (
  /*IN*/ BOOLEAN  ThreadOrSystem,
  /*OUT*/ PLCID   Locale
);

NTSYSAPI
NTSTATUS
NTAPI
NtQueryDirectoryFile (
  /*IN*/ HANDLE                   FileHandle,
  /*IN*/ HANDLE                   Event /*OPTIONAL*/,
  /*IN*/ PIO_APC_ROUTINE          ApcRoutine /*OPTIONAL*/,
  /*IN*/ PVOID                    ApcContext /*OPTIONAL*/,
  /*OUT*/ PIO_STATUS_BLOCK        IoStatusBlock,
  /*OUT*/ PVOID                   FileInformation,
  /*IN*/ ULONG                    Length,
  /*IN*/ FILE_INFORMATION_CLASS   FileInformationClass,
  /*IN*/ BOOLEAN                  ReturnSingleEntry,
  /*IN*/ PUNICODE_STRING          FileName /*OPTIONAL*/,
  /*IN*/ BOOLEAN                  RestartScan
);

NTSYSAPI
NTSTATUS
NTAPI
ZwQueryDirectoryFile (
  /*IN*/ HANDLE                   FileHandle,
  /*IN*/ HANDLE                   Event /*OPTIONAL*/,
  /*IN*/ PIO_APC_ROUTINE          ApcRoutine /*OPTIONAL*/,
  /*IN*/ PVOID                    ApcContext /*OPTIONAL*/,
  /*OUT*/ PIO_STATUS_BLOCK        IoStatusBlock,
  /*OUT*/ PVOID                   FileInformation,
  /*IN*/ ULONG                    Length,
  /*IN*/ FILE_INFORMATION_CLASS   FileInformationClass,
  /*IN*/ BOOLEAN                  ReturnSingleEntry,
  /*IN*/ PUNICODE_STRING          FileName /*OPTIONAL*/,
  /*IN*/ BOOLEAN                  RestartScan
);

#if (VER_PRODUCTBUILD >= 2195)

NTSYSAPI
NTSTATUS
NTAPI
NtQueryDirectoryObject (
  /*IN*/ HANDLE       DirectoryHandle,
  /*OUT*/ PVOID       Buffer,
  /*IN*/ ULONG        Length,
  /*IN*/ BOOLEAN      ReturnSingleEntry,
  /*IN*/ BOOLEAN      RestartScan,
  /*IN OUT*/ PULONG   Context,
  /*OUT*/ PULONG      ReturnLength /*OPTIONAL*/
);

NTSYSAPI
NTSTATUS
NTAPI
ZwQueryDirectoryObject (
  /*IN*/ HANDLE       DirectoryHandle,
  /*OUT*/ PVOID       Buffer,
  /*IN*/ ULONG        Length,
  /*IN*/ BOOLEAN      ReturnSingleEntry,
  /*IN*/ BOOLEAN      RestartScan,
  /*IN OUT*/ PULONG   Context,
  /*OUT*/ PULONG      ReturnLength /*OPTIONAL*/
);

NTSYSAPI
NTSTATUS
NTAPI
NtQueryEaFile (
  /*IN*/ HANDLE               FileHandle,
  /*OUT*/ PIO_STATUS_BLOCK    IoStatusBlock,
  /*OUT*/ PVOID               Buffer,
  /*IN*/ ULONG                Length,
  /*IN*/ BOOLEAN              ReturnSingleEntry,
  /*IN*/ PVOID                EaList /*OPTIONAL*/,
  /*IN*/ ULONG                EaListLength,
  /*IN*/ PULONG               EaIndex /*OPTIONAL*/,
  /*IN*/ BOOLEAN              RestartScan
);

NTSYSAPI
NTSTATUS
NTAPI
ZwQueryEaFile (
  /*IN*/ HANDLE               FileHandle,
  /*OUT*/ PIO_STATUS_BLOCK    IoStatusBlock,
  /*OUT*/ PVOID               Buffer,
  /*IN*/ ULONG                Length,
  /*IN*/ BOOLEAN              ReturnSingleEntry,
  /*IN*/ PVOID                EaList /*OPTIONAL*/,
  /*IN*/ ULONG                EaListLength,
  /*IN*/ PULONG               EaIndex /*OPTIONAL*/,
  /*IN*/ BOOLEAN              RestartScan
);

#endif /* (VER_PRODUCTBUILD >= 2195) */

NTSYSAPI
NTSTATUS
NTAPI
NtQueryInformationProcess (
  /*IN*/ HANDLE           ProcessHandle,
  /*IN*/ PROCESSINFOCLASS ProcessInformationClass,
  /*OUT*/ PVOID           ProcessInformation,
  /*IN*/ ULONG            ProcessInformationLength,
  /*OUT*/ PULONG          ReturnLength /*OPTIONAL*/
);

NTSYSAPI
NTSTATUS
NTAPI
ZwQueryInformationProcess (
  /*IN*/ HANDLE           ProcessHandle,
  /*IN*/ PROCESSINFOCLASS ProcessInformationClass,
  /*OUT*/ PVOID           ProcessInformation,
  /*IN*/ ULONG            ProcessInformationLength,
  /*OUT*/ PULONG          ReturnLength /*OPTIONAL*/
);

NTSYSAPI
NTSTATUS
NTAPI
NtQueryInformationToken (
  /*IN*/ HANDLE                   TokenHandle,
  /*IN*/ TOKEN_INFORMATION_CLASS  TokenInformationClass,
  /*OUT*/ PVOID                   TokenInformation,
  /*IN*/ ULONG                    Length,
  /*OUT*/ PULONG                  ResultLength
);

NTSYSAPI
NTSTATUS
NTAPI
ZwQueryInformationToken (
  /*IN*/ HANDLE                   TokenHandle,
  /*IN*/ TOKEN_INFORMATION_CLASS  TokenInformationClass,
  /*OUT*/ PVOID                   TokenInformation,
  /*IN*/ ULONG                    Length,
  /*OUT*/ PULONG                  ResultLength
);

NTSYSAPI
NTSTATUS
NTAPI
NtQueryObject (
  /*IN*/ HANDLE                      ObjectHandle,
  /*IN*/ OBJECT_INFORMATION_CLASS    ObjectInformationClass,
  /*OUT*/ PVOID                      ObjectInformation,
  /*IN*/ ULONG                       Length,
  /*OUT*/ PULONG                     ResultLength
);

NTSYSAPI
NTSTATUS
NTAPI
ZwQueryObject (
  /*IN*/ HANDLE                      ObjectHandle,
  /*IN*/ OBJECT_INFORMATION_CLASS    ObjectInformationClass,
  /*OUT*/ PVOID                      ObjectInformation,
  /*IN*/ ULONG                       Length,
  /*OUT*/ PULONG                     ResultLength
);

NTSYSAPI
NTSTATUS
NTAPI
NtQuerySection (
  /*IN*/ HANDLE                       SectionHandle,
  /*IN*/ SECTION_INFORMATION_CLASS    SectionInformationClass,
  /*OUT*/ PVOID                       SectionInformation,
  /*IN*/ ULONG                        SectionInformationLength,
  /*OUT*/ PULONG                      ResultLength /*OPTIONAL*/
);

NTSYSAPI
NTSTATUS
NTAPI
ZwQuerySection (
  /*IN*/ HANDLE                       SectionHandle,
  /*IN*/ SECTION_INFORMATION_CLASS    SectionInformationClass,
  /*OUT*/ PVOID                       SectionInformation,
  /*IN*/ ULONG                        SectionInformationLength,
  /*OUT*/ PULONG                      ResultLength /*OPTIONAL*/
);

NTSYSAPI
NTSTATUS
NTAPI
NtQuerySecurityObject (
  /*IN*/ HANDLE                   FileHandle,
  /*IN*/ SECURITY_INFORMATION     SecurityInformation,
  /*OUT*/ PSECURITY_DESCRIPTOR    SecurityDescriptor,
  /*IN*/ ULONG                    Length,
  /*OUT*/ PULONG                  ResultLength
);

NTSYSAPI
NTSTATUS
NTAPI
ZwQuerySecurityObject (
  /*IN*/ HANDLE                   FileHandle,
  /*IN*/ SECURITY_INFORMATION     SecurityInformation,
  /*OUT*/ PSECURITY_DESCRIPTOR    SecurityDescriptor,
  /*IN*/ ULONG                    Length,
  /*OUT*/ PULONG                  ResultLength
);

NTSYSAPI
NTSTATUS
NTAPI
NtQuerySystemInformation (
  /*IN*/ SYSTEM_INFORMATION_CLASS SystemInformationClass,
  /*OUT*/ PVOID                   SystemInformation,
  /*IN*/ ULONG                    Length,
  /*OUT*/ PULONG                  ReturnLength
);

NTSYSAPI
NTSTATUS
NTAPI
ZwQuerySystemInformation (
  /*IN*/ SYSTEM_INFORMATION_CLASS SystemInformationClass,
  /*OUT*/ PVOID                   SystemInformation,
  /*IN*/ ULONG                    Length,
  /*OUT*/ PULONG                  ReturnLength
);

NTSYSAPI
NTSTATUS
NTAPI
NtQueryVolumeInformationFile (
  /*IN*/ HANDLE               FileHandle,
  /*OUT*/ PIO_STATUS_BLOCK    IoStatusBlock,
  /*OUT*/ PVOID               FsInformation,
  /*IN*/ ULONG                Length,
  /*IN*/ FS_INFORMATION_CLASS FsInformationClass
);

NTSYSAPI
NTSTATUS
NTAPI
ZwQueryVolumeInformationFile (
  /*IN*/ HANDLE               FileHandle,
  /*OUT*/ PIO_STATUS_BLOCK    IoStatusBlock,
  /*OUT*/ PVOID               FsInformation,
  /*IN*/ ULONG                Length,
  /*IN*/ FS_INFORMATION_CLASS FsInformationClass
);

NTSYSAPI
NTSTATUS
NTAPI
NtReplaceKey (
  /*IN*/ POBJECT_ATTRIBUTES   NewFileObjectAttributes,
  /*IN*/ HANDLE               KeyHandle,
  /*IN*/ POBJECT_ATTRIBUTES   OldFileObjectAttributes
);

NTSYSAPI
NTSTATUS
NTAPI
ZwReplaceKey (
  /*IN*/ POBJECT_ATTRIBUTES   NewFileObjectAttributes,
  /*IN*/ HANDLE               KeyHandle,
  /*IN*/ POBJECT_ATTRIBUTES   OldFileObjectAttributes
);

NTSYSAPI
NTSTATUS
NTAPI
NtResetEvent (
  /*IN*/ HANDLE   EventHandle,
  /*OUT*/ PULONG  PreviousState /*OPTIONAL*/
);

NTSYSAPI
NTSTATUS
NTAPI
ZwResetEvent (
  /*IN*/ HANDLE   EventHandle,
  /*OUT*/ PULONG  PreviousState /*OPTIONAL*/
);

#if (VER_PRODUCTBUILD >= 2195)

NTSYSAPI
NTSTATUS
NTAPI
NtRestoreKey (
  /*IN*/ HANDLE   KeyHandle,
  /*IN*/ HANDLE   FileHandle,
  /*IN*/ ULONG    Flags
);

NTSYSAPI
NTSTATUS
NTAPI
ZwRestoreKey (
  /*IN*/ HANDLE   KeyHandle,
  /*IN*/ HANDLE   FileHandle,
  /*IN*/ ULONG    Flags
);

#endif /* (VER_PRODUCTBUILD >= 2195) */

NTSYSAPI
NTSTATUS
NTAPI
NtSaveKey (
  /*IN*/ HANDLE KeyHandle,
  /*IN*/ HANDLE FileHandle
);

NTSYSAPI
NTSTATUS
NTAPI
ZwSaveKey (
  /*IN*/ HANDLE KeyHandle,
  /*IN*/ HANDLE FileHandle
);

NTSYSAPI
NTSTATUS
NTAPI
NtSetDefaultLocale (
  /*IN*/ BOOLEAN  ThreadOrSystem,
  /*IN*/ LCID     Locale
);

NTSYSAPI
NTSTATUS
NTAPI
ZwSetDefaultLocale (
  /*IN*/ BOOLEAN  ThreadOrSystem,
  /*IN*/ LCID     Locale
);

#if (VER_PRODUCTBUILD >= 2195)

NTSYSAPI
NTSTATUS
NTAPI
NtSetDefaultUILanguage (
  /*IN*/ LANGID LanguageId
);

NTSYSAPI
NTSTATUS
NTAPI
ZwSetDefaultUILanguage (
  /*IN*/ LANGID LanguageId
);

NTSYSAPI
NTSTATUS
NTAPI
NtSetEaFile (
  /*IN*/ HANDLE               FileHandle,
  /*OUT*/ PIO_STATUS_BLOCK    IoStatusBlock,
  /*OUT*/ PVOID               Buffer,
  /*IN*/ ULONG                Length
);

NTSYSAPI
NTSTATUS
NTAPI
ZwSetEaFile (
  /*IN*/ HANDLE               FileHandle,
  /*OUT*/ PIO_STATUS_BLOCK    IoStatusBlock,
  /*OUT*/ PVOID               Buffer,
  /*IN*/ ULONG                Length
);

#endif /* (VER_PRODUCTBUILD >= 2195) */

NTSYSAPI
NTSTATUS
NTAPI
NtSetEvent (
  /*IN*/ HANDLE   EventHandle,
  /*OUT*/ PULONG  PreviousState /*OPTIONAL*/
);

NTSYSAPI
NTSTATUS
NTAPI
ZwSetEvent (
  /*IN*/ HANDLE   EventHandle,
  /*OUT*/ PULONG  PreviousState /*OPTIONAL*/
);

NTSYSAPI
NTSTATUS
NTAPI
NtSetInformationObject (
  /*IN*/ HANDLE                       ObjectHandle,
  /*IN*/ OBJECT_INFORMATION_CLASS    ObjectInformationClass,
  /*IN*/ PVOID                        ObjectInformation,
  /*IN*/ ULONG                        ObjectInformationLength
);

NTSYSAPI
NTSTATUS
NTAPI
ZwSetInformationObject (
  /*IN*/ HANDLE                       ObjectHandle,
  /*IN*/ OBJECT_INFORMATION_CLASS    ObjectInformationClass,
  /*IN*/ PVOID                        ObjectInformation,
  /*IN*/ ULONG                        ObjectInformationLength
);

NTSYSAPI
NTSTATUS
NTAPI
NtSetInformationProcess (
  /*IN*/ HANDLE           ProcessHandle,
  /*IN*/ PROCESSINFOCLASS ProcessInformationClass,
  /*IN*/ PVOID            ProcessInformation,
  /*IN*/ ULONG            ProcessInformationLength
);

NTSYSAPI
NTSTATUS
NTAPI
ZwSetInformationProcess (
  /*IN*/ HANDLE           ProcessHandle,
  /*IN*/ PROCESSINFOCLASS ProcessInformationClass,
  /*IN*/ PVOID            ProcessInformation,
  /*IN*/ ULONG            ProcessInformationLength
);

#if (VER_PRODUCTBUILD >= 2195)

NTSYSAPI
NTSTATUS
NTAPI
NtSetSecurityObject (
  /*IN*/ HANDLE               Handle,
  /*IN*/ SECURITY_INFORMATION SecurityInformation,
  /*IN*/ PSECURITY_DESCRIPTOR SecurityDescriptor
);

NTSYSAPI
NTSTATUS
NTAPI
ZwSetSecurityObject (
  /*IN*/ HANDLE               Handle,
  /*IN*/ SECURITY_INFORMATION SecurityInformation,
  /*IN*/ PSECURITY_DESCRIPTOR SecurityDescriptor
);

#endif /* (VER_PRODUCTBUILD >= 2195) */

NTSYSAPI
NTSTATUS
NTAPI
NtSetSystemInformation (
  /*IN*/ SYSTEM_INFORMATION_CLASS SystemInformationClass,
  /*IN*/ PVOID                    SystemInformation,
  /*IN*/ ULONG                    Length
);

NTSYSAPI
NTSTATUS
NTAPI
ZwSetSystemInformation (
  /*IN*/ SYSTEM_INFORMATION_CLASS SystemInformationClass,
  /*IN*/ PVOID                    SystemInformation,
  /*IN*/ ULONG                    Length
);

NTSYSAPI
NTSTATUS
NTAPI
NtSetSystemTime (
  /*IN*/ PLARGE_INTEGER   NewTime,
  /*OUT*/ PLARGE_INTEGER  OldTime /*OPTIONAL*/
);

NTSYSAPI
NTSTATUS
NTAPI
ZwSetSystemTime (
  /*IN*/ PLARGE_INTEGER   NewTime,
  /*OUT*/ PLARGE_INTEGER  OldTime /*OPTIONAL*/
);

#if (VER_PRODUCTBUILD >= 2195)

NTSYSAPI
NTSTATUS
NTAPI
NtSetVolumeInformationFile (
  /*IN*/ HANDLE               FileHandle,
  /*OUT*/ PIO_STATUS_BLOCK    IoStatusBlock,
  /*IN*/ PVOID                FsInformation,
  /*IN*/ ULONG                Length,
  /*IN*/ FS_INFORMATION_CLASS FsInformationClass
);

NTSYSAPI
NTSTATUS
NTAPI
ZwSetVolumeInformationFile (
  /*IN*/ HANDLE               FileHandle,
  /*OUT*/ PIO_STATUS_BLOCK    IoStatusBlock,
  /*IN*/ PVOID                FsInformation,
  /*IN*/ ULONG                Length,
  /*IN*/ FS_INFORMATION_CLASS FsInformationClass
);

#endif /* (VER_PRODUCTBUILD >= 2195) */

NTSYSAPI
NTSTATUS
NTAPI
NtTerminateProcess (
  /*IN*/ HANDLE   ProcessHandle /*OPTIONAL*/,
  /*IN*/ NTSTATUS ExitStatus
);

NTSYSAPI
NTSTATUS
NTAPI
ZwTerminateProcess (
  /*IN*/ HANDLE   ProcessHandle /*OPTIONAL*/,
  /*IN*/ NTSTATUS ExitStatus
);

NTSYSAPI
NTSTATUS
NTAPI
NtUnloadDriver (
    /* "\\Registry\\Machine\\System\\CurrentControlSet\\Services\\<DriverName>" */
  /*IN*/ PUNICODE_STRING RegistryPath
);

NTSYSAPI
NTSTATUS
NTAPI
ZwUnloadDriver (
    /* "\\Registry\\Machine\\System\\CurrentControlSet\\Services\\<DriverName>" */
  /*IN*/ PUNICODE_STRING RegistryPath
);

NTSYSAPI
NTSTATUS
NTAPI
NtUnloadKey (
  /*IN*/ POBJECT_ATTRIBUTES KeyObjectAttributes
);

NTSYSAPI
NTSTATUS
NTAPI
ZwUnloadKey (
  /*IN*/ POBJECT_ATTRIBUTES KeyObjectAttributes
);

NTSYSAPI
NTSTATUS
NTAPI
NtWaitForSingleObject (
  /*IN*/ HANDLE           Handle,
  /*IN*/ BOOLEAN          Alertable,
  /*IN*/ PLARGE_INTEGER   Timeout /*OPTIONAL*/
);

NTSYSAPI
NTSTATUS
NTAPI
ZwWaitForSingleObject (
  /*IN*/ HANDLE           Handle,
  /*IN*/ BOOLEAN          Alertable,
  /*IN*/ PLARGE_INTEGER   Timeout /*OPTIONAL*/
);

NTSYSAPI
NTSTATUS
NTAPI
NtWaitForMultipleObjects (
  /*IN*/ ULONG            HandleCount,
  /*IN*/ PHANDLE          Handles,
  /*IN*/ WAIT_TYPE        WaitType,
  /*IN*/ BOOLEAN          Alertable,
  /*IN*/ PLARGE_INTEGER   Timeout /*OPTIONAL*/
);

NTSYSAPI
NTSTATUS
NTAPI
ZwWaitForMultipleObjects (
  /*IN*/ ULONG            HandleCount,
  /*IN*/ PHANDLE          Handles,
  /*IN*/ WAIT_TYPE        WaitType,
  /*IN*/ BOOLEAN          Alertable,
  /*IN*/ PLARGE_INTEGER   Timeout /*OPTIONAL*/
);

NTSYSAPI
NTSTATUS
NTAPI
NtYieldExecution (
    VOID
);

NTSYSAPI
NTSTATUS
NTAPI
ZwYieldExecution (
    VOID
);

#ifdef __cplusplus
}
#endif

#endif /* _NTIFS_ */
