1 ////////////////////////////////////////////////////////////////////
2 // Copyright (C) Alexander Telyatnikov, Ivan Keliukh, Yegor Anchishkin, SKIF Software, 1999-2013. Kiev, Ukraine
3 // All rights reserved
4 // This file was released under the GPLv2 on June 2015.
5 ////////////////////////////////////////////////////////////////////
6 
7 //======================================================================
8 //
9 // NT_Native.h
10 //
11 //======================================================================
12 
13 #ifndef __NT_NATIVE_DEFS__H__
14 #define __NT_NATIVE_DEFS__H__
15 
16 #ifdef __cplusplus
17 extern "C" {
18 #endif //__cplusplus
19 
20 #include <excpt.h>
21 #include <ntdef.h>
22 #include <ntstatus.h>
23 #include <string.h>
24 #include <DEVIOCTL.H>
25 #include <NTDDSTOR.H>
26 #include <NTDDDISK.H>
27 
28 typedef struct _KTHREAD *PKTHREAD;
29 typedef struct _ETHREAD *PETHREAD;
30 typedef struct _EPROCESS *PEPROCESS;
31 typedef struct _PEB *PPEB;
32 typedef struct _KINTERRUPT *PKINTERRUPT;
33 typedef struct _IO_TIMER *PIO_TIMER;
34 typedef struct _OBJECT_TYPE *POBJECT_TYPE;
35 typedef struct _CALLBACK_OBJECT *PCALLBACK_OBJECT;
36 typedef struct _DEVICE_HANDLER_OBJECT *PDEVICE_HANDLER_OBJECT;
37 typedef struct _BUS_HANDLER *PBUS_HANDLER;
38 
39 
40 typedef ULONG ACCESS_MASK;
41 typedef ACCESS_MASK *PACCESS_MASK;
42 
43 #define BOOL  BOOLEAN
44 #define DWORD ULONG
45 #define LPVOID PVOID
46 #define LPDWORD PULONG
47 
48 #define APIENTRY __stdcall
49 
50 #define FASTCALL _fastcall
51 
52 // end_winnt
53 //
54 //  The following are masks for the predefined standard access types
55 //
56 
57 #define DELETE                           (0x00010000L)
58 #define READ_CONTROL                     (0x00020000L)
59 #define WRITE_DAC                        (0x00040000L)
60 #define WRITE_OWNER                      (0x00080000L)
61 #define SYNCHRONIZE                      (0x00100000L)
62 
63 #define STANDARD_RIGHTS_REQUIRED         (0x000F0000L)
64 
65 #define STANDARD_RIGHTS_READ             (READ_CONTROL)
66 #define STANDARD_RIGHTS_WRITE            (READ_CONTROL)
67 #define STANDARD_RIGHTS_EXECUTE          (READ_CONTROL)
68 
69 #define STANDARD_RIGHTS_ALL              (0x001F0000L)
70 
71 #define SPECIFIC_RIGHTS_ALL              (0x0000FFFFL)
72 
73 //
74 // AccessSystemAcl access type
75 //
76 
77 #define ACCESS_SYSTEM_SECURITY           (0x01000000L)
78 
79 //
80 // MaximumAllowed access type
81 //
82 
83 #define MAXIMUM_ALLOWED                  (0x02000000L)
84 
85 //
86 //  These are the generic rights.
87 //
88 
89 #define GENERIC_READ                     (0x80000000L)
90 #define GENERIC_WRITE                    (0x40000000L)
91 #define GENERIC_EXECUTE                  (0x20000000L)
92 #define GENERIC_ALL                      (0x10000000L)
93 
94 
95 //
96 // Subroutines for dealing with the Registry
97 //
98 
99 typedef NTSTATUS (*PRTL_QUERY_REGISTRY_ROUTINE)(
100     IN PWSTR ValueName,
101     IN ULONG ValueType,
102     IN PVOID ValueData,
103     IN ULONG ValueLength,
104     IN PVOID Context,
105     IN PVOID EntryContext
106     );
107 
108 typedef struct _RTL_QUERY_REGISTRY_TABLE {
109     PRTL_QUERY_REGISTRY_ROUTINE QueryRoutine;
110     ULONG Flags;
111     PWSTR Name;
112     PVOID EntryContext;
113     ULONG DefaultType;
114     PVOID DefaultData;
115     ULONG DefaultLength;
116 
117 } RTL_QUERY_REGISTRY_TABLE, *PRTL_QUERY_REGISTRY_TABLE;
118 
119 
120 //
121 // The following flags specify how the Name field of a RTL_QUERY_REGISTRY_TABLE
122 // entry is interpreted.  A NULL name indicates the end of the table.
123 //
124 
125 #define RTL_QUERY_REGISTRY_SUBKEY   0x00000001  // Name is a subkey and remainder of
126                                                 // table or until next subkey are value
127                                                 // names for that subkey to look at.
128 
129 #define RTL_QUERY_REGISTRY_TOPKEY   0x00000002  // Reset current key to original key for
130                                                 // this and all following table entries.
131 
132 #define RTL_QUERY_REGISTRY_REQUIRED 0x00000004  // Fail if no match found for this table
133                                                 // entry.
134 
135 #define RTL_QUERY_REGISTRY_NOVALUE  0x00000008  // Used to mark a table entry that has no
136                                                 // value name, just wants a call out, not
137                                                 // an enumeration of all values.
138 
139 #define RTL_QUERY_REGISTRY_NOEXPAND 0x00000010  // Used to suppress the expansion of
140                                                 // REG_MULTI_SZ into multiple callouts or
141                                                 // to prevent the expansion of environment
142                                                 // variable values in REG_EXPAND_SZ
143 
144 #define RTL_QUERY_REGISTRY_DIRECT   0x00000020  // QueryRoutine field ignored.  EntryContext
145                                                 // field points to location to store value.
146                                                 // For null terminated strings, EntryContext
147                                                 // points to UNICODE_STRING structure that
148                                                 // that describes maximum size of buffer.
149                                                 // If .Buffer field is NULL then a buffer is
150                                                 // allocated.
151                                                 //
152 
153 #define RTL_QUERY_REGISTRY_DELETE   0x00000040  // Used to delete value keys after they
154                                                 // are queried.
155 
156 //
157 // The following values for the RelativeTo parameter determine what the
158 // Path parameter to RtlQueryRegistryValues is relative to.
159 //
160 
161 #define RTL_REGISTRY_ABSOLUTE     0   // Path is a full path
162 #define RTL_REGISTRY_SERVICES     1   // \Registry\Machine\System\CurrentControlSet\Services
163 #define RTL_REGISTRY_CONTROL      2   // \Registry\Machine\System\CurrentControlSet\Control
164 #define RTL_REGISTRY_WINDOWS_NT   3   // \Registry\Machine\Software\Microsoft\Windows NT\CurrentVersion
165 #define RTL_REGISTRY_DEVICEMAP    4   // \Registry\Machine\Hardware\DeviceMap
166 #define RTL_REGISTRY_USER         5   // \Registry\User\CurrentUser
167 #define RTL_REGISTRY_MAXIMUM      6
168 #define RTL_REGISTRY_HANDLE       0x40000000    // Low order bits are registry handle
169 #define RTL_REGISTRY_OPTIONAL     0x80000000    // Indicates the key node is optional
170 
171 
172 
173 NTSYSAPI
174 NTSTATUS
175 NTAPI
176 RtlCharToInteger (
177     PCSZ String,
178     ULONG Base,
179     PULONG Value
180     );
181 
182 NTSYSAPI
183 NTSTATUS
184 NTAPI
185 RtlIntegerToUnicodeString (
186     ULONG Value,
187     ULONG Base,
188     PUNICODE_STRING String
189     );
190 
191 NTSYSAPI
192 NTSTATUS
193 NTAPI
194 RtlUnicodeStringToInteger (
195     PUNICODE_STRING String,
196     ULONG Base,
197     PULONG Value
198     );
199 
200 
201 //
202 //  String manipulation routines
203 //
204 
205 #ifdef _NTSYSTEM_
206 
207 #define NLS_MB_CODE_PAGE_TAG NlsMbCodePageTag
208 #define NLS_MB_OEM_CODE_PAGE_TAG NlsMbOemCodePageTag
209 
210 #else
211 
212 #define NLS_MB_CODE_PAGE_TAG (*NlsMbCodePageTag)
213 #define NLS_MB_OEM_CODE_PAGE_TAG (*NlsMbOemCodePageTag)
214 
215 #endif // _NTSYSTEM_
216 
217 extern BOOLEAN NLS_MB_CODE_PAGE_TAG;     // TRUE -> Multibyte CP, FALSE -> Singlebyte
218 extern BOOLEAN NLS_MB_OEM_CODE_PAGE_TAG; // TRUE -> Multibyte CP, FALSE -> Singlebyte
219 
220 NTSYSAPI
221 VOID
222 NTAPI
223 RtlInitString(
224     PSTRING DestinationString,
225     PCSZ SourceString
226     );
227 
228 NTSYSAPI
229 VOID
230 NTAPI
231 RtlInitAnsiString(
232     PANSI_STRING DestinationString,
233     PCSZ SourceString
234     );
235 
236 NTSYSAPI
237 VOID
238 NTAPI
239 RtlInitUnicodeString(
240     PUNICODE_STRING DestinationString,
241     PCWSTR SourceString
242     );
243 
244 
245 NTSYSAPI
246 VOID
247 NTAPI
248 RtlCopyString(
249     PSTRING DestinationString,
250     PSTRING SourceString
251     );
252 
253 NTSYSAPI
254 CHAR
255 NTAPI
256 RtlUpperChar (
257     CHAR Character
258     );
259 
260 NTSYSAPI
261 LONG
262 NTAPI
263 RtlCompareString(
264     PSTRING String1,
265     PSTRING String2,
266     BOOLEAN CaseInSensitive
267     );
268 
269 NTSYSAPI
270 BOOLEAN
271 NTAPI
272 RtlEqualString(
273     PSTRING String1,
274     PSTRING String2,
275     BOOLEAN CaseInSensitive
276     );
277 
278 
279 NTSYSAPI
280 VOID
281 NTAPI
282 RtlUpperString(
283     PSTRING DestinationString,
284     PSTRING SourceString
285     );
286 
287 //
288 // NLS String functions
289 //
290 
291 NTSYSAPI
292 NTSTATUS
293 NTAPI
294 RtlAnsiStringToUnicodeString(
295     PUNICODE_STRING DestinationString,
296     PANSI_STRING SourceString,
297     BOOLEAN AllocateDestinationString
298     );
299 
300 
301 NTSYSAPI
302 NTSTATUS
303 NTAPI
304 RtlUnicodeStringToAnsiString(
305     PANSI_STRING DestinationString,
306     PUNICODE_STRING SourceString,
307     BOOLEAN AllocateDestinationString
308     );
309 
310 
311 NTSYSAPI
312 LONG
313 NTAPI
314 RtlCompareUnicodeString(
315     PUNICODE_STRING String1,
316     PUNICODE_STRING String2,
317     BOOLEAN CaseInSensitive
318     );
319 
320 NTSYSAPI
321 BOOLEAN
322 NTAPI
323 RtlEqualUnicodeString(
324     PUNICODE_STRING String1,
325     PUNICODE_STRING String2,
326     BOOLEAN CaseInSensitive
327     );
328 
329 NTSYSAPI
330 BOOLEAN
331 NTAPI
332 RtlPrefixUnicodeString(
333     IN PUNICODE_STRING String1,
334     IN PUNICODE_STRING String2,
335     IN BOOLEAN CaseInSensitive
336     );
337 
338 NTSYSAPI
339 NTSTATUS
340 NTAPI
341 RtlUpcaseUnicodeString(
342     PUNICODE_STRING DestinationString,
343     PUNICODE_STRING SourceString,
344     BOOLEAN AllocateDestinationString
345     );
346 
347 
348 NTSYSAPI
349 VOID
350 NTAPI
351 RtlCopyUnicodeString(
352     PUNICODE_STRING DestinationString,
353     PUNICODE_STRING SourceString
354     );
355 
356 NTSYSAPI
357 NTSTATUS
358 NTAPI
359 RtlAppendUnicodeStringToString (
360     PUNICODE_STRING Destination,
361     PUNICODE_STRING Source
362     );
363 
364 NTSYSAPI
365 NTSTATUS
366 NTAPI
367 RtlAppendUnicodeToString (
368     PUNICODE_STRING Destination,
369     PWSTR Source
370     );
371 
372 
373 NTSYSAPI
374 VOID
375 NTAPI
376 RtlFreeUnicodeString(
377     PUNICODE_STRING UnicodeString
378     );
379 
380 NTSYSAPI
381 VOID
382 NTAPI
383 RtlFreeAnsiString(
384     PANSI_STRING AnsiString
385     );
386 
387 
388 NTSYSAPI
389 ULONG
390 NTAPI
391 RtlxAnsiStringToUnicodeSize(
392     PANSI_STRING AnsiString
393     );
394 
395 //
396 //  NTSYSAPI
397 //  ULONG
398 //  NTAPI
399 //  RtlAnsiStringToUnicodeSize(
400 //      PANSI_STRING AnsiString
401 //      );
402 //
403 
404 #define RtlAnsiStringToUnicodeSize(STRING) (                 \
405     NLS_MB_CODE_PAGE_TAG ?                                   \
406     RtlxAnsiStringToUnicodeSize(STRING) :                    \
407     ((STRING)->Length + sizeof((UCHAR)NULL)) * sizeof(WCHAR) \
408 )
409 
410 #if DBG
411 NTSYSAPI
412 VOID
413 NTAPI
414 RtlAssert(
415     PVOID FailedAssertion,
416     PVOID FileName,
417     ULONG LineNumber,
418     PCHAR Message
419     );
420 
421 #define ASSERT( exp ) \
422     if (!(exp)) \
423         RtlAssert( #exp, __FILE__, __LINE__, NULL )
424 
425 #define ASSERTMSG( msg, exp ) \
426     if (!(exp)) \
427         RtlAssert( #exp, __FILE__, __LINE__, msg )
428 
429 #else
430 #define ASSERT( exp )
431 #define ASSERTMSG( msg, exp )
432 #endif // DBG
433 
434 //
435 // Fast primitives to compare, move, and zero memory
436 //
437 
438 // begin_winnt begin_ntndis
439 #if defined(_M_IX86) || defined(_M_MRX000) || defined(_M_ALPHA)
440 
441 #if defined(_M_MRX000)
442 NTSYSAPI
443 ULONG
444 NTAPI
445 RtlEqualMemory (
446     CONST VOID *Source1,
447     CONST VOID *Source2,
448     ULONG Length
449     );
450 
451 #else
452 #define RtlEqualMemory(Destination,Source,Length) (!memcmp((Destination),(Source),(Length)))
453 #endif
454 
455 #define RtlMoveMemory(Destination,Source,Length) memmove((Destination),(Source),(Length))
456 #define RtlCopyMemory(Destination,Source,Length) memcpy((Destination),(Source),(Length))
457 #define RtlFillMemory(Destination,Length,Fill) memset((Destination),(Fill),(Length))
458 #define RtlZeroMemory(Destination,Length) memset((Destination),0,(Length))
459 
460 #else // _M_PPC
461 
462 NTSYSAPI
463 ULONG
464 NTAPI
465 RtlEqualMemory (
466     CONST VOID *Source1,
467     CONST VOID *Source2,
468     ULONG Length
469     );
470 
471 NTSYSAPI
472 VOID
473 NTAPI
474 RtlCopyMemory (
475    VOID UNALIGNED *Destination,
476    CONST VOID UNALIGNED *Source,
477    ULONG Length
478    );
479 
480 NTSYSAPI
481 VOID
482 NTAPI
483 RtlCopyMemory32 (
484    VOID UNALIGNED *Destination,
485    CONST VOID UNALIGNED *Source,
486    ULONG Length
487    );
488 
489 NTSYSAPI
490 VOID
491 NTAPI
492 RtlMoveMemory (
493    VOID UNALIGNED *Destination,
494    CONST VOID UNALIGNED *Source,
495    ULONG Length
496    );
497 
498 NTSYSAPI
499 VOID
500 NTAPI
501 RtlFillMemory (
502    VOID UNALIGNED *Destination,
503    ULONG Length,
504    UCHAR Fill
505    );
506 
507 NTSYSAPI
508 VOID
509 NTAPI
510 RtlZeroMemory (
511    VOID UNALIGNED *Destination,
512    ULONG Length
513    );
514 #endif
515 // end_winnt end_ntndis
516 
517 NTSYSAPI
518 ULONG
519 NTAPI
520 RtlCompareMemory (
521     PVOID Source1,
522     PVOID Source2,
523     ULONG Length
524     );
525 
526 typedef struct _TIME_FIELDS {
527     CSHORT Year;        // range [1601...]
528     CSHORT Month;       // range [1..12]
529     CSHORT Day;         // range [1..31]
530     CSHORT Hour;        // range [0..23]
531     CSHORT Minute;      // range [0..59]
532     CSHORT Second;      // range [0..59]
533     CSHORT Milliseconds;// range [0..999]
534     CSHORT Weekday;     // range [0..6] == [Sunday..Saturday]
535 } TIME_FIELDS;
536 typedef TIME_FIELDS *PTIME_FIELDS;
537 
538 
539 NTSYSAPI
540 VOID
541 NTAPI
542 RtlTimeToTimeFields (
543     PLARGE_INTEGER Time,
544     PTIME_FIELDS TimeFields
545     );
546 
547 //
548 //  A time field record (Weekday ignored) -> 64 bit Time value
549 //
550 
551 NTSYSAPI
552 BOOLEAN
553 NTAPI
554 RtlTimeFieldsToTime (
555     PTIME_FIELDS TimeFields,
556     PLARGE_INTEGER Time
557     );
558 
559 //
560 //  Define the generic mapping array.  This is used to denote the
561 //  mapping of each generic access right to a specific access mask.
562 //
563 
564 typedef struct _GENERIC_MAPPING {
565     ACCESS_MASK GenericRead;
566     ACCESS_MASK GenericWrite;
567     ACCESS_MASK GenericExecute;
568     ACCESS_MASK GenericAll;
569 } GENERIC_MAPPING;
570 typedef GENERIC_MAPPING *PGENERIC_MAPPING;
571 
572 //
573 // Define the various device type values.  Note that values used by Microsoft
574 // Corporation are in the range 0-32767, and 32768-65535 are reserved for use
575 // by customers.
576 //
577 
578 #define DEVICE_TYPE ULONG
579 
580 //
581 // Macro definition for defining IOCTL and FSCTL function control codes.  Note
582 // that function codes 0-2047 are reserved for Microsoft Corporation, and
583 // 2048-4095 are reserved for customers.
584 //
585 
586 #define CTL_CODE( DeviceType, Function, Method, Access ) (                 \
587     ((DeviceType) << 16) | ((Access) << 14) | ((Function) << 2) | (Method) \
588 )
589 
590 //
591 // Define the method codes for how buffers are passed for I/O and FS controls
592 //
593 
594 #define METHOD_BUFFERED                 0
595 #define METHOD_IN_DIRECT                1
596 #define METHOD_OUT_DIRECT               2
597 #define METHOD_NEITHER                  3
598 
599 //
600 // Define the access check value for any access
601 //
602 //
603 // The FILE_READ_ACCESS and FILE_WRITE_ACCESS constants are also defined in
604 // ntioapi.h as FILE_READ_DATA and FILE_WRITE_DATA. The values for these
605 // constants *MUST* always be in sync.
606 //
607 
608 
609 #define FILE_ANY_ACCESS                 0
610 #define FILE_READ_ACCESS          ( 0x0001 )    // file & pipe
611 #define FILE_WRITE_ACCESS         ( 0x0002 )    // file & pipe
612 
613 
614 // begin_winnt
615 
616 //
617 // Define access rights to files and directories
618 //
619 
620 //
621 // The FILE_READ_DATA and FILE_WRITE_DATA constants are also defined in
622 // devioctl.h as FILE_READ_ACCESS and FILE_WRITE_ACCESS. The values for these
623 // constants *MUST* always be in sync.
624 // The values are redefined in devioctl.h because they must be available to
625 // both DOS and NT.
626 //
627 
628 #define FILE_READ_DATA            ( 0x0001 )    // file & pipe
629 #define FILE_LIST_DIRECTORY       ( 0x0001 )    // directory
630 
631 #define FILE_WRITE_DATA           ( 0x0002 )    // file & pipe
632 #define FILE_ADD_FILE             ( 0x0002 )    // directory
633 
634 #define FILE_APPEND_DATA          ( 0x0004 )    // file
635 #define FILE_ADD_SUBDIRECTORY     ( 0x0004 )    // directory
636 #define FILE_CREATE_PIPE_INSTANCE ( 0x0004 )    // named pipe
637 
638 #define FILE_READ_EA              ( 0x0008 )    // file & directory
639 
640 #define FILE_WRITE_EA             ( 0x0010 )    // file & directory
641 
642 #define FILE_EXECUTE              ( 0x0020 )    // file
643 #define FILE_TRAVERSE             ( 0x0020 )    // directory
644 
645 #define FILE_DELETE_CHILD         ( 0x0040 )    // directory
646 
647 #define FILE_READ_ATTRIBUTES      ( 0x0080 )    // all
648 
649 #define FILE_WRITE_ATTRIBUTES     ( 0x0100 )    // all
650 
651 #define FILE_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | 0x1FF)
652 
653 #define FILE_GENERIC_READ         (STANDARD_RIGHTS_READ     |\
654                                    FILE_READ_DATA           |\
655                                    FILE_READ_ATTRIBUTES     |\
656                                    FILE_READ_EA             |\
657                                    SYNCHRONIZE)
658 
659 
660 #define FILE_GENERIC_WRITE        (STANDARD_RIGHTS_WRITE    |\
661                                    FILE_WRITE_DATA          |\
662                                    FILE_WRITE_ATTRIBUTES    |\
663                                    FILE_WRITE_EA            |\
664                                    FILE_APPEND_DATA         |\
665                                    SYNCHRONIZE)
666 
667 
668 #define FILE_GENERIC_EXECUTE      (STANDARD_RIGHTS_EXECUTE  |\
669                                    FILE_READ_ATTRIBUTES     |\
670                                    FILE_EXECUTE             |\
671                                    SYNCHRONIZE)
672 
673 // end_winnt
674 
675 
676 //
677 // Define share access rights to files and directories
678 //
679 
680 #define FILE_SHARE_READ                 0x00000001  // winnt
681 #define FILE_SHARE_WRITE                0x00000002  // winnt
682 #define FILE_SHARE_DELETE               0x00000004  // winnt
683 #define FILE_SHARE_VALID_FLAGS          0x00000007
684 
685 //
686 // Define the file attributes values
687 //
688 // Note:  0x00000008 is reserved for use for the old DOS VOLID (volume ID)
689 //        and is therefore not considered valid in NT.
690 //
691 // Note:  0x00000010 is reserved for use for the old DOS SUBDIRECTORY flag
692 //        and is therefore not considered valid in NT.  This flag has
693 //        been disassociated with file attributes since the other flags are
694 //        protected with READ_ and WRITE_ATTRIBUTES access to the file.
695 //
696 // Note:  Note also that the order of these flags is set to allow both the
697 //        FAT and the Pinball File Systems to directly set the attributes
698 //        flags in attributes words without having to pick each flag out
699 //        individually.  The order of these flags should not be changed!
700 //
701 
702 #define FILE_ATTRIBUTE_READONLY         0x00000001  // winnt
703 #define FILE_ATTRIBUTE_HIDDEN           0x00000002  // winnt
704 #define FILE_ATTRIBUTE_SYSTEM           0x00000004  // winnt
705 #define FILE_ATTRIBUTE_DIRECTORY        0x00000010  // winnt
706 #define FILE_ATTRIBUTE_ARCHIVE          0x00000020  // winnt
707 #define FILE_ATTRIBUTE_NORMAL           0x00000080  // winnt
708 #define FILE_ATTRIBUTE_TEMPORARY        0x00000100  // winnt
709 #define FILE_ATTRIBUTE_RESERVED0        0x00000200
710 #define FILE_ATTRIBUTE_RESERVED1        0x00000400
711 #define FILE_ATTRIBUTE_COMPRESSED       0x00000800  // winnt
712 #define FILE_ATTRIBUTE_OFFLINE          0x00001000  // winnt
713 #define FILE_ATTRIBUTE_PROPERTY_SET     0x00002000
714 #define FILE_ATTRIBUTE_VALID_FLAGS      0x00003fb7
715 #define FILE_ATTRIBUTE_VALID_SET_FLAGS  0x00003fa7
716 
717 //
718 // Define the create disposition values
719 //
720 
721 #define FILE_SUPERSEDE                  0x00000000
722 #define FILE_OPEN                       0x00000001
723 #define FILE_CREATE                     0x00000002
724 #define FILE_OPEN_IF                    0x00000003
725 #define FILE_OVERWRITE                  0x00000004
726 #define FILE_OVERWRITE_IF               0x00000005
727 #define FILE_MAXIMUM_DISPOSITION        0x00000005
728 
729 
730 //
731 // Define the create/open option flags
732 //
733 
734 #define FILE_DIRECTORY_FILE                     0x00000001
735 #define FILE_WRITE_THROUGH                      0x00000002
736 #define FILE_SEQUENTIAL_ONLY                    0x00000004
737 #define FILE_NO_INTERMEDIATE_BUFFERING          0x00000008
738 
739 #define FILE_SYNCHRONOUS_IO_ALERT               0x00000010
740 #define FILE_SYNCHRONOUS_IO_NONALERT            0x00000020
741 #define FILE_NON_DIRECTORY_FILE                 0x00000040
742 #define FILE_CREATE_TREE_CONNECTION             0x00000080
743 
744 #define FILE_COMPLETE_IF_OPLOCKED               0x00000100
745 #define FILE_NO_EA_KNOWLEDGE                    0x00000200
746 //UNUSED                                        0x00000400
747 #define FILE_RANDOM_ACCESS                      0x00000800
748 
749 #define FILE_DELETE_ON_CLOSE                    0x00001000
750 #define FILE_OPEN_BY_FILE_ID                    0x00002000
751 #define FILE_OPEN_FOR_BACKUP_INTENT             0x00004000
752 #define FILE_NO_COMPRESSION                     0x00008000
753 
754 
755 #define FILE_RESERVE_OPFILTER                   0x00100000
756 #define FILE_TRANSACTED_MODE                    0x00200000
757 #define FILE_OPEN_OFFLINE_FILE                  0x00400000
758 
759 #define FILE_VALID_OPTION_FLAGS                 0x007fffff
760 #define FILE_VALID_PIPE_OPTION_FLAGS            0x00000032
761 #define FILE_VALID_MAILSLOT_OPTION_FLAGS        0x00000032
762 #define FILE_VALID_SET_FLAGS                    0x00000036
763 
764 //
765 // Define the I/O status information return values for NtCreateFile/NtOpenFile
766 //
767 
768 #define FILE_SUPERSEDED                 0x00000000
769 #define FILE_OPENED                     0x00000001
770 #define FILE_CREATED                    0x00000002
771 #define FILE_OVERWRITTEN                0x00000003
772 #define FILE_EXISTS                     0x00000004
773 #define FILE_DOES_NOT_EXIST             0x00000005
774 
775 //
776 // Define special ByteOffset parameters for read and write operations
777 //
778 
779 #define FILE_WRITE_TO_END_OF_FILE       0xffffffff
780 #define FILE_USE_FILE_POINTER_POSITION  0xfffffffe
781 
782 //
783 // Define alignment requirement values
784 //
785 
786 #define FILE_BYTE_ALIGNMENT             0x00000000
787 #define FILE_WORD_ALIGNMENT             0x00000001
788 #define FILE_LONG_ALIGNMENT             0x00000003
789 #define FILE_QUAD_ALIGNMENT             0x00000007
790 #define FILE_OCTA_ALIGNMENT             0x0000000f
791 #define FILE_32_BYTE_ALIGNMENT          0x0000001f
792 #define FILE_64_BYTE_ALIGNMENT          0x0000003f
793 #define FILE_128_BYTE_ALIGNMENT         0x0000007f
794 #define FILE_256_BYTE_ALIGNMENT         0x000000ff
795 #define FILE_512_BYTE_ALIGNMENT         0x000001ff
796 
797 //
798 // Define the maximum length of a filename string
799 //
800 
801 #define MAXIMUM_FILENAME_LENGTH         256
802 
803 //
804 // Define the various device characteristics flags
805 //
806 
807 #define FILE_REMOVABLE_MEDIA            0x00000001
808 #define FILE_READ_ONLY_DEVICE           0x00000002
809 #define FILE_FLOPPY_DISKETTE            0x00000004
810 #define FILE_WRITE_ONCE_MEDIA           0x00000008
811 #define FILE_REMOTE_DEVICE              0x00000010
812 #define FILE_DEVICE_IS_MOUNTED          0x00000020
813 #define FILE_VIRTUAL_VOLUME             0x00000040
814 
815 #ifndef _FILESYSTEMFSCTL_
816 #define _FILESYSTEMFSCTL_
817 
818 #endif // _FILESYSTEMFSCTL_
819 
820 //
821 // The following is a list of the native file system fsctls followed by
822 // additional network file system fsctls.  Some values have been
823 // decommissioned.
824 //
825 
826 #define FSCTL_REQUEST_OPLOCK_LEVEL_1    CTL_CODE(FILE_DEVICE_FILE_SYSTEM,  0, METHOD_BUFFERED, FILE_ANY_ACCESS)
827 #define FSCTL_REQUEST_OPLOCK_LEVEL_2    CTL_CODE(FILE_DEVICE_FILE_SYSTEM,  1, METHOD_BUFFERED, FILE_ANY_ACCESS)
828 #define FSCTL_REQUEST_BATCH_OPLOCK      CTL_CODE(FILE_DEVICE_FILE_SYSTEM,  2, METHOD_BUFFERED, FILE_ANY_ACCESS)
829 #define FSCTL_OPLOCK_BREAK_ACKNOWLEDGE  CTL_CODE(FILE_DEVICE_FILE_SYSTEM,  3, METHOD_BUFFERED, FILE_ANY_ACCESS)
830 #define FSCTL_OPBATCH_ACK_CLOSE_PENDING CTL_CODE(FILE_DEVICE_FILE_SYSTEM,  4, METHOD_BUFFERED, FILE_ANY_ACCESS)
831 #define FSCTL_OPLOCK_BREAK_NOTIFY       CTL_CODE(FILE_DEVICE_FILE_SYSTEM,  5, METHOD_BUFFERED, FILE_ANY_ACCESS)
832 #define FSCTL_LOCK_VOLUME               CTL_CODE(FILE_DEVICE_FILE_SYSTEM,  6, METHOD_BUFFERED, FILE_ANY_ACCESS)
833 #define FSCTL_UNLOCK_VOLUME             CTL_CODE(FILE_DEVICE_FILE_SYSTEM,  7, METHOD_BUFFERED, FILE_ANY_ACCESS)
834 #define FSCTL_DISMOUNT_VOLUME           CTL_CODE(FILE_DEVICE_FILE_SYSTEM,  8, METHOD_BUFFERED, FILE_ANY_ACCESS)
835 // decommissioned fsctl value                                              9
836 #define FSCTL_IS_VOLUME_MOUNTED         CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 10, METHOD_BUFFERED, FILE_ANY_ACCESS)
837 #define FSCTL_IS_PATHNAME_VALID         CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 11, METHOD_BUFFERED, FILE_ANY_ACCESS) // PATHNAME_BUFFER,
838 #define FSCTL_MARK_VOLUME_DIRTY         CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 12, METHOD_BUFFERED, FILE_ANY_ACCESS)
839 // decommissioned fsctl value                                             13
840 #define FSCTL_QUERY_RETRIEVAL_POINTERS  CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 14,  METHOD_NEITHER, FILE_ANY_ACCESS)
841 #define FSCTL_GET_COMPRESSION           CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 15, METHOD_BUFFERED, FILE_ANY_ACCESS)
842 #define FSCTL_SET_COMPRESSION           CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 16, METHOD_BUFFERED, FILE_READ_DATA | FILE_WRITE_DATA)
843 // decommissioned fsctl value                                             17
844 // decommissioned fsctl value                                             18
845 #define FSCTL_MARK_AS_SYSTEM_HIVE       CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 19,  METHOD_NEITHER, FILE_ANY_ACCESS)
846 #define FSCTL_OPLOCK_BREAK_ACK_NO_2     CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 20, METHOD_BUFFERED, FILE_ANY_ACCESS)
847 #define FSCTL_INVALIDATE_VOLUMES        CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 21, METHOD_BUFFERED, FILE_ANY_ACCESS)
848 #define FSCTL_QUERY_FAT_BPB             CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 22, METHOD_BUFFERED, FILE_ANY_ACCESS) // FSCTL_QUERY_FAT_BPB_BUFFER
849 #define FSCTL_REQUEST_FILTER_OPLOCK     CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 23, METHOD_BUFFERED, FILE_ANY_ACCESS)
850 #define FSCTL_FILESYSTEM_GET_STATISTICS CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 24, METHOD_BUFFERED, FILE_ANY_ACCESS) // FILESYSTEM_STATISTICS
851 #if(_WIN32_WINNT >= 0x0400)
852 #define FSCTL_GET_NTFS_VOLUME_DATA      CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 25, METHOD_BUFFERED, FILE_ANY_ACCESS) // NTFS_VOLUME_DATA_BUFFER
853 #define FSCTL_GET_NTFS_FILE_RECORD      CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 26, METHOD_BUFFERED, FILE_ANY_ACCESS) // NTFS_FILE_RECORD_INPUT_BUFFER, NTFS_FILE_RECORD_OUTPUT_BUFFER
854 #define FSCTL_GET_VOLUME_BITMAP         CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 27,  METHOD_NEITHER, FILE_ANY_ACCESS) // STARTING_LCN_INPUT_BUFFER, VOLUME_BITMAP_BUFFER
855 #define FSCTL_GET_RETRIEVAL_POINTERS    CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 28,  METHOD_NEITHER, FILE_ANY_ACCESS) // STARTING_VCN_INPUT_BUFFER, RETRIEVAL_POINTERS_BUFFER
856 #define FSCTL_MOVE_FILE                 CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 29, METHOD_BUFFERED, FILE_SPECIAL_ACCESS) // MOVE_FILE_DATA,
857 #define FSCTL_IS_VOLUME_DIRTY           CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 30, METHOD_BUFFERED, FILE_ANY_ACCESS)
858 // decomissioned fsctl value                                              31
859 #define FSCTL_ALLOW_EXTENDED_DASD_IO    CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 32, METHOD_NEITHER,  FILE_ANY_ACCESS)
860 #endif /* _WIN32_WINNT >= 0x0400 */
861 
862 //
863 // Define the base asynchronous I/O argument types
864 //
865 
866 typedef struct _IO_STATUS_BLOCK {
867     NTSTATUS Status;
868     ULONG Information;
869 } IO_STATUS_BLOCK, *PIO_STATUS_BLOCK;
870 
871 //
872 // Define an Asynchronous Procedure Call from I/O viewpoint
873 //
874 
875 typedef
876 VOID
877 (*PIO_APC_ROUTINE) (
878     IN PVOID ApcContext,
879     IN PIO_STATUS_BLOCK IoStatusBlock,
880     IN ULONG Reserved
881     );
882 
883 //
884 // Define the file information class values
885 //
886 // WARNING:  The order of the following values are assumed by the I/O system.
887 //           Any changes made here should be reflected there as well.
888 //
889 
890 typedef enum _FILE_INFORMATION_CLASS {
891     FileDirectoryInformation = 1,
892     FileFullDirectoryInformation,
893     FileBothDirectoryInformation,
894     FileBasicInformation,
895     FileStandardInformation,
896     FileInternalInformation,
897     FileEaInformation,
898     FileAccessInformation,
899     FileNameInformation,
900     FileRenameInformation,
901     FileLinkInformation,
902     FileNamesInformation,
903     FileDispositionInformation,
904     FilePositionInformation,
905     FileFullEaInformation,
906     FileModeInformation,
907     FileAlignmentInformation,
908     FileAllInformation,
909     FileAllocationInformation,
910     FileEndOfFileInformation,
911     FileAlternateNameInformation,
912     FileStreamInformation,
913     FilePipeInformation,
914     FilePipeLocalInformation,
915     FilePipeRemoteInformation,
916     FileMailslotQueryInformation,
917     FileMailslotSetInformation,
918     FileCompressionInformation,
919     FileCopyOnWriteInformation,
920     FileCompletionInformation,
921     FileMoveClusterInformation,
922     FileOleClassIdInformation,
923     FileOleStateBitsInformation,
924     FileNetworkOpenInformation,
925     FileObjectIdInformation,
926     FileOleAllInformation,
927     FileOleDirectoryInformation,
928     FileContentIndexInformation,
929     FileInheritContentIndexInformation,
930     FileOleInformation,
931     FileMaximumInformation
932 } FILE_INFORMATION_CLASS, *PFILE_INFORMATION_CLASS;
933 
934 //
935 // Define the various structures which are returned on query operations
936 //
937 
938 typedef struct _FILE_BASIC_INFORMATION {
939     LARGE_INTEGER CreationTime;
940     LARGE_INTEGER LastAccessTime;
941     LARGE_INTEGER LastWriteTime;
942     LARGE_INTEGER ChangeTime;
943     ULONG FileAttributes;
944 } FILE_BASIC_INFORMATION, *PFILE_BASIC_INFORMATION;
945 
946 typedef struct _FILE_STANDARD_INFORMATION {
947     LARGE_INTEGER AllocationSize;
948     LARGE_INTEGER EndOfFile;
949     ULONG NumberOfLinks;
950     BOOLEAN DeletePending;
951     BOOLEAN Directory;
952 } FILE_STANDARD_INFORMATION, *PFILE_STANDARD_INFORMATION;
953 
954 typedef struct _FILE_POSITION_INFORMATION {
955     LARGE_INTEGER CurrentByteOffset;
956 } FILE_POSITION_INFORMATION, *PFILE_POSITION_INFORMATION;
957 
958 typedef struct _FILE_ALIGNMENT_INFORMATION {
959     ULONG AlignmentRequirement;
960 } FILE_ALIGNMENT_INFORMATION, *PFILE_ALIGNMENT_INFORMATION;
961 
962 typedef struct _FILE_NETWORK_OPEN_INFORMATION {
963     LARGE_INTEGER CreationTime;
964     LARGE_INTEGER LastAccessTime;
965     LARGE_INTEGER LastWriteTime;
966     LARGE_INTEGER ChangeTime;
967     LARGE_INTEGER AllocationSize;
968     LARGE_INTEGER EndOfFile;
969     ULONG FileAttributes;
970 } FILE_NETWORK_OPEN_INFORMATION, *PFILE_NETWORK_OPEN_INFORMATION;
971 
972 typedef struct _FILE_DISPOSITION_INFORMATION {
973     BOOLEAN DeleteFile;
974 } FILE_DISPOSITION_INFORMATION, *PFILE_DISPOSITION_INFORMATION;
975 
976 typedef struct _FILE_END_OF_FILE_INFORMATION {
977     LARGE_INTEGER EndOfFile;
978 } FILE_END_OF_FILE_INFORMATION, *PFILE_END_OF_FILE_INFORMATION;
979 
980 
981 typedef struct _FILE_FULL_EA_INFORMATION {
982     ULONG NextEntryOffset;
983     UCHAR Flags;
984     UCHAR EaNameLength;
985     USHORT EaValueLength;
986     CHAR EaName[1];
987 } FILE_FULL_EA_INFORMATION, *PFILE_FULL_EA_INFORMATION;
988 
989 //
990 // Define the file system information class values
991 //
992 // WARNING:  The order of the following values are assumed by the I/O system.
993 //           Any changes made here should be reflected there as well.
994 
995 typedef enum _FSINFOCLASS {
996     FileFsVolumeInformation = 1,
997     FileFsLabelInformation,
998     FileFsSizeInformation,
999     FileFsDeviceInformation,
1000     FileFsAttributeInformation,
1001     FileFsControlInformation,
1002     FileFsQuotaQueryInformation,        // temporary
1003     FileFsQuotaSetInformation,          // temporary
1004     FileFsMaximumInformation
1005 } FS_INFORMATION_CLASS, *PFS_INFORMATION_CLASS;
1006 
1007 typedef struct _FILE_FS_DEVICE_INFORMATION {
1008     DEVICE_TYPE DeviceType;
1009     ULONG Characteristics;
1010 } FILE_FS_DEVICE_INFORMATION, *PFILE_FS_DEVICE_INFORMATION;
1011 
1012 //
1013 // Registry Specific Access Rights.
1014 //
1015 
1016 #define KEY_QUERY_VALUE         (0x0001)
1017 #define KEY_SET_VALUE           (0x0002)
1018 #define KEY_CREATE_SUB_KEY      (0x0004)
1019 #define KEY_ENUMERATE_SUB_KEYS  (0x0008)
1020 #define KEY_NOTIFY              (0x0010)
1021 #define KEY_CREATE_LINK         (0x0020)
1022 
1023 #define KEY_READ                ((STANDARD_RIGHTS_READ       |\
1024                                   KEY_QUERY_VALUE            |\
1025                                   KEY_ENUMERATE_SUB_KEYS     |\
1026                                   KEY_NOTIFY)                 \
1027                                   &                           \
1028                                  (~SYNCHRONIZE))
1029 
1030 
1031 #define KEY_WRITE               ((STANDARD_RIGHTS_WRITE      |\
1032                                   KEY_SET_VALUE              |\
1033                                   KEY_CREATE_SUB_KEY)         \
1034                                   &                           \
1035                                  (~SYNCHRONIZE))
1036 
1037 #define KEY_EXECUTE             ((KEY_READ)                   \
1038                                   &                           \
1039                                  (~SYNCHRONIZE))
1040 
1041 #define KEY_ALL_ACCESS          ((STANDARD_RIGHTS_ALL        |\
1042                                   KEY_QUERY_VALUE            |\
1043                                   KEY_SET_VALUE              |\
1044                                   KEY_CREATE_SUB_KEY         |\
1045                                   KEY_ENUMERATE_SUB_KEYS     |\
1046                                   KEY_NOTIFY                 |\
1047                                   KEY_CREATE_LINK)            \
1048                                   &                           \
1049                                  (~SYNCHRONIZE))
1050 
1051 //
1052 // Open/Create Options
1053 //
1054 
1055 #define REG_OPTION_RESERVED         (0x00000000L)   // Parameter is reserved
1056 
1057 #define REG_OPTION_NON_VOLATILE     (0x00000000L)   // Key is preserved
1058                                                     // when system is rebooted
1059 
1060 #define REG_OPTION_VOLATILE         (0x00000001L)   // Key is not preserved
1061                                                     // when system is rebooted
1062 
1063 #define REG_OPTION_CREATE_LINK      (0x00000002L)   // Created key is a
1064                                                     // symbolic link
1065 
1066 #define REG_OPTION_BACKUP_RESTORE   (0x00000004L)   // open for backup or restore
1067                                                     // special access rules
1068                                                     // privilege required
1069 
1070 #define REG_OPTION_OPEN_LINK        (0x00000008L)   // Open symbolic link
1071 
1072 #define REG_LEGAL_OPTION            \
1073                 (REG_OPTION_RESERVED            |\
1074                  REG_OPTION_NON_VOLATILE        |\
1075                  REG_OPTION_VOLATILE            |\
1076                  REG_OPTION_CREATE_LINK         |\
1077                  REG_OPTION_BACKUP_RESTORE      |\
1078                  REG_OPTION_OPEN_LINK)
1079 
1080 //
1081 // Key creation/open disposition
1082 //
1083 
1084 #define REG_CREATED_NEW_KEY         (0x00000001L)   // New Registry Key created
1085 #define REG_OPENED_EXISTING_KEY     (0x00000002L)   // Existing Key opened
1086 
1087 //
1088 // Key restore flags
1089 //
1090 
1091 #define REG_WHOLE_HIVE_VOLATILE     (0x00000001L)   // Restore whole hive volatile
1092 #define REG_REFRESH_HIVE            (0x00000002L)   // Unwind changes to last flush
1093 #define REG_NO_LAZY_FLUSH           (0x00000004L)   // Never lazy flush this hive
1094 
1095 //
1096 // Key query structures
1097 //
1098 
1099 typedef struct _KEY_BASIC_INFORMATION {
1100     LARGE_INTEGER LastWriteTime;
1101     ULONG   TitleIndex;
1102     ULONG   NameLength;
1103     WCHAR   Name[1];            // Variable length string
1104 } KEY_BASIC_INFORMATION, *PKEY_BASIC_INFORMATION;
1105 
1106 typedef struct _KEY_NODE_INFORMATION {
1107     LARGE_INTEGER LastWriteTime;
1108     ULONG   TitleIndex;
1109     ULONG   ClassOffset;
1110     ULONG   ClassLength;
1111     ULONG   NameLength;
1112     WCHAR   Name[1];            // Variable length string
1113 //          Class[1];           // Variable length string not declared
1114 } KEY_NODE_INFORMATION, *PKEY_NODE_INFORMATION;
1115 
1116 typedef struct _KEY_FULL_INFORMATION {
1117     LARGE_INTEGER LastWriteTime;
1118     ULONG   TitleIndex;
1119     ULONG   ClassOffset;
1120     ULONG   ClassLength;
1121     ULONG   SubKeys;
1122     ULONG   MaxNameLen;
1123     ULONG   MaxClassLen;
1124     ULONG   Values;
1125     ULONG   MaxValueNameLen;
1126     ULONG   MaxValueDataLen;
1127     WCHAR   Class[1];           // Variable length
1128 } KEY_FULL_INFORMATION, *PKEY_FULL_INFORMATION;
1129 
1130 typedef enum _KEY_INFORMATION_CLASS {
1131     KeyBasicInformation,
1132     KeyNodeInformation,
1133     KeyFullInformation
1134 } KEY_INFORMATION_CLASS;
1135 
1136 typedef struct _KEY_WRITE_TIME_INFORMATION {
1137     LARGE_INTEGER LastWriteTime;
1138 } KEY_WRITE_TIME_INFORMATION, *PKEY_WRITE_TIME_INFORMATION;
1139 
1140 typedef enum _KEY_SET_INFORMATION_CLASS {
1141     KeyWriteTimeInformation
1142 } KEY_SET_INFORMATION_CLASS;
1143 
1144 //
1145 // Value entry query structures
1146 //
1147 
1148 typedef struct _KEY_VALUE_BASIC_INFORMATION {
1149     ULONG   TitleIndex;
1150     ULONG   Type;
1151     ULONG   NameLength;
1152     WCHAR   Name[1];            // Variable size
1153 } KEY_VALUE_BASIC_INFORMATION, *PKEY_VALUE_BASIC_INFORMATION;
1154 
1155 typedef struct _KEY_VALUE_FULL_INFORMATION {
1156     ULONG   TitleIndex;
1157     ULONG   Type;
1158     ULONG   DataOffset;
1159     ULONG   DataLength;
1160     ULONG   NameLength;
1161     WCHAR   Name[1];            // Variable size
1162 //          Data[1];            // Variable size data not declared
1163 } KEY_VALUE_FULL_INFORMATION, *PKEY_VALUE_FULL_INFORMATION;
1164 
1165 typedef struct _KEY_VALUE_PARTIAL_INFORMATION {
1166     ULONG   TitleIndex;
1167     ULONG   Type;
1168     ULONG   DataLength;
1169     UCHAR   Data[1];            // Variable size
1170 } KEY_VALUE_PARTIAL_INFORMATION, *PKEY_VALUE_PARTIAL_INFORMATION;
1171 
1172 typedef struct _KEY_VALUE_ENTRY {
1173     PUNICODE_STRING ValueName;
1174     ULONG           DataLength;
1175     ULONG           DataOffset;
1176     ULONG           Type;
1177 } KEY_VALUE_ENTRY, *PKEY_VALUE_ENTRY;
1178 
1179 typedef enum _KEY_VALUE_INFORMATION_CLASS {
1180     KeyValueBasicInformation,
1181     KeyValueFullInformation,
1182     KeyValuePartialInformation
1183 } KEY_VALUE_INFORMATION_CLASS;
1184 
1185 
1186 NTSYSAPI
1187 NTSTATUS
1188 NTAPI
1189 NtEnumerateKey(
1190     IN HANDLE KeyHandle,
1191     IN ULONG Index,
1192     IN KEY_INFORMATION_CLASS KeyInformationClass,
1193     IN PVOID KeyInformation,
1194     IN ULONG Length,
1195     IN PULONG ResultLength
1196     );
1197 
1198 NTSYSAPI
1199 NTSTATUS
1200 NTAPI
1201 NtOpenKey(
1202     OUT PHANDLE KeyHandle,
1203     IN ACCESS_MASK DesiredAccess,
1204     IN POBJECT_ATTRIBUTES ObjectAttributes
1205     );
1206 
1207 NTSYSAPI
1208 NTSTATUS
1209 NTAPI
1210 NtQueryValueKey(
1211     IN HANDLE KeyHandle,
1212     IN PUNICODE_STRING ValueName,
1213     IN KEY_VALUE_INFORMATION_CLASS KeyValueInformationClass,
1214     IN PVOID KeyValueInformation,
1215     IN ULONG Length,
1216     IN PULONG ResultLength
1217     );
1218 
1219 NTSYSAPI
1220 NTSTATUS
1221 NTAPI
1222 NtSetValueKey(
1223     IN HANDLE KeyHandle,
1224     IN PUNICODE_STRING ValueName,
1225     IN ULONG TitleIndex OPTIONAL,
1226     IN ULONG Type,
1227     IN PVOID Data,
1228     IN ULONG DataSize
1229     );
1230 
1231 NTSYSAPI
1232 NTSTATUS
1233 NTAPI
1234 NtDeleteValueKey(
1235     IN HANDLE KeyHandle,
1236     IN PUNICODE_STRING ValueName
1237     );
1238 
1239 
1240 #define OBJ_NAME_PATH_SEPARATOR ((WCHAR)L'\\')
1241 
1242 //
1243 // Object Manager Object Type Specific Access Rights.
1244 //
1245 
1246 #define OBJECT_TYPE_CREATE (0x0001)
1247 
1248 #define OBJECT_TYPE_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | 0x1)
1249 
1250 //
1251 // Object Manager Directory Specific Access Rights.
1252 //
1253 
1254 #define DIRECTORY_QUERY                 (0x0001)
1255 #define DIRECTORY_TRAVERSE              (0x0002)
1256 #define DIRECTORY_CREATE_OBJECT         (0x0004)
1257 #define DIRECTORY_CREATE_SUBDIRECTORY   (0x0008)
1258 
1259 #define DIRECTORY_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | 0xF)
1260 
1261 //
1262 // Object Manager Symbolic Link Specific Access Rights.
1263 //
1264 
1265 #define SYMBOLIC_LINK_QUERY (0x0001)
1266 
1267 #define SYMBOLIC_LINK_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | 0x1)
1268 
1269 typedef struct _OBJECT_NAME_INFORMATION {
1270     UNICODE_STRING Name;
1271 } OBJECT_NAME_INFORMATION, *POBJECT_NAME_INFORMATION;
1272 
1273 //
1274 // Section Information Structures.
1275 //
1276 
1277 typedef enum _SECTION_INHERIT {
1278     ViewShare = 1,
1279     ViewUnmap = 2
1280 } SECTION_INHERIT;
1281 
1282 //
1283 // Section Access Rights.
1284 //
1285 
1286 // begin_winnt
1287 #define SECTION_QUERY       0x0001
1288 #define SECTION_MAP_WRITE   0x0002
1289 #define SECTION_MAP_READ    0x0004
1290 #define SECTION_MAP_EXECUTE 0x0008
1291 #define SECTION_EXTEND_SIZE 0x0010
1292 
1293 #define SECTION_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED|SECTION_QUERY|\
1294                             SECTION_MAP_WRITE |      \
1295                             SECTION_MAP_READ |       \
1296                             SECTION_MAP_EXECUTE |    \
1297                             SECTION_EXTEND_SIZE)
1298 // end_winnt
1299 
1300 #define SEGMENT_ALL_ACCESS SECTION_ALL_ACCESS
1301 
1302 #define PAGE_NOACCESS          0x01     // winnt
1303 #define PAGE_READONLY          0x02     // winnt
1304 #define PAGE_READWRITE         0x04     // winnt
1305 #define PAGE_WRITECOPY         0x08     // winnt
1306 #define PAGE_EXECUTE           0x10     // winnt
1307 #define PAGE_EXECUTE_READ      0x20     // winnt
1308 #define PAGE_EXECUTE_READWRITE 0x40     // winnt
1309 #define PAGE_EXECUTE_WRITECOPY 0x80     // winnt
1310 #define PAGE_GUARD            0x100     // winnt
1311 #define PAGE_NOCACHE          0x200     // winnt
1312 
1313 #define MEM_COMMIT           0x1000
1314 #define MEM_RESERVE          0x2000
1315 #define MEM_DECOMMIT         0x4000
1316 #define MEM_RELEASE          0x8000
1317 #define MEM_FREE            0x10000
1318 #define MEM_PRIVATE         0x20000
1319 #define MEM_MAPPED          0x40000
1320 #define MEM_RESET           0x80000
1321 #define MEM_TOP_DOWN       0x100000
1322 #define MEM_LARGE_PAGES  0x20000000
1323 #define SEC_RESERVE       0x4000000
1324 #define PROCESS_ALL_ACCESS        (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | \
1325                                    0xFFF)
1326 
1327 
1328 #define MAXIMUM_PROCESSORS 32
1329 
1330 // end_winnt
1331 
1332 //
1333 // Thread Specific Access Rights
1334 //
1335 
1336 #define THREAD_TERMINATE               (0x0001)  // winnt
1337 #define THREAD_SET_INFORMATION         (0x0020)  // winnt
1338 
1339 #define THREAD_ALL_ACCESS         (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | \
1340                                    0x3FF)
1341 
1342 //
1343 // ClientId
1344 //
1345 
1346 typedef struct _CLIENT_ID {
1347     HANDLE UniqueProcess;
1348     HANDLE UniqueThread;
1349 } CLIENT_ID;
1350 typedef CLIENT_ID *PCLIENT_ID;
1351 
1352 //
1353 //  Define the size of the 80387 save area, which is in the context frame.
1354 //
1355 
1356 #define SIZE_OF_80387_REGISTERS      80
1357 
1358 //
1359 // The following flags control the contents of the CONTEXT structure.
1360 //
1361 
1362 #if !defined(RC_INVOKED)
1363 
1364 #define CONTEXT_i386    0x00010000    // this assumes that i386 and
1365 #define CONTEXT_i486    0x00010000    // i486 have identical context records
1366 
1367 // end_wx86
1368 
1369 #define CONTEXT_CONTROL         (CONTEXT_i386 | 0x00000001L) // SS:SP, CS:IP, FLAGS, BP
1370 #define CONTEXT_INTEGER         (CONTEXT_i386 | 0x00000002L) // AX, BX, CX, DX, SI, DI
1371 #define CONTEXT_SEGMENTS        (CONTEXT_i386 | 0x00000004L) // DS, ES, FS, GS
1372 #define CONTEXT_FLOATING_POINT  (CONTEXT_i386 | 0x00000008L) // 387 state
1373 #define CONTEXT_DEBUG_REGISTERS (CONTEXT_i386 | 0x00000010L) // DB 0-3,6,7
1374 
1375 #define CONTEXT_FULL (CONTEXT_CONTROL | CONTEXT_INTEGER |\
1376                       CONTEXT_SEGMENTS)
1377 
1378 // begin_wx86
1379 
1380 #endif
1381 
1382 typedef struct _FLOATING_SAVE_AREA {
1383     ULONG   ControlWord;
1384     ULONG   StatusWord;
1385     ULONG   TagWord;
1386     ULONG   ErrorOffset;
1387     ULONG   ErrorSelector;
1388     ULONG   DataOffset;
1389     ULONG   DataSelector;
1390     UCHAR   RegisterArea[SIZE_OF_80387_REGISTERS];
1391     ULONG   Cr0NpxState;
1392 } FLOATING_SAVE_AREA;
1393 
1394 typedef FLOATING_SAVE_AREA *PFLOATING_SAVE_AREA;
1395 
1396 //
1397 // Context Frame
1398 //
1399 //  This frame has a several purposes: 1) it is used as an argument to
1400 //  NtContinue, 2) is is used to constuct a call frame for APC delivery,
1401 //  and 3) it is used in the user level thread creation routines.
1402 //
1403 //  The layout of the record conforms to a standard call frame.
1404 //
1405 
1406 typedef struct _CONTEXT {
1407 
1408     //
1409     // The flags values within this flag control the contents of
1410     // a CONTEXT record.
1411     //
1412     // If the context record is used as an input parameter, then
1413     // for each portion of the context record controlled by a flag
1414     // whose value is set, it is assumed that that portion of the
1415     // context record contains valid context. If the context record
1416     // is being used to modify a threads context, then only that
1417     // portion of the threads context will be modified.
1418     //
1419     // If the context record is used as an IN OUT parameter to capture
1420     // the context of a thread, then only those portions of the thread's
1421     // context corresponding to set flags will be returned.
1422     //
1423     // The context record is never used as an OUT only parameter.
1424     //
1425 
1426     ULONG ContextFlags;
1427 
1428     //
1429     // This section is specified/returned if CONTEXT_DEBUG_REGISTERS is
1430     // set in ContextFlags.  Note that CONTEXT_DEBUG_REGISTERS is NOT
1431     // included in CONTEXT_FULL.
1432     //
1433 
1434     ULONG   Dr0;
1435     ULONG   Dr1;
1436     ULONG   Dr2;
1437     ULONG   Dr3;
1438     ULONG   Dr6;
1439     ULONG   Dr7;
1440 
1441     //
1442     // This section is specified/returned if the
1443     // ContextFlags word contians the flag CONTEXT_FLOATING_POINT.
1444     //
1445 
1446     FLOATING_SAVE_AREA FloatSave;
1447 
1448     //
1449     // This section is specified/returned if the
1450     // ContextFlags word contians the flag CONTEXT_SEGMENTS.
1451     //
1452 
1453     ULONG   SegGs;
1454     ULONG   SegFs;
1455     ULONG   SegEs;
1456     ULONG   SegDs;
1457 
1458     //
1459     // This section is specified/returned if the
1460     // ContextFlags word contians the flag CONTEXT_INTEGER.
1461     //
1462 
1463     ULONG   Edi;
1464     ULONG   Esi;
1465     ULONG   Ebx;
1466     ULONG   Edx;
1467     ULONG   Ecx;
1468     ULONG   Eax;
1469 
1470     //
1471     // This section is specified/returned if the
1472     // ContextFlags word contians the flag CONTEXT_CONTROL.
1473     //
1474 
1475     ULONG   Ebp;
1476     ULONG   Eip;
1477     ULONG   SegCs;              // MUST BE SANITIZED
1478     ULONG   EFlags;             // MUST BE SANITIZED
1479     ULONG   Esp;
1480     ULONG   SegSs;
1481 
1482 } CONTEXT;
1483 
1484 
1485 
1486 typedef CONTEXT *PCONTEXT;
1487 
1488 //
1489 // Predefined Value Types.
1490 //
1491 
1492 #define REG_NONE                    ( 0 )   // No value type
1493 #define REG_SZ                      ( 1 )   // Unicode nul terminated string
1494 #define REG_EXPAND_SZ               ( 2 )   // Unicode nul terminated string
1495                                             // (with environment variable references)
1496 #define REG_BINARY                  ( 3 )   // Free form binary
1497 #define REG_DWORD                   ( 4 )   // 32-bit number
1498 #define REG_DWORD_LITTLE_ENDIAN     ( 4 )   // 32-bit number (same as REG_DWORD)
1499 #define REG_DWORD_BIG_ENDIAN        ( 5 )   // 32-bit number
1500 #define REG_LINK                    ( 6 )   // Symbolic Link (unicode)
1501 #define REG_MULTI_SZ                ( 7 )   // Multiple Unicode strings
1502 #define REG_RESOURCE_LIST           ( 8 )   // Resource list in the resource map
1503 #define REG_FULL_RESOURCE_DESCRIPTOR ( 9 )  // Resource list in the hardware description
1504 #define REG_RESOURCE_REQUIREMENTS_LIST ( 10 )
1505 
1506 /*
1507 LONG
1508 FASTCALL
1509 InterlockedIncrement(
1510     IN PLONG Addend
1511     );
1512 
1513 LONG
1514 FASTCALL
1515 InterlockedDecrement(
1516     IN PLONG Addend
1517     );
1518 
1519 LONG
1520 FASTCALL
1521 InterlockedExchange(
1522     IN OUT PLONG Target,
1523     IN LONG Value
1524     );
1525 
1526 LONG
1527 FASTCALL
1528 InterlockedExchangeAdd(
1529     IN OUT PLONG Addend,
1530     IN LONG Increment
1531     );
1532 
1533 PVOID
1534 FASTCALL
1535 InterlockedCompareExchange(
1536     IN OUT PVOID *Destination,
1537     IN PVOID ExChange,
1538     IN PVOID Comperand
1539     );
1540 */
1541 //
1542 // Environment information, which includes command line and
1543 // image file name
1544 //
1545 typedef struct {
1546        ULONG            Unknown[21];
1547        UNICODE_STRING   CommandLine;
1548        UNICODE_STRING   ImageFile;
1549 } ENVIRONMENT_INFORMATION, *PENVIRONMENT_INFORMATION;
1550 
1551 //
1552 // This structure is passed as NtProcessStartup's parameter
1553 //
1554 typedef struct {
1555        ULONG                     Unknown[3];
1556        PENVIRONMENT_INFORMATION  Environment;
1557 } STARTUP_ARGUMENT, *PSTARTUP_ARGUMENT;
1558 
1559 //
1560 // Data structure for heap definition. This includes various
1561 // sizing parameters and callback routines, which, if left NULL,
1562 // result in default behavior
1563 //
1564 typedef struct {
1565     ULONG       Length;
1566     ULONG       Unknown[11];
1567 } RTL_HEAP_DEFINITION, *PRTL_HEAP_DEFINITION;
1568 
1569 //
1570 // Native NT api function to write something to the boot-time
1571 // blue screen
1572 //
1573 NTSTATUS
1574 NTAPI
1575 NtDisplayString(
1576         PUNICODE_STRING String
1577         );
1578 
1579 //
1580 // Native applications must kill themselves when done - the job
1581 // of this native API
1582 //
1583 NTSTATUS
1584 NTAPI
1585 NtTerminateProcess(
1586            HANDLE ProcessHandle,
1587            LONG ExitStatus
1588            );
1589 
1590 //
1591 // Thread start function
1592 //
1593 
1594 typedef
1595 VOID
1596 (*PKSTART_ROUTINE) (
1597     IN PVOID StartContext
1598     );
1599 
1600 typedef struct StackInfo_t {
1601     ULONG Unknown1;
1602     ULONG Unknown2;
1603     ULONG TopOfStack;
1604     ULONG OnePageBelowTopOfStack;
1605     ULONG BottomOfStack;
1606 } STACKINFO, *PSTACKINFO;
1607 
1608 NTSYSAPI
1609 NTSTATUS
1610 NTAPI
1611 NtCreateThread(
1612     OUT PHANDLE phThread,
1613     IN ACCESS_MASK AccessMask,
1614     IN POBJECT_ATTRIBUTES ObjectAttributes,
1615     IN HANDLE hProcess,
1616     OUT PCLIENT_ID pClientId,
1617     IN PCONTEXT pContext,
1618     OUT PSTACKINFO pStackInfo,
1619     IN BOOLEAN bSuspended
1620 );
1621 
1622 /*NTSTATUS
1623 PsCreateSystemThread(
1624     OUT PHANDLE ThreadHandle,
1625     IN ACCESS_MASK DesiredAccess,
1626     IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,
1627     IN HANDLE ProcessHandle OPTIONAL,
1628     OUT PCLIENT_ID ClientId OPTIONAL,
1629     IN PKSTART_ROUTINE StartRoutine,
1630     IN PVOID StartContext
1631     );
1632 */
1633 NTSTATUS
1634 NtTerminateThread(
1635     IN HANDLE ThreadHandle OPTIONAL,
1636     IN NTSTATUS ExitStatus
1637     );
1638 
1639 /*
1640 BOOLEAN
1641 PsGetVersion(
1642     PULONG MajorVersion OPTIONAL,
1643     PULONG MinorVersion OPTIONAL,
1644     PULONG BuildNumber OPTIONAL,
1645     PUNICODE_STRING CSDVersion OPTIONAL
1646     );
1647 
1648 HANDLE
1649 PsGetCurrentProcessId( VOID );
1650 
1651 HANDLE
1652 PsGetCurrentThreadId( VOID );
1653 */
1654 //
1655 // Definition to represent current process
1656 //
1657 #define NtCurrentProcess() ( (HANDLE) -1 )
1658 
1659 typedef NTSTATUS
1660 (*PRTL_HEAP_COMMIT_ROUTINE)(
1661     IN PVOID Base,
1662     IN OUT PVOID *CommitAddress,
1663     IN OUT PULONG CommitSize
1664     );
1665 
1666 typedef struct _RTL_HEAP_PARAMETERS {
1667     ULONG Length;
1668     ULONG SegmentReserve;
1669     ULONG SegmentCommit;
1670     ULONG DeCommitFreeBlockThreshold;
1671     ULONG DeCommitTotalFreeThreshold;
1672     ULONG MaximumAllocationSize;
1673     ULONG VirtualMemoryThreshold;
1674     ULONG InitialCommit;
1675     ULONG InitialReserve;
1676     PRTL_HEAP_COMMIT_ROUTINE CommitRoutine;
1677     ULONG Reserved[ 2 ];
1678 } RTL_HEAP_PARAMETERS, *PRTL_HEAP_PARAMETERS;
1679 
1680 NTSYSAPI
1681 PVOID
1682 NTAPI
1683 RtlCreateHeap(
1684     IN ULONG Flags,
1685     IN PVOID HeapBase OPTIONAL,
1686     IN ULONG ReserveSize OPTIONAL,
1687     IN ULONG CommitSize OPTIONAL,
1688     IN PVOID Lock OPTIONAL,
1689     IN PRTL_HEAP_PARAMETERS Parameters OPTIONAL
1690     );
1691 
1692 #define HEAP_NO_SERIALIZE               0x00000001      // winnt
1693 #define HEAP_GROWABLE                   0x00000002      // winnt
1694 #define HEAP_GENERATE_EXCEPTIONS        0x00000004      // winnt
1695 #define HEAP_ZERO_MEMORY                0x00000008      // winnt
1696 #define HEAP_REALLOC_IN_PLACE_ONLY      0x00000010      // winnt
1697 #define HEAP_TAIL_CHECKING_ENABLED      0x00000020      // winnt
1698 #define HEAP_FREE_CHECKING_ENABLED      0x00000040      // winnt
1699 #define HEAP_DISABLE_COALESCE_ON_FREE   0x00000080      // winnt
1700 
1701 #define HEAP_CREATE_ALIGN_16            0x00010000      // winnt Create heap with 16 byte alignment
1702 #define HEAP_CREATE_ENABLE_TRACING      0x00020000      // winnt Create heap call tracing enabled
1703 
1704 #define HEAP_SETTABLE_USER_VALUE        0x00000100
1705 #define HEAP_SETTABLE_USER_FLAG1        0x00000200
1706 #define HEAP_SETTABLE_USER_FLAG2        0x00000400
1707 #define HEAP_SETTABLE_USER_FLAG3        0x00000800
1708 #define HEAP_SETTABLE_USER_FLAGS        0x00000E00
1709 
1710 #define HEAP_CLASS_0                    0x00000000      // process heap
1711 #define HEAP_CLASS_1                    0x00001000      // private heap
1712 #define HEAP_CLASS_2                    0x00002000      // Kernel Heap
1713 #define HEAP_CLASS_3                    0x00003000      // GDI heap
1714 #define HEAP_CLASS_4                    0x00004000      // User heap
1715 #define HEAP_CLASS_5                    0x00005000      // Console heap
1716 #define HEAP_CLASS_6                    0x00006000      // User Desktop heap
1717 #define HEAP_CLASS_7                    0x00007000      // Csrss Shared heap
1718 #define HEAP_CLASS_8                    0x00008000      // Csr Port heap
1719 #define HEAP_CLASS_MASK                 0x0000F000
1720 
1721 #define HEAP_MAXIMUM_TAG                0x0FFF              // winnt
1722 #define HEAP_GLOBAL_TAG                 0x0800
1723 #define HEAP_PSEUDO_TAG_FLAG            0x8000              // winnt
1724 #define HEAP_TAG_SHIFT                  16                  // winnt
1725 #define HEAP_MAKE_TAG_FLAGS( b, o ) ((ULONG)((b) + ((o) << 16)))  // winnt
1726 #define HEAP_TAG_MASK                  (HEAP_MAXIMUM_TAG << HEAP_TAG_SHIFT)
1727 
1728 #define HEAP_CREATE_VALID_MASK         (HEAP_NO_SERIALIZE |             \
1729                                         HEAP_GROWABLE |                 \
1730                                         HEAP_GENERATE_EXCEPTIONS |      \
1731                                         HEAP_ZERO_MEMORY |              \
1732                                         HEAP_REALLOC_IN_PLACE_ONLY |    \
1733                                         HEAP_TAIL_CHECKING_ENABLED |    \
1734                                         HEAP_FREE_CHECKING_ENABLED |    \
1735                                         HEAP_DISABLE_COALESCE_ON_FREE | \
1736                                         HEAP_CLASS_MASK |               \
1737                                         HEAP_CREATE_ALIGN_16 |          \
1738                                         HEAP_CREATE_ENABLE_TRACING)
1739 
1740 NTSYSAPI
1741 PVOID
1742 NTAPI
1743 RtlDestroyHeap(
1744     IN PVOID HeapHandle
1745     );
1746 
1747 //
1748 // Heap allocation function (ala "malloc")
1749 //
1750 PVOID
1751 NTAPI
1752 RtlAllocateHeap(
1753         HANDLE Heap,
1754         ULONG Flags,
1755         ULONG Size
1756         );
1757 
1758 //
1759 // Heap free function (ala "free")
1760 //
1761 BOOLEAN
1762 NTAPI
1763 RtlFreeHeap(
1764         HANDLE Heap,
1765         ULONG Flags,
1766         PVOID Address
1767         );
1768 
1769 
1770 NTSTATUS
1771 NTAPI
1772 NtCreateFile(
1773     OUT PHANDLE FileHandle,
1774     IN ACCESS_MASK DesiredAccess,
1775     IN POBJECT_ATTRIBUTES ObjectAttributes,
1776     OUT PIO_STATUS_BLOCK IoStatusBlock,
1777     IN PLARGE_INTEGER AllocationSize OPTIONAL,
1778     IN ULONG FileAttributes,
1779     IN ULONG ShareAccess,
1780     IN ULONG CreateDisposition,
1781     IN ULONG CreateOptions,
1782     IN PVOID EaBuffer OPTIONAL,
1783     IN ULONG EaLength
1784     );
1785 
1786 NTSYSAPI
1787 NTSTATUS
1788 NTAPI
1789 NtOpenFile(
1790     OUT PHANDLE phFile,
1791     IN ACCESS_MASK DesiredAccess,
1792     IN POBJECT_ATTRIBUTES ObjectAttributes,
1793     OUT PIO_STATUS_BLOCK pIoStatusBlock,
1794     IN ULONG ShareMode,
1795     IN ULONG OpenMode
1796 );
1797 
1798 NTSYSAPI
1799 NTSTATUS
1800 NTAPI
1801 NtDeviceIoControlFile(
1802     IN HANDLE hFile,
1803     IN HANDLE hEvent OPTIONAL,
1804     IN PIO_APC_ROUTINE IoApcRoutine OPTIONAL,
1805     IN PVOID IoApcContext OPTIONAL,
1806     OUT PIO_STATUS_BLOCK pIoStatusBlock,
1807     IN ULONG DeviceIoControlCode,
1808     IN PVOID InBuffer OPTIONAL,
1809     IN ULONG InBufferLength,
1810     OUT PVOID OutBuffer OPTIONAL,
1811     IN ULONG OutBufferLength
1812 );
1813 
1814 NTSYSAPI
1815 NTSTATUS
1816 NTAPI
1817 NtFsControlFile(
1818     IN HANDLE hFile,
1819     IN HANDLE hEvent OPTIONAL,
1820     IN PIO_APC_ROUTINE IoApcRoutine OPTIONAL,
1821     IN PVOID IoApcContext OPTIONAL,
1822     OUT PIO_STATUS_BLOCK pIoStatusBlock,
1823     IN ULONG DeviceIoControlCode,
1824     IN PVOID InBuffer OPTIONAL,
1825     IN ULONG InBufferLength,
1826     OUT PVOID OutBuffer OPTIONAL,
1827     IN ULONG OutBufferLength
1828 );
1829 
1830 NTSYSAPI
1831 NTSTATUS
1832 NTAPI
1833 NtReadFile(
1834     IN HANDLE hFile,
1835     IN HANDLE hEvent OPTIONAL,
1836     IN PIO_APC_ROUTINE IoApcRoutine OPTIONAL,
1837     IN PVOID IoApcContext OPTIONAL,
1838     OUT PIO_STATUS_BLOCK pIoStatusBlock,
1839     OUT PVOID ReadBuffer,
1840     IN ULONG ReadBufferLength,
1841     IN PLARGE_INTEGER FileOffset OPTIONAL,
1842     IN PULONG LockOperationKey
1843 );
1844 
1845 NTSYSAPI
1846 NTSTATUS
1847 NTAPI
1848 NtWriteFile(
1849     IN HANDLE hFile,
1850     IN HANDLE hEvent OPTIONAL,
1851     IN PIO_APC_ROUTINE IoApcRoutine OPTIONAL,
1852     IN PVOID IoApcContext OPTIONAL,
1853     OUT PIO_STATUS_BLOCK pIoStatusBlock,
1854     IN PVOID WriteBuffer,
1855     IN ULONG WriteBufferLength,
1856     IN PLARGE_INTEGER FileOffset OPTIONAL,
1857     IN PULONG LockOperationKey OPTIONAL
1858 );
1859 
1860 NTSYSAPI
1861 NTSTATUS
1862 NTAPI
1863 NtQueryInformationFile(
1864     IN HANDLE hFile,
1865     OUT PIO_STATUS_BLOCK pIoStatusBlock,
1866     OUT PVOID FileInformationBuffer,
1867     IN ULONG FileInformationBufferLength,
1868     IN FILE_INFORMATION_CLASS FileInfoClass
1869 );
1870 
1871 NTSYSAPI
1872 NTSTATUS
1873 NTAPI
1874 NtSetInformationFile(
1875     IN HANDLE hFile,
1876     OUT PIO_STATUS_BLOCK pIoStatusBlock,
1877     IN PVOID FileInformationBuffer,
1878     IN ULONG FileInformationBufferLength,
1879     IN FILE_INFORMATION_CLASS FileInfoClass
1880 );
1881 
1882 NTSTATUS
1883 NTAPI
1884 NtClose(
1885     IN HANDLE Handle
1886     );
1887 
1888 NTSYSAPI
1889 NTSTATUS
1890 NTAPI
1891 NtWaitForSingleObject(
1892     IN HANDLE hObject,
1893     IN BOOLEAN bAlertable,
1894     IN PLARGE_INTEGER Timeout
1895 );
1896 
1897 NTSTATUS
1898 NTAPI
1899 NtDelayExecution (
1900     IN BOOLEAN Alertable,
1901     IN PLARGE_INTEGER DelayInterval
1902     );
1903 
1904 #ifdef __cplusplus
1905 };
1906 #endif //__cplusplus
1907 
1908 #endif //__NT_NATIVE_DEFS__H__
1909