461361cece91023ac3bcf3e627e8a316a16cb469
[reactos.git] / include / ddk / winddk.h
1 /*
2 * winddk.h
3 *
4 * Windows Device Driver Kit
5 *
6 * This file is part of the w32api package.
7 *
8 * Contributors:
9 * Created by Casper S. Hornstrup <chorns@users.sourceforge.net>
10 *
11 * THIS SOFTWARE IS NOT COPYRIGHTED
12 *
13 * This source code is offered for use in the public domain. You may
14 * use, modify or distribute it freely.
15 *
16 * This code is distributed in the hope that it will be useful but
17 * WITHOUT ANY WARRANTY. ALL WARRANTIES, EXPRESS OR IMPLIED ARE HEREBY
18 * DISCLAIMED. This includes but is not limited to warranties of
19 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
20 *
21 */
22
23 #ifndef __WINDDK_H
24 #define __WINDDK_H
25
26 /* Helper macro to enable gcc's extension. */
27 #ifndef __GNU_EXTENSION
28 #ifdef __GNUC__
29 #define __GNU_EXTENSION __extension__
30 #else
31 #define __GNU_EXTENSION
32 #endif
33 #endif
34
35 #ifdef __cplusplus
36 extern "C" {
37 #endif
38
39 #include <excpt.h>
40 #include <ntdef.h>
41 #include <ntstatus.h>
42
43 #include "intrin.h"
44
45 /* Pseudo modifiers for parameters */
46 #ifndef IN
47 #define IN
48 #endif
49 #ifndef OUT
50 #define OUT
51 #endif
52 #ifndef OPTIONAL
53 #define OPTIONAL
54 #endif
55 #ifndef UNALLIGNED
56 #define UNALLIGNED
57 #endif
58
59 #define CONST const
60
61 #define RESTRICTED_POINTER
62
63 #define DECLSPEC_ADDRSAFE
64
65 #ifdef NONAMELESSUNION
66 # define _DDK_DUMMYUNION_MEMBER(name) DUMMYUNIONNAME.name
67 # define _DDK_DUMMYUNION_N_MEMBER(n, name) DUMMYUNIONNAME##n.name
68 #else
69 # define _DDK_DUMMYUNION_MEMBER(name) name
70 # define _DDK_DUMMYUNION_N_MEMBER(n, name) name
71 #endif
72
73 /*
74 ** Forward declarations
75 */
76
77 struct _KPCR;
78 struct _KPRCB;
79 struct _KTSS;
80 struct _DRIVE_LAYOUT_INFORMATION_EX;
81 struct _LOADER_PARAMETER_BLOCK;
82 struct _BUS_HANDLER;
83
84 #if 1
85 /* FIXME: Unknown definitions */
86 struct _SET_PARTITION_INFORMATION_EX;
87 #define WaitAll 0
88 #define WaitAny 1
89 typedef HANDLE TRACEHANDLE;
90 typedef PVOID PWMILIB_CONTEXT;
91 #endif
92
93 /*
94 ** WmiLib specific structure
95 */
96 typedef enum
97 {
98 IrpProcessed, // Irp was processed and possibly completed
99 IrpNotCompleted, // Irp was process and NOT completed
100 IrpNotWmi, // Irp is not a WMI irp
101 IrpForward // Irp is wmi irp, but targeted at another device object
102 } SYSCTL_IRP_DISPOSITION, *PSYSCTL_IRP_DISPOSITION;
103
104 #define DPFLTR_ERROR_LEVEL 0
105 #define DPFLTR_WARNING_LEVEL 1
106 #define DPFLTR_TRACE_LEVEL 2
107 #define DPFLTR_INFO_LEVEL 3
108 #define DPFLTR_MASK 0x80000000
109
110 typedef enum _DPFLTR_TYPE
111 {
112 DPFLTR_SYSTEM_ID = 0,
113 DPFLTR_SMSS_ID = 1,
114 DPFLTR_SETUP_ID = 2,
115 DPFLTR_NTFS_ID = 3,
116 DPFLTR_FSTUB_ID = 4,
117 DPFLTR_CRASHDUMP_ID = 5,
118 DPFLTR_CDAUDIO_ID = 6,
119 DPFLTR_CDROM_ID = 7,
120 DPFLTR_CLASSPNP_ID = 8,
121 DPFLTR_DISK_ID = 9,
122 DPFLTR_REDBOOK_ID = 10,
123 DPFLTR_STORPROP_ID = 11,
124 DPFLTR_SCSIPORT_ID = 12,
125 DPFLTR_SCSIMINIPORT_ID = 13,
126 DPFLTR_CONFIG_ID = 14,
127 DPFLTR_I8042PRT_ID = 15,
128 DPFLTR_SERMOUSE_ID = 16,
129 DPFLTR_LSERMOUS_ID = 17,
130 DPFLTR_KBDHID_ID = 18,
131 DPFLTR_MOUHID_ID = 19,
132 DPFLTR_KBDCLASS_ID = 20,
133 DPFLTR_MOUCLASS_ID = 21,
134 DPFLTR_TWOTRACK_ID = 22,
135 DPFLTR_WMILIB_ID = 23,
136 DPFLTR_ACPI_ID = 24,
137 DPFLTR_AMLI_ID = 25,
138 DPFLTR_HALIA64_ID = 26,
139 DPFLTR_VIDEO_ID = 27,
140 DPFLTR_SVCHOST_ID = 28,
141 DPFLTR_VIDEOPRT_ID = 29,
142 DPFLTR_TCPIP_ID = 30,
143 DPFLTR_DMSYNTH_ID = 31,
144 DPFLTR_NTOSPNP_ID = 32,
145 DPFLTR_FASTFAT_ID = 33,
146 DPFLTR_SAMSS_ID = 34,
147 DPFLTR_PNPMGR_ID = 35,
148 DPFLTR_NETAPI_ID = 36,
149 DPFLTR_SCSERVER_ID = 37,
150 DPFLTR_SCCLIENT_ID = 38,
151 DPFLTR_SERIAL_ID = 39,
152 DPFLTR_SERENUM_ID = 40,
153 DPFLTR_UHCD_ID = 41,
154 DPFLTR_BOOTOK_ID = 42,
155 DPFLTR_BOOTVRFY_ID = 43,
156 DPFLTR_RPCPROXY_ID = 44,
157 DPFLTR_AUTOCHK_ID = 45,
158 DPFLTR_DCOMSS_ID = 46,
159 DPFLTR_UNIMODEM_ID = 47,
160 DPFLTR_SIS_ID = 48,
161 DPFLTR_FLTMGR_ID = 49,
162 DPFLTR_WMICORE_ID = 50,
163 DPFLTR_BURNENG_ID = 51,
164 DPFLTR_IMAPI_ID = 52,
165 DPFLTR_SXS_ID = 53,
166 DPFLTR_FUSION_ID = 54,
167 DPFLTR_IDLETASK_ID = 55,
168 DPFLTR_SOFTPCI_ID = 56,
169 DPFLTR_TAPE_ID = 57,
170 DPFLTR_MCHGR_ID = 58,
171 DPFLTR_IDEP_ID = 59,
172 DPFLTR_PCIIDE_ID = 60,
173 DPFLTR_FLOPPY_ID = 61,
174 DPFLTR_FDC_ID = 62,
175 DPFLTR_TERMSRV_ID = 63,
176 DPFLTR_W32TIME_ID = 64,
177 DPFLTR_PREFETCHER_ID = 65,
178 DPFLTR_RSFILTER_ID = 66,
179 DPFLTR_FCPORT_ID = 67,
180 DPFLTR_PCI_ID = 68,
181 DPFLTR_DMIO_ID = 69,
182 DPFLTR_DMCONFIG_ID = 70,
183 DPFLTR_DMADMIN_ID = 71,
184 DPFLTR_WSOCKTRANSPORT_ID = 72,
185 DPFLTR_VSS_ID = 73,
186 DPFLTR_PNPMEM_ID = 74,
187 DPFLTR_PROCESSOR_ID = 75,
188 DPFLTR_DMSERVER_ID = 76,
189 DPFLTR_SR_ID = 77,
190 DPFLTR_INFINIBAND_ID = 78,
191 DPFLTR_IHVDRIVER_ID = 79,
192 DPFLTR_IHVVIDEO_ID = 80,
193 DPFLTR_IHVAUDIO_ID = 81,
194 DPFLTR_IHVNETWORK_ID = 82,
195 DPFLTR_IHVSTREAMING_ID = 83,
196 DPFLTR_IHVBUS_ID = 84,
197 DPFLTR_HPS_ID = 85,
198 DPFLTR_RTLTHREADPOOL_ID = 86,
199 DPFLTR_LDR_ID = 87,
200 DPFLTR_TCPIP6_ID = 88,
201 DPFLTR_ISAPNP_ID = 89,
202 DPFLTR_SHPC_ID = 90,
203 DPFLTR_STORPORT_ID = 91,
204 DPFLTR_STORMINIPORT_ID = 92,
205 DPFLTR_PRINTSPOOLER_ID = 93,
206 DPFLTR_VDS_ID = 94,
207 DPFLTR_VDSBAS_ID = 95,
208 DPFLTR_VDSDYNDR_ID = 96,
209 DPFLTR_VDSUTIL_ID = 97,
210 DPFLTR_DFRGIFC_ID = 98,
211 DPFLTR_DEFAULT_ID = 99,
212 DPFLTR_MM_ID = 100,
213 DPFLTR_DFSC_ID = 101,
214 DPFLTR_WOW64_ID = 102,
215 DPFLTR_ENDOFTABLE_ID
216 } DPFLTR_TYPE;
217
218 /* also in winnt.h */
219
220 #define FILE_COPY_STRUCTURED_STORAGE 0x00000041
221 #define FILE_STRUCTURED_STORAGE 0x00000441
222
223 /* end winnt.h */
224
225 /* Exported object types */
226 extern POBJECT_TYPE NTSYSAPI ExDesktopObjectType;
227 extern POBJECT_TYPE NTSYSAPI ExWindowStationObjectType;
228 extern ULONG NTSYSAPI IoDeviceHandlerObjectSize;
229 extern POBJECT_TYPE NTSYSAPI IoDeviceHandlerObjectType;
230 extern POBJECT_TYPE NTSYSAPI IoDeviceObjectType;
231 extern POBJECT_TYPE NTSYSAPI IoDriverObjectType;
232 extern POBJECT_TYPE NTSYSAPI LpcPortObjectType;
233 extern POBJECT_TYPE NTSYSAPI PsProcessType;
234
235 typedef EXCEPTION_DISPOSITION
236 (DDKAPI *PEXCEPTION_ROUTINE)(
237 IN struct _EXCEPTION_RECORD *ExceptionRecord,
238 IN PVOID EstablisherFrame,
239 IN OUT struct _CONTEXT *ContextRecord,
240 IN OUT PVOID DispatcherContext);
241
242 typedef NTSTATUS
243 (DDKAPI *PDRIVER_ENTRY)(
244 IN struct _DRIVER_OBJECT *DriverObject,
245 IN PUNICODE_STRING RegistryPath);
246
247 typedef BOOLEAN
248 (DDKAPI *PKTRANSFER_ROUTINE)(
249 VOID);
250
251 #define ASSERT_GATE(object) \
252 ASSERT((((object)->Header.Type & KOBJECT_TYPE_MASK) == GateObject) || \
253 (((object)->Header.Type & KOBJECT_TYPE_MASK) == EventSynchronizationObject))
254
255 #define TIMER_TABLE_SIZE 512
256 #define TIMER_TABLE_SHIFT 9
257
258 #define ASSERT_TIMER(E) \
259 ASSERT(((E)->Header.Type == TimerNotificationObject) || \
260 ((E)->Header.Type == TimerSynchronizationObject))
261
262 #define ASSERT_MUTANT(E) \
263 ASSERT((E)->Header.Type == MutantObject)
264
265 #define ASSERT_SEMAPHORE(E) \
266 ASSERT((E)->Header.Type == SemaphoreObject)
267
268 #define ASSERT_EVENT(E) \
269 ASSERT(((E)->Header.Type == NotificationEvent) || \
270 ((E)->Header.Type == SynchronizationEvent))
271
272 #define KEYBOARD_INSERT_ON 0x08
273 #define KEYBOARD_CAPS_LOCK_ON 0x04
274 #define KEYBOARD_NUM_LOCK_ON 0x02
275 #define KEYBOARD_SCROLL_LOCK_ON 0x01
276 #define KEYBOARD_ALT_KEY_DOWN 0x80
277 #define KEYBOARD_CTRL_KEY_DOWN 0x40
278 #define KEYBOARD_LEFT_SHIFT_DOWN 0x20
279 #define KEYBOARD_RIGHT_SHIFT_DOWN 0x10
280
281 /* Function Type Defintions for Dispatch Functions */
282 struct _DEVICE_CONTROL_CONTEXT;
283
284 typedef VOID
285 (DDKAPI *PDEVICE_CONTROL_COMPLETION)(
286 IN struct _DEVICE_CONTROL_CONTEXT *ControlContext);
287
288 typedef struct _DEVICE_CONTROL_CONTEXT {
289 NTSTATUS Status;
290 PDEVICE_HANDLER_OBJECT DeviceHandler;
291 PDEVICE_OBJECT DeviceObject;
292 ULONG ControlCode;
293 PVOID Buffer;
294 PULONG BufferLength;
295 PVOID Context;
296 } DEVICE_CONTROL_CONTEXT, *PDEVICE_CONTROL_CONTEXT;
297
298 typedef NTSTATUS
299 (DDKAPI *pHalDeviceControl)(
300 IN PDEVICE_HANDLER_OBJECT DeviceHandler,
301 IN PDEVICE_OBJECT DeviceObject,
302 IN ULONG ControlCode,
303 IN OUT PVOID Buffer OPTIONAL,
304 IN OUT PULONG BufferLength OPTIONAL,
305 IN PVOID Context,
306 IN PDEVICE_CONTROL_COMPLETION CompletionRoutine);
307
308 typedef
309 ULONG
310 (DDKAPI *pHalGetInterruptVector)(
311 IN INTERFACE_TYPE InterfaceType,
312 IN ULONG BusNumber,
313 IN ULONG BusInterruptLevel,
314 IN ULONG BusInterruptVector,
315 OUT PKIRQL Irql,
316 OUT PKAFFINITY Affinity
317 );
318
319 typedef
320 NTSTATUS
321 (DDKAPI *pHalGetVectorInput)(
322 IN ULONG Vector,
323 IN KAFFINITY Affinity,
324 OUT PULONG Input,
325 OUT PKINTERRUPT_POLARITY Polarity
326 );
327
328 typedef struct _KEY_USER_FLAGS_INFORMATION {
329 ULONG UserFlags;
330 } KEY_USER_FLAGS_INFORMATION, *PKEY_USER_FLAGS_INFORMATION;
331
332 #define PCI_ADDRESS_MEMORY_SPACE 0x00000000
333
334 struct _RTL_RANGE;
335
336 typedef BOOLEAN
337 (NTAPI *PRTL_CONFLICT_RANGE_CALLBACK) (
338 PVOID Context,
339 struct _RTL_RANGE *Range
340 );
341
342 /*
343 ** Storage structures
344 */
345 typedef enum _PARTITION_STYLE {
346 PARTITION_STYLE_MBR,
347 PARTITION_STYLE_GPT,
348 PARTITION_STYLE_RAW
349 } PARTITION_STYLE;
350
351 typedef struct _CREATE_DISK_MBR {
352 ULONG Signature;
353 } CREATE_DISK_MBR, *PCREATE_DISK_MBR;
354
355 typedef struct _CREATE_DISK_GPT {
356 GUID DiskId;
357 ULONG MaxPartitionCount;
358 } CREATE_DISK_GPT, *PCREATE_DISK_GPT;
359
360 typedef struct _CREATE_DISK {
361 PARTITION_STYLE PartitionStyle;
362 _ANONYMOUS_UNION union {
363 CREATE_DISK_MBR Mbr;
364 CREATE_DISK_GPT Gpt;
365 } DUMMYUNIONNAME;
366 } CREATE_DISK, *PCREATE_DISK;
367
368 typedef VOID
369 (FASTCALL*PTIME_UPDATE_NOTIFY_ROUTINE)(
370 IN HANDLE ThreadId,
371 IN KPROCESSOR_MODE Mode);
372
373 /*
374 ** Architecture specific structures
375 */
376
377 #ifdef _X86_
378
379 typedef struct _KPCR_TIB {
380 PVOID ExceptionList; /* 00 */
381 PVOID StackBase; /* 04 */
382 PVOID StackLimit; /* 08 */
383 PVOID SubSystemTib; /* 0C */
384 _ANONYMOUS_UNION union {
385 PVOID FiberData; /* 10 */
386 ULONG Version; /* 10 */
387 } DUMMYUNIONNAME;
388 PVOID ArbitraryUserPointer; /* 14 */
389 struct _KPCR_TIB *Self; /* 18 */
390 } KPCR_TIB, *PKPCR_TIB; /* 1C */
391
392 #define KeGetPcr() PCR
393
394 FORCEINLINE
395 ULONG
396 KeGetCurrentProcessorNumber(VOID)
397 {
398 return (ULONG)__readfsbyte(FIELD_OFFSET(KPCR, Number));
399 }
400
401 extern NTKERNELAPI PVOID MmHighestUserAddress;
402 extern NTKERNELAPI PVOID MmSystemRangeStart;
403 extern NTKERNELAPI ULONG_PTR MmUserProbeAddress;
404
405 #define MM_HIGHEST_USER_ADDRESS MmHighestUserAddress
406 #define MM_SYSTEM_RANGE_START MmSystemRangeStart
407 #define MM_USER_PROBE_ADDRESS MmUserProbeAddress
408 #define MM_LOWEST_USER_ADDRESS (PVOID)0x10000
409 #define MM_LOWEST_SYSTEM_ADDRESS (PVOID)0xC0C00000
410
411 #define MM_KSEG0_BASE MM_SYSTEM_RANGE_START
412 #define MM_SYSTEM_SPACE_END 0xFFFFFFFF
413
414 #elif defined(__x86_64__)
415
416 typedef struct DECLSPEC_ALIGN(16) _CONTEXT {
417 ULONG64 P1Home;
418 ULONG64 P2Home;
419 ULONG64 P3Home;
420 ULONG64 P4Home;
421 ULONG64 P5Home;
422 ULONG64 P6Home;
423
424 /* Control flags */
425 ULONG ContextFlags;
426 ULONG MxCsr;
427
428 /* Segment */
429 USHORT SegCs;
430 USHORT SegDs;
431 USHORT SegEs;
432 USHORT SegFs;
433 USHORT SegGs;
434 USHORT SegSs;
435 ULONG EFlags;
436
437 /* Debug */
438 ULONG64 Dr0;
439 ULONG64 Dr1;
440 ULONG64 Dr2;
441 ULONG64 Dr3;
442 ULONG64 Dr6;
443 ULONG64 Dr7;
444
445 /* Integer */
446 ULONG64 Rax;
447 ULONG64 Rcx;
448 ULONG64 Rdx;
449 ULONG64 Rbx;
450 ULONG64 Rsp;
451 ULONG64 Rbp;
452 ULONG64 Rsi;
453 ULONG64 Rdi;
454 ULONG64 R8;
455 ULONG64 R9;
456 ULONG64 R10;
457 ULONG64 R11;
458 ULONG64 R12;
459 ULONG64 R13;
460 ULONG64 R14;
461 ULONG64 R15;
462
463 /* Counter */
464 ULONG64 Rip;
465
466 /* Floating point */
467 union {
468 XMM_SAVE_AREA32 FltSave;
469 struct {
470 M128A Header[2];
471 M128A Legacy[8];
472 M128A Xmm0;
473 M128A Xmm1;
474 M128A Xmm2;
475 M128A Xmm3;
476 M128A Xmm4;
477 M128A Xmm5;
478 M128A Xmm6;
479 M128A Xmm7;
480 M128A Xmm8;
481 M128A Xmm9;
482 M128A Xmm10;
483 M128A Xmm11;
484 M128A Xmm12;
485 M128A Xmm13;
486 M128A Xmm14;
487 M128A Xmm15;
488 } DUMMYSTRUCTNAME;
489 } DUMMYUNIONNAME;
490
491 /* Vector */
492 M128A VectorRegister[26];
493 ULONG64 VectorControl;
494
495 /* Debug control */
496 ULONG64 DebugControl;
497 ULONG64 LastBranchToRip;
498 ULONG64 LastBranchFromRip;
499 ULONG64 LastExceptionToRip;
500 ULONG64 LastExceptionFromRip;
501 } CONTEXT;
502
503 #define PAGE_SIZE 0x1000
504 #define PAGE_SHIFT 12L
505 #define PTI_SHIFT 12L
506 #define PDI_SHIFT 21L
507 #define PPI_SHIFT 30L
508 #define PXI_SHIFT 39L
509 #define PTE_PER_PAGE 512
510 #define PDE_PER_PAGE 512
511 #define PPE_PER_PAGE 512
512 #define PXE_PER_PAGE 512
513 #define PTI_MASK_AMD64 (PTE_PER_PAGE - 1)
514 #define PDI_MASK_AMD64 (PDE_PER_PAGE - 1)
515 #define PPI_MASK (PPE_PER_PAGE - 1)
516 #define PXI_MASK (PXE_PER_PAGE - 1)
517
518 #define PXE_BASE 0xFFFFF6FB7DBED000ULL
519 #define PXE_SELFMAP 0xFFFFF6FB7DBEDF68ULL
520 #define PPE_BASE 0xFFFFF6FB7DA00000ULL
521 #define PDE_BASE 0xFFFFF6FB40000000ULL
522 #define PTE_BASE 0xFFFFF68000000000ULL
523 #define PXE_TOP 0xFFFFF6FB7DBEDFFFULL
524 #define PPE_TOP 0xFFFFF6FB7DBFFFFFULL
525 #define PDE_TOP 0xFFFFF6FB7FFFFFFFULL
526 #define PTE_TOP 0xFFFFF6FFFFFFFFFFULL
527
528 extern NTKERNELAPI PVOID MmHighestUserAddress;
529 extern NTKERNELAPI PVOID MmSystemRangeStart;
530 extern NTKERNELAPI ULONG_PTR MmUserProbeAddress;
531
532 #define MM_HIGHEST_USER_ADDRESS MmHighestUserAddress
533 #define MM_SYSTEM_RANGE_START MmSystemRangeStart
534 #define MM_USER_PROBE_ADDRESS MmUserProbeAddress
535 #define MM_LOWEST_USER_ADDRESS (PVOID)0x10000
536 #define MM_LOWEST_SYSTEM_ADDRESS (PVOID)0xFFFF080000000000ULL
537 #define KI_USER_SHARED_DATA 0xFFFFF78000000000ULL
538
539 #define SharedUserData ((PKUSER_SHARED_DATA const)KI_USER_SHARED_DATA)
540 #define SharedInterruptTime (&SharedUserData->InterruptTime)
541 #define SharedSystemTime (&SharedUserData->SystemTime)
542 #define SharedTickCount (&SharedUserData->TickCount)
543
544 #define KeQueryInterruptTime() \
545 (*(volatile ULONG64*)SharedInterruptTime)
546 #define KeQuerySystemTime(CurrentCount) \
547 *(ULONG64*)(CurrentCount) = *(volatile ULONG64*)SharedSystemTime
548 #define KeQueryTickCount(CurrentCount) \
549 *(ULONG64*)(CurrentCount) = *(volatile ULONG64*)SharedTickCount
550
551 typedef struct _KPCR
552 {
553 __GNU_EXTENSION union
554 {
555 NT_TIB NtTib;
556 __GNU_EXTENSION struct
557 {
558 union _KGDTENTRY64 *GdtBase;
559 struct _KTSS64 *TssBase;
560 ULONG64 UserRsp;
561 struct _KPCR *Self;
562 struct _KPRCB *CurrentPrcb;
563 PKSPIN_LOCK_QUEUE LockArray;
564 PVOID Used_Self;
565 };
566 };
567 union _KIDTENTRY64 *IdtBase;
568 ULONG64 Unused[2];
569 KIRQL Irql;
570 UCHAR SecondLevelCacheAssociativity;
571 UCHAR ObsoleteNumber;
572 UCHAR Fill0;
573 ULONG Unused0[3];
574 USHORT MajorVersion;
575 USHORT MinorVersion;
576 ULONG StallScaleFactor;
577 PVOID Unused1[3];
578 ULONG KernelReserved[15];
579 ULONG SecondLevelCacheSize;
580 ULONG HalReserved[16];
581 ULONG Unused2;
582 PVOID KdVersionBlock;
583 PVOID Unused3;
584 ULONG PcrAlign1[24];
585 } KPCR, *PKPCR;
586
587 typedef struct _KFLOATING_SAVE {
588 ULONG Dummy;
589 } KFLOATING_SAVE, *PKFLOATING_SAVE;
590
591 FORCEINLINE
592 PKPCR
593 KeGetPcr(VOID)
594 {
595 return (PKPCR)__readgsqword(FIELD_OFFSET(KPCR, Self));
596 }
597
598 FORCEINLINE
599 ULONG
600 KeGetCurrentProcessorNumber(VOID)
601 {
602 return (ULONG)__readgsword(0x184);
603 }
604
605 #elif defined(__PowerPC__)
606
607 //
608 // Used to contain PFNs and PFN counts
609 //
610 typedef ULONG PFN_COUNT;
611 typedef ULONG PFN_NUMBER, *PPFN_NUMBER;
612 typedef LONG SPFN_NUMBER, *PSPFN_NUMBER;
613
614 #define PASSIVE_LEVEL 0
615 #define LOW_LEVEL 0
616 #define APC_LEVEL 1
617 #define DISPATCH_LEVEL 2
618 #define PROFILE_LEVEL 27
619 #define CLOCK1_LEVEL 28
620 #define CLOCK2_LEVEL 28
621 #define IPI_LEVEL 29
622 #define POWER_LEVEL 30
623 #define HIGH_LEVEL 31
624
625 typedef struct _KFLOATING_SAVE {
626 ULONG Dummy;
627 } KFLOATING_SAVE, *PKFLOATING_SAVE;
628
629 typedef struct _KPCR_TIB {
630 PVOID ExceptionList; /* 00 */
631 PVOID StackBase; /* 04 */
632 PVOID StackLimit; /* 08 */
633 PVOID SubSystemTib; /* 0C */
634 _ANONYMOUS_UNION union {
635 PVOID FiberData; /* 10 */
636 ULONG Version; /* 10 */
637 } DUMMYUNIONNAME;
638 PVOID ArbitraryUserPointer; /* 14 */
639 struct _KPCR_TIB *Self; /* 18 */
640 } KPCR_TIB, *PKPCR_TIB; /* 1C */
641
642 #define PCR_MINOR_VERSION 1
643 #define PCR_MAJOR_VERSION 1
644
645 typedef struct _KPCR {
646 KPCR_TIB Tib; /* 00 */
647 struct _KPCR *Self; /* 1C */
648 struct _KPRCB *Prcb; /* 20 */
649 KIRQL Irql; /* 24 */
650 ULONG IRR; /* 28 */
651 ULONG IrrActive; /* 2C */
652 ULONG IDR; /* 30 */
653 PVOID KdVersionBlock; /* 34 */
654 PUSHORT IDT; /* 38 */
655 PUSHORT GDT; /* 3C */
656 struct _KTSS *TSS; /* 40 */
657 USHORT MajorVersion; /* 44 */
658 USHORT MinorVersion; /* 46 */
659 KAFFINITY SetMember; /* 48 */
660 ULONG StallScaleFactor; /* 4C */
661 UCHAR SpareUnused; /* 50 */
662 UCHAR Number; /* 51 */
663 } KPCR, *PKPCR; /* 54 */
664
665 #define KeGetPcr() PCR
666
667 static __inline
668 ULONG
669 DDKAPI
670 KeGetCurrentProcessorNumber(VOID)
671 {
672 ULONG Number;
673 __asm__ __volatile__ (
674 "lwz %0, %c1(12)\n"
675 : "=r" (Number)
676 : "i" (FIELD_OFFSET(KPCR, Number))
677 );
678 return Number;
679 }
680
681 #elif defined(_MIPS_)
682
683 #error MIPS Headers are totally incorrect
684
685 //
686 // Used to contain PFNs and PFN counts
687 //
688 typedef ULONG PFN_COUNT;
689 typedef ULONG PFN_NUMBER, *PPFN_NUMBER;
690 typedef LONG SPFN_NUMBER, *PSPFN_NUMBER;
691
692 #define PASSIVE_LEVEL 0
693 #define APC_LEVEL 1
694 #define DISPATCH_LEVEL 2
695 #define PROFILE_LEVEL 27
696 #define IPI_LEVEL 29
697 #define HIGH_LEVEL 31
698
699 typedef struct _KPCR {
700 struct _KPRCB *Prcb; /* 20 */
701 KIRQL Irql; /* 24 */
702 ULONG IRR; /* 28 */
703 ULONG IDR; /* 30 */
704 } KPCR, *PKPCR;
705
706 #define KeGetPcr() PCR
707
708 typedef struct _KFLOATING_SAVE {
709 } KFLOATING_SAVE, *PKFLOATING_SAVE;
710
711 static __inline
712 ULONG
713 DDKAPI
714 KeGetCurrentProcessorNumber(VOID)
715 {
716 return 0;
717 }
718
719 #elif defined(_M_ARM)
720
721 //
722 // NT-ARM is not documented, need DDK-ARM
723 //
724 #include <armddk.h>
725
726 #else
727 #error Unknown architecture
728 #endif
729
730 /** SPINLOCK FUNCTIONS ********************************************************/
731
732 #if defined (_X86_)
733
734 #if defined(WIN9X_COMPAT_SPINLOCK)
735
736 NTKERNELAPI
737 VOID
738 NTAPI
739 KeInitializeSpinLock(
740 IN PKSPIN_LOCK SpinLock
741 );
742
743 #else
744
745 FORCEINLINE
746 VOID
747 KeInitializeSpinLock(IN PKSPIN_LOCK SpinLock)
748 {
749 /* Clear the lock */
750 *SpinLock = 0;
751 }
752
753 #endif
754
755 NTHALAPI
756 KIRQL
757 FASTCALL
758 KfAcquireSpinLock(
759 IN PKSPIN_LOCK SpinLock);
760
761 NTHALAPI
762 VOID
763 FASTCALL
764 KfReleaseSpinLock(
765 IN PKSPIN_LOCK SpinLock,
766 IN KIRQL NewIrql);
767
768 NTKERNELAPI
769 VOID
770 FASTCALL
771 KefAcquireSpinLockAtDpcLevel(
772 IN PKSPIN_LOCK SpinLock);
773
774 NTKERNELAPI
775 VOID
776 FASTCALL
777 KefReleaseSpinLockFromDpcLevel(
778 IN PKSPIN_LOCK SpinLock);
779
780 #define KeAcquireSpinLockAtDpcLevel(SpinLock) KefAcquireSpinLockAtDpcLevel(SpinLock)
781 #define KeReleaseSpinLockFromDpcLevel(SpinLock) KefReleaseSpinLockFromDpcLevel(SpinLock)
782 #define KeAcquireSpinLock(a,b) *(b) = KfAcquireSpinLock(a)
783 #define KeReleaseSpinLock(a,b) KfReleaseSpinLock(a,b)
784
785 #define KeGetDcacheFillSize() 1L
786
787 #elif defined(_M_ARM) // !defined (_X86_)
788
789 FORCEINLINE
790 VOID
791 KeInitializeSpinLock(IN PKSPIN_LOCK SpinLock)
792 {
793 /* Clear the lock */
794 *SpinLock = 0;
795 }
796
797 NTHALAPI
798 KIRQL
799 FASTCALL
800 KfAcquireSpinLock(
801 IN PKSPIN_LOCK SpinLock);
802
803 NTHALAPI
804 VOID
805 FASTCALL
806 KfReleaseSpinLock(
807 IN PKSPIN_LOCK SpinLock,
808 IN KIRQL NewIrql);
809
810
811 NTKERNELAPI
812 VOID
813 FASTCALL
814 KefAcquireSpinLockAtDpcLevel(
815 IN PKSPIN_LOCK SpinLock);
816
817 NTKERNELAPI
818 VOID
819 FASTCALL
820 KefReleaseSpinLockFromDpcLevel(
821 IN PKSPIN_LOCK SpinLock);
822
823
824 #define KeAcquireSpinLockAtDpcLevel(SpinLock) KefAcquireSpinLockAtDpcLevel(SpinLock)
825 #define KeReleaseSpinLockFromDpcLevel(SpinLock) KefReleaseSpinLockFromDpcLevel(SpinLock)
826 #define KeAcquireSpinLock(a,b) *(b) = KfAcquireSpinLock(a)
827 #define KeReleaseSpinLock(a,b) KfReleaseSpinLock(a,b)
828
829 NTKERNELAPI
830 VOID
831 NTAPI
832 KeInitializeSpinLock(
833 IN PKSPIN_LOCK SpinLock);
834
835 #else
836
837 FORCEINLINE
838 VOID
839 NTAPI
840 KeInitializeSpinLock(
841 PKSPIN_LOCK SpinLock)
842 {
843 *SpinLock = 0;
844 }
845
846 NTKERNELAPI
847 VOID
848 KeReleaseSpinLock(
849 IN PKSPIN_LOCK SpinLock,
850 IN KIRQL NewIrql);
851
852 NTKERNELAPI
853 VOID
854 KeAcquireSpinLockAtDpcLevel(
855 IN PKSPIN_LOCK SpinLock);
856
857 NTKERNELAPI
858 VOID
859 KeReleaseSpinLockFromDpcLevel(
860 IN PKSPIN_LOCK SpinLock);
861
862 NTKERNELAPI
863 KIRQL
864 KeAcquireSpinLockRaiseToDpc(
865 IN PKSPIN_LOCK SpinLock);
866
867 #define KeAcquireSpinLock(SpinLock, OldIrql) \
868 *(OldIrql) = KeAcquireSpinLockRaiseToDpc(SpinLock)
869
870 #endif // !defined (_X86_)
871
872 #define ARGUMENT_PRESENT(ArgumentPointer) \
873 ((CHAR*)((ULONG_PTR)(ArgumentPointer)) != (CHAR*)NULL)
874
875 NTSYSAPI
876 VOID
877 NTAPI
878 RtlCopyMemory32(
879 IN VOID UNALIGNED *Destination,
880 IN CONST VOID UNALIGNED *Source,
881 IN ULONG Length);
882
883 /** Kernel routines **/
884
885 #ifdef _X86_
886
887 static __inline
888 VOID
889 KeMemoryBarrier(
890 VOID)
891 {
892 volatile LONG Barrier;
893 #if defined(__GNUC__)
894 __asm__ __volatile__ ("xchg %%eax, %0" : : "m" (Barrier) : "%eax");
895 #elif defined(_MSC_VER)
896 __asm xchg [Barrier], eax
897 #endif
898 }
899
900 #endif
901
902 #if !defined(_M_AMD64)
903
904 NTKERNELAPI
905 VOID
906 NTAPI
907 KeQueryTickCount(
908 OUT PLARGE_INTEGER TickCount);
909 #endif
910
911 NTKERNELAPI
912 VOID
913 FASTCALL
914 KeSetTimeUpdateNotifyRoutine(
915 IN PTIME_UPDATE_NOTIFY_ROUTINE NotifyRoutine);
916
917 #if defined(_X86_)
918
919 NTHALAPI
920 VOID
921 FASTCALL
922 KfLowerIrql(
923 IN KIRQL NewIrql);
924
925 NTHALAPI
926 KIRQL
927 FASTCALL
928 KfRaiseIrql(
929 IN KIRQL NewIrql);
930
931 NTHALAPI
932 KIRQL
933 DDKAPI
934 KeRaiseIrqlToDpcLevel(
935 VOID);
936
937 NTHALAPI
938 KIRQL
939 DDKAPI
940 KeRaiseIrqlToSynchLevel(
941 VOID);
942
943 #define KeLowerIrql(a) KfLowerIrql(a)
944 #define KeRaiseIrql(a,b) *(b) = KfRaiseIrql(a)
945
946 #elif defined(_M_AMD64)
947
948 FORCEINLINE
949 KIRQL
950 KeGetCurrentIrql(VOID)
951 {
952 return (KIRQL)__readcr8();
953 }
954
955 FORCEINLINE
956 VOID
957 KeLowerIrql(IN KIRQL NewIrql)
958 {
959 ASSERT(KeGetCurrentIrql() >= NewIrql);
960 __writecr8(NewIrql);
961 }
962
963 FORCEINLINE
964 KIRQL
965 KfRaiseIrql(IN KIRQL NewIrql)
966 {
967 KIRQL OldIrql;
968
969 OldIrql = __readcr8();
970 ASSERT(OldIrql <= NewIrql);
971 __writecr8(NewIrql);
972 return OldIrql;
973 }
974 #define KeRaiseIrql(a,b) *(b) = KfRaiseIrql(a)
975
976 FORCEINLINE
977 KIRQL
978 KeRaiseIrqlToDpcLevel(VOID)
979 {
980 return KfRaiseIrql(DISPATCH_LEVEL);
981 }
982
983 FORCEINLINE
984 KIRQL
985 KeRaiseIrqlToSynchLevel(VOID)
986 {
987 return KfRaiseIrql(12); // SYNCH_LEVEL = IPI_LEVEL - 2
988 }
989
990 #elif defined(__PowerPC__)
991
992 NTHALAPI
993 VOID
994 FASTCALL
995 KfLowerIrql(
996 IN KIRQL NewIrql);
997
998 NTHALAPI
999 KIRQL
1000 FASTCALL
1001 KfRaiseIrql(
1002 IN KIRQL NewIrql);
1003
1004 NTHALAPI
1005 KIRQL
1006 DDKAPI
1007 KeRaiseIrqlToDpcLevel(
1008 VOID);
1009
1010 NTHALAPI
1011 KIRQL
1012 DDKAPI
1013 KeRaiseIrqlToSynchLevel(
1014 VOID);
1015
1016 #define KeLowerIrql(a) KfLowerIrql(a)
1017 #define KeRaiseIrql(a,b) *(b) = KfRaiseIrql(a)
1018
1019 #elif defined(_M_MIPS)
1020
1021 #define KeLowerIrql(a) KfLowerIrql(a)
1022 #define KeRaiseIrql(a,b) *(b) = KfRaiseIrql(a)
1023
1024 NTKERNELAPI
1025 VOID
1026 NTAPI
1027 KfLowerIrql(
1028 IN KIRQL NewIrql);
1029
1030 NTKERNELAPI
1031 KIRQL
1032 NTAPI
1033 KfRaiseIrql(
1034 IN KIRQL NewIrql);
1035
1036 NTKERNELAPI
1037 KIRQL
1038 NTAPI
1039 KeRaiseIrqlToDpcLevel(
1040 VOID);
1041
1042 NTKERNELAPI
1043 KIRQL
1044 DDKAPI
1045 KeRaiseIrqlToSynchLevel(
1046 VOID);
1047
1048 #elif defined(_M_ARM)
1049
1050 #include <armddk.h>
1051
1052 #else
1053
1054 NTKERNELAPI
1055 VOID
1056 NTAPI
1057 KeLowerIrql(
1058 IN KIRQL NewIrql);
1059
1060 NTKERNELAPI
1061 VOID
1062 NTAPI
1063 KeRaiseIrql(
1064 IN KIRQL NewIrql,
1065 OUT PKIRQL OldIrql);
1066
1067 NTKERNELAPI
1068 KIRQL
1069 NTAPI
1070 KeRaiseIrqlToDpcLevel(
1071 VOID);
1072
1073 NTKERNELAPI
1074 KIRQL
1075 DDKAPI
1076 KeRaiseIrqlToSynchLevel(
1077 VOID);
1078
1079 #endif
1080
1081 /** Memory manager routines **/
1082
1083 NTKERNELAPI
1084 NTSTATUS
1085 NTAPI
1086 MmMarkPhysicalMemoryAsBad(
1087 IN PPHYSICAL_ADDRESS StartAddress,
1088 IN OUT PLARGE_INTEGER NumberOfBytes);
1089
1090 NTKERNELAPI
1091 NTSTATUS
1092 NTAPI
1093 MmMarkPhysicalMemoryAsGood(
1094 IN PPHYSICAL_ADDRESS StartAddress,
1095 IN OUT PLARGE_INTEGER NumberOfBytes);
1096
1097 /*
1098 * ULONG
1099 * ADDRESS_AND_SIZE_TO_SPAN_PAGES(
1100 * IN PVOID Va,
1101 * IN ULONG Size)
1102 */
1103 #define ADDRESS_AND_SIZE_TO_SPAN_PAGES(_Va, \
1104 _Size) \
1105 ((ULONG) ((((ULONG_PTR) (_Va) & (PAGE_SIZE - 1)) \
1106 + (_Size) + (PAGE_SIZE - 1)) >> PAGE_SHIFT))
1107
1108 NTKERNELAPI
1109 PVOID
1110 NTAPI
1111 MmLockPagableImageSection(
1112 IN PVOID AddressWithinSection);
1113
1114 /*
1115 * PVOID
1116 * MmLockPagableCodeSection(
1117 * IN PVOID AddressWithinSection)
1118 */
1119 #define MmLockPagableCodeSection(Address) MmLockPagableDataSection(Address)
1120
1121 NTKERNELAPI
1122 PVOID
1123 NTAPI
1124 MmLockPageableDataSection (
1125 IN PVOID AddressWithinSection
1126 );
1127
1128 NTKERNELAPI
1129 VOID
1130 NTAPI
1131 MmUnlockPageableImageSection(
1132 IN PVOID ImageSectionHandle
1133 );
1134
1135 /** Object manager routines **/
1136
1137 NTKERNELAPI
1138 NTSTATUS
1139 NTAPI
1140 ObAssignSecurity(
1141 IN PACCESS_STATE AccessState,
1142 IN PSECURITY_DESCRIPTOR SecurityDescriptor,
1143 IN PVOID Object,
1144 IN POBJECT_TYPE Type);
1145
1146 NTKERNELAPI
1147 VOID
1148 NTAPI
1149 ObDereferenceSecurityDescriptor(
1150 PSECURITY_DESCRIPTOR SecurityDescriptor,
1151 ULONG Count);
1152
1153 NTKERNELAPI
1154 NTSTATUS
1155 NTAPI
1156 ObLogSecurityDescriptor(
1157 IN PSECURITY_DESCRIPTOR InputSecurityDescriptor,
1158 OUT PSECURITY_DESCRIPTOR *OutputSecurityDescriptor,
1159 IN ULONG RefBias);
1160
1161 NTKERNELAPI
1162 NTSTATUS
1163 NTAPI
1164 ObOpenObjectByName(
1165 IN POBJECT_ATTRIBUTES ObjectAttributes,
1166 IN POBJECT_TYPE ObjectType,
1167 IN KPROCESSOR_MODE AccessMode,
1168 IN PACCESS_STATE PassedAccessState,
1169 IN ACCESS_MASK DesiredAccess,
1170 IN OUT PVOID ParseContext OPTIONAL,
1171 OUT PHANDLE Handle);
1172
1173 NTKERNELAPI
1174 NTSTATUS
1175 NTAPI
1176 ObReferenceObjectByName(
1177 IN PUNICODE_STRING ObjectPath,
1178 IN ULONG Attributes,
1179 IN PACCESS_STATE PassedAccessState OPTIONAL,
1180 IN ACCESS_MASK DesiredAccess OPTIONAL,
1181 IN POBJECT_TYPE ObjectType,
1182 IN KPROCESSOR_MODE AccessMode,
1183 IN OUT PVOID ParseContext OPTIONAL,
1184 OUT PVOID *Object);
1185
1186 NTKERNELAPI
1187 VOID
1188 NTAPI
1189 ObReferenceSecurityDescriptor(
1190 IN PSECURITY_DESCRIPTOR SecurityDescriptor,
1191 IN ULONG Count);
1192
1193 /** Process manager routines **/
1194
1195 NTKERNELAPI
1196 NTSTATUS
1197 NTAPI
1198 PsCreateSystemProcess(
1199 IN PHANDLE ProcessHandle,
1200 IN ACCESS_MASK DesiredAccess,
1201 IN POBJECT_ATTRIBUTES ObjectAttributes);
1202
1203 /** NtXxx and ZwXxx routines **/
1204
1205 NTSYSCALLAPI
1206 NTSTATUS
1207 NTAPI
1208 NtClose(
1209 IN HANDLE Handle);
1210
1211 NTSYSCALLAPI
1212 NTSTATUS
1213 NTAPI
1214 NtCreateEvent(
1215 OUT PHANDLE EventHandle,
1216 IN ACCESS_MASK DesiredAccess,
1217 IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,
1218 IN EVENT_TYPE EventType,
1219 IN BOOLEAN InitialState);
1220
1221 NTSYSAPI
1222 NTSTATUS
1223 NTAPI
1224 ZwCreateEvent(
1225 OUT PHANDLE EventHandle,
1226 IN ACCESS_MASK DesiredAccess,
1227 IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,
1228 IN EVENT_TYPE EventType,
1229 IN BOOLEAN InitialState);
1230
1231 NTSYSCALLAPI
1232 NTSTATUS
1233 NTAPI
1234 NtDeviceIoControlFile(
1235 IN HANDLE DeviceHandle,
1236 IN HANDLE Event OPTIONAL,
1237 IN PIO_APC_ROUTINE UserApcRoutine OPTIONAL,
1238 IN PVOID UserApcContext OPTIONAL,
1239 OUT PIO_STATUS_BLOCK IoStatusBlock,
1240 IN ULONG IoControlCode,
1241 IN PVOID InputBuffer,
1242 IN ULONG InputBufferSize,
1243 OUT PVOID OutputBuffer,
1244 IN ULONG OutputBufferSize);
1245
1246 NTSYSCALLAPI
1247 NTSTATUS
1248 NTAPI
1249 NtMapViewOfSection(
1250 IN HANDLE SectionHandle,
1251 IN HANDLE ProcessHandle,
1252 IN OUT PVOID *BaseAddress,
1253 IN ULONG_PTR ZeroBits,
1254 IN SIZE_T CommitSize,
1255 IN OUT PLARGE_INTEGER SectionOffset OPTIONAL,
1256 IN OUT PSIZE_T ViewSize,
1257 IN SECTION_INHERIT InheritDisposition,
1258 IN ULONG AllocationType,
1259 IN ULONG Protect);
1260
1261 NTSYSCALLAPI
1262 NTSTATUS
1263 NTAPI
1264 NtOpenFile(
1265 OUT PHANDLE FileHandle,
1266 IN ACCESS_MASK DesiredAccess,
1267 IN POBJECT_ATTRIBUTES ObjectAttributes,
1268 OUT PIO_STATUS_BLOCK IoStatusBlock,
1269 IN ULONG ShareAccess,
1270 IN ULONG OpenOptions);
1271
1272
1273
1274 NTSYSAPI
1275 NTSTATUS
1276 NTAPI
1277 ZwOpenFile(
1278 OUT PHANDLE FileHandle,
1279 IN ACCESS_MASK DesiredAccess,
1280 IN POBJECT_ATTRIBUTES ObjectAttributes,
1281 OUT PIO_STATUS_BLOCK IoStatusBlock,
1282 IN ULONG ShareAccess,
1283 IN ULONG OpenOptions);
1284
1285 NTSYSCALLAPI
1286 NTSTATUS
1287 NTAPI
1288 NtReadFile(
1289 IN HANDLE FileHandle,
1290 IN HANDLE Event OPTIONAL,
1291 IN PIO_APC_ROUTINE ApcRoutine OPTIONAL,
1292 IN PVOID ApcContext OPTIONAL,
1293 OUT PIO_STATUS_BLOCK IoStatusBlock,
1294 OUT PVOID Buffer,
1295 IN ULONG Length,
1296 IN PLARGE_INTEGER ByteOffset OPTIONAL,
1297 IN PULONG Key OPTIONAL);
1298
1299 NTSYSCALLAPI
1300 NTSTATUS
1301 NTAPI
1302 NtSetEvent(
1303 IN HANDLE EventHandle,
1304 OUT PLONG PreviousState OPTIONAL);
1305
1306 NTSYSAPI
1307 NTSTATUS
1308 NTAPI
1309 ZwSetEvent(
1310 IN HANDLE EventHandle,
1311 OUT PLONG PreviousState OPTIONAL);
1312
1313 /* [Nt|Zw]MapViewOfSection.InheritDisposition constants */
1314 #define AT_EXTENDABLE_FILE 0x00002000
1315 #define AT_RESERVED 0x20000000
1316 #define AT_ROUND_TO_PAGE 0x40000000
1317
1318 NTSYSCALLAPI
1319 NTSTATUS
1320 NTAPI
1321 NtUnmapViewOfSection(
1322 IN HANDLE ProcessHandle,
1323 IN PVOID BaseAddress);
1324
1325 NTSYSCALLAPI
1326 NTSTATUS
1327 NTAPI
1328 NtWaitForSingleObject(
1329 IN HANDLE ObjectHandle,
1330 IN BOOLEAN Alertable,
1331 IN PLARGE_INTEGER TimeOut OPTIONAL);
1332
1333 NTSYSCALLAPI
1334 NTSTATUS
1335 NTAPI
1336 NtWriteFile(
1337 IN HANDLE FileHandle,
1338 IN HANDLE Event OPTIONAL,
1339 IN PIO_APC_ROUTINE ApcRoutine OPTIONAL,
1340 IN PVOID ApcContext OPTIONAL,
1341 OUT PIO_STATUS_BLOCK IoStatusBlock,
1342 IN PVOID Buffer,
1343 IN ULONG Length,
1344 IN PLARGE_INTEGER ByteOffset OPTIONAL,
1345 IN PULONG Key OPTIONAL);
1346
1347 /** Power management support routines **/
1348
1349 NTKERNELAPI
1350 NTSTATUS
1351 NTAPI
1352 PoRequestShutdownEvent(
1353 OUT PVOID *Event);
1354
1355 /** WMI library support routines **/
1356
1357 NTSTATUS
1358 NTAPI
1359 WmiCompleteRequest(
1360 IN PDEVICE_OBJECT DeviceObject,
1361 IN PIRP Irp,
1362 IN NTSTATUS Status,
1363 IN ULONG BufferUsed,
1364 IN CCHAR PriorityBoost);
1365
1366 NTSTATUS
1367 NTAPI
1368 WmiFireEvent(
1369 IN PDEVICE_OBJECT DeviceObject,
1370 IN LPGUID Guid,
1371 IN ULONG InstanceIndex,
1372 IN ULONG EventDataSize,
1373 IN PVOID EventData);
1374
1375 NTSTATUS
1376 NTAPI
1377 WmiSystemControl(
1378 IN PWMILIB_CONTEXT WmiLibInfo,
1379 IN PDEVICE_OBJECT DeviceObject,
1380 IN PIRP Irp,
1381 OUT PSYSCTL_IRP_DISPOSITION IrpDisposition);
1382
1383 /** Stuff from winnt4.h */
1384
1385 #ifndef _X86_
1386 NTKERNELAPI
1387 INTERLOCKED_RESULT
1388 NTAPI
1389 ExInterlockedDecrementLong(
1390 IN PLONG Addend,
1391 IN PKSPIN_LOCK Lock);
1392
1393 NTKERNELAPI
1394 ULONG
1395 NTAPI
1396 ExInterlockedExchangeUlong(
1397 IN PULONG Target,
1398 IN ULONG Value,
1399 IN PKSPIN_LOCK Lock);
1400
1401 NTKERNELAPI
1402 INTERLOCKED_RESULT
1403 NTAPI
1404 ExInterlockedIncrementLong(
1405 IN PLONG Addend,
1406 IN PKSPIN_LOCK Lock);
1407 #endif
1408
1409 NTHALAPI
1410 ULONG
1411 NTAPI
1412 HalGetDmaAlignmentRequirement(
1413 VOID);
1414
1415 NTSYSAPI
1416 BOOLEAN
1417 NTAPI
1418 RtlLargeIntegerEqualToZero(
1419 IN LARGE_INTEGER Operand);
1420
1421 NTSYSAPI
1422 BOOLEAN
1423 NTAPI
1424 RtlLargeIntegerGreaterOrEqualToZero(
1425 IN LARGE_INTEGER Operand);
1426
1427 NTSYSAPI
1428 BOOLEAN
1429 NTAPI
1430 RtlLargeIntegerGreaterThan(
1431 IN LARGE_INTEGER Operand1,
1432 IN LARGE_INTEGER Operand2);
1433
1434 NTSYSAPI
1435 BOOLEAN
1436 NTAPI
1437 RtlLargeIntegerGreaterThanOrEqualTo(
1438 IN LARGE_INTEGER Operand1,
1439 IN LARGE_INTEGER Operand2);
1440
1441 NTSYSAPI
1442 BOOLEAN
1443 NTAPI
1444 RtlLargeIntegerGreaterThanZero(
1445 IN LARGE_INTEGER Operand);
1446
1447 NTSYSAPI
1448 BOOLEAN
1449 NTAPI
1450 RtlLargeIntegerLessOrEqualToZero(
1451 IN LARGE_INTEGER Operand);
1452
1453 NTSYSAPI
1454 BOOLEAN
1455 NTAPI
1456 RtlLargeIntegerLessThan(
1457 IN LARGE_INTEGER Operand1,
1458 IN LARGE_INTEGER Operand2);
1459
1460 NTSYSAPI
1461 BOOLEAN
1462 NTAPI
1463 RtlLargeIntegerLessThanOrEqualTo(
1464 IN LARGE_INTEGER Operand1,
1465 IN LARGE_INTEGER Operand2);
1466
1467 NTSYSAPI
1468 BOOLEAN
1469 NTAPI
1470 RtlLargeIntegerLessThanZero(
1471 IN LARGE_INTEGER Operand);
1472
1473 NTSYSAPI
1474 LARGE_INTEGER
1475 NTAPI
1476 RtlLargeIntegerNegate(
1477 IN LARGE_INTEGER Subtrahend);
1478
1479 NTSYSAPI
1480 BOOLEAN
1481 NTAPI
1482 RtlLargeIntegerNotEqualTo(
1483 IN LARGE_INTEGER Operand1,
1484 IN LARGE_INTEGER Operand2);
1485
1486 NTSYSAPI
1487 BOOLEAN
1488 NTAPI
1489 RtlLargeIntegerNotEqualToZero(
1490 IN LARGE_INTEGER Operand);
1491
1492 NTSYSAPI
1493 LARGE_INTEGER
1494 NTAPI
1495 RtlLargeIntegerShiftLeft(
1496 IN LARGE_INTEGER LargeInteger,
1497 IN CCHAR ShiftCount);
1498
1499 NTSYSAPI
1500 LARGE_INTEGER
1501 NTAPI
1502 RtlLargeIntegerShiftRight(
1503 IN LARGE_INTEGER LargeInteger,
1504 IN CCHAR ShiftCount);
1505
1506 NTSYSAPI
1507 LARGE_INTEGER
1508 NTAPI
1509 RtlLargeIntegerSubtract(
1510 IN LARGE_INTEGER Minuend,
1511 IN LARGE_INTEGER Subtrahend);
1512
1513
1514 /*
1515 * ULONG
1516 * COMPUTE_PAGES_SPANNED(
1517 * IN PVOID Va,
1518 * IN ULONG Size)
1519 */
1520 #define COMPUTE_PAGES_SPANNED(Va, \
1521 Size) \
1522 (ADDRESS_AND_SIZE_TO_SPAN_PAGES(Va, Size))
1523
1524
1525 /*
1526 ** Architecture specific structures
1527 */
1528
1529
1530 #ifdef _M_ARM
1531 //
1532 // NT-ARM is not documented
1533 //
1534 #include <armddk.h>
1535 #endif
1536
1537 #ifdef __cplusplus
1538 }
1539 #endif
1540
1541 #endif /* __WINDDK_H */