OSDN Git Service

Prepare environment for Earnie's tools.
[mingw/mingw-org-wsl.git] / w32api / include / ddk / winnt4.h
1 /*
2  * winnt4.h
3  *
4  * Definitions only used in Windows NT 4.0 and earlier versions
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 __WINNT4_H
24 #define __WINNT4_H
25
26 #if __GNUC__ >=3
27 #pragma GCC system_header
28 #endif
29
30 #ifdef __cplusplus
31 extern "C" {
32 #endif
33
34 typedef struct _ZONE_SEGMENT_HEADER {
35   SINGLE_LIST_ENTRY  SegmentList;
36   PVOID  Reserved;
37 } ZONE_SEGMENT_HEADER, *PZONE_SEGMENT_HEADER;
38
39 typedef struct _ZONE_HEADER {
40   SINGLE_LIST_ENTRY  FreeList;
41   SINGLE_LIST_ENTRY  SegmentList;
42   ULONG  BlockSize;
43   ULONG  TotalSegmentSize;
44 } ZONE_HEADER, *PZONE_HEADER;
45
46 static __inline PVOID
47 ExAllocateFromZone(
48   /*IN*/ PZONE_HEADER  Zone)
49 {
50   if (Zone->FreeList.Next)
51     Zone->FreeList.Next = Zone->FreeList.Next->Next;
52   return (PVOID) Zone->FreeList.Next;
53 }
54
55 NTOSAPI
56 NTSTATUS
57 DDKAPI
58 ExExtendZone(
59   /*IN*/ PZONE_HEADER  Zone,
60   /*IN*/ PVOID  Segment,
61   /*IN*/ ULONG  SegmentSize);
62
63 static __inline PVOID
64 ExFreeToZone(
65   /*IN*/ PZONE_HEADER  Zone,
66   /*IN*/ PVOID  Block)
67 {
68   ((PSINGLE_LIST_ENTRY) Block)->Next = Zone->FreeList.Next;
69   Zone->FreeList.Next = ((PSINGLE_LIST_ENTRY) Block);
70   return ((PSINGLE_LIST_ENTRY) Block)->Next;
71 }
72
73 NTOSAPI
74 NTSTATUS
75 DDKAPI
76 ExInitializeZone(
77   /*IN*/ PZONE_HEADER  Zone,
78   /*IN*/ ULONG  BlockSize,
79   /*IN*/ PVOID  InitialSegment,
80   /*IN*/ ULONG  InitialSegmentSize);
81
82 /*
83  * PVOID
84  * ExInterlockedAllocateFromZone(
85  * IN PZONE_HEADER  Zone,
86  * IN PKSPIN_LOCK  Lock)
87  */
88 #define ExInterlockedAllocateFromZone(Zone, \
89                               Lock) \
90   ((PVOID) ExInterlockedPopEntryList(&Zone->FreeList, Lock))
91
92 NTOSAPI
93 NTSTATUS
94 DDKAPI
95 ExInterlockedExtendZone(
96   /*IN*/ PZONE_HEADER  Zone,
97   /*IN*/ PVOID  Segment,
98   /*IN*/ ULONG  SegmentSize,
99   /*IN*/ PKSPIN_LOCK  Lock);
100
101 NTOSAPI
102 PVOID
103 DDKAPI
104 ExInterlockedFreeToZone(
105   /*IN*/ PZONE_HEADER  Zone,
106   /*IN*/ PVOID  Block,
107   /*IN*/ PKSPIN_LOCK  Lock);
108
109 /*
110  * VOID
111  * ExInitializeWorkItem(
112  * IN PWORK_QUEUE_ITEM  Item,
113  * IN PWORKER_THREAD_ROUTINE  Routine,
114  * IN PVOID  Context)
115  */
116 #define ExInitializeWorkItem(Item, \
117                              Routine, \
118                              Context) \
119 { \
120   (Item)->WorkerRoutine = Routine; \
121   (Item)->Parameter = Context; \
122   (Item)->List.Flink = NULL; \
123 }
124
125 /*
126  * BOOLEAN
127  * ExIsFullZone(
128  * IN PZONE_HEADER  Zone)
129  */
130 #define ExIsFullZone(Zone) \
131   ((Zone)->FreeList.Next == (PSINGLE_LIST_ENTRY) NULL)
132
133 NTOSAPI
134 VOID
135 DDKAPI
136 ExQueueWorkItem(
137   /*IN*/ PWORK_QUEUE_ITEM  WorkItem,
138   /*IN*/ WORK_QUEUE_TYPE  QueueType);
139
140 NTOSAPI
141 BOOLEAN
142 DDKAPI
143 ExIsObjectInFirstZoneSegment(
144   /*IN*/ PZONE_HEADER  Zone,
145   /*IN*/ PVOID  Object);
146
147 NTOSAPI
148 VOID
149 DDKAPI
150 ExReleaseResource(
151   /*IN*/ PERESOURCE  Resource);
152
153 #define ExAcquireResourceExclusive ExAcquireResourceExclusiveLite
154 #define ExAcquireResourceShared ExAcquireResourceSharedLite
155 #define ExConvertExclusiveToShared ExConvertExclusiveToSharedLite
156 #define ExDeleteResource ExDeleteResourceLite
157 #define ExInitializeResource ExInitializeResourceLite
158 #define ExIsResourceAcquiredExclusive ExIsResourceAcquiredExclusiveLite
159 #define ExIsResourceAcquiredShared ExIsResourceAcquiredSharedLite
160 #define ExIsResourceAcquired ExIsResourceAcquiredSharedLite
161 #define ExReleaseResourceForThread ExReleaseResourceForThreadLite
162
163 NTOSAPI
164 INTERLOCKED_RESULT
165 DDKAPI
166 ExInterlockedDecrementLong(
167   /*IN*/ PLONG  Addend,
168   /*IN*/ PKSPIN_LOCK  Lock);
169
170 NTOSAPI
171 ULONG
172 DDKAPI
173 ExInterlockedExchangeUlong(
174   /*IN*/ PULONG  Target,
175   /*IN*/ ULONG  Value,
176   /*IN*/ PKSPIN_LOCK  Lock);
177
178 NTOSAPI
179 INTERLOCKED_RESULT
180 DDKAPI
181 ExInterlockedIncrementLong(
182   /*IN*/ PLONG  Addend,
183   /*IN*/ PKSPIN_LOCK  Lock);
184
185 NTOSAPI
186 PVOID
187 DDKAPI
188 HalAllocateCommonBuffer(
189   /*IN*/ PADAPTER_OBJECT  AdapterObject,
190   /*IN*/ ULONG  Length,
191   /*OUT*/ PPHYSICAL_ADDRESS  LogicalAddress,
192   /*IN*/ BOOLEAN  CacheEnabled);
193
194 NTOSAPI
195 NTSTATUS
196 DDKAPI
197 HalAssignSlotResources(
198   /*IN*/ PUNICODE_STRING  RegistryPath,
199   /*IN*/ PUNICODE_STRING  DriverClassName,
200   /*IN*/ PDRIVER_OBJECT  DriverObject,
201   /*IN*/ PDEVICE_OBJECT  DeviceObject,
202   /*IN*/ INTERFACE_TYPE  BusType,
203   /*IN*/ ULONG  BusNumber,
204   /*IN*/ ULONG  SlotNumber,
205   /*IN OUT*/ PCM_RESOURCE_LIST  *AllocatedResources);
206
207 NTOSAPI
208 VOID
209 DDKAPI
210 HalFreeCommonBuffer(
211   /*IN*/ PADAPTER_OBJECT  AdapterObject,
212   /*IN*/ ULONG  Length,
213   /*IN*/ PHYSICAL_ADDRESS  LogicalAddress,
214   /*IN*/ PVOID  VirtualAddress,
215   /*IN*/ BOOLEAN  CacheEnabled);
216
217 NTOSAPI
218 PADAPTER_OBJECT
219 DDKAPI
220 HalGetAdapter(
221   /*IN*/ PDEVICE_DESCRIPTION  DeviceDescription,
222   /*IN OUT*/ PULONG  NumberOfMapRegisters);
223
224 NTOSAPI
225 ULONG
226 DDKAPI
227 HalGetBusData(
228   /*IN*/ BUS_DATA_TYPE  BusDataType,
229   /*IN*/ ULONG  BusNumber,
230   /*IN*/ ULONG  SlotNumber,
231   /*IN*/ PVOID  Buffer,
232   /*IN*/ ULONG  Length);
233
234 NTOSAPI
235 ULONG
236 DDKAPI
237 HalGetBusDataByOffset(
238   /*IN*/ BUS_DATA_TYPE  BusDataType,
239   /*IN*/ ULONG  BusNumber,
240   /*IN*/ ULONG  SlotNumber,
241   /*IN*/ PVOID  Buffer,
242   /*IN*/ ULONG  Offset,
243   /*IN*/ ULONG  Length);
244
245 NTOSAPI
246 ULONG
247 DDKAPI
248 HalGetDmaAlignmentRequirement(
249   VOID);
250
251 NTOSAPI
252 ULONG
253 DDKAPI
254 HalGetInterruptVector(
255   /*IN*/ INTERFACE_TYPE  InterfaceType,
256   /*IN*/ ULONG  BusNumber,
257   /*IN*/ ULONG  BusInterruptLevel,
258   /*IN*/ ULONG  BusInterruptVector,
259   /*OUT*/ PKIRQL  Irql,
260   /*OUT*/ PKAFFINITY  Affinity);
261
262 NTOSAPI
263 ULONG
264 DDKAPI
265 HalReadDmaCounter(
266   /*IN*/ PADAPTER_OBJECT  AdapterObject);
267
268 NTOSAPI
269 ULONG
270 DDKAPI
271 HalSetBusData(
272   /*IN*/ BUS_DATA_TYPE  BusDataType,
273   /*IN*/ ULONG  BusNumber,
274   /*IN*/ ULONG  SlotNumber,
275   /*IN*/ PVOID  Buffer,
276   /*IN*/ ULONG  Length);
277
278 NTOSAPI
279 ULONG
280 DDKAPI
281 HalSetBusDataByOffset(
282   /*IN*/ BUS_DATA_TYPE  BusDataType,
283   /*IN*/ ULONG  BusNumber,
284   /*IN*/ ULONG  SlotNumber,
285   /*IN*/ PVOID  Buffer,
286   /*IN*/ ULONG  Offset,
287   /*IN*/ ULONG  Length);
288
289 NTOSAPI
290 BOOLEAN
291 DDKAPI
292 HalTranslateBusAddress(
293   /*IN*/ INTERFACE_TYPE  InterfaceType,
294   /*IN*/ ULONG  BusNumber,
295   /*IN*/ PHYSICAL_ADDRESS  BusAddress,
296   /*IN OUT*/ PULONG  AddressSpace,
297   /*OUT*/ PPHYSICAL_ADDRESS  TranslatedAddress);
298
299 NTOSAPI
300 NTSTATUS
301 DDKAPI
302 IoAllocateAdapterChannel(
303   /*IN*/ PADAPTER_OBJECT  AdapterObject,
304   /*IN*/ PDEVICE_OBJECT  DeviceObject,
305   /*IN*/ ULONG  NumberOfMapRegisters,
306   /*IN*/ PDRIVER_CONTROL  ExecutionRoutine,
307   /*IN*/ PVOID  Context);
308
309 NTOSAPI
310 NTSTATUS
311 DDKAPI
312 IoAssignResources(
313   /*IN*/ PUNICODE_STRING  RegistryPath,
314   /*IN*/ PUNICODE_STRING  DriverClassName  /*OPTIONAL*/,
315   /*IN*/ PDRIVER_OBJECT  DriverObject,
316   /*IN*/ PDEVICE_OBJECT  DeviceObject  /*OPTIONAL*/,
317   /*IN*/ PIO_RESOURCE_REQUIREMENTS_LIST  RequestedResources,
318   /*IN OUT*/ PCM_RESOURCE_LIST  *AllocatedResources);
319
320 NTOSAPI
321 NTSTATUS
322 DDKAPI
323 IoAttachDeviceByPointer(
324   /*IN*/ PDEVICE_OBJECT  SourceDevice,
325   /*IN*/ PDEVICE_OBJECT  TargetDevice);
326
327 NTOSAPI
328 BOOLEAN
329 DDKAPI
330 IoFlushAdapterBuffers(
331   /*IN*/ PADAPTER_OBJECT  AdapterObject,
332   /*IN*/ PMDL  Mdl,
333   /*IN*/ PVOID  MapRegisterBase,
334   /*IN*/ PVOID  CurrentVa,
335   /*IN*/ ULONG  Length,
336   /*IN*/ BOOLEAN  WriteToDevice);
337
338 NTOSAPI
339 VOID
340 DDKAPI
341 IoFreeAdapterChannel(
342   /*IN*/ PADAPTER_OBJECT  AdapterObject);
343
344 NTOSAPI
345 VOID
346 DDKAPI
347 IoFreeMapRegisters(
348   /*IN*/ PADAPTER_OBJECT  AdapterObject,
349   /*IN*/ PVOID  MapRegisterBase,
350   /*IN*/ ULONG  NumberOfMapRegisters);
351
352 NTOSAPI
353 PHYSICAL_ADDRESS
354 DDKAPI
355 IoMapTransfer(
356   /*IN*/ PADAPTER_OBJECT  AdapterObject,
357   /*IN*/ PMDL  Mdl,
358   /*IN*/ PVOID  MapRegisterBase,
359   /*IN*/ PVOID  CurrentVa,
360   /*IN OUT*/ PULONG  Length,
361   /*IN*/ BOOLEAN  WriteToDevice);
362
363 NTOSAPI
364 PMDL
365 DDKAPI
366 MmCreateMdl(
367   /*IN*/ PMDL  MemoryDescriptorList  /*OPTIONAL*/,
368   /*IN*/ PVOID  Base,
369   /*IN*/ SIZE_T  Length);
370
371 NTOSAPI
372 BOOLEAN
373 DDKAPI
374 MmIsNonPagedSystemAddressValid(
375   /*IN*/ PVOID  VirtualAddress);
376
377 NTOSAPI
378 LARGE_INTEGER
379 DDKAPI
380 RtlEnlargedIntegerMultiply(
381   /*IN*/ LONG  Multiplicand,
382   /*IN*/ LONG  Multiplier);
383
384 NTOSAPI
385 ULONG
386 DDKAPI
387 RtlEnlargedUnsignedDivide(
388   /*IN*/ ULARGE_INTEGER  Dividend,
389   /*IN*/ ULONG  Divisor,
390   /*IN OUT*/ PULONG  Remainder);
391
392 NTOSAPI
393 LARGE_INTEGER
394 DDKAPI
395 RtlEnlargedUnsignedMultiply(
396   /*IN*/ ULONG  Multiplicand,
397   /*IN*/ ULONG  Multiplier);
398
399 NTOSAPI
400 LARGE_INTEGER
401 DDKAPI
402 RtlExtendedIntegerMultiply(
403   /*IN*/ LARGE_INTEGER  Multiplicand,
404   /*IN*/ LONG  Multiplier);
405
406 NTOSAPI
407 LARGE_INTEGER
408 DDKAPI
409 RtlExtendedLargeIntegerDivide(
410   /*IN*/ LARGE_INTEGER  Dividend,
411   /*IN*/ ULONG  Divisor,
412   /*IN OUT*/ PULONG  Remainder);
413
414 NTOSAPI
415 LARGE_INTEGER
416 DDKAPI
417 RtlExtendedMagicDivide(
418   /*IN*/ LARGE_INTEGER  Dividend,
419   /*IN*/ LARGE_INTEGER  MagicDivisor,
420   /*IN*/ CCHAR  ShiftCount);
421
422 NTOSAPI
423 LARGE_INTEGER
424 DDKAPI
425 RtlLargeIntegerAdd(
426   /*IN*/ LARGE_INTEGER  Addend1,
427   /*IN*/ LARGE_INTEGER  Addend2);
428
429 NTOSAPI
430 VOID
431 DDKAPI
432 RtlLargeIntegerAnd(
433   /*IN OUT*/ LARGE_INTEGER  Result,
434   /*IN*/ LARGE_INTEGER  Source,
435   /*IN*/ LARGE_INTEGER  Mask);
436
437 NTOSAPI
438 LARGE_INTEGER
439 DDKAPI
440 RtlLargeIntegerArithmeticShift(
441   /*IN*/ LARGE_INTEGER  LargeInteger,
442   /*IN*/ CCHAR  ShiftCount);
443
444 NTOSAPI
445 LARGE_INTEGER
446 DDKAPI
447 RtlLargeIntegerDivide(
448   /*IN*/ LARGE_INTEGER  Dividend,
449   /*IN*/ LARGE_INTEGER  Divisor,
450   /*IN OUT*/ PLARGE_INTEGER  Remainder);
451
452 NTOSAPI
453 BOOLEAN
454 DDKAPI
455 RtlLargeIntegerEqualTo(
456   /*IN*/ LARGE_INTEGER  Operand1,
457   /*IN*/ LARGE_INTEGER  Operand2);
458
459 NTOSAPI
460 BOOLEAN
461 DDKAPI
462 RtlLargeIntegerEqualToZero(
463   /*IN*/ LARGE_INTEGER  Operand);
464
465 NTOSAPI
466 BOOLEAN
467 DDKAPI
468 RtlLargeIntegerGreaterOrEqualToZero(
469   /*IN*/ LARGE_INTEGER  Operand);
470
471 NTOSAPI
472 BOOLEAN
473 DDKAPI
474 RtlLargeIntegerGreaterThan(
475   /*IN*/ LARGE_INTEGER  Operand1,
476   /*IN*/ LARGE_INTEGER  Operand2);
477
478 NTOSAPI
479 BOOLEAN
480 DDKAPI
481 RtlLargeIntegerGreaterThanOrEqualTo(
482   /*IN*/ LARGE_INTEGER  Operand1,
483   /*IN*/ LARGE_INTEGER  Operand2);
484
485 NTOSAPI
486 BOOLEAN
487 DDKAPI
488 RtlLargeIntegerGreaterThanZero(
489   /*IN*/ LARGE_INTEGER  Operand);
490
491 NTOSAPI
492 BOOLEAN
493 DDKAPI
494 RtlLargeIntegerLessOrEqualToZero(
495   /*IN*/ LARGE_INTEGER  Operand);
496
497 NTOSAPI
498 BOOLEAN
499 DDKAPI
500 RtlLargeIntegerLessThan(
501   /*IN*/ LARGE_INTEGER  Operand1,
502   /*IN*/ LARGE_INTEGER  Operand2);
503
504 NTOSAPI
505 BOOLEAN
506 DDKAPI
507 RtlLargeIntegerLessThanOrEqualTo(
508   /*IN*/ LARGE_INTEGER  Operand1,
509   /*IN*/ LARGE_INTEGER  Operand2);
510
511 NTOSAPI
512 BOOLEAN
513 DDKAPI
514 RtlLargeIntegerLessThanZero(
515   /*IN*/ LARGE_INTEGER  Operand);
516
517 NTOSAPI
518 LARGE_INTEGER
519 DDKAPI
520 RtlLargeIntegerNegate(
521   /*IN*/ LARGE_INTEGER  Subtrahend);
522
523 NTOSAPI
524 BOOLEAN
525 DDKAPI
526 RtlLargeIntegerNotEqualTo(
527   /*IN*/ LARGE_INTEGER  Operand1,
528   /*IN*/ LARGE_INTEGER  Operand2);
529
530 NTOSAPI
531 BOOLEAN
532 DDKAPI
533 RtlLargeIntegerNotEqualToZero(
534   /*IN*/ LARGE_INTEGER  Operand);
535
536 NTOSAPI
537 LARGE_INTEGER
538 DDKAPI
539 RtlLargeIntegerShiftLeft(
540   /*IN*/ LARGE_INTEGER  LargeInteger,
541   /*IN*/ CCHAR  ShiftCount);
542
543 NTOSAPI
544 LARGE_INTEGER
545 DDKAPI
546 RtlLargeIntegerShiftRight(
547   /*IN*/ LARGE_INTEGER  LargeInteger,
548   /*IN*/ CCHAR  ShiftCount);
549
550 NTOSAPI
551 LARGE_INTEGER
552 DDKAPI
553 RtlLargeIntegerSubtract(
554   /*IN*/ LARGE_INTEGER  Minuend,
555   /*IN*/ LARGE_INTEGER  Subtrahend);
556
557
558 /*
559  * ULONG
560  * COMPUTE_PAGES_SPANNED(
561  * IN PVOID  Va,
562  * IN ULONG  Size)
563  */
564 #define COMPUTE_PAGES_SPANNED(Va, \
565                               Size) \
566   (ADDRESS_AND_SIZE_TO_SPAN_PAGES(Va, Size))
567
568
569 /*
570 ** Architecture specific functions
571 */
572
573 #ifdef _X86_
574
575 NTOSAPI
576 INTERLOCKED_RESULT
577 DDKAPI
578 Exi386InterlockedIncrementLong(
579   /*IN*/ PLONG  Addend);
580
581 NTOSAPI
582 INTERLOCKED_RESULT
583 DDKFASTAPI
584 Exfi386InterlockedIncrementLong(
585   /*IN*/ PLONG  Addend);
586
587 NTOSAPI
588 INTERLOCKED_RESULT
589 DDKAPI
590 Exi386InterlockedDecrementLong(
591   /*IN*/ PLONG  Addend);
592
593 NTOSAPI
594 INTERLOCKED_RESULT
595 DDKFASTAPI
596 Exfi386InterlockedDecrementLong(
597   /*IN*/ PLONG  Addend);
598
599 NTOSAPI
600 ULONG
601 DDKAPI
602 Exi386InterlockedExchangeUlong(
603   /*IN*/ PULONG  Target,
604   /*IN*/ ULONG  Value);
605
606 NTOSAPI
607 ULONG
608 DDKFASTAPI
609 Exfi386InterlockedExchangeUlong(
610   /*IN*/ PULONG  Target,
611   /*IN*/ ULONG  Value);
612
613 #define ExInterlockedIncrementLong(Addend,Lock) Exfi386InterlockedIncrementLong(Addend)
614 #define ExInterlockedDecrementLong(Addend,Lock) Exfi386InterlockedDecrementLong(Addend)
615 #define ExInterlockedExchangeUlong(Target, Value, Lock) Exfi386InterlockedExchangeUlong(Target, Value)
616
617 #endif /* _X86_ */
618
619 #ifdef __cplusplus
620 }
621 #endif
622
623 #endif /* __WINNT4_H */