首页 > 其他 > 详细

Ntdll.h

时间:2015-12-31 19:09:10      阅读:1783      评论:0      收藏:0      [点我收藏+]
技术分享
   1 #pragma once
   2 
   3 #ifndef __NTDLL_H__
   4 #define __NTDLL_H__
   5 
   6 #ifdef __cplusplus
   7 extern "C" {
   8 #endif
   9 
  10 #ifdef _NTDDK_
  11 #error This header cannot be compiled together with NTDDK
  12 #endif
  13 
  14 #ifndef _NTDLL_SELF_                            // Auto-insert the library
  15 
  16 #ifndef WIN64
  17 #pragma comment(lib, "Lib\\x86\\Ntdll.lib")
  18 #else
  19 #pragma comment(lib, "Lib\\x64\\Ntdll.lib")
  20 #endif
  21 
  22 #endif
  23 
  24 #pragma warning(disable: 4201)                  // nonstandard extension used : nameless struct/union
  25 
  26 //------------------------------------------------------------------------------
  27 // Defines for NTSTATUS
  28 
  29 typedef long NTSTATUS;
  30 
  31 #ifndef NT_SUCCESS
  32 #define NT_SUCCESS(Status) ((NTSTATUS)(Status) >= 0)
  33 #endif
  34 
  35 #ifndef STATUS_SUCCESS
  36 #define STATUS_SUCCESS       ((NTSTATUS)0x00000000L)
  37 #endif
  38 
  39 #ifndef STATUS_UNSUCCESSFUL
  40 #define STATUS_UNSUCCESSFUL ((NTSTATUS)0xC0000001L)
  41 #endif
  42 
  43 #ifndef ASSERT
  44 #ifdef _DEBUG
  45 #define ASSERT(x) assert(x)
  46 #else
  47 #define ASSERT(x) /* x */
  48 #endif
  49 #endif
  50 
  51 #ifndef DEVICE_TYPE
  52 #define DEVICE_TYPE DWORD
  53 #endif
  54 
  55 //-----------------------------------------------------------------------------
  56 // Definition of intervals for waiting functions
  57 
  58 #define ABSOLUTE_INTERVAL(wait) (wait)
  59 
  60 #define RELATIVE_INTERVAL(wait) (-(wait))
  61 
  62 #define NANOSECONDS(nanos)   63 (((signed __int64)(nanos)) / 100L)
  64 
  65 #define MICROSECONDS(micros)   66 (((signed __int64)(micros)) * NANOSECONDS(1000L))
  67 
  68 #define MILISECONDS(mili)   69 (((signed __int64)(mili)) * MICROSECONDS(1000L))
  70 
  71 #define SECONDS(seconds)   72 (((signed __int64)(seconds)) * MILISECONDS(1000L))
  73 
  74 //------------------------------------------------------------------------------
  75 // Structures
  76 
  77 #ifndef _NTDEF_
  78 typedef enum _EVENT_TYPE
  79 {
  80     NotificationEvent,
  81     SynchronizationEvent
  82 
  83 } EVENT_TYPE;
  84 
  85 //
  86 // ANSI strings are counted 8-bit character strings. If they are
  87 // NULL terminated, Length does not include trailing NULL.
  88 //
  89 
  90 typedef struct _STRING
  91 {
  92     USHORT Length;
  93     USHORT MaximumLength;
  94     PCHAR  Buffer;
  95 
  96 } STRING, *PSTRING;
  97 
  98 //
  99 // Unicode strings are counted 16-bit character strings. If they are
 100 // NULL terminated, Length does not include trailing NULL.
 101 //
 102 
 103 typedef struct _UNICODE_STRING
 104 {
 105     USHORT Length;
 106     USHORT MaximumLength;
 107     PWSTR  Buffer;
 108 
 109 } UNICODE_STRING, *PUNICODE_STRING;
 110 
 111 typedef STRING ANSI_STRING;
 112 typedef PSTRING PANSI_STRING;
 113 
 114 typedef STRING OEM_STRING;
 115 typedef PSTRING POEM_STRING;
 116 typedef CONST STRING* PCOEM_STRING;
 117 
 118 typedef const UNICODE_STRING *PCUNICODE_STRING;
 119 
 120 #define UNICODE_NULL ((WCHAR)0) // winnt
 121 
 122 //
 123 // Valid values for the Attributes field
 124 //
 125 
 126 #define OBJ_INHERIT             0x00000002L
 127 #define OBJ_PERMANENT           0x00000010L
 128 #define OBJ_EXCLUSIVE           0x00000020L
 129 #define OBJ_CASE_INSENSITIVE    0x00000040L
 130 #define OBJ_OPENIF              0x00000080L
 131 #define OBJ_OPENLINK            0x00000100L
 132 #define OBJ_KERNEL_HANDLE       0x00000200L
 133 #define OBJ_FORCE_ACCESS_CHECK  0x00000400L
 134 #define OBJ_VALID_ATTRIBUTES    0x000007F2L
 135 
 136 //
 137 // Object Attributes structure
 138 //
 139 
 140 typedef struct _OBJECT_ATTRIBUTES
 141 {
 142     ULONG Length;
 143     HANDLE RootDirectory;
 144     PUNICODE_STRING ObjectName;
 145     ULONG Attributes;
 146     PVOID SecurityDescriptor;        // Points to type SECURITY_DESCRIPTOR
 147     PVOID SecurityQualityOfService;  // Points to type SECURITY_QUALITY_OF_SERVICE
 148 
 149 } OBJECT_ATTRIBUTES, *POBJECT_ATTRIBUTES;
 150 
 151 //
 152 // IO_STATUS_BLOCK
 153 //
 154 
 155 typedef struct _IO_STATUS_BLOCK
 156 {
 157     union
 158     {
 159         NTSTATUS Status;
 160         PVOID Pointer;
 161     };
 162 
 163     ULONG_PTR Information;
 164 
 165 } IO_STATUS_BLOCK, *PIO_STATUS_BLOCK;
 166 
 167 //
 168 // ClientId
 169 //
 170 
 171 typedef struct _CLIENT_ID
 172 {
 173     HANDLE UniqueProcess;
 174     HANDLE UniqueThread;
 175 
 176 } CLIENT_ID, *PCLIENT_ID;
 177 #endif // _NTDEF_
 178 
 179 
 180 //
 181 // CURDIR structure
 182 //
 183 
 184 typedef struct _CURDIR
 185 {
 186     UNICODE_STRING DosPath;
 187     HANDLE Handle;
 188 
 189 } CURDIR, *PCURDIR;
 190 
 191 
 192 //------------------------------------------------------------------------------
 193 // Macros
 194 
 195 #ifndef InitializeObjectAttributes
 196 #define InitializeObjectAttributes( p, n, a, r, s ) {    197     (p)->Length = sizeof( OBJECT_ATTRIBUTES );           198     (p)->RootDirectory = r;                              199     (p)->Attributes = a;                                 200     (p)->ObjectName = n;                                 201     (p)->SecurityDescriptor = s;                         202     (p)->SecurityQualityOfService = NULL;                203     }
 204 #endif
 205 
 206 //
 207 // Macros for handling LIST_ENTRY-based lists
 208 //
 209 
 210 #if !defined(_WDMDDK_) && !defined(_LIST_ENTRY_MACROS_DEFINED_)
 211 #define _LIST_ENTRY_MACROS_DEFINED_
 212 
 213 BOOLEAN
 214 FORCEINLINE
 215 IsListEmpty(
 216     IN const LIST_ENTRY * ListHead
 217     )
 218 {
 219     return (BOOLEAN)(ListHead->Flink == ListHead);
 220 }
 221 
 222 FORCEINLINE
 223 VOID
 224 InitializeListHead(
 225     IN PLIST_ENTRY ListHead
 226     )
 227 {
 228     ListHead->Flink = ListHead->Blink = ListHead;
 229 }
 230 
 231 FORCEINLINE
 232 VOID
 233 InsertHeadList(
 234     IN OUT PLIST_ENTRY ListHead,
 235     IN OUT PLIST_ENTRY Entry
 236     )
 237 {
 238     PLIST_ENTRY Flink;
 239 
 240     Flink = ListHead->Flink;
 241     Entry->Flink = Flink;
 242     Entry->Blink = ListHead;
 243     Flink->Blink = Entry;
 244     ListHead->Flink = Entry;
 245 }
 246 
 247 FORCEINLINE
 248 VOID
 249 InsertTailList(
 250     IN OUT PLIST_ENTRY ListHead,
 251     IN OUT PLIST_ENTRY Entry
 252     )
 253 {
 254     PLIST_ENTRY Blink;
 255 
 256     Blink = ListHead->Blink;
 257     Entry->Flink = ListHead;
 258     Entry->Blink = Blink;
 259     Blink->Flink = Entry;
 260     ListHead->Blink = Entry;
 261 }
 262 
 263 FORCEINLINE
 264 BOOLEAN
 265 RemoveEntryList(
 266     IN PLIST_ENTRY Entry
 267     )
 268 {
 269     PLIST_ENTRY Blink;
 270     PLIST_ENTRY Flink;
 271 
 272     Flink = Entry->Flink;
 273     Blink = Entry->Blink;
 274     Blink->Flink = Flink;
 275     Flink->Blink = Blink;
 276     return (BOOLEAN)(Flink == Blink);
 277 }
 278 #endif  // #if !defined(_WDMDDK_) && !defined(_LIST_ENTRY_MACROS_DEFINED_)
 279 
 280 //-----------------------------------------------------------------------------
 281 // Unicode string functions
 282 
 283 NTSYSAPI
 284 VOID
 285 NTAPI
 286 RtlInitString(
 287     PSTRING DestinationString,
 288     PCSTR SourceString
 289     );
 290 
 291 
 292 NTSYSAPI
 293 VOID
 294 NTAPI
 295 RtlInitUnicodeString(
 296     PUNICODE_STRING DestinationString,
 297     PCWSTR SourceString
 298     );
 299 
 300 
 301 NTSYSAPI
 302 BOOLEAN
 303 NTAPI
 304 RtlCreateUnicodeString(
 305     OUT PUNICODE_STRING DestinationString,
 306     IN PCWSTR SourceString
 307     );
 308 
 309 
 310 NTSYSAPI
 311 BOOLEAN
 312 NTAPI
 313 RtlCreateUnicodeStringFromAsciiz(
 314     OUT PUNICODE_STRING Destination,
 315     IN PCSTR Source
 316     );
 317 
 318 
 319 NTSYSAPI
 320 BOOLEAN
 321 NTAPI
 322 RtlPrefixUnicodeString (
 323     IN PUNICODE_STRING String1,
 324     IN PUNICODE_STRING String2,
 325     IN BOOLEAN CaseInSensitive
 326     );
 327 
 328 
 329 NTSYSAPI
 330 NTSTATUS
 331 NTAPI
 332 RtlDuplicateUnicodeString(
 333     IN  BOOLEAN AllocateNew,
 334     IN  PUNICODE_STRING SourceString,
 335     OUT PUNICODE_STRING TargetString
 336     );
 337 
 338 
 339 NTSYSAPI
 340 NTSTATUS
 341 NTAPI
 342 RtlAppendUnicodeToString (
 343     PUNICODE_STRING Destination,
 344     PCWSTR Source
 345     );
 346 
 347 
 348 NTSYSAPI
 349 NTSTATUS
 350 NTAPI
 351 RtlAppendUnicodeStringToString(
 352     IN OUT PUNICODE_STRING Destination,
 353     IN PUNICODE_STRING Source
 354     );
 355 
 356 
 357 NTSYSAPI
 358 NTSTATUS
 359 NTAPI
 360 RtlUnicodeStringToInteger (
 361     IN PUNICODE_STRING String,
 362     IN ULONG Base OPTIONAL,
 363     OUT PULONG Value
 364     );
 365 
 366 
 367 NTSYSAPI
 368 NTSTATUS
 369 NTAPI
 370 RtlIntegerToUnicodeString (
 371     IN ULONG Value,
 372     IN ULONG Base OPTIONAL,
 373     IN OUT PUNICODE_STRING String
 374     );
 375 
 376 
 377 NTSYSAPI
 378 NTSTATUS 
 379 NTAPI
 380 RtlGUIDFromString( 
 381     IN PUNICODE_STRING GuidString, 
 382     OUT GUID *Guid 
 383     );
 384 
 385 
 386 NTSYSAPI
 387 LONG
 388 NTAPI
 389 RtlCompareUnicodeString (
 390     IN PUNICODE_STRING String1,
 391     IN PUNICODE_STRING String2,
 392     IN BOOLEAN CaseInSensitive
 393     );
 394 
 395 
 396 NTSYSAPI
 397 VOID
 398 NTAPI
 399 RtlCopyUnicodeString(
 400     OUT PUNICODE_STRING DestinationString,
 401     IN PUNICODE_STRING SourceString
 402     );
 403 
 404 
 405 NTSYSAPI
 406 NTSTATUS
 407 NTAPI
 408 RtlUpcaseUnicodeString (
 409     OUT PUNICODE_STRING DestinationString,
 410     IN PUNICODE_STRING SourceString,
 411     IN BOOLEAN AllocateDestinationString
 412     );
 413 
 414 
 415 NTSYSAPI
 416 NTSTATUS
 417 NTAPI
 418 RtlDowncaseUnicodeString (
 419     OUT PUNICODE_STRING DestinationString,
 420     IN PUNICODE_STRING SourceString,
 421     IN BOOLEAN AllocateDestinationString
 422     );
 423 
 424 
 425 NTSYSAPI
 426 BOOLEAN
 427 NTAPI
 428 RtlEqualUnicodeString (
 429     IN PUNICODE_STRING String1,
 430     IN PUNICODE_STRING String2,
 431     IN BOOLEAN CaseInSensitive
 432     );
 433 
 434 
 435 NTSYSAPI
 436 VOID
 437 NTAPI
 438 RtlFreeUnicodeString(
 439     IN  PUNICODE_STRING UnicodeString
 440     );
 441 
 442 
 443 NTSYSAPI
 444 NTSTATUS
 445 NTAPI
 446 RtlAnsiStringToUnicodeString (
 447     OUT PUNICODE_STRING DestinationString,
 448     IN PANSI_STRING SourceString,
 449     IN BOOLEAN AllocateDestinationString
 450     );
 451 
 452 
 453 NTSYSAPI
 454 NTSTATUS
 455 NTAPI
 456 RtlUnicodeStringToAnsiString (
 457     OUT PANSI_STRING DestinationString,
 458     IN PUNICODE_STRING SourceString,
 459     IN BOOLEAN AllocateDestinationString
 460     );
 461 
 462 
 463 NTSYSAPI
 464 VOID
 465 NTAPI
 466 RtlInitAnsiString (
 467     OUT PANSI_STRING DestinationString,
 468     IN PCHAR SourceString
 469     );
 470 
 471 
 472 NTSYSAPI
 473 VOID
 474 NTAPI
 475 RtlFreeAnsiString (
 476     IN PANSI_STRING AnsiString
 477     );
 478 
 479 
 480 NTSYSAPI
 481 NTSTATUS
 482 NTAPI
 483 RtlFormatCurrentUserKeyPath(
 484     OUT PUNICODE_STRING CurrentUserKeyPath
 485     );
 486 
 487 
 488 NTSYSAPI
 489 VOID
 490 NTAPI
 491 RtlRaiseStatus (
 492     IN NTSTATUS Status
 493     );
 494 
 495 
 496 NTSYSAPI
 497 VOID
 498 NTAPI
 499 DbgBreakPoint(
 500     VOID
 501     );
 502 
 503 
 504 NTSYSAPI
 505 ULONG
 506 _cdecl
 507 DbgPrint (
 508     PCH Format,
 509     ...
 510     );
 511 
 512 
 513 NTSYSAPI
 514 ULONG
 515 NTAPI
 516 RtlRandom(
 517     IN OUT PULONG Seed
 518     ); 
 519 
 520 //-----------------------------------------------------------------------------
 521 // Critical section functions
 522 
 523 NTSYSAPI
 524 NTSTATUS
 525 NTAPI
 526 RtlInitializeCriticalSection(
 527     IN  PRTL_CRITICAL_SECTION CriticalSection
 528     );
 529 
 530 
 531 NTSYSAPI
 532 BOOL
 533 NTAPI
 534 RtlTryEnterCriticalSection(
 535     IN PRTL_CRITICAL_SECTION CriticalSection
 536     );
 537 
 538 
 539 NTSYSAPI
 540 NTSTATUS
 541 NTAPI
 542 RtlEnterCriticalSection(
 543     IN PRTL_CRITICAL_SECTION CriticalSection
 544     );
 545 
 546 
 547 NTSYSAPI
 548 NTSTATUS
 549 NTAPI
 550 RtlLeaveCriticalSection(
 551     IN PRTL_CRITICAL_SECTION CriticalSection
 552     );
 553 
 554 
 555 NTSYSAPI
 556 NTSTATUS
 557 NTAPI
 558 RtlDeleteCriticalSection(
 559     IN  PRTL_CRITICAL_SECTION CriticalSection
 560     );
 561 
 562 //-----------------------------------------------------------------------------
 563 // Compression and decompression
 564 
 565 NTSYSAPI
 566 NTSTATUS
 567 NTAPI
 568 RtlCompressBuffer(
 569     IN  USHORT CompressionFormatAndEngine,
 570     IN  PUCHAR UncompressedBuffer,
 571     IN  ULONG UncompressedBufferSize,
 572     OUT PUCHAR CompressedBuffer,
 573     IN  ULONG CompressedBufferSize,
 574     IN  ULONG UncompressedChunkSize,
 575     OUT PULONG FinalCompressedSize,
 576     IN  PVOID WorkSpace
 577     );
 578 
 579 
 580 NTSYSAPI
 581 NTSTATUS
 582 NTAPI
 583 RtlDecompressBuffer(
 584     IN  USHORT CompressionFormat,
 585     OUT PUCHAR UncompressedBuffer,
 586     IN  ULONG UncompressedBufferSize,
 587     IN  PUCHAR CompressedBuffer,
 588     IN  ULONG CompressedBufferSize,
 589     OUT PULONG FinalUncompressedSize 
 590     );
 591 
 592 //-----------------------------------------------------------------------------
 593 // Object functions
 594 
 595 //
 596 // Object Manager Directory Specific Access Rights.
 597 //
 598 
 599 #ifndef DIRECTORY_QUERY
 600 #define DIRECTORY_QUERY                 (0x0001)
 601 #define DIRECTORY_TRAVERSE              (0x0002)
 602 #define DIRECTORY_CREATE_OBJECT         (0x0004)
 603 #define DIRECTORY_CREATE_SUBDIRECTORY   (0x0008)
 604 #define DIRECTORY_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | 0xF)
 605 #endif
 606 
 607 typedef enum _POOL_TYPE {
 608     NonPagedPool,
 609     PagedPool,
 610     NonPagedPoolMustSucceed,
 611     DontUseThisType,
 612     NonPagedPoolCacheAligned,
 613     PagedPoolCacheAligned,
 614     NonPagedPoolCacheAlignedMustS,
 615     MaxPoolType
 616 } POOL_TYPE;
 617 
 618 
 619 //
 620 // For NtQueryObject
 621 //
 622 
 623 typedef enum _OBJECT_INFORMATION_CLASS {
 624     ObjectBasicInformation,                 // = 0x00
 625     ObjectNameInformation,                  // = 0x01
 626     ObjectTypeInformation,                  // = 0x02
 627     ObjectTypesInformation,                 // = 0x03    // object handle is ignored
 628     ObjectHandleFlagInformation             // = 0x04
 629 } OBJECT_INFORMATION_CLASS;
 630 
 631 //
 632 // NtQueryObject uses ObjectBasicInformation
 633 //
 634 
 635 typedef struct _OBJECT_BASIC_INFORMATION {
 636     ULONG Attributes;
 637     ACCESS_MASK GrantedAccess;
 638     ULONG HandleCount;
 639     ULONG PointerCount;
 640     ULONG PagedPoolCharge;
 641     ULONG NonPagedPoolCharge;
 642     ULONG Reserved[3];
 643     ULONG NameInfoSize;
 644     ULONG TypeInfoSize;
 645     ULONG SecurityDescriptorSize;
 646     LARGE_INTEGER CreationTime;
 647 } OBJECT_BASIC_INFORMATION, *POBJECT_BASIC_INFORMATION;
 648 
 649 //
 650 // NtQueryObject uses ObjectNameInformation
 651 //
 652 
 653 typedef struct _OBJECT_NAME_INFORMATION {
 654     UNICODE_STRING Name;
 655 } OBJECT_NAME_INFORMATION, *POBJECT_NAME_INFORMATION;
 656 
 657 //
 658 // NtQueryObject uses ObjectTypeInformation
 659 //
 660 
 661 typedef struct _OBJECT_TYPE_INFORMATION {
 662    UNICODE_STRING TypeName;
 663    ULONG TotalNumberOfObjects;
 664    ULONG TotalNumberOfHandles;
 665    ULONG TotalPagedPoolUsage;
 666    ULONG TotalNonPagedPoolUsage;
 667    ULONG TotalNamePoolUsage;
 668    ULONG TotalHandleTableUsage;
 669    ULONG HighWaterNumberOfObjects;
 670    ULONG HighWaterNumberOfHandles;
 671    ULONG HighWaterPagedPoolUsage;
 672    ULONG HighWaterNonPagedPoolUsage;
 673    ULONG HighWaterNamePoolUsage;
 674    ULONG HighWaterHandleTableUsage;
 675    ULONG InvalidAttributes;
 676    GENERIC_MAPPING GenericMapping;
 677    ULONG ValidAccessMask;
 678    BOOLEAN SecurityRequired;
 679    BOOLEAN MaintainHandleCount;
 680    POOL_TYPE PoolType;
 681    ULONG DefaultPagedPoolCharge;
 682    ULONG DefaultNonPagedPoolCharge;
 683 } OBJECT_TYPE_INFORMATION, *POBJECT_TYPE_INFORMATION;
 684 
 685 //
 686 // NtQueryObject uses ObjectHandleFlagInformation
 687 // NtSetInformationObject uses ObjectHandleFlagInformation
 688 //
 689 
 690 typedef struct _OBJECT_HANDLE_FLAG_INFORMATION {
 691     BOOLEAN Inherit;
 692     BOOLEAN ProtectFromClose;
 693 } OBJECT_HANDLE_FLAG_INFORMATION, *POBJECT_HANDLE_FLAG_INFORMATION;
 694 
 695 //
 696 // NtQueryDirectoryObject uses this type
 697 //
 698 
 699 typedef struct _OBJECT_DIRECTORY_INFORMATION {
 700     UNICODE_STRING Name;
 701     UNICODE_STRING TypeName;
 702 } OBJECT_DIRECTORY_INFORMATION, *POBJECT_DIRECTORY_INFORMATION;
 703 
 704 
 705 NTSYSAPI
 706 NTSTATUS
 707 NTAPI
 708 NtOpenDirectoryObject(
 709     OUT PHANDLE DirectoryHandle,
 710     IN ACCESS_MASK DesiredAccess,
 711     IN POBJECT_ATTRIBUTES ObjectAttributes
 712     );
 713 
 714 
 715 NTSYSAPI
 716 NTSTATUS
 717 NTAPI
 718 NtQueryDirectoryObject(
 719     IN HANDLE DirectoryHandle,
 720     OUT PVOID Buffer,
 721     IN ULONG Length,
 722     IN BOOLEAN ReturnSingleEntry,
 723     IN BOOLEAN RestartScan,
 724     IN OUT PULONG Context,
 725     OUT PULONG ReturnLength OPTIONAL
 726     );
 727 
 728 
 729 NTSYSAPI
 730 NTSTATUS
 731 NTAPI
 732 NtQueryObject (
 733     IN HANDLE ObjectHandle,
 734     IN OBJECT_INFORMATION_CLASS ObjectInformationClass,
 735     OUT PVOID ObjectInformation,
 736     IN ULONG Length,
 737     OUT PULONG ResultLength OPTIONAL
 738     );
 739 
 740 
 741 NTSYSAPI
 742 NTSTATUS
 743 NTAPI
 744 NtSetInformationObject (
 745     IN HANDLE ObjectHandle,
 746     IN OBJECT_INFORMATION_CLASS ObjectInformationClass,
 747     IN PVOID ObjectInformation,
 748     IN ULONG Length
 749     );
 750 
 751 
 752 NTSYSAPI
 753 NTSTATUS
 754 NTAPI
 755 NtDuplicateObject (
 756     IN HANDLE SourceProcessHandle,
 757     IN HANDLE SourceHandle,
 758     IN HANDLE TargetProcessHandle OPTIONAL,
 759     OUT PHANDLE TargetHandle OPTIONAL,
 760     IN ACCESS_MASK DesiredAccess,
 761     IN ULONG HandleAttributes,
 762     IN ULONG Options
 763     );
 764 
 765 
 766 NTSYSAPI
 767 NTSTATUS
 768 NTAPI
 769 NtQuerySecurityObject (
 770     IN HANDLE ObjectHandle,
 771     IN SECURITY_INFORMATION SecurityInformation,
 772     OUT PSECURITY_DESCRIPTOR SecurityDescriptor,
 773     IN ULONG DescriptorLength,
 774     OUT PULONG ReturnLength
 775     );
 776 
 777 
 778 NTSYSAPI
 779 NTSTATUS
 780 NTAPI
 781 ZwQuerySecurityObject (
 782     IN HANDLE ObjectHandle,
 783     IN SECURITY_INFORMATION SecurityInformation,
 784     OUT PSECURITY_DESCRIPTOR SecurityDescriptor,
 785     IN ULONG DescriptorLength,
 786     OUT PULONG ReturnLength
 787     );
 788 
 789 
 790 NTSYSAPI
 791 NTSTATUS
 792 NTAPI
 793 NtSetSecurityObject (
 794     IN HANDLE ObjectHandle,
 795     IN SECURITY_INFORMATION SecurityInformation,
 796     IN PSECURITY_DESCRIPTOR SecurityDescriptor
 797     );
 798 
 799 
 800 NTSYSAPI
 801 NTSTATUS
 802 NTAPI
 803 ZwSetSecurityObject (
 804     IN HANDLE ObjectHandle,
 805     IN SECURITY_INFORMATION SecurityInformation,
 806     IN PSECURITY_DESCRIPTOR SecurityDescriptor
 807     );
 808 
 809 
 810 NTSYSAPI
 811 NTSTATUS
 812 NTAPI
 813 NtMakeTemporaryObject(
 814     IN HANDLE ObjectHandle
 815     );
 816 
 817 
 818 NTSYSAPI
 819 NTSTATUS
 820 NTAPI
 821 ZwMakeTemporaryObject(
 822     IN HANDLE ObjectHandle
 823     );
 824 
 825 //-----------------------------------------------------------------------------
 826 // Handle table RTL functions
 827 
 828 #define LEVEL_HANDLE_ID         0x74000000
 829 #define LEVEL_HANDLE_ID_MASK    0xFF000000
 830 #define LEVEL_HANDLE_INDEX_MASK 0x00FFFFFF
 831 
 832 typedef enum _RTL_GENERIC_COMPARE_RESULTS {
 833     GenericLessThan,
 834     GenericGreaterThan,
 835     GenericEqual
 836 } RTL_GENERIC_COMPARE_RESULTS;
 837 
 838 
 839 typedef struct _RTL_SPLAY_LINKS
 840 {
 841   struct _RTL_SPLAY_LINKS *Parent;
 842   struct _RTL_SPLAY_LINKS *LeftChild;
 843   struct _RTL_SPLAY_LINKS *RightChild;
 844 } RTL_SPLAY_LINKS, *PRTL_SPLAY_LINKS;
 845 
 846 
 847 struct _RTL_GENERIC_TABLE;
 848 
 849 typedef
 850 RTL_GENERIC_COMPARE_RESULTS
 851 (NTAPI * PRTL_GENERIC_COMPARE_ROUTINE) (
 852     struct _RTL_GENERIC_TABLE *Table,
 853     PVOID FirstStruct,
 854     PVOID SecondStruct
 855     );
 856 
 857 typedef
 858 PVOID
 859 (NTAPI *PRTL_GENERIC_ALLOCATE_ROUTINE) (
 860     struct _RTL_GENERIC_TABLE *Table,
 861     ULONG ByteSize
 862     );
 863 
 864 typedef
 865 VOID
 866 (NTAPI *PRTL_GENERIC_FREE_ROUTINE) (
 867     struct _RTL_GENERIC_TABLE *Table,
 868     PVOID Buffer
 869     );
 870 
 871 
 872 typedef struct _RTL_GENERIC_TABLE {
 873     PRTL_SPLAY_LINKS TableRoot;
 874     LIST_ENTRY InsertOrderList;
 875     PLIST_ENTRY OrderedPointer;
 876     ULONG WhichOrderedElement;
 877     ULONG NumberGenericTableElements;
 878     PRTL_GENERIC_COMPARE_ROUTINE CompareRoutine;
 879     PRTL_GENERIC_ALLOCATE_ROUTINE AllocateRoutine;
 880     PRTL_GENERIC_FREE_ROUTINE FreeRoutine;
 881     PVOID TableContext;
 882 } RTL_GENERIC_TABLE, *PRTL_GENERIC_TABLE;
 883 
 884 
 885 typedef struct _RTL_HANDLE_TABLE_ENTRY
 886 {
 887    struct _RTL_HANDLE_TABLE_ENTRY *Next;    /* pointer to next free handle */
 888    PVOID  Object;
 889 
 890 } RTL_HANDLE_TABLE_ENTRY, *PRTL_HANDLE_TABLE_ENTRY;
 891 
 892 
 893 typedef struct _RTL_HANDLE_TABLE
 894 {
 895    ULONG MaximumNumberOfHandles;
 896    ULONG SizeOfHandleTableEntry;
 897    ULONG Unknown01;
 898    ULONG Unknown02;
 899    PRTL_HANDLE_TABLE_ENTRY FreeHandles;
 900    PRTL_HANDLE_TABLE_ENTRY CommittedHandles;
 901    PRTL_HANDLE_TABLE_ENTRY UnCommittedHandles;
 902    PRTL_HANDLE_TABLE_ENTRY MaxReservedHandles;
 903 } RTL_HANDLE_TABLE, *PRTL_HANDLE_TABLE;
 904 
 905 
 906 NTSYSAPI
 907 VOID
 908 NTAPI
 909 RtlInitializeGenericTable (
 910     IN PRTL_GENERIC_TABLE Table,
 911     IN PRTL_GENERIC_COMPARE_ROUTINE CompareRoutine,
 912     IN PRTL_GENERIC_ALLOCATE_ROUTINE AllocateRoutine,
 913     IN PRTL_GENERIC_FREE_ROUTINE FreeRoutine,
 914     IN PVOID TableContext
 915     );
 916 
 917 
 918 NTSYSAPI
 919 VOID
 920 NTAPI
 921 RtlInitializeHandleTable(
 922     IN ULONG MaximumNumberOfHandles,
 923     IN ULONG SizeOfHandleTableEntry,
 924     OUT PRTL_HANDLE_TABLE HandleTable
 925     );
 926 
 927 
 928 NTSYSAPI
 929 PRTL_HANDLE_TABLE_ENTRY
 930 NTAPI
 931 RtlAllocateHandle(
 932     IN PRTL_HANDLE_TABLE HandleTable,
 933     OUT PULONG HandleIndex OPTIONAL
 934     );
 935 
 936 
 937 NTSYSAPI
 938 BOOLEAN
 939 NTAPI
 940 RtlFreeHandle(
 941     IN PRTL_HANDLE_TABLE HandleTable,
 942     IN PRTL_HANDLE_TABLE_ENTRY Handle
 943     );
 944 
 945 
 946 NTSYSAPI
 947 BOOLEAN
 948 NTAPI
 949 RtlIsValidIndexHandle(
 950     IN PRTL_HANDLE_TABLE HandleTable,
 951     IN ULONG HandleIndex,
 952     OUT PRTL_HANDLE_TABLE_ENTRY *Handle
 953     );
 954 
 955 
 956 NTSYSAPI
 957 PVOID
 958 NTAPI
 959 RtlInsertElementGenericTable (
 960     IN PRTL_GENERIC_TABLE Table,
 961     IN PVOID Buffer,
 962     IN LONG BufferSize,
 963     OUT PBOOLEAN NewElement OPTIONAL
 964     );
 965 
 966 
 967 NTSYSAPI
 968 BOOLEAN
 969 NTAPI
 970 RtlIsGenericTableEmpty (
 971     IN PRTL_GENERIC_TABLE Table
 972     );
 973 
 974 
 975 NTSYSAPI
 976 BOOLEAN
 977 NTAPI
 978 RtlIsGenericTableEmpty (
 979     IN PRTL_GENERIC_TABLE Table
 980     );
 981  
 982 
 983 NTSYSAPI
 984 PVOID
 985 NTAPI
 986 RtlLookupElementGenericTable (
 987     IN PRTL_GENERIC_TABLE Table,
 988     IN PVOID Buffer
 989     );
 990 
 991 
 992 NTSYSAPI
 993 PVOID
 994 NTAPI
 995 RtlEnumerateGenericTableWithoutSplaying(
 996     IN  PRTL_GENERIC_TABLE Table,
 997     IN  PVOID *RestartKey
 998     );
 999 
1000 
1001 NTSYSAPI
1002 NTSTATUS
1003 NTAPI
1004 NtClose(
1005     IN  HANDLE Handle
1006     );
1007 
1008 
1009 NTSYSAPI
1010 NTSTATUS
1011 NTAPI
1012 ZwClose(
1013     IN  HANDLE Handle
1014     );
1015 
1016 //-----------------------------------------------------------------------------
1017 // Environment functions
1018 
1019 NTSYSAPI
1020 NTSTATUS
1021 NTAPI
1022 RtlOpenCurrentUser(
1023     IN ULONG DesiredAccess,
1024     OUT PHANDLE CurrentUserKey
1025     );
1026 
1027 
1028 NTSYSAPI
1029 NTSTATUS
1030 NTAPI
1031 RtlCreateEnvironment(
1032     BOOLEAN CloneCurrentEnvironment,
1033     PVOID *Environment
1034     );
1035 
1036 
1037 NTSYSAPI
1038 NTSTATUS
1039 NTAPI
1040 RtlQueryEnvironmentVariable_U (
1041     PVOID Environment,
1042     PUNICODE_STRING Name,
1043     PUNICODE_STRING Value
1044     );
1045 
1046 
1047 NTSYSAPI
1048 NTSTATUS
1049 NTAPI
1050 RtlSetEnvironmentVariable(
1051     PVOID *Environment,
1052     PUNICODE_STRING Name,
1053     PUNICODE_STRING Value
1054     );
1055 
1056 
1057 NTSYSAPI
1058 NTSTATUS
1059 NTAPI
1060 RtlDestroyEnvironment(
1061     PVOID Environment
1062     );
1063 
1064 //-----------------------------------------------------------------------------
1065 // Registry functions
1066 
1067 
1068 typedef enum _KEY_INFORMATION_CLASS
1069 {
1070     KeyBasicInformation,                    // 0x00
1071     KeyNodeInformation,                     // 0x01
1072     KeyFullInformation,                     // 0x02
1073     KeyNameInformation,                     // 0x03
1074     KeyCachedInformation,                   // 0x04
1075     KeyFlagsInformation,                    // 0x05
1076     MaxKeyInfoClass                         // MaxKeyInfoClass should always be the last enum
1077 
1078 } KEY_INFORMATION_CLASS;
1079 
1080 //
1081 // Key query structures
1082 //
1083 
1084 typedef struct _KEY_BASIC_INFORMATION
1085 {
1086     LARGE_INTEGER LastWriteTime;
1087     ULONG   TitleIndex;
1088     ULONG   NameLength;
1089     WCHAR   Name[1];            // Variable length string
1090 
1091 } KEY_BASIC_INFORMATION, *PKEY_BASIC_INFORMATION;
1092 
1093 
1094 typedef struct _KEY_NODE_INFORMATION
1095 {
1096     LARGE_INTEGER LastWriteTime;
1097     ULONG   TitleIndex;
1098     ULONG   ClassOffset;
1099     ULONG   ClassLength;
1100     ULONG   NameLength;
1101     WCHAR   Name[1];            // Variable length string
1102 //          Class[1];           // Variable length string not declared
1103 } KEY_NODE_INFORMATION, *PKEY_NODE_INFORMATION;
1104 
1105 
1106 typedef struct _KEY_FULL_INFORMATION
1107 {
1108     LARGE_INTEGER LastWriteTime;
1109     ULONG   TitleIndex;
1110     ULONG   ClassOffset;
1111     ULONG   ClassLength;
1112     ULONG   SubKeys;
1113     ULONG   MaxNameLen;
1114     ULONG   MaxClassLen;
1115     ULONG   Values;
1116     ULONG   MaxValueNameLen;
1117     ULONG   MaxValueDataLen;
1118     WCHAR   Class[1];           // Variable length
1119 
1120 } KEY_FULL_INFORMATION, *PKEY_FULL_INFORMATION;
1121 
1122 
1123 // end_wdm
1124 typedef struct _KEY_NAME_INFORMATION
1125 {
1126     ULONG   NameLength;
1127     WCHAR   Name[1];            // Variable length string
1128 
1129 } KEY_NAME_INFORMATION, *PKEY_NAME_INFORMATION;
1130 
1131 typedef struct _KEY_CACHED_INFORMATION
1132 {
1133     LARGE_INTEGER LastWriteTime;
1134     ULONG   TitleIndex;
1135     ULONG   SubKeys;
1136     ULONG   MaxNameLen;
1137     ULONG   Values;
1138     ULONG   MaxValueNameLen;
1139     ULONG   MaxValueDataLen;
1140     ULONG   NameLength;
1141     WCHAR   Name[1];            // Variable length string
1142 
1143 } KEY_CACHED_INFORMATION, *PKEY_CACHED_INFORMATION;
1144 
1145 
1146 typedef struct _KEY_FLAGS_INFORMATION
1147 {
1148     ULONG   UserFlags;
1149 
1150 } KEY_FLAGS_INFORMATION, *PKEY_FLAGS_INFORMATION;
1151 
1152 
1153 
1154 typedef enum _KEY_VALUE_INFORMATION_CLASS {
1155     KeyValueBasicInformation,               // 0x00
1156     KeyValueFullInformation,                // 0x01
1157     KeyValuePartialInformation,             // 0x02
1158     KeyValueFullInformationAlign64,         // 0x03
1159     KeyValuePartialInformationAlign64,      // 0x04
1160     MaxKeyValueInfoClass                    // MaxKeyValueInfoClass should always be the last enum
1161 } KEY_VALUE_INFORMATION_CLASS;
1162 
1163 typedef struct _KEY_VALUE_BASIC_INFORMATION
1164 {
1165     ULONG TitleIndex;
1166     ULONG Type;
1167     ULONG NameLength;
1168     WCHAR Name[1];  //  Variable size
1169 } KEY_VALUE_BASIC_INFORMATION, *PKEY_VALUE_BASIC_INFORMATION;
1170 
1171 typedef struct _KEY_VALUE_FULL_INFORMATION 
1172 {
1173     ULONG TitleIndex;
1174     ULONG Type;
1175     ULONG DataOffset;
1176     ULONG DataLength;
1177     ULONG NameLength;
1178     WCHAR Name[1];            // Variable size
1179 //        Data[1];            // Variable size data not declared
1180 } KEY_VALUE_FULL_INFORMATION, *PKEY_VALUE_FULL_INFORMATION;
1181 
1182 
1183 typedef struct _KEY_VALUE_PARTIAL_INFORMATION {
1184     ULONG   TitleIndex;
1185     ULONG   Type;
1186     ULONG   DataLength;
1187     UCHAR   Data[1];            // Variable size
1188 } KEY_VALUE_PARTIAL_INFORMATION, *PKEY_VALUE_PARTIAL_INFORMATION;
1189 
1190 
1191 
1192 NTSYSAPI
1193 NTSTATUS
1194 NTAPI
1195 NtCreateKey(
1196     OUT PHANDLE KeyHandle,
1197     IN  ACCESS_MASK DesiredAccess,
1198     IN  POBJECT_ATTRIBUTES ObjectAttributes,
1199     IN  ULONG TitleIndex,
1200     IN  PUNICODE_STRING Class OPTIONAL,
1201     IN  ULONG CreateOptions,
1202     OUT PULONG Disposition OPTIONAL
1203     );
1204 
1205 
1206 NTSYSAPI
1207 NTSTATUS
1208 NTAPI
1209 NtOpenKey(
1210     OUT PHANDLE KeyHandle,
1211     IN ACCESS_MASK DesiredAccess,
1212     IN POBJECT_ATTRIBUTES ObjectAttributes
1213     );
1214 
1215 
1216 NTSYSAPI
1217 NTSTATUS
1218 NTAPI
1219 NtEnumerateKey(
1220     IN HANDLE KeyHandle,
1221     IN ULONG Index,
1222     IN KEY_INFORMATION_CLASS KeyInformationClass,
1223     IN PVOID KeyInformation,
1224     IN ULONG Length,
1225     IN PULONG ResultLength
1226     );
1227 
1228 
1229 NTSYSAPI
1230 NTSTATUS
1231 NTAPI
1232 ZwEnumerateKey(
1233     IN HANDLE KeyHandle,
1234     IN ULONG Index,
1235     IN KEY_INFORMATION_CLASS KeyInformationClass,
1236     IN PVOID KeyInformation,
1237     IN ULONG Length,
1238     IN PULONG ResultLength
1239     );
1240 
1241 
1242 NTSYSAPI
1243 NTSTATUS
1244 NTAPI
1245 NtEnumerateValueKey(
1246     IN HANDLE KeyHandle,
1247     IN ULONG Index,
1248     IN KEY_VALUE_INFORMATION_CLASS KeyValueInformationClass,
1249     OUT PVOID  KeyValueInformation,
1250     IN  ULONG  Length,
1251     OUT PULONG  ResultLength
1252     );
1253 
1254 
1255 NTSYSAPI
1256 NTSTATUS
1257 NTAPI
1258 ZwEnumerateValueKey(
1259     IN HANDLE KeyHandle,
1260     IN ULONG Index,
1261     IN KEY_VALUE_INFORMATION_CLASS KeyValueInformationClass,
1262     OUT PVOID  KeyValueInformation,
1263     IN  ULONG  Length,
1264     OUT PULONG  ResultLength
1265     );
1266 
1267 
1268 NTSYSAPI
1269 NTSTATUS
1270 NTAPI
1271 NtDeleteKey(
1272     IN HANDLE KeyHandle
1273     );
1274 
1275 
1276 NTSYSAPI
1277 NTSTATUS
1278 NTAPI
1279 NtQueryKey(
1280     IN  HANDLE KeyHandle,
1281     IN  KEY_INFORMATION_CLASS KeyInformationClass,
1282     OUT PVOID KeyInformation OPTIONAL,
1283     IN  ULONG Length,
1284     OUT PULONG ResultLength    
1285     );
1286 
1287 
1288 NTSYSAPI
1289 NTSTATUS
1290 NTAPI
1291 NtQueryValueKey(
1292     IN HANDLE KeyHandle,
1293     IN PUNICODE_STRING ValueName,
1294     IN KEY_VALUE_INFORMATION_CLASS KeyValueInformationClass,
1295     OUT PVOID KeyValueInformation,
1296     IN ULONG Length,
1297     OUT PULONG ResultLength
1298     );
1299 
1300 
1301 NTSYSAPI
1302 NTSTATUS
1303 NTAPI
1304 NtSetValueKey(
1305     IN HANDLE KeyHandle,
1306     IN PUNICODE_STRING ValueName,
1307     IN ULONG TitleIndex OPTIONAL,
1308     IN ULONG Type,
1309     IN PVOID Data,
1310     IN ULONG DataSize
1311     );
1312 
1313 
1314 NTSYSAPI
1315 NTSTATUS
1316 NTAPI
1317 NtDeleteValueKey(
1318     IN HANDLE KeyHandle,
1319     IN PUNICODE_STRING ValueName
1320     );
1321 
1322 
1323 NTSYSAPI
1324 NTSTATUS
1325 NTAPI
1326 NtFlushKey(
1327     IN HANDLE KeyHandle
1328     );
1329 
1330 //-----------------------------------------------------------------------------
1331 // RtlQueryRegistryValues
1332 
1333 //
1334 // The following flags specify how the Name field of a RTL_QUERY_REGISTRY_TABLE
1335 // entry is interpreted.  A NULL name indicates the end of the table.
1336 //
1337 
1338 #define RTL_QUERY_REGISTRY_SUBKEY   0x00000001  // Name is a subkey and remainder of
1339                                                 // table or until next subkey are value
1340                                                 // names for that subkey to look at.
1341 
1342 #define RTL_QUERY_REGISTRY_TOPKEY   0x00000002  // Reset current key to original key for
1343                                                 // this and all following table entries.
1344 
1345 #define RTL_QUERY_REGISTRY_REQUIRED 0x00000004  // Fail if no match found for this table
1346                                                 // entry.
1347 
1348 #define RTL_QUERY_REGISTRY_NOVALUE  0x00000008  // Used to mark a table entry that has no
1349                                                 // value name, just wants a call out, not
1350                                                 // an enumeration of all values.
1351 
1352 #define RTL_QUERY_REGISTRY_NOEXPAND 0x00000010  // Used to suppress the expansion of
1353                                                 // REG_MULTI_SZ into multiple callouts or
1354                                                 // to prevent the expansion of environment
1355                                                 // variable values in REG_EXPAND_SZ
1356 
1357 #define RTL_QUERY_REGISTRY_DIRECT   0x00000020  // QueryRoutine field ignored.  EntryContext
1358                                                 // field points to location to store value.
1359                                                 // For null terminated strings, EntryContext
1360                                                 // points to UNICODE_STRING structure that
1361                                                 // that describes maximum size of buffer.
1362                                                 // If .Buffer field is NULL then a buffer is
1363                                                 // allocated.
1364                                                 //
1365 
1366 #define RTL_QUERY_REGISTRY_DELETE   0x00000040  // Used to delete value keys after they
1367                                                 // are queried.
1368 
1369 
1370 //
1371 // The following values for the RelativeTo parameter determine what the
1372 // Path parameter to RtlQueryRegistryValues is relative to.
1373 //
1374 
1375 #define RTL_REGISTRY_ABSOLUTE     0             // Path is a full path
1376 #define RTL_REGISTRY_SERVICES     1             // \Registry\Machine\System\CurrentControlSet\Services
1377 #define RTL_REGISTRY_CONTROL      2             // \Registry\Machine\System\CurrentControlSet\Control
1378 #define RTL_REGISTRY_WINDOWS_NT   3             // \Registry\Machine\Software\Microsoft\Windows NT\CurrentVersion
1379 #define RTL_REGISTRY_DEVICEMAP    4             // \Registry\Machine\Hardware\DeviceMap
1380 #define RTL_REGISTRY_USER         5             // \Registry\User\CurrentUser
1381 #define RTL_REGISTRY_MAXIMUM      6
1382 #define RTL_REGISTRY_HANDLE       0x40000000    // Low order bits are registry handle
1383 #define RTL_REGISTRY_OPTIONAL     0x80000000    // Indicates the key node is optional
1384 
1385 
1386 typedef NTSTATUS (NTAPI * PRTL_QUERY_REGISTRY_ROUTINE)(
1387     IN PWSTR ValueName,
1388     IN ULONG ValueType,
1389     IN PVOID ValueData,
1390     IN ULONG ValueLength,
1391     IN PVOID Context,
1392     IN PVOID EntryContext
1393     );
1394 
1395 typedef struct _RTL_QUERY_REGISTRY_TABLE
1396 {
1397     PRTL_QUERY_REGISTRY_ROUTINE QueryRoutine;
1398     ULONG Flags;
1399     PWSTR Name;
1400     PVOID EntryContext;
1401     ULONG DefaultType;
1402     PVOID DefaultData;
1403     ULONG DefaultLength;
1404 
1405 } RTL_QUERY_REGISTRY_TABLE, *PRTL_QUERY_REGISTRY_TABLE;
1406 
1407 
1408 NTSYSAPI
1409 NTSTATUS 
1410 NTAPI
1411 RtlQueryRegistryValues(
1412     IN ULONG  RelativeTo,
1413     IN PCWSTR  Path,
1414     IN PRTL_QUERY_REGISTRY_TABLE  QueryTable,
1415     IN PVOID  Context,
1416     IN PVOID  Environment OPTIONAL
1417     );
1418 
1419 
1420 //-----------------------------------------------------------------------------
1421 // Query system information
1422 
1423 typedef enum _SYSTEM_INFORMATION_CLASS
1424 {
1425     SystemBasicInformation,                         // 0x00 SYSTEM_BASIC_INFORMATION
1426     SystemProcessorInformation,                     // 0x01 SYSTEM_PROCESSOR_INFORMATION
1427     SystemPerformanceInformation,                   // 0x02
1428     SystemTimeOfDayInformation,                     // 0x03
1429     SystemPathInformation,                          // 0x04
1430     SystemProcessInformation,                       // 0x05
1431     SystemCallCountInformation,                     // 0x06
1432     SystemDeviceInformation,                        // 0x07
1433     SystemProcessorPerformanceInformation,          // 0x08
1434     SystemFlagsInformation,                         // 0x09
1435     SystemCallTimeInformation,                      // 0x0A
1436     SystemModuleInformation,                        // 0x0B SYSTEM_MODULE_INFORMATION
1437     SystemLocksInformation,                         // 0x0C
1438     SystemStackTraceInformation,                    // 0x0D
1439     SystemPagedPoolInformation,                     // 0x0E
1440     SystemNonPagedPoolInformation,                  // 0x0F
1441     SystemHandleInformation,                        // 0x10
1442     SystemObjectInformation,                        // 0x11
1443     SystemPageFileInformation,                      // 0x12
1444     SystemVdmInstemulInformation,                   // 0x13
1445     SystemVdmBopInformation,                        // 0x14
1446     SystemFileCacheInformation,                     // 0x15
1447     SystemPoolTagInformation,                       // 0x16
1448     SystemInterruptInformation,                     // 0x17
1449     SystemDpcBehaviorInformation,                   // 0x18
1450     SystemFullMemoryInformation,                    // 0x19
1451     SystemLoadGdiDriverInformation,                 // 0x1A
1452     SystemUnloadGdiDriverInformation,               // 0x1B
1453     SystemTimeAdjustmentInformation,                // 0x1C
1454     SystemSummaryMemoryInformation,                 // 0x1D
1455     SystemMirrorMemoryInformation,                  // 0x1E
1456     SystemPerformanceTraceInformation,              // 0x1F
1457     SystemObsolete0,                                // 0x20
1458     SystemExceptionInformation,                     // 0x21
1459     SystemCrashDumpStateInformation,                // 0x22
1460     SystemKernelDebuggerInformation,                // 0x23
1461     SystemContextSwitchInformation,                 // 0x24
1462     SystemRegistryQuotaInformation,                 // 0x25
1463     SystemExtendServiceTableInformation,            // 0x26
1464     SystemPrioritySeperation,                       // 0x27
1465     SystemPlugPlayBusInformation,                   // 0x28
1466     SystemDockInformation,                          // 0x29
1467     SystemPowerInformationNative,                   // 0x2A
1468     SystemProcessorSpeedInformation,                // 0x2B
1469     SystemCurrentTimeZoneInformation,               // 0x2C
1470     SystemLookasideInformation,                     // 0x2D
1471     SystemTimeSlipNotification,                     // 0x2E
1472     SystemSessionCreate,                            // 0x2F
1473     SystemSessionDetach,                            // 0x30
1474     SystemSessionInformation,                       // 0x31
1475     SystemRangeStartInformation,                    // 0x32
1476     SystemVerifierInformation,                      // 0x33
1477     SystemAddVerifier,                              // 0x34
1478     SystemSessionProcessesInformation,              // 0x35
1479     SystemLoadGdiDriverInSystemSpaceInformation,    // 0x36
1480     SystemNumaProcessorMap,                         // 0x37
1481     SystemPrefetcherInformation,                    // 0x38
1482     SystemExtendedProcessInformation,               // 0x39
1483     SystemRecommendedSharedDataAlignment,           // 0x3A
1484     SystemComPlusPackage,                           // 0x3B
1485     SystemNumaAvailableMemory,                      // 0x3C
1486     SystemProcessorPowerInformation,                // 0x3D
1487     SystemEmulationBasicInformation,                // 0x3E
1488     SystemEmulationProcessorInformation,            // 0x3F
1489     SystemExtendedHanfleInformation,                // 0x40
1490     SystemLostDelayedWriteInformation,              // 0x41
1491     SystemBigPoolInformation,                       // 0x42
1492     SystemSessionPoolTagInformation,                // 0x43
1493     SystemSessionMappedViewInformation,             // 0x44
1494     SystemHotpatchInformation,                      // 0x45
1495     SystemObjectSecurityMode,                       // 0x46
1496     SystemWatchDogTimerHandler,                     // 0x47
1497     SystemWatchDogTimerInformation,                 // 0x48
1498     SystemLogicalProcessorInformation,              // 0x49
1499     SystemWo64SharedInformationObosolete,           // 0x4A
1500     SystemRegisterFirmwareTableInformationHandler,  // 0x4B
1501     SystemFirmwareTableInformation,                 // 0x4C
1502     SystemModuleInformationEx,                      // 0x4D
1503     SystemVerifierTriageInformation,                // 0x4E
1504     SystemSuperfetchInformation,                    // 0x4F
1505     SystemMemoryListInformation,                    // 0x50
1506     SystemFileCacheInformationEx,                   // 0x51
1507     SystemThreadPriorityClientIdInformation,        // 0x52
1508     SystemProcessorIdleCycleTimeInformation,        // 0x53
1509     SystemVerifierCancellationInformation,          // 0x54
1510     SystemProcessorPowerInformationEx,              // 0x55
1511     SystemRefTraceInformation,                      // 0x56
1512     SystemSpecialPoolInformation,                   // 0x57
1513     SystemProcessIdInformation,                     // 0x58
1514     SystemErrorPortInformation,                     // 0x59
1515     SystemBootEnvironmentInformation,               // 0x5A SYSTEM_BOOT_ENVIRONMENT_INFORMATION
1516     SystemHypervisorInformation,                    // 0x5B
1517     SystemVerifierInformationEx,                    // 0x5C
1518     SystemTimeZoneInformation,                      // 0x5D
1519     SystemImageFileExecutionOptionsInformation,     // 0x5E
1520     SystemCoverageInformation,                      // 0x5F
1521     SystemPrefetchPathInformation,                  // 0x60
1522     SystemVerifierFaultsInformation,                // 0x61
1523     MaxSystemInfoClass                              // 0x67
1524                                                     
1525 } SYSTEM_INFORMATION_CLASS, *PSYSTEM_INFORMATION_CLASS;
1526                                                     
1527 //                                                  
1528 // Thread priority                                  
1529 //                                                  
1530                                                     
1531 typedef LONG KPRIORITY;
1532 
1533 //
1534 // Basic System information 
1535 // NtQuerySystemInformation with SystemBasicInformation
1536 //
1537 
1538 typedef struct _SYSTEM_BASIC_INFORMATION {
1539     ULONG Reserved;
1540     ULONG TimerResolution;
1541     ULONG PageSize;
1542     ULONG NumberOfPhysicalPages;
1543     ULONG LowestPhysicalPageNumber;
1544     ULONG HighestPhysicalPageNumber;
1545     ULONG AllocationGranularity;
1546     ULONG MinimumUserModeAddress;
1547     ULONG MaximumUserModeAddress;
1548     KAFFINITY ActiveProcessorsAffinityMask;
1549     CCHAR NumberOfProcessors;
1550 } SYSTEM_BASIC_INFORMATION, *PSYSTEM_BASIC_INFORMATION; 
1551 
1552 //
1553 // Processor information
1554 // NtQuerySystemInformation with SystemProcessorInformation
1555 //
1556 
1557 typedef struct _SYSTEM_PROCESSOR_INFORMATION {
1558     USHORT ProcessorArchitecture;
1559     USHORT ProcessorLevel;
1560     USHORT ProcessorRevision;
1561     USHORT Reserved;
1562     ULONG ProcessorFeatureBits;
1563 } SYSTEM_PROCESSOR_INFORMATION, *PSYSTEM_PROCESSOR_INFORMATION;
1564 
1565 //
1566 // Performance information
1567 // NtQuerySystemInformation with SystemPerformanceInformation
1568 //
1569 
1570 typedef struct _SYSTEM_PERFORMANCE_INFORMATION {
1571     LARGE_INTEGER IdleProcessTime;
1572     LARGE_INTEGER IoReadTransferCount;
1573     LARGE_INTEGER IoWriteTransferCount;
1574     LARGE_INTEGER IoOtherTransferCount;
1575     ULONG IoReadOperationCount;
1576     ULONG IoWriteOperationCount;
1577     ULONG IoOtherOperationCount;
1578     ULONG AvailablePages;
1579     ULONG CommittedPages;
1580     ULONG CommitLimit;
1581     ULONG PeakCommitment;
1582     ULONG PageFaultCount;
1583     ULONG CopyOnWriteCount;
1584     ULONG TransitionCount;
1585     ULONG CacheTransitionCount;
1586     ULONG DemandZeroCount;
1587     ULONG PageReadCount;
1588     ULONG PageReadIoCount;
1589     ULONG CacheReadCount;
1590     ULONG CacheIoCount;
1591     ULONG DirtyPagesWriteCount;
1592     ULONG DirtyWriteIoCount;
1593     ULONG MappedPagesWriteCount;
1594     ULONG MappedWriteIoCount;
1595     ULONG PagedPoolPages;
1596     ULONG NonPagedPoolPages;
1597     ULONG PagedPoolAllocs;
1598     ULONG PagedPoolFrees;
1599     ULONG NonPagedPoolAllocs;
1600     ULONG NonPagedPoolFrees;
1601     ULONG FreeSystemPtes;
1602     ULONG ResidentSystemCodePage;
1603     ULONG TotalSystemDriverPages;
1604     ULONG TotalSystemCodePages;
1605     ULONG NonPagedPoolLookasideHits;
1606     ULONG PagedPoolLookasideHits;
1607     ULONG Spare3Count;
1608     ULONG ResidentSystemCachePage;
1609     ULONG ResidentPagedPoolPage;
1610     ULONG ResidentSystemDriverPage;
1611     ULONG CcFastReadNoWait;
1612     ULONG CcFastReadWait;
1613     ULONG CcFastReadResourceMiss;
1614     ULONG CcFastReadNotPossible;
1615     ULONG CcFastMdlReadNoWait;
1616     ULONG CcFastMdlReadWait;
1617     ULONG CcFastMdlReadResourceMiss;
1618     ULONG CcFastMdlReadNotPossible;
1619     ULONG CcMapDataNoWait;
1620     ULONG CcMapDataWait;
1621     ULONG CcMapDataNoWaitMiss;
1622     ULONG CcMapDataWaitMiss;
1623     ULONG CcPinMappedDataCount;
1624     ULONG CcPinReadNoWait;
1625     ULONG CcPinReadWait;
1626     ULONG CcPinReadNoWaitMiss;
1627     ULONG CcPinReadWaitMiss;
1628     ULONG CcCopyReadNoWait;
1629     ULONG CcCopyReadWait;
1630     ULONG CcCopyReadNoWaitMiss;
1631     ULONG CcCopyReadWaitMiss;
1632     ULONG CcMdlReadNoWait;
1633     ULONG CcMdlReadWait;
1634     ULONG CcMdlReadNoWaitMiss;
1635     ULONG CcMdlReadWaitMiss;
1636     ULONG CcReadAheadIos;
1637     ULONG CcLazyWriteIos;
1638     ULONG CcLazyWritePages;
1639     ULONG CcDataFlushes;
1640     ULONG CcDataPages;
1641     ULONG ContextSwitches;
1642     ULONG FirstLevelTbFills;
1643     ULONG SecondLevelTbFills;
1644     ULONG SystemCalls;
1645 } SYSTEM_PERFORMANCE_INFORMATION, *PSYSTEM_PERFORMANCE_INFORMATION;
1646 
1647 //
1648 // Time of Day information
1649 // NtQuerySystemInformation with SystemTimeOfDayInformation
1650 //
1651 
1652 typedef struct _SYSTEM_TIMEOFDAY_INFORMATION {
1653     LARGE_INTEGER BootTime;
1654     LARGE_INTEGER CurrentTime;
1655     LARGE_INTEGER TimeZoneBias;
1656     ULONG TimeZoneId;
1657     ULONG Reserved;
1658 } SYSTEM_TIMEOFDAY_INFORMATION, *PSYSTEM_TIMEOFDAY_INFORMATION;
1659 
1660 //
1661 // Process information
1662 // NtQuerySystemInformation with SystemProcessInformation
1663 //
1664 
1665 typedef struct _SYSTEM_PROCESS_INFORMATION {
1666     ULONG NextEntryOffset;
1667     ULONG NumberOfThreads;
1668     LARGE_INTEGER SpareLi1;
1669     LARGE_INTEGER SpareLi2;
1670     LARGE_INTEGER SpareLi3;
1671     LARGE_INTEGER CreateTime;
1672     LARGE_INTEGER UserTime;
1673     LARGE_INTEGER KernelTime;
1674     UNICODE_STRING ImageName;
1675     KPRIORITY BasePriority;
1676     ULONG_PTR UniqueProcessId;
1677     ULONG_PTR InheritedFromUniqueProcessId;
1678     ULONG HandleCount;
1679     // Next part is platform dependent
1680 
1681 } SYSTEM_PROCESS_INFORMATION, *PSYSTEM_PROCESS_INFORMATION;
1682 
1683 //
1684 // Device information
1685 // NtQuerySystemInformation with SystemDeviceInformation
1686 //
1687 
1688 typedef struct _SYSTEM_DEVICE_INFORMATION {
1689     ULONG NumberOfDisks;
1690     ULONG NumberOfFloppies;
1691     ULONG NumberOfCdRoms;
1692     ULONG NumberOfTapes;
1693     ULONG NumberOfSerialPorts;
1694     ULONG NumberOfParallelPorts;
1695 } SYSTEM_DEVICE_INFORMATION, *PSYSTEM_DEVICE_INFORMATION;
1696 
1697 //
1698 // Processor performance information
1699 // NtQuerySystemInformation with SystemProcessorPerformanceInformation
1700 //
1701 
1702 typedef struct _SYSTEM_PROCESSOR_PERFORMANCE_INFORMATION {
1703     LARGE_INTEGER IdleTime;
1704     LARGE_INTEGER KernelTime;
1705     LARGE_INTEGER UserTime;
1706     LARGE_INTEGER DpcTime;          // DEVL only
1707     LARGE_INTEGER InterruptTime;    // DEVL only
1708     ULONG InterruptCount;
1709 } SYSTEM_PROCESSOR_PERFORMANCE_INFORMATION, *PSYSTEM_PROCESSOR_PERFORMANCE_INFORMATION;
1710 
1711 //
1712 // NT Global Flag information
1713 // NtQuerySystemInformation with SystemFlagsInformation
1714 //
1715 
1716 typedef struct _SYSTEM_FLAGS_INFORMATION
1717 {
1718     ULONG GlobalFlag;
1719         
1720 } SYSTEM_FLAGS_INFORMATION, *PSYSTEM_FLAGS_INFORMATION;
1721 
1722 //
1723 // System Module information 
1724 // NtQuerySystemInformation with SystemModuleInformation
1725 //
1726 
1727 typedef struct _SYSTEM_MODULE
1728 {
1729     HANDLE Section;                 // Not filled in
1730     PVOID  MappedBase;
1731     PVOID  ImageBase;
1732     ULONG  ImageSize;
1733     ULONG  Flags;
1734     USHORT LoadOrderIndex;
1735     USHORT InitOrderIndex;
1736     USHORT LoadCount;
1737     USHORT OffsetToFileName;
1738     CHAR   ImageName[256];
1739 
1740 } SYSTEM_MODULE, *PSYSTEM_MODULE;
1741 
1742 
1743 typedef struct _SYSTEM_MODULE_INFORMATION
1744 {
1745     ULONG         ModulesCount;
1746     SYSTEM_MODULE Modules[1];
1747 
1748 } SYSTEM_MODULE_INFORMATION, *PSYSTEM_MODULE_INFORMATION;
1749 
1750 /*
1751 typedef struct _SYSTEM_VDM_INSTEMUL_INFO {
1752     ULONG SegmentNotPresent ;
1753     ULONG VdmOpcode0F       ;
1754     ULONG OpcodeESPrefix    ;
1755     ULONG OpcodeCSPrefix    ;
1756     ULONG OpcodeSSPrefix    ;
1757     ULONG OpcodeDSPrefix    ;
1758     ULONG OpcodeFSPrefix    ;
1759     ULONG OpcodeGSPrefix    ;
1760     ULONG OpcodeOPER32Prefix;
1761     ULONG OpcodeADDR32Prefix;
1762     ULONG OpcodeINSB        ;
1763     ULONG OpcodeINSW        ;
1764     ULONG OpcodeOUTSB       ;
1765     ULONG OpcodeOUTSW       ;
1766     ULONG OpcodePUSHF       ;
1767     ULONG OpcodePOPF        ;
1768     ULONG OpcodeINTnn       ;
1769     ULONG OpcodeINTO        ;
1770     ULONG OpcodeIRET        ;
1771     ULONG OpcodeINBimm      ;
1772     ULONG OpcodeINWimm      ;
1773     ULONG OpcodeOUTBimm     ;
1774     ULONG OpcodeOUTWimm     ;
1775     ULONG OpcodeINB         ;
1776     ULONG OpcodeINW         ;
1777     ULONG OpcodeOUTB        ;
1778     ULONG OpcodeOUTW        ;
1779     ULONG OpcodeLOCKPrefix  ;
1780     ULONG OpcodeREPNEPrefix ;
1781     ULONG OpcodeREPPrefix   ;
1782     ULONG OpcodeHLT         ;
1783     ULONG OpcodeCLI         ;
1784     ULONG OpcodeSTI         ;
1785     ULONG BopCount          ;
1786 } SYSTEM_VDM_INSTEMUL_INFO, *PSYSTEM_VDM_INSTEMUL_INFO;
1787 
1788 
1789 typedef struct _SYSTEM_QUERY_TIME_ADJUST_INFORMATION {
1790     ULONG TimeAdjustment;
1791     ULONG TimeIncrement;
1792     BOOLEAN Enable;
1793 } SYSTEM_QUERY_TIME_ADJUST_INFORMATION, *PSYSTEM_QUERY_TIME_ADJUST_INFORMATION;
1794 
1795 typedef struct _SYSTEM_SET_TIME_ADJUST_INFORMATION {
1796     ULONG TimeAdjustment;
1797     BOOLEAN Enable;
1798 } SYSTEM_SET_TIME_ADJUST_INFORMATION, *PSYSTEM_SET_TIME_ADJUST_INFORMATION;
1799 
1800 
1801 typedef struct _SYSTEM_THREAD_INFORMATION {
1802     LARGE_INTEGER KernelTime;
1803     LARGE_INTEGER UserTime;
1804     LARGE_INTEGER CreateTime;
1805     ULONG WaitTime;
1806     PVOID StartAddress;
1807     CLIENT_ID ClientId;
1808     KPRIORITY Priority;
1809     LONG BasePriority;
1810     ULONG ContextSwitches;
1811     ULONG ThreadState;
1812     ULONG WaitReason;
1813 } SYSTEM_THREAD_INFORMATION, *PSYSTEM_THREAD_INFORMATION;
1814 
1815 typedef struct _SYSTEM_MEMORY_INFO {
1816     PUCHAR StringOffset;
1817     USHORT ValidCount;
1818     USHORT TransitionCount;
1819     USHORT ModifiedCount;
1820     USHORT PageTableCount;
1821 } SYSTEM_MEMORY_INFO, *PSYSTEM_MEMORY_INFO;
1822 
1823 typedef struct _SYSTEM_MEMORY_INFORMATION {
1824     ULONG InfoSize;
1825     ULONG StringStart;
1826     SYSTEM_MEMORY_INFO Memory[1];
1827 } SYSTEM_MEMORY_INFORMATION, *PSYSTEM_MEMORY_INFORMATION;
1828 
1829 typedef struct _SYSTEM_CALL_COUNT_INFORMATION {
1830     ULONG Length;
1831     ULONG NumberOfTables;
1832     //ULONG NumberOfEntries[NumberOfTables];
1833     //ULONG CallCounts[NumberOfTables][NumberOfEntries];
1834 } SYSTEM_CALL_COUNT_INFORMATION, *PSYSTEM_CALL_COUNT_INFORMATION;
1835 
1836 typedef struct _SYSTEM_CRASH_DUMP_INFORMATION {
1837     HANDLE CrashDumpSection;
1838 } SYSTEM_CRASH_DUMP_INFORMATION, *PSYSTEM_CRASH_DUMP_INFORMATION;
1839 
1840 typedef struct _SYSTEM_EXCEPTION_INFORMATION {
1841     ULONG AlignmentFixupCount;
1842     ULONG ExceptionDispatchCount;
1843     ULONG FloatingEmulationCount;
1844     ULONG ByteWordEmulationCount;
1845 } SYSTEM_EXCEPTION_INFORMATION, *PSYSTEM_EXCEPTION_INFORMATION;
1846 
1847 typedef struct _SYSTEM_CRASH_STATE_INFORMATION {
1848     ULONG ValidCrashDump;
1849 } SYSTEM_CRASH_STATE_INFORMATION, *PSYSTEM_CRASH_STATE_INFORMATION;
1850 
1851 typedef struct _SYSTEM_KERNEL_DEBUGGER_INFORMATION {
1852     BOOLEAN KernelDebuggerEnabled;
1853     BOOLEAN KernelDebuggerNotPresent;
1854 } SYSTEM_KERNEL_DEBUGGER_INFORMATION, *PSYSTEM_KERNEL_DEBUGGER_INFORMATION;
1855 
1856 typedef struct _SYSTEM_REGISTRY_QUOTA_INFORMATION {
1857     ULONG RegistryQuotaAllowed;
1858     ULONG RegistryQuotaUsed;
1859     ULONG PagedPoolSize;
1860 } SYSTEM_REGISTRY_QUOTA_INFORMATION, *PSYSTEM_REGISTRY_QUOTA_INFORMATION;
1861 */
1862 
1863 typedef struct _SYSTEM_GDI_DRIVER_INFORMATION {
1864     UNICODE_STRING DriverName;
1865     PVOID ImageAddress;
1866     PVOID SectionPointer;
1867     PVOID EntryPoint;
1868     PIMAGE_EXPORT_DIRECTORY ExportSectionPointer;
1869     ULONG ImageLength;
1870 } SYSTEM_GDI_DRIVER_INFORMATION, *PSYSTEM_GDI_DRIVER_INFORMATION;
1871 
1872 typedef struct _SYSTEM_BOOT_ENVIRONMENT_INFORMATION {
1873     GUID  CurrentBootGuid;
1874     ULONG Unknown;
1875 } SYSTEM_BOOT_ENVIRONMENT_INFORMATION, *PSYSTEM_BOOT_ENVIRONMENT_INFORMATION;
1876 
1877 
1878 NTSYSAPI
1879 NTSTATUS
1880 NTAPI
1881 NtQuerySystemInformation(
1882     IN SYSTEM_INFORMATION_CLASS SystemInformationClass,
1883     OUT PVOID SystemInformation,
1884     IN ULONG SystemInformationLength,
1885     OUT PULONG ReturnLength
1886     );
1887 
1888 NTSYSAPI
1889 NTSTATUS
1890 NTAPI
1891 ZwQuerySystemInformation(
1892     IN SYSTEM_INFORMATION_CLASS SystemInformationClass,
1893     OUT PVOID SystemInformation,
1894     IN ULONG SystemInformationLength,
1895     OUT PULONG ReturnLength
1896     );
1897 
1898 
1899 NTSYSAPI
1900 NTSTATUS
1901 NTAPI
1902 NtSetSystemInformation(
1903     IN SYSTEM_INFORMATION_CLASS SystemInformationClass,
1904     IN PVOID SystemInformation,
1905     IN ULONG SystemInformationLength
1906     );
1907 
1908 
1909 NTSYSAPI
1910 NTSTATUS
1911 NTAPI
1912 ZwSetSystemInformation(
1913     IN SYSTEM_INFORMATION_CLASS SystemInformationClass,
1914     IN PVOID SystemInformation,
1915     IN ULONG SystemInformationLength
1916     );
1917 
1918 //------------------------------------------------------------------------------
1919 // Shutdown system
1920 
1921 typedef enum _SHUTDOWN_ACTION
1922 {
1923     ShutdownNoReboot,
1924     ShutdownReboot,
1925     ShutdownPowerOff
1926 
1927 } SHUTDOWN_ACTION, *PSHUTDOWN_ACTION;
1928 
1929 
1930 NTSYSAPI
1931 NTSTATUS
1932 NTAPI
1933 NtShutdownSystem(
1934     IN SHUTDOWN_ACTION Action
1935     ); 
1936 
1937 //-----------------------------------------------------------------------------
1938 // File functions
1939 
1940 #ifndef OLD_DOS_VOLID
1941 #define OLD_DOS_VOLID   0x00000008
1942 #endif
1943  
1944 #ifndef FILE_SUPERSEDE
1945 #define FILE_SUPERSEDE                  0x00000000
1946 #define FILE_OPEN                       0x00000001
1947 #define FILE_CREATE                     0x00000002
1948 #define FILE_OPEN_IF                    0x00000003
1949 #define FILE_OVERWRITE                  0x00000004
1950 #define FILE_OVERWRITE_IF               0x00000005
1951 #define FILE_MAXIMUM_DISPOSITION        0x00000005
1952 #endif  // File create flags
1953 
1954 
1955 // Define the create/open option flags
1956 #ifndef FILE_DIRECTORY_FILE
1957 #define FILE_DIRECTORY_FILE                     0x00000001
1958 #define FILE_WRITE_THROUGH                      0x00000002
1959 #define FILE_SEQUENTIAL_ONLY                    0x00000004
1960 #define FILE_NO_INTERMEDIATE_BUFFERING          0x00000008
1961 #define FILE_SYNCHRONOUS_IO_ALERT               0x00000010
1962 #define FILE_SYNCHRONOUS_IO_NONALERT            0x00000020
1963 #define FILE_NON_DIRECTORY_FILE                 0x00000040
1964 #define FILE_CREATE_TREE_CONNECTION             0x00000080
1965 #define FILE_COMPLETE_IF_OPLOCKED               0x00000100
1966 #define FILE_NO_EA_KNOWLEDGE                    0x00000200
1967 #define FILE_OPEN_FOR_RECOVERY                  0x00000400
1968 #define FILE_RANDOM_ACCESS                      0x00000800
1969 #define FILE_DELETE_ON_CLOSE                    0x00001000
1970 #define FILE_OPEN_BY_FILE_ID                    0x00002000
1971 #define FILE_OPEN_FOR_BACKUP_INTENT             0x00004000
1972 #define FILE_NO_COMPRESSION                     0x00008000
1973 #define FILE_OPEN_REQUIRING_OPLOCK              0x00010000
1974 #define FILE_DISALLOW_EXCLUSIVE                 0x00020000
1975 #define FILE_RESERVE_OPFILTER                   0x00100000
1976 #define FILE_OPEN_REPARSE_POINT                 0x00200000
1977 #define FILE_OPEN_NO_RECALL                     0x00400000
1978 #define FILE_OPEN_FOR_FREE_SPACE_QUERY          0x00800000
1979 #endif // FILE_DIRECTORY_FILE
1980 
1981 
1982 //
1983 // Define the I/O status information return values for NtCreateFile/NtOpenFile
1984 //
1985 
1986 #ifndef FILE_SUPERSEDED
1987 #define FILE_SUPERSEDED                 0x00000000
1988 #define FILE_OPENED                     0x00000001
1989 #define FILE_CREATED                    0x00000002
1990 #define FILE_OVERWRITTEN                0x00000003
1991 #define FILE_EXISTS                     0x00000004
1992 #define FILE_DOES_NOT_EXIST             0x00000005
1993 #endif
1994 
1995 
1996 #ifndef PIO_APC_ROUTINE_DEFINED
1997 typedef
1998 VOID
1999 (NTAPI *PIO_APC_ROUTINE) (
2000     IN PVOID ApcContext,
2001     IN PIO_STATUS_BLOCK IoStatusBlock,
2002     IN ULONG Reserved
2003     );
2004 #define PIO_APC_ROUTINE_DEFINED
2005 #endif  // PIO_APC_ROUTINE_DEFINED
2006 
2007 
2008 typedef enum _FILE_INFORMATION_CLASS
2009 {
2010     FileDirectoryInformation         = 1,
2011     FileFullDirectoryInformation,           // 0x02
2012     FileBothDirectoryInformation,           // 0x03
2013     FileBasicInformation,                   // 0x04  wdm
2014     FileStandardInformation,                // 0x05  wdm
2015     FileInternalInformation,                // 0x06
2016     FileEaInformation,                      // 0x07
2017     FileAccessInformation,                  // 0x08
2018     FileNameInformation,                    // 0x09
2019     FileRenameInformation,                  // 0x0A
2020     FileLinkInformation,                    // 0x0B
2021     FileNamesInformation,                   // 0x0C
2022     FileDispositionInformation,             // 0x0D
2023     FilePositionInformation,                // 0x0E wdm
2024     FileFullEaInformation,                  // 0x0F
2025     FileModeInformation,                    // 0x10
2026     FileAlignmentInformation,               // 0x11
2027     FileAllInformation,                     // 0x12
2028     FileAllocationInformation,              // 0x13
2029     FileEndOfFileInformation,               // 0x14 wdm
2030     FileAlternateNameInformation,           // 0x15
2031     FileStreamInformation,                  // 0x16
2032     FilePipeInformation,                    // 0x17
2033     FilePipeLocalInformation,               // 0x18
2034     FilePipeRemoteInformation,              // 0x19
2035     FileMailslotQueryInformation,           // 0x1A
2036     FileMailslotSetInformation,             // 0x1B
2037     FileCompressionInformation,             // 0x1C
2038     FileObjectIdInformation,                // 0x1D
2039     FileCompletionInformation,              // 0x1E
2040     FileMoveClusterInformation,             // 0x1F
2041     FileQuotaInformation,                   // 0x20
2042     FileReparsePointInformation,            // 0x21
2043     FileNetworkOpenInformation,             // 0x22
2044     FileAttributeTagInformation,            // 0x23
2045     FileTrackingInformation,                // 0x24
2046     FileIdBothDirectoryInformation,         // 0x25
2047     FileIdFullDirectoryInformation,         // 0x26
2048     FileValidDataLengthInformation,         // 0x27
2049     FileShortNameInformation,               // 0x28
2050     FileIoCompletionNotificationInformation,// 0x29
2051     FileIoStatusBlockRangeInformation,      // 0x2A
2052     FileIoPriorityHintInformation,          // 0x2B
2053     FileSfioReserveInformation,             // 0x2C
2054     FileSfioVolumeInformation,              // 0x2D
2055     FileHardLinkInformation,                // 0x2E
2056     FileProcessIdsUsingFileInformation,     // 0x2F
2057     FileNormalizedNameInformation,          // 0x30
2058     FileNetworkPhysicalNameInformation,     // 0x31 
2059     FileIdGlobalTxDirectoryInformation,     // 0x32
2060     FileIsRemoteDeviceInformation,          // 0x33
2061     FileAttributeCacheInformation,          // 0x34
2062     FileNumaNodeInformation,                // 0x35
2063     FileStandardLinkInformation,            // 0x36
2064     FileRemoteProtocolInformation,          // 0x37
2065     FileMaximumInformation
2066 } FILE_INFORMATION_CLASS, *PFILE_INFORMATION_CLASS;
2067 
2068 
2069 typedef struct _FILE_DIRECTORY_INFORMATION {
2070     ULONG NextEntryOffset;
2071     ULONG FileIndex;
2072     LARGE_INTEGER CreationTime;
2073     LARGE_INTEGER LastAccessTime;
2074     LARGE_INTEGER LastWriteTime;
2075     LARGE_INTEGER ChangeTime;
2076     LARGE_INTEGER EndOfFile;
2077     LARGE_INTEGER AllocationSize;
2078     ULONG FileAttributes;
2079     ULONG FileNameLength;
2080     WCHAR FileName[1];
2081 } FILE_DIRECTORY_INFORMATION, *PFILE_DIRECTORY_INFORMATION;
2082 
2083 
2084 typedef struct _FILE_FULL_DIR_INFORMATION {
2085     ULONG NextEntryOffset;
2086     ULONG FileIndex;
2087     LARGE_INTEGER CreationTime;
2088     LARGE_INTEGER LastAccessTime;
2089     LARGE_INTEGER LastWriteTime;
2090     LARGE_INTEGER ChangeTime;
2091     LARGE_INTEGER EndOfFile;
2092     LARGE_INTEGER AllocationSize;
2093     ULONG FileAttributes;
2094     ULONG FileNameLength;
2095     ULONG EaSize;
2096     WCHAR FileName[1];
2097 } FILE_FULL_DIR_INFORMATION, *PFILE_FULL_DIR_INFORMATION;
2098 
2099 
2100 typedef struct _FILE_BOTH_DIR_INFORMATION {
2101     ULONG NextEntryOffset;
2102     ULONG FileIndex;
2103     LARGE_INTEGER CreationTime;
2104     LARGE_INTEGER LastAccessTime;
2105     LARGE_INTEGER LastWriteTime;
2106     LARGE_INTEGER ChangeTime;
2107     LARGE_INTEGER EndOfFile;
2108     LARGE_INTEGER AllocationSize;
2109     ULONG FileAttributes;
2110     ULONG FileNameLength;
2111     ULONG EaSize;
2112     CCHAR ShortNameLength;
2113     WCHAR ShortName[12];
2114     WCHAR FileName[1];
2115 } FILE_BOTH_DIR_INFORMATION, *PFILE_BOTH_DIR_INFORMATION;
2116 
2117 
2118 typedef struct _FILE_BASIC_INFORMATION {                    
2119     LARGE_INTEGER CreationTime;                             
2120     LARGE_INTEGER LastAccessTime;                           
2121     LARGE_INTEGER LastWriteTime;                            
2122     LARGE_INTEGER ChangeTime;                               
2123     ULONG FileAttributes;                                   
2124 } FILE_BASIC_INFORMATION, *PFILE_BASIC_INFORMATION;         
2125 
2126 
2127 typedef struct _FILE_STANDARD_INFORMATION {                 
2128     LARGE_INTEGER AllocationSize;                           
2129     LARGE_INTEGER EndOfFile;                                
2130     ULONG NumberOfLinks;                                    
2131     BOOLEAN DeletePending;                                  
2132     BOOLEAN Directory;                                      
2133 } FILE_STANDARD_INFORMATION, *PFILE_STANDARD_INFORMATION;   
2134 
2135 
2136 typedef struct _FILE_INTERNAL_INFORMATION {
2137     LARGE_INTEGER IndexNumber;
2138 } FILE_INTERNAL_INFORMATION, *PFILE_INTERNAL_INFORMATION;
2139 
2140 
2141 typedef struct _FILE_EA_INFORMATION {
2142     ULONG EaSize;
2143 } FILE_EA_INFORMATION, *PFILE_EA_INFORMATION;
2144 
2145 
2146 typedef struct _FILE_ACCESS_INFORMATION {
2147     ACCESS_MASK AccessFlags;
2148 } FILE_ACCESS_INFORMATION, *PFILE_ACCESS_INFORMATION;
2149 
2150 
2151 typedef struct _FILE_NAME_INFORMATION {                     
2152     ULONG FileNameLength;                                   
2153     WCHAR FileName[1];                                      
2154 } FILE_NAME_INFORMATION, *PFILE_NAME_INFORMATION;           
2155 
2156 
2157 typedef struct _FILE_RENAME_INFORMATION {
2158     BOOLEAN ReplaceIfExists;
2159     HANDLE RootDirectory;
2160     ULONG FileNameLength;
2161     WCHAR FileName[1];
2162 } FILE_RENAME_INFORMATION, *PFILE_RENAME_INFORMATION;
2163 
2164 
2165 typedef struct _FILE_NAMES_INFORMATION {
2166     ULONG NextEntryOffset;
2167     ULONG FileIndex;
2168     ULONG FileNameLength;
2169     WCHAR FileName[1];
2170 } FILE_NAMES_INFORMATION, *PFILE_NAMES_INFORMATION;
2171 
2172 
2173 typedef struct _FILE_DISPOSITION_INFORMATION {                  
2174     BOOLEAN DeleteFile;                                         
2175 } FILE_DISPOSITION_INFORMATION, *PFILE_DISPOSITION_INFORMATION; 
2176                                                               
2177 
2178 typedef struct _FILE_POSITION_INFORMATION {                 
2179     LARGE_INTEGER CurrentByteOffset;                        
2180 } FILE_POSITION_INFORMATION, *PFILE_POSITION_INFORMATION;   
2181 
2182 
2183 typedef struct _FILE_FULL_EA_INFORMATION {
2184     ULONG NextEntryOffset;
2185     UCHAR Flags;
2186     UCHAR EaNameLength;
2187     USHORT EaValueLength;
2188     CHAR EaName[1];
2189 } FILE_FULL_EA_INFORMATION, *PFILE_FULL_EA_INFORMATION;
2190 
2191 
2192 typedef struct _FILE_MODE_INFORMATION {
2193     ULONG Mode;
2194 } FILE_MODE_INFORMATION, *PFILE_MODE_INFORMATION;
2195 
2196 
2197 typedef struct _FILE_ALIGNMENT_INFORMATION {                
2198     ULONG AlignmentRequirement;                             
2199 } FILE_ALIGNMENT_INFORMATION, *PFILE_ALIGNMENT_INFORMATION; 
2200 
2201 
2202 typedef struct _FILE_ALL_INFORMATION {
2203     FILE_BASIC_INFORMATION BasicInformation;
2204     FILE_STANDARD_INFORMATION StandardInformation;
2205     FILE_INTERNAL_INFORMATION InternalInformation;
2206     FILE_EA_INFORMATION EaInformation;
2207     FILE_ACCESS_INFORMATION AccessInformation;
2208     FILE_POSITION_INFORMATION PositionInformation;
2209     FILE_MODE_INFORMATION ModeInformation;
2210     FILE_ALIGNMENT_INFORMATION AlignmentInformation;
2211     FILE_NAME_INFORMATION NameInformation;
2212 } FILE_ALL_INFORMATION, *PFILE_ALL_INFORMATION;
2213 
2214 
2215 typedef struct _FILE_ALLOCATION_INFORMATION {
2216     LARGE_INTEGER AllocationSize;
2217 } FILE_ALLOCATION_INFORMATION, *PFILE_ALLOCATION_INFORMATION;
2218 
2219 
2220 typedef struct _FILE_END_OF_FILE_INFORMATION {                 
2221     LARGE_INTEGER EndOfFile;                                   
2222 } FILE_END_OF_FILE_INFORMATION, *PFILE_END_OF_FILE_INFORMATION;
2223 
2224 
2225 typedef struct _FILE_STREAM_INFORMATION {
2226     ULONG NextEntryOffset;
2227     ULONG StreamNameLength;
2228     LARGE_INTEGER StreamSize;
2229     LARGE_INTEGER StreamAllocationSize;
2230     WCHAR StreamName[1];
2231 } FILE_STREAM_INFORMATION, *PFILE_STREAM_INFORMATION;
2232 
2233 typedef struct _FILE_PIPE_INFORMATION {
2234      ULONG ReadMode;
2235      ULONG CompletionMode;
2236 } FILE_PIPE_INFORMATION, *PFILE_PIPE_INFORMATION;
2237 
2238 
2239 typedef struct _FILE_PIPE_LOCAL_INFORMATION {
2240      ULONG NamedPipeType;
2241      ULONG NamedPipeConfiguration;
2242      ULONG MaximumInstances;
2243      ULONG CurrentInstances;
2244      ULONG InboundQuota;
2245      ULONG ReadDataAvailable;
2246      ULONG OutboundQuota;
2247      ULONG WriteQuotaAvailable;
2248      ULONG NamedPipeState;
2249      ULONG NamedPipeEnd;
2250 } FILE_PIPE_LOCAL_INFORMATION, *PFILE_PIPE_LOCAL_INFORMATION;
2251 
2252 
2253 typedef struct _FILE_PIPE_REMOTE_INFORMATION {
2254      LARGE_INTEGER CollectDataTime;
2255      ULONG MaximumCollectionCount;
2256 } FILE_PIPE_REMOTE_INFORMATION, *PFILE_PIPE_REMOTE_INFORMATION;
2257 
2258 
2259 typedef struct _FILE_MAILSLOT_QUERY_INFORMATION {
2260     ULONG MaximumMessageSize;
2261     ULONG MailslotQuota;
2262     ULONG NextMessageSize;
2263     ULONG MessagesAvailable;
2264     LARGE_INTEGER ReadTimeout;
2265 } FILE_MAILSLOT_QUERY_INFORMATION, *PFILE_MAILSLOT_QUERY_INFORMATION;
2266 
2267 
2268 typedef struct _FILE_MAILSLOT_SET_INFORMATION {
2269     PLARGE_INTEGER ReadTimeout;
2270 } FILE_MAILSLOT_SET_INFORMATION, *PFILE_MAILSLOT_SET_INFORMATION;
2271 
2272 
2273 typedef struct _FILE_COMPRESSION_INFORMATION {
2274     LARGE_INTEGER CompressedFileSize;
2275     USHORT CompressionFormat;
2276     UCHAR CompressionUnitShift;
2277     UCHAR ChunkShift;
2278     UCHAR ClusterShift;
2279     UCHAR Reserved[3];
2280 } FILE_COMPRESSION_INFORMATION, *PFILE_COMPRESSION_INFORMATION;
2281 
2282 
2283 typedef struct _FILE_LINK_INFORMATION {
2284     BOOLEAN ReplaceIfExists;
2285     HANDLE RootDirectory;
2286     ULONG FileNameLength;
2287     WCHAR FileName[1];
2288 } FILE_LINK_INFORMATION, *PFILE_LINK_INFORMATION;
2289 
2290 
2291 typedef struct _FILE_OBJECTID_INFORMATION
2292 {
2293     LONGLONG FileReference;
2294     UCHAR ObjectId[16];
2295     union {
2296         struct {
2297             UCHAR BirthVolumeId[16];
2298             UCHAR BirthObjectId[16];
2299             UCHAR DomainId[16];
2300         } ;
2301         UCHAR ExtendedInfo[48];
2302     };
2303 } FILE_OBJECTID_INFORMATION, *PFILE_OBJECTID_INFORMATION;
2304 
2305 
2306 typedef struct _FILE_COMPLETION_INFORMATION {
2307     HANDLE Port;
2308     PVOID Key;
2309 } FILE_COMPLETION_INFORMATION, *PFILE_COMPLETION_INFORMATION;
2310 
2311 
2312 typedef struct _FILE_MOVE_CLUSTER_INFORMATION {
2313     ULONG ClusterCount;
2314     HANDLE RootDirectory;
2315     ULONG FileNameLength;
2316     WCHAR FileName[1];
2317 } FILE_MOVE_CLUSTER_INFORMATION, *PFILE_MOVE_CLUSTER_INFORMATION;
2318 
2319 
2320 typedef struct _FILE_NETWORK_OPEN_INFORMATION {                 
2321     LARGE_INTEGER CreationTime;                                 
2322     LARGE_INTEGER LastAccessTime;                               
2323     LARGE_INTEGER LastWriteTime;                                
2324     LARGE_INTEGER ChangeTime;                                   
2325     LARGE_INTEGER AllocationSize;                               
2326     LARGE_INTEGER EndOfFile;                                    
2327     ULONG FileAttributes;                                       
2328 } FILE_NETWORK_OPEN_INFORMATION, *PFILE_NETWORK_OPEN_INFORMATION;
2329 
2330 
2331 typedef struct _FILE_ATTRIBUTE_TAG_INFORMATION {               
2332     ULONG FileAttributes;                                       
2333     ULONG ReparseTag;                                           
2334 } FILE_ATTRIBUTE_TAG_INFORMATION, *PFILE_ATTRIBUTE_TAG_INFORMATION;
2335 
2336 
2337 typedef struct _FILE_TRACKING_INFORMATION {
2338     HANDLE DestinationFile;
2339     ULONG ObjectInformationLength;
2340     CHAR ObjectInformation[1];
2341 } FILE_TRACKING_INFORMATION, *PFILE_TRACKING_INFORMATION;
2342 
2343 
2344 typedef struct _FILE_REPARSE_POINT_INFORMATION {
2345     LONGLONG FileReference;
2346     ULONG Tag;
2347 } FILE_REPARSE_POINT_INFORMATION, *PFILE_REPARSE_POINT_INFORMATION;
2348 
2349 
2350 typedef struct _FILE_QUOTA_INFORMATION {
2351     ULONG NextEntryOffset;
2352     ULONG SidLength;
2353     LARGE_INTEGER ChangeTime;
2354     LARGE_INTEGER QuotaUsed;
2355     LARGE_INTEGER QuotaThreshold;
2356     LARGE_INTEGER QuotaLimit;
2357     SID Sid;
2358 } FILE_QUOTA_INFORMATION, *PFILE_QUOTA_INFORMATION;
2359 
2360 
2361 typedef struct _FILE_ID_BOTH_DIR_INFORMATION {
2362     ULONG NextEntryOffset;
2363     ULONG FileIndex;
2364     LARGE_INTEGER CreationTime;
2365     LARGE_INTEGER LastAccessTime;
2366     LARGE_INTEGER LastWriteTime;
2367     LARGE_INTEGER ChangeTime;
2368     LARGE_INTEGER EndOfFile;
2369     LARGE_INTEGER AllocationSize;
2370     ULONG FileAttributes;
2371     ULONG FileNameLength;
2372     ULONG EaSize;
2373     CCHAR ShortNameLength;
2374     WCHAR ShortName[12];
2375     LARGE_INTEGER FileId;
2376     WCHAR FileName[1];
2377 } FILE_ID_BOTH_DIR_INFORMATION, *PFILE_ID_BOTH_DIR_INFORMATION;
2378 
2379 
2380 typedef struct _FILE_ID_FULL_DIR_INFORMATION {
2381     ULONG NextEntryOffset;
2382     ULONG FileIndex;
2383     LARGE_INTEGER CreationTime;
2384     LARGE_INTEGER LastAccessTime;
2385     LARGE_INTEGER LastWriteTime;
2386     LARGE_INTEGER ChangeTime;
2387     LARGE_INTEGER EndOfFile;
2388     LARGE_INTEGER AllocationSize;
2389     ULONG FileAttributes;
2390     ULONG FileNameLength;
2391     ULONG EaSize;
2392     LARGE_INTEGER FileId;
2393     WCHAR FileName[1];
2394 } FILE_ID_FULL_DIR_INFORMATION, *PFILE_ID_FULL_DIR_INFORMATION;
2395 
2396 
2397 typedef struct _FILE_VALID_DATA_LENGTH_INFORMATION {                        
2398     LARGE_INTEGER ValidDataLength;                                          
2399 } FILE_VALID_DATA_LENGTH_INFORMATION, *PFILE_VALID_DATA_LENGTH_INFORMATION; 
2400 
2401 //
2402 // Don‘t queue an entry to an associated completion port if returning success
2403 // synchronously.
2404 //
2405 #define FILE_SKIP_COMPLETION_PORT_ON_SUCCESS    0x1
2406 
2407 //
2408 // Don‘t set the file handle event on IO completion.
2409 //
2410 #define FILE_SKIP_SET_EVENT_ON_HANDLE           0x2
2411 
2412 //
2413 // Don‘t set user supplied event on successful fast-path IO completion.
2414 //
2415 #define FILE_SKIP_SET_USER_EVENT_ON_FAST_IO     0x4
2416 
2417 typedef  struct _FILE_IO_COMPLETION_NOTIFICATION_INFORMATION {
2418     ULONG Flags;
2419 } FILE_IO_COMPLETION_NOTIFICATION_INFORMATION, *PFILE_IO_COMPLETION_NOTIFICATION_INFORMATION;
2420 
2421 
2422 typedef  struct _FILE_PROCESS_IDS_USING_FILE_INFORMATION {
2423     ULONG NumberOfProcessIdsInList;
2424     ULONG_PTR ProcessIdList[1];
2425 } FILE_PROCESS_IDS_USING_FILE_INFORMATION, *PFILE_PROCESS_IDS_USING_FILE_INFORMATION;
2426 
2427 
2428 typedef struct _FILE_IOSTATUSBLOCK_RANGE_INFORMATION {
2429     PUCHAR       IoStatusBlockRange;
2430     ULONG        Length;
2431 } FILE_IOSTATUSBLOCK_RANGE_INFORMATION, *PFILE_IOSTATUSBLOCK_RANGE_INFORMATION;
2432 
2433 
2434 typedef enum _IO_PRIORITY_HINT {
2435     IoPriorityVeryLow = 0,    // Winfs promotion, defragging, content indexing and other background I/Os
2436     IoPriorityLow,            // Prefetching for applications.
2437     IoPriorityNormal,         // Normal I/Os
2438     IoPriorityHigh,           // Used by filesystems for checkpoint I/O
2439     IoPriorityCritical,       // Used by memory manager. Not available for applications.
2440     MaxIoPriorityTypes
2441 } IO_PRIORITY_HINT;
2442 
2443 
2444 typedef struct _FILE_IO_PRIORITY_HINT_INFORMATION {
2445     IO_PRIORITY_HINT   PriorityHint;
2446 } FILE_IO_PRIORITY_HINT_INFORMATION, *PFILE_IO_PRIORITY_HINT_INFORMATION;
2447 
2448 
2449 //
2450 // Support to reserve bandwidth for a file handle.
2451 //
2452 
2453 typedef struct _FILE_SFIO_RESERVE_INFORMATION {
2454     ULONG RequestsPerPeriod;
2455     ULONG Period;
2456     BOOLEAN RetryFailures;
2457     BOOLEAN Discardable;
2458     ULONG RequestSize;
2459     ULONG NumOutstandingRequests;
2460 } FILE_SFIO_RESERVE_INFORMATION, *PFILE_SFIO_RESERVE_INFORMATION;
2461 
2462 //
2463 // Support to query bandwidth properties of a volume.
2464 //
2465 
2466 typedef struct _FILE_SFIO_VOLUME_INFORMATION {
2467     ULONG MaximumRequestsPerPeriod;
2468     ULONG MinimumPeriod;
2469     ULONG MinimumTransferSize;
2470 } FILE_SFIO_VOLUME_INFORMATION, *PFILE_SFIO_VOLUME_INFORMATION;
2471 
2472 
2473 typedef struct _FILE_LINK_ENTRY_INFORMATION {
2474     ULONG NextEntryOffset;
2475     LONGLONG ParentFileId;
2476     ULONG FileNameLength;
2477     WCHAR FileName[1];
2478 } FILE_LINK_ENTRY_INFORMATION, *PFILE_LINK_ENTRY_INFORMATION;
2479 
2480 
2481 typedef struct _FILE_LINKS_INFORMATION
2482 {
2483     ULONG BytesNeeded;
2484     ULONG EntriesReturned;
2485     FILE_LINK_ENTRY_INFORMATION Entry;
2486 } FILE_LINKS_INFORMATION, *PFILE_LINKS_INFORMATION; 
2487 
2488 typedef struct _FILE_ID_GLOBAL_TX_DIR_INFORMATION
2489 {
2490   ULONG          NextEntryOffset;
2491   ULONG          FileIndex;
2492   LARGE_INTEGER  CreationTime;
2493   LARGE_INTEGER  LastAccessTime;
2494   LARGE_INTEGER  LastWriteTime;
2495   LARGE_INTEGER  ChangeTime;
2496   LARGE_INTEGER  EndOfFile;
2497   LARGE_INTEGER  AllocationSize;
2498   ULONG          FileAttributes;
2499   ULONG          FileNameLength;
2500   LARGE_INTEGER  FileId;
2501   GUID           LockingTransactionId;
2502   ULONG          TxInfoFlags;
2503   WCHAR          FileName[1];
2504 } FILE_ID_GLOBAL_TX_DIR_INFORMATION, *PFILE_ID_GLOBAL_TX_DIR_INFORMATION;
2505 
2506 
2507 typedef struct _FILE_IS_REMOTE_DEVICE_INFORMATION
2508 {
2509     BOOLEAN IsRemote;
2510 } FILE_IS_REMOTE_DEVICE_INFORMATION, *PFILE_IS_REMOTE_DEVICE_INFORMATION;
2511 
2512 typedef struct _FILE_NUMA_NODE_INFORMATION {
2513     USHORT NodeNumber;
2514 } FILE_NUMA_NODE_INFORMATION, *PFILE_NUMA_NODE_INFORMATION;
2515 
2516 /*
2517 typedef struct _FILE_REMOTE_PROTOCOL_INFO
2518 {
2519   USHORT StructureVersion;
2520   USHORT StructureSize;
2521   ULONG  Protocol;
2522   USHORT ProtocolMajorVersion;
2523   USHORT ProtocolMinorVersion;
2524   USHORT ProtocolRevision;
2525   USHORT Reserved;
2526   ULONG  Flags;
2527   struct {
2528     ULONG Reserved[8];
2529   } GenericReserved;
2530   struct {
2531     ULONG Reserved[16];
2532   } ProtocolSpecificReserved;
2533 } FILE_REMOTE_PROTOCOL_INFO, *PFILE_REMOTE_PROTOCOL_INFO;
2534 */
2535 
2536 typedef enum _FSINFOCLASS {
2537     FileFsVolumeInformation       = 1,
2538     FileFsLabelInformation,                 // 0x02
2539     FileFsSizeInformation,                  // 0x03
2540     FileFsDeviceInformation,                // 0x04
2541     FileFsAttributeInformation,             // 0x05
2542     FileFsControlInformation,               // 0x06
2543     FileFsFullSizeInformation,              // 0x07
2544     FileFsObjectIdInformation,              // 0x08
2545     FileFsDriverPathInformation,            // 0x09
2546     FileFsVolumeFlagsInformation,           // 0x0A
2547     FileFsMaximumInformation                // 0x0B
2548 } FS_INFORMATION_CLASS, *PFS_INFORMATION_CLASS;
2549                                             
2550                                             
2551 typedef struct _FILE_FS_VOLUME_INFORMATION {
2552     LARGE_INTEGER VolumeCreationTime;
2553     ULONG VolumeSerialNumber;
2554     ULONG VolumeLabelLength;
2555     BOOLEAN SupportsObjects;
2556     WCHAR VolumeLabel[1];
2557 } FILE_FS_VOLUME_INFORMATION, *PFILE_FS_VOLUME_INFORMATION;
2558 
2559 
2560 typedef struct _FILE_FS_LABEL_INFORMATION {
2561     ULONG VolumeLabelLength;
2562     WCHAR VolumeLabel[1];
2563 } FILE_FS_LABEL_INFORMATION, *PFILE_FS_LABEL_INFORMATION;
2564 
2565 
2566 typedef struct _FILE_FS_SIZE_INFORMATION {
2567     LARGE_INTEGER TotalAllocationUnits;
2568     LARGE_INTEGER AvailableAllocationUnits;
2569     ULONG SectorsPerAllocationUnit;
2570     ULONG BytesPerSector;
2571 } FILE_FS_SIZE_INFORMATION, *PFILE_FS_SIZE_INFORMATION;
2572 
2573 
2574 typedef struct _FILE_FS_DEVICE_INFORMATION {
2575     DEVICE_TYPE DeviceType;
2576     ULONG Characteristics;
2577 } FILE_FS_DEVICE_INFORMATION, *PFILE_FS_DEVICE_INFORMATION;
2578 
2579 
2580 typedef struct _FILE_FS_ATTRIBUTE_INFORMATION {
2581     ULONG FileSystemAttributes;
2582     LONG MaximumComponentNameLength;
2583     ULONG FileSystemNameLength;
2584     WCHAR FileSystemName[1];
2585 } FILE_FS_ATTRIBUTE_INFORMATION, *PFILE_FS_ATTRIBUTE_INFORMATION;
2586 
2587 
2588 typedef struct _FILE_FS_CONTROL_INFORMATION {
2589     LARGE_INTEGER FreeSpaceStartFiltering;
2590     LARGE_INTEGER FreeSpaceThreshold;
2591     LARGE_INTEGER FreeSpaceStopFiltering;
2592     LARGE_INTEGER DefaultQuotaThreshold;
2593     LARGE_INTEGER DefaultQuotaLimit;
2594     ULONG FileSystemControlFlags;
2595 } FILE_FS_CONTROL_INFORMATION, *PFILE_FS_CONTROL_INFORMATION;
2596 
2597 
2598 typedef struct _FILE_FS_FULL_SIZE_INFORMATION {
2599     LARGE_INTEGER TotalAllocationUnits;
2600     LARGE_INTEGER CallerAvailableAllocationUnits;
2601     LARGE_INTEGER ActualAvailableAllocationUnits;
2602     ULONG SectorsPerAllocationUnit;
2603     ULONG BytesPerSector;
2604 } FILE_FS_FULL_SIZE_INFORMATION, *PFILE_FS_FULL_SIZE_INFORMATION;
2605 
2606 
2607 typedef struct _FILE_FS_OBJECTID_INFORMATION {
2608     UCHAR ObjectId[16];
2609     UCHAR ExtendedInfo[48];
2610 } FILE_FS_OBJECTID_INFORMATION, *PFILE_FS_OBJECTID_INFORMATION;
2611 
2612 
2613 typedef struct _FILE_FS_DRIVER_PATH_INFORMATION {
2614     BOOLEAN DriverInPath;
2615     ULONG   DriverNameLength;
2616     WCHAR   DriverName[1];
2617 } FILE_FS_DRIVER_PATH_INFORMATION, *PFILE_FS_DRIVER_PATH_INFORMATION;
2618 
2619 
2620 typedef struct _FILE_FS_VOLUME_FLAGS_INFORMATION {
2621     ULONG Flags;
2622 } FILE_FS_VOLUME_FLAGS_INFORMATION, *PFILE_FS_VOLUME_FLAGS_INFORMATION;
2623 
2624 
2625 NTSYSAPI
2626 NTSTATUS
2627 NTAPI
2628 NtCreateFile(
2629     OUT PHANDLE FileHandle,
2630     IN  ACCESS_MASK DesiredAccess,
2631     IN  POBJECT_ATTRIBUTES ObjectAttributes,
2632     OUT PIO_STATUS_BLOCK IoStatusBlock,
2633     IN  PLARGE_INTEGER AllocationSize,
2634     IN  ULONG FileAttributes,
2635     IN  ULONG ShareAccess,
2636     IN  ULONG CreateDisposition,
2637     IN  ULONG CreateOptions,
2638     IN  PVOID EaBuffer,
2639     IN  ULONG EaLength);
2640 
2641 
2642 NTSYSAPI
2643 NTSTATUS
2644 NTAPI
2645 ZwCreateFile(
2646     OUT PHANDLE FileHandle,
2647     IN  ACCESS_MASK DesiredAccess,
2648     IN  POBJECT_ATTRIBUTES ObjectAttributes,
2649     OUT PIO_STATUS_BLOCK IoStatusBlock,
2650     IN  PLARGE_INTEGER AllocationSize,
2651     IN  ULONG FileAttributes,
2652     IN  ULONG ShareAccess,
2653     IN  ULONG CreateDisposition,
2654     IN  ULONG CreateOptions,
2655     IN  PVOID EaBuffer,
2656     IN  ULONG EaLength);
2657 
2658 
2659 NTSYSAPI
2660 NTSTATUS
2661 NTAPI
2662 NtOpenFile(
2663     OUT PHANDLE FileHandle,
2664     IN ACCESS_MASK DesiredAccess,
2665     IN POBJECT_ATTRIBUTES ObjectAttributes,
2666     OUT PIO_STATUS_BLOCK IoStatusBlock,
2667     IN ULONG ShareAccess,
2668     IN ULONG OpenOptions
2669     );
2670 
2671 
2672 NTSYSAPI
2673 NTSTATUS
2674 NTAPI
2675 ZwOpenFile(
2676     OUT PHANDLE FileHandle,
2677     IN ACCESS_MASK DesiredAccess,
2678     IN POBJECT_ATTRIBUTES ObjectAttributes,
2679     OUT PIO_STATUS_BLOCK IoStatusBlock,
2680     IN ULONG ShareAccess,
2681     IN ULONG OpenOptions
2682     );
2683 
2684 
2685 NTSYSAPI
2686 NTSTATUS
2687 NTAPI
2688 NtQueryAttributesFile(
2689     IN POBJECT_ATTRIBUTES ObjectAttributes,
2690     OUT PFILE_BASIC_INFORMATION FileInformation
2691     );
2692 
2693 
2694 NTSYSAPI
2695 NTSTATUS
2696 NTAPI
2697 ZwQueryAttributesFile(
2698     IN POBJECT_ATTRIBUTES ObjectAttributes,
2699     OUT PFILE_BASIC_INFORMATION FileInformation
2700     );
2701 
2702 
2703 NTSYSAPI
2704 NTSTATUS
2705 NTAPI
2706 NtQueryInformationFile(
2707     IN HANDLE FileHandle,
2708     OUT PIO_STATUS_BLOCK IoStatusBlock,
2709     OUT PVOID FileInformation,
2710     IN ULONG Length,
2711     IN FILE_INFORMATION_CLASS FileInformationClass
2712     );
2713 
2714 
2715 NTSYSAPI
2716 NTSTATUS
2717 NTAPI
2718 ZwQueryInformationFile(
2719     IN HANDLE FileHandle,
2720     OUT PIO_STATUS_BLOCK IoStatusBlock,
2721     OUT PVOID FileInformation,
2722     IN ULONG Length,
2723     IN FILE_INFORMATION_CLASS FileInformationClass
2724     );
2725 
2726 
2727 NTSYSAPI
2728 NTSTATUS
2729 NTAPI
2730 NtQueryDirectoryFile(
2731     IN HANDLE FileHandle,
2732     IN HANDLE Event OPTIONAL,
2733     IN PIO_APC_ROUTINE ApcRoutine OPTIONAL,
2734     IN PVOID ApcContext OPTIONAL,
2735     OUT PIO_STATUS_BLOCK IoStatusBlock,
2736     OUT PVOID FileInformation,
2737     IN ULONG Length,
2738     IN FILE_INFORMATION_CLASS FileInformationClass,
2739     IN BOOLEAN ReturnSingleEntry,
2740     IN PUNICODE_STRING FileName OPTIONAL,
2741     IN BOOLEAN RestartScan
2742     );
2743 
2744 
2745 NTSYSAPI
2746 NTSTATUS
2747 NTAPI
2748 ZwQueryDirectoryFile(
2749     IN HANDLE FileHandle,
2750     IN HANDLE Event OPTIONAL,
2751     IN PIO_APC_ROUTINE ApcRoutine OPTIONAL,
2752     IN PVOID ApcContext OPTIONAL,
2753     OUT PIO_STATUS_BLOCK IoStatusBlock,
2754     OUT PVOID FileInformation,
2755     IN ULONG Length,
2756     IN FILE_INFORMATION_CLASS FileInformationClass,
2757     IN BOOLEAN ReturnSingleEntry,
2758     IN PUNICODE_STRING FileName OPTIONAL,
2759     IN BOOLEAN RestartScan
2760     );
2761 
2762 
2763 NTSYSAPI
2764 NTSTATUS
2765 NTAPI
2766 NtQueryVolumeInformationFile(
2767     IN HANDLE FileHandle,
2768     OUT PIO_STATUS_BLOCK IoStatusBlock,
2769     OUT PVOID FsInformation,
2770     IN ULONG Length,
2771     IN FS_INFORMATION_CLASS FsInformationClass
2772     );
2773 
2774 
2775 NTSYSAPI
2776 NTSTATUS
2777 NTAPI
2778 ZwQueryVolumeInformationFile(
2779     IN HANDLE FileHandle,
2780     OUT PIO_STATUS_BLOCK IoStatusBlock,
2781     OUT PVOID FsInformation,
2782     IN ULONG Length,
2783     IN FS_INFORMATION_CLASS FsInformationClass
2784     );
2785 
2786 
2787 NTSYSAPI
2788 NTSTATUS
2789 NTAPI
2790 NtSetInformationFile(
2791     IN HANDLE FileHandle,
2792     OUT PIO_STATUS_BLOCK IoStatusBlock,
2793     IN PVOID FileInformation,
2794     IN ULONG Length,
2795     IN FILE_INFORMATION_CLASS FileInformationClass
2796     );
2797 
2798 
2799 NTSYSAPI
2800 NTSTATUS
2801 NTAPI
2802 ZwSetInformationFile(
2803     IN HANDLE FileHandle,
2804     OUT PIO_STATUS_BLOCK IoStatusBlock,
2805     IN PVOID FileInformation,
2806     IN ULONG Length,
2807     IN FILE_INFORMATION_CLASS FileInformationClass
2808     );
2809 
2810 
2811 NTSYSAPI
2812 NTSTATUS
2813 NTAPI
2814 NtSetVolumeInformationFile(
2815     IN HANDLE FileHandle,
2816     OUT PIO_STATUS_BLOCK IoStatusBlock,
2817     OUT PVOID FsInformation,
2818     IN ULONG Length,
2819     IN FS_INFORMATION_CLASS FsInformationClass
2820     );
2821 
2822 
2823 NTSYSAPI
2824 NTSTATUS
2825 NTAPI
2826 ZwSetVolumeInformationFile(
2827     IN HANDLE FileHandle,
2828     OUT PIO_STATUS_BLOCK IoStatusBlock,
2829     OUT PVOID FsInformation,
2830     IN ULONG Length,
2831     IN FS_INFORMATION_CLASS FsInformationClass
2832     );
2833 
2834 
2835 NTSYSAPI
2836 NTSTATUS
2837 NTAPI
2838 NtQueryEaFile(
2839     IN  HANDLE FileHandle,
2840     OUT PIO_STATUS_BLOCK IoStatusBlock,
2841     OUT PVOID Buffer,
2842     IN  ULONG Length,
2843     IN  BOOLEAN ReturnSingleEntry,
2844     IN  PVOID EaList OPTIONAL,
2845     IN  ULONG EaListLength,
2846     IN  PULONG EaIndex OPTIONAL,
2847     IN  BOOLEAN RestartScan);
2848 
2849 
2850 NTSYSAPI
2851 NTSTATUS
2852 NTAPI
2853 ZwQueryEaFile(
2854     IN  HANDLE FileHandle,
2855     OUT PIO_STATUS_BLOCK IoStatusBlock,
2856     OUT PVOID Buffer,
2857     IN  ULONG Length,
2858     IN  BOOLEAN ReturnSingleEntry,
2859     IN  PVOID EaList OPTIONAL,
2860     IN  ULONG EaListLength,
2861     IN  PULONG EaIndex OPTIONAL,
2862     IN  BOOLEAN RestartScan);
2863 
2864 
2865 NTSYSAPI
2866 NTSTATUS
2867 NTAPI
2868 NtSetEaFile(
2869     IN  HANDLE FileHandle,
2870     OUT PIO_STATUS_BLOCK IoStatusBlock,
2871     IN  PVOID Buffer,
2872     IN  ULONG Length);
2873 
2874 
2875 NTSYSAPI
2876 NTSTATUS
2877 NTAPI
2878 ZwSetEaFile(
2879     IN  HANDLE FileHandle,
2880     OUT PIO_STATUS_BLOCK IoStatusBlock,
2881     IN  PVOID Buffer,
2882     IN  ULONG Length);
2883 
2884 
2885 NTSYSAPI
2886 NTSTATUS
2887 NTAPI
2888 NtReadFile(
2889     IN HANDLE FileHandle,
2890     IN HANDLE Event OPTIONAL,
2891     IN PIO_APC_ROUTINE ApcRoutine OPTIONAL,
2892     IN PVOID ApcContext OPTIONAL,
2893     OUT PIO_STATUS_BLOCK IoStatusBlock,
2894     OUT PVOID Buffer,
2895     IN ULONG Length,
2896     IN PLARGE_INTEGER ByteOffset OPTIONAL,
2897     IN PULONG Key OPTIONAL
2898     );
2899 
2900 
2901 NTSYSAPI
2902 NTSTATUS
2903 NTAPI
2904 ZwReadFile(
2905     IN HANDLE FileHandle,
2906     IN HANDLE Event OPTIONAL,
2907     IN PIO_APC_ROUTINE ApcRoutine OPTIONAL,
2908     IN PVOID ApcContext OPTIONAL,
2909     OUT PIO_STATUS_BLOCK IoStatusBlock,
2910     OUT PVOID Buffer,
2911     IN ULONG Length,
2912     IN PLARGE_INTEGER ByteOffset OPTIONAL,
2913     IN PULONG Key OPTIONAL
2914     );
2915 
2916 
2917 NTSYSAPI
2918 NTSTATUS
2919 NTAPI
2920 NtWriteFile(
2921     IN HANDLE FileHandle,
2922     IN HANDLE Event OPTIONAL,
2923     IN PIO_APC_ROUTINE ApcRoutine OPTIONAL,
2924     IN PVOID ApcContext OPTIONAL,
2925     OUT PIO_STATUS_BLOCK IoStatusBlock,
2926     IN PVOID Buffer,
2927     IN ULONG Length,
2928     IN PLARGE_INTEGER ByteOffset OPTIONAL,
2929     IN PULONG Key OPTIONAL
2930     ); 
2931 
2932 
2933 NTSYSAPI
2934 NTSTATUS
2935 NTAPI
2936 ZwWriteFile(
2937     IN HANDLE FileHandle,
2938     IN HANDLE Event OPTIONAL,
2939     IN PIO_APC_ROUTINE ApcRoutine OPTIONAL,
2940     IN PVOID ApcContext OPTIONAL,
2941     OUT PIO_STATUS_BLOCK IoStatusBlock,
2942     IN PVOID Buffer,
2943     IN ULONG Length,
2944     IN PLARGE_INTEGER ByteOffset OPTIONAL,
2945     IN PULONG Key OPTIONAL
2946     ); 
2947 
2948 
2949 NTSYSAPI
2950 NTSTATUS
2951 NTAPI
2952 NtDeleteFile(
2953     IN POBJECT_ATTRIBUTES ObjectAttributes
2954     );
2955 
2956 
2957 NTSYSAPI
2958 NTSTATUS
2959 NTAPI
2960 ZwDeleteFile(
2961     IN POBJECT_ATTRIBUTES ObjectAttributes
2962     );
2963 
2964 
2965 NTSYSAPI
2966 NTSTATUS
2967 NTAPI
2968 NtFlushBuffersFile(
2969     IN HANDLE FileHandle,
2970     OUT PIO_STATUS_BLOCK IoStatusBlock
2971     );
2972 
2973 
2974 NTSYSAPI
2975 NTSTATUS
2976 NTAPI
2977 ZwFlushBuffersFile(
2978     IN HANDLE FileHandle,
2979     OUT PIO_STATUS_BLOCK IoStatusBlock
2980     );
2981 
2982 
2983 NTSYSAPI
2984 NTSTATUS
2985 NTAPI
2986 NtDeviceIoControlFile(      
2987     IN  HANDLE FileHandle,
2988     IN  HANDLE Event,
2989     IN  PIO_APC_ROUTINE ApcRoutine,
2990     IN  PVOID ApcContext,
2991     OUT PIO_STATUS_BLOCK IoStatusBlock,
2992     IN  ULONG IoControlCode,
2993     IN  PVOID InputBuffer,
2994     IN  ULONG InputBufferLength,
2995     IN  PVOID OutputBuffer,
2996     IN  ULONG OutputBufferLength
2997     );
2998 
2999 
3000 NTSYSAPI
3001 NTSTATUS
3002 NTAPI
3003 ZwDeviceIoControlFile(      
3004     IN  HANDLE FileHandle,
3005     IN  HANDLE Event,
3006     IN  PIO_APC_ROUTINE ApcRoutine,
3007     IN  PVOID ApcContext,
3008     OUT PIO_STATUS_BLOCK IoStatusBlock,
3009     IN  ULONG IoControlCode,
3010     IN  PVOID InputBuffer,
3011     IN  ULONG InputBufferLength,
3012     IN  PVOID OutputBuffer,
3013     IN  ULONG OutputBufferLength
3014     );
3015 
3016 
3017 NTSYSAPI
3018 NTSTATUS
3019 NTAPI
3020 NtFsControlFile(      
3021     IN  HANDLE FileHandle,
3022     IN  HANDLE Event,
3023     IN  PIO_APC_ROUTINE ApcRoutine,
3024     IN  PVOID ApcContext,
3025     OUT PIO_STATUS_BLOCK IoStatusBlock,
3026     IN  ULONG FsControlCode,
3027     IN  PVOID InputBuffer,
3028     IN  ULONG InputBufferLength,
3029     IN  PVOID OutputBuffer,
3030     IN  ULONG OutputBufferLength
3031     );
3032 
3033 
3034 NTSYSAPI
3035 NTSTATUS
3036 NTAPI
3037 ZwFsControlFile(      
3038     IN  HANDLE FileHandle,
3039     IN  HANDLE Event,
3040     IN  PIO_APC_ROUTINE ApcRoutine,
3041     IN  PVOID ApcContext,
3042     OUT PIO_STATUS_BLOCK IoStatusBlock,
3043     IN  ULONG FsControlCode,
3044     IN  PVOID InputBuffer,
3045     IN  ULONG InputBufferLength,
3046     IN  PVOID OutputBuffer,
3047     IN  ULONG OutputBufferLength
3048     );
3049 
3050 
3051 NTSYSAPI
3052 NTSTATUS
3053 NTAPI
3054 NtCancelIoFile(
3055     IN HANDLE Filehandle,
3056     OUT PIO_STATUS_BLOCK IoStatusBlock
3057     );
3058 
3059 
3060 NTSYSAPI
3061 NTSTATUS
3062 NTAPI
3063 ZwCancelIoFile(
3064     IN HANDLE Filehandle,
3065     OUT PIO_STATUS_BLOCK IoStatusBlock
3066     );
3067 
3068 
3069 NTSYSAPI
3070 NTSTATUS
3071 NTAPI
3072 NtLockFile(
3073     IN HANDLE FileHandle,
3074     IN HANDLE Event OPTIONAL,
3075     IN PIO_APC_ROUTINE ApcRoutine OPTIONAL,
3076     IN PVOID ApcContext OPTIONAL,
3077     OUT PIO_STATUS_BLOCK IoStatusBlock,
3078     IN PLARGE_INTEGER ByteOffset,
3079     IN PLARGE_INTEGER Length,
3080     IN ULONG Key,
3081     IN BOOLEAN FailImmediately,
3082     IN BOOLEAN ExclusiveLock
3083     );
3084 
3085 
3086 NTSYSAPI
3087 NTSTATUS
3088 NTAPI
3089 ZwLockFile(
3090     IN HANDLE FileHandle,
3091     IN HANDLE Event OPTIONAL,
3092     IN PIO_APC_ROUTINE ApcRoutine OPTIONAL,
3093     IN PVOID ApcContext OPTIONAL,
3094     OUT PIO_STATUS_BLOCK IoStatusBlock,
3095     IN PLARGE_INTEGER ByteOffset,
3096     IN PLARGE_INTEGER Length,
3097     IN ULONG Key,
3098     IN BOOLEAN FailImmediately,
3099     IN BOOLEAN ExclusiveLock
3100     );
3101 
3102 
3103 NTSTATUS
3104 NtUnlockFile(
3105     IN HANDLE FileHandle,
3106     OUT PIO_STATUS_BLOCK IoStatusBlock,
3107     IN PLARGE_INTEGER ByteOffset,
3108     IN PLARGE_INTEGER Length,
3109     IN ULONG Key
3110     );
3111 
3112 
3113 NTSTATUS
3114 ZwUnlockFile(
3115     IN HANDLE FileHandle,
3116     OUT PIO_STATUS_BLOCK IoStatusBlock,
3117     IN PLARGE_INTEGER ByteOffset,
3118     IN PLARGE_INTEGER Length,
3119     IN ULONG Key
3120     );
3121 
3122 
3123 NTSYSAPI
3124 BOOLEAN
3125 NTAPI
3126 RtlDosPathNameToNtPathName_U (
3127     IN  PWSTR DosPathName,
3128     OUT PUNICODE_STRING NtPathName,
3129     OUT PWSTR * NtFileNamePart OPTIONAL,
3130     OUT PCURDIR DirectoryInfo OPTIONAL
3131     );
3132 
3133 
3134 //-----------------------------------------------------------------------------
3135 // Process functions
3136 
3137 #define GDI_HANDLE_BUFFER_SIZE      34 
3138 
3139 // For ProcessExecuteFlags
3140 #define MEM_EXECUTE_OPTION_DISABLE   0x01
3141 #define MEM_EXECUTE_OPTION_ENABLE    0x02
3142 #define MEM_EXECUTE_OPTION_PERMANENT 0x08
3143 
3144 //
3145 // Process Information Classes
3146 //
3147 
3148 typedef enum _PROCESSINFOCLASS {
3149     ProcessBasicInformation,                // 0x00
3150     ProcessQuotaLimits,                     // 0x01
3151     ProcessIoCounters,                      // 0x02
3152     ProcessVmCounters,                      // 0x03
3153     ProcessTimes,                           // 0x04
3154     ProcessBasePriority,                    // 0x05
3155     ProcessRaisePriority,                   // 0x06
3156     ProcessDebugPort,                       // 0x07
3157     ProcessExceptionPort,                   // 0x08
3158     ProcessAccessToken,                     // 0x09
3159     ProcessLdtInformation,                  // 0x0A
3160     ProcessLdtSize,                         // 0x0B
3161     ProcessDefaultHardErrorMode,            // 0x0C
3162     ProcessIoPortHandlers,                  // 0x0D Note: this is kernel mode only
3163     ProcessPooledUsageAndLimits,            // 0x0E
3164     ProcessWorkingSetWatch,                 // 0x0F
3165     ProcessUserModeIOPL,                    // 0x10
3166     ProcessEnableAlignmentFaultFixup,       // 0x11
3167     ProcessPriorityClass,                   // 0x12
3168     ProcessWx86Information,                 // 0x13
3169     ProcessHandleCount,                     // 0x14
3170     ProcessAffinityMask,                    // 0x15
3171     ProcessPriorityBoost,                   // 0x16
3172     ProcessDeviceMap,                       // 0x17
3173     ProcessSessionInformation,              // 0x18
3174     ProcessForegroundInformation,           // 0x19
3175     ProcessWow64Information,                // 0x1A
3176     ProcessImageFileName,                   // 0x1B
3177     ProcessLUIDDeviceMapsEnabled,           // 0x1C
3178     ProcessBreakOnTermination,              // 0x1D
3179     ProcessDebugObjectHandle,               // 0x1E
3180     ProcessDebugFlags,                      // 0x1F
3181     ProcessHandleTracing,                   // 0x20
3182     ProcessIoPriority,                      // 0x21
3183     ProcessExecuteFlags,                    // 0x22
3184     ProcessTlsInformation,
3185     ProcessCookie,
3186     ProcessImageInformation,
3187     ProcessCycleTime,
3188     ProcessPagePriority,
3189     ProcessInstrumentationCallback,
3190     ProcessThreadStackAllocation,
3191     ProcessWorkingSetWatchEx,
3192     ProcessImageFileNameWin32,
3193     ProcessImageFileMapping,
3194     ProcessAffinityUpdateMode,
3195     ProcessMemoryAllocationMode,
3196     ProcessGroupInformation,
3197     ProcessTokenVirtualizationEnabled,
3198     ProcessConsoleHostProcess,
3199     ProcessWindowInformation,
3200     MaxProcessInfoClass                     // MaxProcessInfoClass should always be the last enum
3201 } PROCESSINFOCLASS;
3202 
3203 //
3204 // Thread Information Classes
3205 //
3206 
3207 typedef enum _THREADINFOCLASS {
3208     ThreadBasicInformation,                 // 0x00
3209     ThreadTimes,                            // 0x01
3210     ThreadPriority,                         // 0x02
3211     ThreadBasePriority,                     // 0x03
3212     ThreadAffinityMask,                     // 0x04
3213     ThreadImpersonationToken,               // 0x05  HANDLE
3214     ThreadDescriptorTableEntry,             // 0x06  ULONG Selector + LDT_ENTRY
3215     ThreadEnableAlignmentFaultFixup,        // 0x07
3216     ThreadEventPair,                        // 0x08
3217     ThreadQuerySetWin32StartAddress,        // 0x09
3218     ThreadZeroTlsCell,                      // 0x0A
3219     ThreadPerformanceCount,                 // 0x0B
3220     ThreadAmILastThread,                    // 0x0C  ULONG
3221     ThreadIdealProcessor,                   // 0x0D
3222     ThreadPriorityBoost,                    // 0x0E
3223     ThreadSetTlsArrayAddress,               // 0x0F
3224     MaxThreadInfoClass
3225 } THREADINFOCLASS;
3226 
3227 
3228 typedef struct _RTL_DRIVE_LETTER_CURDIR
3229 {
3230     USHORT Flags;
3231     USHORT Length;
3232     ULONG  TimeStamp;
3233     STRING DosPath;
3234 
3235 } RTL_DRIVE_LETTER_CURDIR, *PRTL_DRIVE_LETTER_CURDIR;
3236 
3237 
3238 typedef struct _SECTION_IMAGE_INFORMATION
3239 {
3240     PVOID TransferAddress;
3241     ULONG ZeroBits;
3242     ULONG_PTR MaximumStackSize;
3243     ULONG_PTR CommittedStackSize;
3244     ULONG SubSystemType;
3245     union _SECTION_IMAGE_INFORMATION_u0
3246     {
3247         struct _SECTION_IMAGE_INFORMATION_s0
3248         {
3249             USHORT SubSystemMinorVersion;
3250             USHORT SubSystemMajorVersion;
3251         };
3252         ULONG SubSystemVersion;
3253     };
3254     ULONG GpValue;
3255     USHORT ImageCharacteristics;
3256     USHORT DllCharacteristics;
3257     USHORT Machine;
3258     BOOLEAN ImageContainsCode;
3259     BOOLEAN Spare1;
3260     ULONG LoaderFlags;
3261     ULONG Reserved[2];
3262 
3263 } SECTION_IMAGE_INFORMATION, *PSECTION_IMAGE_INFORMATION; 
3264 
3265 
3266 typedef struct _RTL_USER_PROCESS_INFORMATION
3267 {
3268     ULONG Length;
3269     HANDLE ProcessHandle;
3270     HANDLE ThreadHandle;
3271     CLIENT_ID ClientId;
3272     SECTION_IMAGE_INFORMATION ImageInformation;
3273 
3274 } RTL_USER_PROCESS_INFORMATION, *PRTL_USER_PROCESS_INFORMATION; 
3275 
3276 
3277 typedef struct _RTL_USER_PROCESS_PARAMETERS
3278 {
3279     ULONG MaximumLength;                            // Should be set before call RtlCreateProcessParameters
3280     ULONG Length;                                   // Length of valid structure
3281     ULONG Flags;                                    // Currently only PPF_NORMALIZED (1) is known:
3282                                                     //  - Means that structure is normalized by call RtlNormalizeProcessParameters
3283     ULONG DebugFlags;
3284 
3285     PVOID ConsoleHandle;                            // HWND to console window associated with process (if any).
3286     ULONG ConsoleFlags;
3287     HANDLE StandardInput;
3288     HANDLE StandardOutput;
3289     HANDLE StandardError;
3290 
3291     CURDIR CurrentDirectory;                        // Specified in DOS-like symbolic link path, ex: "C:/WinNT/SYSTEM32"
3292     UNICODE_STRING DllPath;                         // DOS-like paths separated by ‘;‘ where system should search for DLL files.
3293     UNICODE_STRING ImagePathName;                   // Full path in DOS-like format to process‘es file image.
3294     UNICODE_STRING CommandLine;                     // Command line
3295     PVOID Environment;                              // Pointer to environment block (see RtlCreateEnvironment)
3296     ULONG StartingX;
3297     ULONG StartingY;
3298     ULONG CountX;
3299     ULONG CountY;
3300     ULONG CountCharsX;
3301     ULONG CountCharsY;
3302     ULONG FillAttribute;                            // Fill attribute for console window
3303     ULONG WindowFlags;
3304     ULONG ShowWindowFlags;
3305     UNICODE_STRING WindowTitle;
3306     UNICODE_STRING DesktopInfo;                     // Name of WindowStation and Desktop objects, where process is assigned
3307     UNICODE_STRING ShellInfo;
3308     UNICODE_STRING RuntimeData;
3309     RTL_DRIVE_LETTER_CURDIR CurrentDirectores[0x20];
3310 
3311 } RTL_USER_PROCESS_PARAMETERS, *PRTL_USER_PROCESS_PARAMETERS;
3312 
3313 //
3314 // Process Environment Block
3315 //
3316 
3317 typedef struct _PEB_FREE_BLOCK
3318 {
3319     struct _PEB_FREE_BLOCK *Next;
3320     ULONG Size;
3321 
3322 } PEB_FREE_BLOCK, *PPEB_FREE_BLOCK; 
3323 
3324 
3325 typedef struct _PEB_LDR_DATA
3326 {
3327     ULONG Length;
3328     BOOLEAN Initialized;
3329     HANDLE SsHandle;
3330     LIST_ENTRY InLoadOrderModuleList;               // Points to the loaded modules (main EXE usually)
3331     LIST_ENTRY InMemoryOrderModuleList;             // Points to all modules (EXE and all DLLs)
3332     LIST_ENTRY InInitializationOrderModuleList;
3333     PVOID      EntryInProgress;
3334 
3335 } PEB_LDR_DATA, *PPEB_LDR_DATA; 
3336 
3337 
3338 typedef struct _LDR_DATA_TABLE_ENTRY
3339 {
3340     LIST_ENTRY InLoadOrderLinks;
3341     LIST_ENTRY InMemoryOrderLinks;
3342     LIST_ENTRY InInitializationOrderLinks;
3343     PVOID DllBase;                             // Base address of the module
3344     PVOID EntryPoint;
3345     ULONG SizeOfImage;
3346     UNICODE_STRING FullDllName;
3347     UNICODE_STRING BaseDllName;
3348     ULONG  Flags;
3349     USHORT LoadCount;
3350     USHORT TlsIndex;
3351     LIST_ENTRY HashLinks;
3352     PVOID SectionPointer;
3353     ULONG CheckSum;
3354     ULONG TimeDateStamp;
3355     PVOID LoadedImports;
3356     PVOID EntryPointActivationContext;
3357     PVOID PatchInformation;
3358     PVOID Unknown1;
3359     PVOID Unknown2;
3360     PVOID Unknown3;
3361 
3362 } LDR_DATA_TABLE_ENTRY, *PLDR_DATA_TABLE_ENTRY;
3363 
3364 
3365 typedef struct _PEB
3366 {
3367     BOOLEAN InheritedAddressSpace;      // These four fields cannot change unless the
3368     BOOLEAN ReadImageFileExecOptions;   //
3369     BOOLEAN BeingDebugged;              //
3370     BOOLEAN SpareBool;                  //
3371     HANDLE Mutant;                      // INITIAL_PEB structure is also updated.
3372 
3373     PVOID ImageBaseAddress;
3374     PPEB_LDR_DATA Ldr;
3375     PRTL_USER_PROCESS_PARAMETERS ProcessParameters;
3376     PVOID SubSystemData;
3377     PVOID ProcessHeap;
3378     PVOID FastPebLock;
3379     PVOID FastPebLockRoutine;
3380     PVOID FastPebUnlockRoutine;
3381     ULONG EnvironmentUpdateCount;
3382     PVOID KernelCallbackTable;
3383     HANDLE SystemReserved;
3384     PVOID  AtlThunkSListPtr32;
3385     PPEB_FREE_BLOCK FreeList;
3386     ULONG TlsExpansionCounter;
3387     PVOID TlsBitmap;
3388     ULONG TlsBitmapBits[2];         // relates to TLS_MINIMUM_AVAILABLE
3389     PVOID ReadOnlySharedMemoryBase;
3390     PVOID ReadOnlySharedMemoryHeap;
3391     PVOID *ReadOnlyStaticServerData;
3392     PVOID AnsiCodePageData;
3393     PVOID OemCodePageData;
3394     PVOID UnicodeCaseTableData;
3395 
3396     //
3397     // Useful information for LdrpInitialize
3398     
3399     ULONG NumberOfProcessors;
3400     ULONG NtGlobalFlag;
3401 
3402     //
3403     // Passed up from MmCreatePeb from Session Manager registry key
3404     //
3405 
3406     LARGE_INTEGER CriticalSectionTimeout;
3407     ULONG HeapSegmentReserve;
3408     ULONG HeapSegmentCommit;
3409     ULONG HeapDeCommitTotalFreeThreshold;
3410     ULONG HeapDeCommitFreeBlockThreshold;
3411 
3412     //
3413     // Where heap manager keeps track of all heaps created for a process
3414     // Fields initialized by MmCreatePeb.  ProcessHeaps is initialized
3415     // to point to the first free byte after the PEB and MaximumNumberOfHeaps
3416     // is computed from the page size used to hold the PEB, less the fixed
3417     // size of this data structure.
3418     //
3419 
3420     ULONG NumberOfHeaps;
3421     ULONG MaximumNumberOfHeaps;
3422     PVOID *ProcessHeaps;
3423 
3424     //
3425     //
3426     PVOID GdiSharedHandleTable;
3427     PVOID ProcessStarterHelper;
3428     PVOID GdiDCAttributeList;
3429     PVOID LoaderLock;
3430 
3431     //
3432     // Following fields filled in by MmCreatePeb from system values and/or
3433     // image header. These fields have changed since Windows NT 4.0,
3434     // so use with caution
3435     //
3436 
3437     ULONG OSMajorVersion;
3438     ULONG OSMinorVersion;
3439     USHORT OSBuildNumber;
3440     USHORT OSCSDVersion;
3441     ULONG OSPlatformId;
3442     ULONG ImageSubsystem;
3443     ULONG ImageSubsystemMajorVersion;
3444     ULONG ImageSubsystemMinorVersion;
3445     ULONG ImageProcessAffinityMask;
3446     ULONG GdiHandleBuffer[GDI_HANDLE_BUFFER_SIZE];
3447 
3448 } PEB, *PPEB;
3449 
3450 
3451 //
3452 // Thread environment block
3453 //
3454 
3455 typedef struct _TEB
3456 {
3457     NT_TIB NtTib;
3458     PVOID  EnvironmentPointer;
3459     CLIENT_ID ClientId;
3460     PVOID ActiveRpcHandle;
3461     PVOID ThreadLocalStoragePointer;
3462     PPEB ProcessEnvironmentBlock;
3463     ULONG LastErrorValue;
3464     ULONG CountOfOwnedCriticalSections;
3465     PVOID CsrClientThread;
3466     PVOID Win32ThreadInfo;
3467     // Incomplete
3468 
3469 } TEB, *PTEB;
3470 
3471 
3472 typedef struct _PROCESS_BASIC_INFORMATION
3473 {
3474     NTSTATUS ExitStatus;
3475     PPEB PebBaseAddress;
3476     ULONG_PTR AffinityMask;
3477     KPRIORITY BasePriority;
3478     ULONG_PTR UniqueProcessId;
3479     ULONG_PTR InheritedFromUniqueProcessId;
3480 
3481 } PROCESS_BASIC_INFORMATION,*PPROCESS_BASIC_INFORMATION;
3482 
3483 
3484 typedef VOID (NTAPI *PUSER_THREAD_START_ROUTINE)(IN PVOID ApcArgument1);
3485 
3486 #define SE_BACKUP_PRIVILEGE 0x11
3487 #define SE_RESTORE_PRIVILEGE 0x12
3488 #define SE_SHUTDOWN_PRIVILEGE 0x13
3489 #define SE_DEBUG_PRIVILEGE 0x14
3490 
3491 NTSYSAPI
3492 NTSTATUS
3493 NTAPI
3494 RtlAdjustPrivilege(
3495     ULONG    Privilege,
3496     BOOLEAN  Enable,
3497     BOOLEAN  CurrentThread,
3498     PBOOLEAN Enabled
3499     );
3500 
3501 
3502 NTSYSAPI
3503 NTSTATUS
3504 NTAPI
3505 RtlCreateProcessParameters(
3506     PRTL_USER_PROCESS_PARAMETERS *ProcessParameters,
3507     PUNICODE_STRING ImagePathName,
3508     PUNICODE_STRING DllPath,
3509     PUNICODE_STRING CurrentDirectory,
3510     PUNICODE_STRING CommandLine,
3511     PVOID Environment,
3512     PUNICODE_STRING WindowTitle,
3513     PUNICODE_STRING DesktopInfo,
3514     PUNICODE_STRING ShellInfo,
3515     PUNICODE_STRING RuntimeData
3516     );
3517 
3518 
3519 NTSYSAPI
3520 NTSTATUS
3521 NTAPI
3522 RtlDestroyProcessParameters(
3523     PRTL_USER_PROCESS_PARAMETERS ProcessParameters
3524     ); 
3525 
3526 
3527 NTSYSAPI
3528 NTSTATUS
3529 NTAPI
3530 RtlCreateUserProcess(
3531     PUNICODE_STRING NtImagePathName,
3532     ULONG Attributes,
3533     PRTL_USER_PROCESS_PARAMETERS ProcessParameters,
3534     PSECURITY_DESCRIPTOR ProcessSecurityDescriptor,
3535     PSECURITY_DESCRIPTOR ThreadSecurityDescriptor,
3536     HANDLE ParentProcess,
3537     BOOLEAN InheritHandles,
3538     HANDLE DebugPort,
3539     HANDLE ExceptionPort,
3540     PRTL_USER_PROCESS_INFORMATION ProcessInformation
3541     ); 
3542 
3543 
3544 NTSYSAPI
3545 NTSTATUS
3546 NTAPI
3547 RtlCreateUserThread(
3548     IN HANDLE Process,
3549     IN PSECURITY_DESCRIPTOR ThreadSecurityDescriptor OPTIONAL,
3550     IN BOOLEAN CreateSuspended,
3551     IN ULONG_PTR ZeroBits OPTIONAL,
3552     IN SIZE_T MaximumStackSize OPTIONAL,
3553     IN SIZE_T CommittedStackSize OPTIONAL,
3554     IN PUSER_THREAD_START_ROUTINE StartAddress,
3555     IN PVOID Parameter OPTIONAL,
3556     OUT PHANDLE Thread OPTIONAL,
3557     OUT PCLIENT_ID ClientId OPTIONAL
3558     );
3559 
3560 
3561 #define NtCurrentProcess() ((HANDLE) -1)
3562 #define NtCurrentThread()  ((HANDLE) -2)
3563 #define NtCurrentPeb()     (PPEB)(NtCurrentTeb()->ProcessEnvironmentBlock)
3564 
3565 
3566 NTSYSAPI
3567 NTSTATUS
3568 NTAPI
3569 NtCreateProcess(
3570     OUT PHANDLE ProcessHandle,
3571     IN  ACCESS_MASK DesiredAccess,
3572     IN  POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,
3573     IN  HANDLE ParentProcess,
3574     IN  BOOLEAN InheritObjectTable,
3575     IN  HANDLE SectionHandle OPTIONAL,
3576     IN  HANDLE DebugPort OPTIONAL,
3577     IN  HANDLE ExceptionPort OPTIONAL
3578     );
3579 
3580 NTSYSAPI
3581 NTSTATUS
3582 NTAPI
3583 ZwCreateProcess(
3584     OUT PHANDLE ProcessHandle,
3585     IN  ACCESS_MASK DesiredAccess,
3586     IN  POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,
3587     IN  HANDLE ParentProcess,
3588     IN  BOOLEAN InheritObjectTable,
3589     IN  HANDLE SectionHandle OPTIONAL,
3590     IN  HANDLE DebugPort OPTIONAL,
3591     IN  HANDLE ExceptionPort OPTIONAL
3592     );
3593 
3594 NTSYSAPI
3595 NTSTATUS
3596 NTAPI
3597 NtOpenProcess (
3598     OUT PHANDLE ProcessHandle,
3599     IN ACCESS_MASK DesiredAccess,
3600     IN POBJECT_ATTRIBUTES ObjectAttributes,
3601     IN PCLIENT_ID ClientId OPTIONAL
3602     );
3603 
3604 NTSYSAPI
3605 NTSTATUS
3606 NTAPI
3607 ZwOpenProcess (
3608     OUT PHANDLE ProcessHandle,
3609     IN ACCESS_MASK DesiredAccess,
3610     IN POBJECT_ATTRIBUTES ObjectAttributes,
3611     IN PCLIENT_ID ClientId OPTIONAL
3612     );
3613 
3614 NTSYSAPI
3615 NTSTATUS
3616 NTAPI
3617 NtOpenThread (
3618     OUT PHANDLE ThreadHandle,
3619     IN ACCESS_MASK DesiredAccess,
3620     IN POBJECT_ATTRIBUTES ObjectAttributes,
3621     IN PCLIENT_ID ClientId OPTIONAL
3622     );
3623 
3624 NTSYSAPI
3625 NTSTATUS
3626 NTAPI
3627 ZwOpenThread (
3628     OUT PHANDLE ThreadHandle,
3629     IN ACCESS_MASK DesiredAccess,
3630     IN POBJECT_ATTRIBUTES ObjectAttributes,
3631     IN PCLIENT_ID ClientId OPTIONAL
3632     );
3633 
3634 NTSYSAPI
3635 NTSTATUS
3636 NTAPI
3637 NtQueryInformationProcess(
3638     IN HANDLE ProcessHandle,
3639     IN PROCESSINFOCLASS ProcessInformationClass,
3640     OUT PVOID ProcessInformation,
3641     IN ULONG ProcessInformationLength,
3642     OUT PULONG ReturnLength OPTIONAL
3643     );
3644 
3645 NTSYSAPI
3646 NTSTATUS
3647 NTAPI
3648 ZwQueryInformationProcess(
3649     IN HANDLE ProcessHandle,
3650     IN PROCESSINFOCLASS ProcessInformationClass,
3651     OUT PVOID ProcessInformation,
3652     IN ULONG ProcessInformationLength,
3653     OUT PULONG ReturnLength OPTIONAL
3654     );
3655 
3656 NTSYSAPI
3657 NTSTATUS
3658 NTAPI
3659 NtQueryInformationThread(
3660     IN HANDLE ThreadHandle,
3661     IN THREADINFOCLASS ThreadInformationClass,
3662     OUT PVOID ThreadInformation,
3663     IN ULONG ThreadInformationLength,
3664     OUT PULONG ReturnLength OPTIONAL
3665     );
3666 
3667 NTSYSAPI
3668 NTSTATUS
3669 NTAPI
3670 ZwQueryInformationThread(
3671     IN HANDLE ThreadHandle,
3672     IN THREADINFOCLASS ThreadInformationClass,
3673     OUT PVOID ThreadInformation,
3674     IN ULONG ThreadInformationLength,
3675     OUT PULONG ReturnLength OPTIONAL
3676     );
3677 
3678 NTSYSAPI
3679 NTSTATUS
3680 NTAPI
3681 NtSetInformationProcess (
3682     IN HANDLE ProcessHandle,
3683     IN PROCESSINFOCLASS ProcessInformationClass,
3684     IN PVOID ProcessInformation,
3685     IN ULONG ProcessInformationLength
3686     );
3687 
3688 NTSYSAPI
3689 NTSTATUS
3690 NTAPI
3691 ZwSetInformationProcess(
3692     IN HANDLE ProcessHandle,
3693     IN PROCESSINFOCLASS ProcessInformationClass,
3694     IN PVOID ProcessInformation,
3695     IN ULONG ProcessInformationLength
3696     );
3697 
3698 NTSYSAPI
3699 NTSTATUS
3700 NTAPI
3701 NtSuspendProcess(
3702     IN HANDLE Process
3703     );
3704 
3705 NTSYSAPI
3706 NTSTATUS
3707 NTAPI
3708 NtResumeProcess(
3709     IN HANDLE Process
3710     );
3711 
3712 NTSYSAPI
3713 NTSTATUS
3714 NTAPI
3715 NtSuspendThread(
3716     IN HANDLE ThreadHandle,
3717     OUT PULONG PreviousSuspendCount OPTIONAL
3718     );
3719 
3720 NTSYSAPI
3721 NTSTATUS
3722 NTAPI
3723 NtResumeThread(
3724     IN HANDLE ThreadHandle,
3725     OUT PULONG PreviousSuspendCount OPTIONAL
3726     );
3727 
3728 NTSYSAPI
3729 NTSTATUS
3730 NTAPI
3731 NtTerminateThread(
3732     HANDLE Thread,
3733     NTSTATUS ExitStatus
3734     );
3735 
3736 
3737 NTSYSAPI
3738 NTSTATUS
3739 NTAPI
3740 ZwTerminateThread(
3741     HANDLE Thread,
3742     NTSTATUS ExitStatus
3743     );
3744 
3745 
3746 NTSYSAPI
3747 NTSTATUS
3748 NTAPI
3749 NtTerminateProcess(
3750     HANDLE Process,
3751     NTSTATUS ExitStatus
3752     );
3753 
3754 
3755 NTSYSAPI
3756 NTSTATUS
3757 NTAPI
3758 ZwTerminateProcess(
3759     HANDLE Process,
3760     NTSTATUS ExitStatus
3761     );
3762 
3763 //------------------------------------------------------------------------------
3764 // LPC Functions
3765 
3766 #define MAX_LPC_DATA 0x130    // Maximum number of bytes that can be copied through LPC
3767 
3768 // Valid values for PORT_MESSAGE::u2::s2::Type
3769 #define LPC_REQUEST                  1
3770 #define LPC_REPLY                    2
3771 #define LPC_DATAGRAM                 3
3772 #define LPC_LOST_REPLY               4
3773 #define LPC_PORT_CLOSED              5
3774 #define LPC_CLIENT_DIED              6
3775 #define LPC_EXCEPTION                7
3776 #define LPC_DEBUG_EVENT              8
3777 #define LPC_ERROR_EVENT              9
3778 #define LPC_CONNECTION_REQUEST      10
3779 
3780 #define ALPC_REQUEST            0x2000 | LPC_REQUEST
3781 #define ALPC_CONNECTION_REQUEST 0x2000 | LPC_CONNECTION_REQUEST
3782 
3783 
3784 //
3785 // Define header for Port Message
3786 //
3787 
3788 typedef struct _PORT_MESSAGE
3789 {
3790     union
3791     {
3792         struct
3793         {
3794             USHORT DataLength;          // Length of data following the header (bytes)
3795             USHORT TotalLength;         // Length of data + sizeof(PORT_MESSAGE)
3796         } s1;
3797         ULONG Length;
3798     } u1;
3799 
3800     union
3801     {
3802         struct
3803         {
3804             USHORT Type;
3805             USHORT DataInfoOffset;
3806         } s2;
3807         ULONG ZeroInit;
3808     } u2;
3809 
3810     union
3811     {
3812         CLIENT_ID ClientId;
3813         double   DoNotUseThisField;     // Force quadword alignment
3814     };
3815 
3816     ULONG  MessageId;                   // Identifier of the particular message instance
3817 
3818     union
3819     {
3820         ULONG_PTR ClientViewSize;       // Size of section created by the sender (in bytes)
3821         ULONG  CallbackId;              // 
3822     };
3823 
3824 } PORT_MESSAGE, *PPORT_MESSAGE;
3825 
3826 //
3827 // Define structure for initializing shared memory on the caller‘s side of the port
3828 //
3829 
3830 typedef struct _PORT_VIEW {
3831 
3832     ULONG  Length;                      // Size of this structure
3833     HANDLE SectionHandle;               // Handle to section object with
3834                                         // SECTION_MAP_WRITE and SECTION_MAP_READ
3835     ULONG  SectionOffset;               // The offset in the section to map a view for
3836                                         // the port data area. The offset must be aligned 
3837                                         // with the allocation granularity of the system.
3838     SIZE_T ViewSize;                    // The size of the view (in bytes)
3839     PVOID  ViewBase;                    // The base address of the view in the creator
3840                                         // 
3841     PVOID  ViewRemoteBase;              // The base address of the view in the process
3842                                         // connected to the port.
3843 } PORT_VIEW, *PPORT_VIEW;
3844 
3845 //
3846 // Define structure for shared memory coming from remote side of the port
3847 //
3848 
3849 typedef struct _REMOTE_PORT_VIEW {
3850 
3851     ULONG  Length;                      // Size of this structure
3852     SIZE_T ViewSize;                    // The size of the view (bytes)
3853     PVOID  ViewBase;                    // Base address of the view
3854 
3855 } REMOTE_PORT_VIEW, *PREMOTE_PORT_VIEW;
3856 
3857 //
3858 // Macro for initializing the message header
3859 //
3860 
3861 #ifndef InitializeMessageHeader
3862 #define InitializeMessageHeader(ph, l, t)                              3863 {                                                                      3864     (ph)->u1.s1.TotalLength      = (USHORT)(l);                        3865     (ph)->u1.s1.DataLength       = (USHORT)(l - sizeof(PORT_MESSAGE)); 3866     (ph)->u2.s2.Type             = (USHORT)(t);                        3867     (ph)->u2.s2.DataInfoOffset   = 0;                                  3868     (ph)->ClientId.UniqueProcess = NULL;                               3869     (ph)->ClientId.UniqueThread  = NULL;                               3870     (ph)->MessageId              = 0;                                  3871     (ph)->ClientViewSize         = 0;                                  3872 }
3873 #endif
3874 
3875 /*++
3876 
3877     NtCreatePort
3878     ============
3879 
3880     Creates a LPC port object. The creator of the LPC port becomes a server
3881     of LPC communication
3882 
3883     PortHandle - Points to a variable that will receive the
3884         port object handle if the call is successful.
3885 
3886     ObjectAttributes - Points to a structure that specifies the object抯
3887         attributes. OBJ_KERNEL_HANDLE, OBJ_OPENLINK, OBJ_OPENIF, OBJ_EXCLUSIVE,
3888         OBJ_PERMANENT, and OBJ_INHERIT are not valid attributes for a port object.
3889 
3890     MaxConnectionInfoLength - The maximum size, in bytes, of data that can
3891         be sent through the port.
3892 
3893     MaxMessageLength - The maximum size, in bytes, of a message
3894         that can be sent through the port.
3895 
3896     MaxPoolUsage - Specifies the maximum amount of NonPaged pool that can be used for
3897         message storage. Zero means default value.
3898 
3899     ZwCreatePort verifies that (MaxDataSize <= 0x104) and (MaxMessageSize <= 0x148).
3900  
3901 --*/
3902 
3903 NTSYSAPI
3904 NTSTATUS
3905 NTAPI
3906 NtCreatePort(
3907     OUT PHANDLE PortHandle,                     
3908     IN  POBJECT_ATTRIBUTES ObjectAttributes,
3909     IN  ULONG MaxConnectionInfoLength,
3910     IN  ULONG MaxMessageLength,
3911     IN  ULONG MaxPoolUsage
3912     );
3913 
3914 NTSYSAPI
3915 NTSTATUS
3916 NTAPI
3917 ZwCreatePort(
3918     OUT PHANDLE PortHandle,                     
3919     IN  POBJECT_ATTRIBUTES ObjectAttributes,
3920     IN  ULONG MaxConnectionInfoLength,
3921     IN  ULONG MaxMessageLength,
3922     IN  ULONG MaxPoolUsage
3923     );
3924 
3925 
3926 /*++
3927 
3928     NtConnectPort
3929     =============
3930 
3931     Creates a port connected to a named port (cliend side).
3932 
3933     PortHandle - A pointer to a variable that will receive the client
3934         communication port object handle value.
3935 
3936     PortName - Points to a structure that specifies the name
3937         of the port to connect to.
3938 
3939     SecurityQos - Points to a structure that specifies the level
3940         of impersonation available to the port listener.
3941 
3942     ClientView - Optionally points to a structure describing
3943         the shared memory region used to send large amounts of data
3944         to the listener; if the call is successful, this will be updated.
3945 
3946     ServerView - Optionally points to a caller-allocated buffer
3947         or variable that receives information on the shared memory region
3948         used by the listener to send large amounts of data to the
3949         caller.
3950 
3951     MaxMessageLength - Optionally points to a variable that receives the size,
3952         in bytes, of the largest message that can be sent through the port.
3953 
3954     ConnectionInformation - Optionally points to a caller-allocated
3955         buffer or variable that specifies connect data to send to the listener,
3956         and receives connect data sent by the listener.
3957 
3958     ConnectionInformationLength - Optionally points to a variable that
3959         specifies the size, in bytes, of the connect data to send
3960         to the listener, and receives the size of the connect data
3961         sent by the listener.
3962 
3963 --*/
3964  
3965 NTSYSAPI
3966 NTSTATUS
3967 NTAPI
3968 NtConnectPort(
3969     OUT PHANDLE PortHandle,
3970     IN  PUNICODE_STRING PortName,
3971     IN  PSECURITY_QUALITY_OF_SERVICE SecurityQos,
3972     IN  OUT PPORT_VIEW ClientView OPTIONAL,
3973     OUT PREMOTE_PORT_VIEW ServerView OPTIONAL,
3974     OUT PULONG MaxMessageLength OPTIONAL,
3975     IN  OUT PVOID ConnectionInformation OPTIONAL,
3976     IN  OUT PULONG ConnectionInformationLength OPTIONAL
3977     );
3978 
3979 
3980 NTSYSAPI
3981 NTSTATUS
3982 NTAPI
3983 ZwConnectPort(
3984     OUT PHANDLE PortHandle,
3985     IN  PUNICODE_STRING PortName,
3986     IN  PSECURITY_QUALITY_OF_SERVICE SecurityQos,
3987     IN  OUT PPORT_VIEW ClientView OPTIONAL,
3988     OUT PREMOTE_PORT_VIEW ServerView OPTIONAL,
3989     OUT PULONG MaxMessageLength OPTIONAL,
3990     IN  OUT PVOID ConnectionInformation OPTIONAL,
3991     IN  OUT PULONG ConnectionInformationLength OPTIONAL
3992     );
3993 
3994 
3995 /*++
3996 
3997     NtListenPort
3998     ============
3999 
4000     Listens on a port for a connection request message on the server side.
4001 
4002     PortHandle - A handle to a port object. The handle doesn‘t need 
4003         to grant any specific access.
4004 
4005     ConnectionRequest - Points to a caller-allocated buffer
4006         or variable that receives the connect message sent to
4007         the port.
4008 
4009 --*/
4010 
4011 
4012 NTSYSAPI
4013 NTSTATUS
4014 NTAPI
4015 NtListenPort(
4016     IN  HANDLE PortHandle,
4017     OUT PPORT_MESSAGE RequestMessage
4018     );
4019  
4020 NTSYSAPI
4021 NTSTATUS
4022 NTAPI
4023 ZwListenPort(
4024     IN  HANDLE PortHandle,
4025     OUT PPORT_MESSAGE RequestMessage
4026     );
4027 
4028 /*++
4029 
4030     NtAcceptConnectPort
4031     ===================
4032 
4033     Accepts or rejects a connection request on the server side.
4034 
4035     PortHandle - Points to a variable that will receive the port object
4036         handle if the call is successful.
4037 
4038     PortContext - A numeric identifier to be associated with the port.
4039 
4040     ConnectionRequest - Points to a caller-allocated buffer or variable
4041         that identifies the connection request and contains any connect
4042         data that should be returned to requestor of the connection
4043 
4044     AcceptConnection - Specifies whether the connection should
4045         be accepted or not
4046 
4047     ServerView - Optionally points to a structure describing
4048         the shared memory region used to send large amounts of data to the
4049         requestor; if the call is successful, this will be updated
4050 
4051     ClientView - Optionally points to a caller-allocated buffer
4052         or variable that receives information on the shared memory
4053         region used by the requestor to send large amounts of data to the
4054         caller
4055 
4056 --*/
4057 
4058 
4059 NTSYSAPI
4060 NTSTATUS
4061 NTAPI
4062 NtAcceptConnectPort(
4063     OUT PHANDLE PortHandle,
4064     IN  PVOID PortContext OPTIONAL,
4065     IN  PPORT_MESSAGE ConnectionRequest,
4066     IN  BOOLEAN AcceptConnection,
4067     IN  OUT PPORT_VIEW ServerView OPTIONAL,
4068     OUT PREMOTE_PORT_VIEW ClientView OPTIONAL
4069     );
4070 
4071 NTSYSAPI
4072 NTSTATUS
4073 NTAPI
4074 ZwAcceptConnectPort(
4075     OUT PHANDLE PortHandle,
4076     IN  PVOID PortContext OPTIONAL,
4077     IN  PPORT_MESSAGE ConnectionRequest,
4078     IN  BOOLEAN AcceptConnection,
4079     IN  OUT PPORT_VIEW ServerView OPTIONAL,
4080     OUT PREMOTE_PORT_VIEW ClientView OPTIONAL
4081     );
4082 
4083 
4084 /*++
4085 
4086     NtCompleteConnectPort
4087     =====================
4088 
4089     Completes the port connection process on the server side.
4090 
4091     PortHandle - A handle to a port object. The handle doesn‘t need 
4092         to grant any specific access.
4093 
4094 --*/
4095 
4096 
4097 NTSYSAPI
4098 NTSTATUS
4099 NTAPI
4100 NtCompleteConnectPort(
4101     IN  HANDLE PortHandle
4102     );
4103 
4104 
4105 NTSYSAPI
4106 NTSTATUS
4107 NTAPI
4108 ZwCompleteConnectPort(
4109     IN  HANDLE PortHandle
4110     );
4111 
4112 
4113 /*++
4114 
4115     NtRequestPort
4116     =============
4117 
4118     Sends a request message to a port (client side)
4119 
4120     PortHandle - A handle to a port object. The handle doesn‘t need 
4121         to grant any specific access.
4122 
4123     RequestMessage - Points to a caller-allocated buffer or variable
4124         that specifies the request message to send to the port.
4125 
4126 --*/
4127 
4128 NTSYSAPI
4129 NTSTATUS
4130 NTAPI
4131 NtRequestPort (
4132     IN  HANDLE PortHandle,
4133     IN  PPORT_MESSAGE RequestMessage
4134     );
4135 
4136 NTSYSAPI
4137 NTSTATUS
4138 NTAPI
4139 ZwRequestPort (
4140     IN  HANDLE PortHandle,
4141     IN  PPORT_MESSAGE RequestMessage
4142     );
4143 
4144 /*++
4145 
4146     NtRequestWaitReplyPort
4147     ======================
4148 
4149     Sends a request message to a port and waits for a reply (client side)
4150 
4151     PortHandle - A handle to a port object. The handle doesn‘t need 
4152         to grant any specific access.
4153 
4154     RequestMessage - Points to a caller-allocated buffer or variable
4155         that specifies the request message to send to the port.
4156 
4157     ReplyMessage - Points to a caller-allocated buffer or variable
4158         that receives the reply message sent to the port.
4159 
4160 --*/
4161 
4162 NTSYSAPI
4163 NTSTATUS
4164 NTAPI
4165 NtRequestWaitReplyPort(
4166     IN  HANDLE PortHandle,
4167     IN  PPORT_MESSAGE RequestMessage,
4168     OUT PPORT_MESSAGE ReplyMessage
4169     );
4170 
4171 
4172 NTSYSAPI
4173 NTSTATUS
4174 NTAPI
4175 ZwRequestWaitReplyPort(
4176     IN  HANDLE PortHandle,
4177     IN  PPORT_MESSAGE RequestMessage,
4178     OUT PPORT_MESSAGE ReplyMessage
4179     );
4180 
4181 
4182 /*++
4183 
4184     NtReplyPort
4185     ===========
4186 
4187     Sends a reply message to a port (Server side)
4188 
4189     PortHandle - A handle to a port object. The handle doesn‘t need 
4190         to grant any specific access.
4191 
4192     ReplyMessage - Points to a caller-allocated buffer or variable
4193         that specifies the reply message to send to the port.
4194 
4195 --*/
4196 
4197 
4198 NTSYSAPI
4199 NTSTATUS
4200 NTAPI
4201 NtReplyPort(
4202     IN  HANDLE PortHandle,
4203     IN  PPORT_MESSAGE ReplyMessage
4204     );
4205 
4206 NTSYSAPI
4207 NTSTATUS
4208 NTAPI
4209 ZwReplyPort(
4210     IN  HANDLE PortHandle,
4211     IN  PPORT_MESSAGE ReplyMessage
4212     );
4213 
4214 /*++
4215 
4216     NtReplyWaitReplyPort
4217     ====================
4218 
4219     Sends a reply message to a port and waits for a reply message
4220 
4221     PortHandle - A handle to a port object. The handle doesn‘t need 
4222         to grant any specific access.
4223 
4224     ReplyMessage - Points to a caller-allocated buffer or variable
4225         that specifies the reply message to send to the port.
4226 
4227 --*/
4228 
4229 NTSYSAPI
4230 NTSTATUS
4231 NTAPI
4232 NtReplyWaitReplyPort(
4233     IN  HANDLE PortHandle,
4234     IN  OUT PPORT_MESSAGE ReplyMessage
4235     );
4236 
4237 NTSYSAPI
4238 NTSTATUS
4239 NTAPI
4240 ZwReplyWaitReplyPort(
4241     IN  HANDLE PortHandle,
4242     IN  OUT PPORT_MESSAGE ReplyMessage
4243     );
4244 
4245 /*++
4246 
4247     NtReplyWaitReceivePort
4248     ======================
4249 
4250     Optionally sends a reply message to a port and waits for a
4251     message
4252 
4253     PortHandle - A handle to a port object. The handle doesn‘t need 
4254         to grant any specific access.
4255 
4256     PortContext - Optionally points to a variable that receives
4257         a numeric identifier associated with the port.
4258 
4259     ReplyMessage - Optionally points to a caller-allocated buffer
4260         or variable that specifies the reply message to send to the port.
4261 
4262     ReceiveMessage - Points to a caller-allocated buffer or variable
4263         that receives the message sent to the port.
4264 
4265 --*/
4266 
4267 NTSYSAPI
4268 NTSTATUS
4269 NTAPI
4270 NtReplyWaitReceivePort(
4271     IN  HANDLE PortHandle,
4272     OUT PVOID *PortContext OPTIONAL,
4273     IN  PPORT_MESSAGE ReplyMessage OPTIONAL,
4274     OUT PPORT_MESSAGE ReceiveMessage
4275     );
4276 
4277 NTSYSAPI
4278 NTSTATUS
4279 NTAPI
4280 ZwReplyWaitReceivePort(
4281     IN  HANDLE PortHandle,
4282     OUT PVOID *PortContext OPTIONAL,
4283     IN  PPORT_MESSAGE ReplyMessage OPTIONAL,
4284     OUT PPORT_MESSAGE ReceiveMessage
4285     );
4286 
4287 //-----------------------------------------------------------------------------
4288 // Heap functions
4289 
4290 #define HEAP_NO_SERIALIZE               0x00000001
4291 #define HEAP_GROWABLE                   0x00000002
4292 #define HEAP_GENERATE_EXCEPTIONS        0x00000004
4293 #define HEAP_ZERO_MEMORY                0x00000008
4294 #define HEAP_REALLOC_IN_PLACE_ONLY      0x00000010
4295 #define HEAP_TAIL_CHECKING_ENABLED      0x00000020
4296 #define HEAP_FREE_CHECKING_ENABLED      0x00000040
4297 #define HEAP_DISABLE_COALESCE_ON_FREE   0x00000080
4298 #define HEAP_CREATE_ALIGN_16            0x00010000
4299 #define HEAP_CREATE_ENABLE_TRACING      0x00020000
4300 #define HEAP_MAXIMUM_TAG                0x0FFF
4301 #define HEAP_PSEUDO_TAG_FLAG            0x8000
4302 
4303 //
4304 // Data structure for heap definition. This includes various
4305 // sizing parameters and callback routines, which, if left NULL,
4306 // result in default behavior
4307 //
4308 
4309 typedef struct RTL_HEAP_PARAMETERS {
4310     ULONG Length;        //sizeof(RTL_HEAP_PARAMETERS)
4311     ULONG SegmentReserve;
4312     ULONG SegmentCommit;
4313     ULONG DeCommitFreeBlockThreshold;
4314     ULONG DeCommitTotalFreeThreshold;
4315     ULONG MaximumAllocationSize;
4316     ULONG VirtualMemoryThreshold;
4317     ULONG InitialCommit;
4318     ULONG InitialReserve;
4319     PVOID CommitRoutine;
4320     ULONG Reserved;
4321 } RTL_HEAP_PARAMETERS, *PRTL_HEAP_PARAMETERS;
4322 
4323 
4324 #define RtlProcessHeap() (HANDLE)(NtCurrentTeb()->ProcessEnvironmentBlock->ProcessHeap)
4325 
4326 
4327 NTSYSAPI
4328 HANDLE
4329 NTAPI
4330 RtlCreateHeap (
4331     IN ULONG Flags,
4332     IN PVOID BaseAddress OPTIONAL,
4333     IN ULONG SizeToReserve,
4334     IN ULONG SizeToCommit,
4335     IN BOOLEAN Lock OPTIONAL,
4336     IN PRTL_HEAP_PARAMETERS Definition OPTIONAL
4337     );
4338 
4339 
4340 NTSYSAPI
4341 ULONG
4342 NTAPI
4343 RtlDestroyHeap (
4344     IN HANDLE HeapHandle
4345     );
4346 
4347 
4348 NTSYSAPI
4349 PVOID
4350 NTAPI 
4351 RtlAllocateHeap (
4352     IN HANDLE HeapHandle,
4353     IN ULONG Flags,
4354     IN SIZE_T Size
4355     );
4356 
4357 
4358 NTSYSAPI
4359 PVOID
4360 NTAPI 
4361 RtlReAllocateHeap (
4362     IN HANDLE HeapHandle,
4363     IN ULONG Flags,
4364     IN LPVOID Address,
4365     IN SIZE_T Size
4366     );
4367 
4368 
4369 NTSYSAPI
4370 BOOLEAN
4371 NTAPI
4372 RtlFreeHeap (
4373     IN HANDLE HeapHandle,
4374     IN ULONG Flags,
4375     IN PVOID Address
4376     );
4377 
4378 
4379 NTSYSAPI
4380 ULONG
4381 NTAPI
4382 RtlCompactHeap (
4383     IN HANDLE HeapHandle,
4384     IN ULONG Flags
4385     );
4386 
4387 
4388 NTSYSAPI
4389 BOOLEAN
4390 NTAPI
4391 RtlLockHeap (
4392     IN HANDLE HeapHandle
4393     );
4394 
4395 
4396 NTSYSAPI
4397 BOOLEAN
4398 NTAPI
4399 RtlUnlockHeap (
4400     IN HANDLE HeapHandle
4401     );
4402 
4403 
4404 NTSYSAPI
4405 ULONG
4406 NTAPI
4407 RtlSizeHeap (
4408     IN HANDLE HeapHandle,
4409     IN ULONG Flags,
4410     IN PVOID Address
4411     );
4412 
4413 
4414 NTSYSAPI
4415 BOOLEAN
4416 NTAPI
4417 RtlValidateHeap (
4418     IN HANDLE HeapHandle,
4419     IN ULONG Flags,
4420     IN PVOID Address OPTIONAL
4421     );
4422 
4423 
4424 //-----------------------------------------------------------------------------
4425 // Virtual memory functions
4426 
4427 typedef enum _MEMORY_INFORMATION_CLASS
4428 {
4429     MemoryBasicInformation,                 // 0x00 MEMORY_BASIC_INFORMATION
4430     MemoryWorkingSetInformation,            // 0x01
4431     MemoryMappedFilenameInformation,        // 0x02 UNICODE_STRING
4432     MemoryRegionInformation,                // 0x03
4433     MemoryWorkingSetExInformation           // 0x04
4434 
4435 } MEMORY_INFORMATION_CLASS;
4436 
4437 
4438 NTSYSAPI
4439 NTSTATUS
4440 NTAPI
4441 NtAllocateVirtualMemory (
4442     IN HANDLE ProcessHandle,
4443     IN OUT PVOID *BaseAddress,
4444     IN ULONG ZeroBits,
4445     IN OUT PSIZE_T RegionSize,
4446     IN ULONG AllocationType,
4447     IN ULONG Protect
4448     );
4449 
4450 
4451 NTSYSAPI
4452 NTSTATUS
4453 NTAPI
4454 ZwAllocateVirtualMemory (
4455     IN HANDLE ProcessHandle,
4456     IN OUT PVOID *BaseAddress,
4457     IN ULONG ZeroBits,
4458     IN OUT PSIZE_T RegionSize,
4459     IN ULONG AllocationType,
4460     IN ULONG Protect
4461     );
4462 
4463 
4464 NTSYSAPI
4465 NTSTATUS
4466 NTAPI
4467 NtFreeVirtualMemory (
4468     IN HANDLE ProcessHandle,
4469     IN OUT PVOID *BaseAddress,
4470     IN OUT PSIZE_T RegionSize,
4471     IN ULONG FreeType
4472     );
4473 
4474 
4475 NTSYSAPI
4476 NTSTATUS
4477 NTAPI
4478 ZwFreeVirtualMemory (
4479     IN HANDLE ProcessHandle,
4480     IN OUT PVOID *BaseAddress,
4481     IN OUT PSIZE_T RegionSize,
4482     IN ULONG FreeType
4483     );
4484 
4485 NTSYSAPI
4486 NTSTATUS
4487 NTAPI
4488 NtProtectVirtualMemory(
4489     IN HANDLE ProcessHandle,
4490     IN OUT PVOID *BaseAddress,
4491     IN OUT PSIZE_T RegionSize,
4492     IN ULONG NewProtect,
4493     OUT PULONG OldProtect
4494     );
4495 
4496 
4497 NTSYSAPI
4498 NTSTATUS
4499 NTAPI
4500 ZwProtectVirtualMemory(
4501     IN HANDLE ProcessHandle,
4502     IN OUT PVOID *BaseAddress,
4503     IN OUT PSIZE_T RegionSize,
4504     IN ULONG NewProtect,
4505     OUT PULONG OldProtect
4506     );
4507 
4508 
4509 NTSYSAPI
4510 NTSTATUS
4511 NTAPI
4512 NtReadVirtualMemory(
4513     IN HANDLE ProcessHandle,
4514     IN PVOID BaseAddress,
4515     OUT PVOID Buffer,
4516     IN ULONG BufferSize,
4517     OUT PULONG NumberOfBytesRead OPTIONAL
4518     );
4519 
4520 NTSYSAPI
4521 NTSTATUS
4522 NTAPI
4523 ZwReadVirtualMemory(
4524     IN HANDLE ProcessHandle,
4525     IN PVOID BaseAddress,
4526     OUT PVOID Buffer,
4527     IN ULONG BufferSize,
4528     OUT PULONG NumberOfBytesRead OPTIONAL
4529     );
4530 
4531 
4532 NTSYSAPI
4533 NTSTATUS
4534 NTAPI
4535 NtWriteVirtualMemory(
4536     IN HANDLE ProcessHandle,
4537     IN PVOID BaseAddress,
4538     IN PVOID Buffer,
4539     IN ULONG BufferSize,
4540     OUT PULONG NumberOfBytesWritten OPTIONAL
4541     );
4542 
4543 
4544 NTSYSAPI
4545 NTSTATUS
4546 NTAPI
4547 ZwWriteVirtualMemory(
4548     IN HANDLE ProcessHandle,
4549     IN PVOID BaseAddress,
4550     IN PVOID Buffer,
4551     IN ULONG BufferSize,
4552     OUT PULONG NumberOfBytesWritten OPTIONAL
4553     );
4554 
4555 
4556 NTSYSAPI
4557 NTSTATUS
4558 NTAPI
4559 NtFlushVirtualMemory (
4560     IN HANDLE ProcessHandle,
4561     IN OUT PVOID *BaseAddress,
4562     IN OUT PSIZE_T RegionSize,
4563     OUT PIO_STATUS_BLOCK IoStatus
4564     );
4565 
4566 
4567 NTSYSAPI
4568 NTSTATUS
4569 NTAPI
4570 ZwFlushVirtualMemory (
4571     IN HANDLE ProcessHandle,
4572     IN OUT PVOID *BaseAddress,
4573     IN OUT PSIZE_T RegionSize,
4574     OUT PIO_STATUS_BLOCK IoStatus
4575     );
4576 
4577 
4578 NTSYSAPI
4579 NTSTATUS
4580 NTAPI
4581 NtQueryVirtualMemory(
4582     IN HANDLE ProcessHandle,
4583     IN PVOID BaseAddress,
4584     IN MEMORY_INFORMATION_CLASS MemoryInformationClass,
4585     OUT PVOID MemoryInformation,
4586     IN SIZE_T MemoryInformationLength,
4587     OUT PSIZE_T ReturnLength OPTIONAL
4588     );
4589 
4590 
4591 NTSYSAPI
4592 NTSTATUS
4593 NTAPI
4594 ZwQueryVirtualMemory(
4595     IN HANDLE ProcessHandle,
4596     IN PVOID BaseAddress,
4597     IN MEMORY_INFORMATION_CLASS MemoryInformationClass,
4598     OUT PVOID MemoryInformation,
4599     IN SIZE_T MemoryInformationLength,
4600     OUT PSIZE_T ReturnLength OPTIONAL
4601     );
4602 
4603 //-----------------------------------------------------------------------------
4604 // Section functions
4605 
4606 typedef enum _SECTION_INHERIT
4607 {
4608     ViewShare = 1,
4609     ViewUnmap = 2
4610 
4611 } SECTION_INHERIT;
4612 
4613 
4614 typedef enum _SECTION_INFORMATION_CLASS
4615 {
4616     SectionBasicInformation,
4617     SectionImageInformation
4618 
4619 } SECTION_INFORMATION_CLASS, *PSECTION_INFORMATION_CLASS;
4620 
4621 
4622 /*++
4623 
4624     NtCreateSection
4625     ===============
4626 
4627     Creates a section object.
4628 
4629     SectionHandle - Points to a variable that will receive the section
4630         object handle if the call is successful.
4631 
4632     DesiredAccess - Specifies the type of access that the caller requires
4633         to the section object. This parameter can be zero, or any combination
4634         of the following flags:
4635 
4636         SECTION_QUERY       - Query access
4637         SECTION_MAP_WRITE   - Can be written when mapped
4638         SECTION_MAP_READ    - Can be read when mapped
4639         SECTION_MAP_EXECUTE - Can be executed when mapped
4640         SECTION_EXTEND_SIZE - Extend access
4641         SECTION_ALL_ACCESS  - All of the preceding +
4642                               STANDARD_RIGHTS_REQUIRED
4643 
4644     ObjectAttributes - Points to a structure that specifies the object抯 attributes.
4645         OBJ_OPENLINK is not a valid attribute for a section object.
4646 
4647     MaximumSize - Optionally points to a variable that specifies the size,
4648         in bytes, of the section. If FileHandle is zero, the size must be
4649         specified; otherwise, it can be defaulted from the size of the file
4650         referred to by FileHandle.
4651 
4652     SectionPageProtection - The protection desired for the pages
4653         of the section when the section is mapped. This parameter can take
4654         one of the following values:
4655 
4656         PAGE_READONLY
4657         PAGE_READWRITE
4658         PAGE_WRITECOPY
4659         PAGE_EXECUTE
4660         PAGE_EXECUTE_READ
4661         PAGE_EXECUTE_READWRITE
4662         PAGE_EXECUTE_WRITECOPY
4663 
4664     AllocationAttributes - The attributes for the section. This parameter must
4665         be a combination of the following values:
4666 
4667         SEC_BASED     0x00200000    // Map section at same address in each process
4668         SEC_NO_CHANGE 0x00400000    // Disable changes to protection of pages
4669         SEC_IMAGE     0x01000000    // Map section as an image
4670         SEC_VLM       0x02000000    // Map section in VLM region
4671         SEC_RESERVE   0x04000000    // Reserve without allocating pagefile storage
4672         SEC_COMMIT    0x08000000    // Commit pages; the default behavior
4673         SEC_NOCACHE   0x10000000    // Mark pages as non-cacheable
4674 
4675     FileHandle - Identifies the file from which to create the section object.
4676         The file must be opened with an access mode compatible with the protection
4677         flags specified by the Protect parameter. If FileHandle is zero,
4678         the function creates a section object of the specified size backed
4679         by the paging file rather than by a named file in the file system.
4680 
4681 --*/
4682 
4683 
4684 NTSYSAPI
4685 NTSTATUS
4686 NTAPI
4687 NtCreateSection(
4688     OUT PHANDLE SectionHandle,
4689     IN  ACCESS_MASK DesiredAccess,
4690     IN  POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,
4691     IN  PLARGE_INTEGER MaximumSize OPTIONAL,
4692     IN  ULONG SectionPageProtection,
4693     IN  ULONG AllocationAttributes,
4694     IN  HANDLE FileHandle OPTIONAL
4695     );
4696 
4697 
4698 NTSYSAPI
4699 NTSTATUS
4700 NTAPI
4701 ZwCreateSection(
4702     OUT PHANDLE SectionHandle,
4703     IN  ACCESS_MASK DesiredAccess,
4704     IN  POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,
4705     IN  PLARGE_INTEGER MaximumSize OPTIONAL,
4706     IN  ULONG SectionPageProtection,
4707     IN  ULONG AllocationAttributes,
4708     IN  HANDLE FileHandle OPTIONAL
4709     );
4710 
4711 
4712 NTSYSAPI
4713 NTSTATUS
4714 NTAPI
4715 NtOpenSection (
4716     OUT PHANDLE SectionHandle,
4717     IN ACCESS_MASK DesiredAccess,
4718     IN POBJECT_ATTRIBUTES ObjectAttributes
4719     );
4720 
4721 
4722 NTSYSAPI
4723 NTSTATUS
4724 NTAPI
4725 ZwOpenSection (
4726     OUT PHANDLE SectionHandle,
4727     IN ACCESS_MASK DesiredAccess,
4728     IN POBJECT_ATTRIBUTES ObjectAttributes
4729     );
4730 
4731 
4732 NTSYSAPI
4733 NTSTATUS
4734 NTAPI
4735 NtMapViewOfSection (
4736     IN HANDLE SectionHandle,
4737     IN HANDLE ProcessHandle,
4738     IN OUT PVOID *BaseAddress,
4739     IN ULONG ZeroBits,
4740     IN ULONG CommitSize,
4741     IN OUT PLARGE_INTEGER SectionOffset OPTIONAL,
4742     IN OUT PULONG ViewSize,
4743     IN SECTION_INHERIT InheritDisposition,
4744     IN ULONG AllocationType,
4745     IN ULONG Protect
4746     );
4747 
4748 
4749 NTSYSAPI
4750 NTSTATUS
4751 NTAPI
4752 ZwMapViewOfSection (
4753     IN HANDLE SectionHandle,
4754     IN HANDLE ProcessHandle,
4755     IN OUT PVOID *BaseAddress,
4756     IN ULONG ZeroBits,
4757     IN ULONG CommitSize,
4758     IN OUT PLARGE_INTEGER SectionOffset OPTIONAL,
4759     IN OUT PULONG ViewSize,
4760     IN SECTION_INHERIT InheritDisposition,
4761     IN ULONG AllocationType,
4762     IN ULONG Protect
4763     );
4764 
4765 
4766 NTSYSAPI
4767 NTSTATUS
4768 NTAPI
4769 NtUnmapViewOfSection (
4770     IN HANDLE ProcessHandle,
4771     IN PVOID BaseAddress
4772     );
4773 
4774 
4775 NTSYSAPI
4776 NTSTATUS
4777 NTAPI
4778 ZwUnmapViewOfSection (
4779     IN HANDLE ProcessHandle,
4780     IN PVOID BaseAddress
4781     );
4782 
4783 
4784 NTSYSAPI
4785 NTSTATUS
4786 NTAPI
4787 NtExtendSection (
4788     IN HANDLE SectionHandle,
4789     IN OUT PLARGE_INTEGER SectionSize
4790     );
4791 
4792 
4793 NTSYSAPI
4794 NTSTATUS
4795 NTAPI
4796 ZwExtendSection (
4797     IN HANDLE SectionHandle,
4798     IN OUT PLARGE_INTEGER SectionSize
4799     );
4800 
4801 
4802 NTSYSAPI
4803 NTSTATUS
4804 NTAPI
4805 NtQuerySection (
4806     IN HANDLE SectionHandle,
4807     IN SECTION_INFORMATION_CLASS SectionInformationClass,
4808     OUT PVOID SectionInformation,
4809     IN ULONG Length,
4810     OUT PULONG ResultLength OPTIONAL
4811     );
4812 
4813 
4814 NTSYSAPI
4815 NTSTATUS
4816 NTAPI
4817 ZwQuerySection (
4818     IN HANDLE SectionHandle,
4819     IN SECTION_INFORMATION_CLASS SectionInformationClass,
4820     OUT PVOID SectionInformation,
4821     IN ULONG Length,
4822     OUT PULONG ResultLength OPTIONAL
4823     );
4824 
4825 
4826 //-----------------------------------------------------------------------------
4827 // Synchronization
4828 
4829 //
4830 // Wait type
4831 //
4832 
4833 typedef enum _WAIT_TYPE {
4834     WaitAll,
4835     WaitAny
4836     } WAIT_TYPE;
4837 
4838 
4839 NTSYSAPI
4840 NTSTATUS
4841 NTAPI
4842 NtWaitForSingleObject (
4843     IN HANDLE Handle,
4844     IN BOOLEAN Alertable,
4845     IN PLARGE_INTEGER Timeout OPTIONAL
4846     );
4847 
4848 
4849 NTSYSAPI
4850 NTSTATUS
4851 NTAPI
4852 ZwWaitForSingleObject (
4853     IN HANDLE Handle,
4854     IN BOOLEAN Alertable,
4855     IN PLARGE_INTEGER Timeout OPTIONAL
4856     );
4857 
4858 
4859 NTSYSAPI
4860 NTSTATUS
4861 NTAPI
4862 NtWaitForMultipleObjects (
4863     IN ULONG Count,
4864     IN HANDLE Handle[],
4865     IN WAIT_TYPE WaitType,
4866     IN BOOLEAN Alertable,
4867     IN PLARGE_INTEGER Timeout OPTIONAL
4868     );
4869 
4870 
4871 NTSYSAPI
4872 NTSTATUS
4873 NTAPI
4874 ZwWaitForMultipleObjects (
4875     IN ULONG Count,
4876     IN HANDLE Handle[],
4877     IN WAIT_TYPE WaitType,
4878     IN BOOLEAN Alertable,
4879     IN PLARGE_INTEGER Timeout OPTIONAL
4880     );
4881 
4882 
4883 //-----------------------------------------------------------------------------
4884 // Event support
4885 
4886 typedef enum _EVENT_INFORMATION_CLASS {
4887     EventBasicInformation    // = 0
4888 } EVENT_INFORMATION_CLASS;
4889 
4890 typedef struct _EVENT_BASIC_INFORMATION {
4891     EVENT_TYPE EventType;
4892     LONG EventState;
4893 } EVENT_BASIC_INFORMATION, *PEVENT_BASIC_INFORMATION;
4894 
4895 //
4896 // Event handling routines
4897 //
4898 
4899 
4900 NTSYSAPI
4901 NTSTATUS
4902 NTAPI
4903 NtCreateEvent (
4904     OUT PHANDLE EventHandle,
4905     IN ACCESS_MASK DesiredAccess,
4906     IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,
4907     IN EVENT_TYPE EventType,
4908     IN BOOLEAN InitialState
4909     );
4910 
4911 
4912 NTSYSAPI
4913 NTSTATUS
4914 NTAPI
4915 ZwCreateEvent (
4916     OUT PHANDLE EventHandle,
4917     IN ACCESS_MASK DesiredAccess,
4918     IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,
4919     IN EVENT_TYPE EventType,
4920     IN BOOLEAN InitialState
4921     );
4922 
4923 
4924 NTSYSAPI
4925 NTSTATUS
4926 NTAPI
4927 NtClearEvent (
4928     IN HANDLE Handle
4929     );
4930 
4931 
4932 NTSYSAPI
4933 NTSTATUS
4934 NTAPI
4935 ZwClearEvent (
4936     IN HANDLE Handle
4937     );
4938 
4939 
4940 NTSYSAPI
4941 NTSTATUS
4942 NTAPI
4943 NtPulseEvent (
4944     IN HANDLE Handle,
4945     OUT PLONG PreviousState OPTIONAL
4946     );
4947 
4948 
4949 NTSYSAPI
4950 NTSTATUS
4951 NTAPI
4952 ZwPulseEvent (
4953     IN HANDLE Handle,
4954     OUT PLONG PreviousState OPTIONAL
4955     );
4956 
4957 
4958 NTSYSAPI
4959 NTSTATUS
4960 NTAPI
4961 NtResetEvent (
4962     IN HANDLE Handle,
4963     OUT PLONG PreviousState OPTIONAL
4964     );
4965 
4966 
4967 NTSYSAPI
4968 NTSTATUS
4969 NTAPI
4970 ZwResetEvent (
4971     IN HANDLE Handle,
4972     OUT PLONG PreviousState OPTIONAL
4973     );
4974 
4975 
4976 NTSYSAPI
4977 NTSTATUS
4978 NTAPI
4979 NtSetEvent (
4980     IN HANDLE Handle,
4981     OUT PLONG PreviousState OPTIONAL
4982     );
4983 
4984 
4985 NTSYSAPI
4986 NTSTATUS
4987 NTAPI
4988 ZwSetEvent (
4989     IN HANDLE Handle,
4990     OUT PLONG PreviousState OPTIONAL
4991     );
4992 
4993 
4994 NTSYSAPI
4995 NTSTATUS
4996 NTAPI
4997 NtOpenEvent (
4998     OUT PHANDLE EventHandle,
4999     IN ACCESS_MASK DesiredAccess,
5000     IN POBJECT_ATTRIBUTES ObjectAttributes
5001     );
5002 
5003 
5004 NTSYSAPI
5005 NTSTATUS
5006 NTAPI
5007 ZwOpenEvent (
5008     OUT PHANDLE EventHandle,
5009     IN ACCESS_MASK DesiredAccess,
5010     IN POBJECT_ATTRIBUTES ObjectAttributes
5011     );
5012 
5013 
5014 NTSYSAPI
5015 NTSTATUS
5016 NTAPI
5017 NtQueryEvent (
5018     IN HANDLE EventHandle,
5019     IN EVENT_INFORMATION_CLASS EventInfoClass,
5020     OUT PVOID EventInfo,
5021     IN ULONG Length,
5022     OUT PULONG ResultLength OPTIONAL
5023     );
5024 
5025 
5026 NTSYSAPI
5027 NTSTATUS
5028 NTAPI
5029 ZwQueryEvent (
5030     IN HANDLE EventHandle,
5031     IN EVENT_INFORMATION_CLASS EventInfoClass,
5032     OUT PVOID EventInfo,
5033     IN ULONG Length,
5034     OUT PULONG ResultLength OPTIONAL
5035     );
5036 
5037 
5038 //-----------------------------------------------------------------------------
5039 // Mutant support
5040 
5041 NTSYSAPI
5042 NTSTATUS
5043 NTAPI
5044 NtCreateMutant(
5045     OUT PHANDLE MutantHandle,
5046     IN ACCESS_MASK DesiredAccess,
5047     IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,
5048     IN BOOLEAN InitialOwner
5049     );
5050 
5051 NTSYSAPI
5052 NTSTATUS
5053 NTAPI
5054 NtOpenMutant(
5055     OUT PHANDLE MutantHandle,
5056     IN ACCESS_MASK DesiredAccess,
5057     IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL
5058     );
5059 
5060 //-----------------------------------------------------------------------------
5061 // Semaphore support
5062 
5063 NTSYSAPI
5064 NTSTATUS
5065 NTAPI
5066 NtCreateSemaphore(
5067     OUT PHANDLE SemaphoreHandle,
5068     IN ACCESS_MASK DesiredAccess,
5069     IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,
5070     IN ULONG InitialCount,
5071     IN ULONG MaximumCount
5072     );
5073 
5074 NTSYSAPI
5075 NTSTATUS
5076 NTAPI
5077 NtOpenSemaphore(
5078     OUT PHANDLE SemaphoreHandle,
5079     IN ACCESS_MASK DesiredAccess,
5080     IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL
5081     );
5082 
5083 //-----------------------------------------------------------------------------
5084 // EventPair support
5085 
5086 #define EVENT_PAIR_ALL_ACCESS ( STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE )
5087 
5088 NTSYSAPI
5089 NTSTATUS
5090 NTAPI
5091 NtCreateEventPair(
5092     OUT PHANDLE EventPairHandle,
5093     IN ACCESS_MASK DesiredAccess,
5094     IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL
5095     );
5096 
5097 
5098 NTSYSAPI
5099 NTSTATUS
5100 NTAPI
5101 NtOpenEventPair(
5102     OUT PHANDLE EventPairHandle,
5103     IN ACCESS_MASK DesiredAccess,
5104     IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL
5105     );
5106 
5107 
5108 //-----------------------------------------------------------------------------
5109 // Security descriptor functions
5110 
5111 NTSYSAPI
5112 NTSTATUS
5113 NTAPI
5114 RtlCreateSecurityDescriptor (
5115     IN PSECURITY_DESCRIPTOR SecurityDescriptor,
5116     IN ULONG Revision
5117     );
5118 
5119 
5120 NTSYSAPI
5121 NTSTATUS
5122 NTAPI
5123 RtlGetDaclSecurityDescriptor(
5124     IN PSECURITY_DESCRIPTOR  SecurityDescriptor,
5125     OUT PBOOLEAN  DaclPresent,
5126     OUT PACL  *Dacl,
5127     OUT PBOOLEAN  DaclDefaulted
5128     );
5129 
5130 NTSYSAPI
5131 NTSTATUS
5132 NTAPI
5133 RtlSetDaclSecurityDescriptor(
5134     IN PSECURITY_DESCRIPTOR SecurityDescriptor,
5135     IN BOOLEAN DaclPresent,
5136     IN PACL Dacl OPTIONAL,
5137     IN BOOLEAN DaclDefaulted OPTIONAL
5138     );
5139 
5140 
5141 NTSYSAPI
5142 NTSTATUS
5143 NTAPI
5144 RtlSetOwnerSecurityDescriptor (
5145     IN PSECURITY_DESCRIPTOR SecurityDescriptor,
5146     IN PSID Owner OPTIONAL,
5147     IN BOOLEAN OwnerDefaulted OPTIONAL
5148     );
5149 
5150 
5151 NTSYSAPI
5152 NTSTATUS
5153 NTAPI
5154 RtlAllocateAndInitializeSid(
5155     IN PSID_IDENTIFIER_AUTHORITY IdentifierAuthority,
5156     IN UCHAR SubAuthorityCount,
5157     IN ULONG SubAuthority0,
5158     IN ULONG SubAuthority1,
5159     IN ULONG SubAuthority2,
5160     IN ULONG SubAuthority3,
5161     IN ULONG SubAuthority4,
5162     IN ULONG SubAuthority5,
5163     IN ULONG SubAuthority6,
5164     IN ULONG SubAuthority7,
5165     OUT PSID *Sid
5166     );
5167 
5168 
5169 NTSYSAPI
5170 ULONG
5171 NTAPI
5172 RtlLengthSid (
5173     IN PSID Sid
5174     );
5175 
5176 
5177 NTSYSAPI
5178 BOOLEAN
5179 NTAPI
5180 RtlEqualSid (
5181     IN PSID Sid1,
5182     IN PSID Sid2
5183     );
5184 
5185 
5186 NTSYSAPI
5187 PVOID
5188 NTAPI
5189 RtlFreeSid(
5190     IN PSID Sid
5191     ); 
5192 
5193 
5194 NTSYSAPI
5195 NTSTATUS
5196 NTAPI
5197 RtlCreateAcl(
5198     IN PACL Acl,
5199     IN ULONG AclLength,
5200     IN ULONG AclRevision
5201     );
5202 
5203 
5204 NTSYSAPI
5205 NTSTATUS
5206 NTAPI
5207 RtlGetAce(
5208     IN PACL Acl,
5209     IN ULONG AceIndex,
5210     OUT PVOID  *Ace
5211     );
5212 
5213 
5214 NTSYSAPI
5215 NTSTATUS
5216 NTAPI
5217 RtlAddAccessAllowedAce(
5218     IN OUT PACL Acl,
5219     IN ULONG AceRevision,
5220     IN ACCESS_MASK AccessMask,
5221     IN PSID Sid
5222     );
5223 
5224 
5225 NTSYSAPI
5226 NTSTATUS
5227 NTAPI
5228 RtlAddAccessAllowedAceEx(
5229     IN OUT PACL Acl,
5230     IN ULONG AceRevision,
5231     IN ULONG AceFlags,
5232     IN ULONG AccessMask,
5233     IN PSID Sid
5234     );
5235 
5236 //-----------------------------------------------------------------------------
5237 // Token functions
5238 
5239 NTSYSAPI
5240 NTSTATUS
5241 NTAPI
5242 NtOpenProcessToken(
5243     IN HANDLE ProcessHandle,
5244     IN ACCESS_MASK DesiredAccess,
5245     OUT PHANDLE TokenHandle
5246     );
5247 
5248 
5249 NTSYSAPI
5250 NTSTATUS
5251 NTAPI
5252 NtOpenThreadToken(
5253     IN HANDLE ThreadHandle,
5254     IN ACCESS_MASK DesiredAccess,
5255     IN BOOLEAN OpenAsSelf,
5256     OUT PHANDLE TokenHandle
5257     );
5258 
5259 
5260 NTSYSAPI
5261 NTSTATUS
5262 NTAPI
5263 NtQueryInformationToken(
5264     IN HANDLE  TokenHandle,
5265     IN TOKEN_INFORMATION_CLASS  TokenInformationClass,
5266     OUT PVOID  TokenInformation,
5267     IN ULONG  TokenInformationLength,
5268     OUT PULONG  ReturnLength
5269     );
5270 
5271 NTSYSAPI
5272 NTSTATUS
5273 NTAPI
5274 ZwQueryInformationToken(
5275     IN HANDLE  TokenHandle,
5276     IN TOKEN_INFORMATION_CLASS  TokenInformationClass,
5277     OUT PVOID  TokenInformation,
5278     IN ULONG  TokenInformationLength,
5279     OUT PULONG  ReturnLength
5280     );
5281 
5282 NTSYSAPI
5283 NTSTATUS
5284 NTAPI
5285 NtSetInformationToken(
5286     IN HANDLE  TokenHandle,
5287     IN TOKEN_INFORMATION_CLASS  TokenInformationClass,
5288     IN PVOID  TokenInformation,
5289     IN ULONG  TokenInformationLength
5290     );
5291 
5292 
5293 NTSYSAPI
5294 NTSTATUS
5295 NTAPI
5296 NtAdjustPrivilegesToken(
5297     IN HANDLE TokenHandle,
5298     IN BOOLEAN DisableAllPrivileges,
5299     IN PTOKEN_PRIVILEGES NewState OPTIONAL,
5300     IN ULONG BufferLength OPTIONAL,
5301     IN PTOKEN_PRIVILEGES PreviousState OPTIONAL,
5302     OUT PULONG ReturnLength
5303     );
5304 
5305 
5306 NTSYSAPI
5307 NTSTATUS
5308 NTAPI
5309 NtDuplicateToken(
5310     IN HANDLE ExistingTokenHandle,
5311     IN ACCESS_MASK DesiredAccess,
5312     IN POBJECT_ATTRIBUTES ObjectAttributes,
5313     IN BOOLEAN EffectiveOnly,
5314     IN TOKEN_TYPE TokenType,
5315     OUT PHANDLE NewTokenHandle
5316     );
5317 
5318 
5319 NTSYSAPI
5320 NTSTATUS
5321 NTAPI
5322 NtCompareTokens(
5323     IN  HANDLE FirstTokenHandle,
5324     IN  HANDLE SecondTokenHandle,
5325     OUT PBOOLEAN IdenticalTokens
5326     );  
5327 
5328 
5329 //-----------------------------------------------------------------------------
5330 // Symbolic links
5331 
5332 //
5333 // Object Manager Symbolic Link Specific Access Rights.
5334 //
5335 
5336 #ifndef SYMBOLIC_LINK_QUERY
5337 #define SYMBOLIC_LINK_QUERY (0x0001)
5338 #define SYMBOLIC_LINK_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | 0x1)
5339 #endif
5340 
5341 NTSYSAPI 
5342 NTSTATUS
5343 NTAPI
5344 NtCreateSymbolicLinkObject(
5345     OUT PHANDLE SymbolicLinkHandle,
5346     IN ACCESS_MASK DesiredAccess,
5347     IN POBJECT_ATTRIBUTES ObjectAttributes,
5348     IN PUNICODE_STRING DestinationName
5349     ); 
5350 
5351 
5352 NTSYSAPI
5353 NTSTATUS
5354 NTAPI
5355 NtOpenSymbolicLinkObject (
5356     OUT PHANDLE SymbolicLinkHandle,
5357     IN ACCESS_MASK DesiredAccess,
5358     IN POBJECT_ATTRIBUTES ObjectAttributes
5359     );
5360 
5361 
5362 NTSYSAPI
5363 NTSTATUS
5364 NTAPI
5365 NtQuerySymbolicLinkObject (
5366     IN HANDLE SymbolicLinkHandle,
5367     OUT PUNICODE_STRING NameString,
5368     OUT PULONG ResultLength OPTIONAL
5369     );
5370 
5371 //-----------------------------------------------------------------------------
5372 // Loader functions
5373 
5374 NTSYSAPI
5375 NTSTATUS
5376 NTAPI
5377 LdrLoadDll(
5378     IN PWSTR DllPath OPTIONAL,
5379     IN PULONG DllCharacteristics OPTIONAL,
5380     IN PUNICODE_STRING DllName,
5381     OUT PVOID *DllHandle
5382     );
5383 
5384 NTSYSAPI
5385 NTSTATUS
5386 NTAPI
5387 LdrGetDllHandle(
5388     IN PWSTR DllPath OPTIONAL,
5389     IN PULONG DllCharacteristics OPTIONAL,
5390     IN PUNICODE_STRING DllName,
5391     OUT PVOID * DllHandle
5392     );
5393 
5394 NTSYSAPI
5395 NTSTATUS
5396 NTAPI
5397 LdrUnloadDll(
5398     IN PVOID DllHandle
5399     );
5400 
5401 NTSYSAPI
5402 NTSTATUS
5403 NTAPI
5404 LdrGetProcedureAddress(
5405     IN PVOID DllHandle,
5406     IN PANSI_STRING ProcedureName OPTIONAL,
5407     IN ULONG ProcedureNumber OPTIONAL,
5408     OUT PVOID *ProcedureAddress
5409     );
5410 
5411 //-----------------------------------------------------------------------------
5412 // Driver functions
5413 
5414 NTSYSAPI
5415 NTSTATUS
5416 NTAPI
5417 NtLoadDriver(
5418     PUNICODE_STRING DriverServiceName
5419     );
5420 
5421 NTSYSAPI
5422 NTSTATUS
5423 NTAPI
5424 ZwLoadDriver(
5425     PUNICODE_STRING DriverServiceName
5426     );
5427 
5428 NTSYSAPI
5429 NTSTATUS
5430 NTAPI
5431 NtUnloadDriver(
5432     PUNICODE_STRING DriverServiceName
5433     );
5434 
5435 NTSYSAPI
5436 NTSTATUS
5437 NTAPI
5438 ZwUnloadDriver(
5439     PUNICODE_STRING DriverServiceName
5440     );
5441 
5442 //-----------------------------------------------------------------------------
5443 // Functions dealing with NTSTATUS and Win32 error
5444 
5445 NTSYSAPI
5446 ULONG
5447 NTAPI
5448 RtlNtStatusToDosError(
5449     NTSTATUS Status
5450     );
5451 
5452 
5453 NTSYSAPI
5454 ULONG
5455 NTAPI
5456 RtlNtStatusToDosErrorNoTeb(
5457     NTSTATUS Status
5458     );
5459 
5460 
5461 NTSYSAPI
5462 NTSTATUS
5463 NTAPI
5464 RtlGetLastNtStatus(
5465     );
5466 
5467 
5468 NTSYSAPI
5469 ULONG
5470 NTAPI
5471 RtlGetLastWin32Error(
5472     );
5473 
5474 
5475 NTSYSAPI
5476 VOID
5477 NTAPI
5478 RtlSetLastWin32Error(
5479     ULONG WinError
5480     );
5481 
5482 
5483 NTSYSAPI
5484 VOID
5485 NTAPI
5486 RtlSetLastWin32ErrorAndNtStatusFromNtStatus(
5487     NTSTATUS Status
5488     );
5489 
5490 
5491 //-----------------------------------------------------------------------------
5492 // Other functions
5493 
5494 NTSYSAPI 
5495 NTSTATUS
5496 NTAPI
5497 NtAllocateLocallyUniqueId(
5498     OUT PLUID LocallyUniqueId
5499     ); 
5500 
5501 
5502 NTSYSAPI
5503 NTSTATUS
5504 NTAPI
5505 NtDelayExecution(
5506     IN BOOLEAN Alertable,
5507     IN PLARGE_INTEGER DelayInterval
5508     );
5509 
5510 
5511 NTSYSAPI
5512 NTSTATUS
5513 NTAPI
5514 NtDisplayString(
5515     IN PUNICODE_STRING String
5516     );
5517 
5518 
5519 #ifdef __cplusplus
5520 } // extern "C"
5521 #endif
5522 
5523 #endif // __NTDLL_H__
Ntdll.h

 

Ntdll.h

原文:http://www.cnblogs.com/gwsbhqt/p/5092390.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!