[DDK/XDK]
[reactos.git] / reactos / include / ddk / wdm.h
index 3b4e063..d70b8cf 100644 (file)
@@ -170,7 +170,7 @@ typedef struct _DMA_ADAPTER *PADAPTER_OBJECT;
 #elif defined(_WDM_INCLUDED_)
 typedef struct _DMA_ADAPTER *PADAPTER_OBJECT;
 #else
-typedef struct _ADAPTER_OBJECT *PADAPTER_OBJECT; 
+typedef struct _ADAPTER_OBJECT *PADAPTER_OBJECT;
 #endif
 
 #ifndef DEFINE_GUIDEX
@@ -191,7 +191,7 @@ typedef struct _ADAPTER_OBJECT *PADAPTER_OBJECT;
 #ifdef __cplusplus
 inline int IsEqualGUIDAligned(REFGUID guid1, REFGUID guid2)
 {
-    return ( (*(PLONGLONG)(&guid1) == *(PLONGLONG)(&guid2)) && 
+    return ( (*(PLONGLONG)(&guid1) == *(PLONGLONG)(&guid2)) &&
              (*((PLONGLONG)(&guid1) + 1) == *((PLONGLONG)(&guid2) + 1)) );
 }
 #else
@@ -1204,11 +1204,12 @@ typedef enum _KSPIN_LOCK_QUEUE_NUMBER {
 #endif /* defined(_AMD64_) */
 
 typedef VOID
-(NTAPI *PKDEFERRED_ROUTINE)(
+(NTAPI KDEFERRED_ROUTINE)(
   IN struct _KDPC *Dpc,
   IN PVOID DeferredContext OPTIONAL,
   IN PVOID SystemArgument1 OPTIONAL,
   IN PVOID SystemArgument2 OPTIONAL);
+typedef KDEFERRED_ROUTINE *PKDEFERRED_ROUTINE;
 
 typedef enum _KDPC_IMPORTANCE {
   LowImportance,
@@ -1242,7 +1243,7 @@ typedef struct _KDEVICE_QUEUE {
   CSHORT Size;
   LIST_ENTRY DeviceListHead;
   KSPIN_LOCK Lock;
-  #if defined(_AMD64_)
+if defined(_AMD64_)
   _ANONYMOUS_UNION union {
     BOOLEAN Busy;
     _ANONYMOUS_STRUCT struct {
@@ -1250,9 +1251,9 @@ typedef struct _KDEVICE_QUEUE {
       LONG64 Hint:56;
     } DUMMYSTRUCTNAME;
   } DUMMYUNIONNAME;
-  #else
+else
   BOOLEAN Busy;
-  #endif
+endif
 } KDEVICE_QUEUE, *PKDEVICE_QUEUE, *RESTRICTED_POINTER PRKDEVICE_QUEUE;
 
 #define TIMER_EXPIRED_INDEX_BITS        6
@@ -1374,9 +1375,9 @@ typedef struct _KTIMER {
   ULARGE_INTEGER DueTime;
   LIST_ENTRY TimerListEntry;
   struct _KDPC *Dpc;
-  #if !defined(_X86_)
+if !defined(_X86_)
   ULONG Processor;
-  #endif
+endif
   ULONG Period;
 } KTIMER, *PKTIMER, *RESTRICTED_POINTER PRKTIMER;
 
@@ -1389,8 +1390,9 @@ typedef enum _LOCK_OPERATION {
 #define KTIMER_ACTUAL_LENGTH (FIELD_OFFSET(KTIMER, Period) + sizeof(LONG))
 
 typedef BOOLEAN
-(NTAPI *PKSYNCHRONIZE_ROUTINE)(
+(NTAPI KSYNCHRONIZE_ROUTINE)(
   IN PVOID SynchronizeContext);
+typedef KSYNCHRONIZE_ROUTINE *PKSYNCHRONIZE_ROUTINE;
 
 typedef enum _POOL_TYPE {
   NonPagedPool,
@@ -5456,6 +5458,9 @@ typedef struct _IO_COMPLETION_CONTEXT {
 #define IRP_DEFER_IO_COMPLETION         0x00000800
 #define IRP_OB_QUERY_NAME               0x00001000
 #define IRP_HOLD_DEVICE_QUEUE           0x00002000
+/* The following 2 are missing in latest WDK */
+#define IRP_RETRY_IO_COMPLETION         0x00004000
+#define IRP_CLASS_CACHE_OPERATION       0x00008000
 
 #define IRP_QUOTA_CHARGED                 0x01
 #define IRP_ALLOCATED_MUST_SUCCEED        0x02
@@ -5692,30 +5697,35 @@ typedef struct _SCATTER_GATHER_ELEMENT {
   ULONG_PTR Reserved;
 } SCATTER_GATHER_ELEMENT, *PSCATTER_GATHER_ELEMENT;
 
-#if defined(_MSC_EXTENSIONS)
+#if defined(_MSC_EXTENSIONS) || defined(__GNUC__)
 
+#if defined(_MSC_VER)
 #if _MSC_VER >= 1200
 #pragma warning(push)
 #endif
 #pragma warning(disable:4200)
+#endif /* _MSC_VER */
+
 typedef struct _SCATTER_GATHER_LIST {
   ULONG NumberOfElements;
   ULONG_PTR Reserved;
   SCATTER_GATHER_ELEMENT Elements[1];
 } SCATTER_GATHER_LIST, *PSCATTER_GATHER_LIST;
 
+#if defined(_MSC_VER)
 #if _MSC_VER >= 1200
 #pragma warning(pop)
 #else
 #pragma warning(default:4200)
 #endif
+#endif /* _MSC_VER */
 
-#else
+#else /* defined(_MSC_EXTENSIONS) || defined(__GNUC__) */
 
 struct _SCATTER_GATHER_LIST;
 typedef struct _SCATTER_GATHER_LIST SCATTER_GATHER_LIST, *PSCATTER_GATHER_LIST;
 
-#endif
+#endif /* defined(_MSC_EXTENSIONS) || defined(__GNUC__) */
 
 typedef NTSTATUS
 (NTAPI DRIVER_ADD_DEVICE)(
@@ -7711,6 +7721,8 @@ KeMemoryBarrier(VOID)
 #endif
 }
 
+#define KeMemoryBarrierWithoutFence() _ReadWriteBarrier()
+
 NTHALAPI
 KIRQL
 NTAPI
@@ -7803,9 +7815,15 @@ _KeQueryTickCount(
   OUT PLARGE_INTEGER CurrentCount)
 {
   for (;;) {
+#ifdef NONAMELESSUNION
+    CurrentCount->s.HighPart = KeTickCount.High1Time;
+    CurrentCount->s.LowPart = KeTickCount.LowPart;
+    if (CurrentCount->s.HighPart == KeTickCount.High2Time) break;
+#else
     CurrentCount->HighPart = KeTickCount.High1Time;
     CurrentCount->LowPart = KeTickCount.LowPart;
     if (CurrentCount->HighPart == KeTickCount.High2Time) break;
+#endif
     YieldProcessor();
   }
 }
@@ -7862,6 +7880,21 @@ typedef XSAVE_FORMAT XMM_SAVE_AREA32, *PXMM_SAVE_AREA32;
 #define KeGetDcacheFillSize() 1L
 
 #define YieldProcessor _mm_pause
+#define FastFence __faststorefence
+#define LoadFence _mm_lfence
+#define MemoryFence _mm_mfence
+#define StoreFence _mm_sfence
+#define LFENCE_ACQUIRE() LoadFence()
+
+FORCEINLINE
+VOID
+KeMemoryBarrier(VOID)
+{
+  FastFence();
+  LFENCE_ACQUIRE();
+}
+
+#define KeMemoryBarrierWithoutFence() _ReadWriteBarrier()
 
 FORCEINLINE
 KIRQL
@@ -7884,7 +7917,7 @@ KfRaiseIrql(IN KIRQL NewIrql)
 {
   KIRQL OldIrql;
 
-  OldIrql = __readcr8();
+  OldIrql = (KIRQL)__readcr8();
   //ASSERT(OldIrql <= NewIrql);
   __writecr8(NewIrql);
   return OldIrql;
@@ -7912,6 +7945,22 @@ KeGetCurrentThread(VOID)
   return (struct _KTHREAD *)__readgsqword(0x188);
 }
 
+FORCEINLINE
+NTSTATUS
+KeSaveFloatingPointState(PVOID FloatingState)
+{
+  UNREFERENCED_PARAMETER(FloatingState);
+  return STATUS_SUCCESS;
+}
+
+FORCEINLINE
+NTSTATUS
+KeRestoreFloatingPointState(PVOID FloatingState)
+{
+  UNREFERENCED_PARAMETER(FloatingState);
+  return STATUS_SUCCESS;
+}
+
 /* VOID
  * KeFlushIoBuffers(
  *   IN PMDL Mdl,
@@ -9296,7 +9345,7 @@ RtlExtendedMagicDivide(
   ret64 = UnsignedMultiplyHigh(Pos ? Dividend.QuadPart : -Dividend.QuadPart,
                                MagicDivisor.QuadPart);
   ret64 >>= ShiftCount;
-  ret.QuadPart = Pos ? ret64 : -ret64;
+  ret.QuadPart = Pos ? ret64 : -(LONG64)ret64;
   return ret;
 }
 #endif
@@ -9713,7 +9762,7 @@ KeQuerySystemTime(
   OUT PLARGE_INTEGER CurrentTime);
 #endif /* !_M_AMD64 */
 
-#if !defined(_X86_)
+#if !defined(_X86_) && !defined(_M_ARM)
 NTKERNELAPI
 KIRQL
 NTAPI
@@ -9759,8 +9808,8 @@ KeInitializeSpinLock(IN PKSPIN_LOCK SpinLock)
 }
 #endif
 
+//DECLSPEC_NORETURN
 NTKERNELAPI
-DECLSPEC_NORETURN
 VOID
 NTAPI
 KeBugCheckEx(
@@ -10602,6 +10651,7 @@ KeFlushWriteBuffer(VOID);
   ((PVOID) ((PCHAR) ((_Mdl)->StartVa) + (_Mdl)->ByteOffset))
 
 #define MmGetProcedureAddress(Address) (Address)
+#define MmLockPagableCodeSection(Address) MmLockPagableDataSection(Address)
 
 /* PVOID MmGetSystemAddressForMdl(
  *     IN PMDL Mdl);
@@ -12748,7 +12798,11 @@ IoSkipCurrentIrpStackLocation(
 {
   ASSERT(Irp->CurrentLocation <= Irp->StackCount);
   Irp->CurrentLocation++;
+#ifdef NONAMELESSUNION
+  Irp->Tail.Overlay.s.u.CurrentStackLocation++;
+#else
   Irp->Tail.Overlay.CurrentStackLocation++;
+#endif
 }
 
 FORCEINLINE
@@ -12758,7 +12812,11 @@ IoSetNextIrpStackLocation(
 {
   ASSERT(Irp->CurrentLocation > 0);
   Irp->CurrentLocation--;
+#ifdef NONAMELESSUNION
+  Irp->Tail.Overlay.s.u.CurrentStackLocation--;
+#else
   Irp->Tail.Overlay.CurrentStackLocation--;
+#endif
 }
 
 FORCEINLINE
@@ -12767,7 +12825,11 @@ IoGetNextIrpStackLocation(
   IN PIRP Irp)
 {
   ASSERT(Irp->CurrentLocation > 0);
+#ifdef NONAMELESSUNION
+  return ((Irp)->Tail.Overlay.s.u.CurrentStackLocation - 1 );
+#else
   return ((Irp)->Tail.Overlay.CurrentStackLocation - 1 );
+#endif
 }
 
 FORCEINLINE
@@ -12858,7 +12920,11 @@ IoGetCurrentIrpStackLocation(
   IN PIRP Irp)
 {
   ASSERT(Irp->CurrentLocation <= Irp->StackCount + 1);
+#ifdef NONAMELESSUNION
+  return Irp->Tail.Overlay.s.u.CurrentStackLocation;
+#else
   return Irp->Tail.Overlay.CurrentStackLocation;
+#endif
 }
 
 FORCEINLINE
@@ -13243,7 +13309,11 @@ ExpInterlockedPushEntrySList(
 
 #else /* !defined(_WIN64) */
 
+#ifdef NONAMELESSUNION
+#define ExQueryDepthSList(listhead) (listhead)->s.Depth
+#else
 #define ExQueryDepthSList(listhead) (listhead)->Depth
+#endif
 
 NTKERNELAPI
 PSINGLE_LIST_ENTRY
@@ -13256,14 +13326,14 @@ ExInterlockedFlushSList(
 #if defined(_WIN2K_COMPAT_SLIST_USAGE) && defined(_X86_)
 
 NTKERNELAPI
-PSINGLE_LIST_ENTRY 
+PSINGLE_LIST_ENTRY
 FASTCALL
 ExInterlockedPopEntrySList(
   IN PSLIST_HEADER ListHead,
   IN PKSPIN_LOCK Lock);
 
 NTKERNELAPI
-PSINGLE_LIST_ENTRY 
+PSINGLE_LIST_ENTRY
 FASTCALL
 ExInterlockedPushEntrySList(
   IN PSLIST_HEADER ListHead,
@@ -13300,6 +13370,15 @@ ExAllocateFromPagedLookasideList(
   PVOID Entry;
 
   Lookaside->L.TotalAllocates++;
+#ifdef NONAMELESSUNION
+  Entry = InterlockedPopEntrySList(&Lookaside->L.u.ListHead);
+  if (Entry == NULL) {
+    Lookaside->L.u2.AllocateMisses++;
+    Entry = (Lookaside->L.u4.Allocate)(Lookaside->L.Type,
+                                       Lookaside->L.Size,
+                                       Lookaside->L.Tag);
+  }
+#else /* NONAMELESSUNION */
   Entry = InterlockedPopEntrySList(&Lookaside->L.ListHead);
   if (Entry == NULL) {
     Lookaside->L.AllocateMisses++;
@@ -13307,6 +13386,7 @@ ExAllocateFromPagedLookasideList(
                                     Lookaside->L.Size,
                                     Lookaside->L.Tag);
   }
+#endif /* NONAMELESSUNION */
   return Entry;
 }
 
@@ -13317,12 +13397,21 @@ ExFreeToPagedLookasideList(
   IN PVOID Entry)
 {
   Lookaside->L.TotalFrees++;
+#ifdef NONAMELESSUNION
+  if (ExQueryDepthSList(&Lookaside->L.u.ListHead) >= Lookaside->L.Depth) {
+    Lookaside->L.u3.FreeMisses++;
+    (Lookaside->L.u5.Free)(Entry);
+  } else {
+    InterlockedPushEntrySList(&Lookaside->L.u.ListHead, (PSLIST_ENTRY)Entry);
+  }
+#else /* NONAMELESSUNION */
   if (ExQueryDepthSList(&Lookaside->L.ListHead) >= Lookaside->L.Depth) {
     Lookaside->L.FreeMisses++;
     (Lookaside->L.Free)(Entry);
   } else {
     InterlockedPushEntrySList(&Lookaside->L.ListHead, (PSLIST_ENTRY)Entry);
   }
+#endif /* NONAMELESSUNION */
 }
 
 #endif /* _WIN2K_COMPAT_SLIST_USAGE */
@@ -13936,6 +14025,16 @@ ExAllocateFromLookasideListEx(
   PVOID Entry;
 
   Lookaside->L.TotalAllocates += 1;
+#ifdef NONAMELESSUNION
+  Entry = InterlockedPopEntrySList(&Lookaside->L.u.ListHead);
+  if (Entry == NULL) {
+    Lookaside->L.u2.AllocateMisses += 1;
+    Entry = (Lookaside->L.u4.AllocateEx)(Lookaside->L.Type,
+                                         Lookaside->L.Size,
+                                         Lookaside->L.Tag,
+                                         Lookaside);
+  }
+#else /* NONAMELESSUNION */
   Entry = InterlockedPopEntrySList(&Lookaside->L.ListHead);
   if (Entry == NULL) {
     Lookaside->L.AllocateMisses += 1;
@@ -13944,6 +14043,7 @@ ExAllocateFromLookasideListEx(
                                       Lookaside->L.Tag,
                                       Lookaside);
   }
+#endif /* NONAMELESSUNION */
   return Entry;
 }
 
@@ -13986,6 +14086,20 @@ ExAllocateFromNPagedLookasideList(
   PVOID Entry;
 
   Lookaside->L.TotalAllocates++;
+#ifdef NONAMELESSUNION
+#if defined(_WIN2K_COMPAT_SLIST_USAGE) && defined(_X86_)
+  Entry = ExInterlockedPopEntrySList(&Lookaside->L.u.ListHead,
+                                     &Lookaside->Lock__ObsoleteButDoNotDelete);
+#else
+  Entry = InterlockedPopEntrySList(&Lookaside->L.u.ListHead);
+#endif
+  if (Entry == NULL) {
+    Lookaside->L.u2.AllocateMisses++;
+    Entry = (Lookaside->L.u4.Allocate)(Lookaside->L.Type,
+                                       Lookaside->L.Size,
+                                       Lookaside->L.Tag);
+  }
+#else /* NONAMELESSUNION */
 #if defined(_WIN2K_COMPAT_SLIST_USAGE) && defined(_X86_)
   Entry = ExInterlockedPopEntrySList(&Lookaside->L.ListHead,
                                      &Lookaside->Lock__ObsoleteButDoNotDelete);
@@ -13998,6 +14112,7 @@ ExAllocateFromNPagedLookasideList(
                                     Lookaside->L.Size,
                                     Lookaside->L.Tag);
   }
+#endif /* NONAMELESSUNION */
   return Entry;
 }
 
@@ -14007,6 +14122,20 @@ ExFreeToNPagedLookasideList(
   IN PVOID Entry)
 {
   Lookaside->L.TotalFrees++;
+#ifdef NONAMELESSUNION
+  if (ExQueryDepthSList(&Lookaside->L.u.ListHead) >= Lookaside->L.Depth) {
+    Lookaside->L.u3.FreeMisses++;
+    (Lookaside->L.u5.Free)(Entry);
+  } else {
+#if defined(_WIN2K_COMPAT_SLIST_USAGE) && defined(_X86_)
+      ExInterlockedPushEntrySList(&Lookaside->L.u.ListHead,
+                                  (PSLIST_ENTRY)Entry,
+                                  &Lookaside->Lock__ObsoleteButDoNotDelete);
+#else
+      InterlockedPushEntrySList(&Lookaside->L.u.ListHead, (PSLIST_ENTRY)Entry);
+#endif
+   }
+#else /* NONAMELESSUNION */
   if (ExQueryDepthSList(&Lookaside->L.ListHead) >= Lookaside->L.Depth) {
     Lookaside->L.FreeMisses++;
     (Lookaside->L.Free)(Entry);
@@ -14019,6 +14148,7 @@ ExFreeToNPagedLookasideList(
       InterlockedPushEntrySList(&Lookaside->L.ListHead, (PSLIST_ENTRY)Entry);
 #endif
    }
+#endif /* NONAMELESSUNION */
 }
 
 /******************************************************************************
@@ -14225,7 +14355,7 @@ WmiTraceMessage(
 #endif
 #endif /* RUN_WPP */
 
- #if (NTDDI_VERSION >= NTDDI_WINXP)
+#if (NTDDI_VERSION >= NTDDI_WINXP)
 
 NTKERNELAPI
 NTSTATUS
@@ -14241,7 +14371,7 @@ WmiQueryTraceInformation(
 /* FIXME: Get va_list from where? */
 NTKERNELAPI
 NTSTATUS
-__cdecl
+NTAPI
 WmiTraceMessageVa(
   IN TRACEHANDLE LoggerHandle,
   IN ULONG MessageFlags,