source: vendor/w32api/3.6/include/ddk/winddk.h

Last change on this file was 2720, checked in by bird, 19 years ago

w32api v3.6

File size: 200.6 KB
Line 
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#if __GNUC__ >= 3
27#pragma GCC system_header
28#endif
29
30#ifdef __cplusplus
31extern "C" {
32#endif
33
34/*
35** Definitions specific to this Device Driver Kit
36*/
37#define DDKAPI __attribute__((stdcall))
38#define DDKFASTAPI __attribute__((fastcall))
39#define DDKCDECLAPI __attribute__((cdecl))
40
41#if defined(_NTOSKRNL_)
42#ifndef NTOSAPI
43#define NTOSAPI DECL_EXPORT
44#endif
45#define DECLARE_INTERNAL_OBJECT(x) typedef struct _##x; typedef struct _##x *P##x;
46#define DECLARE_INTERNAL_OBJECT2(x,y) typedef struct _##x; typedef struct _##x *P##y;
47#else
48#ifndef NTOSAPI
49#define NTOSAPI DECL_IMPORT
50#endif
51#define DECLARE_INTERNAL_OBJECT(x) struct _##x; typedef struct _##x *P##x;
52#define DECLARE_INTERNAL_OBJECT2(x,y) struct _##x; typedef struct _##x *P##y;
53#endif
54
55/* Pseudo modifiers for parameters */
56#define IN
57#define OUT
58#define OPTIONAL
59#define UNALLIGNED
60
61#define CONST const
62#define VOLATILE volatile
63
64#define RESTRICTED_POINTER
65#define POINTER_ALIGNMENT
66
67#ifdef NONAMELESSUNION
68# define _DDK_DUMMYUNION_MEMBER(name) DUMMYUNIONNAME.name
69# define _DDK_DUMMYUNION_N_MEMBER(n, name) DUMMYUNIONNAME##n.name
70#else
71# define _DDK_DUMMYUNION_MEMBER(name) name
72# define _DDK_DUMMYUNION_N_MEMBER(n, name) name
73#endif
74
75/*
76** Forward declarations
77*/
78
79struct _IRP;
80struct _MDL;
81struct _KAPC;
82struct _KDPC;
83struct _KPCR;
84struct _KPRCB;
85struct _KTSS;
86struct _FILE_OBJECT;
87struct _DMA_ADAPTER;
88struct _DEVICE_OBJECT;
89struct _DRIVER_OBJECT;
90struct _SECTION_OBJECT;
91struct _IO_STATUS_BLOCK;
92struct _DEVICE_DESCRIPTION;
93struct _SCATTER_GATHER_LIST;
94
95DECLARE_INTERNAL_OBJECT(ADAPTER_OBJECT)
96DECLARE_INTERNAL_OBJECT(DMA_ADAPTER)
97DECLARE_INTERNAL_OBJECT(IO_STATUS_BLOCK)
98DECLARE_INTERNAL_OBJECT(SECTION_OBJECT)
99
100#if 1
101/* FIXME: Unknown definitions */
102struct _SET_PARTITION_INFORMATION_EX;
103typedef ULONG WAIT_TYPE;
104typedef HANDLE TRACEHANDLE;
105typedef PVOID PWMILIB_CONTEXT;
106typedef PVOID PSYSCTL_IRP_DISPOSITION;
107typedef ULONG LOGICAL;
108#endif
109
110/*
111** Routines specific to this DDK
112*/
113
114#define TAG(_a, _b, _c, _d) (ULONG) \
115 (((_a) << 0) + ((_b) << 8) + ((_c) << 16) + ((_d) << 24))
116
117static __inline struct _KPCR * KeGetCurrentKPCR(
118 VOID)
119{
120 ULONG Value;
121
122 __asm__ __volatile__ ("movl %%fs:0x18, %0\n\t"
123 : "=r" (Value)
124 : /* no inputs */
125 );
126 return (struct _KPCR *) Value;
127}
128
129/*
130** Simple structures
131*/
132
133typedef LONG KPRIORITY;
134typedef UCHAR KIRQL, *PKIRQL;
135typedef ULONG_PTR KSPIN_LOCK, *PKSPIN_LOCK;
136typedef ULONG KAFFINITY, *PKAFFINITY;
137typedef CCHAR KPROCESSOR_MODE;
138
139typedef enum _MODE {
140 KernelMode,
141 UserMode,
142 MaximumMode
143} MODE;
144
145
146/* Structures not exposed to drivers */
147typedef struct _IO_TIMER *PIO_TIMER;
148typedef struct _EPROCESS *PEPROCESS;
149typedef struct _ETHREAD *PETHREAD;
150typedef struct _KINTERRUPT *PKINTERRUPT;
151typedef struct _OBJECT_TYPE *POBJECT_TYPE;
152typedef struct _KTHREAD *PKTHREAD, *PRKTHREAD;
153typedef struct _COMPRESSED_DATA_INFO *PCOMPRESSED_DATA_INFO;
154typedef struct _HAL_DISPATCH_TABLE *PHAL_DISPATCH_TABLE;
155typedef struct _HAL_PRIVATE_DISPATCH_TABLE *PHAL_PRIVATE_DISPATCH_TABLE;
156typedef struct _DRIVE_LAYOUT_INFORMATION *PDRIVE_LAYOUT_INFORMATION;
157typedef struct _DRIVE_LAYOUT_INFORMATION_EX *PDRIVE_LAYOUT_INFORMATION_EX;
158
159/* Constants */
160#define MAXIMUM_PROCESSORS 32
161
162#define MAXIMUM_WAIT_OBJECTS 64
163
164#define METHOD_BUFFERED 0
165#define METHOD_IN_DIRECT 1
166#define METHOD_OUT_DIRECT 2
167#define METHOD_NEITHER 3
168
169#define LOW_PRIORITY 0
170#define LOW_REALTIME_PRIORITY 16
171#define HIGH_PRIORITY 31
172#define MAXIMUM_PRIORITY 32
173
174#define FILE_SUPERSEDED 0x00000000
175#define FILE_OPENED 0x00000001
176#define FILE_CREATED 0x00000002
177#define FILE_OVERWRITTEN 0x00000003
178#define FILE_EXISTS 0x00000004
179#define FILE_DOES_NOT_EXIST 0x00000005
180
181/* also in winnt.h */
182#define FILE_LIST_DIRECTORY 0x00000001
183#define FILE_READ_DATA 0x00000001
184#define FILE_ADD_FILE 0x00000002
185#define FILE_WRITE_DATA 0x00000002
186#define FILE_ADD_SUBDIRECTORY 0x00000004
187#define FILE_APPEND_DATA 0x00000004
188#define FILE_CREATE_PIPE_INSTANCE 0x00000004
189#define FILE_READ_EA 0x00000008
190#define FILE_WRITE_EA 0x00000010
191#define FILE_EXECUTE 0x00000020
192#define FILE_TRAVERSE 0x00000020
193#define FILE_DELETE_CHILD 0x00000040
194#define FILE_READ_ATTRIBUTES 0x00000080
195#define FILE_WRITE_ATTRIBUTES 0x00000100
196
197#define FILE_SHARE_READ 0x00000001
198#define FILE_SHARE_WRITE 0x00000002
199#define FILE_SHARE_DELETE 0x00000004
200#define FILE_SHARE_VALID_FLAGS 0x00000007
201
202#define FILE_ATTRIBUTE_READONLY 0x00000001
203#define FILE_ATTRIBUTE_HIDDEN 0x00000002
204#define FILE_ATTRIBUTE_SYSTEM 0x00000004
205#define FILE_ATTRIBUTE_DIRECTORY 0x00000010
206#define FILE_ATTRIBUTE_ARCHIVE 0x00000020
207#define FILE_ATTRIBUTE_DEVICE 0x00000040
208#define FILE_ATTRIBUTE_NORMAL 0x00000080
209#define FILE_ATTRIBUTE_TEMPORARY 0x00000100
210#define FILE_ATTRIBUTE_SPARSE_FILE 0x00000200
211#define FILE_ATTRIBUTE_REPARSE_POINT 0x00000400
212#define FILE_ATTRIBUTE_COMPRESSED 0x00000800
213#define FILE_ATTRIBUTE_OFFLINE 0x00001000
214#define FILE_ATTRIBUTE_NOT_CONTENT_INDEXED 0x00002000
215#define FILE_ATTRIBUTE_ENCRYPTED 0x00004000
216
217#define FILE_ATTRIBUTE_VALID_FLAGS 0x00007fb7
218#define FILE_ATTRIBUTE_VALID_SET_FLAGS 0x000031a7
219
220#define FILE_COPY_STRUCTURED_STORAGE 0x00000041
221#define FILE_STRUCTURED_STORAGE 0x00000441
222
223#define FILE_VALID_OPTION_FLAGS 0x00ffffff
224#define FILE_VALID_PIPE_OPTION_FLAGS 0x00000032
225#define FILE_VALID_MAILSLOT_OPTION_FLAGS 0x00000032
226#define FILE_VALID_SET_FLAGS 0x00000036
227
228#define FILE_SUPERSEDE 0x00000000
229#define FILE_OPEN 0x00000001
230#define FILE_CREATE 0x00000002
231#define FILE_OPEN_IF 0x00000003
232#define FILE_OVERWRITE 0x00000004
233#define FILE_OVERWRITE_IF 0x00000005
234#define FILE_MAXIMUM_DISPOSITION 0x00000005
235
236#define FILE_DIRECTORY_FILE 0x00000001
237#define FILE_WRITE_THROUGH 0x00000002
238#define FILE_SEQUENTIAL_ONLY 0x00000004
239#define FILE_NO_INTERMEDIATE_BUFFERING 0x00000008
240#define FILE_SYNCHRONOUS_IO_ALERT 0x00000010
241#define FILE_SYNCHRONOUS_IO_NONALERT 0x00000020
242#define FILE_NON_DIRECTORY_FILE 0x00000040
243#define FILE_CREATE_TREE_CONNECTION 0x00000080
244#define FILE_COMPLETE_IF_OPLOCKED 0x00000100
245#define FILE_NO_EA_KNOWLEDGE 0x00000200
246#define FILE_OPEN_FOR_RECOVERY 0x00000400
247#define FILE_RANDOM_ACCESS 0x00000800
248#define FILE_DELETE_ON_CLOSE 0x00001000
249#define FILE_OPEN_BY_FILE_ID 0x00002000
250#define FILE_OPEN_FOR_BACKUP_INTENT 0x00004000
251#define FILE_NO_COMPRESSION 0x00008000
252#define FILE_RESERVE_OPFILTER 0x00100000
253#define FILE_OPEN_REPARSE_POINT 0x00200000
254#define FILE_OPEN_NO_RECALL 0x00400000
255#define FILE_OPEN_FOR_FREE_SPACE_QUERY 0x00800000
256
257#define FILE_ANY_ACCESS 0x00000000
258#define FILE_SPECIAL_ACCESS FILE_ANY_ACCESS
259#define FILE_READ_ACCESS 0x00000001
260#define FILE_WRITE_ACCESS 0x00000002
261
262#define FILE_ALL_ACCESS \
263 (STANDARD_RIGHTS_REQUIRED | \
264 SYNCHRONIZE | \
265 0x1FF)
266
267#define FILE_GENERIC_EXECUTE \
268 (STANDARD_RIGHTS_EXECUTE | \
269 FILE_READ_ATTRIBUTES | \
270 FILE_EXECUTE | \
271 SYNCHRONIZE)
272
273#define FILE_GENERIC_READ \
274 (STANDARD_RIGHTS_READ | \
275 FILE_READ_DATA | \
276 FILE_READ_ATTRIBUTES | \
277 FILE_READ_EA | \
278 SYNCHRONIZE)
279
280#define FILE_GENERIC_WRITE \
281 (STANDARD_RIGHTS_WRITE | \
282 FILE_WRITE_DATA | \
283 FILE_WRITE_ATTRIBUTES | \
284 FILE_WRITE_EA | \
285 FILE_APPEND_DATA | \
286 SYNCHRONIZE)
287/* end winnt.h */
288
289#define DIRECTORY_QUERY (0x0001)
290#define DIRECTORY_TRAVERSE (0x0002)
291#define DIRECTORY_CREATE_OBJECT (0x0004)
292#define DIRECTORY_CREATE_SUBDIRECTORY (0x0008)
293#define DIRECTORY_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | 0xF)
294
295/* Exported object types */
296extern NTOSAPI POBJECT_TYPE ExDesktopObjectType;
297extern NTOSAPI POBJECT_TYPE ExEventObjectType;
298extern NTOSAPI POBJECT_TYPE ExSemaphoreObjectType;
299extern NTOSAPI POBJECT_TYPE ExWindowStationObjectType;
300extern NTOSAPI POBJECT_TYPE IoAdapterObjectType;
301extern NTOSAPI ULONG IoDeviceHandlerObjectSize;
302extern NTOSAPI POBJECT_TYPE IoDeviceHandlerObjectType;
303extern NTOSAPI POBJECT_TYPE IoDeviceObjectType;
304extern NTOSAPI POBJECT_TYPE IoDriverObjectType;
305extern NTOSAPI POBJECT_TYPE IoFileObjectType;
306extern NTOSAPI POBJECT_TYPE LpcPortObjectType;
307extern NTOSAPI POBJECT_TYPE MmSectionObjectType;
308extern NTOSAPI POBJECT_TYPE SeTokenObjectType;
309
310extern NTOSAPI CCHAR KeNumberProcessors;
311extern NTOSAPI PHAL_DISPATCH_TABLE HalDispatchTable;
312extern NTOSAPI PHAL_PRIVATE_DISPATCH_TABLE HalPrivateDispatchTable;
313
314
315/*
316** IRP function codes
317*/
318
319#define IRP_MJ_CREATE 0x00
320#define IRP_MJ_CREATE_NAMED_PIPE 0x01
321#define IRP_MJ_CLOSE 0x02
322#define IRP_MJ_READ 0x03
323#define IRP_MJ_WRITE 0x04
324#define IRP_MJ_QUERY_INFORMATION 0x05
325#define IRP_MJ_SET_INFORMATION 0x06
326#define IRP_MJ_QUERY_EA 0x07
327#define IRP_MJ_SET_EA 0x08
328#define IRP_MJ_FLUSH_BUFFERS 0x09
329#define IRP_MJ_QUERY_VOLUME_INFORMATION 0x0a
330#define IRP_MJ_SET_VOLUME_INFORMATION 0x0b
331#define IRP_MJ_DIRECTORY_CONTROL 0x0c
332#define IRP_MJ_FILE_SYSTEM_CONTROL 0x0d
333#define IRP_MJ_DEVICE_CONTROL 0x0e
334#define IRP_MJ_INTERNAL_DEVICE_CONTROL 0x0f
335#define IRP_MJ_SCSI 0x0f
336#define IRP_MJ_SHUTDOWN 0x10
337#define IRP_MJ_LOCK_CONTROL 0x11
338#define IRP_MJ_CLEANUP 0x12
339#define IRP_MJ_CREATE_MAILSLOT 0x13
340#define IRP_MJ_QUERY_SECURITY 0x14
341#define IRP_MJ_SET_SECURITY 0x15
342#define IRP_MJ_POWER 0x16
343#define IRP_MJ_SYSTEM_CONTROL 0x17
344#define IRP_MJ_DEVICE_CHANGE 0x18
345#define IRP_MJ_QUERY_QUOTA 0x19
346#define IRP_MJ_SET_QUOTA 0x1a
347#define IRP_MJ_PNP 0x1b
348#define IRP_MJ_PNP_POWER 0x1b
349#define IRP_MJ_MAXIMUM_FUNCTION 0x1b
350
351#define IRP_MN_QUERY_DIRECTORY 0x01
352#define IRP_MN_NOTIFY_CHANGE_DIRECTORY 0x02
353
354#define IRP_MN_USER_FS_REQUEST 0x00
355#define IRP_MN_MOUNT_VOLUME 0x01
356#define IRP_MN_VERIFY_VOLUME 0x02
357#define IRP_MN_LOAD_FILE_SYSTEM 0x03
358#define IRP_MN_TRACK_LINK 0x04
359#define IRP_MN_KERNEL_CALL 0x04
360
361#define IRP_MN_LOCK 0x01
362#define IRP_MN_UNLOCK_SINGLE 0x02
363#define IRP_MN_UNLOCK_ALL 0x03
364#define IRP_MN_UNLOCK_ALL_BY_KEY 0x04
365
366#define IRP_MN_NORMAL 0x00
367#define IRP_MN_DPC 0x01
368#define IRP_MN_MDL 0x02
369#define IRP_MN_COMPLETE 0x04
370#define IRP_MN_COMPRESSED 0x08
371
372#define IRP_MN_MDL_DPC (IRP_MN_MDL | IRP_MN_DPC)
373#define IRP_MN_COMPLETE_MDL (IRP_MN_COMPLETE | IRP_MN_MDL)
374#define IRP_MN_COMPLETE_MDL_DPC (IRP_MN_COMPLETE_MDL | IRP_MN_DPC)
375
376#define IRP_MN_SCSI_CLASS 0x01
377
378#define IRP_MN_START_DEVICE 0x00
379#define IRP_MN_QUERY_REMOVE_DEVICE 0x01
380#define IRP_MN_REMOVE_DEVICE 0x02
381#define IRP_MN_CANCEL_REMOVE_DEVICE 0x03
382#define IRP_MN_STOP_DEVICE 0x04
383#define IRP_MN_QUERY_STOP_DEVICE 0x05
384#define IRP_MN_CANCEL_STOP_DEVICE 0x06
385
386#define IRP_MN_QUERY_DEVICE_RELATIONS 0x07
387#define IRP_MN_QUERY_INTERFACE 0x08
388#define IRP_MN_QUERY_CAPABILITIES 0x09
389#define IRP_MN_QUERY_RESOURCES 0x0A
390#define IRP_MN_QUERY_RESOURCE_REQUIREMENTS 0x0B
391#define IRP_MN_QUERY_DEVICE_TEXT 0x0C
392#define IRP_MN_FILTER_RESOURCE_REQUIREMENTS 0x0D
393
394#define IRP_MN_READ_CONFIG 0x0F
395#define IRP_MN_WRITE_CONFIG 0x10
396#define IRP_MN_EJECT 0x11
397#define IRP_MN_SET_LOCK 0x12
398#define IRP_MN_QUERY_ID 0x13
399#define IRP_MN_QUERY_PNP_DEVICE_STATE 0x14
400#define IRP_MN_QUERY_BUS_INFORMATION 0x15
401#define IRP_MN_DEVICE_USAGE_NOTIFICATION 0x16
402#define IRP_MN_SURPRISE_REMOVAL 0x17
403#define IRP_MN_QUERY_LEGACY_BUS_INFORMATION 0x18
404
405#define IRP_MN_WAIT_WAKE 0x00
406#define IRP_MN_POWER_SEQUENCE 0x01
407#define IRP_MN_SET_POWER 0x02
408#define IRP_MN_QUERY_POWER 0x03
409
410#define IRP_MN_QUERY_ALL_DATA 0x00
411#define IRP_MN_QUERY_SINGLE_INSTANCE 0x01
412#define IRP_MN_CHANGE_SINGLE_INSTANCE 0x02
413#define IRP_MN_CHANGE_SINGLE_ITEM 0x03
414#define IRP_MN_ENABLE_EVENTS 0x04
415#define IRP_MN_DISABLE_EVENTS 0x05
416#define IRP_MN_ENABLE_COLLECTION 0x06
417#define IRP_MN_DISABLE_COLLECTION 0x07
418#define IRP_MN_REGINFO 0x08
419#define IRP_MN_EXECUTE_METHOD 0x09
420
421#define IRP_MN_REGINFO_EX 0x0b
422
423typedef enum _IO_ALLOCATION_ACTION {
424 KeepObject = 1,
425 DeallocateObject,
426 DeallocateObjectKeepRegisters
427} IO_ALLOCATION_ACTION, *PIO_ALLOCATION_ACTION;
428
429typedef IO_ALLOCATION_ACTION
430(DDKAPI *PDRIVER_CONTROL)(
431 IN struct _DEVICE_OBJECT *DeviceObject,
432 IN struct _IRP *Irp,
433 IN PVOID MapRegisterBase,
434 IN PVOID Context);
435
436typedef VOID
437(DDKAPI *PDRIVER_LIST_CONTROL)(
438 IN struct _DEVICE_OBJECT *DeviceObject,
439 IN struct _IRP *Irp,
440 IN struct _SCATTER_GATHER_LIST *ScatterGather,
441 IN PVOID Context);
442
443typedef NTSTATUS
444(DDKAPI *PDRIVER_ADD_DEVICE)(
445 IN struct _DRIVER_OBJECT *DriverObject,
446 IN struct _DEVICE_OBJECT *PhysicalDeviceObject);
447
448typedef NTSTATUS
449(DDKAPI *PIO_COMPLETION_ROUTINE)(
450 IN struct _DEVICE_OBJECT *DeviceObject,
451 IN struct _IRP *Irp,
452 IN PVOID Context);
453
454typedef VOID
455(DDKAPI *PDRIVER_CANCEL)(
456 IN struct _DEVICE_OBJECT *DeviceObject,
457 IN struct _IRP *Irp);
458
459typedef VOID
460(DDKAPI *PKDEFERRED_ROUTINE)(
461 IN struct _KDPC *Dpc,
462 IN PVOID DeferredContext,
463 IN PVOID SystemArgument1,
464 IN PVOID SystemArgument2);
465
466typedef NTSTATUS
467(DDKAPI *PDRIVER_DISPATCH)(
468 IN struct _DEVICE_OBJECT *DeviceObject,
469 IN struct _IRP *Irp);
470
471typedef VOID
472(DDKAPI *PIO_DPC_ROUTINE)(
473 IN struct _KDPC *Dpc,
474 IN struct _DEVICE_OBJECT *DeviceObject,
475 IN struct _IRP *Irp,
476 IN PVOID Context);
477
478typedef NTSTATUS
479(DDKAPI *PMM_DLL_INITIALIZE)(
480 IN PUNICODE_STRING RegistryPath);
481
482typedef NTSTATUS
483(DDKAPI *PMM_DLL_UNLOAD)(
484 VOID);
485
486typedef NTSTATUS
487(DDKAPI *PDRIVER_ENTRY)(
488 IN struct _DRIVER_OBJECT *DriverObject,
489 IN PUNICODE_STRING RegistryPath);
490
491typedef NTSTATUS
492(DDKAPI *PDRIVER_INITIALIZE)(
493 IN struct _DRIVER_OBJECT *DriverObject,
494 IN PUNICODE_STRING RegistryPath);
495
496typedef BOOLEAN
497(DDKAPI *PKSERVICE_ROUTINE)(
498 IN struct _KINTERRUPT *Interrupt,
499 IN PVOID ServiceContext);
500
501typedef VOID
502(DDKAPI *PIO_TIMER_ROUTINE)(
503 IN struct _DEVICE_OBJECT *DeviceObject,
504 IN PVOID Context);
505
506typedef VOID
507(DDKAPI *PDRIVER_REINITIALIZE)(
508 IN struct _DRIVER_OBJECT *DriverObject,
509 IN PVOID Context,
510 IN ULONG Count);
511
512typedef NTSTATUS
513(DDKAPI *PDRIVER_STARTIO)(
514 IN struct _DEVICE_OBJECT *DeviceObject,
515 IN struct _IRP *Irp);
516
517typedef BOOLEAN
518(DDKAPI *PKSYNCHRONIZE_ROUTINE)(
519 IN PVOID SynchronizeContext);
520
521typedef VOID
522(DDKAPI *PDRIVER_UNLOAD)(
523 IN struct _DRIVER_OBJECT *DriverObject);
524
525
526
527/*
528** Plug and Play structures
529*/
530
531typedef VOID DDKAPI
532(*PINTERFACE_REFERENCE)(
533 PVOID Context);
534
535typedef VOID DDKAPI
536(*PINTERFACE_DEREFERENCE)(
537 PVOID Context);
538
539typedef BOOLEAN DDKAPI
540(*PTRANSLATE_BUS_ADDRESS)(
541 IN PVOID Context,
542 IN PHYSICAL_ADDRESS BusAddress,
543 IN ULONG Length,
544 IN OUT PULONG AddressSpace,
545 OUT PPHYSICAL_ADDRESS TranslatedAddress);
546
547typedef struct _DMA_ADAPTER* DDKAPI
548(*PGET_DMA_ADAPTER)(
549 IN PVOID Context,
550 IN struct _DEVICE_DESCRIPTION *DeviceDescriptor,
551 OUT PULONG NumberOfMapRegisters);
552
553typedef ULONG DDKAPI
554(*PGET_SET_DEVICE_DATA)(
555 IN PVOID Context,
556 IN ULONG DataType,
557 IN PVOID Buffer,
558 IN ULONG Offset,
559 IN ULONG Length);
560
561typedef union _POWER_STATE {
562 SYSTEM_POWER_STATE SystemState;
563 DEVICE_POWER_STATE DeviceState;
564} POWER_STATE, *PPOWER_STATE;
565
566typedef enum _POWER_STATE_TYPE {
567 SystemPowerState,
568 DevicePowerState
569} POWER_STATE_TYPE, *PPOWER_STATE_TYPE;
570
571typedef struct _BUS_INTERFACE_STANDARD {
572 USHORT Size;
573 USHORT Version;
574 PVOID Context;
575 PINTERFACE_REFERENCE InterfaceReference;
576 PINTERFACE_DEREFERENCE InterfaceDereference;
577 PTRANSLATE_BUS_ADDRESS TranslateBusAddress;
578 PGET_DMA_ADAPTER GetDmaAdapter;
579 PGET_SET_DEVICE_DATA SetBusData;
580 PGET_SET_DEVICE_DATA GetBusData;
581} BUS_INTERFACE_STANDARD, *PBUS_INTERFACE_STANDARD;
582
583typedef struct _DEVICE_CAPABILITIES {
584 USHORT Size;
585 USHORT Version;
586 ULONG DeviceD1 : 1;
587 ULONG DeviceD2 : 1;
588 ULONG LockSupported : 1;
589 ULONG EjectSupported : 1;
590 ULONG Removable : 1;
591 ULONG DockDevice : 1;
592 ULONG UniqueID : 1;
593 ULONG SilentInstall : 1;
594 ULONG RawDeviceOK : 1;
595 ULONG SurpriseRemovalOK : 1;
596 ULONG WakeFromD0 : 1;
597 ULONG WakeFromD1 : 1;
598 ULONG WakeFromD2 : 1;
599 ULONG WakeFromD3 : 1;
600 ULONG HardwareDisabled : 1;
601 ULONG NonDynamic : 1;
602 ULONG WarmEjectSupported : 1;
603 ULONG NoDisplayInUI : 1;
604 ULONG Reserved : 14;
605 ULONG Address;
606 ULONG UINumber;
607 DEVICE_POWER_STATE DeviceState[PowerSystemMaximum];
608 SYSTEM_POWER_STATE SystemWake;
609 DEVICE_POWER_STATE DeviceWake;
610 ULONG D1Latency;
611 ULONG D2Latency;
612 ULONG D3Latency;
613} DEVICE_CAPABILITIES, *PDEVICE_CAPABILITIES;
614
615typedef struct _DEVICE_INTERFACE_CHANGE_NOTIFICATION {
616 USHORT Version;
617 USHORT Size;
618 GUID Event;
619 GUID InterfaceClassGuid;
620 PUNICODE_STRING SymbolicLinkName;
621} DEVICE_INTERFACE_CHANGE_NOTIFICATION, *PDEVICE_INTERFACE_CHANGE_NOTIFICATION;
622
623typedef struct _HWPROFILE_CHANGE_NOTIFICATION {
624 USHORT Version;
625 USHORT Size;
626 GUID Event;
627} HWPROFILE_CHANGE_NOTIFICATION, *PHWPROFILE_CHANGE_NOTIFICATION;
628
629#undef INTERFACE
630
631typedef struct _INTERFACE {
632 USHORT Size;
633 USHORT Version;
634 PVOID Context;
635 PINTERFACE_REFERENCE InterfaceReference;
636 PINTERFACE_DEREFERENCE InterfaceDereference;
637} INTERFACE, *PINTERFACE;
638
639typedef struct _PLUGPLAY_NOTIFICATION_HEADER {
640 USHORT Version;
641 USHORT Size;
642 GUID Event;
643} PLUGPLAY_NOTIFICATION_HEADER, *PPLUGPLAY_NOTIFICATION_HEADER;
644
645typedef ULONG PNP_DEVICE_STATE, *PPNP_DEVICE_STATE;
646
647/* PNP_DEVICE_STATE */
648
649#define PNP_DEVICE_DISABLED 0x00000001
650#define PNP_DEVICE_DONT_DISPLAY_IN_UI 0x00000002
651#define PNP_DEVICE_FAILED 0x00000004
652#define PNP_DEVICE_REMOVED 0x00000008
653#define PNP_DEVICE_RESOURCE_REQUIREMENTS_CHANGED 0x00000010
654#define PNP_DEVICE_NOT_DISABLEABLE 0x00000020
655
656typedef struct _TARGET_DEVICE_CUSTOM_NOTIFICATION {
657 USHORT Version;
658 USHORT Size;
659 GUID Event;
660 struct _FILE_OBJECT *FileObject;
661 LONG NameBufferOffset;
662 UCHAR CustomDataBuffer[1];
663} TARGET_DEVICE_CUSTOM_NOTIFICATION, *PTARGET_DEVICE_CUSTOM_NOTIFICATION;
664
665typedef struct _TARGET_DEVICE_REMOVAL_NOTIFICATION {
666 USHORT Version;
667 USHORT Size;
668 GUID Event;
669 struct _FILE_OBJECT *FileObject;
670} TARGET_DEVICE_REMOVAL_NOTIFICATION, *PTARGET_DEVICE_REMOVAL_NOTIFICATION;
671
672typedef enum _BUS_QUERY_ID_TYPE {
673 BusQueryDeviceID,
674 BusQueryHardwareIDs,
675 BusQueryCompatibleIDs,
676 BusQueryInstanceID,
677 BusQueryDeviceSerialNumber
678} BUS_QUERY_ID_TYPE, *PBUS_QUERY_ID_TYPE;
679
680typedef enum _DEVICE_TEXT_TYPE {
681 DeviceTextDescription,
682 DeviceTextLocationInformation
683} DEVICE_TEXT_TYPE, *PDEVICE_TEXT_TYPE;
684
685typedef enum _DEVICE_USAGE_NOTIFICATION_TYPE {
686 DeviceUsageTypeUndefined,
687 DeviceUsageTypePaging,
688 DeviceUsageTypeHibernation,
689 DeviceUsageTypeDumpFile
690} DEVICE_USAGE_NOTIFICATION_TYPE;
691
692typedef struct _POWER_SEQUENCE {
693 ULONG SequenceD1;
694 ULONG SequenceD2;
695 ULONG SequenceD3;
696} POWER_SEQUENCE, *PPOWER_SEQUENCE;
697
698typedef enum {
699 DevicePropertyDeviceDescription,
700 DevicePropertyHardwareID,
701 DevicePropertyCompatibleIDs,
702 DevicePropertyBootConfiguration,
703 DevicePropertyBootConfigurationTranslated,
704 DevicePropertyClassName,
705 DevicePropertyClassGuid,
706 DevicePropertyDriverKeyName,
707 DevicePropertyManufacturer,
708 DevicePropertyFriendlyName,
709 DevicePropertyLocationInformation,
710 DevicePropertyPhysicalDeviceObjectName,
711 DevicePropertyBusTypeGuid,
712 DevicePropertyLegacyBusType,
713 DevicePropertyBusNumber,
714 DevicePropertyEnumeratorName,
715 DevicePropertyAddress,
716 DevicePropertyUINumber,
717 DevicePropertyInstallState,
718 DevicePropertyRemovalPolicy
719} DEVICE_REGISTRY_PROPERTY;
720
721typedef enum _IO_NOTIFICATION_EVENT_CATEGORY {
722 EventCategoryReserved,
723 EventCategoryHardwareProfileChange,
724 EventCategoryDeviceInterfaceChange,
725 EventCategoryTargetDeviceChange
726} IO_NOTIFICATION_EVENT_CATEGORY;
727
728#define PNPNOTIFY_DEVICE_INTERFACE_INCLUDE_EXISTING_INTERFACES 0x00000001
729
730typedef NTSTATUS DDKAPI
731(*PDRIVER_NOTIFICATION_CALLBACK_ROUTINE)(
732 IN PVOID NotificationStructure,
733 IN PVOID Context);
734
735typedef VOID DDKAPI
736(*PDEVICE_CHANGE_COMPLETE_CALLBACK)(
737 IN PVOID Context);
738
739
740
741/*
742** System structures
743*/
744
745#define SYMBOLIC_LINK_QUERY 0x0001
746#define SYMBOLIC_LINK_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | 0x1)
747
748/* also in winnt,h */
749#define DUPLICATE_CLOSE_SOURCE 0x00000001
750#define DUPLICATE_SAME_ACCESS 0x00000002
751#define DUPLICATE_SAME_ATTRIBUTES 0x00000004
752/* end winnt.h */
753
754typedef struct _OBJECT_NAME_INFORMATION {
755 UNICODE_STRING Name;
756} OBJECT_NAME_INFORMATION, *POBJECT_NAME_INFORMATION;
757
758typedef VOID DDKAPI
759(*PIO_APC_ROUTINE)(
760 IN PVOID ApcContext,
761 IN PIO_STATUS_BLOCK IoStatusBlock,
762 IN ULONG Reserved);
763
764typedef struct _IO_STATUS_BLOCK {
765 _ANONYMOUS_UNION union {
766 NTSTATUS Status;
767 PVOID Pointer;
768 } DUMMYUNIONNAME;
769 ULONG_PTR Information;
770} IO_STATUS_BLOCK;
771
772typedef VOID DDKAPI
773(*PKNORMAL_ROUTINE)(
774 IN PVOID NormalContext,
775 IN PVOID SystemArgument1,
776 IN PVOID SystemArgument2);
777
778typedef VOID DDKAPI
779(*PKKERNEL_ROUTINE)(
780 IN struct _KAPC *Apc,
781 IN OUT PKNORMAL_ROUTINE *NormalRoutine,
782 IN OUT PVOID *NormalContext,
783 IN OUT PVOID *SystemArgument1,
784 IN OUT PVOID *SystemArgument2);
785
786typedef VOID DDKAPI
787(*PKRUNDOWN_ROUTINE)(
788 IN struct _KAPC *Apc);
789
790typedef BOOLEAN DDKAPI
791(*PKTRANSFER_ROUTINE)(
792 VOID);
793
794typedef struct _KAPC {
795 CSHORT Type;
796 CSHORT Size;
797 ULONG Spare0;
798 struct _KTHREAD *Thread;
799 LIST_ENTRY ApcListEntry;
800 PKKERNEL_ROUTINE KernelRoutine;
801 PKRUNDOWN_ROUTINE RundownRoutine;
802 PKNORMAL_ROUTINE NormalRoutine;
803 PVOID NormalContext;
804 PVOID SystemArgument1;
805 PVOID SystemArgument2;
806 CCHAR ApcStateIndex;
807 KPROCESSOR_MODE ApcMode;
808 BOOLEAN Inserted;
809} KAPC, *PKAPC, *RESTRICTED_POINTER PRKAPC;
810
811typedef struct _KDEVICE_QUEUE {
812 CSHORT Type;
813 CSHORT Size;
814 LIST_ENTRY DeviceListHead;
815 KSPIN_LOCK Lock;
816 BOOLEAN Busy;
817} KDEVICE_QUEUE, *PKDEVICE_QUEUE, *RESTRICTED_POINTER PRKDEVICE_QUEUE;
818
819typedef struct _KDEVICE_QUEUE_ENTRY {
820 LIST_ENTRY DeviceListEntry;
821 ULONG SortKey;
822 BOOLEAN Inserted;
823} KDEVICE_QUEUE_ENTRY, *PKDEVICE_QUEUE_ENTRY,
824*RESTRICTED_POINTER PRKDEVICE_QUEUE_ENTRY;
825
826#define LOCK_QUEUE_WAIT 1
827#define LOCK_QUEUE_OWNER 2
828
829typedef enum _KSPIN_LOCK_QUEUE_NUMBER {
830 LockQueueDispatcherLock,
831 LockQueueContextSwapLock,
832 LockQueuePfnLock,
833 LockQueueSystemSpaceLock,
834 LockQueueVacbLock,
835 LockQueueMasterLock,
836 LockQueueNonPagedPoolLock,
837 LockQueueIoCancelLock,
838 LockQueueWorkQueueLock,
839 LockQueueIoVpbLock,
840 LockQueueIoDatabaseLock,
841 LockQueueIoCompletionLock,
842 LockQueueNtfsStructLock,
843 LockQueueAfdWorkQueueLock,
844 LockQueueBcbLock,
845 LockQueueMaximumLock
846} KSPIN_LOCK_QUEUE_NUMBER, *PKSPIN_LOCK_QUEUE_NUMBER;
847
848typedef struct _KSPIN_LOCK_QUEUE {
849 struct _KSPIN_LOCK_QUEUE *VOLATILE Next;
850 PKSPIN_LOCK VOLATILE Lock;
851} KSPIN_LOCK_QUEUE, *PKSPIN_LOCK_QUEUE;
852
853typedef struct _KLOCK_QUEUE_HANDLE {
854 KSPIN_LOCK_QUEUE LockQueue;
855 KIRQL OldIrql;
856} KLOCK_QUEUE_HANDLE, *PKLOCK_QUEUE_HANDLE;
857
858typedef struct _KDPC {
859 CSHORT Type;
860 UCHAR Number;
861 UCHAR Importance;
862 LIST_ENTRY DpcListEntry;
863 PKDEFERRED_ROUTINE DeferredRoutine;
864 PVOID DeferredContext;
865 PVOID SystemArgument1;
866 PVOID SystemArgument2;
867 PULONG_PTR Lock;
868} KDPC, *PKDPC, *RESTRICTED_POINTER PRKDPC;
869
870typedef struct _WAIT_CONTEXT_BLOCK {
871 KDEVICE_QUEUE_ENTRY WaitQueueEntry;
872 struct _DRIVER_CONTROL *DeviceRoutine;
873 PVOID DeviceContext;
874 ULONG NumberOfMapRegisters;
875 PVOID DeviceObject;
876 PVOID CurrentIrp;
877 PKDPC BufferChainingDpc;
878} WAIT_CONTEXT_BLOCK, *PWAIT_CONTEXT_BLOCK;
879
880typedef struct _DISPATCHER_HEADER {
881 UCHAR Type;
882 UCHAR Absolute;
883 UCHAR Size;
884 UCHAR Inserted;
885 LONG SignalState;
886 LIST_ENTRY WaitListHead;
887} DISPATCHER_HEADER, *PDISPATCHER_HEADER;
888
889typedef struct _KEVENT {
890 DISPATCHER_HEADER Header;
891} KEVENT, *PKEVENT, *RESTRICTED_POINTER PRKEVENT;
892
893typedef struct _KSEMAPHORE {
894 DISPATCHER_HEADER Header;
895 LONG Limit;
896} KSEMAPHORE, *PKSEMAPHORE, *RESTRICTED_POINTER PRKSEMAPHORE;
897
898typedef struct _FAST_MUTEX {
899 LONG Count;
900 struct _KTHREAD *Owner;
901 ULONG Contention;
902 KEVENT Event;
903 ULONG OldIrql;
904} FAST_MUTEX, *PFAST_MUTEX;
905
906typedef struct _KTIMER {
907 DISPATCHER_HEADER Header;
908 ULARGE_INTEGER DueTime;
909 LIST_ENTRY TimerListEntry;
910 struct _KDPC *Dpc;
911 LONG Period;
912} KTIMER, *PKTIMER, *RESTRICTED_POINTER PRKTIMER;
913
914typedef struct _KMUTANT {
915 DISPATCHER_HEADER Header;
916 LIST_ENTRY MutantListEntry;
917 struct _KTHREAD *RESTRICTED_POINTER OwnerThread;
918 BOOLEAN Abandoned;
919 UCHAR ApcDisable;
920} KMUTANT, *PKMUTANT, *RESTRICTED_POINTER PRKMUTANT, KMUTEX, *PKMUTEX, *RESTRICTED_POINTER PRKMUTEX;
921
922typedef enum _TIMER_TYPE {
923 NotificationTimer,
924 SynchronizationTimer
925} TIMER_TYPE;
926
927#define EVENT_INCREMENT 1
928#define IO_NO_INCREMENT 0
929#define IO_CD_ROM_INCREMENT 1
930#define IO_DISK_INCREMENT 1
931#define IO_KEYBOARD_INCREMENT 6
932#define IO_MAILSLOT_INCREMENT 2
933#define IO_MOUSE_INCREMENT 6
934#define IO_NAMED_PIPE_INCREMENT 2
935#define IO_NETWORK_INCREMENT 2
936#define IO_PARALLEL_INCREMENT 1
937#define IO_SERIAL_INCREMENT 2
938#define IO_SOUND_INCREMENT 8
939#define IO_VIDEO_INCREMENT 1
940#define SEMAPHORE_INCREMENT 1
941
942typedef struct _IRP {
943 CSHORT Type;
944 USHORT Size;
945 struct _MDL *MdlAddress;
946 ULONG Flags;
947 union {
948 struct _IRP *MasterIrp;
949 LONG IrpCount;
950 PVOID SystemBuffer;
951 } AssociatedIrp;
952 LIST_ENTRY ThreadListEntry;
953 IO_STATUS_BLOCK IoStatus;
954 KPROCESSOR_MODE RequestorMode;
955 BOOLEAN PendingReturned;
956 CHAR StackCount;
957 CHAR CurrentLocation;
958 BOOLEAN Cancel;
959 KIRQL CancelIrql;
960 CCHAR ApcEnvironment;
961 UCHAR AllocationFlags;
962 PIO_STATUS_BLOCK UserIosb;
963 PKEVENT UserEvent;
964 union {
965 struct {
966 PIO_APC_ROUTINE UserApcRoutine;
967 PVOID UserApcContext;
968 } AsynchronousParameters;
969 LARGE_INTEGER AllocationSize;
970 } Overlay;
971 PDRIVER_CANCEL CancelRoutine;
972 PVOID UserBuffer;
973 union {
974 struct {
975 _ANONYMOUS_UNION union {
976 KDEVICE_QUEUE_ENTRY DeviceQueueEntry;
977 _ANONYMOUS_STRUCT struct {
978 PVOID DriverContext[4];
979 } DUMMYSTRUCTNAME;
980 } DUMMYUNIONNAME;
981 PETHREAD Thread;
982 PCHAR AuxiliaryBuffer;
983 _ANONYMOUS_STRUCT struct {
984 LIST_ENTRY ListEntry;
985 _ANONYMOUS_UNION union {
986 struct _IO_STACK_LOCATION *CurrentStackLocation;
987 ULONG PacketType;
988 } DUMMYUNIONNAME;
989 } DUMMYSTRUCTNAME;
990 struct _FILE_OBJECT *OriginalFileObject;
991 } Overlay;
992 KAPC Apc;
993 PVOID CompletionKey;
994 } Tail;
995} IRP;
996typedef struct _IRP *PIRP;
997
998/* IRP.Flags */
999
1000#define SL_FORCE_ACCESS_CHECK 0x01
1001#define SL_OPEN_PAGING_FILE 0x02
1002#define SL_OPEN_TARGET_DIRECTORY 0x04
1003#define SL_CASE_SENSITIVE 0x80
1004
1005#define SL_KEY_SPECIFIED 0x01
1006#define SL_OVERRIDE_VERIFY_VOLUME 0x02
1007#define SL_WRITE_THROUGH 0x04
1008#define SL_FT_SEQUENTIAL_WRITE 0x08
1009
1010#define SL_FAIL_IMMEDIATELY 0x01
1011#define SL_EXCLUSIVE_LOCK 0x02
1012
1013#define SL_RESTART_SCAN 0x01
1014#define SL_RETURN_SINGLE_ENTRY 0x02
1015#define SL_INDEX_SPECIFIED 0x04
1016
1017#define SL_WATCH_TREE 0x01
1018
1019#define SL_ALLOW_RAW_MOUNT 0x01
1020
1021#define CTL_CODE(DeviceType, Function, Method, Access)( \
1022 ((DeviceType) << 16) | ((Access) << 14) | ((Function) << 2) | (Method))
1023
1024#define DEVICE_TYPE_FROM_CTL_CODE(ctl) (((ULONG) (ctl & 0xffff0000)) >> 16)
1025
1026enum
1027{
1028 IRP_NOCACHE = 0x1,
1029 IRP_PAGING_IO = 0x2,
1030 IRP_MOUNT_COMPLETION = 0x2,
1031 IRP_SYNCHRONOUS_API = 0x4,
1032 IRP_ASSOCIATED_IRP = 0x8,
1033 IRP_BUFFERED_IO = 0x10,
1034 IRP_DEALLOCATE_BUFFER = 0x20,
1035 IRP_INPUT_OPERATION = 0x40,
1036 IRP_SYNCHRONOUS_PAGING_IO = 0x40,
1037 IRP_CREATE_OPERATION = 0x80,
1038 IRP_READ_OPERATION = 0x100,
1039 IRP_WRITE_OPERATION = 0x200,
1040 IRP_CLOSE_OPERATION = 0x400,
1041 IRP_DEFER_IO_COMPLETION = 0x800,
1042 IRP_OB_QUERY_NAME = 0x1000,
1043 IRP_HOLD_DEVICE_QUEUE = 0x2000,
1044 IRP_RETRY_IO_COMPLETION = 0x4000
1045};
1046
1047
1048typedef struct _DRIVE_LAYOUT_INFORMATION_MBR {
1049 ULONG Signature;
1050} DRIVE_LAYOUT_INFORMATION_MBR, *PDRIVE_LAYOUT_INFORMATION_MBR;
1051
1052typedef struct _DRIVE_LAYOUT_INFORMATION_GPT {
1053 GUID DiskId;
1054 LARGE_INTEGER StartingUsableOffset;
1055 LARGE_INTEGER UsableLength;
1056 ULONG MaxPartitionCount;
1057} DRIVE_LAYOUT_INFORMATION_GPT, *PDRIVE_LAYOUT_INFORMATION_GPT;
1058
1059typedef struct _PARTITION_INFORMATION_MBR {
1060 UCHAR PartitionType;
1061 BOOLEAN BootIndicator;
1062 BOOLEAN RecognizedPartition;
1063 ULONG HiddenSectors;
1064} PARTITION_INFORMATION_MBR, *PPARTITION_INFORMATION_MBR;
1065
1066
1067typedef struct _BOOTDISK_INFORMATION {
1068 LONGLONG BootPartitionOffset;
1069 LONGLONG SystemPartitionOffset;
1070 ULONG BootDeviceSignature;
1071 ULONG SystemDeviceSignature;
1072} BOOTDISK_INFORMATION, *PBOOTDISK_INFORMATION;
1073
1074typedef struct _BOOTDISK_INFORMATION_EX {
1075 LONGLONG BootPartitionOffset;
1076 LONGLONG SystemPartitionOffset;
1077 ULONG BootDeviceSignature;
1078 ULONG SystemDeviceSignature;
1079 GUID BootDeviceGuid;
1080 GUID SystemDeviceGuid;
1081 BOOLEAN BootDeviceIsGpt;
1082 BOOLEAN SystemDeviceIsGpt;
1083} BOOTDISK_INFORMATION_EX, *PBOOTDISK_INFORMATION_EX;
1084
1085typedef struct _EISA_MEMORY_TYPE {
1086 UCHAR ReadWrite : 1;
1087 UCHAR Cached : 1;
1088 UCHAR Reserved0 : 1;
1089 UCHAR Type : 2;
1090 UCHAR Shared : 1;
1091 UCHAR Reserved1 : 1;
1092 UCHAR MoreEntries : 1;
1093} EISA_MEMORY_TYPE, *PEISA_MEMORY_TYPE;
1094
1095#include <pshpack1.h>
1096typedef struct _EISA_MEMORY_CONFIGURATION {
1097 EISA_MEMORY_TYPE ConfigurationByte;
1098 UCHAR DataSize;
1099 USHORT AddressLowWord;
1100 UCHAR AddressHighByte;
1101 USHORT MemorySize;
1102} EISA_MEMORY_CONFIGURATION, *PEISA_MEMORY_CONFIGURATION;
1103#include <poppack.h>
1104
1105typedef struct _EISA_IRQ_DESCRIPTOR {
1106 UCHAR Interrupt : 4;
1107 UCHAR Reserved : 1;
1108 UCHAR LevelTriggered : 1;
1109 UCHAR Shared : 1;
1110 UCHAR MoreEntries : 1;
1111} EISA_IRQ_DESCRIPTOR, *PEISA_IRQ_DESCRIPTOR;
1112
1113typedef struct _EISA_IRQ_CONFIGURATION {
1114 EISA_IRQ_DESCRIPTOR ConfigurationByte;
1115 UCHAR Reserved;
1116} EISA_IRQ_CONFIGURATION, *PEISA_IRQ_CONFIGURATION;
1117
1118typedef struct _DMA_CONFIGURATION_BYTE0 {
1119 UCHAR Channel : 3;
1120 UCHAR Reserved : 3;
1121 UCHAR Shared : 1;
1122 UCHAR MoreEntries : 1;
1123} DMA_CONFIGURATION_BYTE0;
1124
1125typedef struct _DMA_CONFIGURATION_BYTE1 {
1126 UCHAR Reserved0 : 2;
1127 UCHAR TransferSize : 2;
1128 UCHAR Timing : 2;
1129 UCHAR Reserved1 : 2;
1130} DMA_CONFIGURATION_BYTE1;
1131
1132typedef struct _EISA_DMA_CONFIGURATION {
1133 DMA_CONFIGURATION_BYTE0 ConfigurationByte0;
1134 DMA_CONFIGURATION_BYTE1 ConfigurationByte1;
1135} EISA_DMA_CONFIGURATION, *PEISA_DMA_CONFIGURATION;
1136
1137#include <pshpack1.h>
1138typedef struct _EISA_PORT_DESCRIPTOR {
1139 UCHAR NumberPorts : 5;
1140 UCHAR Reserved : 1;
1141 UCHAR Shared : 1;
1142 UCHAR MoreEntries : 1;
1143} EISA_PORT_DESCRIPTOR, *PEISA_PORT_DESCRIPTOR;
1144
1145typedef struct _EISA_PORT_CONFIGURATION {
1146 EISA_PORT_DESCRIPTOR Configuration;
1147 USHORT PortAddress;
1148} EISA_PORT_CONFIGURATION, *PEISA_PORT_CONFIGURATION;
1149#include <poppack.h>
1150
1151typedef struct _CM_EISA_FUNCTION_INFORMATION {
1152 ULONG CompressedId;
1153 UCHAR IdSlotFlags1;
1154 UCHAR IdSlotFlags2;
1155 UCHAR MinorRevision;
1156 UCHAR MajorRevision;
1157 UCHAR Selections[26];
1158 UCHAR FunctionFlags;
1159 UCHAR TypeString[80];
1160 EISA_MEMORY_CONFIGURATION EisaMemory[9];
1161 EISA_IRQ_CONFIGURATION EisaIrq[7];
1162 EISA_DMA_CONFIGURATION EisaDma[4];
1163 EISA_PORT_CONFIGURATION EisaPort[20];
1164 UCHAR InitializationData[60];
1165} CM_EISA_FUNCTION_INFORMATION, *PCM_EISA_FUNCTION_INFORMATION;
1166
1167/* CM_EISA_FUNCTION_INFORMATION.FunctionFlags */
1168
1169#define EISA_FUNCTION_ENABLED 0x80
1170#define EISA_FREE_FORM_DATA 0x40
1171#define EISA_HAS_PORT_INIT_ENTRY 0x20
1172#define EISA_HAS_PORT_RANGE 0x10
1173#define EISA_HAS_DMA_ENTRY 0x08
1174#define EISA_HAS_IRQ_ENTRY 0x04
1175#define EISA_HAS_MEMORY_ENTRY 0x02
1176#define EISA_HAS_TYPE_ENTRY 0x01
1177#define EISA_HAS_INFORMATION \
1178 (EISA_HAS_PORT_RANGE + EISA_HAS_DMA_ENTRY + EISA_HAS_IRQ_ENTRY \
1179 + EISA_HAS_MEMORY_ENTRY + EISA_HAS_TYPE_ENTRY)
1180
1181typedef struct _CM_EISA_SLOT_INFORMATION {
1182 UCHAR ReturnCode;
1183 UCHAR ReturnFlags;
1184 UCHAR MajorRevision;
1185 UCHAR MinorRevision;
1186 USHORT Checksum;
1187 UCHAR NumberFunctions;
1188 UCHAR FunctionInformation;
1189 ULONG CompressedId;
1190} CM_EISA_SLOT_INFORMATION, *PCM_EISA_SLOT_INFORMATION;
1191
1192/* CM_EISA_SLOT_INFORMATION.ReturnCode */
1193
1194#define EISA_INVALID_SLOT 0x80
1195#define EISA_INVALID_FUNCTION 0x81
1196#define EISA_INVALID_CONFIGURATION 0x82
1197#define EISA_EMPTY_SLOT 0x83
1198#define EISA_INVALID_BIOS_CALL 0x86
1199
1200typedef struct _CM_FLOPPY_DEVICE_DATA {
1201 USHORT Version;
1202 USHORT Revision;
1203 CHAR Size[8];
1204 ULONG MaxDensity;
1205 ULONG MountDensity;
1206 UCHAR StepRateHeadUnloadTime;
1207 UCHAR HeadLoadTime;
1208 UCHAR MotorOffTime;
1209 UCHAR SectorLengthCode;
1210 UCHAR SectorPerTrack;
1211 UCHAR ReadWriteGapLength;
1212 UCHAR DataTransferLength;
1213 UCHAR FormatGapLength;
1214 UCHAR FormatFillCharacter;
1215 UCHAR HeadSettleTime;
1216 UCHAR MotorSettleTime;
1217 UCHAR MaximumTrackValue;
1218 UCHAR DataTransferRate;
1219} CM_FLOPPY_DEVICE_DATA, *PCM_FLOPPY_DEVICE_DATA;
1220
1221typedef enum _INTERFACE_TYPE {
1222 InterfaceTypeUndefined = -1,
1223 Internal,
1224 Isa,
1225 Eisa,
1226 MicroChannel,
1227 TurboChannel,
1228 PCIBus,
1229 VMEBus,
1230 NuBus,
1231 PCMCIABus,
1232 CBus,
1233 MPIBus,
1234 MPSABus,
1235 ProcessorInternal,
1236 InternalPowerBus,
1237 PNPISABus,
1238 PNPBus,
1239 MaximumInterfaceType
1240} INTERFACE_TYPE, *PINTERFACE_TYPE;
1241
1242typedef struct _PNP_BUS_INFORMATION {
1243 GUID BusTypeGuid;
1244 INTERFACE_TYPE LegacyBusType;
1245 ULONG BusNumber;
1246} PNP_BUS_INFORMATION, *PPNP_BUS_INFORMATION;
1247
1248#include <pshpack1.h>
1249typedef struct _CM_PARTIAL_RESOURCE_DESCRIPTOR {
1250 UCHAR Type;
1251 UCHAR ShareDisposition;
1252 USHORT Flags;
1253 union {
1254 struct {
1255 PHYSICAL_ADDRESS Start;
1256 ULONG Length;
1257 } Generic;
1258 struct {
1259 PHYSICAL_ADDRESS Start;
1260 ULONG Length;
1261 } Port;
1262 struct {
1263 ULONG Level;
1264 ULONG Vector;
1265 ULONG Affinity;
1266 } Interrupt;
1267 struct {
1268 PHYSICAL_ADDRESS Start;
1269 ULONG Length;
1270 } Memory;
1271 struct {
1272 ULONG Channel;
1273 ULONG Port;
1274 ULONG Reserved1;
1275 } Dma;
1276 struct {
1277 ULONG Data[3];
1278 } DevicePrivate;
1279 struct {
1280 ULONG Start;
1281 ULONG Length;
1282 ULONG Reserved;
1283 } BusNumber;
1284 struct {
1285 ULONG DataSize;
1286 ULONG Reserved1;
1287 ULONG Reserved2;
1288 } DeviceSpecificData;
1289 } u;
1290} CM_PARTIAL_RESOURCE_DESCRIPTOR, *PCM_PARTIAL_RESOURCE_DESCRIPTOR;
1291
1292/* CM_PARTIAL_RESOURCE_DESCRIPTOR.Type */
1293
1294#define CmResourceTypeNull 0
1295#define CmResourceTypePort 1
1296#define CmResourceTypeInterrupt 2
1297#define CmResourceTypeMemory 3
1298#define CmResourceTypeDma 4
1299#define CmResourceTypeDeviceSpecific 5
1300#define CmResourceTypeBusNumber 6
1301#define CmResourceTypeMaximum 7
1302#define CmResourceTypeNonArbitrated 128
1303#define CmResourceTypeConfigData 128
1304#define CmResourceTypeDevicePrivate 129
1305#define CmResourceTypePcCardConfig 130
1306#define CmResourceTypeMfCardConfig 131
1307
1308/* CM_PARTIAL_RESOURCE_DESCRIPTOR.ShareDisposition */
1309
1310typedef enum _CM_SHARE_DISPOSITION {
1311 CmResourceShareUndetermined,
1312 CmResourceShareDeviceExclusive,
1313 CmResourceShareDriverExclusive,
1314 CmResourceShareShared
1315} CM_SHARE_DISPOSITION;
1316
1317/* CM_PARTIAL_RESOURCE_DESCRIPTOR.Flags if Type = CmResourceTypePort */
1318
1319#define CM_RESOURCE_PORT_MEMORY 0x0000
1320#define CM_RESOURCE_PORT_IO 0x0001
1321#define CM_RESOURCE_PORT_10_BIT_DECODE 0x0004
1322#define CM_RESOURCE_PORT_12_BIT_DECODE 0x0008
1323#define CM_RESOURCE_PORT_16_BIT_DECODE 0x0010
1324#define CM_RESOURCE_PORT_POSITIVE_DECODE 0x0020
1325#define CM_RESOURCE_PORT_PASSIVE_DECODE 0x0040
1326#define CM_RESOURCE_PORT_WINDOW_DECODE 0x0080
1327
1328/* CM_PARTIAL_RESOURCE_DESCRIPTOR.Flags if Type = CmResourceTypeInterrupt */
1329
1330#define CM_RESOURCE_INTERRUPT_LEVEL_SENSITIVE 0x0000
1331#define CM_RESOURCE_INTERRUPT_LATCHED 0x0001
1332
1333/* CM_PARTIAL_RESOURCE_DESCRIPTOR.Flags if Type = CmResourceTypeMemory */
1334
1335#define CM_RESOURCE_MEMORY_READ_WRITE 0x0000
1336#define CM_RESOURCE_MEMORY_READ_ONLY 0x0001
1337#define CM_RESOURCE_MEMORY_WRITE_ONLY 0x0002
1338#define CM_RESOURCE_MEMORY_PREFETCHABLE 0x0004
1339#define CM_RESOURCE_MEMORY_COMBINEDWRITE 0x0008
1340#define CM_RESOURCE_MEMORY_24 0x0010
1341#define CM_RESOURCE_MEMORY_CACHEABLE 0x0020
1342
1343/* CM_PARTIAL_RESOURCE_DESCRIPTOR.Flags if Type = CmResourceTypeDma */
1344
1345#define CM_RESOURCE_DMA_8 0x0000
1346#define CM_RESOURCE_DMA_16 0x0001
1347#define CM_RESOURCE_DMA_32 0x0002
1348#define CM_RESOURCE_DMA_8_AND_16 0x0004
1349#define CM_RESOURCE_DMA_BUS_MASTER 0x0008
1350#define CM_RESOURCE_DMA_TYPE_A 0x0010
1351#define CM_RESOURCE_DMA_TYPE_B 0x0020
1352#define CM_RESOURCE_DMA_TYPE_F 0x0040
1353
1354typedef struct _CM_PARTIAL_RESOURCE_LIST {
1355 USHORT Version;
1356 USHORT Revision;
1357 ULONG Count;
1358 CM_PARTIAL_RESOURCE_DESCRIPTOR PartialDescriptors[1];
1359} CM_PARTIAL_RESOURCE_LIST, *PCM_PARTIAL_RESOURCE_LIST;
1360
1361typedef struct _CM_FULL_RESOURCE_DESCRIPTOR {
1362 INTERFACE_TYPE InterfaceType;
1363 ULONG BusNumber;
1364 CM_PARTIAL_RESOURCE_LIST PartialResourceList;
1365} CM_FULL_RESOURCE_DESCRIPTOR, *PCM_FULL_RESOURCE_DESCRIPTOR;
1366
1367typedef struct _CM_RESOURCE_LIST {
1368 ULONG Count;
1369 CM_FULL_RESOURCE_DESCRIPTOR List[1];
1370} CM_RESOURCE_LIST, *PCM_RESOURCE_LIST;
1371
1372typedef struct _CM_INT13_DRIVE_PARAMETER {
1373 USHORT DriveSelect;
1374 ULONG MaxCylinders;
1375 USHORT SectorsPerTrack;
1376 USHORT MaxHeads;
1377 USHORT NumberDrives;
1378} CM_INT13_DRIVE_PARAMETER, *PCM_INT13_DRIVE_PARAMETER;
1379#include <poppack.h>
1380
1381typedef struct _CM_KEYBOARD_DEVICE_DATA {
1382 USHORT Version;
1383 USHORT Revision;
1384 UCHAR Type;
1385 UCHAR Subtype;
1386 USHORT KeyboardFlags;
1387} CM_KEYBOARD_DEVICE_DATA, *PCM_KEYBOARD_DEVICE_DATA;
1388
1389#define KEYBOARD_INSERT_ON 0x80
1390#define KEYBOARD_CAPS_LOCK_ON 0x40
1391#define KEYBOARD_NUM_LOCK_ON 0x20
1392#define KEYBOARD_SCROLL_LOCK_ON 0x10
1393#define KEYBOARD_ALT_KEY_DOWN 0x08
1394#define KEYBOARD_CTRL_KEY_DOWN 0x04
1395#define KEYBOARD_LEFT_SHIFT_DOWN 0x02
1396#define KEYBOARD_RIGHT_SHIFT_DOWN 0x01
1397
1398typedef struct _CM_MCA_POS_DATA {
1399 USHORT AdapterId;
1400 UCHAR PosData1;
1401 UCHAR PosData2;
1402 UCHAR PosData3;
1403 UCHAR PosData4;
1404} CM_MCA_POS_DATA, *PCM_MCA_POS_DATA;
1405
1406typedef struct CM_Power_Data_s {
1407 ULONG PD_Size;
1408 DEVICE_POWER_STATE PD_MostRecentPowerState;
1409 ULONG PD_Capabilities;
1410 ULONG PD_D1Latency;
1411 ULONG PD_D2Latency;
1412 ULONG PD_D3Latency;
1413 DEVICE_POWER_STATE PD_PowerStateMapping[PowerSystemMaximum];
1414} CM_POWER_DATA, *PCM_POWER_DATA;
1415
1416#define PDCAP_D0_SUPPORTED 0x00000001
1417#define PDCAP_D1_SUPPORTED 0x00000002
1418#define PDCAP_D2_SUPPORTED 0x00000004
1419#define PDCAP_D3_SUPPORTED 0x00000008
1420#define PDCAP_WAKE_FROM_D0_SUPPORTED 0x00000010
1421#define PDCAP_WAKE_FROM_D1_SUPPORTED 0x00000020
1422#define PDCAP_WAKE_FROM_D2_SUPPORTED 0x00000040
1423#define PDCAP_WAKE_FROM_D3_SUPPORTED 0x00000080
1424#define PDCAP_WARM_EJECT_SUPPORTED 0x00000100
1425
1426typedef struct _CM_SCSI_DEVICE_DATA {
1427 USHORT Version;
1428 USHORT Revision;
1429 UCHAR HostIdentifier;
1430} CM_SCSI_DEVICE_DATA, *PCM_SCSI_DEVICE_DATA;
1431
1432typedef struct _CM_SERIAL_DEVICE_DATA {
1433 USHORT Version;
1434 USHORT Revision;
1435 ULONG BaudClock;
1436} CM_SERIAL_DEVICE_DATA, *PCM_SERIAL_DEVICE_DATA;
1437
1438/* IO_RESOURCE_DESCRIPTOR.Option */
1439
1440#define IO_RESOURCE_PREFERRED 0x01
1441#define IO_RESOURCE_DEFAULT 0x02
1442#define IO_RESOURCE_ALTERNATIVE 0x08
1443
1444typedef struct _IO_RESOURCE_DESCRIPTOR {
1445 UCHAR Option;
1446 UCHAR Type;
1447 UCHAR ShareDisposition;
1448 UCHAR Spare1;
1449 USHORT Flags;
1450 USHORT Spare2;
1451 union {
1452 struct {
1453 ULONG Length;
1454 ULONG Alignment;
1455 PHYSICAL_ADDRESS MinimumAddress;
1456 PHYSICAL_ADDRESS MaximumAddress;
1457 } Port;
1458 struct {
1459 ULONG Length;
1460 ULONG Alignment;
1461 PHYSICAL_ADDRESS MinimumAddress;
1462 PHYSICAL_ADDRESS MaximumAddress;
1463 } Memory;
1464 struct {
1465 ULONG MinimumVector;
1466 ULONG MaximumVector;
1467 } Interrupt;
1468 struct {
1469 ULONG MinimumChannel;
1470 ULONG MaximumChannel;
1471 } Dma;
1472 struct {
1473 ULONG Length;
1474 ULONG Alignment;
1475 PHYSICAL_ADDRESS MinimumAddress;
1476 PHYSICAL_ADDRESS MaximumAddress;
1477 } Generic;
1478 struct {
1479 ULONG Data[3];
1480 } DevicePrivate;
1481 struct {
1482 ULONG Length;
1483 ULONG MinBusNumber;
1484 ULONG MaxBusNumber;
1485 ULONG Reserved;
1486 } BusNumber;
1487 struct {
1488 ULONG Priority;
1489 ULONG Reserved1;
1490 ULONG Reserved2;
1491 } ConfigData;
1492 } u;
1493} IO_RESOURCE_DESCRIPTOR, *PIO_RESOURCE_DESCRIPTOR;
1494
1495typedef struct _IO_RESOURCE_LIST {
1496 USHORT Version;
1497 USHORT Revision;
1498 ULONG Count;
1499 IO_RESOURCE_DESCRIPTOR Descriptors[1];
1500} IO_RESOURCE_LIST, *PIO_RESOURCE_LIST;
1501
1502typedef struct _IO_RESOURCE_REQUIREMENTS_LIST {
1503 ULONG ListSize;
1504 INTERFACE_TYPE InterfaceType;
1505 ULONG BusNumber;
1506 ULONG SlotNumber;
1507 ULONG Reserved[3];
1508 ULONG AlternativeLists;
1509 IO_RESOURCE_LIST List[1];
1510} IO_RESOURCE_REQUIREMENTS_LIST, *PIO_RESOURCE_REQUIREMENTS_LIST;
1511
1512typedef struct _CONTROLLER_OBJECT {
1513 CSHORT Type;
1514 CSHORT Size;
1515 PVOID ControllerExtension;
1516 KDEVICE_QUEUE DeviceWaitQueue;
1517 ULONG Spare1;
1518 LARGE_INTEGER Spare2;
1519} CONTROLLER_OBJECT, *PCONTROLLER_OBJECT;
1520
1521typedef enum _DMA_WIDTH {
1522 Width8Bits,
1523 Width16Bits,
1524 Width32Bits,
1525 MaximumDmaWidth
1526} DMA_WIDTH, *PDMA_WIDTH;
1527
1528typedef enum _DMA_SPEED {
1529 Compatible,
1530 TypeA,
1531 TypeB,
1532 TypeC,
1533 TypeF,
1534 MaximumDmaSpeed
1535} DMA_SPEED, *PDMA_SPEED;
1536
1537/* DEVICE_DESCRIPTION.Version */
1538
1539#define DEVICE_DESCRIPTION_VERSION 0x0000
1540#define DEVICE_DESCRIPTION_VERSION1 0x0001
1541#define DEVICE_DESCRIPTION_VERSION2 0x0002
1542
1543typedef struct _DEVICE_DESCRIPTION {
1544 ULONG Version;
1545 BOOLEAN Master;
1546 BOOLEAN ScatterGather;
1547 BOOLEAN DemandMode;
1548 BOOLEAN AutoInitialize;
1549 BOOLEAN Dma32BitAddresses;
1550 BOOLEAN IgnoreCount;
1551 BOOLEAN Reserved1;
1552 BOOLEAN Dma64BitAddresses;
1553 ULONG BusNumber;
1554 ULONG DmaChannel;
1555 INTERFACE_TYPE InterfaceType;
1556 DMA_WIDTH DmaWidth;
1557 DMA_SPEED DmaSpeed;
1558 ULONG MaximumLength;
1559 ULONG DmaPort;
1560} DEVICE_DESCRIPTION, *PDEVICE_DESCRIPTION;
1561
1562/* VPB.Flags */
1563#define VPB_MOUNTED 0x0001
1564#define VPB_LOCKED 0x0002
1565#define VPB_PERSISTENT 0x0004
1566#define VPB_REMOVE_PENDING 0x0008
1567#define VPB_RAW_MOUNT 0x0010
1568
1569#define MAXIMUM_VOLUME_LABEL_LENGTH (32 * sizeof(WCHAR))
1570
1571typedef struct _VPB {
1572 CSHORT Type;
1573 CSHORT Size;
1574 USHORT Flags;
1575 USHORT VolumeLabelLength;
1576 struct _DEVICE_OBJECT *DeviceObject;
1577 struct _DEVICE_OBJECT *RealDevice;
1578 ULONG SerialNumber;
1579 ULONG ReferenceCount;
1580 WCHAR VolumeLabel[MAXIMUM_VOLUME_LABEL_LENGTH / sizeof(WCHAR)];
1581} VPB, *PVPB;
1582
1583/* DEVICE_OBJECT.Flags */
1584
1585#define DO_VERIFY_VOLUME 0x00000002
1586#define DO_BUFFERED_IO 0x00000004
1587#define DO_EXCLUSIVE 0x00000008
1588#define DO_DIRECT_IO 0x00000010
1589#define DO_MAP_IO_BUFFER 0x00000020
1590#define DO_DEVICE_HAS_NAME 0x00000040
1591#define DO_DEVICE_INITIALIZING 0x00000080
1592#define DO_SYSTEM_BOOT_PARTITION 0x00000100
1593#define DO_LONG_TERM_REQUESTS 0x00000200
1594#define DO_NEVER_LAST_DEVICE 0x00000400
1595#define DO_SHUTDOWN_REGISTERED 0x00000800
1596#define DO_BUS_ENUMERATED_DEVICE 0x00001000
1597#define DO_POWER_PAGABLE 0x00002000
1598#define DO_POWER_INRUSH 0x00004000
1599#define DO_LOW_PRIORITY_FILESYSTEM 0x00010000
1600
1601/* DEVICE_OBJECT.Characteristics */
1602
1603#define FILE_REMOVABLE_MEDIA 0x00000001
1604#define FILE_READ_ONLY_DEVICE 0x00000002
1605#define FILE_FLOPPY_DISKETTE 0x00000004
1606#define FILE_WRITE_ONCE_MEDIA 0x00000008
1607#define FILE_REMOTE_DEVICE 0x00000010
1608#define FILE_DEVICE_IS_MOUNTED 0x00000020
1609#define FILE_VIRTUAL_VOLUME 0x00000040
1610#define FILE_AUTOGENERATED_DEVICE_NAME 0x00000080
1611#define FILE_DEVICE_SECURE_OPEN 0x00000100
1612
1613/* DEVICE_OBJECT.AlignmentRequirement */
1614
1615#define FILE_BYTE_ALIGNMENT 0x00000000
1616#define FILE_WORD_ALIGNMENT 0x00000001
1617#define FILE_LONG_ALIGNMENT 0x00000003
1618#define FILE_QUAD_ALIGNMENT 0x00000007
1619#define FILE_OCTA_ALIGNMENT 0x0000000f
1620#define FILE_32_BYTE_ALIGNMENT 0x0000001f
1621#define FILE_64_BYTE_ALIGNMENT 0x0000003f
1622#define FILE_128_BYTE_ALIGNMENT 0x0000007f
1623#define FILE_256_BYTE_ALIGNMENT 0x000000ff
1624#define FILE_512_BYTE_ALIGNMENT 0x000001ff
1625
1626/* DEVICE_OBJECT.DeviceType */
1627
1628#define DEVICE_TYPE ULONG
1629
1630#define FILE_DEVICE_BEEP 0x00000001
1631#define FILE_DEVICE_CD_ROM 0x00000002
1632#define FILE_DEVICE_CD_ROM_FILE_SYSTEM 0x00000003
1633#define FILE_DEVICE_CONTROLLER 0x00000004
1634#define FILE_DEVICE_DATALINK 0x00000005
1635#define FILE_DEVICE_DFS 0x00000006
1636#define FILE_DEVICE_DISK 0x00000007
1637#define FILE_DEVICE_DISK_FILE_SYSTEM 0x00000008
1638#define FILE_DEVICE_FILE_SYSTEM 0x00000009
1639#define FILE_DEVICE_INPORT_PORT 0x0000000a
1640#define FILE_DEVICE_KEYBOARD 0x0000000b
1641#define FILE_DEVICE_MAILSLOT 0x0000000c
1642#define FILE_DEVICE_MIDI_IN 0x0000000d
1643#define FILE_DEVICE_MIDI_OUT 0x0000000e
1644#define FILE_DEVICE_MOUSE 0x0000000f
1645#define FILE_DEVICE_MULTI_UNC_PROVIDER 0x00000010
1646#define FILE_DEVICE_NAMED_PIPE 0x00000011
1647#define FILE_DEVICE_NETWORK 0x00000012
1648#define FILE_DEVICE_NETWORK_BROWSER 0x00000013
1649#define FILE_DEVICE_NETWORK_FILE_SYSTEM 0x00000014
1650#define FILE_DEVICE_NULL 0x00000015
1651#define FILE_DEVICE_PARALLEL_PORT 0x00000016
1652#define FILE_DEVICE_PHYSICAL_NETCARD 0x00000017
1653#define FILE_DEVICE_PRINTER 0x00000018
1654#define FILE_DEVICE_SCANNER 0x00000019
1655#define FILE_DEVICE_SERIAL_MOUSE_PORT 0x0000001a
1656#define FILE_DEVICE_SERIAL_PORT 0x0000001b
1657#define FILE_DEVICE_SCREEN 0x0000001c
1658#define FILE_DEVICE_SOUND 0x0000001d
1659#define FILE_DEVICE_STREAMS 0x0000001e
1660#define FILE_DEVICE_TAPE 0x0000001f
1661#define FILE_DEVICE_TAPE_FILE_SYSTEM 0x00000020
1662#define FILE_DEVICE_TRANSPORT 0x00000021
1663#define FILE_DEVICE_UNKNOWN 0x00000022
1664#define FILE_DEVICE_VIDEO 0x00000023
1665#define FILE_DEVICE_VIRTUAL_DISK 0x00000024
1666#define FILE_DEVICE_WAVE_IN 0x00000025
1667#define FILE_DEVICE_WAVE_OUT 0x00000026
1668#define FILE_DEVICE_8042_PORT 0x00000027
1669#define FILE_DEVICE_NETWORK_REDIRECTOR 0x00000028
1670#define FILE_DEVICE_BATTERY 0x00000029
1671#define FILE_DEVICE_BUS_EXTENDER 0x0000002a
1672#define FILE_DEVICE_MODEM 0x0000002b
1673#define FILE_DEVICE_VDM 0x0000002c
1674#define FILE_DEVICE_MASS_STORAGE 0x0000002d
1675#define FILE_DEVICE_SMB 0x0000002e
1676#define FILE_DEVICE_KS 0x0000002f
1677#define FILE_DEVICE_CHANGER 0x00000030
1678#define FILE_DEVICE_SMARTCARD 0x00000031
1679#define FILE_DEVICE_ACPI 0x00000032
1680#define FILE_DEVICE_DVD 0x00000033
1681#define FILE_DEVICE_FULLSCREEN_VIDEO 0x00000034
1682#define FILE_DEVICE_DFS_FILE_SYSTEM 0x00000035
1683#define FILE_DEVICE_DFS_VOLUME 0x00000036
1684#define FILE_DEVICE_SERENUM 0x00000037
1685#define FILE_DEVICE_TERMSRV 0x00000038
1686#define FILE_DEVICE_KSEC 0x00000039
1687#define FILE_DEVICE_FIPS 0x0000003a
1688
1689typedef struct _DEVICE_OBJECT {
1690 CSHORT Type;
1691 USHORT Size;
1692 LONG ReferenceCount;
1693 struct _DRIVER_OBJECT *DriverObject;
1694 struct _DEVICE_OBJECT *NextDevice;
1695 struct _DEVICE_OBJECT *AttachedDevice;
1696 struct _IRP *CurrentIrp;
1697 PIO_TIMER Timer;
1698 ULONG Flags;
1699 ULONG Characteristics;
1700 PVPB Vpb;
1701 PVOID DeviceExtension;
1702 DEVICE_TYPE DeviceType;
1703 CCHAR StackSize;
1704 union {
1705 LIST_ENTRY ListEntry;
1706 WAIT_CONTEXT_BLOCK Wcb;
1707 } Queue;
1708 ULONG AlignmentRequirement;
1709 KDEVICE_QUEUE DeviceQueue;
1710 KDPC Dpc;
1711 ULONG ActiveThreadCount;
1712 PSECURITY_DESCRIPTOR SecurityDescriptor;
1713 KEVENT DeviceLock;
1714 USHORT SectorSize;
1715 USHORT Spare1;
1716 struct _DEVOBJ_EXTENSION *DeviceObjectExtension;
1717 PVOID Reserved;
1718} DEVICE_OBJECT;
1719typedef struct _DEVICE_OBJECT *PDEVICE_OBJECT;
1720
1721typedef enum _DEVICE_RELATION_TYPE {
1722 BusRelations,
1723 EjectionRelations,
1724 PowerRelations,
1725 RemovalRelations,
1726 TargetDeviceRelation,
1727 SingleBusRelations
1728} DEVICE_RELATION_TYPE, *PDEVICE_RELATION_TYPE;
1729
1730typedef struct _DEVICE_RELATIONS {
1731 ULONG Count;
1732 PDEVICE_OBJECT Objects[1];
1733} DEVICE_RELATIONS, *PDEVICE_RELATIONS;
1734
1735typedef struct _SCATTER_GATHER_ELEMENT {
1736 PHYSICAL_ADDRESS Address;
1737 ULONG Length;
1738 ULONG_PTR Reserved;
1739} SCATTER_GATHER_ELEMENT, *PSCATTER_GATHER_ELEMENT;
1740
1741typedef struct _SCATTER_GATHER_LIST {
1742 ULONG NumberOfElements;
1743 ULONG_PTR Reserved;
1744 SCATTER_GATHER_ELEMENT Elements[0];
1745} SCATTER_GATHER_LIST, *PSCATTER_GATHER_LIST;
1746
1747typedef struct _MDL {
1748 struct _MDL *Next;
1749 CSHORT Size;
1750 CSHORT MdlFlags;
1751 struct _EPROCESS *Process;
1752 PVOID MappedSystemVa;
1753 PVOID StartVa;
1754 ULONG ByteCount;
1755 ULONG ByteOffset;
1756} MDL, *PMDL;
1757
1758#define MDL_MAPPED_TO_SYSTEM_VA 0x0001
1759#define MDL_PAGES_LOCKED 0x0002
1760#define MDL_SOURCE_IS_NONPAGED_POOL 0x0004
1761#define MDL_ALLOCATED_FIXED_SIZE 0x0008
1762#define MDL_PARTIAL 0x0010
1763#define MDL_PARTIAL_HAS_BEEN_MAPPED 0x0020
1764#define MDL_IO_PAGE_READ 0x0040
1765#define MDL_WRITE_OPERATION 0x0080
1766#define MDL_PARENT_MAPPED_SYSTEM_VA 0x0100
1767#define MDL_FREE_EXTRA_PTES 0x0200
1768#define MDL_IO_SPACE 0x0800
1769#define MDL_NETWORK_HEADER 0x1000
1770#define MDL_MAPPING_CAN_FAIL 0x2000
1771#define MDL_ALLOCATED_MUST_SUCCEED 0x4000
1772
1773#define MDL_MAPPING_FLAGS ( \
1774 MDL_MAPPED_TO_SYSTEM_VA | \
1775 MDL_PAGES_LOCKED | \
1776 MDL_SOURCE_IS_NONPAGED_POOL | \
1777 MDL_PARTIAL_HAS_BEEN_MAPPED | \
1778 MDL_PARENT_MAPPED_SYSTEM_VA | \
1779 MDL_SYSTEM_VA | \
1780 MDL_IO_SPACE)
1781
1782typedef VOID DDKAPI
1783(*PPUT_DMA_ADAPTER)(
1784 IN PDMA_ADAPTER DmaAdapter);
1785
1786typedef PVOID DDKAPI
1787(*PALLOCATE_COMMON_BUFFER)(
1788 IN PDMA_ADAPTER DmaAdapter,
1789 IN ULONG Length,
1790 OUT PPHYSICAL_ADDRESS LogicalAddress,
1791 IN BOOLEAN CacheEnabled);
1792
1793typedef VOID DDKAPI
1794(*PFREE_COMMON_BUFFER)(
1795 IN PDMA_ADAPTER DmaAdapter,
1796 IN ULONG Length,
1797 IN PHYSICAL_ADDRESS LogicalAddress,
1798 IN PVOID VirtualAddress,
1799 IN BOOLEAN CacheEnabled);
1800
1801typedef NTSTATUS DDKAPI
1802(*PALLOCATE_ADAPTER_CHANNEL)(
1803 IN PDMA_ADAPTER DmaAdapter,
1804 IN PDEVICE_OBJECT DeviceObject,
1805 IN ULONG NumberOfMapRegisters,
1806 IN PDRIVER_CONTROL ExecutionRoutine,
1807 IN PVOID Context);
1808
1809typedef BOOLEAN DDKAPI
1810(*PFLUSH_ADAPTER_BUFFERS)(
1811 IN PDMA_ADAPTER DmaAdapter,
1812 IN PMDL Mdl,
1813 IN PVOID MapRegisterBase,
1814 IN PVOID CurrentVa,
1815 IN ULONG Length,
1816 IN BOOLEAN WriteToDevice);
1817
1818typedef VOID DDKAPI
1819(*PFREE_ADAPTER_CHANNEL)(
1820 IN PDMA_ADAPTER DmaAdapter);
1821
1822typedef VOID DDKAPI
1823(*PFREE_MAP_REGISTERS)(
1824 IN PDMA_ADAPTER DmaAdapter,
1825 PVOID MapRegisterBase,
1826 ULONG NumberOfMapRegisters);
1827
1828typedef PHYSICAL_ADDRESS DDKAPI
1829(*PMAP_TRANSFER)(
1830 IN PDMA_ADAPTER DmaAdapter,
1831 IN PMDL Mdl,
1832 IN PVOID MapRegisterBase,
1833 IN PVOID CurrentVa,
1834 IN OUT PULONG Length,
1835 IN BOOLEAN WriteToDevice);
1836
1837typedef ULONG DDKAPI
1838(*PGET_DMA_ALIGNMENT)(
1839 IN PDMA_ADAPTER DmaAdapter);
1840
1841typedef ULONG DDKAPI
1842(*PREAD_DMA_COUNTER)(
1843 IN PDMA_ADAPTER DmaAdapter);
1844
1845typedef NTSTATUS DDKAPI
1846(*PGET_SCATTER_GATHER_LIST)(
1847 IN PDMA_ADAPTER DmaAdapter,
1848 IN PDEVICE_OBJECT DeviceObject,
1849 IN PMDL Mdl,
1850 IN PVOID CurrentVa,
1851 IN ULONG Length,
1852 IN PDRIVER_LIST_CONTROL ExecutionRoutine,
1853 IN PVOID Context,
1854 IN BOOLEAN WriteToDevice);
1855
1856typedef VOID DDKAPI
1857(*PPUT_SCATTER_GATHER_LIST)(
1858 IN PDMA_ADAPTER DmaAdapter,
1859 IN PSCATTER_GATHER_LIST ScatterGather,
1860 IN BOOLEAN WriteToDevice);
1861
1862typedef NTSTATUS DDKAPI
1863(*PCALCULATE_SCATTER_GATHER_LIST_SIZE)(
1864 IN PDMA_ADAPTER DmaAdapter,
1865 IN PMDL Mdl OPTIONAL,
1866 IN PVOID CurrentVa,
1867 IN ULONG Length,
1868 OUT PULONG ScatterGatherListSize,
1869 OUT PULONG pNumberOfMapRegisters OPTIONAL);
1870
1871typedef NTSTATUS DDKAPI
1872(*PBUILD_SCATTER_GATHER_LIST)(
1873 IN PDMA_ADAPTER DmaAdapter,
1874 IN PDEVICE_OBJECT DeviceObject,
1875 IN PMDL Mdl,
1876 IN PVOID CurrentVa,
1877 IN ULONG Length,
1878 IN PDRIVER_LIST_CONTROL ExecutionRoutine,
1879 IN PVOID Context,
1880 IN BOOLEAN WriteToDevice,
1881 IN PVOID ScatterGatherBuffer,
1882 IN ULONG ScatterGatherLength);
1883
1884typedef NTSTATUS DDKAPI
1885(*PBUILD_MDL_FROM_SCATTER_GATHER_LIST)(
1886 IN PDMA_ADAPTER DmaAdapter,
1887 IN PSCATTER_GATHER_LIST ScatterGather,
1888 IN PMDL OriginalMdl,
1889 OUT PMDL *TargetMdl);
1890
1891typedef struct _DMA_OPERATIONS {
1892 ULONG Size;
1893 PPUT_DMA_ADAPTER PutDmaAdapter;
1894 PALLOCATE_COMMON_BUFFER AllocateCommonBuffer;
1895 PFREE_COMMON_BUFFER FreeCommonBuffer;
1896 PALLOCATE_ADAPTER_CHANNEL AllocateAdapterChannel;
1897 PFLUSH_ADAPTER_BUFFERS FlushAdapterBuffers;
1898 PFREE_ADAPTER_CHANNEL FreeAdapterChannel;
1899 PFREE_MAP_REGISTERS FreeMapRegisters;
1900 PMAP_TRANSFER MapTransfer;
1901 PGET_DMA_ALIGNMENT GetDmaAlignment;
1902 PREAD_DMA_COUNTER ReadDmaCounter;
1903 PGET_SCATTER_GATHER_LIST GetScatterGatherList;
1904 PPUT_SCATTER_GATHER_LIST PutScatterGatherList;
1905 PCALCULATE_SCATTER_GATHER_LIST_SIZE CalculateScatterGatherList;
1906 PBUILD_SCATTER_GATHER_LIST BuildScatterGatherList;
1907 PBUILD_MDL_FROM_SCATTER_GATHER_LIST BuildMdlFromScatterGatherList;
1908} DMA_OPERATIONS, *PDMA_OPERATIONS;
1909
1910typedef struct _DMA_ADAPTER {
1911 USHORT Version;
1912 USHORT Size;
1913 PDMA_OPERATIONS DmaOperations;
1914} DMA_ADAPTER;
1915
1916typedef enum _FILE_INFORMATION_CLASS {
1917 FileDirectoryInformation = 1,
1918 FileFullDirectoryInformation,
1919 FileBothDirectoryInformation,
1920 FileBasicInformation,
1921 FileStandardInformation,
1922 FileInternalInformation,
1923 FileEaInformation,
1924 FileAccessInformation,
1925 FileNameInformation,
1926 FileRenameInformation,
1927 FileLinkInformation,
1928 FileNamesInformation,
1929 FileDispositionInformation,
1930 FilePositionInformation,
1931 FileFullEaInformation,
1932 FileModeInformation,
1933 FileAlignmentInformation,
1934 FileAllInformation,
1935 FileAllocationInformation,
1936 FileEndOfFileInformation,
1937 FileAlternateNameInformation,
1938 FileStreamInformation,
1939 FilePipeInformation,
1940 FilePipeLocalInformation,
1941 FilePipeRemoteInformation,
1942 FileMailslotQueryInformation,
1943 FileMailslotSetInformation,
1944 FileCompressionInformation,
1945 FileObjectIdInformation,
1946 FileCompletionInformation,
1947 FileMoveClusterInformation,
1948 FileQuotaInformation,
1949 FileReparsePointInformation,
1950 FileNetworkOpenInformation,
1951 FileAttributeTagInformation,
1952 FileTrackingInformation,
1953 FileIdBothDirectoryInformation,
1954 FileIdFullDirectoryInformation,
1955 FileValidDataLengthInformation,
1956 FileShortNameInformation,
1957 FileMaximumInformation
1958} FILE_INFORMATION_CLASS, *PFILE_INFORMATION_CLASS;
1959
1960typedef struct _FILE_POSITION_INFORMATION {
1961 LARGE_INTEGER CurrentByteOffset;
1962} FILE_POSITION_INFORMATION, *PFILE_POSITION_INFORMATION;
1963
1964typedef struct _FILE_ALIGNMENT_INFORMATION {
1965 ULONG AlignmentRequirement;
1966} FILE_ALIGNMENT_INFORMATION;
1967
1968typedef struct _FILE_NAME_INFORMATION {
1969 ULONG FileNameLength;
1970 WCHAR FileName[1];
1971} FILE_NAME_INFORMATION, *PFILE_NAME_INFORMATION;
1972
1973typedef struct _FILE_BASIC_INFORMATION {
1974 LARGE_INTEGER CreationTime;
1975 LARGE_INTEGER LastAccessTime;
1976 LARGE_INTEGER LastWriteTime;
1977 LARGE_INTEGER ChangeTime;
1978 ULONG FileAttributes;
1979} FILE_BASIC_INFORMATION, *PFILE_BASIC_INFORMATION;
1980
1981typedef struct _FILE_STANDARD_INFORMATION {
1982 LARGE_INTEGER AllocationSize;
1983 LARGE_INTEGER EndOfFile;
1984 ULONG NumberOfLinks;
1985 BOOLEAN DeletePending;
1986 BOOLEAN Directory;
1987} FILE_STANDARD_INFORMATION, *PFILE_STANDARD_INFORMATION;
1988
1989typedef struct _FILE_NETWORK_OPEN_INFORMATION {
1990 LARGE_INTEGER CreationTime;
1991 LARGE_INTEGER LastAccessTime;
1992 LARGE_INTEGER LastWriteTime;
1993 LARGE_INTEGER ChangeTime;
1994 LARGE_INTEGER AllocationSize;
1995 LARGE_INTEGER EndOfFile;
1996 ULONG FileAttributes;
1997} FILE_NETWORK_OPEN_INFORMATION, *PFILE_NETWORK_OPEN_INFORMATION;
1998
1999typedef struct _FILE_ATTRIBUTE_TAG_INFORMATION {
2000 ULONG FileAttributes;
2001 ULONG ReparseTag;
2002} FILE_ATTRIBUTE_TAG_INFORMATION, *PFILE_ATTRIBUTE_TAG_INFORMATION;
2003
2004typedef struct _FILE_DISPOSITION_INFORMATION {
2005 BOOLEAN DoDeleteFile;
2006} FILE_DISPOSITION_INFORMATION, *PFILE_DISPOSITION_INFORMATION;
2007
2008typedef struct _FILE_END_OF_FILE_INFORMATION {
2009 LARGE_INTEGER EndOfFile;
2010} FILE_END_OF_FILE_INFORMATION, *PFILE_END_OF_FILE_INFORMATION;
2011
2012typedef struct _FILE_VALID_DATA_LENGTH_INFORMATION {
2013 LARGE_INTEGER ValidDataLength;
2014} FILE_VALID_DATA_LENGTH_INFORMATION, *PFILE_VALID_DATA_LENGTH_INFORMATION;
2015
2016typedef enum _FSINFOCLASS {
2017 FileFsVolumeInformation = 1,
2018 FileFsLabelInformation,
2019 FileFsSizeInformation,
2020 FileFsDeviceInformation,
2021 FileFsAttributeInformation,
2022 FileFsControlInformation,
2023 FileFsFullSizeInformation,
2024 FileFsObjectIdInformation,
2025 FileFsDriverPathInformation,
2026 FileFsMaximumInformation
2027} FS_INFORMATION_CLASS, *PFS_INFORMATION_CLASS;
2028
2029typedef struct _FILE_FS_DEVICE_INFORMATION {
2030 DEVICE_TYPE DeviceType;
2031 ULONG Characteristics;
2032} FILE_FS_DEVICE_INFORMATION, *PFILE_FS_DEVICE_INFORMATION;
2033
2034typedef struct _FILE_FULL_EA_INFORMATION {
2035 ULONG NextEntryOffset;
2036 UCHAR Flags;
2037 UCHAR EaNameLength;
2038 USHORT EaValueLength;
2039 CHAR EaName[1];
2040} FILE_FULL_EA_INFORMATION, *PFILE_FULL_EA_INFORMATION;
2041
2042typedef ULONG_PTR ERESOURCE_THREAD;
2043typedef ERESOURCE_THREAD *PERESOURCE_THREAD;
2044
2045typedef struct _OWNER_ENTRY {
2046 ERESOURCE_THREAD OwnerThread;
2047 _ANONYMOUS_UNION union {
2048 LONG OwnerCount;
2049 ULONG TableSize;
2050 } DUMMYUNIONNAME;
2051} OWNER_ENTRY, *POWNER_ENTRY;
2052
2053/* ERESOURCE.Flag */
2054
2055#define ResourceNeverExclusive 0x0010
2056#define ResourceReleaseByOtherThread 0x0020
2057#define ResourceOwnedExclusive 0x0080
2058
2059#define RESOURCE_HASH_TABLE_SIZE 64
2060
2061typedef struct _ERESOURCE {
2062 LIST_ENTRY SystemResourcesList;
2063 POWNER_ENTRY OwnerTable;
2064 SHORT ActiveCount;
2065 USHORT Flag;
2066 PKSEMAPHORE SharedWaiters;
2067 PKEVENT ExclusiveWaiters;
2068 OWNER_ENTRY OwnerThreads[2];
2069 ULONG ContentionCount;
2070 USHORT NumberOfSharedWaiters;
2071 USHORT NumberOfExclusiveWaiters;
2072 _ANONYMOUS_UNION union {
2073 PVOID Address;
2074 ULONG_PTR CreatorBackTraceIndex;
2075 } DUMMYUNIONNAME;
2076 KSPIN_LOCK SpinLock;
2077} ERESOURCE, *PERESOURCE;
2078
2079/* NOTE: PVOID for methods to avoid 'assignment from incompatible pointer type' warning */
2080typedef struct _DRIVER_EXTENSION {
2081 struct _DRIVER_OBJECT *DriverObject;
2082 PVOID AddDevice;
2083 ULONG Count;
2084 UNICODE_STRING ServiceKeyName;
2085} DRIVER_EXTENSION, *PDRIVER_EXTENSION;
2086
2087typedef BOOLEAN DDKAPI
2088(*PFAST_IO_CHECK_IF_POSSIBLE)(
2089 IN struct _FILE_OBJECT *FileObject,
2090 IN PLARGE_INTEGER FileOffset,
2091 IN ULONG Length,
2092 IN BOOLEAN Wait,
2093 IN ULONG LockKey,
2094 IN BOOLEAN CheckForReadOperation,
2095 OUT PIO_STATUS_BLOCK IoStatus,
2096 IN struct _DEVICE_OBJECT *DeviceObject);
2097
2098typedef BOOLEAN DDKAPI
2099(*PFAST_IO_READ)(
2100 IN struct _FILE_OBJECT *FileObject,
2101 IN PLARGE_INTEGER FileOffset,
2102 IN ULONG Length,
2103 IN BOOLEAN Wait,
2104 IN ULONG LockKey,
2105 OUT PVOID Buffer,
2106 OUT PIO_STATUS_BLOCK IoStatus,
2107 IN struct _DEVICE_OBJECT *DeviceObject);
2108
2109typedef BOOLEAN DDKAPI
2110(*PFAST_IO_WRITE)(
2111 IN struct _FILE_OBJECT *FileObject,
2112 IN PLARGE_INTEGER FileOffset,
2113 IN ULONG Length,
2114 IN BOOLEAN Wait,
2115 IN ULONG LockKey,
2116 IN PVOID Buffer,
2117 OUT PIO_STATUS_BLOCK IoStatus,
2118 IN struct _DEVICE_OBJECT *DeviceObject);
2119
2120typedef BOOLEAN DDKAPI
2121(*PFAST_IO_QUERY_BASIC_INFO)(
2122 IN struct _FILE_OBJECT *FileObject,
2123 IN BOOLEAN Wait,
2124 OUT PFILE_BASIC_INFORMATION Buffer,
2125 OUT PIO_STATUS_BLOCK IoStatus,
2126 IN struct _DEVICE_OBJECT *DeviceObject);
2127
2128typedef BOOLEAN DDKAPI
2129(*PFAST_IO_QUERY_STANDARD_INFO)(
2130 IN struct _FILE_OBJECT *FileObject,
2131 IN BOOLEAN Wait,
2132 OUT PFILE_STANDARD_INFORMATION Buffer,
2133 OUT PIO_STATUS_BLOCK IoStatus,
2134 IN struct _DEVICE_OBJECT *DeviceObject);
2135
2136typedef BOOLEAN DDKAPI
2137(*PFAST_IO_LOCK)(
2138 IN struct _FILE_OBJECT *FileObject,
2139 IN PLARGE_INTEGER FileOffset,
2140 IN PLARGE_INTEGER Length,
2141 PEPROCESS ProcessId,
2142 ULONG Key,
2143 BOOLEAN FailImmediately,
2144 BOOLEAN ExclusiveLock,
2145 OUT PIO_STATUS_BLOCK IoStatus,
2146 IN struct _DEVICE_OBJECT *DeviceObject);
2147
2148typedef BOOLEAN DDKAPI
2149(*PFAST_IO_UNLOCK_SINGLE)(
2150 IN struct _FILE_OBJECT *FileObject,
2151 IN PLARGE_INTEGER FileOffset,
2152 IN PLARGE_INTEGER Length,
2153 PEPROCESS ProcessId,
2154 ULONG Key,
2155 OUT PIO_STATUS_BLOCK IoStatus,
2156 IN struct _DEVICE_OBJECT *DeviceObject);
2157
2158typedef BOOLEAN DDKAPI
2159(*PFAST_IO_UNLOCK_ALL)(
2160 IN struct _FILE_OBJECT *FileObject,
2161 PEPROCESS ProcessId,
2162 OUT PIO_STATUS_BLOCK IoStatus,
2163 IN struct _DEVICE_OBJECT *DeviceObject);
2164
2165typedef BOOLEAN DDKAPI
2166(*PFAST_IO_UNLOCK_ALL_BY_KEY)(
2167 IN struct _FILE_OBJECT *FileObject,
2168 PVOID ProcessId,
2169 ULONG Key,
2170 OUT PIO_STATUS_BLOCK IoStatus,
2171 IN struct _DEVICE_OBJECT *DeviceObject);
2172
2173typedef BOOLEAN DDKAPI
2174(*PFAST_IO_DEVICE_CONTROL)(
2175 IN struct _FILE_OBJECT *FileObject,
2176 IN BOOLEAN Wait,
2177 IN PVOID InputBuffer OPTIONAL,
2178 IN ULONG InputBufferLength,
2179 OUT PVOID OutputBuffer OPTIONAL,
2180 IN ULONG OutputBufferLength,
2181 IN ULONG IoControlCode,
2182 OUT PIO_STATUS_BLOCK IoStatus,
2183 IN struct _DEVICE_OBJECT *DeviceObject);
2184
2185typedef VOID DDKAPI
2186(*PFAST_IO_ACQUIRE_FILE)(
2187 IN struct _FILE_OBJECT *FileObject);
2188
2189typedef VOID DDKAPI
2190(*PFAST_IO_RELEASE_FILE)(
2191 IN struct _FILE_OBJECT *FileObject);
2192
2193typedef VOID DDKAPI
2194(*PFAST_IO_DETACH_DEVICE)(
2195 IN struct _DEVICE_OBJECT *SourceDevice,
2196 IN struct _DEVICE_OBJECT *TargetDevice);
2197
2198typedef BOOLEAN DDKAPI
2199(*PFAST_IO_QUERY_NETWORK_OPEN_INFO)(
2200 IN struct _FILE_OBJECT *FileObject,
2201 IN BOOLEAN Wait,
2202 OUT struct _FILE_NETWORK_OPEN_INFORMATION *Buffer,
2203 OUT struct _IO_STATUS_BLOCK *IoStatus,
2204 IN struct _DEVICE_OBJECT *DeviceObject);
2205
2206typedef NTSTATUS DDKAPI
2207(*PFAST_IO_ACQUIRE_FOR_MOD_WRITE)(
2208 IN struct _FILE_OBJECT *FileObject,
2209 IN PLARGE_INTEGER EndingOffset,
2210 OUT struct _ERESOURCE **ResourceToRelease,
2211 IN struct _DEVICE_OBJECT *DeviceObject);
2212
2213typedef BOOLEAN DDKAPI
2214(*PFAST_IO_MDL_READ)(
2215 IN struct _FILE_OBJECT *FileObject,
2216 IN PLARGE_INTEGER FileOffset,
2217 IN ULONG Length,
2218 IN ULONG LockKey,
2219 OUT PMDL *MdlChain,
2220 OUT PIO_STATUS_BLOCK IoStatus,
2221 IN struct _DEVICE_OBJECT *DeviceObject);
2222
2223typedef BOOLEAN DDKAPI
2224(*PFAST_IO_MDL_READ_COMPLETE)(
2225 IN struct _FILE_OBJECT *FileObject,
2226 IN PMDL MdlChain,
2227 IN struct _DEVICE_OBJECT *DeviceObject);
2228
2229typedef BOOLEAN DDKAPI
2230(*PFAST_IO_PREPARE_MDL_WRITE)(
2231 IN struct _FILE_OBJECT *FileObject,
2232 IN PLARGE_INTEGER FileOffset,
2233 IN ULONG Length,
2234 IN ULONG LockKey,
2235 OUT PMDL *MdlChain,
2236 OUT PIO_STATUS_BLOCK IoStatus,
2237 IN struct _DEVICE_OBJECT *DeviceObject);
2238
2239typedef BOOLEAN DDKAPI
2240(*PFAST_IO_MDL_WRITE_COMPLETE)(
2241 IN struct _FILE_OBJECT *FileObject,
2242 IN PLARGE_INTEGER FileOffset,
2243 IN PMDL MdlChain,
2244 IN struct _DEVICE_OBJECT *DeviceObject);
2245
2246typedef BOOLEAN DDKAPI
2247(*PFAST_IO_READ_COMPRESSED)(
2248 IN struct _FILE_OBJECT *FileObject,
2249 IN PLARGE_INTEGER FileOffset,
2250 IN ULONG Length,
2251 IN ULONG LockKey,
2252 OUT PVOID Buffer,
2253 OUT PMDL *MdlChain,
2254 OUT PIO_STATUS_BLOCK IoStatus,
2255 OUT struct _COMPRESSED_DATA_INFO *CompressedDataInfo,
2256 IN ULONG CompressedDataInfoLength,
2257 IN struct _DEVICE_OBJECT *DeviceObject);
2258
2259typedef BOOLEAN DDKAPI
2260(*PFAST_IO_WRITE_COMPRESSED)(
2261 IN struct _FILE_OBJECT *FileObject,
2262 IN PLARGE_INTEGER FileOffset,
2263 IN ULONG Length,
2264 IN ULONG LockKey,
2265 IN PVOID Buffer,
2266 OUT PMDL *MdlChain,
2267 OUT PIO_STATUS_BLOCK IoStatus,
2268 IN struct _COMPRESSED_DATA_INFO *CompressedDataInfo,
2269 IN ULONG CompressedDataInfoLength,
2270 IN struct _DEVICE_OBJECT *DeviceObject);
2271
2272typedef BOOLEAN DDKAPI
2273(*PFAST_IO_MDL_READ_COMPLETE_COMPRESSED)(
2274 IN struct _FILE_OBJECT *FileObject,
2275 IN PMDL MdlChain,
2276 IN struct _DEVICE_OBJECT *DeviceObject);
2277
2278typedef BOOLEAN DDKAPI
2279(*PFAST_IO_MDL_WRITE_COMPLETE_COMPRESSED)(
2280 IN struct _FILE_OBJECT *FileObject,
2281 IN PLARGE_INTEGER FileOffset,
2282 IN PMDL MdlChain,
2283 IN struct _DEVICE_OBJECT *DeviceObject);
2284
2285typedef BOOLEAN DDKAPI
2286(*PFAST_IO_QUERY_OPEN)(
2287 IN struct _IRP *Irp,
2288 OUT PFILE_NETWORK_OPEN_INFORMATION NetworkInformation,
2289 IN struct _DEVICE_OBJECT *DeviceObject);
2290
2291typedef NTSTATUS DDKAPI
2292(*PFAST_IO_RELEASE_FOR_MOD_WRITE)(
2293 IN struct _FILE_OBJECT *FileObject,
2294 IN struct _ERESOURCE *ResourceToRelease,
2295 IN struct _DEVICE_OBJECT *DeviceObject);
2296
2297typedef NTSTATUS DDKAPI
2298(*PFAST_IO_ACQUIRE_FOR_CCFLUSH)(
2299 IN struct _FILE_OBJECT *FileObject,
2300 IN struct _DEVICE_OBJECT *DeviceObject);
2301
2302typedef NTSTATUS DDKAPI
2303(*PFAST_IO_RELEASE_FOR_CCFLUSH) (
2304 IN struct _FILE_OBJECT *FileObject,
2305 IN struct _DEVICE_OBJECT *DeviceObject);
2306
2307typedef struct _FAST_IO_DISPATCH {
2308 ULONG SizeOfFastIoDispatch;
2309 PFAST_IO_CHECK_IF_POSSIBLE FastIoCheckIfPossible;
2310 PFAST_IO_READ FastIoRead;
2311 PFAST_IO_WRITE FastIoWrite;
2312 PFAST_IO_QUERY_BASIC_INFO FastIoQueryBasicInfo;
2313 PFAST_IO_QUERY_STANDARD_INFO FastIoQueryStandardInfo;
2314 PFAST_IO_LOCK FastIoLock;
2315 PFAST_IO_UNLOCK_SINGLE FastIoUnlockSingle;
2316 PFAST_IO_UNLOCK_ALL FastIoUnlockAll;
2317 PFAST_IO_UNLOCK_ALL_BY_KEY FastIoUnlockAllByKey;
2318 PFAST_IO_DEVICE_CONTROL FastIoDeviceControl;
2319 PFAST_IO_ACQUIRE_FILE AcquireFileForNtCreateSection;
2320 PFAST_IO_RELEASE_FILE ReleaseFileForNtCreateSection;
2321 PFAST_IO_DETACH_DEVICE FastIoDetachDevice;
2322 PFAST_IO_QUERY_NETWORK_OPEN_INFO FastIoQueryNetworkOpenInfo;
2323 PFAST_IO_ACQUIRE_FOR_MOD_WRITE AcquireForModWrite;
2324 PFAST_IO_MDL_READ MdlRead;
2325 PFAST_IO_MDL_READ_COMPLETE MdlReadComplete;
2326 PFAST_IO_PREPARE_MDL_WRITE PrepareMdlWrite;
2327 PFAST_IO_MDL_WRITE_COMPLETE MdlWriteComplete;
2328 PFAST_IO_READ_COMPRESSED FastIoReadCompressed;
2329 PFAST_IO_WRITE_COMPRESSED FastIoWriteCompressed;
2330 PFAST_IO_MDL_READ_COMPLETE_COMPRESSED MdlReadCompleteCompressed;
2331 PFAST_IO_MDL_WRITE_COMPLETE_COMPRESSED MdlWriteCompleteCompressed;
2332 PFAST_IO_QUERY_OPEN FastIoQueryOpen;
2333 PFAST_IO_RELEASE_FOR_MOD_WRITE ReleaseForModWrite;
2334 PFAST_IO_ACQUIRE_FOR_CCFLUSH AcquireForCcFlush;
2335 PFAST_IO_RELEASE_FOR_CCFLUSH ReleaseForCcFlush;
2336} FAST_IO_DISPATCH, *PFAST_IO_DISPATCH;
2337
2338typedef struct _DRIVER_OBJECT {
2339 CSHORT Type;
2340 CSHORT Size;
2341 PDEVICE_OBJECT DeviceObject;
2342 ULONG Flags;
2343 PVOID DriverStart;
2344 ULONG DriverSize;
2345 PVOID DriverSection;
2346 PDRIVER_EXTENSION DriverExtension;
2347 UNICODE_STRING DriverName;
2348 PUNICODE_STRING HardwareDatabase;
2349 PFAST_IO_DISPATCH FastIoDispatch;
2350 PDRIVER_INITIALIZE DriverInit;
2351 PDRIVER_STARTIO DriverStartIo;
2352 PDRIVER_UNLOAD DriverUnload;
2353 PDRIVER_DISPATCH MajorFunction[IRP_MJ_MAXIMUM_FUNCTION + 1];
2354} DRIVER_OBJECT;
2355typedef struct _DRIVER_OBJECT *PDRIVER_OBJECT;
2356
2357typedef struct _SECTION_OBJECT_POINTERS {
2358 PVOID DataSectionObject;
2359 PVOID SharedCacheMap;
2360 PVOID ImageSectionObject;
2361} SECTION_OBJECT_POINTERS, *PSECTION_OBJECT_POINTERS;
2362
2363typedef struct _IO_COMPLETION_CONTEXT {
2364 PVOID Port;
2365 PVOID Key;
2366} IO_COMPLETION_CONTEXT, *PIO_COMPLETION_CONTEXT;
2367
2368/* FILE_OBJECT.Flags */
2369
2370#define FO_FILE_OPEN 0x00000001
2371#define FO_SYNCHRONOUS_IO 0x00000002
2372#define FO_ALERTABLE_IO 0x00000004
2373#define FO_NO_INTERMEDIATE_BUFFERING 0x00000008
2374#define FO_WRITE_THROUGH 0x00000010
2375#define FO_SEQUENTIAL_ONLY 0x00000020
2376#define FO_CACHE_SUPPORTED 0x00000040
2377#define FO_NAMED_PIPE 0x00000080
2378#define FO_STREAM_FILE 0x00000100
2379#define FO_MAILSLOT 0x00000200
2380#define FO_GENERATE_AUDIT_ON_CLOSE 0x00000400
2381#define FO_DIRECT_DEVICE_OPEN 0x00000800
2382#define FO_FILE_MODIFIED 0x00001000
2383#define FO_FILE_SIZE_CHANGED 0x00002000
2384#define FO_CLEANUP_COMPLETE 0x00004000
2385#define FO_TEMPORARY_FILE 0x00008000
2386#define FO_DELETE_ON_CLOSE 0x00010000
2387#define FO_OPENED_CASE_SENSITIVE 0x00020000
2388#define FO_HANDLE_CREATED 0x00040000
2389#define FO_FILE_FAST_IO_READ 0x00080000
2390#define FO_RANDOM_ACCESS 0x00100000
2391#define FO_FILE_OPEN_CANCELLED 0x00200000
2392#define FO_VOLUME_OPEN 0x00400000
2393#define FO_FILE_OBJECT_HAS_EXTENSION 0x00800000
2394#define FO_REMOTE_ORIGIN 0x01000000
2395
2396typedef struct _FILE_OBJECT {
2397 CSHORT Type;
2398 CSHORT Size;
2399 PDEVICE_OBJECT DeviceObject;
2400 PVPB Vpb;
2401 PVOID FsContext;
2402 PVOID FsContext2;
2403 PSECTION_OBJECT_POINTERS SectionObjectPointer;
2404 PVOID PrivateCacheMap;
2405 NTSTATUS FinalStatus;
2406 struct _FILE_OBJECT *RelatedFileObject;
2407 BOOLEAN LockOperation;
2408 BOOLEAN DeletePending;
2409 BOOLEAN ReadAccess;
2410 BOOLEAN WriteAccess;
2411 BOOLEAN DeleteAccess;
2412 BOOLEAN SharedRead;
2413 BOOLEAN SharedWrite;
2414 BOOLEAN SharedDelete;
2415 ULONG Flags;
2416 UNICODE_STRING FileName;
2417 LARGE_INTEGER CurrentByteOffset;
2418 ULONG Waiters;
2419 ULONG Busy;
2420 PVOID LastLock;
2421 KEVENT Lock;
2422 KEVENT Event;
2423 PIO_COMPLETION_CONTEXT CompletionContext;
2424} FILE_OBJECT;
2425typedef struct _FILE_OBJECT *PFILE_OBJECT;
2426
2427typedef enum _SECURITY_OPERATION_CODE {
2428 SetSecurityDescriptor,
2429 QuerySecurityDescriptor,
2430 DeleteSecurityDescriptor,
2431 AssignSecurityDescriptor
2432} SECURITY_OPERATION_CODE, *PSECURITY_OPERATION_CODE;
2433
2434#define INITIAL_PRIVILEGE_COUNT 3
2435
2436typedef struct _INITIAL_PRIVILEGE_SET {
2437 ULONG PrivilegeCount;
2438 ULONG Control;
2439 LUID_AND_ATTRIBUTES Privilege[INITIAL_PRIVILEGE_COUNT];
2440} INITIAL_PRIVILEGE_SET, * PINITIAL_PRIVILEGE_SET;
2441
2442typedef struct _SECURITY_SUBJECT_CONTEXT {
2443 PACCESS_TOKEN ClientToken;
2444 SECURITY_IMPERSONATION_LEVEL ImpersonationLevel;
2445 PACCESS_TOKEN PrimaryToken;
2446 PVOID ProcessAuditId;
2447} SECURITY_SUBJECT_CONTEXT, *PSECURITY_SUBJECT_CONTEXT;
2448
2449#include <pshpack4.h>
2450typedef struct _ACCESS_STATE {
2451 LUID OperationID;
2452 BOOLEAN SecurityEvaluated;
2453 BOOLEAN GenerateAudit;
2454 BOOLEAN GenerateOnClose;
2455 BOOLEAN PrivilegesAllocated;
2456 ULONG Flags;
2457 ACCESS_MASK RemainingDesiredAccess;
2458 ACCESS_MASK PreviouslyGrantedAccess;
2459 ACCESS_MASK OriginalDesiredAccess;
2460 SECURITY_SUBJECT_CONTEXT SubjectSecurityContext;
2461 PSECURITY_DESCRIPTOR SecurityDescriptor;
2462 PVOID AuxData;
2463 union {
2464 INITIAL_PRIVILEGE_SET InitialPrivilegeSet;
2465 PRIVILEGE_SET PrivilegeSet;
2466 } Privileges;
2467
2468 BOOLEAN AuditPrivileges;
2469 UNICODE_STRING ObjectName;
2470 UNICODE_STRING ObjectTypeName;
2471} ACCESS_STATE, *PACCESS_STATE;
2472#include <poppack.h>
2473
2474typedef struct _IO_SECURITY_CONTEXT {
2475 PSECURITY_QUALITY_OF_SERVICE SecurityQos;
2476 PACCESS_STATE AccessState;
2477 ACCESS_MASK DesiredAccess;
2478 ULONG FullCreateOptions;
2479} IO_SECURITY_CONTEXT, *PIO_SECURITY_CONTEXT;
2480
2481struct _IO_CSQ;
2482
2483typedef struct _IO_CSQ_IRP_CONTEXT {
2484 ULONG Type;
2485 struct _IRP *Irp;
2486 struct _IO_CSQ *Csq;
2487} IO_CSQ_IRP_CONTEXT, *PIO_CSQ_IRP_CONTEXT;
2488
2489typedef VOID DDKAPI
2490(*PIO_CSQ_INSERT_IRP)(
2491 IN struct _IO_CSQ *Csq,
2492 IN PIRP Irp);
2493
2494typedef VOID DDKAPI
2495(*PIO_CSQ_REMOVE_IRP)(
2496 IN struct _IO_CSQ *Csq,
2497 IN PIRP Irp);
2498
2499typedef PIRP DDKAPI
2500(*PIO_CSQ_PEEK_NEXT_IRP)(
2501 IN struct _IO_CSQ *Csq,
2502 IN PIRP Irp,
2503 IN PVOID PeekContext);
2504
2505typedef VOID DDKAPI
2506(*PIO_CSQ_ACQUIRE_LOCK)(
2507 IN struct _IO_CSQ *Csq,
2508 OUT PKIRQL Irql);
2509
2510typedef VOID DDKAPI
2511(*PIO_CSQ_RELEASE_LOCK)(
2512 IN struct _IO_CSQ *Csq,
2513 IN KIRQL Irql);
2514
2515typedef VOID DDKAPI
2516(*PIO_CSQ_COMPLETE_CANCELED_IRP)(
2517 IN struct _IO_CSQ *Csq,
2518 IN PIRP Irp);
2519
2520typedef struct _IO_CSQ {
2521 ULONG Type;
2522 PIO_CSQ_INSERT_IRP CsqInsertIrp;
2523 PIO_CSQ_REMOVE_IRP CsqRemoveIrp;
2524 PIO_CSQ_PEEK_NEXT_IRP CsqPeekNextIrp;
2525 PIO_CSQ_ACQUIRE_LOCK CsqAcquireLock;
2526 PIO_CSQ_RELEASE_LOCK CsqReleaseLock;
2527 PIO_CSQ_COMPLETE_CANCELED_IRP CsqCompleteCanceledIrp;
2528 PVOID ReservePointer;
2529} IO_CSQ, *PIO_CSQ;
2530
2531#include <pshpack4.h>
2532typedef struct _IO_STACK_LOCATION {
2533 UCHAR MajorFunction;
2534 UCHAR MinorFunction;
2535 UCHAR Flags;
2536 UCHAR Control;
2537 union {
2538 struct {
2539 PIO_SECURITY_CONTEXT SecurityContext;
2540 ULONG Options;
2541 USHORT POINTER_ALIGNMENT FileAttributes;
2542 USHORT ShareAccess;
2543 ULONG POINTER_ALIGNMENT EaLength;
2544 } Create;
2545 struct {
2546 ULONG Length;
2547 ULONG POINTER_ALIGNMENT Key;
2548 LARGE_INTEGER ByteOffset;
2549 } Read;
2550 struct {
2551 ULONG Length;
2552 ULONG POINTER_ALIGNMENT Key;
2553 LARGE_INTEGER ByteOffset;
2554 } Write;
2555 struct {
2556 ULONG Length;
2557 FILE_INFORMATION_CLASS POINTER_ALIGNMENT FileInformationClass;
2558 } QueryFile;
2559 struct {
2560 ULONG Length;
2561 FILE_INFORMATION_CLASS POINTER_ALIGNMENT FileInformationClass;
2562 PFILE_OBJECT FileObject;
2563 _ANONYMOUS_UNION union {
2564 _ANONYMOUS_STRUCT struct {
2565 BOOLEAN ReplaceIfExists;
2566 BOOLEAN AdvanceOnly;
2567 } DUMMYSTRUCTNAME;
2568 ULONG ClusterCount;
2569 HANDLE DeleteHandle;
2570 } DUMMYUNIONNAME;
2571 } SetFile;
2572 struct {
2573 ULONG Length;
2574 FS_INFORMATION_CLASS POINTER_ALIGNMENT FsInformationClass;
2575 } QueryVolume;
2576 struct {
2577 ULONG OutputBufferLength;
2578 ULONG POINTER_ALIGNMENT InputBufferLength;
2579 ULONG POINTER_ALIGNMENT IoControlCode;
2580 PVOID Type3InputBuffer;
2581 } DeviceIoControl;
2582 struct {
2583 SECURITY_INFORMATION SecurityInformation;
2584 ULONG POINTER_ALIGNMENT Length;
2585 } QuerySecurity;
2586 struct {
2587 SECURITY_INFORMATION SecurityInformation;
2588 PSECURITY_DESCRIPTOR SecurityDescriptor;
2589 } SetSecurity;
2590 struct {
2591 PVPB Vpb;
2592 PDEVICE_OBJECT DeviceObject;
2593 } MountVolume;
2594 struct {
2595 PVPB Vpb;
2596 PDEVICE_OBJECT DeviceObject;
2597 } VerifyVolume;
2598 struct {
2599 struct _SCSI_REQUEST_BLOCK *Srb;
2600 } Scsi;
2601 struct {
2602 DEVICE_RELATION_TYPE Type;
2603 } QueryDeviceRelations;
2604 struct {
2605 CONST GUID *InterfaceType;
2606 USHORT Size;
2607 USHORT Version;
2608 PINTERFACE Interface;
2609 PVOID InterfaceSpecificData;
2610 } QueryInterface;
2611 struct {
2612 PDEVICE_CAPABILITIES Capabilities;
2613 } DeviceCapabilities;
2614 struct {
2615 PIO_RESOURCE_REQUIREMENTS_LIST IoResourceRequirementList;
2616 } FilterResourceRequirements;
2617 struct {
2618 ULONG WhichSpace;
2619 PVOID Buffer;
2620 ULONG Offset;
2621 ULONG POINTER_ALIGNMENT Length;
2622 } ReadWriteConfig;
2623 struct {
2624 BOOLEAN Lock;
2625 } SetLock;
2626 struct {
2627 BUS_QUERY_ID_TYPE IdType;
2628 } QueryId;
2629 struct {
2630 DEVICE_TEXT_TYPE DeviceTextType;
2631 LCID POINTER_ALIGNMENT LocaleId;
2632 } QueryDeviceText;
2633 struct {
2634 BOOLEAN InPath;
2635 BOOLEAN Reserved[3];
2636 DEVICE_USAGE_NOTIFICATION_TYPE POINTER_ALIGNMENT Type;
2637 } UsageNotification;
2638 struct {
2639 SYSTEM_POWER_STATE PowerState;
2640 } WaitWake;
2641 struct {
2642 PPOWER_SEQUENCE PowerSequence;
2643 } PowerSequence;
2644 struct {
2645 ULONG SystemContext;
2646 POWER_STATE_TYPE POINTER_ALIGNMENT Type;
2647 POWER_STATE POINTER_ALIGNMENT State;
2648 POWER_ACTION POINTER_ALIGNMENT ShutdownType;
2649 } Power;
2650 struct {
2651 PCM_RESOURCE_LIST AllocatedResources;
2652 PCM_RESOURCE_LIST AllocatedResourcesTranslated;
2653 } StartDevice;
2654 struct {
2655 ULONG_PTR ProviderId;
2656 PVOID DataPath;
2657 ULONG BufferSize;
2658 PVOID Buffer;
2659 } WMI;
2660 struct {
2661 PVOID Argument1;
2662 PVOID Argument2;
2663 PVOID Argument3;
2664 PVOID Argument4;
2665 } Others;
2666 } Parameters;
2667 PDEVICE_OBJECT DeviceObject;
2668 PFILE_OBJECT FileObject;
2669 PIO_COMPLETION_ROUTINE CompletionRoutine;
2670 PVOID Context;
2671} IO_STACK_LOCATION, *PIO_STACK_LOCATION;
2672#include <poppack.h>
2673
2674/* IO_STACK_LOCATION.Control */
2675
2676#define SL_PENDING_RETURNED 0x01
2677#define SL_INVOKE_ON_CANCEL 0x20
2678#define SL_INVOKE_ON_SUCCESS 0x40
2679#define SL_INVOKE_ON_ERROR 0x80
2680
2681typedef enum _KEY_INFORMATION_CLASS {
2682 KeyBasicInformation,
2683 KeyNodeInformation,
2684 KeyFullInformation,
2685 KeyNameInformation,
2686 KeyCachedInformation,
2687 KeyFlagsInformation
2688} KEY_INFORMATION_CLASS;
2689
2690typedef struct _KEY_BASIC_INFORMATION {
2691 LARGE_INTEGER LastWriteTime;
2692 ULONG TitleIndex;
2693 ULONG NameLength;
2694 WCHAR Name[1];
2695} KEY_BASIC_INFORMATION, *PKEY_BASIC_INFORMATION;
2696
2697typedef struct _KEY_FULL_INFORMATION {
2698 LARGE_INTEGER LastWriteTime;
2699 ULONG TitleIndex;
2700 ULONG ClassOffset;
2701 ULONG ClassLength;
2702 ULONG SubKeys;
2703 ULONG MaxNameLen;
2704 ULONG MaxClassLen;
2705 ULONG Values;
2706 ULONG MaxValueNameLen;
2707 ULONG MaxValueDataLen;
2708 WCHAR Class[1];
2709} KEY_FULL_INFORMATION, *PKEY_FULL_INFORMATION;
2710
2711typedef struct _KEY_NODE_INFORMATION {
2712 LARGE_INTEGER LastWriteTime;
2713 ULONG TitleIndex;
2714 ULONG ClassOffset;
2715 ULONG ClassLength;
2716 ULONG NameLength;
2717 WCHAR Name[1];
2718} KEY_NODE_INFORMATION, *PKEY_NODE_INFORMATION;
2719
2720typedef struct _KEY_VALUE_BASIC_INFORMATION {
2721 ULONG TitleIndex;
2722 ULONG Type;
2723 ULONG NameLength;
2724 WCHAR Name[1];
2725} KEY_VALUE_BASIC_INFORMATION, *PKEY_VALUE_BASIC_INFORMATION;
2726
2727typedef struct _KEY_VALUE_FULL_INFORMATION {
2728 ULONG TitleIndex;
2729 ULONG Type;
2730 ULONG DataOffset;
2731 ULONG DataLength;
2732 ULONG NameLength;
2733 WCHAR Name[1];
2734} KEY_VALUE_FULL_INFORMATION, *PKEY_VALUE_FULL_INFORMATION;
2735
2736typedef struct _KEY_VALUE_PARTIAL_INFORMATION {
2737 ULONG TitleIndex;
2738 ULONG Type;
2739 ULONG DataLength;
2740 UCHAR Data[1];
2741} KEY_VALUE_PARTIAL_INFORMATION, *PKEY_VALUE_PARTIAL_INFORMATION;
2742
2743typedef struct _KEY_VALUE_PARTIAL_INFORMATION_ALIGN64 {
2744 ULONG Type;
2745 ULONG DataLength;
2746 UCHAR Data[1];
2747} KEY_VALUE_PARTIAL_INFORMATION_ALIGN64, *PKEY_VALUE_PARTIAL_INFORMATION_ALIGN64;
2748
2749typedef struct _KEY_VALUE_ENTRY {
2750 PUNICODE_STRING ValueName;
2751 ULONG DataLength;
2752 ULONG DataOffset;
2753 ULONG Type;
2754} KEY_VALUE_ENTRY, *PKEY_VALUE_ENTRY;
2755
2756typedef enum _KEY_VALUE_INFORMATION_CLASS {
2757 KeyValueBasicInformation,
2758 KeyValueFullInformation,
2759 KeyValuePartialInformation,
2760 KeyValueFullInformationAlign64,
2761 KeyValuePartialInformationAlign64
2762} KEY_VALUE_INFORMATION_CLASS;
2763
2764/* KEY_VALUE_Xxx.Type */
2765
2766#define REG_NONE 0
2767#define REG_SZ 1
2768#define REG_EXPAND_SZ 2
2769#define REG_BINARY 3
2770#define REG_DWORD 4
2771#define REG_DWORD_LITTLE_ENDIAN 4
2772#define REG_DWORD_BIG_ENDIAN 5
2773#define REG_LINK 6
2774#define REG_MULTI_SZ 7
2775#define REG_RESOURCE_LIST 8
2776#define REG_FULL_RESOURCE_DESCRIPTOR 9
2777#define REG_RESOURCE_REQUIREMENTS_LIST 10
2778#define REG_QWORD 11
2779#define REG_QWORD_LITTLE_ENDIAN 11
2780
2781#define PCI_TYPE0_ADDRESSES 6
2782#define PCI_TYPE1_ADDRESSES 2
2783#define PCI_TYPE2_ADDRESSES 5
2784
2785typedef struct _PCI_COMMON_CONFIG {
2786 USHORT VendorID;
2787 USHORT DeviceID;
2788 USHORT Command;
2789 USHORT Status;
2790 UCHAR RevisionID;
2791 UCHAR ProgIf;
2792 UCHAR SubClass;
2793 UCHAR BaseClass;
2794 UCHAR CacheLineSize;
2795 UCHAR LatencyTimer;
2796 UCHAR HeaderType;
2797 UCHAR BIST;
2798 union {
2799 struct _PCI_HEADER_TYPE_0 {
2800 ULONG BaseAddresses[PCI_TYPE0_ADDRESSES];
2801 ULONG CIS;
2802 USHORT SubVendorID;
2803 USHORT SubSystemID;
2804 ULONG ROMBaseAddress;
2805 UCHAR CapabilitiesPtr;
2806 UCHAR Reserved1[3];
2807 ULONG Reserved2;
2808 UCHAR InterruptLine;
2809 UCHAR InterruptPin;
2810 UCHAR MinimumGrant;
2811 UCHAR MaximumLatency;
2812 } type0;
2813 struct _PCI_HEADER_TYPE_1 {
2814 ULONG BaseAddresses[PCI_TYPE1_ADDRESSES];
2815 UCHAR PrimaryBus;
2816 UCHAR SecondaryBus;
2817 UCHAR SubordinateBus;
2818 UCHAR SecondaryLatency;
2819 UCHAR IOBase;
2820 UCHAR IOLimit;
2821 USHORT SecondaryStatus;
2822 USHORT MemoryBase;
2823 USHORT MemoryLimit;
2824 USHORT PrefetchBase;
2825 USHORT PrefetchLimit;
2826 ULONG PrefetchBaseUpper32;
2827 ULONG PrefetchLimitUpper32;
2828 USHORT IOBaseUpper16;
2829 USHORT IOLimitUpper16;
2830 UCHAR CapabilitiesPtr;
2831 UCHAR Reserved1[3];
2832 ULONG ROMBaseAddress;
2833 UCHAR InterruptLine;
2834 UCHAR InterruptPin;
2835 USHORT BridgeControl;
2836 } type1;
2837 struct _PCI_HEADER_TYPE_2 {
2838 ULONG SocketRegistersBaseAddress;
2839 UCHAR CapabilitiesPtr;
2840 UCHAR Reserved;
2841 USHORT SecondaryStatus;
2842 UCHAR PrimaryBus;
2843 UCHAR SecondaryBus;
2844 UCHAR SubordinateBus;
2845 UCHAR SecondaryLatency;
2846 struct {
2847 ULONG Base;
2848 ULONG Limit;
2849 } Range[PCI_TYPE2_ADDRESSES - 1];
2850 UCHAR InterruptLine;
2851 UCHAR InterruptPin;
2852 USHORT BridgeControl;
2853 } type2;
2854 } u;
2855 UCHAR DeviceSpecific[192];
2856} PCI_COMMON_CONFIG, *PPCI_COMMON_CONFIG;
2857
2858/* PCI_COMMON_CONFIG.Command */
2859
2860#define PCI_ENABLE_IO_SPACE 0x0001
2861#define PCI_ENABLE_MEMORY_SPACE 0x0002
2862#define PCI_ENABLE_BUS_MASTER 0x0004
2863#define PCI_ENABLE_SPECIAL_CYCLES 0x0008
2864#define PCI_ENABLE_WRITE_AND_INVALIDATE 0x0010
2865#define PCI_ENABLE_VGA_COMPATIBLE_PALETTE 0x0020
2866#define PCI_ENABLE_PARITY 0x0040
2867#define PCI_ENABLE_WAIT_CYCLE 0x0080
2868#define PCI_ENABLE_SERR 0x0100
2869#define PCI_ENABLE_FAST_BACK_TO_BACK 0x0200
2870
2871/* PCI_COMMON_CONFIG.Status */
2872
2873#define PCI_STATUS_CAPABILITIES_LIST 0x0010
2874#define PCI_STATUS_66MHZ_CAPABLE 0x0020
2875#define PCI_STATUS_UDF_SUPPORTED 0x0040
2876#define PCI_STATUS_FAST_BACK_TO_BACK 0x0080
2877#define PCI_STATUS_DATA_PARITY_DETECTED 0x0100
2878#define PCI_STATUS_DEVSEL 0x0600
2879#define PCI_STATUS_SIGNALED_TARGET_ABORT 0x0800
2880#define PCI_STATUS_RECEIVED_TARGET_ABORT 0x1000
2881#define PCI_STATUS_RECEIVED_MASTER_ABORT 0x2000
2882#define PCI_STATUS_SIGNALED_SYSTEM_ERROR 0x4000
2883#define PCI_STATUS_DETECTED_PARITY_ERROR 0x8000
2884
2885/* PCI_COMMON_CONFIG.HeaderType */
2886
2887#define PCI_MULTIFUNCTION 0x80
2888#define PCI_DEVICE_TYPE 0x00
2889#define PCI_BRIDGE_TYPE 0x01
2890#define PCI_CARDBUS_BRIDGE_TYPE 0x02
2891
2892#define PCI_CONFIGURATION_TYPE(PciData) \
2893 (((PPCI_COMMON_CONFIG) (PciData))->HeaderType & ~PCI_MULTIFUNCTION)
2894
2895#define PCI_MULTIFUNCTION_DEVICE(PciData) \
2896 ((((PPCI_COMMON_CONFIG) (PciData))->HeaderType & PCI_MULTIFUNCTION) != 0)
2897
2898typedef struct _PCI_SLOT_NUMBER {
2899 union {
2900 struct {
2901 ULONG DeviceNumber : 5;
2902 ULONG FunctionNumber : 3;
2903 ULONG Reserved : 24;
2904 } bits;
2905 ULONG AsULONG;
2906 } u;
2907} PCI_SLOT_NUMBER, *PPCI_SLOT_NUMBER;
2908
2909typedef enum _POOL_TYPE {
2910 NonPagedPool,
2911 PagedPool,
2912 NonPagedPoolMustSucceed,
2913 DontUseThisType,
2914 NonPagedPoolCacheAligned,
2915 PagedPoolCacheAligned,
2916 NonPagedPoolCacheAlignedMustS,
2917 MaxPoolType,
2918 NonPagedPoolSession = 32,
2919 PagedPoolSession,
2920 NonPagedPoolMustSucceedSession,
2921 DontUseThisTypeSession,
2922 NonPagedPoolCacheAlignedSession,
2923 PagedPoolCacheAlignedSession,
2924 NonPagedPoolCacheAlignedMustSSession
2925} POOL_TYPE;
2926
2927typedef enum _EX_POOL_PRIORITY {
2928 LowPoolPriority,
2929 LowPoolPrioritySpecialPoolOverrun = 8,
2930 LowPoolPrioritySpecialPoolUnderrun = 9,
2931 NormalPoolPriority = 16,
2932 NormalPoolPrioritySpecialPoolOverrun = 24,
2933 NormalPoolPrioritySpecialPoolUnderrun = 25,
2934 HighPoolPriority = 32,
2935 HighPoolPrioritySpecialPoolOverrun = 40,
2936 HighPoolPrioritySpecialPoolUnderrun = 41
2937} EX_POOL_PRIORITY;
2938
2939/* PRIVILEGE_SET.Control */
2940
2941#define PRIVILEGE_SET_ALL_NECESSARY 1
2942
2943typedef struct _RTL_OSVERSIONINFOW {
2944 ULONG dwOSVersionInfoSize;
2945 ULONG dwMajorVersion;
2946 ULONG dwMinorVersion;
2947 ULONG dwBuildNumber;
2948 ULONG dwPlatformId;
2949 WCHAR szCSDVersion[128];
2950} RTL_OSVERSIONINFOW, *PRTL_OSVERSIONINFOW;
2951
2952typedef struct _RTL_OSVERSIONINFOEXW {
2953 ULONG dwOSVersionInfoSize;
2954 ULONG dwMajorVersion;
2955 ULONG dwMinorVersion;
2956 ULONG dwBuildNumber;
2957 ULONG dwPlatformId;
2958 WCHAR szCSDVersion[128];
2959 USHORT wServicePackMajor;
2960 USHORT wServicePackMinor;
2961 USHORT wSuiteMask;
2962 UCHAR wProductType;
2963 UCHAR wReserved;
2964} RTL_OSVERSIONINFOEXW, *PRTL_OSVERSIONINFOEXW;
2965
2966NTOSAPI
2967ULONGLONG
2968DDKAPI
2969VerSetConditionMask(
2970 IN ULONGLONG ConditionMask,
2971 IN ULONG TypeMask,
2972 IN UCHAR Condition);
2973
2974#define VER_SET_CONDITION(ConditionMask, TypeBitMask, ComparisonType) \
2975 ((ConditionMask) = VerSetConditionMask((ConditionMask), \
2976 (TypeBitMask), (ComparisonType)))
2977
2978/* RtlVerifyVersionInfo() TypeMask */
2979
2980#define VER_MINORVERSION 0x0000001
2981#define VER_MAJORVERSION 0x0000002
2982#define VER_BUILDNUMBER 0x0000004
2983#define VER_PLATFORMID 0x0000008
2984#define VER_SERVICEPACKMINOR 0x0000010
2985#define VER_SERVICEPACKMAJOR 0x0000020
2986#define VER_SUITENAME 0x0000040
2987#define VER_PRODUCT_TYPE 0x0000080
2988
2989/* RtlVerifyVersionInfo() ComparisonType */
2990
2991#define VER_EQUAL 1
2992#define VER_GREATER 2
2993#define VER_GREATER_EQUAL 3
2994#define VER_LESS 4
2995#define VER_LESS_EQUAL 5
2996#define VER_AND 6
2997#define VER_OR 7
2998
2999#define VER_CONDITION_MASK 7
3000#define VER_NUM_BITS_PER_CONDITION_MASK 3
3001
3002typedef struct _RTL_BITMAP {
3003 ULONG SizeOfBitMap;
3004 PULONG Buffer;
3005} RTL_BITMAP, *PRTL_BITMAP;
3006
3007typedef struct _RTL_BITMAP_RUN {
3008 ULONG StartingIndex;
3009 ULONG NumberOfBits;
3010} RTL_BITMAP_RUN, *PRTL_BITMAP_RUN;
3011
3012typedef NTSTATUS DDKAPI
3013(*PRTL_QUERY_REGISTRY_ROUTINE)(
3014 IN PWSTR ValueName,
3015 IN ULONG ValueType,
3016 IN PVOID ValueData,
3017 IN ULONG ValueLength,
3018 IN PVOID Context,
3019 IN PVOID EntryContext);
3020
3021#define RTL_REGISTRY_ABSOLUTE 0
3022#define RTL_REGISTRY_SERVICES 1
3023#define RTL_REGISTRY_CONTROL 2
3024#define RTL_REGISTRY_WINDOWS_NT 3
3025#define RTL_REGISTRY_DEVICEMAP 4
3026#define RTL_REGISTRY_USER 5
3027
3028/* RTL_QUERY_REGISTRY_TABLE.Flags */
3029#define RTL_QUERY_REGISTRY_SUBKEY 0x00000001
3030#define RTL_QUERY_REGISTRY_TOPKEY 0x00000002
3031#define RTL_QUERY_REGISTRY_REQUIRED 0x00000004
3032#define RTL_QUERY_REGISTRY_NOVALUE 0x00000008
3033#define RTL_QUERY_REGISTRY_NOEXPAND 0x00000010
3034#define RTL_QUERY_REGISTRY_DIRECT 0x00000020
3035#define RTL_QUERY_REGISTRY_DELETE 0x00000040
3036
3037typedef struct _RTL_QUERY_REGISTRY_TABLE {
3038 PRTL_QUERY_REGISTRY_ROUTINE QueryRoutine;
3039 ULONG Flags;
3040 PWSTR Name;
3041 PVOID EntryContext;
3042 ULONG DefaultType;
3043 PVOID DefaultData;
3044 ULONG DefaultLength;
3045} RTL_QUERY_REGISTRY_TABLE, *PRTL_QUERY_REGISTRY_TABLE;
3046
3047typedef struct _TIME_FIELDS {
3048 CSHORT Year;
3049 CSHORT Month;
3050 CSHORT Day;
3051 CSHORT Hour;
3052 CSHORT Minute;
3053 CSHORT Second;
3054 CSHORT Milliseconds;
3055 CSHORT Weekday;
3056} TIME_FIELDS, *PTIME_FIELDS;
3057
3058typedef PVOID DDKAPI
3059(*PALLOCATE_FUNCTION)(
3060 IN POOL_TYPE PoolType,
3061 IN SIZE_T NumberOfBytes,
3062 IN ULONG Tag);
3063
3064typedef VOID DDKAPI
3065(*PFREE_FUNCTION)(
3066 IN PVOID Buffer);
3067
3068#define GENERAL_LOOKASIDE_S \
3069 SLIST_HEADER ListHead; \
3070 USHORT Depth; \
3071 USHORT MaximumDepth; \
3072 ULONG TotalAllocates; \
3073 _ANONYMOUS_UNION union { \
3074 ULONG AllocateMisses; \
3075 ULONG AllocateHits; \
3076 } DUMMYUNIONNAME; \
3077 ULONG TotalFrees; \
3078 _ANONYMOUS_UNION union { \
3079 ULONG FreeMisses; \
3080 ULONG FreeHits; \
3081 } DUMMYUNIONNAME2; \
3082 POOL_TYPE Type; \
3083 ULONG Tag; \
3084 ULONG Size; \
3085 PALLOCATE_FUNCTION Allocate; \
3086 PFREE_FUNCTION Free; \
3087 LIST_ENTRY ListEntry; \
3088 ULONG LastTotalAllocates; \
3089 _ANONYMOUS_UNION union { \
3090 ULONG LastAllocateMisses; \
3091 ULONG LastAllocateHits; \
3092 } DUMMYUNIONNAME3; \
3093 ULONG Future[2];
3094
3095typedef struct _GENERAL_LOOKASIDE {
3096 GENERAL_LOOKASIDE_S
3097} GENERAL_LOOKASIDE, *PGENERAL_LOOKASIDE;
3098
3099typedef struct _NPAGED_LOOKASIDE_LIST {
3100 GENERAL_LOOKASIDE_S
3101 KSPIN_LOCK Obsoleted;
3102} NPAGED_LOOKASIDE_LIST, *PNPAGED_LOOKASIDE_LIST;
3103
3104typedef struct _PAGED_LOOKASIDE_LIST {
3105 GENERAL_LOOKASIDE_S
3106 FAST_MUTEX Obsoleted;
3107} PAGED_LOOKASIDE_LIST, *PPAGED_LOOKASIDE_LIST;
3108
3109typedef struct _CALLBACK_OBJECT *PCALLBACK_OBJECT;
3110
3111typedef VOID DDKAPI (*PCALLBACK_FUNCTION)(
3112 IN PVOID CallbackContext,
3113 IN PVOID Argument1,
3114 IN PVOID Argument2);
3115
3116typedef enum _EVENT_TYPE {
3117 NotificationEvent,
3118 SynchronizationEvent
3119} EVENT_TYPE;
3120
3121typedef enum _KWAIT_REASON {
3122 Executive,
3123 FreePage,
3124 PageIn,
3125 PoolAllocation,
3126 DelayExecution,
3127 Suspended,
3128 UserRequest,
3129 WrExecutive,
3130 WrFreePage,
3131 WrPageIn,
3132 WrPoolAllocation,
3133 WrDelayExecution,
3134 WrSuspended,
3135 WrUserRequest,
3136 WrEventPair,
3137 WrQueue,
3138 WrLpcReceive,
3139 WrLpcReply,
3140 WrVirtualMemory,
3141 WrPageOut,
3142 WrRendezvous,
3143 Spare2,
3144 Spare3,
3145 Spare4,
3146 Spare5,
3147 Spare6,
3148 WrKernel,
3149 MaximumWaitReason
3150} KWAIT_REASON;
3151
3152typedef struct _KWAIT_BLOCK {
3153 LIST_ENTRY WaitListEntry;
3154 struct _KTHREAD * RESTRICTED_POINTER Thread;
3155 PVOID Object;
3156 struct _KWAIT_BLOCK * RESTRICTED_POINTER NextWaitBlock;
3157 USHORT WaitKey;
3158 USHORT WaitType;
3159} KWAIT_BLOCK, *PKWAIT_BLOCK, *RESTRICTED_POINTER PRKWAIT_BLOCK;
3160
3161typedef struct _IO_REMOVE_LOCK_TRACKING_BLOCK * PIO_REMOVE_LOCK_TRACKING_BLOCK;
3162
3163typedef struct _IO_REMOVE_LOCK_COMMON_BLOCK {
3164 BOOLEAN Removed;
3165 BOOLEAN Reserved[3];
3166 LONG IoCount;
3167 KEVENT RemoveEvent;
3168} IO_REMOVE_LOCK_COMMON_BLOCK;
3169
3170typedef struct _IO_REMOVE_LOCK_DBG_BLOCK {
3171 LONG Signature;
3172 LONG HighWatermark;
3173 LONGLONG MaxLockedTicks;
3174 LONG AllocateTag;
3175 LIST_ENTRY LockList;
3176 KSPIN_LOCK Spin;
3177 LONG LowMemoryCount;
3178 ULONG Reserved1[4];
3179 PVOID Reserved2;
3180 PIO_REMOVE_LOCK_TRACKING_BLOCK Blocks;
3181} IO_REMOVE_LOCK_DBG_BLOCK;
3182
3183typedef struct _IO_REMOVE_LOCK {
3184 IO_REMOVE_LOCK_COMMON_BLOCK Common;
3185#ifdef DBG
3186 IO_REMOVE_LOCK_DBG_BLOCK Dbg;
3187#endif
3188} IO_REMOVE_LOCK, *PIO_REMOVE_LOCK;
3189
3190typedef struct _IO_WORKITEM *PIO_WORKITEM;
3191
3192typedef VOID DDKAPI
3193(*PIO_WORKITEM_ROUTINE)(
3194 IN PDEVICE_OBJECT DeviceObject,
3195 IN PVOID Context);
3196
3197typedef struct _SHARE_ACCESS {
3198 ULONG OpenCount;
3199 ULONG Readers;
3200 ULONG Writers;
3201 ULONG Deleters;
3202 ULONG SharedRead;
3203 ULONG SharedWrite;
3204 ULONG SharedDelete;
3205} SHARE_ACCESS, *PSHARE_ACCESS;
3206
3207typedef enum _KINTERRUPT_MODE {
3208 LevelSensitive,
3209 Latched
3210} KINTERRUPT_MODE;
3211
3212typedef VOID DDKAPI
3213(*PKINTERRUPT_ROUTINE)(
3214 VOID);
3215
3216typedef enum _KPROFILE_SOURCE {
3217 ProfileTime,
3218 ProfileAlignmentFixup,
3219 ProfileTotalIssues,
3220 ProfilePipelineDry,
3221 ProfileLoadInstructions,
3222 ProfilePipelineFrozen,
3223 ProfileBranchInstructions,
3224 ProfileTotalNonissues,
3225 ProfileDcacheMisses,
3226 ProfileIcacheMisses,
3227 ProfileCacheMisses,
3228 ProfileBranchMispredictions,
3229 ProfileStoreInstructions,
3230 ProfileFpInstructions,
3231 ProfileIntegerInstructions,
3232 Profile2Issue,
3233 Profile3Issue,
3234 Profile4Issue,
3235 ProfileSpecialInstructions,
3236 ProfileTotalCycles,
3237 ProfileIcacheIssues,
3238 ProfileDcacheAccesses,
3239 ProfileMemoryBarrierCycles,
3240 ProfileLoadLinkedIssues,
3241 ProfileMaximum
3242} KPROFILE_SOURCE;
3243
3244typedef enum _CREATE_FILE_TYPE {
3245 CreateFileTypeNone,
3246 CreateFileTypeNamedPipe,
3247 CreateFileTypeMailslot
3248} CREATE_FILE_TYPE;
3249
3250typedef struct _CONFIGURATION_INFORMATION {
3251 ULONG DiskCount;
3252 ULONG FloppyCount;
3253 ULONG CdRomCount;
3254 ULONG TapeCount;
3255 ULONG ScsiPortCount;
3256 ULONG SerialCount;
3257 ULONG ParallelCount;
3258 BOOLEAN AtDiskPrimaryAddressClaimed;
3259 BOOLEAN AtDiskSecondaryAddressClaimed;
3260 ULONG Version;
3261 ULONG MediumChangerCount;
3262} CONFIGURATION_INFORMATION, *PCONFIGURATION_INFORMATION;
3263
3264typedef enum _CONFIGURATION_TYPE {
3265 ArcSystem,
3266 CentralProcessor,
3267 FloatingPointProcessor,
3268 PrimaryIcache,
3269 PrimaryDcache,
3270 SecondaryIcache,
3271 SecondaryDcache,
3272 SecondaryCache,
3273 EisaAdapter,
3274 TcAdapter,
3275 ScsiAdapter,
3276 DtiAdapter,
3277 MultiFunctionAdapter,
3278 DiskController,
3279 TapeController,
3280 CdromController,
3281 WormController,
3282 SerialController,
3283 NetworkController,
3284 DisplayController,
3285 ParallelController,
3286 PointerController,
3287 KeyboardController,
3288 AudioController,
3289 OtherController,
3290 DiskPeripheral,
3291 FloppyDiskPeripheral,
3292 TapePeripheral,
3293 ModemPeripheral,
3294 MonitorPeripheral,
3295 PrinterPeripheral,
3296 PointerPeripheral,
3297 KeyboardPeripheral,
3298 TerminalPeripheral,
3299 OtherPeripheral,
3300 LinePeripheral,
3301 NetworkPeripheral,
3302 SystemMemory,
3303 DockingInformation,
3304 RealModeIrqRoutingTable,
3305 MaximumType
3306} CONFIGURATION_TYPE, *PCONFIGURATION_TYPE;
3307
3308typedef NTSTATUS (*PIO_QUERY_DEVICE_ROUTINE)(
3309 IN PVOID Context,
3310 IN PUNICODE_STRING PathName,
3311 IN INTERFACE_TYPE BusType,
3312 IN ULONG BusNumber,
3313 IN PKEY_VALUE_FULL_INFORMATION *BusInformation,
3314 IN CONFIGURATION_TYPE ControllerType,
3315 IN ULONG ControllerNumber,
3316 IN PKEY_VALUE_FULL_INFORMATION *ControllerInformation,
3317 IN CONFIGURATION_TYPE PeripheralType,
3318 IN ULONG PeripheralNumber,
3319 IN PKEY_VALUE_FULL_INFORMATION *PeripheralInformation);
3320
3321typedef enum _WORK_QUEUE_TYPE {
3322 CriticalWorkQueue,
3323 DelayedWorkQueue,
3324 HyperCriticalWorkQueue,
3325 MaximumWorkQueue
3326} WORK_QUEUE_TYPE;
3327
3328typedef VOID DDKAPI
3329(*PWORKER_THREAD_ROUTINE)(
3330 IN PVOID Parameter);
3331
3332typedef struct _WORK_QUEUE_ITEM {
3333 LIST_ENTRY List;
3334 PWORKER_THREAD_ROUTINE WorkerRoutine;
3335 PVOID Parameter;
3336} WORK_QUEUE_ITEM, *PWORK_QUEUE_ITEM;
3337
3338typedef enum _KBUGCHECK_BUFFER_DUMP_STATE {
3339 BufferEmpty,
3340 BufferInserted,
3341 BufferStarted,
3342 BufferFinished,
3343 BufferIncomplete
3344} KBUGCHECK_BUFFER_DUMP_STATE;
3345
3346typedef VOID DDKAPI
3347(*PKBUGCHECK_CALLBACK_ROUTINE)(
3348 IN PVOID Buffer,
3349 IN ULONG Length);
3350
3351typedef struct _KBUGCHECK_CALLBACK_RECORD {
3352 LIST_ENTRY Entry;
3353 PKBUGCHECK_CALLBACK_ROUTINE CallbackRoutine;
3354 PVOID Buffer;
3355 ULONG Length;
3356 PUCHAR Component;
3357 ULONG_PTR Checksum;
3358 UCHAR State;
3359} KBUGCHECK_CALLBACK_RECORD, *PKBUGCHECK_CALLBACK_RECORD;
3360
3361/*
3362 * VOID
3363 * KeInitializeCallbackRecord(
3364 * IN PKBUGCHECK_CALLBACK_RECORD CallbackRecord)
3365 */
3366#define KeInitializeCallbackRecord(CallbackRecord) \
3367 CallbackRecord->State = BufferEmpty;
3368
3369typedef enum _KDPC_IMPORTANCE {
3370 LowImportance,
3371 MediumImportance,
3372 HighImportance
3373} KDPC_IMPORTANCE;
3374
3375typedef enum _MEMORY_CACHING_TYPE_ORIG {
3376 MmFrameBufferCached = 2
3377} MEMORY_CACHING_TYPE_ORIG;
3378
3379typedef enum _MEMORY_CACHING_TYPE {
3380 MmNonCached = FALSE,
3381 MmCached = TRUE,
3382 MmWriteCombined = MmFrameBufferCached,
3383 MmHardwareCoherentCached,
3384 MmNonCachedUnordered,
3385 MmUSWCCached,
3386 MmMaximumCacheType
3387} MEMORY_CACHING_TYPE;
3388
3389typedef enum _MM_PAGE_PRIORITY {
3390 LowPagePriority,
3391 NormalPagePriority = 16,
3392 HighPagePriority = 32
3393} MM_PAGE_PRIORITY;
3394
3395typedef enum _LOCK_OPERATION {
3396 IoReadAccess,
3397 IoWriteAccess,
3398 IoModifyAccess
3399} LOCK_OPERATION;
3400
3401typedef enum _MM_SYSTEM_SIZE {
3402 MmSmallSystem,
3403 MmMediumSystem,
3404 MmLargeSystem
3405} MM_SYSTEM_SIZE;
3406
3407typedef struct _OBJECT_HANDLE_INFORMATION {
3408 ULONG HandleAttributes;
3409 ACCESS_MASK GrantedAccess;
3410} OBJECT_HANDLE_INFORMATION, *POBJECT_HANDLE_INFORMATION;
3411
3412typedef struct _CLIENT_ID {
3413 HANDLE UniqueProcess;
3414 HANDLE UniqueThread;
3415} CLIENT_ID, *PCLIENT_ID;
3416
3417typedef VOID DDKAPI
3418(*PKSTART_ROUTINE)(
3419 IN PVOID StartContext);
3420
3421typedef VOID DDKAPI
3422(*PCREATE_PROCESS_NOTIFY_ROUTINE)(
3423 IN HANDLE ParentId,
3424 IN HANDLE ProcessId,
3425 IN BOOLEAN Create);
3426
3427typedef VOID DDKAPI
3428(*PCREATE_THREAD_NOTIFY_ROUTINE)(
3429 IN HANDLE ProcessId,
3430 IN HANDLE ThreadId,
3431 IN BOOLEAN Create);
3432
3433typedef struct _IMAGE_INFO {
3434 _ANONYMOUS_UNION union {
3435 ULONG Properties;
3436 _ANONYMOUS_STRUCT struct {
3437 ULONG ImageAddressingMode : 8;
3438 ULONG SystemModeImage : 1;
3439 ULONG ImageMappedToAllPids : 1;
3440 ULONG Reserved : 22;
3441 } DUMMYSTRUCTNAME;
3442 } DUMMYUNIONNAME;
3443 PVOID ImageBase;
3444 ULONG ImageSelector;
3445 SIZE_T ImageSize;
3446 ULONG ImageSectionNumber;
3447} IMAGE_INFO, *PIMAGE_INFO;
3448
3449#define IMAGE_ADDRESSING_MODE_32BIT 3
3450
3451typedef VOID DDKAPI
3452(*PLOAD_IMAGE_NOTIFY_ROUTINE)(
3453 IN PUNICODE_STRING FullImageName,
3454 IN HANDLE ProcessId,
3455 IN PIMAGE_INFO ImageInfo);
3456
3457typedef enum _PROCESSINFOCLASS {
3458 ProcessBasicInformation,
3459 ProcessQuotaLimits,
3460 ProcessIoCounters,
3461 ProcessVmCounters,
3462 ProcessTimes,
3463 ProcessBasePriority,
3464 ProcessRaisePriority,
3465 ProcessDebugPort,
3466 ProcessExceptionPort,
3467 ProcessAccessToken,
3468 ProcessLdtInformation,
3469 ProcessLdtSize,
3470 ProcessDefaultHardErrorMode,
3471 ProcessIoPortHandlers,
3472 ProcessPooledUsageAndLimits,
3473 ProcessWorkingSetWatch,
3474 ProcessUserModeIOPL,
3475 ProcessEnableAlignmentFaultFixup,
3476 ProcessPriorityClass,
3477 ProcessWx86Information,
3478 ProcessHandleCount,
3479 ProcessAffinityMask,
3480 ProcessPriorityBoost,
3481 ProcessDeviceMap,
3482 ProcessSessionInformation,
3483 ProcessForegroundInformation,
3484 ProcessWow64Information,
3485 ProcessImageFileName,
3486 ProcessLUIDDeviceMapsEnabled,
3487 ProcessBreakOnTermination,
3488 ProcessDebugObjectHandle,
3489 ProcessDebugFlags,
3490 ProcessHandleTracing,
3491 MaxProcessInfoClass
3492} PROCESSINFOCLASS;
3493
3494typedef enum _THREADINFOCLASS {
3495 ThreadBasicInformation,
3496 ThreadTimes,
3497 ThreadPriority,
3498 ThreadBasePriority,
3499 ThreadAffinityMask,
3500 ThreadImpersonationToken,
3501 ThreadDescriptorTableEntry,
3502 ThreadEnableAlignmentFaultFixup,
3503 ThreadEventPair_Reusable,
3504 ThreadQuerySetWin32StartAddress,
3505 ThreadZeroTlsCell,
3506 ThreadPerformanceCount,
3507 ThreadAmILastThread,
3508 ThreadIdealProcessor,
3509 ThreadPriorityBoost,
3510 ThreadSetTlsArrayAddress,
3511 ThreadIsIoPending,
3512 ThreadHideFromDebugger,
3513 ThreadBreakOnTermination,
3514 MaxThreadInfoClass
3515} THREADINFOCLASS;
3516
3517#define ES_SYSTEM_REQUIRED 0x00000001
3518#define ES_DISPLAY_REQUIRED 0x00000002
3519#define ES_USER_PRESENT 0x00000004
3520#define ES_CONTINUOUS 0x80000000
3521
3522typedef ULONG EXECUTION_STATE;
3523
3524typedef VOID DDKAPI
3525(*PREQUEST_POWER_COMPLETE)(
3526 IN PDEVICE_OBJECT DeviceObject,
3527 IN UCHAR MinorFunction,
3528 IN POWER_STATE PowerState,
3529 IN PVOID Context,
3530 IN PIO_STATUS_BLOCK IoStatus);
3531
3532typedef enum _TRACE_INFORMATION_CLASS {
3533 TraceIdClass,
3534 TraceHandleClass,
3535 TraceEnableFlagsClass,
3536 TraceEnableLevelClass,
3537 GlobalLoggerHandleClass,
3538 EventLoggerHandleClass,
3539 AllLoggerHandlesClass,
3540 TraceHandleByNameClass
3541} TRACE_INFORMATION_CLASS;
3542
3543typedef NTSTATUS DDKAPI
3544(*PEX_CALLBACK_FUNCTION)(
3545 IN PVOID CallbackContext,
3546 IN PVOID Argument1,
3547 IN PVOID Argument2);
3548
3549
3550
3551/*
3552** Storage structures
3553*/
3554typedef enum _PARTITION_STYLE {
3555 PARTITION_STYLE_MBR,
3556 PARTITION_STYLE_GPT
3557} PARTITION_STYLE;
3558
3559typedef struct _CREATE_DISK_MBR {
3560 ULONG Signature;
3561} CREATE_DISK_MBR, *PCREATE_DISK_MBR;
3562
3563typedef struct _CREATE_DISK_GPT {
3564 GUID DiskId;
3565 ULONG MaxPartitionCount;
3566} CREATE_DISK_GPT, *PCREATE_DISK_GPT;
3567
3568typedef struct _CREATE_DISK {
3569 PARTITION_STYLE PartitionStyle;
3570 _ANONYMOUS_UNION union {
3571 CREATE_DISK_MBR Mbr;
3572 CREATE_DISK_GPT Gpt;
3573 } DUMMYUNIONNAME;
3574} CREATE_DISK, *PCREATE_DISK;
3575
3576typedef struct _DISK_SIGNATURE {
3577 ULONG PartitionStyle;
3578 _ANONYMOUS_UNION union {
3579 struct {
3580 ULONG Signature;
3581 ULONG CheckSum;
3582 } Mbr;
3583 struct {
3584 GUID DiskId;
3585 } Gpt;
3586 } DUMMYUNIONNAME;
3587} DISK_SIGNATURE, *PDISK_SIGNATURE;
3588
3589typedef VOID DDKFASTAPI
3590(*PTIME_UPDATE_NOTIFY_ROUTINE)(
3591 IN HANDLE ThreadId,
3592 IN KPROCESSOR_MODE Mode);
3593
3594#define DBG_STATUS_CONTROL_C 1
3595#define DBG_STATUS_SYSRQ 2
3596#define DBG_STATUS_BUGCHECK_FIRST 3
3597#define DBG_STATUS_BUGCHECK_SECOND 4
3598#define DBG_STATUS_FATAL 5
3599#define DBG_STATUS_DEBUG_CONTROL 6
3600#define DBG_STATUS_WORKER 7
3601
3602typedef struct _PHYSICAL_MEMORY_RANGE {
3603 PHYSICAL_ADDRESS BaseAddress;
3604 LARGE_INTEGER NumberOfBytes;
3605} PHYSICAL_MEMORY_RANGE, *PPHYSICAL_MEMORY_RANGE;
3606
3607typedef ULONG_PTR
3608(*PDRIVER_VERIFIER_THUNK_ROUTINE)(
3609 IN PVOID Context);
3610
3611typedef struct _DRIVER_VERIFIER_THUNK_PAIRS {
3612 PDRIVER_VERIFIER_THUNK_ROUTINE PristineRoutine;
3613 PDRIVER_VERIFIER_THUNK_ROUTINE NewRoutine;
3614} DRIVER_VERIFIER_THUNK_PAIRS, *PDRIVER_VERIFIER_THUNK_PAIRS;
3615
3616#define DRIVER_VERIFIER_SPECIAL_POOLING 0x0001
3617#define DRIVER_VERIFIER_FORCE_IRQL_CHECKING 0x0002
3618#define DRIVER_VERIFIER_INJECT_ALLOCATION_FAILURES 0x0004
3619#define DRIVER_VERIFIER_TRACK_POOL_ALLOCATIONS 0x0008
3620#define DRIVER_VERIFIER_IO_CHECKING 0x0010
3621
3622#define RTL_RANGE_LIST_ADD_IF_CONFLICT 0x00000001
3623#define RTL_RANGE_LIST_ADD_SHARED 0x00000002
3624
3625#define RTL_RANGE_LIST_SHARED_OK 0x00000001
3626#define RTL_RANGE_LIST_NULL_CONFLICT_OK 0x00000002
3627
3628#define RTL_RANGE_LIST_SHARED_OK 0x00000001
3629#define RTL_RANGE_LIST_NULL_CONFLICT_OK 0x00000002
3630
3631#define RTL_RANGE_LIST_MERGE_IF_CONFLICT RTL_RANGE_LIST_ADD_IF_CONFLICT
3632
3633typedef struct _RTL_RANGE {
3634 ULONGLONG Start;
3635 ULONGLONG End;
3636 PVOID UserData;
3637 PVOID Owner;
3638 UCHAR Attributes;
3639 UCHAR Flags;
3640} RTL_RANGE, *PRTL_RANGE;
3641
3642#define RTL_RANGE_SHARED 0x01
3643#define RTL_RANGE_CONFLICT 0x02
3644
3645typedef struct _RTL_RANGE_LIST {
3646 LIST_ENTRY ListHead;
3647 ULONG Flags;
3648 ULONG Count;
3649 ULONG Stamp;
3650} RTL_RANGE_LIST, *PRTL_RANGE_LIST;
3651
3652typedef struct _RANGE_LIST_ITERATOR {
3653 PLIST_ENTRY RangeListHead;
3654 PLIST_ENTRY MergedHead;
3655 PVOID Current;
3656 ULONG Stamp;
3657} RTL_RANGE_LIST_ITERATOR, *PRTL_RANGE_LIST_ITERATOR;
3658
3659typedef BOOLEAN
3660(*PRTL_CONFLICT_RANGE_CALLBACK)(
3661 IN PVOID Context,
3662 IN PRTL_RANGE Range);
3663
3664#define HASH_STRING_ALGORITHM_DEFAULT 0
3665#define HASH_STRING_ALGORITHM_X65599 1
3666#define HASH_STRING_ALGORITHM_INVALID 0xffffffff
3667
3668typedef enum _SUITE_TYPE {
3669 SmallBusiness,
3670 Enterprise,
3671 BackOffice,
3672 CommunicationServer,
3673 TerminalServer,
3674 SmallBusinessRestricted,
3675 EmbeddedNT,
3676 DataCenter,
3677 SingleUserTS,
3678 Personal,
3679 Blade,
3680 MaxSuiteType
3681} SUITE_TYPE;
3682
3683typedef VOID DDKAPI
3684(*PTIMER_APC_ROUTINE)(
3685 IN PVOID TimerContext,
3686 IN ULONG TimerLowValue,
3687 IN LONG TimerHighValue);
3688
3689
3690
3691/*
3692** WMI structures
3693*/
3694
3695typedef VOID DDKAPI
3696(*WMI_NOTIFICATION_CALLBACK)(
3697 PVOID Wnode,
3698 PVOID Context);
3699
3700
3701/*
3702** Architecture specific structures
3703*/
3704
3705#ifdef _X86_
3706
3707typedef ULONG PFN_NUMBER, *PPFN_NUMBER;
3708
3709#define PASSIVE_LEVEL 0
3710#define LOW_LEVEL 0
3711#define APC_LEVEL 1
3712#define DISPATCH_LEVEL 2
3713#define SYNCH_LEVEL 27
3714#define PROFILE_LEVEL 27
3715#define CLOCK1_LEVEL 28
3716#define CLOCK2_LEVEL 28
3717#define IPI_LEVEL 29
3718#define POWER_LEVEL 30
3719#define HIGH_LEVEL 31
3720
3721typedef struct _KPCR_TIB {
3722 PVOID ExceptionList; /* 00 */
3723 PVOID StackBase; /* 04 */
3724 PVOID StackLimit; /* 08 */
3725 PVOID SubSystemTib; /* 0C */
3726 _ANONYMOUS_UNION union {
3727 PVOID FiberData; /* 10 */
3728 DWORD Version; /* 10 */
3729 } DUMMYUNIONNAME;
3730 PVOID ArbitraryUserPointer; /* 14 */
3731 struct _NT_TIB *Self; /* 18 */
3732} KPCR_TIB, *PKPCR_TIB; /* 1C */
3733
3734#define PCR_MINOR_VERSION 1
3735#define PCR_MAJOR_VERSION 1
3736
3737typedef struct _KPCR {
3738 KPCR_TIB Tib; /* 00 */
3739 struct _KPCR *Self; /* 1C */
3740 struct _KPRCB *PCRCB; /* 20 */
3741 KIRQL Irql; /* 24 */
3742 ULONG IRR; /* 28 */
3743 ULONG IrrActive; /* 2C */
3744 ULONG IDR; /* 30 */
3745 PVOID KdVersionBlock; /* 34 */
3746 PUSHORT IDT; /* 38 */
3747 PUSHORT GDT; /* 3C */
3748 struct _KTSS *TSS; /* 40 */
3749 USHORT MajorVersion; /* 44 */
3750 USHORT MinorVersion; /* 46 */
3751 KAFFINITY SetMember; /* 48 */
3752 ULONG StallScaleFactor; /* 4C */
3753 UCHAR SpareUnused; /* 50 */
3754 UCHAR Number; /* 51 */
3755} KPCR, *PKPCR; /* 54 */
3756
3757typedef struct _KFLOATING_SAVE {
3758 ULONG ControlWord;
3759 ULONG StatusWord;
3760 ULONG ErrorOffset;
3761 ULONG ErrorSelector;
3762 ULONG DataOffset;
3763 ULONG DataSelector;
3764 ULONG Cr0NpxState;
3765 ULONG Spare1;
3766} KFLOATING_SAVE, *PKFLOATING_SAVE;
3767
3768#define PAGE_SIZE 0x1000
3769#define PAGE_SHIFT 12L
3770
3771extern NTOSAPI PVOID *MmHighestUserAddress;
3772extern NTOSAPI PVOID *MmSystemRangeStart;
3773extern NTOSAPI ULONG *MmUserProbeAddress;
3774
3775#define MM_HIGHEST_USER_ADDRESS *MmHighestUserAddress
3776#define MM_SYSTEM_RANGE_START *MmSystemRangeStart
3777#define MM_USER_PROBE_ADDRESS *MmUserProbeAddress
3778#define MM_LOWEST_USER_ADDRESS (PVOID)0x10000
3779#define MM_LOWEST_SYSTEM_ADDRESS (PVOID)0xC0C00000
3780
3781#define KI_USER_SHARED_DATA 0xffdf0000
3782#define SharedUserData ((KUSER_SHARED_DATA * CONST) KI_USER_SHARED_DATA)
3783
3784#define EFLAG_SIGN 0x8000
3785#define EFLAG_ZERO 0x4000
3786#define EFLAG_SELECT (EFLAG_SIGN | EFLAG_ZERO)
3787
3788#define RESULT_NEGATIVE ((EFLAG_SIGN & ~EFLAG_ZERO) & EFLAG_SELECT)
3789#define RESULT_ZERO ((~EFLAG_SIGN & EFLAG_ZERO) & EFLAG_SELECT)
3790#define RESULT_POSITIVE ((~EFLAG_SIGN & ~EFLAG_ZERO) & EFLAG_SELECT)
3791
3792typedef enum _INTERLOCKED_RESULT {
3793 ResultNegative = RESULT_NEGATIVE,
3794 ResultZero = RESULT_ZERO,
3795 ResultPositive = RESULT_POSITIVE
3796} INTERLOCKED_RESULT;
3797
3798NTOSAPI
3799KIRQL
3800DDKAPI
3801KeGetCurrentIrql(
3802 VOID);
3803
3804/*
3805 * ULONG
3806 * KeGetCurrentProcessorNumber(
3807 * VOID)
3808 */
3809#define KeGetCurrentProcessorNumber() \
3810 ((ULONG)KeGetCurrentKPCR()->ProcessorNumber)
3811
3812
3813#if __USE_NTOSKRNL__
3814/* CAREFUL: These are exported from ntoskrnl.exe as __fastcall functions,
3815 but are also exported from kernel32.dll and declared in winbase.h as
3816 __stdcall */
3817#if !defined(__INTERLOCKED_DECLARED)
3818#define __INTERLOCKED_DECLARED
3819
3820NTOSAPI
3821LONG
3822DDKFASTAPI
3823InterlockedIncrement(
3824 IN PLONG VOLATILE Addend);
3825
3826NTOSAPI
3827LONG
3828DDKFASTAPI
3829InterlockedDecrement(
3830 IN PLONG VOLATILE Addend);
3831
3832NTOSAPI
3833LONG
3834DDKFASTAPI
3835InterlockedCompareExchange(
3836 IN OUT PLONG VOLATILE Destination,
3837 IN LONG Exchange,
3838 IN LONG Comparand);
3839
3840NTOSAPI
3841LONG
3842DDKFASTAPI
3843InterlockedExchange(
3844 IN OUT PLONG VOLATILE Target,
3845 IN LONG Value);
3846
3847NTOSAPI
3848LONG
3849DDKFASTAPI
3850InterlockedExchangeAdd(
3851 IN OUT PLONG VOLATILE Addend,
3852 IN LONG Value);
3853
3854/*
3855 * PVOID
3856 * InterlockedExchangePointer(
3857 * IN OUT PVOID VOLATILE *Target,
3858 * IN PVOID Value)
3859 */
3860#define InterlockedExchangePointer(Target, Value) \
3861 ((PVOID) InterlockedExchange((PLONG) Target, (LONG) Value))
3862
3863/*
3864 * PVOID
3865 * InterlockedCompareExchangePointer(
3866 * IN OUT PVOID *Destination,
3867 * IN PVOID Exchange,
3868 * IN PVOID Comparand)
3869 */
3870#define InterlockedCompareExchangePointer(Destination, Exchange, Comparand) \
3871 ((PVOID) InterlockedCompareExchange((PLONG) Destination, (LONG) Exchange, (LONG) Comparand))
3872
3873#if (_WIN32_WINNT >= 0x0501)
3874PSLIST_ENTRY
3875DDKFASTAPI
3876InterlockedPopEntrySList(
3877 IN PSLIST_HEADER ListHead);
3878
3879NTOSAPI
3880PSLIST_ENTRY
3881DDKFASTAPI
3882InterlockedPushEntrySList(
3883 IN PSLIST_HEADER ListHead,
3884 IN PSLIST_ENTRY ListEntry);
3885#endif /* _WIN32_WINNT >= 0x0501 */
3886
3887#endif /* !__INTERLOCKED_DECLARED */
3888#endif /* __USE_NTOSKRNL__ */
3889
3890NTOSAPI
3891VOID
3892DDKFASTAPI
3893KefAcquireSpinLockAtDpcLevel(
3894 IN PKSPIN_LOCK SpinLock);
3895
3896NTOSAPI
3897VOID
3898DDKFASTAPI
3899KefReleaseSpinLockFromDpcLevel(
3900 IN PKSPIN_LOCK SpinLock);
3901
3902#define KeAcquireSpinLockAtDpcLevel(SpinLock) KefAcquireSpinLockAtDpcLevel(SpinLock)
3903#define KeReleaseSpinLockFromDpcLevel(SpinLock) KefReleaseSpinLockFromDpcLevel(SpinLock)
3904
3905#define RtlCopyMemoryNonTemporal RtlCopyMemory
3906
3907#define KeGetDcacheFillSize() 1L
3908
3909#endif /* _X86_ */
3910
3911
3912
3913/*
3914** Utillity functions
3915*/
3916
3917#define ARGUMENT_PRESENT(ArgumentPointer) \
3918 ((BOOLEAN) ((PVOID)ArgumentPointer != (PVOID)NULL))
3919
3920/*
3921 * ULONG
3922 * BYTE_OFFSET(
3923 * IN PVOID Va)
3924 */
3925#define BYTE_OFFSET(Va) \
3926 ((ULONG) ((ULONG_PTR) (Va) & (PAGE_SIZE - 1)))
3927
3928/*
3929 * ULONG
3930 * BYTES_TO_PAGES(
3931 * IN ULONG Size)
3932 */
3933#define BYTES_TO_PAGES(Size) \
3934 ((ULONG) ((ULONG_PTR) (Size) >> PAGE_SHIFT) + (((ULONG) (Size) & (PAGE_SIZE - 1)) != 0))
3935
3936/*
3937 * PCHAR
3938 * CONTAINING_RECORD(
3939 * IN PCHAR Address,
3940 * IN TYPE Type,
3941 * IN PCHAR Field);
3942 */
3943#ifndef CONTAINING_RECORD
3944#define CONTAINING_RECORD(Address, Type, Field) \
3945 ((Type *) (((ULONG_PTR) Address) - FIELD_OFFSET(Type, Field)))
3946#endif
3947
3948/* LONG
3949 * FIELD_OFFSET(
3950 * IN TYPE Type,
3951 * IN PCHAR Field);
3952 */
3953#ifndef FIELD_OFFSET
3954#define FIELD_OFFSET(Type, Field) \
3955 ((LONG) (&(((Type *) 0)->Field)))
3956#endif
3957
3958/*
3959 * PVOID
3960 * PAGE_ALIGN(
3961 * IN PVOID Va)
3962 */
3963#define PAGE_ALIGN(Va) \
3964 ((PVOID) ((ULONG_PTR)(Va) & ~(PAGE_SIZE - 1)))
3965
3966/*
3967 * ULONG_PTR
3968 * ROUND_TO_PAGES(
3969 * IN ULONG_PTR Size)
3970 */
3971#define ROUND_TO_PAGES(Size) \
3972 ((ULONG_PTR) (((ULONG_PTR) Size + PAGE_SIZE - 1) & ~(PAGE_SIZE - 1)))
3973
3974NTOSAPI
3975VOID
3976DDKAPI
3977RtlAssert(
3978 IN PVOID FailedAssertion,
3979 IN PVOID FileName,
3980 IN ULONG LineNumber,
3981 IN PCHAR Message);
3982
3983#ifdef DBG
3984
3985#define ASSERT(exp) \
3986 ((!(exp)) ? \
3987 (RtlAssert( #exp, __FILE__, __LINE__, NULL ), FALSE) : TRUE)
3988
3989#define ASSERTMSG(msg, exp) \
3990 ((!(exp)) ? \
3991 (RtlAssert( #exp, __FILE__, __LINE__, msg ), FALSE) : TRUE)
3992
3993#define RTL_SOFT_ASSERT(exp) \
3994 ((!(_exp)) ? \
3995 (DbgPrint("%s(%d): Soft assertion failed\n Expression: %s\n", __FILE__, __LINE__, #exp), FALSE) : TRUE)
3996
3997#define RTL_SOFT_ASSERTMSG(msg, exp) \
3998 ((!(exp)) ? \
3999 (DbgPrint("%s(%d): Soft assertion failed\n Expression: %s\n Message: %s\n", __FILE__, __LINE__, #exp, (msg)), FALSE) : TRUE)
4000
4001#define RTL_VERIFY(exp) ASSERT(exp)
4002#define RTL_VERIFYMSG(msg, exp) ASSERT(msg, exp)
4003
4004#define RTL_SOFT_VERIFY(exp) RTL_SOFT_ASSERT(exp)
4005#define RTL_SOFT_VERIFYMSG(msg, exp) RTL_SOFT_ASSERTMSG(msg, exp)
4006
4007#else /* !DBG */
4008
4009#define ASSERT(exp) ((VOID) 0)
4010#define ASSERTMSG(msg, exp) ((VOID) 0)
4011
4012#define RTL_SOFT_ASSERT(exp) ((VOID) 0)
4013#define RTL_SOFT_ASSERTMSG(msg, exp) ((VOID) 0)
4014
4015#define RTL_VERIFY(exp) ((exp) ? TRUE : FALSE)
4016#define RTL_VERIFYMSG(msg, exp) ((exp) ? TRUE : FALSE)
4017
4018#define RTL_SOFT_VERIFY(exp) ((exp) ? TRUE : FALSE)
4019#define RTL_SOFT_VERIFYMSG(msg, exp) ((exp) ? TRUE : FALSE)
4020
4021#endif /* DBG */
4022
4023
4024/*
4025** Driver support routines
4026*/
4027
4028/** Runtime library routines **/
4029
4030/*
4031 * VOID
4032 * InitializeListHead(
4033 * IN PLIST_ENTRY ListHead)
4034 */
4035#define InitializeListHead(_ListHead) \
4036{ \
4037 (_ListHead)->Flink = (_ListHead); \
4038 (_ListHead)->Blink = (_ListHead); \
4039}
4040
4041/*
4042 * VOID
4043 * InsertHeadList(
4044 * IN PLIST_ENTRY ListHead,
4045 * IN PLIST_ENTRY Entry)
4046 */
4047#define InsertHeadList(_ListHead, \
4048 _Entry) \
4049{ \
4050 PLIST_ENTRY _OldFlink; \
4051 _OldFlink = (_ListHead)->Flink; \
4052 (_Entry)->Flink = _OldFlink; \
4053 (_Entry)->Blink = (_ListHead); \
4054 _OldFlink->Blink = (_Entry); \
4055 (_ListHead)->Flink = (_Entry); \
4056}
4057
4058/*
4059 * VOID
4060 * InsertTailList(
4061 * IN PLIST_ENTRY ListHead,
4062 * IN PLIST_ENTRY Entry)
4063 */
4064#define InsertTailList(_ListHead, \
4065 _Entry) \
4066{ \
4067 PLIST_ENTRY _OldBlink; \
4068 _OldBlink = (_ListHead)->Blink; \
4069 (_Entry)->Flink = (_ListHead); \
4070 (_Entry)->Blink = _OldBlink; \
4071 _OldBlink->Flink = (_Entry); \
4072 (_ListHead)->Blink = (_Entry); \
4073}
4074
4075/*
4076 * BOOLEAN
4077 * IsListEmpty(
4078 * IN PLIST_ENTRY ListHead)
4079 */
4080#define IsListEmpty(_ListHead) \
4081 ((_ListHead)->Flink == (_ListHead))
4082
4083static __inline PSINGLE_LIST_ENTRY
4084PopEntryList(
4085 IN PSINGLE_LIST_ENTRY ListHead)
4086{
4087 PSINGLE_LIST_ENTRY Entry;
4088
4089 Entry = ListHead->Next;
4090 if (Entry != NULL)
4091 {
4092 ListHead->Next = Entry->Next;
4093 }
4094 return Entry;
4095}
4096
4097/*
4098 * VOID
4099 * PushEntryList(
4100 * IN PSINGLE_LIST_ENTRY ListHead,
4101 * IN PSINGLE_LIST_ENTRY Entry)
4102 */
4103#define PushEntryList(_ListHead, \
4104 _Entry) \
4105{ \
4106 (_Entry)->Next = (_ListHead)->Next; \
4107 (_ListHead)->Next = (_Entry); \
4108}
4109
4110/*
4111 * VOID
4112 * RemoveEntryList(
4113 * IN PLIST_ENTRY Entry)
4114 */
4115#define RemoveEntryList(_Entry) \
4116{ \
4117 PLIST_ENTRY _OldFlink; \
4118 PLIST_ENTRY _OldBlink; \
4119 _OldFlink = (_Entry)->Flink; \
4120 _OldBlink = (_Entry)->Blink; \
4121 _OldFlink->Blink = _OldBlink; \
4122 _OldBlink->Flink = _OldFlink; \
4123 (_Entry)->Flink = NULL; \
4124 (_Entry)->Blink = NULL; \
4125}
4126
4127static __inline PLIST_ENTRY
4128RemoveHeadList(
4129 IN PLIST_ENTRY ListHead)
4130{
4131 PLIST_ENTRY OldFlink;
4132 PLIST_ENTRY OldBlink;
4133 PLIST_ENTRY Entry;
4134
4135 Entry = ListHead->Flink;
4136 OldFlink = ListHead->Flink->Flink;
4137 OldBlink = ListHead->Flink->Blink;
4138 OldFlink->Blink = OldBlink;
4139 OldBlink->Flink = OldFlink;
4140
4141 if (Entry != ListHead)
4142 {
4143 Entry->Flink = NULL;
4144 Entry->Blink = NULL;
4145 }
4146
4147 return Entry;
4148}
4149
4150static __inline PLIST_ENTRY
4151RemoveTailList(
4152 IN PLIST_ENTRY ListHead)
4153{
4154 PLIST_ENTRY OldFlink;
4155 PLIST_ENTRY OldBlink;
4156 PLIST_ENTRY Entry;
4157
4158 Entry = ListHead->Blink;
4159 OldFlink = ListHead->Blink->Flink;
4160 OldBlink = ListHead->Blink->Blink;
4161 OldFlink->Blink = OldBlink;
4162 OldBlink->Flink = OldFlink;
4163
4164 if (Entry != ListHead)
4165 {
4166 Entry->Flink = NULL;
4167 Entry->Blink = NULL;
4168 }
4169
4170 return Entry;
4171}
4172
4173/*
4174 * USHORT
4175 * QueryDepthSList(
4176 * IN PSLIST_HEADER SListHead)
4177 */
4178#define QueryDepthSList(_SListHead) \
4179 ((USHORT) ((_SListHead)->Alignment & 0xffff))
4180
4181#define InterlockedFlushSList(ListHead) ExInterlockedFlushSList(ListHead)
4182
4183NTOSAPI
4184ULONG
4185DDKAPI
4186RtlAnsiStringToUnicodeSize(
4187 IN PANSI_STRING AnsiString);
4188
4189NTOSAPI
4190NTSTATUS
4191DDKAPI
4192RtlAddRange(
4193 IN OUT PRTL_RANGE_LIST RangeList,
4194 IN ULONGLONG Start,
4195 IN ULONGLONG End,
4196 IN UCHAR Attributes,
4197 IN ULONG Flags,
4198 IN PVOID UserData OPTIONAL,
4199 IN PVOID Owner OPTIONAL);
4200
4201NTOSAPI
4202NTSTATUS
4203DDKAPI
4204RtlAnsiStringToUnicodeString(
4205 IN OUT PUNICODE_STRING DestinationString,
4206 IN PANSI_STRING SourceString,
4207 IN BOOLEAN AllocateDestinationString);
4208
4209NTOSAPI
4210NTSTATUS
4211DDKAPI
4212RtlAppendUnicodeStringToString(
4213 IN OUT PUNICODE_STRING Destination,
4214 IN PUNICODE_STRING Source);
4215
4216NTOSAPI
4217NTSTATUS
4218DDKAPI
4219RtlAppendUnicodeToString(
4220 IN OUT PUNICODE_STRING Destination,
4221 IN PCWSTR Source);
4222
4223NTOSAPI
4224BOOLEAN
4225DDKAPI
4226RtlAreBitsClear(
4227 IN PRTL_BITMAP BitMapHeader,
4228 IN ULONG StartingIndex,
4229 IN ULONG Length);
4230
4231NTOSAPI
4232BOOLEAN
4233DDKAPI
4234RtlAreBitsSet(
4235 IN PRTL_BITMAP BitMapHeader,
4236 IN ULONG StartingIndex,
4237 IN ULONG Length);
4238
4239NTOSAPI
4240NTSTATUS
4241DDKAPI
4242RtlCharToInteger(
4243 IN PCSZ String,
4244 IN ULONG Base OPTIONAL,
4245 IN OUT PULONG Value);
4246
4247NTOSAPI
4248ULONG
4249DDKAPI
4250RtlCheckBit(
4251 IN PRTL_BITMAP BitMapHeader,
4252 IN ULONG BitPosition);
4253
4254NTOSAPI
4255NTSTATUS
4256DDKAPI
4257RtlCheckRegistryKey(
4258 IN ULONG RelativeTo,
4259 IN PWSTR Path);
4260
4261NTOSAPI
4262VOID
4263DDKAPI
4264RtlClearAllBits(
4265 IN PRTL_BITMAP BitMapHeader);
4266
4267NTOSAPI
4268VOID
4269DDKAPI
4270RtlClearBit(
4271 PRTL_BITMAP BitMapHeader,
4272 ULONG BitNumber);
4273
4274NTOSAPI
4275VOID
4276DDKAPI
4277RtlClearBits(
4278 IN PRTL_BITMAP BitMapHeader,
4279 IN ULONG StartingIndex,
4280 IN ULONG NumberToClear);
4281
4282NTOSAPI
4283SIZE_T
4284DDKAPI
4285RtlCompareMemory(
4286 IN CONST VOID *Source1,
4287 IN CONST VOID *Source2,
4288 IN SIZE_T Length);
4289
4290NTOSAPI
4291LONG
4292DDKAPI
4293RtlCompareString(
4294 IN PSTRING String1,
4295 IN PSTRING String2,
4296 BOOLEAN CaseInSensitive);
4297
4298NTOSAPI
4299LONG
4300DDKAPI
4301RtlCompareUnicodeString(
4302 IN PUNICODE_STRING String1,
4303 IN PUNICODE_STRING String2,
4304 IN BOOLEAN CaseInSensitive);
4305
4306NTOSAPI
4307LARGE_INTEGER
4308DDKAPI
4309RtlConvertLongToLargeInteger(
4310 IN LONG SignedInteger);
4311
4312NTOSAPI
4313LUID
4314DDKAPI
4315RtlConvertLongToLuid(
4316 IN LONG Long);
4317
4318NTOSAPI
4319LARGE_INTEGER
4320DDKAPI
4321RtlConvertUlongToLargeInteger(
4322 IN ULONG UnsignedInteger);
4323
4324NTOSAPI
4325LUID
4326DDKAPI
4327RtlConvertUlongToLuid(
4328 ULONG Ulong);
4329
4330/*
4331 * VOID
4332 * RtlCopyMemory(
4333 * IN VOID UNALIGNED *Destination,
4334 * IN CONST VOID UNALIGNED *Source,
4335 * IN SIZE_T Length)
4336 */
4337#ifndef RtlCopyMemory
4338#define RtlCopyMemory(Destination, Source, Length) \
4339 memcpy(Destination, Source, Length);
4340#endif
4341
4342#ifndef RtlCopyBytes
4343#define RtlCopyBytes RtlCopyMemory
4344#endif
4345
4346NTOSAPI
4347VOID
4348DDKAPI
4349RtlCopyMemory32(
4350 IN VOID UNALIGNED *Destination,
4351 IN CONST VOID UNALIGNED *Source,
4352 IN ULONG Length);
4353
4354NTOSAPI
4355NTSTATUS
4356DDKAPI
4357RtlCopyRangeList(
4358 OUT PRTL_RANGE_LIST CopyRangeList,
4359 IN PRTL_RANGE_LIST RangeList);
4360
4361NTOSAPI
4362VOID
4363DDKAPI
4364RtlCopyString(
4365 IN OUT PSTRING DestinationString,
4366 IN PSTRING SourceString OPTIONAL);
4367
4368NTOSAPI
4369VOID
4370DDKAPI
4371RtlCopyUnicodeString(
4372 IN OUT PUNICODE_STRING DestinationString,
4373 IN PUNICODE_STRING SourceString);
4374
4375NTOSAPI
4376NTSTATUS
4377DDKAPI
4378RtlCreateRegistryKey(
4379 IN ULONG RelativeTo,
4380 IN PWSTR Path);
4381
4382NTOSAPI
4383NTSTATUS
4384DDKAPI
4385RtlCreateSecurityDescriptor(
4386 IN OUT PSECURITY_DESCRIPTOR SecurityDescriptor,
4387 IN ULONG Revision);
4388
4389NTOSAPI
4390NTSTATUS
4391DDKAPI
4392RtlDeleteOwnersRanges(
4393 IN OUT PRTL_RANGE_LIST RangeList,
4394 IN PVOID Owner);
4395
4396NTOSAPI
4397NTSTATUS
4398DDKAPI
4399RtlDeleteRange(
4400 IN OUT PRTL_RANGE_LIST RangeList,
4401 IN ULONGLONG Start,
4402 IN ULONGLONG End,
4403 IN PVOID Owner);
4404
4405NTOSAPI
4406NTSTATUS
4407DDKAPI
4408RtlDeleteRegistryValue(
4409 IN ULONG RelativeTo,
4410 IN PCWSTR Path,
4411 IN PCWSTR ValueName);
4412
4413NTOSAPI
4414BOOL
4415DDKAPI
4416RtlDosPathNameToNtPathName_U(
4417 IN PCWSTR DosPathName,
4418 OUT PUNICODE_STRING NtPathName,
4419 OUT PCWSTR *NtFileNamePart,
4420 OUT VOID *DirectoryInfo);
4421
4422/*
4423 * BOOLEAN
4424 * RtlEqualLuid(
4425 * IN LUID Luid1,
4426 * IN LUID Luid2)
4427 */
4428#define RtlEqualLuid(_Luid1, \
4429 _Luid2) \
4430 ((Luid1.LowPart == Luid2.LowPart) && (Luid1.HighPart == Luid2.HighPart))
4431
4432/*
4433 * ULONG
4434 * RtlEqualMemory(
4435 * IN VOID UNALIGNED *Destination,
4436 * IN CONST VOID UNALIGNED *Source,
4437 * IN SIZE_T Length)
4438 */
4439#define RtlEqualMemory(Destination, Source, Length) (!memcmp(Destination, Source, Length))
4440
4441NTOSAPI
4442BOOLEAN
4443DDKAPI
4444RtlEqualString(
4445 IN PSTRING String1,
4446 IN PSTRING String2,
4447 IN BOOLEAN CaseInSensitive);
4448
4449NTOSAPI
4450BOOLEAN
4451DDKAPI
4452RtlEqualUnicodeString(
4453 IN CONST UNICODE_STRING *String1,
4454 IN CONST UNICODE_STRING *String2,
4455 IN BOOLEAN CaseInSensitive);
4456
4457/*
4458 * VOID
4459 * RtlFillMemory(
4460 * IN VOID UNALIGNED *Destination,
4461 * IN SIZE_T Length,
4462 * IN UCHAR Fill)
4463 */
4464#ifndef RtlFillMemory
4465#define RtlFillMemory(Destination, Length, Fill) \
4466 memset(Destination, Fill, Length)
4467#endif
4468
4469#ifndef RtlFillBytes
4470#define RtlFillBytes RtlFillMemory
4471#endif
4472
4473NTOSAPI
4474ULONG
4475DDKAPI
4476RtlFindClearBits(
4477 IN PRTL_BITMAP BitMapHeader,
4478 IN ULONG NumberToFind,
4479 IN ULONG HintIndex);
4480
4481NTOSAPI
4482ULONG
4483DDKAPI
4484RtlFindClearBitsAndSet(
4485 IN PRTL_BITMAP BitMapHeader,
4486 IN ULONG NumberToFind,
4487 IN ULONG HintIndex);
4488
4489NTOSAPI
4490ULONG
4491DDKAPI
4492RtlFindClearRuns(
4493 IN PRTL_BITMAP BitMapHeader,
4494 OUT PRTL_BITMAP_RUN RunArray,
4495 IN ULONG SizeOfRunArray,
4496 IN BOOLEAN LocateLongestRuns);
4497
4498NTOSAPI
4499ULONG
4500DDKAPI
4501RtlFindFirstRunClear(
4502 IN PRTL_BITMAP BitMapHeader,
4503 OUT PULONG StartingIndex);
4504
4505NTOSAPI
4506ULONG
4507DDKAPI
4508RtlFindLastBackwardRunClear(
4509 IN PRTL_BITMAP BitMapHeader,
4510 IN ULONG FromIndex,
4511 OUT PULONG StartingRunIndex);
4512
4513NTOSAPI
4514CCHAR
4515DDKAPI
4516RtlFindLeastSignificantBit(
4517 IN ULONGLONG Set);
4518
4519NTOSAPI
4520ULONG
4521DDKAPI
4522RtlFindLongestRunClear(
4523 IN PRTL_BITMAP BitMapHeader,
4524 OUT PULONG StartingIndex);
4525
4526NTOSAPI
4527CCHAR
4528DDKAPI
4529RtlFindMostSignificantBit(
4530 IN ULONGLONG Set);
4531
4532NTOSAPI
4533ULONG
4534DDKAPI
4535RtlFindNextForwardRunClear(
4536 IN PRTL_BITMAP BitMapHeader,
4537 IN ULONG FromIndex,
4538 OUT PULONG StartingRunIndex);
4539
4540NTOSAPI
4541NTSTATUS
4542DDKAPI
4543RtlFindRange(
4544 IN PRTL_RANGE_LIST RangeList,
4545 IN ULONGLONG Minimum,
4546 IN ULONGLONG Maximum,
4547 IN ULONG Length,
4548 IN ULONG Alignment,
4549 IN ULONG Flags,
4550 IN UCHAR AttributeAvailableMask,
4551 IN PVOID Context OPTIONAL,
4552 IN PRTL_CONFLICT_RANGE_CALLBACK Callback OPTIONAL,
4553 OUT PULONGLONG Start);
4554
4555NTOSAPI
4556ULONG
4557DDKAPI
4558RtlFindSetBits(
4559 IN PRTL_BITMAP BitMapHeader,
4560 IN ULONG NumberToFind,
4561 IN ULONG HintIndex);
4562
4563NTOSAPI
4564ULONG
4565DDKAPI
4566RtlFindSetBitsAndClear(
4567 IN PRTL_BITMAP BitMapHeader,
4568 IN ULONG NumberToFind,
4569 IN ULONG HintIndex);
4570
4571NTOSAPI
4572VOID
4573DDKAPI
4574RtlFreeAnsiString(
4575 IN PANSI_STRING AnsiString);
4576
4577NTOSAPI
4578VOID
4579DDKAPI
4580RtlFreeRangeList(
4581 IN PRTL_RANGE_LIST RangeList);
4582
4583NTOSAPI
4584VOID
4585DDKAPI
4586RtlFreeUnicodeString(
4587 IN PUNICODE_STRING UnicodeString);
4588
4589NTOSAPI
4590VOID
4591DDKAPI
4592RtlGetCallersAddress(
4593 OUT PVOID *CallersAddress,
4594 OUT PVOID *CallersCaller);
4595
4596NTOSAPI
4597NTSTATUS
4598DDKAPI
4599RtlGetVersion(
4600 IN OUT PRTL_OSVERSIONINFOW lpVersionInformation);
4601
4602NTOSAPI
4603NTSTATUS
4604DDKAPI
4605RtlGetFirstRange(
4606 IN PRTL_RANGE_LIST RangeList,
4607 OUT PRTL_RANGE_LIST_ITERATOR Iterator,
4608 OUT PRTL_RANGE *Range);
4609
4610NTOSAPI
4611NTSTATUS
4612DDKAPI
4613RtlGetNextRange(
4614 IN OUT PRTL_RANGE_LIST_ITERATOR Iterator,
4615 OUT PRTL_RANGE *Range,
4616 IN BOOLEAN MoveForwards);
4617
4618#define FOR_ALL_RANGES(RangeList, Iterator, Current) \
4619 for (RtlGetFirstRange((RangeList), (Iterator), &(Current)); \
4620 (Current) != NULL; \
4621 RtlGetNextRange((Iterator), &(Current), TRUE))
4622
4623#define FOR_ALL_RANGES_BACKWARDS(RangeList, Iterator, Current) \
4624 for (RtlGetLastRange((RangeList), (Iterator), &(Current)); \
4625 (Current) != NULL; \
4626 RtlGetNextRange((Iterator), &(Current), FALSE))
4627
4628NTOSAPI
4629NTSTATUS
4630DDKAPI
4631RtlGUIDFromString(
4632 IN PUNICODE_STRING GuidString,
4633 OUT GUID *Guid);
4634
4635NTOSAPI
4636NTSTATUS
4637DDKAPI
4638RtlHashUnicodeString(
4639 IN CONST UNICODE_STRING *String,
4640 IN BOOLEAN CaseInSensitive,
4641 IN ULONG HashAlgorithm,
4642 OUT PULONG HashValue);
4643
4644NTOSAPI
4645VOID
4646DDKAPI
4647RtlInitAnsiString(
4648 IN OUT PANSI_STRING DestinationString,
4649 IN PCSZ SourceString);
4650
4651NTOSAPI
4652VOID
4653DDKAPI
4654RtlInitializeBitMap(
4655 IN PRTL_BITMAP BitMapHeader,
4656 IN PULONG BitMapBuffer,
4657 IN ULONG SizeOfBitMap);
4658
4659NTOSAPI
4660VOID
4661DDKAPI
4662RtlInitializeRangeList(
4663 IN OUT PRTL_RANGE_LIST RangeList);
4664
4665NTOSAPI
4666VOID
4667DDKAPI
4668RtlInitString(
4669 IN OUT PSTRING DestinationString,
4670 IN PCSZ SourceString);
4671
4672NTOSAPI
4673VOID
4674DDKAPI
4675RtlInitUnicodeString(
4676 IN OUT PUNICODE_STRING DestinationString,
4677 IN PCWSTR SourceString);
4678
4679NTOSAPI
4680NTSTATUS
4681DDKAPI
4682RtlInt64ToUnicodeString(
4683 IN ULONGLONG Value,
4684 IN ULONG Base OPTIONAL,
4685 IN OUT PUNICODE_STRING String);
4686
4687NTOSAPI
4688NTSTATUS
4689DDKAPI
4690RtlIntegerToUnicodeString(
4691 IN ULONG Value,
4692 IN ULONG Base OPTIONAL,
4693 IN OUT PUNICODE_STRING String);
4694
4695NTOSAPI
4696NTSTATUS
4697DDKAPI
4698RtlIntPtrToUnicodeString(
4699 PLONG Value,
4700 ULONG Base OPTIONAL,
4701 PUNICODE_STRING String);
4702
4703NTOSAPI
4704NTSTATUS
4705DDKAPI
4706RtlInvertRangeList(
4707 OUT PRTL_RANGE_LIST InvertedRangeList,
4708 IN PRTL_RANGE_LIST RangeList);
4709
4710NTOSAPI
4711NTSTATUS
4712DDKAPI
4713RtlIsRangeAvailable(
4714 IN PRTL_RANGE_LIST RangeList,
4715 IN ULONGLONG Start,
4716 IN ULONGLONG End,
4717 IN ULONG Flags,
4718 IN UCHAR AttributeAvailableMask,
4719 IN PVOID Context OPTIONAL,
4720 IN PRTL_CONFLICT_RANGE_CALLBACK Callback OPTIONAL,
4721 OUT PBOOLEAN Available);
4722
4723/*
4724 * BOOLEAN
4725 * RtlIsZeroLuid(
4726 * IN PLUID L1)
4727 */
4728#define RtlIsZeroLuid(_L1) \
4729 ((BOOLEAN) ((!(_L1)->LowPart) && (!(_L1)->HighPart)))
4730
4731NTOSAPI
4732ULONG
4733DDKAPI
4734RtlLengthSecurityDescriptor(
4735 IN PSECURITY_DESCRIPTOR SecurityDescriptor);
4736
4737NTOSAPI
4738VOID
4739DDKAPI
4740RtlMapGenericMask(
4741 IN OUT PACCESS_MASK AccessMask,
4742 IN PGENERIC_MAPPING GenericMapping);
4743
4744NTOSAPI
4745NTSTATUS
4746DDKAPI
4747RtlMergeRangeLists(
4748 OUT PRTL_RANGE_LIST MergedRangeList,
4749 IN PRTL_RANGE_LIST RangeList1,
4750 IN PRTL_RANGE_LIST RangeList2,
4751 IN ULONG Flags);
4752
4753/*
4754 * VOID
4755 * RtlMoveMemory(
4756 * IN VOID UNALIGNED *Destination,
4757 * IN CONST VOID UNALIGNED *Source,
4758 * IN SIZE_T Length)
4759 */
4760#define RtlMoveMemory memmove
4761
4762NTOSAPI
4763ULONG
4764DDKAPI
4765RtlNumberOfClearBits(
4766 IN PRTL_BITMAP BitMapHeader);
4767
4768NTOSAPI
4769ULONG
4770DDKAPI
4771RtlNumberOfSetBits(
4772 IN PRTL_BITMAP BitMapHeader);
4773
4774NTOSAPI
4775VOID
4776DDKFASTAPI
4777RtlPrefetchMemoryNonTemporal(
4778 IN PVOID Source,
4779 IN SIZE_T Length);
4780
4781NTOSAPI
4782BOOLEAN
4783DDKAPI
4784RtlPrefixUnicodeString(
4785 IN PUNICODE_STRING String1,
4786 IN PUNICODE_STRING String2,
4787 IN BOOLEAN CaseInSensitive);
4788
4789NTOSAPI
4790NTSTATUS
4791DDKAPI
4792RtlQueryRegistryValues(
4793 IN ULONG RelativeTo,
4794 IN PCWSTR Path,
4795 IN PRTL_QUERY_REGISTRY_TABLE QueryTable,
4796 IN PVOID Context,
4797 IN PVOID Environment OPTIONAL);
4798
4799NTOSAPI
4800VOID
4801DDKAPI
4802RtlRetrieveUlong(
4803 IN OUT PULONG DestinationAddress,
4804 IN PULONG SourceAddress);
4805
4806NTOSAPI
4807VOID
4808DDKAPI
4809RtlRetrieveUshort(
4810 IN OUT PUSHORT DestinationAddress,
4811 IN PUSHORT SourceAddress);
4812
4813NTOSAPI
4814VOID
4815DDKAPI
4816RtlSetAllBits(
4817 IN PRTL_BITMAP BitMapHeader);
4818
4819NTOSAPI
4820VOID
4821DDKAPI
4822RtlSetBit(
4823 PRTL_BITMAP BitMapHeader,
4824 ULONG BitNumber);
4825
4826NTOSAPI
4827VOID
4828DDKAPI
4829RtlSetBits(
4830 IN PRTL_BITMAP BitMapHeader,
4831 IN ULONG StartingIndex,
4832 IN ULONG NumberToSet);
4833
4834NTOSAPI
4835NTSTATUS
4836DDKAPI
4837RtlSetDaclSecurityDescriptor(
4838 IN OUT PSECURITY_DESCRIPTOR SecurityDescriptor,
4839 IN BOOLEAN DaclPresent,
4840 IN PACL Dacl OPTIONAL,
4841 IN BOOLEAN DaclDefaulted OPTIONAL);
4842
4843NTOSAPI
4844VOID
4845DDKAPI
4846RtlStoreUlong(
4847 IN PULONG Address,
4848 IN ULONG Value);
4849
4850NTOSAPI
4851VOID
4852DDKAPI
4853RtlStoreUlonglong(
4854 IN OUT PULONGLONG Address,
4855 ULONGLONG Value);
4856
4857NTOSAPI
4858VOID
4859DDKAPI
4860RtlStoreUlongPtr(
4861 IN OUT PULONG_PTR Address,
4862 IN ULONG_PTR Value);
4863
4864NTOSAPI
4865VOID
4866DDKAPI
4867RtlStoreUshort(
4868 IN PUSHORT Address,
4869 IN USHORT Value);
4870
4871NTOSAPI
4872NTSTATUS
4873DDKAPI
4874RtlStringFromGUID(
4875 IN REFGUID Guid,
4876 OUT PUNICODE_STRING GuidString);
4877
4878NTOSAPI
4879BOOLEAN
4880DDKAPI
4881RtlTestBit(
4882 IN PRTL_BITMAP BitMapHeader,
4883 IN ULONG BitNumber);
4884
4885NTOSAPI
4886BOOLEAN
4887DDKAPI
4888RtlTimeFieldsToTime(
4889 IN PTIME_FIELDS TimeFields,
4890 IN PLARGE_INTEGER Time);
4891
4892NTOSAPI
4893VOID
4894DDKAPI
4895RtlTimeToTimeFields(
4896 IN PLARGE_INTEGER Time,
4897 IN PTIME_FIELDS TimeFields);
4898
4899NTOSAPI
4900ULONG
4901DDKFASTAPI
4902RtlUlongByteSwap(
4903 IN ULONG Source);
4904
4905NTOSAPI
4906ULONGLONG
4907DDKFASTAPI
4908RtlUlonglongByteSwap(
4909 IN ULONGLONG Source);
4910
4911NTOSAPI
4912ULONG
4913DDKAPI
4914RtlUnicodeStringToAnsiSize(
4915 IN PUNICODE_STRING UnicodeString);
4916
4917NTOSAPI
4918NTSTATUS
4919DDKAPI
4920RtlUnicodeStringToAnsiString(
4921 IN OUT PANSI_STRING DestinationString,
4922 IN PUNICODE_STRING SourceString,
4923 IN BOOLEAN AllocateDestinationString);
4924
4925NTOSAPI
4926NTSTATUS
4927DDKAPI
4928RtlUnicodeStringToInteger(
4929 IN PUNICODE_STRING String,
4930 IN ULONG Base OPTIONAL,
4931 OUT PULONG Value);
4932
4933NTOSAPI
4934WCHAR
4935DDKAPI
4936RtlUpcaseUnicodeChar(
4937 IN WCHAR SourceCharacter);
4938
4939NTOSAPI
4940NTSTATUS
4941DDKAPI
4942RtlUpcaseUnicodeString(
4943 IN OUT PUNICODE_STRING DestinationString OPTIONAL,
4944 IN PCUNICODE_STRING SourceString,
4945 IN BOOLEAN AllocateDestinationString);
4946
4947NTOSAPI
4948CHAR
4949DDKAPI
4950RtlUpperChar(
4951 IN CHAR Character);
4952
4953NTOSAPI
4954VOID
4955DDKAPI
4956RtlUpperString(
4957 IN OUT PSTRING DestinationString,
4958 IN PSTRING SourceString);
4959
4960NTOSAPI
4961USHORT
4962DDKFASTAPI
4963RtlUshortByteSwap(
4964 IN USHORT Source);
4965
4966NTOSAPI
4967BOOLEAN
4968DDKAPI
4969RtlValidRelativeSecurityDescriptor(
4970 IN PSECURITY_DESCRIPTOR SecurityDescriptorInput,
4971 IN ULONG SecurityDescriptorLength,
4972 IN SECURITY_INFORMATION RequiredInformation);
4973
4974NTOSAPI
4975BOOLEAN
4976DDKAPI
4977RtlValidSecurityDescriptor(
4978 IN PSECURITY_DESCRIPTOR SecurityDescriptor);
4979
4980NTOSAPI
4981NTSTATUS
4982DDKAPI
4983RtlVerifyVersionInfo(
4984 IN PRTL_OSVERSIONINFOEXW VersionInfo,
4985 IN ULONG TypeMask,
4986 IN ULONGLONG ConditionMask);
4987
4988NTOSAPI
4989NTSTATUS
4990DDKAPI
4991RtlVolumeDeviceToDosName(
4992 IN PVOID VolumeDeviceObject,
4993 OUT PUNICODE_STRING DosName);
4994
4995NTOSAPI
4996ULONG
4997DDKAPI
4998RtlWalkFrameChain(
4999 OUT PVOID *Callers,
5000 IN ULONG Count,
5001 IN ULONG Flags);
5002
5003NTOSAPI
5004NTSTATUS
5005DDKAPI
5006RtlWriteRegistryValue(
5007 IN ULONG RelativeTo,
5008 IN PCWSTR Path,
5009 IN PCWSTR ValueName,
5010 IN ULONG ValueType,
5011 IN PVOID ValueData,
5012 IN ULONG ValueLength);
5013
5014NTOSAPI
5015ULONG
5016DDKAPI
5017RtlxUnicodeStringToAnsiSize(
5018 IN PUNICODE_STRING UnicodeString);
5019
5020/*
5021 * VOID
5022 * RtlZeroMemory(
5023 * IN VOID UNALIGNED *Destination,
5024 * IN SIZE_T Length)
5025 */
5026#ifndef RtlZeroMemory
5027#define RtlZeroMemory(Destination, Length) \
5028 memset(Destination, 0, Length)
5029#endif
5030
5031#ifndef RtlZeroBytes
5032#define RtlZeroBytes RtlZeroMemory
5033#endif
5034
5035
5036/** Executive support routines **/
5037
5038NTOSAPI
5039VOID
5040DDKFASTAPI
5041ExAcquireFastMutex(
5042 IN PFAST_MUTEX FastMutex);
5043
5044NTOSAPI
5045VOID
5046DDKFASTAPI
5047ExAcquireFastMutexUnsafe(
5048 IN PFAST_MUTEX FastMutex);
5049
5050NTOSAPI
5051BOOLEAN
5052DDKAPI
5053ExAcquireResourceExclusiveLite(
5054 IN PERESOURCE Resource,
5055 IN BOOLEAN Wait);
5056
5057NTOSAPI
5058BOOLEAN
5059DDKAPI
5060ExAcquireResourceSharedLite(
5061 IN PERESOURCE Resource,
5062 IN BOOLEAN Wait);
5063
5064NTOSAPI
5065BOOLEAN
5066DDKAPI
5067ExAcquireSharedStarveExclusive(
5068 IN PERESOURCE Resource,
5069 IN BOOLEAN Wait);
5070
5071NTOSAPI
5072BOOLEAN
5073DDKAPI
5074ExAcquireSharedWaitForExclusive(
5075 IN PERESOURCE Resource,
5076 IN BOOLEAN Wait);
5077
5078
5079NTOSAPI
5080PSINGLE_LIST_ENTRY
5081DDKFASTAPI
5082ExInterlockedPopEntrySList(
5083 IN PSLIST_HEADER ListHead,
5084 IN PKSPIN_LOCK Lock);
5085
5086
5087NTOSAPI
5088PSINGLE_LIST_ENTRY
5089DDKFASTAPI
5090ExInterlockedPushEntrySList(
5091 IN PSLIST_HEADER ListHead,
5092 IN PSINGLE_LIST_ENTRY ListEntry,
5093 IN PKSPIN_LOCK Lock);
5094
5095
5096#if (__USE_NTOSKRNL__) && (_WIN32_WINNT >= 0x0501)
5097#define ExInterlockedPopEntrySList(_ListHead, \
5098 _Lock) \
5099 InterlockedPopEntrySList(_ListHead)
5100
5101#define ExInterlockedPushEntrySList(_ListHead, \
5102 _ListEntry, \
5103 _Lock) \
5104 InterlockedPushEntrySList(_ListHead, _ListEntry)
5105#endif /* __USE_NTOSKRNL__ */
5106
5107#define ExQueryDepthSList(ListHead) QueryDepthSList(ListHead)
5108
5109static __inline PVOID
5110ExAllocateFromNPagedLookasideList(
5111 IN PNPAGED_LOOKASIDE_LIST Lookaside)
5112{
5113 PVOID Entry;
5114
5115 Lookaside->TotalAllocates++;
5116 Entry = ExInterlockedPopEntrySList(&Lookaside->ListHead,
5117 &Lookaside->Obsoleted);
5118 if (Entry == NULL) {
5119 Lookaside->_DDK_DUMMYUNION_MEMBER(AllocateMisses)++;
5120 Entry = (Lookaside->Allocate)(Lookaside->Type,
5121 Lookaside->Size,
5122 Lookaside->Tag);
5123 }
5124 return Entry;
5125}
5126
5127static __inline VOID
5128ExFreeToNPagedLookasideList(
5129 IN PNPAGED_LOOKASIDE_LIST Lookaside,
5130 IN PVOID Entry)
5131{
5132 Lookaside->TotalFrees++;
5133 if (ExQueryDepthSList(&Lookaside->ListHead) >= Lookaside->Depth) {
5134 Lookaside->_DDK_DUMMYUNION_N_MEMBER(2,FreeMisses)++;
5135 (Lookaside->Free)(Entry);
5136 } else {
5137 ExInterlockedPushEntrySList(&Lookaside->ListHead,
5138 (PSLIST_ENTRY)Entry,
5139 &Lookaside->Obsoleted);
5140 }
5141}
5142
5143#if (__USE_NTOSKRNL__) && (_WIN32_WINNT >= 0x0501)
5144
5145static __inline PVOID
5146ExAllocateFromPagedLookasideList(
5147 IN PPAGED_LOOKASIDE_LIST Lookaside)
5148{
5149 PVOID Entry;
5150
5151 Lookaside->TotalAllocates++;
5152 Entry = InterlockedPopEntrySList(&Lookaside->ListHead);
5153 if (Entry == NULL) {
5154 Lookaside->_DDK_DUMMYUNION_MEMBER(AllocateMisses)++;
5155 Entry = (Lookaside->Allocate)(Lookaside->Type,
5156 Lookaside->Size,
5157 Lookaside->Tag);
5158 }
5159 return Entry;
5160}
5161
5162static __inline VOID
5163ExFreeToPagedLookasideList(
5164 IN PPAGED_LOOKASIDE_LIST Lookaside,
5165 IN PVOID Entry)
5166{
5167 Lookaside->TotalFrees++;
5168 if (ExQueryDepthSList(&Lookaside->ListHead) >= Lookaside->Depth) {
5169 Lookaside->_DDK_DUMMYUNION_N_MEMBER(2,FreeMisses)++;
5170 (Lookaside->Free)(Entry);
5171 } else {
5172 InterlockedPushEntrySList(&Lookaside->ListHead,
5173 (PSLIST_ENTRY)Entry);
5174 }
5175}
5176
5177#else /* (__USE_NTOSKRNL__) && (_WIN32_WINNT >= 0x0501) */
5178
5179NTOSAPI
5180PVOID
5181DDKAPI
5182ExAllocateFromPagedLookasideList(
5183 IN PPAGED_LOOKASIDE_LIST Lookaside);
5184
5185NTOSAPI
5186VOID
5187DDKAPI
5188ExFreeToPagedLookasideList(
5189 IN PPAGED_LOOKASIDE_LIST Lookaside,
5190 IN PVOID Entry);
5191
5192#endif /* (__USE_NTOSKRNL__) && (_WIN32_WINNT >= 0x0501) */
5193
5194NTOSAPI
5195PVOID
5196DDKAPI
5197ExAllocatePoolWithQuotaTag(
5198 IN POOL_TYPE PoolType,
5199 IN SIZE_T NumberOfBytes,
5200 IN ULONG Tag);
5201
5202NTOSAPI
5203PVOID
5204DDKAPI
5205ExAllocatePoolWithTag(
5206 IN POOL_TYPE PoolType,
5207 IN SIZE_T NumberOfBytes,
5208 IN ULONG Tag);
5209
5210#ifdef POOL_TAGGING
5211
5212#define ExAllocatePoolWithQuota(p,n) ExAllocatePoolWithQuotaTag(p,n,' kdD')
5213#define ExAllocatePool(p,n) ExAllocatePoolWithTag(p,n,' kdD')
5214
5215#else /* !POOL_TAGGING */
5216
5217NTOSAPI
5218PVOID
5219DDKAPI
5220ExAllocatePool(
5221 IN POOL_TYPE PoolType,
5222 IN SIZE_T NumberOfBytes);
5223
5224NTOSAPI
5225PVOID
5226DDKAPI
5227ExAllocatePoolWithQuota(
5228 IN POOL_TYPE PoolType,
5229 IN SIZE_T NumberOfBytes);
5230
5231#endif /* POOL_TAGGING */
5232
5233NTOSAPI
5234PVOID
5235DDKAPI
5236ExAllocatePoolWithTagPriority(
5237 IN POOL_TYPE PoolType,
5238 IN SIZE_T NumberOfBytes,
5239 IN ULONG Tag,
5240 IN EX_POOL_PRIORITY Priority);
5241
5242NTOSAPI
5243VOID
5244DDKAPI
5245ExConvertExclusiveToSharedLite(
5246 IN PERESOURCE Resource);
5247
5248NTOSAPI
5249NTSTATUS
5250DDKAPI
5251ExCreateCallback(
5252 OUT PCALLBACK_OBJECT *CallbackObject,
5253 IN POBJECT_ATTRIBUTES ObjectAttributes,
5254 IN BOOLEAN Create,
5255 IN BOOLEAN AllowMultipleCallbacks);
5256
5257NTOSAPI
5258VOID
5259DDKAPI
5260ExDeleteNPagedLookasideList(
5261 IN PNPAGED_LOOKASIDE_LIST Lookaside);
5262
5263NTOSAPI
5264VOID
5265DDKAPI
5266ExDeletePagedLookasideList(
5267 IN PPAGED_LOOKASIDE_LIST Lookaside);
5268
5269NTOSAPI
5270NTSTATUS
5271DDKAPI
5272ExDeleteResourceLite(
5273 IN PERESOURCE Resource);
5274
5275NTOSAPI
5276VOID
5277DDKAPI
5278ExFreePool(
5279 IN PVOID P);
5280
5281#define PROTECTED_POOL 0x80000000
5282
5283#ifdef POOL_TAGGING
5284#define ExFreePool(P) ExFreePoolWithTag(P, 0)
5285#endif
5286
5287NTOSAPI
5288VOID
5289DDKAPI
5290ExFreePoolWithTag(
5291 IN PVOID P,
5292 IN ULONG Tag);
5293
5294/*
5295 * ERESOURCE_THREAD
5296 * ExGetCurrentResourceThread(
5297 * VOID);
5298 */
5299#define ExGetCurrentResourceThread() ((ERESOURCE_THREAD) PsGetCurrentThread())
5300
5301NTOSAPI
5302ULONG
5303DDKAPI
5304ExGetExclusiveWaiterCount(
5305 IN PERESOURCE Resource);
5306
5307NTOSAPI
5308KPROCESSOR_MODE
5309DDKAPI
5310ExGetPreviousMode(
5311 VOID);
5312
5313NTOSAPI
5314ULONG
5315DDKAPI
5316ExGetSharedWaiterCount(
5317 IN PERESOURCE Resource);
5318
5319NTOSAPI
5320VOID
5321DDKAPI
5322KeInitializeEvent(
5323 IN PRKEVENT Event,
5324 IN EVENT_TYPE Type,
5325 IN BOOLEAN State);
5326
5327/*
5328 * VOID DDKAPI
5329 * ExInitializeFastMutex(
5330 * IN PFAST_MUTEX FastMutex)
5331 */
5332#define ExInitializeFastMutex(_FastMutex) \
5333{ \
5334 (_FastMutex)->Count = 1; \
5335 (_FastMutex)->Owner = NULL; \
5336 (_FastMutex)->Contention = 0; \
5337 KeInitializeEvent(&(_FastMutex)->Event, SynchronizationEvent, FALSE); \
5338}
5339
5340NTOSAPI
5341VOID
5342DDKAPI
5343ExInitializeNPagedLookasideList(
5344 IN PNPAGED_LOOKASIDE_LIST Lookaside,
5345 IN PALLOCATE_FUNCTION Allocate OPTIONAL,
5346 IN PFREE_FUNCTION Free OPTIONAL,
5347 IN ULONG Flags,
5348 IN SIZE_T Size,
5349 IN ULONG Tag,
5350 IN USHORT Depth);
5351
5352NTOSAPI
5353VOID
5354DDKAPI
5355ExInitializePagedLookasideList(
5356 IN PPAGED_LOOKASIDE_LIST Lookaside,
5357 IN PALLOCATE_FUNCTION Allocate OPTIONAL,
5358 IN PFREE_FUNCTION Free OPTIONAL,
5359 IN ULONG Flags,
5360 IN SIZE_T Size,
5361 IN ULONG Tag,
5362 IN USHORT Depth);
5363
5364NTOSAPI
5365NTSTATUS
5366DDKAPI
5367ExInitializeResourceLite(
5368 IN PERESOURCE Resource);
5369
5370/*
5371 * VOID
5372 * InitializeSListHead(
5373 * IN PSLIST_HEADER SListHead)
5374 */
5375#define InitializeSListHead(_SListHead) \
5376 (_SListHead)->Alignment = 0
5377
5378#define ExInitializeSListHead InitializeSListHead
5379
5380NTOSAPI
5381LARGE_INTEGER
5382DDKAPI
5383ExInterlockedAddLargeInteger(
5384 IN PLARGE_INTEGER Addend,
5385 IN LARGE_INTEGER Increment,
5386 IN PKSPIN_LOCK Lock);
5387
5388NTOSAPI
5389VOID
5390DDKFASTAPI
5391ExInterlockedAddLargeStatistic(
5392 IN PLARGE_INTEGER Addend,
5393 IN ULONG Increment);
5394
5395NTOSAPI
5396ULONG
5397DDKAPI
5398ExInterlockedAddUlong(
5399 IN PULONG Addend,
5400 IN ULONG Increment,
5401 PKSPIN_LOCK Lock);
5402
5403NTOSAPI
5404ULONG
5405DDKFASTAPI
5406ExfInterlockedAddUlong(
5407 IN PULONG Addend,
5408 IN ULONG Increment,
5409 PKSPIN_LOCK Lock);
5410
5411
5412NTOSAPI
5413LONGLONG
5414DDKFASTAPI
5415ExInterlockedCompareExchange64(
5416 IN OUT PLONGLONG Destination,
5417 IN PLONGLONG Exchange,
5418 IN PLONGLONG Comparand,
5419 IN PKSPIN_LOCK Lock);
5420
5421NTOSAPI
5422PSINGLE_LIST_ENTRY
5423DDKFASTAPI
5424ExInterlockedFlushSList(
5425 IN PSLIST_HEADER ListHead);
5426
5427NTOSAPI
5428PLIST_ENTRY
5429DDKAPI
5430ExInterlockedInsertHeadList(
5431 IN PLIST_ENTRY ListHead,
5432 IN PLIST_ENTRY ListEntry,
5433 IN PKSPIN_LOCK Lock);
5434
5435NTOSAPI
5436PLIST_ENTRY
5437DDKFASTAPI
5438ExfInterlockedInsertHeadList(
5439 IN PLIST_ENTRY ListHead,
5440 IN PLIST_ENTRY ListEntry,
5441 IN PKSPIN_LOCK Lock);
5442
5443NTOSAPI
5444PLIST_ENTRY
5445DDKAPI
5446ExInterlockedInsertTailList(
5447 IN PLIST_ENTRY ListHead,
5448 IN PLIST_ENTRY ListEntry,
5449 IN PKSPIN_LOCK Lock);
5450
5451NTOSAPI
5452PLIST_ENTRY
5453DDKFASTAPI
5454ExfInterlockedInsertTailList(
5455 IN PLIST_ENTRY ListHead,
5456 IN PLIST_ENTRY ListEntry,
5457 IN PKSPIN_LOCK Lock);
5458
5459NTOSAPI
5460PSINGLE_LIST_ENTRY
5461DDKAPI
5462ExInterlockedPopEntryList(
5463 IN PSINGLE_LIST_ENTRY ListHead,
5464 IN PKSPIN_LOCK Lock);
5465
5466NTOSAPI
5467PSINGLE_LIST_ENTRY
5468DDKFASTAPI
5469ExfInterlockedPopEntryList(
5470 IN PSINGLE_LIST_ENTRY ListHead,
5471 IN PKSPIN_LOCK Lock);
5472
5473
5474NTOSAPI
5475PSINGLE_LIST_ENTRY
5476DDKAPI
5477ExInterlockedPushEntryList(
5478 IN PSINGLE_LIST_ENTRY ListHead,
5479 IN PSINGLE_LIST_ENTRY ListEntry,
5480 IN PKSPIN_LOCK Lock);
5481
5482NTOSAPI
5483PSINGLE_LIST_ENTRY
5484DDKFASTAPI
5485ExfInterlockedPushEntryList(
5486 IN PSINGLE_LIST_ENTRY ListHead,
5487 IN PSINGLE_LIST_ENTRY ListEntry,
5488 IN PKSPIN_LOCK Lock);
5489
5490
5491NTOSAPI
5492PLIST_ENTRY
5493DDKAPI
5494ExInterlockedRemoveHeadList(
5495 IN PLIST_ENTRY ListHead,
5496 IN PKSPIN_LOCK Lock);
5497
5498NTOSAPI
5499PLIST_ENTRY
5500DDKFASTAPI
5501ExfInterlockedRemoveHeadList(
5502 IN PLIST_ENTRY ListHead,
5503 IN PKSPIN_LOCK Lock);
5504
5505
5506NTOSAPI
5507BOOLEAN
5508DDKAPI
5509ExIsProcessorFeaturePresent(
5510 IN ULONG ProcessorFeature);
5511
5512NTOSAPI
5513BOOLEAN
5514DDKAPI
5515ExIsResourceAcquiredExclusiveLite(
5516 IN PERESOURCE Resource);
5517
5518NTOSAPI
5519USHORT
5520DDKAPI
5521ExIsResourceAcquiredLite(
5522 IN PERESOURCE Resource);
5523
5524NTOSAPI
5525USHORT
5526DDKAPI
5527ExIsResourceAcquiredSharedLite(
5528 IN PERESOURCE Resource);
5529
5530NTOSAPI
5531VOID
5532DDKAPI
5533ExLocalTimeToSystemTime(
5534 IN PLARGE_INTEGER LocalTime,
5535 OUT PLARGE_INTEGER SystemTime);
5536
5537NTOSAPI
5538VOID
5539DDKAPI
5540ExNotifyCallback(
5541 IN PCALLBACK_OBJECT CallbackObject,
5542 IN PVOID Argument1,
5543 IN PVOID Argument2);
5544
5545NTOSAPI
5546VOID
5547DDKAPI
5548ExRaiseAccessViolation(
5549 VOID);
5550
5551NTOSAPI
5552VOID
5553DDKAPI
5554ExRaiseDatatypeMisalignment(
5555 VOID);
5556
5557NTOSAPI
5558VOID
5559DDKAPI
5560ExRaiseStatus(
5561 IN NTSTATUS Status);
5562
5563NTOSAPI
5564PVOID
5565DDKAPI
5566ExRegisterCallback(
5567 IN PCALLBACK_OBJECT CallbackObject,
5568 IN PCALLBACK_FUNCTION CallbackFunction,
5569 IN PVOID CallbackContext);
5570
5571NTOSAPI
5572VOID
5573DDKAPI
5574ExReinitializeResourceLite(
5575 IN PERESOURCE Resource);
5576
5577NTOSAPI
5578VOID
5579DDKFASTAPI
5580ExReleaseFastMutex(
5581 IN PFAST_MUTEX FastMutex);
5582
5583NTOSAPI
5584VOID
5585DDKFASTAPI
5586ExReleaseFastMutexUnsafe(
5587 IN PFAST_MUTEX FastMutex);
5588
5589NTOSAPI
5590VOID
5591DDKAPI
5592ExReleaseResourceForThreadLite(
5593 IN PERESOURCE Resource,
5594 IN ERESOURCE_THREAD ResourceThreadId);
5595
5596NTOSAPI
5597VOID
5598DDKFASTAPI
5599ExReleaseResourceLite(
5600 IN PERESOURCE Resource);
5601
5602NTOSAPI
5603VOID
5604DDKAPI
5605ExSetResourceOwnerPointer(
5606 IN PERESOURCE Resource,
5607 IN PVOID OwnerPointer);
5608
5609NTOSAPI
5610ULONG
5611DDKAPI
5612ExSetTimerResolution(
5613 IN ULONG DesiredTime,
5614 IN BOOLEAN SetResolution);
5615
5616NTOSAPI
5617VOID
5618DDKAPI
5619ExSystemTimeToLocalTime(
5620 IN PLARGE_INTEGER SystemTime,
5621 OUT PLARGE_INTEGER LocalTime);
5622
5623NTOSAPI
5624BOOLEAN
5625DDKFASTAPI
5626ExTryToAcquireFastMutex(
5627 IN PFAST_MUTEX FastMutex);
5628
5629NTOSAPI
5630BOOLEAN
5631DDKAPI
5632ExTryToAcquireResourceExclusiveLite(
5633 IN PERESOURCE Resource);
5634
5635NTOSAPI
5636VOID
5637DDKAPI
5638ExUnregisterCallback(
5639 IN PVOID CbRegistration);
5640
5641NTOSAPI
5642NTSTATUS
5643DDKAPI
5644ExUuidCreate(
5645 OUT UUID *Uuid);
5646
5647NTOSAPI
5648BOOLEAN
5649DDKAPI
5650ExVerifySuite(
5651 IN SUITE_TYPE SuiteType);
5652
5653#ifdef DBG
5654
5655#define PAGED_CODE() { \
5656 if (KeGetCurrentIrql() > APC_LEVEL) { \
5657 KdPrint( ("NTDDK: Pageable code called at IRQL > APC_LEVEL (%d)\n", KeGetCurrentIrql() )); \
5658 ASSERT(FALSE); \
5659 } \
5660}
5661
5662#else
5663
5664#define PAGED_CODE()
5665
5666#endif
5667
5668NTOSAPI
5669VOID
5670DDKAPI
5671ProbeForRead(
5672 IN CONST VOID *Address,
5673 IN ULONG Length,
5674 IN ULONG Alignment);
5675
5676NTOSAPI
5677VOID
5678DDKAPI
5679ProbeForWrite(
5680 IN CONST VOID *Address,
5681 IN ULONG Length,
5682 IN ULONG Alignment);
5683
5684
5685
5686/** Configuration manager routines **/
5687
5688NTOSAPI
5689NTSTATUS
5690DDKAPI
5691CmRegisterCallback(
5692 IN PEX_CALLBACK_FUNCTION Function,
5693 IN PVOID Context,
5694 IN OUT PLARGE_INTEGER Cookie);
5695
5696NTOSAPI
5697NTSTATUS
5698DDKAPI
5699CmUnRegisterCallback(
5700 IN LARGE_INTEGER Cookie);
5701
5702
5703
5704/** Filesystem runtime library routines **/
5705
5706NTOSAPI
5707BOOLEAN
5708DDKAPI
5709FsRtlIsTotalDeviceFailure(
5710 IN NTSTATUS Status);
5711
5712
5713
5714/** Hardware abstraction layer routines **/
5715
5716NTOSAPI
5717VOID
5718DDKFASTAPI
5719HalExamineMBR(
5720 IN PDEVICE_OBJECT DeviceObject,
5721 IN ULONG SectorSize,
5722 IN ULONG MBRTypeIdentifier,
5723 OUT PVOID Buffer);
5724
5725NTOSAPI
5726VOID
5727DDKAPI
5728READ_PORT_BUFFER_UCHAR(
5729 IN PUCHAR Port,
5730 IN PUCHAR Buffer,
5731 IN ULONG Count);
5732
5733NTOSAPI
5734VOID
5735DDKAPI
5736READ_PORT_BUFFER_ULONG(
5737 IN PULONG Port,
5738 IN PULONG Buffer,
5739 IN ULONG Count);
5740
5741NTOSAPI
5742VOID
5743DDKAPI
5744READ_PORT_BUFFER_USHORT(
5745 IN PUSHORT Port,
5746 IN PUSHORT Buffer,
5747 IN ULONG Count);
5748
5749NTOSAPI
5750UCHAR
5751DDKAPI
5752READ_PORT_UCHAR(
5753 IN PUCHAR Port);
5754
5755NTOSAPI
5756ULONG
5757DDKAPI
5758READ_PORT_ULONG(
5759 IN PULONG Port);
5760
5761NTOSAPI
5762USHORT
5763DDKAPI
5764READ_PORT_USHORT(
5765 IN PUSHORT Port);
5766
5767NTOSAPI
5768VOID
5769DDKAPI
5770READ_REGISTER_BUFFER_UCHAR(
5771 IN PUCHAR Register,
5772 IN PUCHAR Buffer,
5773 IN ULONG Count);
5774
5775NTOSAPI
5776VOID
5777DDKAPI
5778READ_REGISTER_BUFFER_ULONG(
5779 IN PULONG Register,
5780 IN PULONG Buffer,
5781 IN ULONG Count);
5782
5783NTOSAPI
5784VOID
5785DDKAPI
5786READ_REGISTER_BUFFER_USHORT(
5787 IN PUSHORT Register,
5788 IN PUSHORT Buffer,
5789 IN ULONG Count);
5790
5791NTOSAPI
5792UCHAR
5793DDKAPI
5794READ_REGISTER_UCHAR(
5795 IN PUCHAR Register);
5796
5797NTOSAPI
5798ULONG
5799DDKAPI
5800READ_REGISTER_ULONG(
5801 IN PULONG Register);
5802
5803NTOSAPI
5804USHORT
5805DDKAPI
5806READ_REGISTER_USHORT(
5807 IN PUSHORT Register);
5808
5809NTOSAPI
5810VOID
5811DDKAPI
5812WRITE_PORT_BUFFER_UCHAR(
5813 IN PUCHAR Port,
5814 IN PUCHAR Buffer,
5815 IN ULONG Count);
5816
5817NTOSAPI
5818VOID
5819DDKAPI
5820WRITE_PORT_BUFFER_ULONG(
5821 IN PULONG Port,
5822 IN PULONG Buffer,
5823 IN ULONG Count);
5824
5825NTOSAPI
5826VOID
5827DDKAPI
5828WRITE_PORT_BUFFER_USHORT(
5829 IN PUSHORT Port,
5830 IN PUSHORT Buffer,
5831 IN ULONG Count);
5832
5833NTOSAPI
5834VOID
5835DDKAPI
5836WRITE_PORT_UCHAR(
5837 IN PUCHAR Port,
5838 IN UCHAR Value);
5839
5840NTOSAPI
5841VOID
5842DDKAPI
5843WRITE_PORT_ULONG(
5844 IN PULONG Port,
5845 IN ULONG Value);
5846
5847NTOSAPI
5848VOID
5849DDKAPI
5850WRITE_PORT_USHORT(
5851 IN PUSHORT Port,
5852 IN USHORT Value);
5853
5854NTOSAPI
5855VOID
5856DDKAPI
5857WRITE_REGISTER_BUFFER_UCHAR(
5858 IN PUCHAR Register,
5859 IN PUCHAR Buffer,
5860 IN ULONG Count);
5861
5862NTOSAPI
5863VOID
5864DDKAPI
5865WRITE_REGISTER_BUFFER_ULONG(
5866 IN PULONG Register,
5867 IN PULONG Buffer,
5868 IN ULONG Count);
5869
5870NTOSAPI
5871VOID
5872DDKAPI
5873WRITE_REGISTER_BUFFER_USHORT(
5874 IN PUSHORT Register,
5875 IN PUSHORT Buffer,
5876 IN ULONG Count);
5877
5878NTOSAPI
5879VOID
5880DDKAPI
5881WRITE_REGISTER_UCHAR(
5882 IN PUCHAR Register,
5883 IN UCHAR Value);
5884
5885NTOSAPI
5886VOID
5887DDKAPI
5888WRITE_REGISTER_ULONG(
5889 IN PULONG Register,
5890 IN ULONG Value);
5891
5892NTOSAPI
5893VOID
5894DDKAPI
5895WRITE_REGISTER_USHORT(
5896 IN PUSHORT Register,
5897 IN USHORT Value);
5898
5899/** I/O manager routines **/
5900
5901NTOSAPI
5902VOID
5903DDKAPI
5904IoAcquireCancelSpinLock(
5905 OUT PKIRQL Irql);
5906
5907NTOSAPI
5908NTSTATUS
5909DDKAPI
5910IoAcquireRemoveLockEx(
5911 IN PIO_REMOVE_LOCK RemoveLock,
5912 IN OPTIONAL PVOID Tag OPTIONAL,
5913 IN PCSTR File,
5914 IN ULONG Line,
5915 IN ULONG RemlockSize);
5916
5917/*
5918 * NTSTATUS
5919 * IoAcquireRemoveLock(
5920 * IN PIO_REMOVE_LOCK RemoveLock,
5921 * IN OPTIONAL PVOID Tag)
5922 */
5923#define IoAcquireRemoveLock(_RemoveLock, \
5924 _Tag) \
5925 IoAcquireRemoveLockEx(_RemoveLock, _Tag, __FILE__, __LINE__, sizeof(IO_REMOVE_LOCK))
5926
5927/*
5928 * VOID
5929 * IoAdjustPagingPathCount(
5930 * IN PLONG Count,
5931 * IN BOOLEAN Increment)
5932 */
5933#define IoAdjustPagingPathCount(_Count, \
5934 _Increment) \
5935{ \
5936 if (_Increment) \
5937 { \
5938 InterlockedIncrement(_Count); \
5939 } \
5940 else \
5941 { \
5942 InterlockedDecrement(_Count); \
5943 } \
5944}
5945
5946NTOSAPI
5947VOID
5948DDKAPI
5949IoAllocateController(
5950 IN PCONTROLLER_OBJECT ControllerObject,
5951 IN PDEVICE_OBJECT DeviceObject,
5952 IN PDRIVER_CONTROL ExecutionRoutine,
5953 IN PVOID Context);
5954
5955NTOSAPI
5956NTSTATUS
5957DDKAPI
5958IoAllocateDriverObjectExtension(
5959 IN PDRIVER_OBJECT DriverObject,
5960 IN PVOID ClientIdentificationAddress,
5961 IN ULONG DriverObjectExtensionSize,
5962 OUT PVOID *DriverObjectExtension);
5963
5964typedef struct _IO_ERROR_LOG_PACKET {
5965 UCHAR MajorFunctionCode;
5966 UCHAR RetryCount;
5967 USHORT DumpDataSize;
5968 USHORT NumberOfStrings;
5969 USHORT StringOffset;
5970 USHORT EventCategory;
5971 NTSTATUS ErrorCode;
5972 ULONG UniqueErrorValue;
5973 NTSTATUS FinalStatus;
5974 ULONG SequenceNumber;
5975 ULONG IoControlCode;
5976 LARGE_INTEGER DeviceOffset;
5977 ULONG DumpData[1];
5978} IO_ERROR_LOG_PACKET, *PIO_ERROR_LOG_PACKET;
5979
5980NTOSAPI
5981PVOID
5982DDKAPI
5983IoAllocateErrorLogEntry(
5984 IN PVOID IoObject,
5985 IN UCHAR EntrySize);
5986
5987NTOSAPI
5988PIRP
5989DDKAPI
5990IoAllocateIrp(
5991 IN CCHAR StackSize,
5992 IN BOOLEAN ChargeQuota);
5993
5994NTOSAPI
5995PMDL
5996DDKAPI
5997IoAllocateMdl(
5998 IN PVOID VirtualAddress,
5999 IN ULONG Length,
6000 IN BOOLEAN SecondaryBuffer,
6001 IN BOOLEAN ChargeQuota,
6002 IN OUT PIRP Irp OPTIONAL);
6003
6004NTOSAPI
6005PIO_WORKITEM
6006DDKAPI
6007IoAllocateWorkItem(
6008 IN PDEVICE_OBJECT DeviceObject);
6009
6010/*
6011 * VOID IoAssignArcName(
6012 * IN PUNICODE_STRING ArcName,
6013 * IN PUNICODE_STRING DeviceName);
6014 */
6015#define IoAssignArcName(_ArcName, _DeviceName) ( \
6016 IoCreateSymbolicLink((_ArcName), (_DeviceName)))
6017
6018NTOSAPI
6019NTSTATUS
6020DDKAPI
6021IoAttachDevice(
6022 IN PDEVICE_OBJECT SourceDevice,
6023 IN PUNICODE_STRING TargetDevice,
6024 OUT PDEVICE_OBJECT *AttachedDevice);
6025
6026NTOSAPI
6027PDEVICE_OBJECT
6028DDKAPI
6029IoAttachDeviceToDeviceStack(
6030 IN PDEVICE_OBJECT SourceDevice,
6031 IN PDEVICE_OBJECT TargetDevice);
6032
6033NTOSAPI
6034PIRP
6035DDKAPI
6036IoBuildAsynchronousFsdRequest(
6037 IN ULONG MajorFunction,
6038 IN PDEVICE_OBJECT DeviceObject,
6039 IN OUT PVOID Buffer OPTIONAL,
6040 IN ULONG Length OPTIONAL,
6041 IN PLARGE_INTEGER StartingOffset OPTIONAL,
6042 IN PIO_STATUS_BLOCK IoStatusBlock OPTIONAL);
6043
6044NTOSAPI
6045PIRP
6046DDKAPI
6047IoBuildDeviceIoControlRequest(
6048 IN ULONG IoControlCode,
6049 IN PDEVICE_OBJECT DeviceObject,
6050 IN PVOID InputBuffer OPTIONAL,
6051 IN ULONG InputBufferLength,
6052 OUT PVOID OutputBuffer OPTIONAL,
6053 IN ULONG OutputBufferLength,
6054 IN BOOLEAN InternalDeviceIoControl,
6055 IN PKEVENT Event,
6056 OUT PIO_STATUS_BLOCK IoStatusBlock);
6057
6058NTOSAPI
6059VOID
6060DDKAPI
6061IoBuildPartialMdl(
6062 IN PMDL SourceMdl,
6063 IN OUT PMDL TargetMdl,
6064 IN PVOID VirtualAddress,
6065 IN ULONG Length);
6066
6067NTOSAPI
6068PIRP
6069DDKAPI
6070IoBuildSynchronousFsdRequest(
6071 IN ULONG MajorFunction,
6072 IN PDEVICE_OBJECT DeviceObject,
6073 IN OUT PVOID Buffer OPTIONAL,
6074 IN ULONG Length OPTIONAL,
6075 IN PLARGE_INTEGER StartingOffset OPTIONAL,
6076 IN PKEVENT Event,
6077 OUT PIO_STATUS_BLOCK IoStatusBlock);
6078
6079NTOSAPI
6080NTSTATUS
6081DDKFASTAPI
6082IofCallDriver(
6083 IN PDEVICE_OBJECT DeviceObject,
6084 IN OUT PIRP Irp);
6085
6086/*
6087 * NTSTATUS
6088 * IoCallDriver(
6089 * IN PDEVICE_OBJECT DeviceObject,
6090 * IN OUT PIRP Irp)
6091 */
6092#define IoCallDriver IofCallDriver
6093
6094NTOSAPI
6095VOID
6096DDKAPI
6097IoCancelFileOpen(
6098 IN PDEVICE_OBJECT DeviceObject,
6099 IN PFILE_OBJECT FileObject);
6100
6101NTOSAPI
6102BOOLEAN
6103DDKAPI
6104IoCancelIrp(
6105 IN PIRP Irp);
6106
6107NTOSAPI
6108NTSTATUS
6109DDKAPI
6110IoCheckShareAccess(
6111 IN ACCESS_MASK DesiredAccess,
6112 IN ULONG DesiredShareAccess,
6113 IN OUT PFILE_OBJECT FileObject,
6114 IN OUT PSHARE_ACCESS ShareAccess,
6115 IN BOOLEAN Update);
6116
6117NTOSAPI
6118VOID
6119DDKFASTAPI
6120IofCompleteRequest(
6121 IN PIRP Irp,
6122 IN CCHAR PriorityBoost);
6123
6124/*
6125 * VOID
6126 * IoCompleteRequest(
6127 * IN PIRP Irp,
6128 * IN CCHAR PriorityBoost)
6129 */
6130#define IoCompleteRequest IofCompleteRequest
6131
6132NTOSAPI
6133NTSTATUS
6134DDKAPI
6135IoConnectInterrupt(
6136 OUT PKINTERRUPT *InterruptObject,
6137 IN PKSERVICE_ROUTINE ServiceRoutine,
6138 IN PVOID ServiceContext,
6139 IN PKSPIN_LOCK SpinLock OPTIONAL,
6140 IN ULONG Vector,
6141 IN KIRQL Irql,
6142 IN KIRQL SynchronizeIrql,
6143 IN KINTERRUPT_MODE InterruptMode,
6144 IN BOOLEAN ShareVector,
6145 IN KAFFINITY ProcessorEnableMask,
6146 IN BOOLEAN FloatingSave);
6147
6148/*
6149 * PIO_STACK_LOCATION
6150 * IoGetCurrentIrpStackLocation(
6151 * IN PIRP Irp)
6152 */
6153#define IoGetCurrentIrpStackLocation(_Irp) \
6154 ((_Irp)->Tail.Overlay.CurrentStackLocation)
6155
6156/*
6157 * PIO_STACK_LOCATION
6158 * IoGetNextIrpStackLocation(
6159 * IN PIRP Irp)
6160 */
6161#define IoGetNextIrpStackLocation(_Irp) \
6162 ((_Irp)->Tail.Overlay.CurrentStackLocation - 1)
6163
6164/*
6165 * VOID
6166 * IoCopyCurrentIrpStackLocationToNext(
6167 * IN PIRP Irp)
6168 */
6169#define IoCopyCurrentIrpStackLocationToNext(_Irp) \
6170{ \
6171 PIO_STACK_LOCATION _IrpSp; \
6172 PIO_STACK_LOCATION _NextIrpSp; \
6173 _IrpSp = IoGetCurrentIrpStackLocation(_Irp); \
6174 _NextIrpSp = IoGetNextIrpStackLocation(_Irp); \
6175 RtlCopyMemory(_NextIrpSp, _IrpSp, \
6176 FIELD_OFFSET(IO_STACK_LOCATION, CompletionRoutine)); \
6177 _NextIrpSp->Control = 0; \
6178}
6179
6180NTOSAPI
6181PCONTROLLER_OBJECT
6182DDKAPI
6183IoCreateController(
6184 IN ULONG Size);
6185
6186NTOSAPI
6187NTSTATUS
6188DDKAPI
6189IoCreateDevice(
6190 IN PDRIVER_OBJECT DriverObject,
6191 IN ULONG DeviceExtensionSize,
6192 IN PUNICODE_STRING DeviceName OPTIONAL,
6193 IN DEVICE_TYPE DeviceType,
6194 IN ULONG DeviceCharacteristics,
6195 IN BOOLEAN Exclusive,
6196 OUT PDEVICE_OBJECT *DeviceObject);
6197
6198NTOSAPI
6199NTSTATUS
6200DDKAPI
6201IoCreateDisk(
6202 IN PDEVICE_OBJECT DeviceObject,
6203 IN PCREATE_DISK Disk);
6204
6205NTOSAPI
6206NTSTATUS
6207DDKAPI
6208IoCreateFile(
6209 OUT PHANDLE FileHandle,
6210 IN ACCESS_MASK DesiredAccess,
6211 IN POBJECT_ATTRIBUTES ObjectAttributes,
6212 OUT PIO_STATUS_BLOCK IoStatusBlock,
6213 IN PLARGE_INTEGER AllocationSize OPTIONAL,
6214 IN ULONG FileAttributes,
6215 IN ULONG ShareAccess,
6216 IN ULONG Disposition,
6217 IN ULONG CreateOptions,
6218 IN PVOID EaBuffer OPTIONAL,
6219 IN ULONG EaLength,
6220 IN CREATE_FILE_TYPE CreateFileType,
6221 IN PVOID ExtraCreateParameters OPTIONAL,
6222 IN ULONG Options);
6223
6224NTOSAPI
6225PKEVENT
6226DDKAPI
6227IoCreateNotificationEvent(
6228 IN PUNICODE_STRING EventName,
6229 OUT PHANDLE EventHandle);
6230
6231NTOSAPI
6232NTSTATUS
6233DDKAPI
6234IoCreateSymbolicLink(
6235 IN PUNICODE_STRING SymbolicLinkName,
6236 IN PUNICODE_STRING DeviceName);
6237
6238NTOSAPI
6239PKEVENT
6240DDKAPI
6241IoCreateSynchronizationEvent(
6242 IN PUNICODE_STRING EventName,
6243 OUT PHANDLE EventHandle);
6244
6245NTOSAPI
6246NTSTATUS
6247DDKAPI
6248IoCreateUnprotectedSymbolicLink(
6249 IN PUNICODE_STRING SymbolicLinkName,
6250 IN PUNICODE_STRING DeviceName);
6251
6252NTOSAPI
6253VOID
6254DDKAPI
6255IoCsqInitialize(
6256 PIO_CSQ Csq,
6257 IN PIO_CSQ_INSERT_IRP CsqInsertIrp,
6258 IN PIO_CSQ_REMOVE_IRP CsqRemoveIrp,
6259 IN PIO_CSQ_PEEK_NEXT_IRP CsqPeekNextIrp,
6260 IN PIO_CSQ_ACQUIRE_LOCK CsqAcquireLock,
6261 IN PIO_CSQ_RELEASE_LOCK CsqReleaseLock,
6262 IN PIO_CSQ_COMPLETE_CANCELED_IRP CsqCompleteCanceledIrp);
6263
6264NTOSAPI
6265VOID
6266DDKAPI
6267IoCsqInsertIrp(
6268 IN PIO_CSQ Csq,
6269 IN PIRP Irp,
6270 IN PIO_CSQ_IRP_CONTEXT Context);
6271
6272NTOSAPI
6273PIRP
6274DDKAPI
6275IoCsqRemoveIrp(
6276 IN PIO_CSQ Csq,
6277 IN PIO_CSQ_IRP_CONTEXT Context);
6278
6279NTOSAPI
6280PIRP
6281DDKAPI
6282IoCsqRemoveNextIrp(
6283 IN PIO_CSQ Csq,
6284 IN PVOID PeekContext);
6285
6286NTOSAPI
6287VOID
6288DDKAPI
6289IoDeleteController(
6290 IN PCONTROLLER_OBJECT ControllerObject);
6291
6292NTOSAPI
6293VOID
6294DDKAPI
6295IoDeleteDevice(
6296 IN PDEVICE_OBJECT DeviceObject);
6297
6298NTOSAPI
6299NTSTATUS
6300DDKAPI
6301IoDeleteSymbolicLink(
6302 IN PUNICODE_STRING SymbolicLinkName);
6303
6304/*
6305 * VOID
6306 * IoDeassignArcName(
6307 * IN PUNICODE_STRING ArcName)
6308 */
6309#define IoDeassignArcName IoDeleteSymbolicLink
6310
6311NTOSAPI
6312VOID
6313DDKAPI
6314IoDetachDevice(
6315 IN OUT PDEVICE_OBJECT TargetDevice);
6316
6317NTOSAPI
6318VOID
6319DDKAPI
6320IoDisconnectInterrupt(
6321 IN PKINTERRUPT InterruptObject);
6322
6323NTOSAPI
6324BOOLEAN
6325DDKAPI
6326IoForwardIrpSynchronously(
6327 IN PDEVICE_OBJECT DeviceObject,
6328 IN PIRP Irp);
6329
6330#define IoForwardAndCatchIrp IoForwardIrpSynchronously
6331
6332NTOSAPI
6333VOID
6334DDKAPI
6335IoFreeController(
6336 IN PCONTROLLER_OBJECT ControllerObject);
6337
6338NTOSAPI
6339VOID
6340DDKAPI
6341IoFreeErrorLogEntry(
6342 PVOID ElEntry);
6343
6344NTOSAPI
6345VOID
6346DDKAPI
6347IoFreeIrp(
6348 IN PIRP Irp);
6349
6350NTOSAPI
6351VOID
6352DDKAPI
6353IoFreeMdl(
6354 IN PMDL Mdl);
6355
6356NTOSAPI
6357VOID
6358DDKAPI
6359IoFreeWorkItem(
6360 IN PIO_WORKITEM pIOWorkItem);
6361
6362NTOSAPI
6363PDEVICE_OBJECT
6364DDKAPI
6365IoGetAttachedDevice(
6366 IN PDEVICE_OBJECT DeviceObject);
6367
6368NTOSAPI
6369PDEVICE_OBJECT
6370DDKAPI
6371IoGetAttachedDeviceReference(
6372 IN PDEVICE_OBJECT DeviceObject);
6373
6374NTOSAPI
6375NTSTATUS
6376DDKAPI
6377IoGetBootDiskInformation(
6378 IN OUT PBOOTDISK_INFORMATION BootDiskInformation,
6379 IN ULONG Size);
6380
6381NTOSAPI
6382PCONFIGURATION_INFORMATION
6383DDKAPI
6384IoGetConfigurationInformation(
6385 VOID);
6386
6387NTOSAPI
6388PEPROCESS
6389DDKAPI
6390IoGetCurrentProcess(
6391 VOID);
6392
6393NTOSAPI
6394NTSTATUS
6395DDKAPI
6396IoGetDeviceInterfaceAlias(
6397 IN PUNICODE_STRING SymbolicLinkName,
6398 IN CONST GUID *AliasInterfaceClassGuid,
6399 OUT PUNICODE_STRING AliasSymbolicLinkName);
6400
6401NTOSAPI
6402NTSTATUS
6403DDKAPI
6404IoGetDeviceInterfaces(
6405 IN CONST GUID *InterfaceClassGuid,
6406 IN PDEVICE_OBJECT PhysicalDeviceObject OPTIONAL,
6407 IN ULONG Flags,
6408 OUT PWSTR *SymbolicLinkList);
6409
6410NTOSAPI
6411NTSTATUS
6412DDKAPI
6413IoGetDeviceObjectPointer(
6414 IN PUNICODE_STRING ObjectName,
6415 IN ACCESS_MASK DesiredAccess,
6416 OUT PFILE_OBJECT *FileObject,
6417 OUT PDEVICE_OBJECT *DeviceObject);
6418
6419NTOSAPI
6420NTSTATUS
6421DDKAPI
6422IoGetDeviceProperty(
6423 IN PDEVICE_OBJECT DeviceObject,
6424 IN DEVICE_REGISTRY_PROPERTY DeviceProperty,
6425 IN ULONG BufferLength,
6426 OUT PVOID PropertyBuffer,
6427 OUT PULONG ResultLength);
6428
6429NTOSAPI
6430PDEVICE_OBJECT
6431DDKAPI
6432IoGetDeviceToVerify(
6433 IN PETHREAD Thread);
6434
6435NTOSAPI
6436PDMA_ADAPTER
6437DDKAPI
6438IoGetDmaAdapter(
6439 IN PDEVICE_OBJECT PhysicalDeviceObject,
6440 IN PDEVICE_DESCRIPTION DeviceDescription,
6441 IN OUT PULONG NumberOfMapRegisters);
6442
6443NTOSAPI
6444PVOID
6445DDKAPI
6446IoGetDriverObjectExtension(
6447 IN PDRIVER_OBJECT DriverObject,
6448 IN PVOID ClientIdentificationAddress);
6449
6450NTOSAPI
6451PGENERIC_MAPPING
6452DDKAPI
6453IoGetFileObjectGenericMapping(
6454 VOID);
6455
6456/*
6457 * ULONG
6458 * IoGetFunctionCodeFromCtlCode(
6459 * IN ULONG ControlCode)
6460 */
6461#define IoGetFunctionCodeFromCtlCode(_ControlCode) \
6462 (((_ControlCode) >> 2) & 0x00000FFF)
6463
6464NTOSAPI
6465PVOID
6466DDKAPI
6467IoGetInitialStack(
6468 VOID);
6469
6470NTOSAPI
6471PDEVICE_OBJECT
6472DDKAPI
6473IoGetRelatedDeviceObject(
6474 IN PFILE_OBJECT FileObject);
6475
6476NTOSAPI
6477ULONG
6478DDKAPI
6479IoGetRemainingStackSize(
6480 VOID);
6481
6482NTOSAPI
6483VOID
6484DDKAPI
6485IoGetStackLimits(
6486 OUT PULONG_PTR LowLimit,
6487 OUT PULONG_PTR HighLimit);
6488
6489NTOSAPI
6490VOID
6491DDKAPI
6492KeInitializeDpc(
6493 IN PRKDPC Dpc,
6494 IN PKDEFERRED_ROUTINE DeferredRoutine,
6495 IN PVOID DeferredContext);
6496
6497/*
6498 * VOID
6499 * IoInitializeDpcRequest(
6500 * IN PDEVICE_OBJECT DeviceObject,
6501 * IN PIO_DPC_ROUTINE DpcRoutine)
6502 */
6503#define IoInitializeDpcRequest(_DeviceObject, \
6504 _DpcRoutine) \
6505 KeInitializeDpc(&(_DeviceObject)->Dpc, \
6506 (PKDEFERRED_ROUTINE) (_DpcRoutine), \
6507 _DeviceObject)
6508
6509NTOSAPI
6510VOID
6511DDKAPI
6512IoInitializeIrp(
6513 IN OUT PIRP Irp,
6514 IN USHORT PacketSize,
6515 IN CCHAR StackSize);
6516
6517NTOSAPI
6518VOID
6519DDKAPI
6520IoInitializeRemoveLockEx(
6521 IN PIO_REMOVE_LOCK Lock,
6522 IN ULONG AllocateTag,
6523 IN ULONG MaxLockedMinutes,
6524 IN ULONG HighWatermark,
6525 IN ULONG RemlockSize);
6526
6527/* VOID
6528 * IoInitializeRemoveLock(
6529 * IN PIO_REMOVE_LOCK Lock,
6530 * IN ULONG AllocateTag,
6531 * IN ULONG MaxLockedMinutes,
6532 * IN ULONG HighWatermark)
6533 */
6534#define IoInitializeRemoveLock( \
6535 Lock, AllocateTag, MaxLockedMinutes, HighWatermark) \
6536 IoInitializeRemoveLockEx(Lock, AllocateTag, MaxLockedMinutes, \
6537 HighWatermark, sizeof(IO_REMOVE_LOCK))
6538
6539NTOSAPI
6540NTSTATUS
6541DDKAPI
6542IoInitializeTimer(
6543 IN PDEVICE_OBJECT DeviceObject,
6544 IN PIO_TIMER_ROUTINE TimerRoutine,
6545 IN PVOID Context);
6546
6547NTOSAPI
6548VOID
6549DDKAPI
6550IoInvalidateDeviceRelations(
6551 IN PDEVICE_OBJECT DeviceObject,
6552 IN DEVICE_RELATION_TYPE Type);
6553
6554NTOSAPI
6555VOID
6556DDKAPI
6557IoInvalidateDeviceState(
6558 IN PDEVICE_OBJECT PhysicalDeviceObject);
6559
6560NTOSAPI
6561BOOLEAN
6562DDKAPI
6563IoIs32bitProcess(
6564 IN PIRP Irp OPTIONAL);
6565
6566/*
6567 * BOOLEAN
6568 * IoIsErrorUserInduced(
6569 * IN NTSTATUS Status);
6570 */
6571#define IoIsErrorUserInduced(Status) \
6572 ((BOOLEAN)(((Status) == STATUS_DEVICE_NOT_READY) || \
6573 ((Status) == STATUS_IO_TIMEOUT) || \
6574 ((Status) == STATUS_MEDIA_WRITE_PROTECTED) || \
6575 ((Status) == STATUS_NO_MEDIA_IN_DEVICE) || \
6576 ((Status) == STATUS_VERIFY_REQUIRED) || \
6577 ((Status) == STATUS_UNRECOGNIZED_MEDIA) || \
6578 ((Status) == STATUS_WRONG_VOLUME)))
6579
6580NTOSAPI
6581BOOLEAN
6582DDKAPI
6583IoIsWdmVersionAvailable(
6584 IN UCHAR MajorVersion,
6585 IN UCHAR MinorVersion);
6586
6587NTOSAPI
6588PIRP
6589DDKAPI
6590IoMakeAssociatedIrp(
6591 IN PIRP Irp,
6592 IN CCHAR StackSize);
6593
6594/*
6595 * VOID
6596 * IoMarkIrpPending(
6597 * IN OUT PIRP Irp)
6598 */
6599#define IoMarkIrpPending(_Irp) \
6600 (IoGetCurrentIrpStackLocation(_Irp)->Control |= SL_PENDING_RETURNED)
6601
6602NTOSAPI
6603NTSTATUS
6604DDKAPI
6605IoOpenDeviceInterfaceRegistryKey(
6606 IN PUNICODE_STRING SymbolicLinkName,
6607 IN ACCESS_MASK DesiredAccess,
6608 OUT PHANDLE DeviceInterfaceKey);
6609
6610NTOSAPI
6611NTSTATUS
6612DDKAPI
6613IoOpenDeviceRegistryKey(
6614 IN PDEVICE_OBJECT DeviceObject,
6615 IN ULONG DevInstKeyType,
6616 IN ACCESS_MASK DesiredAccess,
6617 OUT PHANDLE DevInstRegKey);
6618
6619NTOSAPI
6620NTSTATUS
6621DDKAPI
6622IoQueryDeviceDescription(
6623 IN PINTERFACE_TYPE BusType OPTIONAL,
6624 IN PULONG BusNumber OPTIONAL,
6625 IN PCONFIGURATION_TYPE ControllerType OPTIONAL,
6626 IN PULONG ControllerNumber OPTIONAL,
6627 IN PCONFIGURATION_TYPE PeripheralType OPTIONAL,
6628 IN PULONG PeripheralNumber OPTIONAL,
6629 IN PIO_QUERY_DEVICE_ROUTINE CalloutRoutine,
6630 IN PVOID Context);
6631
6632NTOSAPI
6633VOID
6634DDKAPI
6635IoQueueWorkItem(
6636 IN PIO_WORKITEM pIOWorkItem,
6637 IN PIO_WORKITEM_ROUTINE Routine,
6638 IN WORK_QUEUE_TYPE QueueType,
6639 IN PVOID Context);
6640
6641NTOSAPI
6642VOID
6643DDKAPI
6644IoRaiseHardError(
6645 IN PIRP Irp,
6646 IN PVPB Vpb OPTIONAL,
6647 IN PDEVICE_OBJECT RealDeviceObject);
6648
6649NTOSAPI
6650BOOLEAN
6651DDKAPI
6652IoRaiseInformationalHardError(
6653 IN NTSTATUS ErrorStatus,
6654 IN PUNICODE_STRING String OPTIONAL,
6655 IN PKTHREAD Thread OPTIONAL);
6656
6657NTOSAPI
6658NTSTATUS
6659DDKAPI
6660IoReadDiskSignature(
6661 IN PDEVICE_OBJECT DeviceObject,
6662 IN ULONG BytesPerSector,
6663 OUT PDISK_SIGNATURE Signature);
6664
6665NTOSAPI
6666NTSTATUS
6667DDKAPI
6668IoReadPartitionTableEx(
6669 IN PDEVICE_OBJECT DeviceObject,
6670 IN struct _DRIVE_LAYOUT_INFORMATION_EX **PartitionBuffer);
6671
6672NTOSAPI
6673VOID
6674DDKAPI
6675IoRegisterBootDriverReinitialization(
6676 IN PDRIVER_OBJECT DriverObject,
6677 IN PDRIVER_REINITIALIZE DriverReinitializationRoutine,
6678 IN PVOID Context);
6679
6680NTOSAPI
6681VOID
6682DDKAPI
6683IoRegisterBootDriverReinitialization(
6684 IN PDRIVER_OBJECT DriverObject,
6685 IN PDRIVER_REINITIALIZE DriverReinitializationRoutine,
6686 IN PVOID Context);
6687
6688NTOSAPI
6689NTSTATUS
6690DDKAPI
6691IoRegisterDeviceInterface(
6692 IN PDEVICE_OBJECT PhysicalDeviceObject,
6693 IN CONST GUID *InterfaceClassGuid,
6694 IN PUNICODE_STRING ReferenceString OPTIONAL,
6695 OUT PUNICODE_STRING SymbolicLinkName);
6696
6697NTOSAPI
6698VOID
6699DDKAPI
6700IoRegisterDriverReinitialization(
6701 IN PDRIVER_OBJECT DriverObject,
6702 IN PDRIVER_REINITIALIZE DriverReinitializationRoutine,
6703 IN PVOID Context);
6704
6705NTOSAPI
6706NTSTATUS
6707DDKAPI
6708IoRegisterPlugPlayNotification(
6709 IN IO_NOTIFICATION_EVENT_CATEGORY EventCategory,
6710 IN ULONG EventCategoryFlags,
6711 IN PVOID EventCategoryData OPTIONAL,
6712 IN PDRIVER_OBJECT DriverObject,
6713 IN PDRIVER_NOTIFICATION_CALLBACK_ROUTINE CallbackRoutine,
6714 IN PVOID Context,
6715 OUT PVOID *NotificationEntry);
6716
6717NTOSAPI
6718NTSTATUS
6719DDKAPI
6720IoRegisterShutdownNotification(
6721 IN PDEVICE_OBJECT DeviceObject);
6722
6723NTOSAPI
6724VOID
6725DDKAPI
6726IoReleaseCancelSpinLock(
6727 IN KIRQL Irql);
6728
6729NTOSAPI
6730VOID
6731DDKAPI
6732IoReleaseRemoveLockAndWaitEx(
6733 IN PIO_REMOVE_LOCK RemoveLock,
6734 IN PVOID Tag,
6735 IN ULONG RemlockSize);
6736
6737/*
6738 * VOID
6739 * IoReleaseRemoveLockAndWait(
6740 * IN PIO_REMOVE_LOCK RemoveLock,
6741 * IN PVOID Tag)
6742 */
6743#define IoReleaseRemoveLockAndWait(_RemoveLock, \
6744 _Tag) \
6745 IoReleaseRemoveLockAndWaitEx(_RemoveLock, _Tag, sizeof(IO_REMOVE_LOCK))
6746
6747NTOSAPI
6748VOID
6749DDKAPI
6750IoReleaseRemoveLockEx(
6751 IN PIO_REMOVE_LOCK RemoveLock,
6752 IN PVOID Tag,
6753 IN ULONG RemlockSize);
6754
6755/*
6756 * VOID
6757 * IoReleaseRemoveLock(
6758 * IN PIO_REMOVE_LOCK RemoveLock,
6759 * IN PVOID Tag)
6760 */
6761#define IoReleaseRemoveLock(_RemoveLock, \
6762 _Tag) \
6763 IoReleaseRemoveLockEx(_RemoveLock, _Tag, sizeof(IO_REMOVE_LOCK))
6764
6765NTOSAPI
6766VOID
6767DDKAPI
6768IoRemoveShareAccess(
6769 IN PFILE_OBJECT FileObject,
6770 IN OUT PSHARE_ACCESS ShareAccess);
6771
6772NTOSAPI
6773NTSTATUS
6774DDKAPI
6775IoReportDetectedDevice(
6776 IN PDRIVER_OBJECT DriverObject,
6777 IN INTERFACE_TYPE LegacyBusType,
6778 IN ULONG BusNumber,
6779 IN ULONG SlotNumber,
6780 IN PCM_RESOURCE_LIST ResourceList,
6781 IN PIO_RESOURCE_REQUIREMENTS_LIST ResourceRequirements OPTIONAL,
6782 IN BOOLEAN ResourceAssigned,
6783 IN OUT PDEVICE_OBJECT *DeviceObject);
6784
6785NTOSAPI
6786NTSTATUS
6787DDKAPI
6788IoReportResourceForDetection(
6789 IN PDRIVER_OBJECT DriverObject,
6790 IN PCM_RESOURCE_LIST DriverList OPTIONAL,
6791 IN ULONG DriverListSize OPTIONAL,
6792 IN PDEVICE_OBJECT DeviceObject OPTIONAL,
6793 IN PCM_RESOURCE_LIST DeviceList OPTIONAL,
6794 IN ULONG DeviceListSize OPTIONAL,
6795 OUT PBOOLEAN ConflictDetected);
6796
6797NTOSAPI
6798NTSTATUS
6799DDKAPI
6800IoReportResourceUsage(
6801 IN PUNICODE_STRING DriverClassName OPTIONAL,
6802 IN PDRIVER_OBJECT DriverObject,
6803 IN PCM_RESOURCE_LIST DriverList OPTIONAL,
6804 IN ULONG DriverListSize OPTIONAL,
6805 IN PDEVICE_OBJECT DeviceObject,
6806 IN PCM_RESOURCE_LIST DeviceList OPTIONAL,
6807 IN ULONG DeviceListSize OPTIONAL,
6808 IN BOOLEAN OverrideConflict,
6809 OUT PBOOLEAN ConflictDetected);
6810
6811NTOSAPI
6812NTSTATUS
6813DDKAPI
6814IoReportTargetDeviceChange(
6815 IN PDEVICE_OBJECT PhysicalDeviceObject,
6816 IN PVOID NotificationStructure);
6817
6818NTOSAPI
6819NTSTATUS
6820DDKAPI
6821IoReportTargetDeviceChangeAsynchronous(
6822 IN PDEVICE_OBJECT PhysicalDeviceObject,
6823 IN PVOID NotificationStructure,
6824 IN PDEVICE_CHANGE_COMPLETE_CALLBACK Callback OPTIONAL,
6825 IN PVOID Context OPTIONAL);
6826
6827NTOSAPI
6828VOID
6829DDKAPI
6830IoRequestDeviceEject(
6831 IN PDEVICE_OBJECT PhysicalDeviceObject);
6832
6833/*
6834 * VOID
6835 * IoRequestDpc(
6836 * IN PDEVICE_OBJECT DeviceObject,
6837 * IN PIRP Irp,
6838 * IN PVOID Context);
6839 */
6840#define IoRequestDpc(DeviceObject, Irp, Context)( \
6841 KeInsertQueueDpc(&(DeviceObject)->Dpc, (Irp), (Context)))
6842
6843NTOSAPI
6844VOID
6845DDKAPI
6846IoReuseIrp(
6847 IN OUT PIRP Irp,
6848 IN NTSTATUS Status);
6849
6850/*
6851 * PDRIVER_CANCEL
6852 * IoSetCancelRoutine(
6853 * IN PIRP Irp,
6854 * IN PDRIVER_CANCEL CancelRoutine)
6855 */
6856#define IoSetCancelRoutine(_Irp, \
6857 _CancelRoutine) \
6858 ((PDRIVER_CANCEL) InterlockedExchangePointer( \
6859 (PVOID *) &(_Irp)->CancelRoutine, (PVOID) (_CancelRoutine)))
6860
6861/*
6862 * VOID
6863 * IoSetCompletionRoutine(
6864 * IN PIRP Irp,
6865 * IN PIO_COMPLETION_ROUTINE CompletionRoutine,
6866 * IN PVOID Context,
6867 * IN BOOLEAN InvokeOnSuccess,
6868 * IN BOOLEAN InvokeOnError,
6869 * IN BOOLEAN InvokeOnCancel)
6870 */
6871#define IoSetCompletionRoutine(_Irp, \
6872 _CompletionRoutine, \
6873 _Context, \
6874 _InvokeOnSuccess, \
6875 _InvokeOnError, \
6876 _InvokeOnCancel) \
6877{ \
6878 PIO_STACK_LOCATION _IrpSp; \
6879 ASSERT(_InvokeOnSuccess || _InvokeOnError || _InvokeOnCancel ? \
6880 _CompletionRoutine != NULL : TRUE); \
6881 _IrpSp = IoGetNextIrpStackLocation(_Irp); \
6882 _IrpSp->CompletionRoutine = (PIO_COMPLETION_ROUTINE)(_CompletionRoutine); \
6883 _IrpSp->Context = (_Context); \
6884 _IrpSp->Control = 0; \
6885 if (_InvokeOnSuccess) _IrpSp->Control = SL_INVOKE_ON_SUCCESS; \
6886 if (_InvokeOnError) _IrpSp->Control |= SL_INVOKE_ON_ERROR; \
6887 if (_InvokeOnCancel) _IrpSp->Control |= SL_INVOKE_ON_CANCEL; \
6888}
6889
6890NTOSAPI
6891VOID
6892DDKAPI
6893IoSetCompletionRoutineEx(
6894 IN PDEVICE_OBJECT DeviceObject,
6895 IN PIRP Irp,
6896 IN PIO_COMPLETION_ROUTINE CompletionRoutine,
6897 IN PVOID Context,
6898 IN BOOLEAN InvokeOnSuccess,
6899 IN BOOLEAN InvokeOnError,
6900 IN BOOLEAN InvokeOnCancel);
6901
6902NTOSAPI
6903NTSTATUS
6904DDKAPI
6905IoSetDeviceInterfaceState(
6906 IN PUNICODE_STRING SymbolicLinkName,
6907 IN BOOLEAN Enable);
6908
6909NTOSAPI
6910VOID
6911DDKAPI
6912IoSetHardErrorOrVerifyDevice(
6913 IN PIRP Irp,
6914 IN PDEVICE_OBJECT DeviceObject);
6915
6916/*
6917 * VOID
6918 * IoSetNextIrpStackLocation(
6919 * IN OUT PIRP Irp)
6920 */
6921#define IoSetNextIrpStackLocation(_Irp) \
6922{ \
6923 (_Irp)->CurrentLocation--; \
6924 (_Irp)->Tail.Overlay.CurrentStackLocation--; \
6925}
6926
6927NTOSAPI
6928NTSTATUS
6929DDKAPI
6930IoSetPartitionInformationEx(
6931 IN PDEVICE_OBJECT DeviceObject,
6932 IN ULONG PartitionNumber,
6933 IN struct _SET_PARTITION_INFORMATION_EX *PartitionInfo);
6934
6935NTOSAPI
6936VOID
6937DDKAPI
6938IoSetShareAccess(
6939 IN ACCESS_MASK DesiredAccess,
6940 IN ULONG DesiredShareAccess,
6941 IN OUT PFILE_OBJECT FileObject,
6942 OUT PSHARE_ACCESS ShareAccess);
6943
6944NTOSAPI
6945VOID
6946DDKAPI
6947IoSetStartIoAttributes(
6948 IN PDEVICE_OBJECT DeviceObject,
6949 IN BOOLEAN DeferredStartIo,
6950 IN BOOLEAN NonCancelable);
6951
6952NTOSAPI
6953NTSTATUS
6954DDKAPI
6955IoSetSystemPartition(
6956 IN PUNICODE_STRING VolumeNameString);
6957
6958NTOSAPI
6959BOOLEAN
6960DDKAPI
6961IoSetThreadHardErrorMode(
6962 IN BOOLEAN EnableHardErrors);
6963
6964/*
6965 * USHORT
6966 * IoSizeOfIrp(
6967 * IN CCHAR StackSize)
6968 */
6969#define IoSizeOfIrp(_StackSize) \
6970 ((USHORT) (sizeof(IRP) + ((_StackSize) * (sizeof(IO_STACK_LOCATION)))))
6971
6972/*
6973 * VOID
6974 * IoSkipCurrentIrpStackLocation(
6975 * IN PIRP Irp)
6976 */
6977#define IoSkipCurrentIrpStackLocation(_Irp) \
6978{ \
6979 (_Irp)->CurrentLocation++; \
6980 (_Irp)->Tail.Overlay.CurrentStackLocation++; \
6981}
6982
6983NTOSAPI
6984VOID
6985DDKAPI
6986IoStartNextPacket(
6987 IN PDEVICE_OBJECT DeviceObject,
6988 IN BOOLEAN Cancelable);
6989
6990NTOSAPI
6991VOID
6992DDKAPI
6993IoStartNextPacketByKey(
6994 IN PDEVICE_OBJECT DeviceObject,
6995 IN BOOLEAN Cancelable,
6996 IN ULONG Key);
6997
6998NTOSAPI
6999VOID
7000DDKAPI
7001IoStartPacket(
7002 IN PDEVICE_OBJECT DeviceObject,
7003 IN PIRP Irp,
7004 IN PULONG Key OPTIONAL,
7005 IN PDRIVER_CANCEL CancelFunction OPTIONAL);
7006
7007NTOSAPI
7008VOID
7009DDKAPI
7010IoStartTimer(
7011 IN PDEVICE_OBJECT DeviceObject);
7012
7013NTOSAPI
7014VOID
7015DDKAPI
7016IoStopTimer(
7017 IN PDEVICE_OBJECT DeviceObject);
7018
7019NTOSAPI
7020NTSTATUS
7021DDKAPI
7022IoUnregisterPlugPlayNotification(
7023 IN PVOID NotificationEntry);
7024
7025NTOSAPI
7026VOID
7027DDKAPI
7028IoUnregisterShutdownNotification(
7029 IN PDEVICE_OBJECT DeviceObject);
7030
7031NTOSAPI
7032VOID
7033DDKAPI
7034IoUpdateShareAccess(
7035 IN PFILE_OBJECT FileObject,
7036 IN OUT PSHARE_ACCESS ShareAccess);
7037
7038NTOSAPI
7039NTSTATUS
7040DDKAPI
7041IoVerifyPartitionTable(
7042 IN PDEVICE_OBJECT DeviceObject,
7043 IN BOOLEAN FixErrors);
7044
7045NTOSAPI
7046NTSTATUS
7047DDKAPI
7048IoVolumeDeviceToDosName(
7049 IN PVOID VolumeDeviceObject,
7050 OUT PUNICODE_STRING DosName);
7051
7052NTOSAPI
7053NTSTATUS
7054DDKAPI
7055IoWMIAllocateInstanceIds(
7056 IN GUID *Guid,
7057 IN ULONG InstanceCount,
7058 OUT ULONG *FirstInstanceId);
7059
7060NTOSAPI
7061ULONG
7062DDKAPI
7063IoWMIDeviceObjectToProviderId(
7064 IN PDEVICE_OBJECT DeviceObject);
7065
7066NTOSAPI
7067NTSTATUS
7068DDKAPI
7069IoWMIDeviceObjectToInstanceName(
7070 IN PVOID DataBlockObject,
7071 IN PDEVICE_OBJECT DeviceObject,
7072 OUT PUNICODE_STRING InstanceName);
7073
7074NTOSAPI
7075NTSTATUS
7076DDKAPI
7077IoWMIExecuteMethod(
7078 IN PVOID DataBlockObject,
7079 IN PUNICODE_STRING InstanceName,
7080 IN ULONG MethodId,
7081 IN ULONG InBufferSize,
7082 IN OUT PULONG OutBufferSize,
7083 IN OUT PUCHAR InOutBuffer);
7084
7085NTOSAPI
7086NTSTATUS
7087DDKAPI
7088IoWMIHandleToInstanceName(
7089 IN PVOID DataBlockObject,
7090 IN HANDLE FileHandle,
7091 OUT PUNICODE_STRING InstanceName);
7092
7093NTOSAPI
7094NTSTATUS
7095DDKAPI
7096IoWMIOpenBlock(
7097 IN GUID *DataBlockGuid,
7098 IN ULONG DesiredAccess,
7099 OUT PVOID *DataBlockObject);
7100
7101NTOSAPI
7102NTSTATUS
7103DDKAPI
7104IoWMIQueryAllData(
7105 IN PVOID DataBlockObject,
7106 IN OUT ULONG *InOutBufferSize,
7107 OUT PVOID OutBuffer);
7108
7109NTOSAPI
7110NTSTATUS
7111DDKAPI
7112IoWMIQueryAllDataMultiple(
7113 IN PVOID *DataBlockObjectList,
7114 IN ULONG ObjectCount,
7115 IN OUT ULONG *InOutBufferSize,
7116 OUT PVOID OutBuffer);
7117
7118NTOSAPI
7119NTSTATUS
7120DDKAPI
7121IoWMIQuerySingleInstance(
7122 IN PVOID DataBlockObject,
7123 IN PUNICODE_STRING InstanceName,
7124 IN OUT ULONG *InOutBufferSize,
7125 OUT PVOID OutBuffer);
7126
7127NTOSAPI
7128NTSTATUS
7129DDKAPI
7130IoWMIQuerySingleInstanceMultiple(
7131 IN PVOID *DataBlockObjectList,
7132 IN PUNICODE_STRING InstanceNames,
7133 IN ULONG ObjectCount,
7134 IN OUT ULONG *InOutBufferSize,
7135 OUT PVOID OutBuffer);
7136
7137NTOSAPI
7138NTSTATUS
7139DDKAPI
7140IoWMIRegistrationControl(
7141 IN PDEVICE_OBJECT DeviceObject,
7142 IN ULONG Action);
7143
7144NTOSAPI
7145NTSTATUS
7146DDKAPI
7147IoWMISetNotificationCallback(
7148 IN PVOID Object,
7149 IN WMI_NOTIFICATION_CALLBACK Callback,
7150 IN PVOID Context);
7151
7152NTOSAPI
7153NTSTATUS
7154DDKAPI
7155IoWMISetSingleInstance(
7156 IN PVOID DataBlockObject,
7157 IN PUNICODE_STRING InstanceName,
7158 IN ULONG Version,
7159 IN ULONG ValueBufferSize,
7160 IN PVOID ValueBuffer);
7161
7162NTOSAPI
7163NTSTATUS
7164DDKAPI
7165IoWMISetSingleItem(
7166 IN PVOID DataBlockObject,
7167 IN PUNICODE_STRING InstanceName,
7168 IN ULONG DataItemId,
7169 IN ULONG Version,
7170 IN ULONG ValueBufferSize,
7171 IN PVOID ValueBuffer);
7172
7173NTOSAPI
7174NTSTATUS
7175DDKAPI
7176IoWMISuggestInstanceName(
7177 IN PDEVICE_OBJECT PhysicalDeviceObject OPTIONAL,
7178 IN PUNICODE_STRING SymbolicLinkName OPTIONAL,
7179 IN BOOLEAN CombineNames,
7180 OUT PUNICODE_STRING SuggestedInstanceName);
7181
7182NTOSAPI
7183NTSTATUS
7184DDKAPI
7185IoWMIWriteEvent(
7186 IN PVOID WnodeEventItem);
7187
7188NTOSAPI
7189VOID
7190DDKAPI
7191IoWriteErrorLogEntry(
7192 IN PVOID ElEntry);
7193
7194NTOSAPI
7195NTSTATUS
7196DDKAPI
7197IoWritePartitionTableEx(
7198 IN PDEVICE_OBJECT DeviceObject,
7199 IN struct _DRIVE_LAYOUT_INFORMATION_EX *PartitionBuffer);
7200
7201
7202
7203/** Kernel routines **/
7204
7205NTOSAPI
7206VOID
7207DDKFASTAPI
7208KeAcquireInStackQueuedSpinLock(
7209 IN PKSPIN_LOCK SpinLock,
7210 IN PKLOCK_QUEUE_HANDLE LockHandle);
7211
7212NTOSAPI
7213VOID
7214DDKFASTAPI
7215KeAcquireInStackQueuedSpinLockAtDpcLevel(
7216 IN PKSPIN_LOCK SpinLock,
7217 IN PKLOCK_QUEUE_HANDLE LockHandle);
7218
7219NTOSAPI
7220KIRQL
7221DDKAPI
7222KeAcquireInterruptSpinLock(
7223 IN PKINTERRUPT Interrupt);
7224
7225NTOSAPI
7226VOID
7227DDKAPI
7228KeAcquireSpinLock(
7229 IN PKSPIN_LOCK SpinLock,
7230 OUT PKIRQL OldIrql);
7231
7232/* System Service Dispatch Table */
7233typedef PVOID (NTAPI * SSDT)(VOID);
7234typedef SSDT * PSSDT;
7235
7236/* System Service Parameters Table */
7237typedef UCHAR SSPT, * PSSPT;
7238
7239typedef struct _SSDT_ENTRY {
7240 PSSDT SSDT;
7241 PULONG ServiceCounterTable;
7242 ULONG NumberOfServices;
7243 PSSPT SSPT;
7244} SSDT_ENTRY, *PSSDT_ENTRY;
7245
7246NTOSAPI
7247BOOLEAN
7248DDKAPI
7249KeAddSystemServiceTable(
7250 IN PSSDT SSDT,
7251 IN PULONG ServiceCounterTable,
7252 IN ULONG NumberOfServices,
7253 IN PSSPT SSPT,
7254 IN ULONG TableIndex);
7255
7256NTOSAPI
7257BOOLEAN
7258DDKAPI
7259KeAreApcsDisabled(
7260 VOID);
7261
7262NTOSAPI
7263VOID
7264DDKAPI
7265KeAttachProcess(
7266 IN PEPROCESS Process);
7267
7268NTOSAPI
7269VOID
7270DDKAPI
7271KeBugCheck(
7272 IN ULONG BugCheckCode);
7273
7274NTOSAPI
7275VOID
7276DDKAPI
7277KeBugCheckEx(
7278 IN ULONG BugCheckCode,
7279 IN ULONG_PTR BugCheckParameter1,
7280 IN ULONG_PTR BugCheckParameter2,
7281 IN ULONG_PTR BugCheckParameter3,
7282 IN ULONG_PTR BugCheckParameter4);
7283
7284NTOSAPI
7285BOOLEAN
7286DDKAPI
7287KeCancelTimer(
7288 IN PKTIMER Timer);
7289
7290NTOSAPI
7291VOID
7292DDKAPI
7293KeClearEvent(
7294 IN PRKEVENT Event);
7295
7296NTOSAPI
7297NTSTATUS
7298DDKAPI
7299KeDelayExecutionThread(
7300 IN KPROCESSOR_MODE WaitMode,
7301 IN BOOLEAN Alertable,
7302 IN PLARGE_INTEGER Interval);
7303
7304NTOSAPI
7305BOOLEAN
7306DDKAPI
7307KeDeregisterBugCheckCallback(
7308 IN PKBUGCHECK_CALLBACK_RECORD CallbackRecord);
7309
7310NTOSAPI
7311VOID
7312DDKAPI
7313KeDetachProcess(
7314 VOID);
7315
7316NTOSAPI
7317VOID
7318DDKAPI
7319KeEnterCriticalRegion(
7320 VOID);
7321
7322/*
7323 * VOID
7324 * KeFlushIoBuffers(
7325 * IN PMDL Mdl,
7326 * IN BOOLEAN ReadOperation,
7327 * IN BOOLEAN DmaOperation)
7328 */
7329#define KeFlushIoBuffers(_Mdl, _ReadOperation, _DmaOperation)
7330
7331NTOSAPI
7332PRKTHREAD
7333DDKAPI
7334KeGetCurrentThread(
7335 VOID);
7336
7337NTOSAPI
7338KPROCESSOR_MODE
7339DDKAPI
7340KeGetPreviousMode(
7341 VOID);
7342
7343NTOSAPI
7344ULONG
7345DDKAPI
7346KeGetRecommendedSharedDataAlignment(
7347 VOID);
7348
7349NTOSAPI
7350VOID
7351DDKAPI
7352KeInitializeApc(
7353 IN PKAPC Apc,
7354 IN PKTHREAD Thread,
7355 IN UCHAR StateIndex,
7356 IN PKKERNEL_ROUTINE KernelRoutine,
7357 IN PKRUNDOWN_ROUTINE RundownRoutine,
7358 IN PKNORMAL_ROUTINE NormalRoutine,
7359 IN UCHAR Mode,
7360 IN PVOID Context);
7361
7362NTOSAPI
7363VOID
7364DDKAPI
7365KeInitializeDeviceQueue(
7366 IN PKDEVICE_QUEUE DeviceQueue);
7367
7368NTOSAPI
7369VOID
7370DDKAPI
7371KeInitializeMutex(
7372 IN PRKMUTEX Mutex,
7373 IN ULONG Level);
7374
7375NTOSAPI
7376VOID
7377DDKAPI
7378KeInitializeSemaphore(
7379 IN PRKSEMAPHORE Semaphore,
7380 IN LONG Count,
7381 IN LONG Limit);
7382
7383NTOSAPI
7384VOID
7385DDKAPI
7386KeInitializeSpinLock(
7387 IN PKSPIN_LOCK SpinLock);
7388
7389NTOSAPI
7390VOID
7391DDKAPI
7392KeInitializeTimer(
7393 IN PKTIMER Timer);
7394
7395NTOSAPI
7396VOID
7397DDKAPI
7398KeInitializeTimerEx(
7399 IN PKTIMER Timer,
7400 IN TIMER_TYPE Type);
7401
7402NTOSAPI
7403BOOLEAN
7404DDKAPI
7405KeInsertByKeyDeviceQueue(
7406 IN PKDEVICE_QUEUE DeviceQueue,
7407 IN PKDEVICE_QUEUE_ENTRY DeviceQueueEntry,
7408 IN ULONG SortKey);
7409
7410NTOSAPI
7411BOOLEAN
7412DDKAPI
7413KeInsertDeviceQueue(
7414 IN PKDEVICE_QUEUE DeviceQueue,
7415 IN PKDEVICE_QUEUE_ENTRY DeviceQueueEntry);
7416
7417NTOSAPI
7418BOOLEAN
7419DDKAPI
7420KeInsertQueueDpc(
7421 IN PRKDPC Dpc,
7422 IN PVOID SystemArgument1,
7423 IN PVOID SystemArgument2);
7424
7425NTOSAPI
7426VOID
7427DDKAPI
7428KeLeaveCriticalRegion(
7429 VOID);
7430
7431NTOSAPI
7432NTSTATUS
7433DDKAPI
7434KePulseEvent(
7435 IN PRKEVENT Event,
7436 IN KPRIORITY Increment,
7437 IN BOOLEAN Wait);
7438
7439NTOSAPI
7440ULONGLONG
7441DDKAPI
7442KeQueryInterruptTime(
7443 VOID);
7444
7445NTOSAPI
7446LARGE_INTEGER
7447DDKAPI
7448KeQueryPerformanceCounter(
7449 OUT PLARGE_INTEGER PerformanceFrequency OPTIONAL);
7450
7451NTOSAPI
7452KPRIORITY
7453DDKAPI
7454KeQueryPriorityThread(
7455 IN PRKTHREAD Thread);
7456
7457NTOSAPI
7458VOID
7459DDKAPI
7460KeQuerySystemTime(
7461 OUT PLARGE_INTEGER CurrentTime);
7462
7463NTOSAPI
7464VOID
7465DDKAPI
7466KeQueryTickCount(
7467 OUT PLARGE_INTEGER TickCount);
7468
7469NTOSAPI
7470ULONG
7471DDKAPI
7472KeQueryTimeIncrement(
7473 VOID);
7474
7475NTOSAPI
7476LONG
7477DDKAPI
7478KeReadStateEvent(
7479 IN PRKEVENT Event);
7480
7481NTOSAPI
7482LONG
7483DDKAPI
7484KeReadStateMutex(
7485 IN PRKMUTEX Mutex);
7486
7487NTOSAPI
7488LONG
7489DDKAPI
7490KeReadStateSemaphore(
7491 IN PRKSEMAPHORE Semaphore);
7492
7493NTOSAPI
7494BOOLEAN
7495DDKAPI
7496KeReadStateTimer(
7497 IN PKTIMER Timer);
7498
7499NTOSAPI
7500BOOLEAN
7501DDKAPI
7502KeRegisterBugCheckCallback(
7503 IN PKBUGCHECK_CALLBACK_RECORD CallbackRecord,
7504 IN PKBUGCHECK_CALLBACK_ROUTINE CallbackRoutine,
7505 IN PVOID Buffer,
7506 IN ULONG Length,
7507 IN PUCHAR Component);
7508
7509NTOSAPI
7510VOID
7511DDKFASTAPI
7512KeReleaseInStackQueuedSpinLock(
7513 IN PKLOCK_QUEUE_HANDLE LockHandle);
7514
7515NTOSAPI
7516VOID
7517DDKFASTAPI
7518KeReleaseInStackQueuedSpinLockFromDpcLevel(
7519 IN PKLOCK_QUEUE_HANDLE LockHandle);
7520
7521NTOSAPI
7522VOID
7523DDKAPI
7524KeReleaseInterruptSpinLock(
7525 IN PKINTERRUPT Interrupt,
7526 IN KIRQL OldIrql);
7527
7528NTOSAPI
7529LONG
7530DDKAPI
7531KeReleaseMutex(
7532 IN PRKMUTEX Mutex,
7533 IN BOOLEAN Wait);
7534
7535NTOSAPI
7536LONG
7537DDKAPI
7538KeReleaseSemaphore(
7539 IN PRKSEMAPHORE Semaphore,
7540 IN KPRIORITY Increment,
7541 IN LONG Adjustment,
7542 IN BOOLEAN Wait);
7543
7544NTOSAPI
7545VOID
7546DDKAPI
7547KeReleaseSpinLock(
7548 IN PKSPIN_LOCK SpinLock,
7549 IN KIRQL NewIrql);
7550
7551NTOSAPI
7552PKDEVICE_QUEUE_ENTRY
7553DDKAPI
7554KeRemoveByKeyDeviceQueue(
7555 IN PKDEVICE_QUEUE DeviceQueue,
7556 IN ULONG SortKey);
7557
7558NTOSAPI
7559PKDEVICE_QUEUE_ENTRY
7560DDKAPI
7561KeRemoveDeviceQueue(
7562 IN PKDEVICE_QUEUE DeviceQueue);
7563
7564NTOSAPI
7565BOOLEAN
7566DDKAPI
7567KeRemoveEntryDeviceQueue(
7568 IN PKDEVICE_QUEUE DeviceQueue,
7569 IN PKDEVICE_QUEUE_ENTRY DeviceQueueEntry);
7570
7571NTOSAPI
7572BOOLEAN
7573DDKAPI
7574KeRemoveQueueDpc(
7575 IN PRKDPC Dpc);
7576
7577NTOSAPI
7578LONG
7579DDKAPI
7580KeResetEvent(
7581 IN PRKEVENT Event);
7582
7583NTOSAPI
7584NTSTATUS
7585DDKAPI
7586KeRestoreFloatingPointState(
7587 IN PKFLOATING_SAVE FloatSave);
7588
7589NTOSAPI
7590NTSTATUS
7591DDKAPI
7592KeSaveFloatingPointState(
7593 OUT PKFLOATING_SAVE FloatSave);
7594
7595NTOSAPI
7596LONG
7597DDKAPI
7598KeSetBasePriorityThread(
7599 IN PRKTHREAD Thread,
7600 IN LONG Increment);
7601
7602NTOSAPI
7603LONG
7604DDKAPI
7605KeSetEvent(
7606 IN PRKEVENT Event,
7607 IN KPRIORITY Increment,
7608 IN BOOLEAN Wait);
7609
7610NTOSAPI
7611VOID
7612DDKAPI
7613KeSetImportanceDpc(
7614 IN PRKDPC Dpc,
7615 IN KDPC_IMPORTANCE Importance);
7616
7617NTOSAPI
7618KPRIORITY
7619DDKAPI
7620KeSetPriorityThread(
7621 IN PKTHREAD Thread,
7622 IN KPRIORITY Priority);
7623
7624NTOSAPI
7625VOID
7626DDKAPI
7627KeSetTargetProcessorDpc(
7628 IN PRKDPC Dpc,
7629 IN CCHAR Number);
7630
7631NTOSAPI
7632BOOLEAN
7633DDKAPI
7634KeSetTimer(
7635 IN PKTIMER Timer,
7636 IN LARGE_INTEGER DueTime,
7637 IN PKDPC Dpc OPTIONAL);
7638
7639NTOSAPI
7640BOOLEAN
7641DDKAPI
7642KeSetTimerEx(
7643 IN PKTIMER Timer,
7644 IN LARGE_INTEGER DueTime,
7645 IN LONG Period OPTIONAL,
7646 IN PKDPC Dpc OPTIONAL);
7647
7648NTOSAPI
7649VOID
7650DDKFASTAPI
7651KeSetTimeUpdateNotifyRoutine(
7652 IN PTIME_UPDATE_NOTIFY_ROUTINE NotifyRoutine);
7653
7654NTOSAPI
7655VOID
7656DDKAPI
7657KeStallExecutionProcessor(
7658 IN ULONG MicroSeconds);
7659
7660NTOSAPI
7661BOOLEAN
7662DDKAPI
7663KeSynchronizeExecution(
7664 IN PKINTERRUPT Interrupt,
7665 IN PKSYNCHRONIZE_ROUTINE SynchronizeRoutine,
7666 IN PVOID SynchronizeContext);
7667
7668NTOSAPI
7669NTSTATUS
7670DDKAPI
7671KeWaitForMultipleObjects(
7672 IN ULONG Count,
7673 IN PVOID Object[],
7674 IN WAIT_TYPE WaitType,
7675 IN KWAIT_REASON WaitReason,
7676 IN KPROCESSOR_MODE WaitMode,
7677 IN BOOLEAN Alertable,
7678 IN PLARGE_INTEGER Timeout OPTIONAL,
7679 IN PKWAIT_BLOCK WaitBlockArray OPTIONAL);
7680
7681NTOSAPI
7682NTSTATUS
7683DDKAPI
7684KeWaitForMutexObject(
7685 IN PRKMUTEX Mutex,
7686 IN KWAIT_REASON WaitReason,
7687 IN KPROCESSOR_MODE WaitMode,
7688 IN BOOLEAN Alertable,
7689 IN PLARGE_INTEGER Timeout OPTIONAL);
7690
7691NTOSAPI
7692NTSTATUS
7693DDKAPI
7694KeWaitForSingleObject(
7695 IN PVOID Object,
7696 IN KWAIT_REASON WaitReason,
7697 IN KPROCESSOR_MODE WaitMode,
7698 IN BOOLEAN Alertable,
7699 IN PLARGE_INTEGER Timeout OPTIONAL);
7700
7701#if defined(_X86_)
7702
7703NTOSAPI
7704VOID
7705FASTCALL
7706KfLowerIrql(
7707 IN KIRQL NewIrql);
7708
7709NTOSAPI
7710KIRQL
7711FASTCALL
7712KfRaiseIrql(
7713 IN KIRQL NewIrql);
7714
7715#define KeLowerIrql(a) KfLowerIrql(a)
7716#define KeRaiseIrql(a,b) *(b) = KfRaiseIrql(a)
7717
7718#else
7719
7720NTOSAPI
7721VOID
7722DDKAPI
7723KeLowerIrql(
7724 IN KIRQL NewIrql);
7725
7726NTOSAPI
7727KIRQL
7728DDKAPI
7729KeRaiseIrql(
7730 IN KIRQL NewIrql);
7731
7732#endif
7733
7734NTOSAPI
7735KIRQL
7736DDKAPI
7737KeRaiseIrqlToDpcLevel(
7738 VOID);
7739
7740/** Memory manager routines **/
7741
7742NTOSAPI
7743NTSTATUS
7744DDKAPI
7745MmAdvanceMdl(
7746 IN PMDL Mdl,
7747 IN ULONG NumberOfBytes);
7748
7749NTOSAPI
7750PVOID
7751DDKAPI
7752MmAllocateContiguousMemory(
7753 IN ULONG NumberOfBytes,
7754 IN PHYSICAL_ADDRESS HighestAcceptableAddress);
7755
7756NTOSAPI
7757PVOID
7758DDKAPI
7759MmAllocateContiguousMemorySpecifyCache(
7760 IN SIZE_T NumberOfBytes,
7761 IN PHYSICAL_ADDRESS LowestAcceptableAddress,
7762 IN PHYSICAL_ADDRESS HighestAcceptableAddress,
7763 IN PHYSICAL_ADDRESS BoundaryAddressMultiple OPTIONAL,
7764 IN MEMORY_CACHING_TYPE CacheType);
7765
7766NTOSAPI
7767PVOID
7768DDKAPI
7769MmAllocateMappingAddress(
7770 IN SIZE_T NumberOfBytes,
7771 IN ULONG PoolTag);
7772
7773NTOSAPI
7774PVOID
7775DDKAPI
7776MmAllocateNonCachedMemory(
7777 IN ULONG NumberOfBytes);
7778
7779NTOSAPI
7780PMDL
7781DDKAPI
7782MmAllocatePagesForMdl(
7783 IN PHYSICAL_ADDRESS LowAddress,
7784 IN PHYSICAL_ADDRESS HighAddress,
7785 IN PHYSICAL_ADDRESS SkipBytes,
7786 IN SIZE_T TotalBytes);
7787
7788NTOSAPI
7789VOID
7790DDKAPI
7791MmBuildMdlForNonPagedPool(
7792 IN OUT PMDL MemoryDescriptorList);
7793
7794NTOSAPI
7795NTSTATUS
7796DDKAPI
7797MmCreateSection(
7798 OUT PSECTION_OBJECT *SectionObject,
7799 IN ACCESS_MASK DesiredAccess,
7800 IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,
7801 IN PLARGE_INTEGER MaximumSize,
7802 IN ULONG SectionPageProtection,
7803 IN ULONG AllocationAttributes,
7804 IN HANDLE FileHandle OPTIONAL,
7805 IN PFILE_OBJECT File OPTIONAL);
7806
7807typedef enum _MMFLUSH_TYPE {
7808 MmFlushForDelete,
7809 MmFlushForWrite
7810} MMFLUSH_TYPE;
7811
7812NTOSAPI
7813BOOLEAN
7814DDKAPI
7815MmFlushImageSection(
7816 IN PSECTION_OBJECT_POINTERS SectionObjectPointer,
7817 IN MMFLUSH_TYPE FlushType);
7818
7819NTOSAPI
7820VOID
7821DDKAPI
7822MmFreeContiguousMemory(
7823 IN PVOID BaseAddress);
7824
7825NTOSAPI
7826VOID
7827DDKAPI
7828MmFreeContiguousMemorySpecifyCache(
7829 IN PVOID BaseAddress,
7830 IN SIZE_T NumberOfBytes,
7831 IN MEMORY_CACHING_TYPE CacheType);
7832
7833NTOSAPI
7834VOID
7835DDKAPI
7836MmFreeMappingAddress(
7837 IN PVOID BaseAddress,
7838 IN ULONG PoolTag);
7839
7840NTOSAPI
7841VOID
7842DDKAPI
7843MmFreeNonCachedMemory(
7844 IN PVOID BaseAddress,
7845 IN SIZE_T NumberOfBytes);
7846
7847NTOSAPI
7848VOID
7849DDKAPI
7850MmFreePagesFromMdl(
7851 IN PMDL MemoryDescriptorList);
7852
7853/*
7854 * ULONG
7855 * MmGetMdlByteCount(
7856 * IN PMDL Mdl)
7857 */
7858#define MmGetMdlByteCount(_Mdl) \
7859 ((_Mdl)->ByteCount)
7860
7861/*
7862 * ULONG
7863 * MmGetMdlByteOffset(
7864 * IN PMDL Mdl)
7865 */
7866#define MmGetMdlByteOffset(_Mdl) \
7867 ((_Mdl)->ByteOffset)
7868
7869/*
7870 * PPFN_NUMBER
7871 * MmGetMdlPfnArray(
7872 * IN PMDL Mdl)
7873 */
7874#define MmGetMdlPfnArray(_Mdl) \
7875 ((PPFN_NUMBER) ((_Mdl) + 1))
7876
7877/*
7878 * PVOID
7879 * MmGetMdlVirtualAddress(
7880 * IN PMDL Mdl)
7881 */
7882#define MmGetMdlVirtualAddress(_Mdl) \
7883 ((PVOID) ((PCHAR) ((_Mdl)->StartVa) + (_Mdl)->ByteOffset))
7884
7885NTOSAPI
7886PHYSICAL_ADDRESS
7887DDKAPI
7888MmGetPhysicalAddress(
7889 IN PVOID BaseAddress);
7890
7891NTOSAPI
7892PPHYSICAL_MEMORY_RANGE
7893DDKAPI
7894MmGetPhysicalMemoryRanges(
7895 VOID);
7896
7897NTOSAPI
7898PVOID
7899DDKAPI
7900MmGetVirtualForPhysical(
7901 IN PHYSICAL_ADDRESS PhysicalAddress);
7902
7903NTOSAPI
7904PVOID
7905DDKAPI
7906MmMapLockedPagesSpecifyCache(
7907 IN PMDL MemoryDescriptorList,
7908 IN KPROCESSOR_MODE AccessMode,
7909 IN MEMORY_CACHING_TYPE CacheType,
7910 IN PVOID BaseAddress,
7911 IN ULONG BugCheckOnFailure,
7912 IN MM_PAGE_PRIORITY Priority);
7913
7914NTOSAPI
7915PVOID
7916DDKAPI
7917MmMapLockedPagesWithReservedMapping(
7918 IN PVOID MappingAddress,
7919 IN ULONG PoolTag,
7920 IN PMDL MemoryDescriptorList,
7921 IN MEMORY_CACHING_TYPE CacheType);
7922
7923NTOSAPI
7924NTSTATUS
7925DDKAPI
7926MmMapUserAddressesToPage(
7927 IN PVOID BaseAddress,
7928 IN SIZE_T NumberOfBytes,
7929 IN PVOID PageAddress);
7930
7931NTOSAPI
7932PVOID
7933DDKAPI
7934MmMapVideoDisplay(
7935 IN PHYSICAL_ADDRESS PhysicalAddress,
7936 IN SIZE_T NumberOfBytes,
7937 IN MEMORY_CACHING_TYPE CacheType);
7938
7939NTOSAPI
7940NTSTATUS
7941DDKAPI
7942MmMapViewInSessionSpace(
7943 IN PVOID Section,
7944 OUT PVOID *MappedBase,
7945 IN OUT PSIZE_T ViewSize);
7946
7947NTOSAPI
7948NTSTATUS
7949DDKAPI
7950MmMapViewInSystemSpace(
7951 IN PVOID Section,
7952 OUT PVOID *MappedBase,
7953 IN PSIZE_T ViewSize);
7954
7955NTOSAPI
7956NTSTATUS
7957DDKAPI
7958MmMarkPhysicalMemoryAsBad(
7959 IN PPHYSICAL_ADDRESS StartAddress,
7960 IN OUT PLARGE_INTEGER NumberOfBytes);
7961
7962NTOSAPI
7963NTSTATUS
7964DDKAPI
7965MmMarkPhysicalMemoryAsGood(
7966 IN PPHYSICAL_ADDRESS StartAddress,
7967 IN OUT PLARGE_INTEGER NumberOfBytes);
7968
7969/*
7970 * PVOID
7971 * MmGetSystemAddressForMdlSafe(
7972 * IN PMDL Mdl,
7973 * IN MM_PAGE_PRIORITY Priority)
7974 */
7975#define MmGetSystemAddressForMdlSafe(_Mdl, _Priority) \
7976 ((_Mdl)->MdlFlags & (MDL_MAPPED_TO_SYSTEM_VA \
7977 | MDL_SOURCE_IS_NONPAGED_POOL)) ? \
7978 (_Mdl)->MappedSystemVa : \
7979 (PVOID) MmMapLockedPagesSpecifyCache((_Mdl), \
7980 KernelMode, MmCached, NULL, FALSE, _Priority)
7981
7982NTOSAPI
7983PVOID
7984DDKAPI
7985MmGetSystemRoutineAddress(
7986 IN PUNICODE_STRING SystemRoutineName);
7987
7988/*
7989 * ULONG
7990 * ADDRESS_AND_SIZE_TO_SPAN_PAGES(
7991 * IN PVOID Va,
7992 * IN ULONG Size)
7993 */
7994#define ADDRESS_AND_SIZE_TO_SPAN_PAGES(_Va, \
7995 _Size) \
7996 ((ULONG) ((((ULONG_PTR) (_Va) & (PAGE_SIZE - 1)) \
7997 + (_Size) + (PAGE_SIZE - 1)) >> PAGE_SHIFT))
7998
7999/*
8000 * VOID
8001 * MmInitializeMdl(
8002 * IN PMDL MemoryDescriptorList,
8003 * IN PVOID BaseVa,
8004 * IN SIZE_T Length)
8005 */
8006#define MmInitializeMdl(_MemoryDescriptorList, \
8007 _BaseVa, \
8008 _Length) \
8009{ \
8010 (_MemoryDescriptorList)->Next = (PMDL) NULL; \
8011 (_MemoryDescriptorList)->Size = (CSHORT) (sizeof(MDL) + \
8012 (sizeof(PFN_NUMBER) * ADDRESS_AND_SIZE_TO_SPAN_PAGES(_BaseVa, _Length))); \
8013 (_MemoryDescriptorList)->MdlFlags = 0; \
8014 (_MemoryDescriptorList)->StartVa = (PVOID) PAGE_ALIGN(_BaseVa); \
8015 (_MemoryDescriptorList)->ByteOffset = BYTE_OFFSET(_BaseVa); \
8016 (_MemoryDescriptorList)->ByteCount = (ULONG) _Length; \
8017}
8018
8019NTOSAPI
8020BOOLEAN
8021DDKAPI
8022MmIsAddressValid(
8023 IN PVOID VirtualAddress);
8024
8025NTOSAPI
8026LOGICAL
8027DDKAPI
8028MmIsDriverVerifying(
8029 IN PDRIVER_OBJECT DriverObject);
8030
8031NTOSAPI
8032BOOLEAN
8033DDKAPI
8034MmIsThisAnNtAsSystem(
8035 VOID);
8036
8037NTOSAPI
8038NTSTATUS
8039DDKAPI
8040MmIsVerifierEnabled(
8041 OUT PULONG VerifierFlags);
8042
8043NTOSAPI
8044PVOID
8045DDKAPI
8046MmLockPagableDataSection(
8047 IN PVOID AddressWithinSection);
8048
8049NTOSAPI
8050PVOID
8051DDKAPI
8052MmLockPagableImageSection(
8053 IN PVOID AddressWithinSection);
8054
8055/*
8056 * PVOID
8057 * MmLockPagableCodeSection(
8058 * IN PVOID AddressWithinSection)
8059 */
8060#define MmLockPagableCodeSection MmLockPagableDataSection
8061
8062NTOSAPI
8063VOID
8064DDKAPI
8065MmLockPagableSectionByHandle(
8066 IN PVOID ImageSectionHandle);
8067
8068NTOSAPI
8069PVOID
8070DDKAPI
8071MmMapIoSpace(
8072 IN PHYSICAL_ADDRESS PhysicalAddress,
8073 IN ULONG NumberOfBytes,
8074 IN MEMORY_CACHING_TYPE CacheEnable);
8075
8076NTOSAPI
8077PVOID
8078DDKAPI
8079MmMapLockedPages(
8080 IN PMDL MemoryDescriptorList,
8081 IN KPROCESSOR_MODE AccessMode);
8082
8083NTOSAPI
8084VOID
8085DDKAPI
8086MmPageEntireDriver(
8087 IN PVOID AddressWithinSection);
8088
8089NTOSAPI
8090VOID
8091DDKAPI
8092MmProbeAndLockProcessPages(
8093 IN OUT PMDL MemoryDescriptorList,
8094 IN PEPROCESS Process,
8095 IN KPROCESSOR_MODE AccessMode,
8096 IN LOCK_OPERATION Operation);
8097
8098NTOSAPI
8099NTSTATUS
8100DDKAPI
8101MmProtectMdlSystemAddress(
8102 IN PMDL MemoryDescriptorList,
8103 IN ULONG NewProtect);
8104
8105NTOSAPI
8106VOID
8107DDKAPI
8108MmUnmapLockedPages(
8109 IN PVOID BaseAddress,
8110 IN PMDL MemoryDescriptorList);
8111
8112NTOSAPI
8113NTSTATUS
8114DDKAPI
8115MmUnmapViewInSessionSpace(
8116 IN PVOID MappedBase);
8117
8118NTOSAPI
8119NTSTATUS
8120DDKAPI
8121MmUnmapViewInSystemSpace(
8122 IN PVOID MappedBase);
8123
8124NTOSAPI
8125VOID
8126DDKAPI
8127MmUnsecureVirtualMemory(
8128 IN HANDLE SecureHandle);
8129
8130/*
8131 * VOID
8132 * MmPrepareMdlForReuse(
8133 * IN PMDL Mdl)
8134 */
8135#define MmPrepareMdlForReuse(_Mdl) \
8136{ \
8137 if (((_Mdl)->MdlFlags & MDL_PARTIAL_HAS_BEEN_MAPPED) != 0) { \
8138 ASSERT(((_Mdl)->MdlFlags & MDL_PARTIAL) != 0); \
8139 MmUnmapLockedPages((_Mdl)->MappedSystemVa, (_Mdl)); \
8140 } else if (((_Mdl)->MdlFlags & MDL_PARTIAL) == 0) { \
8141 ASSERT(((_Mdl)->MdlFlags & MDL_MAPPED_TO_SYSTEM_VA) == 0); \
8142 } \
8143}
8144
8145NTOSAPI
8146VOID
8147DDKAPI
8148MmProbeAndLockPages(
8149 IN OUT PMDL MemoryDescriptorList,
8150 IN KPROCESSOR_MODE AccessMode,
8151 IN LOCK_OPERATION Operation);
8152
8153NTOSAPI
8154MM_SYSTEM_SIZE
8155DDKAPI
8156MmQuerySystemSize(
8157 VOID);
8158
8159NTOSAPI
8160NTSTATUS
8161DDKAPI
8162MmRemovePhysicalMemory(
8163 IN PPHYSICAL_ADDRESS StartAddress,
8164 IN OUT PLARGE_INTEGER NumberOfBytes);
8165
8166NTOSAPI
8167VOID
8168DDKAPI
8169MmResetDriverPaging(
8170 IN PVOID AddressWithinSection);
8171
8172NTOSAPI
8173HANDLE
8174DDKAPI
8175MmSecureVirtualMemory(
8176 IN PVOID Address,
8177 IN SIZE_T Size,
8178 IN ULONG ProbeMode);
8179
8180NTOSAPI
8181ULONG
8182DDKAPI
8183MmSizeOfMdl(
8184 IN PVOID Base,
8185 IN SIZE_T Length);
8186
8187NTOSAPI
8188VOID
8189DDKAPI
8190MmUnlockPagableImageSection(
8191 IN PVOID ImageSectionHandle);
8192
8193NTOSAPI
8194VOID
8195DDKAPI
8196MmUnlockPages(
8197 IN PMDL MemoryDescriptorList);
8198
8199NTOSAPI
8200VOID
8201DDKAPI
8202MmUnmapIoSpace(
8203 IN PVOID BaseAddress,
8204 IN SIZE_T NumberOfBytes);
8205
8206NTOSAPI
8207VOID
8208DDKAPI
8209MmUnmapReservedMapping(
8210 IN PVOID BaseAddress,
8211 IN ULONG PoolTag,
8212 IN PMDL MemoryDescriptorList);
8213
8214NTOSAPI
8215VOID
8216DDKAPI
8217MmUnmapVideoDisplay(
8218 IN PVOID BaseAddress,
8219 IN SIZE_T NumberOfBytes);
8220
8221
8222
8223/** Object manager routines **/
8224
8225NTOSAPI
8226NTSTATUS
8227DDKAPI
8228ObAssignSecurity(
8229 IN PACCESS_STATE AccessState,
8230 IN PSECURITY_DESCRIPTOR SecurityDescriptor,
8231 IN PVOID Object,
8232 IN POBJECT_TYPE Type);
8233
8234NTOSAPI
8235VOID
8236DDKAPI
8237ObDereferenceSecurityDescriptor(
8238 PSECURITY_DESCRIPTOR SecurityDescriptor,
8239 ULONG Count);
8240
8241NTOSAPI
8242VOID
8243DDKFASTAPI
8244ObfDereferenceObject(
8245 IN PVOID Object);
8246
8247/*
8248 * VOID
8249 * ObDereferenceObject(
8250 * IN PVOID Object)
8251 */
8252#define ObDereferenceObject ObfDereferenceObject
8253
8254NTOSAPI
8255NTSTATUS
8256DDKAPI
8257ObGetObjectSecurity(
8258 IN PVOID Object,
8259 OUT PSECURITY_DESCRIPTOR *SecurityDescriptor,
8260 OUT PBOOLEAN MemoryAllocated);
8261
8262NTOSAPI
8263NTSTATUS
8264DDKAPI
8265ObInsertObject(
8266 IN PVOID Object,
8267 IN PACCESS_STATE PassedAccessState OPTIONAL,
8268 IN ACCESS_MASK DesiredAccess,
8269 IN ULONG AdditionalReferences,
8270 OUT PVOID* ReferencedObject OPTIONAL,
8271 OUT PHANDLE Handle);
8272
8273NTOSAPI
8274VOID
8275DDKFASTAPI
8276ObfReferenceObject(
8277 IN PVOID Object);
8278
8279NTOSAPI
8280NTSTATUS
8281DDKAPI
8282ObLogSecurityDescriptor(
8283 IN PSECURITY_DESCRIPTOR InputSecurityDescriptor,
8284 OUT PSECURITY_DESCRIPTOR *OutputSecurityDescriptor,
8285 IN ULONG RefBias);
8286/*
8287 * VOID
8288 * ObReferenceObject(
8289 * IN PVOID Object)
8290 */
8291#define ObReferenceObject ObfReferenceObject
8292
8293NTOSAPI
8294VOID
8295DDKAPI
8296ObMakeTemporaryObject(
8297 IN PVOID Object);
8298
8299NTOSAPI
8300NTSTATUS
8301DDKAPI
8302ObOpenObjectByName(
8303 IN POBJECT_ATTRIBUTES ObjectAttributes,
8304 IN POBJECT_TYPE ObjectType,
8305 IN OUT PVOID ParseContext OPTIONAL,
8306 IN KPROCESSOR_MODE AccessMode,
8307 IN ACCESS_MASK DesiredAccess,
8308 IN PACCESS_STATE PassedAccessState,
8309 OUT PHANDLE Handle);
8310
8311NTOSAPI
8312NTSTATUS
8313DDKAPI
8314ObOpenObjectByPointer(
8315 IN PVOID Object,
8316 IN ULONG HandleAttributes,
8317 IN PACCESS_STATE PassedAccessState OPTIONAL,
8318 IN ACCESS_MASK DesiredAccess OPTIONAL,
8319 IN POBJECT_TYPE ObjectType OPTIONAL,
8320 IN KPROCESSOR_MODE AccessMode,
8321 OUT PHANDLE Handle);
8322
8323NTOSAPI
8324NTSTATUS
8325DDKAPI
8326ObQueryObjectAuditingByHandle(
8327 IN HANDLE Handle,
8328 OUT PBOOLEAN GenerateOnClose);
8329
8330NTOSAPI
8331NTSTATUS
8332DDKAPI
8333ObReferenceObjectByHandle(
8334 IN HANDLE Handle,
8335 IN ACCESS_MASK DesiredAccess,
8336 IN POBJECT_TYPE ObjectType OPTIONAL,
8337 IN KPROCESSOR_MODE AccessMode,
8338 OUT PVOID *Object,
8339 OUT POBJECT_HANDLE_INFORMATION HandleInformation OPTIONAL);
8340
8341NTOSAPI
8342NTSTATUS
8343DDKAPI
8344ObReferenceObjectByName(
8345 IN PUNICODE_STRING ObjectPath,
8346 IN ULONG Attributes,
8347 IN PACCESS_STATE PassedAccessState OPTIONAL,
8348 IN ACCESS_MASK DesiredAccess OPTIONAL,
8349 IN POBJECT_TYPE ObjectType,
8350 IN KPROCESSOR_MODE AccessMode,
8351 IN OUT PVOID ParseContext OPTIONAL,
8352 OUT PVOID *Object);
8353
8354NTOSAPI
8355NTSTATUS
8356DDKAPI
8357ObReferenceObjectByPointer(
8358 IN PVOID Object,
8359 IN ACCESS_MASK DesiredAccess,
8360 IN POBJECT_TYPE ObjectType,
8361 IN KPROCESSOR_MODE AccessMode);
8362
8363NTOSAPI
8364VOID
8365DDKAPI
8366ObReferenceSecurityDescriptor(
8367 IN PSECURITY_DESCRIPTOR SecurityDescriptor,
8368 IN ULONG Count);
8369
8370NTOSAPI
8371VOID
8372DDKAPI
8373ObReleaseObjectSecurity(
8374 IN PSECURITY_DESCRIPTOR SecurityDescriptor,
8375 IN BOOLEAN MemoryAllocated);
8376
8377
8378
8379/** Process manager routines **/
8380
8381NTOSAPI
8382NTSTATUS
8383DDKAPI
8384PsCreateSystemProcess(
8385 IN PHANDLE ProcessHandle,
8386 IN ACCESS_MASK DesiredAccess,
8387 IN POBJECT_ATTRIBUTES ObjectAttributes);
8388
8389NTOSAPI
8390NTSTATUS
8391DDKAPI
8392PsCreateSystemThread(
8393 OUT PHANDLE ThreadHandle,
8394 IN ULONG DesiredAccess,
8395 IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,
8396 IN HANDLE ProcessHandle OPTIONAL,
8397 OUT PCLIENT_ID ClientId OPTIONAL,
8398 IN PKSTART_ROUTINE StartRoutine,
8399 IN PVOID StartContext);
8400
8401/*
8402 * PEPROCESS
8403 * PsGetCurrentProcess(VOID)
8404 */
8405#define PsGetCurrentProcess IoGetCurrentProcess
8406
8407NTOSAPI
8408HANDLE
8409DDKAPI
8410PsGetCurrentProcessId(
8411 VOID);
8412
8413/*
8414 * PETHREAD
8415 * PsGetCurrentThread(VOID)
8416 */
8417#define PsGetCurrentThread() \
8418 ((PETHREAD) KeGetCurrentThread())
8419
8420NTOSAPI
8421HANDLE
8422DDKAPI
8423PsGetCurrentThreadId(
8424 VOID);
8425
8426NTOSAPI
8427BOOLEAN
8428DDKAPI
8429PsGetVersion(
8430 PULONG MajorVersion OPTIONAL,
8431 PULONG MinorVersion OPTIONAL,
8432 PULONG BuildNumber OPTIONAL,
8433 PUNICODE_STRING CSDVersion OPTIONAL);
8434
8435NTOSAPI
8436NTSTATUS
8437DDKAPI
8438PsRemoveCreateThreadNotifyRoutine(
8439 IN PCREATE_THREAD_NOTIFY_ROUTINE NotifyRoutine);
8440
8441NTOSAPI
8442NTSTATUS
8443DDKAPI
8444PsRemoveLoadImageNotifyRoutine(
8445 IN PLOAD_IMAGE_NOTIFY_ROUTINE NotifyRoutine);
8446
8447NTOSAPI
8448NTSTATUS
8449DDKAPI
8450PsSetCreateProcessNotifyRoutine(
8451 IN PCREATE_PROCESS_NOTIFY_ROUTINE NotifyRoutine,
8452 IN BOOLEAN Remove);
8453
8454NTOSAPI
8455NTSTATUS
8456DDKAPI
8457PsSetCreateThreadNotifyRoutine(
8458 IN PCREATE_THREAD_NOTIFY_ROUTINE NotifyRoutine);
8459
8460NTOSAPI
8461NTSTATUS
8462DDKAPI
8463PsSetLoadImageNotifyRoutine(
8464 IN PLOAD_IMAGE_NOTIFY_ROUTINE NotifyRoutine);
8465
8466NTOSAPI
8467NTSTATUS
8468DDKAPI
8469PsTerminateSystemThread(
8470 IN NTSTATUS ExitStatus);
8471
8472
8473
8474/** Security reference monitor routines **/
8475
8476NTOSAPI
8477BOOLEAN
8478DDKAPI
8479SeAccessCheck(
8480 IN PSECURITY_DESCRIPTOR SecurityDescriptor,
8481 IN PSECURITY_SUBJECT_CONTEXT SubjectSecurityContext,
8482 IN BOOLEAN SubjectContextLocked,
8483 IN ACCESS_MASK DesiredAccess,
8484 IN ACCESS_MASK PreviouslyGrantedAccess,
8485 OUT PPRIVILEGE_SET *Privileges OPTIONAL,
8486 IN PGENERIC_MAPPING GenericMapping,
8487 IN KPROCESSOR_MODE AccessMode,
8488 OUT PACCESS_MASK GrantedAccess,
8489 OUT PNTSTATUS AccessStatus);
8490
8491NTOSAPI
8492NTSTATUS
8493DDKAPI
8494SeAssignSecurity(
8495 IN PSECURITY_DESCRIPTOR ParentDescriptor OPTIONAL,
8496 IN PSECURITY_DESCRIPTOR ExplicitDescriptor OPTIONAL,
8497 OUT PSECURITY_DESCRIPTOR *NewDescriptor,
8498 IN BOOLEAN IsDirectoryObject,
8499 IN PSECURITY_SUBJECT_CONTEXT SubjectContext,
8500 IN PGENERIC_MAPPING GenericMapping,
8501 IN POOL_TYPE PoolType);
8502
8503NTOSAPI
8504NTSTATUS
8505DDKAPI
8506SeAssignSecurityEx(
8507 IN PSECURITY_DESCRIPTOR ParentDescriptor OPTIONAL,
8508 IN PSECURITY_DESCRIPTOR ExplicitDescriptor OPTIONAL,
8509 OUT PSECURITY_DESCRIPTOR *NewDescriptor,
8510 IN GUID *ObjectType OPTIONAL,
8511 IN BOOLEAN IsDirectoryObject,
8512 IN ULONG AutoInheritFlags,
8513 IN PSECURITY_SUBJECT_CONTEXT SubjectContext,
8514 IN PGENERIC_MAPPING GenericMapping,
8515 IN POOL_TYPE PoolType);
8516
8517NTOSAPI
8518NTSTATUS
8519DDKAPI
8520SeDeassignSecurity(
8521 IN OUT PSECURITY_DESCRIPTOR *SecurityDescriptor);
8522
8523NTOSAPI
8524BOOLEAN
8525DDKAPI
8526SeSinglePrivilegeCheck(
8527 LUID PrivilegeValue,
8528 KPROCESSOR_MODE PreviousMode);
8529
8530NTOSAPI
8531BOOLEAN
8532DDKAPI
8533SeValidSecurityDescriptor(
8534 IN ULONG Length,
8535 IN PSECURITY_DESCRIPTOR SecurityDescriptor);
8536
8537
8538
8539/** NtXxx routines **/
8540
8541NTOSAPI
8542NTSTATUS
8543DDKAPI
8544NtOpenProcess(
8545 OUT PHANDLE ProcessHandle,
8546 IN ACCESS_MASK DesiredAccess,
8547 IN POBJECT_ATTRIBUTES ObjectAttributes,
8548 IN PCLIENT_ID ClientId OPTIONAL);
8549
8550NTOSAPI
8551NTSTATUS
8552DDKAPI
8553NtQueryInformationProcess(
8554 IN HANDLE ProcessHandle,
8555 IN PROCESSINFOCLASS ProcessInformationClass,
8556 OUT PVOID ProcessInformation,
8557 IN ULONG ProcessInformationLength,
8558 OUT PULONG ReturnLength OPTIONAL);
8559
8560
8561
8562/** NtXxx and ZwXxx routines **/
8563
8564NTOSAPI
8565NTSTATUS
8566DDKAPI
8567ZwCancelTimer(
8568 IN HANDLE TimerHandle,
8569 OUT PBOOLEAN CurrentState OPTIONAL);
8570
8571NTOSAPI
8572NTSTATUS
8573DDKAPI
8574NtClose(
8575 IN HANDLE Handle);
8576
8577NTOSAPI
8578NTSTATUS
8579DDKAPI
8580ZwClose(
8581 IN HANDLE Handle);
8582
8583NTOSAPI
8584NTSTATUS
8585DDKAPI
8586ZwCreateDirectoryObject(
8587 OUT PHANDLE DirectoryHandle,
8588 IN ACCESS_MASK DesiredAccess,
8589 IN POBJECT_ATTRIBUTES ObjectAttributes);
8590
8591NTOSAPI
8592NTSTATUS
8593DDKAPI
8594NtCreateEvent(
8595 OUT PHANDLE EventHandle,
8596 IN ACCESS_MASK DesiredAccess,
8597 IN POBJECT_ATTRIBUTES ObjectAttributes,
8598 IN BOOLEAN ManualReset,
8599 IN BOOLEAN InitialState);
8600
8601NTOSAPI
8602NTSTATUS
8603DDKAPI
8604ZwCreateEvent(
8605 OUT PHANDLE EventHandle,
8606 IN ACCESS_MASK DesiredAccess,
8607 IN POBJECT_ATTRIBUTES ObjectAttributes,
8608 IN BOOLEAN ManualReset,
8609 IN BOOLEAN InitialState);
8610
8611NTOSAPI
8612NTSTATUS
8613DDKAPI
8614ZwCreateFile(
8615 OUT PHANDLE FileHandle,
8616 IN ACCESS_MASK DesiredAccess,
8617 IN POBJECT_ATTRIBUTES ObjectAttributes,
8618 OUT PIO_STATUS_BLOCK IoStatusBlock,
8619 IN PLARGE_INTEGER AllocationSize OPTIONAL,
8620 IN ULONG FileAttributes,
8621 IN ULONG ShareAccess,
8622 IN ULONG CreateDisposition,
8623 IN ULONG CreateOptions,
8624 IN PVOID EaBuffer OPTIONAL,
8625 IN ULONG EaLength);
8626
8627NTOSAPI
8628NTSTATUS
8629DDKAPI
8630ZwCreateKey(
8631 OUT PHANDLE KeyHandle,
8632 IN ACCESS_MASK DesiredAccess,
8633 IN POBJECT_ATTRIBUTES ObjectAttributes,
8634 IN ULONG TitleIndex,
8635 IN PUNICODE_STRING Class OPTIONAL,
8636 IN ULONG CreateOptions,
8637 OUT PULONG Disposition OPTIONAL);
8638
8639NTOSAPI
8640NTSTATUS
8641DDKAPI
8642ZwCreateTimer(
8643 OUT PHANDLE TimerHandle,
8644 IN ACCESS_MASK DesiredAccess,
8645 IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,
8646 IN TIMER_TYPE TimerType);
8647
8648NTOSAPI
8649NTSTATUS
8650DDKAPI
8651ZwDeleteKey(
8652 IN HANDLE KeyHandle);
8653
8654NTOSAPI
8655NTSTATUS
8656DDKAPI
8657ZwDeleteValueKey(
8658 IN HANDLE KeyHandle,
8659 IN PUNICODE_STRING ValueName);
8660
8661NTOSAPI
8662NTSTATUS
8663DDKAPI
8664NtDeviceIoControlFile(
8665 IN HANDLE DeviceHandle,
8666 IN HANDLE Event OPTIONAL,
8667 IN PIO_APC_ROUTINE UserApcRoutine OPTIONAL,
8668 IN PVOID UserApcContext OPTIONAL,
8669 OUT PIO_STATUS_BLOCK IoStatusBlock,
8670 IN ULONG IoControlCode,
8671 IN PVOID InputBuffer,
8672 IN ULONG InputBufferSize,
8673 OUT PVOID OutputBuffer,
8674 IN ULONG OutputBufferSize);
8675
8676NTOSAPI
8677NTSTATUS
8678DDKAPI
8679ZwDeviceIoControlFile(
8680 IN HANDLE DeviceHandle,
8681 IN HANDLE Event OPTIONAL,
8682 IN PIO_APC_ROUTINE UserApcRoutine OPTIONAL,
8683 IN PVOID UserApcContext OPTIONAL,
8684 OUT PIO_STATUS_BLOCK IoStatusBlock,
8685 IN ULONG IoControlCode,
8686 IN PVOID InputBuffer,
8687 IN ULONG InputBufferSize,
8688 OUT PVOID OutputBuffer,
8689 IN ULONG OutputBufferSize);
8690
8691NTOSAPI
8692NTSTATUS
8693DDKAPI
8694ZwEnumerateKey(
8695 IN HANDLE KeyHandle,
8696 IN ULONG Index,
8697 IN KEY_INFORMATION_CLASS KeyInformationClass,
8698 OUT PVOID KeyInformation,
8699 IN ULONG Length,
8700 OUT PULONG ResultLength);
8701
8702NTOSAPI
8703NTSTATUS
8704DDKAPI
8705ZwEnumerateValueKey(
8706 IN HANDLE KeyHandle,
8707 IN ULONG Index,
8708 IN KEY_VALUE_INFORMATION_CLASS KeyValueInformationClass,
8709 OUT PVOID KeyValueInformation,
8710 IN ULONG Length,
8711 OUT PULONG ResultLength);
8712
8713NTOSAPI
8714NTSTATUS
8715DDKAPI
8716ZwFlushKey(
8717 IN HANDLE KeyHandle);
8718
8719NTOSAPI
8720NTSTATUS
8721DDKAPI
8722ZwMakeTemporaryObject(
8723 IN HANDLE Handle);
8724
8725NTOSAPI
8726NTSTATUS
8727DDKAPI
8728NtMapViewOfSection(
8729 IN HANDLE SectionHandle,
8730 IN HANDLE ProcessHandle,
8731 IN OUT PVOID *BaseAddress,
8732 IN ULONG ZeroBits,
8733 IN ULONG CommitSize,
8734 IN OUT PLARGE_INTEGER SectionOffset OPTIONAL,
8735 IN OUT PSIZE_T ViewSize,
8736 IN SECTION_INHERIT InheritDisposition,
8737 IN ULONG AllocationType,
8738 IN ULONG Protect);
8739
8740NTOSAPI
8741NTSTATUS
8742DDKAPI
8743ZwMapViewOfSection(
8744 IN HANDLE SectionHandle,
8745 IN HANDLE ProcessHandle,
8746 IN OUT PVOID *BaseAddress,
8747 IN ULONG ZeroBits,
8748 IN ULONG CommitSize,
8749 IN OUT PLARGE_INTEGER SectionOffset OPTIONAL,
8750 IN OUT PSIZE_T ViewSize,
8751 IN SECTION_INHERIT InheritDisposition,
8752 IN ULONG AllocationType,
8753 IN ULONG Protect);
8754
8755NTOSAPI
8756NTSTATUS
8757DDKAPI
8758NtOpenFile(
8759 OUT PHANDLE FileHandle,
8760 IN ACCESS_MASK DesiredAccess,
8761 IN POBJECT_ATTRIBUTES ObjectAttributes,
8762 OUT PIO_STATUS_BLOCK IoStatusBlock,
8763 IN ULONG ShareAccess,
8764 IN ULONG OpenOptions);
8765
8766NTOSAPI
8767NTSTATUS
8768DDKAPI
8769ZwOpenFile(
8770 OUT PHANDLE FileHandle,
8771 IN ACCESS_MASK DesiredAccess,
8772 IN POBJECT_ATTRIBUTES ObjectAttributes,
8773 OUT PIO_STATUS_BLOCK IoStatusBlock,
8774 IN ULONG ShareAccess,
8775 IN ULONG OpenOptions);
8776
8777NTOSAPI
8778NTSTATUS
8779DDKAPI
8780ZwOpenKey(
8781 OUT PHANDLE KeyHandle,
8782 IN ACCESS_MASK DesiredAccess,
8783 IN POBJECT_ATTRIBUTES ObjectAttributes);
8784
8785NTOSAPI
8786NTSTATUS
8787DDKAPI
8788ZwOpenSection(
8789 OUT PHANDLE SectionHandle,
8790 IN ACCESS_MASK DesiredAccess,
8791 IN POBJECT_ATTRIBUTES ObjectAttributes);
8792
8793NTOSAPI
8794NTSTATUS
8795DDKAPI
8796ZwOpenSymbolicLinkObject(
8797 OUT PHANDLE LinkHandle,
8798 IN ACCESS_MASK DesiredAccess,
8799 IN POBJECT_ATTRIBUTES ObjectAttributes);
8800
8801NTOSAPI
8802NTSTATUS
8803DDKAPI
8804ZwOpenTimer(
8805 OUT PHANDLE TimerHandle,
8806 IN ACCESS_MASK DesiredAccess,
8807 IN POBJECT_ATTRIBUTES ObjectAttributes);
8808
8809NTOSAPI
8810NTSTATUS
8811DDKAPI
8812ZwQueryInformationFile(
8813 IN HANDLE FileHandle,
8814 OUT PIO_STATUS_BLOCK IoStatusBlock,
8815 OUT PVOID FileInformation,
8816 IN ULONG Length,
8817 IN FILE_INFORMATION_CLASS FileInformationClass);
8818
8819NTOSAPI
8820NTSTATUS
8821DDKAPI
8822ZwQueryKey(
8823 IN HANDLE KeyHandle,
8824 IN KEY_INFORMATION_CLASS KeyInformationClass,
8825 OUT PVOID KeyInformation,
8826 IN ULONG Length,
8827 OUT PULONG ResultLength);
8828
8829NTOSAPI
8830NTSTATUS
8831DDKAPI
8832ZwQuerySymbolicLinkObject(
8833 IN HANDLE LinkHandle,
8834 IN OUT PUNICODE_STRING LinkTarget,
8835 OUT PULONG ReturnedLength OPTIONAL);
8836
8837NTOSAPI
8838NTSTATUS
8839DDKAPI
8840ZwQueryValueKey(
8841 IN HANDLE KeyHandle,
8842 IN PUNICODE_STRING ValueName,
8843 IN KEY_VALUE_INFORMATION_CLASS KeyValueInformationClass,
8844 OUT PVOID KeyValueInformation,
8845 IN ULONG Length,
8846 OUT PULONG ResultLength);
8847
8848NTOSAPI
8849NTSTATUS
8850DDKAPI
8851NtReadFile(
8852 IN HANDLE FileHandle,
8853 IN HANDLE Event OPTIONAL,
8854 IN PIO_APC_ROUTINE ApcRoutine OPTIONAL,
8855 IN PVOID ApcContext OPTIONAL,
8856 OUT PIO_STATUS_BLOCK IoStatusBlock,
8857 OUT PVOID Buffer,
8858 IN ULONG Length,
8859 IN PLARGE_INTEGER ByteOffset OPTIONAL,
8860 IN PULONG Key OPTIONAL);
8861
8862NTOSAPI
8863NTSTATUS
8864DDKAPI
8865ZwReadFile(
8866 IN HANDLE FileHandle,
8867 IN HANDLE Event OPTIONAL,
8868 IN PIO_APC_ROUTINE ApcRoutine OPTIONAL,
8869 IN PVOID ApcContext OPTIONAL,
8870 OUT PIO_STATUS_BLOCK IoStatusBlock,
8871 OUT PVOID Buffer,
8872 IN ULONG Length,
8873 IN PLARGE_INTEGER ByteOffset OPTIONAL,
8874 IN PULONG Key OPTIONAL);
8875
8876NTOSAPI
8877NTSTATUS
8878DDKAPI
8879NtSetEvent(
8880 IN HANDLE EventHandle,
8881 IN PULONG NumberOfThreadsReleased);
8882
8883NTOSAPI
8884NTSTATUS
8885DDKAPI
8886ZwSetEvent(
8887 IN HANDLE EventHandle,
8888 IN PULONG NumberOfThreadsReleased);
8889
8890NTOSAPI
8891NTSTATUS
8892DDKAPI
8893ZwSetInformationFile(
8894 IN HANDLE FileHandle,
8895 OUT PIO_STATUS_BLOCK IoStatusBlock,
8896 IN PVOID FileInformation,
8897 IN ULONG Length,
8898 IN FILE_INFORMATION_CLASS FileInformationClass);
8899
8900NTOSAPI
8901NTSTATUS
8902DDKAPI
8903ZwSetInformationThread(
8904 IN HANDLE ThreadHandle,
8905 IN THREADINFOCLASS ThreadInformationClass,
8906 IN PVOID ThreadInformation,
8907 IN ULONG ThreadInformationLength);
8908
8909NTOSAPI
8910NTSTATUS
8911DDKAPI
8912ZwSetTimer(
8913 IN HANDLE TimerHandle,
8914 IN PLARGE_INTEGER DueTime,
8915 IN PTIMER_APC_ROUTINE TimerApcRoutine OPTIONAL,
8916 IN PVOID TimerContext OPTIONAL,
8917 IN BOOLEAN WakeTimer,
8918 IN LONG Period OPTIONAL,
8919 OUT PBOOLEAN PreviousState OPTIONAL);
8920
8921NTOSAPI
8922NTSTATUS
8923DDKAPI
8924ZwSetValueKey(
8925 IN HANDLE KeyHandle,
8926 IN PUNICODE_STRING ValueName,
8927 IN ULONG TitleIndex OPTIONAL,
8928 IN ULONG Type,
8929 IN PVOID Data,
8930 IN ULONG DataSize);
8931
8932/* [Nt|Zw]MapViewOfSection.InheritDisposition constants */
8933#define AT_EXTENDABLE_FILE 0x00002000
8934#define SEC_NO_CHANGE 0x00400000
8935#define AT_RESERVED 0x20000000
8936#define AT_ROUND_TO_PAGE 0x40000000
8937
8938NTOSAPI
8939NTSTATUS
8940DDKAPI
8941NtUnmapViewOfSection(
8942 IN HANDLE ProcessHandle,
8943 IN PVOID BaseAddress);
8944
8945NTOSAPI
8946NTSTATUS
8947DDKAPI
8948ZwUnmapViewOfSection(
8949 IN HANDLE ProcessHandle,
8950 IN PVOID BaseAddress);
8951
8952NTOSAPI
8953NTSTATUS
8954DDKAPI
8955NtWaitForSingleObject(
8956 IN HANDLE Object,
8957 IN BOOLEAN Alertable,
8958 IN PLARGE_INTEGER Time);
8959
8960NTOSAPI
8961NTSTATUS
8962DDKAPI
8963ZwWaitForSingleObject(
8964 IN HANDLE Object,
8965 IN BOOLEAN Alertable,
8966 IN PLARGE_INTEGER Time);
8967
8968NTOSAPI
8969NTSTATUS
8970DDKAPI
8971NtWriteFile(
8972 IN HANDLE FileHandle,
8973 IN HANDLE Event OPTIONAL,
8974 IN PIO_APC_ROUTINE ApcRoutine OPTIONAL,
8975 IN PVOID ApcContext OPTIONAL,
8976 OUT PIO_STATUS_BLOCK IoStatusBlock,
8977 IN PVOID Buffer,
8978 IN ULONG Length,
8979 IN PLARGE_INTEGER ByteOffset OPTIONAL,
8980 IN PULONG Key OPTIONAL);
8981
8982NTOSAPI
8983NTSTATUS
8984DDKAPI
8985ZwWriteFile(
8986 IN HANDLE FileHandle,
8987 IN HANDLE Event OPTIONAL,
8988 IN PIO_APC_ROUTINE ApcRoutine OPTIONAL,
8989 IN PVOID ApcContext OPTIONAL,
8990 OUT PIO_STATUS_BLOCK IoStatusBlock,
8991 IN PVOID Buffer,
8992 IN ULONG Length,
8993 IN PLARGE_INTEGER ByteOffset OPTIONAL,
8994 IN PULONG Key OPTIONAL);
8995
8996
8997
8998/** Power management support routines **/
8999
9000NTOSAPI
9001NTSTATUS
9002DDKAPI
9003PoCallDriver(
9004 IN PDEVICE_OBJECT DeviceObject,
9005 IN OUT PIRP Irp);
9006
9007NTOSAPI
9008PULONG
9009DDKAPI
9010PoRegisterDeviceForIdleDetection(
9011 IN PDEVICE_OBJECT DeviceObject,
9012 IN ULONG ConservationIdleTime,
9013 IN ULONG PerformanceIdleTime,
9014 IN DEVICE_POWER_STATE State);
9015
9016NTOSAPI
9017PVOID
9018DDKAPI
9019PoRegisterSystemState(
9020 IN PVOID StateHandle,
9021 IN EXECUTION_STATE Flags);
9022
9023NTOSAPI
9024NTSTATUS
9025DDKAPI
9026PoRequestPowerIrp(
9027 IN PDEVICE_OBJECT DeviceObject,
9028 IN UCHAR MinorFunction,
9029 IN POWER_STATE PowerState,
9030 IN PREQUEST_POWER_COMPLETE CompletionFunction,
9031 IN PVOID Context,
9032 OUT PIRP *Irp OPTIONAL);
9033
9034NTOSAPI
9035NTSTATUS
9036DDKAPI
9037PoRequestShutdownEvent(
9038 OUT PVOID *Event);
9039
9040NTOSAPI
9041VOID
9042DDKAPI
9043PoSetDeviceBusy(
9044 PULONG IdlePointer);
9045
9046NTOSAPI
9047POWER_STATE
9048DDKAPI
9049PoSetPowerState(
9050 IN PDEVICE_OBJECT DeviceObject,
9051 IN POWER_STATE_TYPE Type,
9052 IN POWER_STATE State);
9053
9054NTOSAPI
9055VOID
9056DDKAPI
9057PoSetSystemState(
9058 IN EXECUTION_STATE Flags);
9059
9060NTOSAPI
9061VOID
9062DDKAPI
9063PoStartNextPowerIrp(
9064 IN PIRP Irp);
9065
9066NTOSAPI
9067VOID
9068DDKAPI
9069PoUnregisterSystemState(
9070 IN PVOID StateHandle);
9071
9072
9073
9074/** WMI library support routines **/
9075
9076NTOSAPI
9077NTSTATUS
9078DDKAPI
9079WmiCompleteRequest(
9080 IN PDEVICE_OBJECT DeviceObject,
9081 IN PIRP Irp,
9082 IN NTSTATUS Status,
9083 IN ULONG BufferUsed,
9084 IN CCHAR PriorityBoost);
9085
9086NTOSAPI
9087NTSTATUS
9088DDKAPI
9089WmiFireEvent(
9090 IN PDEVICE_OBJECT DeviceObject,
9091 IN LPGUID Guid,
9092 IN ULONG InstanceIndex,
9093 IN ULONG EventDataSize,
9094 IN PVOID EventData);
9095
9096NTOSAPI
9097NTSTATUS
9098DDKAPI
9099WmiQueryTraceInformation(
9100 IN TRACE_INFORMATION_CLASS TraceInformationClass,
9101 OUT PVOID TraceInformation,
9102 IN ULONG TraceInformationLength,
9103 OUT PULONG RequiredLength OPTIONAL,
9104 IN PVOID Buffer OPTIONAL);
9105
9106NTOSAPI
9107NTSTATUS
9108DDKAPI
9109WmiSystemControl(
9110 IN PWMILIB_CONTEXT WmiLibInfo,
9111 IN PDEVICE_OBJECT DeviceObject,
9112 IN PIRP Irp,
9113 OUT PSYSCTL_IRP_DISPOSITION IrpDisposition);
9114
9115NTOSAPI
9116NTSTATUS
9117DDKCDECLAPI
9118WmiTraceMessage(
9119 IN TRACEHANDLE LoggerHandle,
9120 IN ULONG MessageFlags,
9121 IN LPGUID MessageGuid,
9122 IN USHORT MessageNumber,
9123 IN ...);
9124
9125#if 0
9126/* FIXME: Get va_list from where? */
9127NTOSAPI
9128NTSTATUS
9129DDKCDECLAPI
9130WmiTraceMessageVa(
9131 IN TRACEHANDLE LoggerHandle,
9132 IN ULONG MessageFlags,
9133 IN LPGUID MessageGuid,
9134 IN USHORT MessageNumber,
9135 IN va_list MessageArgList);
9136#endif
9137
9138
9139/** Kernel debugger routines **/
9140
9141NTOSAPI
9142VOID
9143DDKAPI
9144KdDisableDebugger(
9145 VOID);
9146
9147NTOSAPI
9148VOID
9149DDKAPI
9150KdEnableDebugger(
9151 VOID);
9152
9153NTOSAPI
9154VOID
9155DDKAPI
9156DbgBreakPoint(
9157 VOID);
9158
9159NTOSAPI
9160VOID
9161DDKAPI
9162DbgBreakPointWithStatus(
9163 IN ULONG Status);
9164
9165NTOSAPI
9166ULONG
9167DDKCDECLAPI
9168DbgPrint(
9169 IN PCH Format,
9170 IN ...);
9171
9172NTOSAPI
9173ULONG
9174DDKCDECLAPI
9175DbgPrintEx(
9176 IN ULONG ComponentId,
9177 IN ULONG Level,
9178 IN PCH Format,
9179 IN ...);
9180
9181NTOSAPI
9182ULONG
9183DDKCDECLAPI
9184DbgPrintReturnControlC(
9185 IN PCH Format,
9186 IN ...);
9187
9188NTOSAPI
9189NTSTATUS
9190DDKAPI
9191DbgQueryDebugFilterState(
9192 IN ULONG ComponentId,
9193 IN ULONG Level);
9194
9195NTOSAPI
9196NTSTATUS
9197DDKAPI
9198DbgSetDebugFilterState(
9199 IN ULONG ComponentId,
9200 IN ULONG Level,
9201 IN BOOLEAN State);
9202
9203#ifdef DBG
9204
9205#define KdPrint(_x_) DbgPrint _x_
9206#define KdPrintEx(_x_) DbgPrintEx _x_
9207#define KdBreakPoint() DbgBreakPoint()
9208#define KdBreakPointWithStatus(s) DbgBreakPointWithStatus(s)
9209
9210#else /* !DBG */
9211
9212#define KdPrint(_x_)
9213#define KdPrintEx(_x_)
9214#define KdBreakPoint()
9215#define KdBreakPointWithStatus(s)
9216
9217#endif /* !DBG */
9218
9219extern NTOSAPI PBOOLEAN KdDebuggerNotPresent;
9220extern NTOSAPI PBOOLEAN KdDebuggerEnabled;
9221#define KD_DEBUGGER_ENABLED *KdDebuggerEnabled
9222#define KD_DEBUGGER_NOT_PRESENT *KdDebuggerNotPresent
9223
9224#ifdef __cplusplus
9225}
9226#endif
9227
9228#endif /* __WINDDK_H */
Note: See TracBrowser for help on using the repository browser.