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