#define NTKERNELAPI DECLSPEC_IMPORT\r
#endif\r
\r
+#ifdef _WIN64\r
+#define PORT_MAXIMUM_MESSAGE_LENGTH 512\r
+#else\r
+#define PORT_MAXIMUM_MESSAGE_LENGTH 256\r
+#endif\r
+\r
+\r
/* Simple types */\r
typedef UCHAR KPROCESSOR_MODE;\r
typedef LONG KPRIORITY;\r
#define CmResourceTypePcCardConfig 130\r
#define CmResourceTypeMfCardConfig 131\r
\r
-\r
+typedef enum _INTERFACE_TYPE {\r
+ InterfaceTypeUndefined = -1,\r
+ Internal,\r
+ Isa,\r
+ Eisa,\r
+ MicroChannel,\r
+ TurboChannel,\r
+ PCIBus,\r
+ VMEBus,\r
+ NuBus,\r
+ PCMCIABus,\r
+ CBus,\r
+ MPIBus,\r
+ MPSABus,\r
+ ProcessorInternal,\r
+ InternalPowerBus,\r
+ PNPISABus,\r
+ PNPBus,\r
+ MaximumInterfaceType\r
+} INTERFACE_TYPE, *PINTERFACE_TYPE;\r
+\r
+/* IO_RESOURCE_DESCRIPTOR.Option */\r
+\r
+#define IO_RESOURCE_PREFERRED 0x01\r
+#define IO_RESOURCE_DEFAULT 0x02\r
+#define IO_RESOURCE_ALTERNATIVE 0x08\r
+\r
+typedef struct _IO_RESOURCE_DESCRIPTOR {\r
+ UCHAR Option;\r
+ UCHAR Type;\r
+ UCHAR ShareDisposition;\r
+ UCHAR Spare1;\r
+ USHORT Flags;\r
+ USHORT Spare2;\r
+ union {\r
+ struct {\r
+ ULONG Length;\r
+ ULONG Alignment;\r
+ PHYSICAL_ADDRESS MinimumAddress;\r
+ PHYSICAL_ADDRESS MaximumAddress;\r
+ } Port;\r
+ struct {\r
+ ULONG Length;\r
+ ULONG Alignment;\r
+ PHYSICAL_ADDRESS MinimumAddress;\r
+ PHYSICAL_ADDRESS MaximumAddress;\r
+ } Memory;\r
+ struct {\r
+ ULONG MinimumVector;\r
+ ULONG MaximumVector;\r
+ } Interrupt;\r
+ struct {\r
+ ULONG MinimumChannel;\r
+ ULONG MaximumChannel;\r
+ } Dma;\r
+ struct {\r
+ ULONG Length;\r
+ ULONG Alignment;\r
+ PHYSICAL_ADDRESS MinimumAddress;\r
+ PHYSICAL_ADDRESS MaximumAddress;\r
+ } Generic;\r
+ struct {\r
+ ULONG Data[3];\r
+ } DevicePrivate;\r
+ struct {\r
+ ULONG Length;\r
+ ULONG MinBusNumber;\r
+ ULONG MaxBusNumber;\r
+ ULONG Reserved;\r
+ } BusNumber;\r
+ struct {\r
+ ULONG Priority;\r
+ ULONG Reserved1;\r
+ ULONG Reserved2;\r
+ } ConfigData;\r
+ } u;\r
+} IO_RESOURCE_DESCRIPTOR, *PIO_RESOURCE_DESCRIPTOR;\r
+\r
+typedef struct _IO_RESOURCE_LIST {\r
+ USHORT Version;\r
+ USHORT Revision;\r
+ ULONG Count;\r
+ IO_RESOURCE_DESCRIPTOR Descriptors[1];\r
+} IO_RESOURCE_LIST, *PIO_RESOURCE_LIST;\r
+\r
+typedef struct _IO_RESOURCE_REQUIREMENTS_LIST {\r
+ ULONG ListSize;\r
+ INTERFACE_TYPE InterfaceType;\r
+ ULONG BusNumber;\r
+ ULONG SlotNumber;\r
+ ULONG Reserved[3];\r
+ ULONG AlternativeLists;\r
+ IO_RESOURCE_LIST List[1];\r
+} IO_RESOURCE_REQUIREMENTS_LIST, *PIO_RESOURCE_REQUIREMENTS_LIST;\r
\r
//\r
// Global debug flag\r
extern ULONG NtGlobalFlag;\r
\r
\r
+#include <pshpack4.h>\r
+typedef struct _CM_PARTIAL_RESOURCE_DESCRIPTOR {\r
+ UCHAR Type;\r
+ UCHAR ShareDisposition;\r
+ USHORT Flags;\r
+ union {\r
+ struct {\r
+ PHYSICAL_ADDRESS Start;\r
+ ULONG Length;\r
+ } Generic;\r
+ struct {\r
+ PHYSICAL_ADDRESS Start;\r
+ ULONG Length;\r
+ } Port;\r
+ struct {\r
+ ULONG Level;\r
+ ULONG Vector;\r
+ KAFFINITY Affinity;\r
+ } Interrupt;\r
+#if (NTDDI_VERSION >= NTDDI_LONGHORN)\r
+ struct {\r
+ union {\r
+ struct {\r
+ USHORT Reserved;\r
+ USHORT MessageCount;\r
+ ULONG Vector;\r
+ KAFFINITY Affinity;\r
+ } Raw;\r
+ struct {\r
+ ULONG Level;\r
+ ULONG Vector;\r
+ KAFFINITY Affinity;\r
+ } Translated;\r
+ };\r
+ } MessageInterrupt;\r
+#endif\r
+ struct {\r
+ PHYSICAL_ADDRESS Start;\r
+ ULONG Length;\r
+ } Memory;\r
+ struct {\r
+ ULONG Channel;\r
+ ULONG Port;\r
+ ULONG Reserved1;\r
+ } Dma;\r
+ struct {\r
+ ULONG Data[3];\r
+ } DevicePrivate;\r
+ struct {\r
+ ULONG Start;\r
+ ULONG Length;\r
+ ULONG Reserved;\r
+ } BusNumber;\r
+ struct {\r
+ ULONG DataSize;\r
+ ULONG Reserved1;\r
+ ULONG Reserved2;\r
+ } DeviceSpecificData;\r
+#if (NTDDI_VERSION >= NTDDI_LONGHORN)\r
+ struct {\r
+ PHYSICAL_ADDRESS Start;\r
+ ULONG Length40;\r
+ } Memory40;\r
+ struct {\r
+ PHYSICAL_ADDRESS Start;\r
+ ULONG Length48;\r
+ } Memory48;\r
+ struct {\r
+ PHYSICAL_ADDRESS Start;\r
+ ULONG Length64;\r
+ } Memory64;\r
+#endif\r
+ } u;\r
+} CM_PARTIAL_RESOURCE_DESCRIPTOR, *PCM_PARTIAL_RESOURCE_DESCRIPTOR;\r
+#include <poppack.h>\r
\r
//\r
// Section map options\r
#define BitScanForward _BitScanForward\r
#define BitScanReverse _BitScanReverse\r
\r
+#define BitTest _bittest\r
+#define BitTestAndComplement _bittestandcomplement\r
+#define BitTestAndSet _bittestandset\r
+#define BitTestAndReset _bittestandreset\r
+#define InterlockedBitTestAndSet _interlockedbittestandset\r
+#define InterlockedBitTestAndReset _interlockedbittestandreset\r
+\r
+\r
+/** INTERLOCKED FUNCTIONS *****************************************************/\r
+\r
+#if !defined(__INTERLOCKED_DECLARED)\r
+#define __INTERLOCKED_DECLARED\r
+\r
+#if defined (_X86_)\r
+#if defined(NO_INTERLOCKED_INTRINSICS)\r
+NTKERNELAPI\r
+LONG\r
+FASTCALL\r
+InterlockedIncrement(\r
+ IN OUT LONG volatile *Addend);\r
+\r
+NTKERNELAPI\r
+LONG\r
+FASTCALL\r
+InterlockedDecrement(\r
+ IN OUT LONG volatile *Addend);\r
+\r
+NTKERNELAPI\r
+LONG\r
+FASTCALL\r
+InterlockedCompareExchange(\r
+ IN OUT LONG volatile *Destination,\r
+ IN LONG Exchange,\r
+ IN LONG Comparand);\r
+\r
+NTKERNELAPI\r
+LONG\r
+FASTCALL\r
+InterlockedExchange(\r
+ IN OUT LONG volatile *Destination,\r
+ IN LONG Value);\r
+\r
+NTKERNELAPI\r
+LONG\r
+FASTCALL\r
+InterlockedExchangeAdd(\r
+ IN OUT LONG volatile *Addend,\r
+ IN LONG Value);\r
+\r
+#else // !defined(NO_INTERLOCKED_INTRINSICS)\r
+\r
+#define InterlockedExchange _InterlockedExchange\r
+#define InterlockedIncrement _InterlockedIncrement\r
+#define InterlockedDecrement _InterlockedDecrement\r
+#define InterlockedExchangeAdd _InterlockedExchangeAdd\r
+#define InterlockedCompareExchange _InterlockedCompareExchange\r
+#define InterlockedOr _InterlockedOr\r
+#define InterlockedAnd _InterlockedAnd\r
+#define InterlockedXor _InterlockedXor\r
+\r
+#endif // !defined(NO_INTERLOCKED_INTRINSICS)\r
+\r
+#endif // defined (_X86_)\r
+\r
+#if !defined (_WIN64)\r
+/*\r
+ * PVOID\r
+ * InterlockedExchangePointer(\r
+ * IN OUT PVOID volatile *Target,\r
+ * IN PVOID Value)\r
+ */\r
+#define InterlockedExchangePointer(Target, Value) \\r
+ ((PVOID) InterlockedExchange((PLONG) Target, (LONG) Value))\r
+\r
+/*\r
+ * PVOID\r
+ * InterlockedCompareExchangePointer(\r
+ * IN OUT PVOID *Destination,\r
+ * IN PVOID Exchange,\r
+ * IN PVOID Comparand)\r
+ */\r
+#define InterlockedCompareExchangePointer(Destination, Exchange, Comparand) \\r
+ ((PVOID) InterlockedCompareExchange((PLONG) Destination, (LONG) Exchange, (LONG) Comparand))\r
+\r
+#define InterlockedExchangeAddSizeT(a, b) InterlockedExchangeAdd((LONG *)a, b)\r
+#define InterlockedIncrementSizeT(a) InterlockedIncrement((LONG *)a)\r
+#define InterlockedDecrementSizeT(a) InterlockedDecrement((LONG *)a)\r
+\r
+#endif // !defined (_WIN64)\r
+\r
+#if defined (_M_AMD64)\r
+\r
+#define InterlockedExchangeAddSizeT(a, b) InterlockedExchangeAdd64((LONGLONG *)a, (LONGLONG)b)\r
+#define InterlockedIncrementSizeT(a) InterlockedIncrement64((LONGLONG *)a)\r
+#define InterlockedDecrementSizeT(a) InterlockedDecrement64((LONGLONG *)a)\r
+#define InterlockedAnd _InterlockedAnd\r
+#define InterlockedOr _InterlockedOr\r
+#define InterlockedXor _InterlockedXor\r
+#define InterlockedIncrement _InterlockedIncrement\r
+#define InterlockedDecrement _InterlockedDecrement\r
+#define InterlockedAdd _InterlockedAdd\r
+#define InterlockedExchange _InterlockedExchange\r
+#define InterlockedExchangeAdd _InterlockedExchangeAdd\r
+#define InterlockedCompareExchange _InterlockedCompareExchange\r
+#define InterlockedAnd64 _InterlockedAnd64\r
+#define InterlockedOr64 _InterlockedOr64\r
+#define InterlockedXor64 _InterlockedXor64\r
+#define InterlockedIncrement64 _InterlockedIncrement64\r
+#define InterlockedDecrement64 _InterlockedDecrement64\r
+#define InterlockedAdd64 _InterlockedAdd64\r
+#define InterlockedExchange64 _InterlockedExchange64\r
+#define InterlockedExchangeAdd64 _InterlockedExchangeAdd64\r
+#define InterlockedCompareExchange64 _InterlockedCompareExchange64\r
+#define InterlockedCompareExchangePointer _InterlockedCompareExchangePointer\r
+#define InterlockedExchangePointer _InterlockedExchangePointer\r
+#define InterlockedBitTestAndSet64 _interlockedbittestandset64\r
+#define InterlockedBitTestAndReset64 _interlockedbittestandreset64\r
+\r
+#endif // _M_AMD64\r
+\r
+#if defined(_M_AMD64) && !defined(RC_INVOKED) && !defined(MIDL_PASS)\r
+//#if !defined(_X86AMD64_) // FIXME: what's _X86AMD64_ used for?\r
+FORCEINLINE\r
+LONG64\r
+InterlockedAdd64(\r
+ IN OUT LONG64 volatile *Addend,\r
+ IN LONG64 Value)\r
+{\r
+ return InterlockedExchangeAdd64(Addend, Value) + Value;\r
+}\r
+//#endif\r
+#define BitScanForward _BitScanForward\r
+#define BitScanReverse _BitScanReverse\r
+#endif\r
+\r
#ifdef _M_AMD64\r
#define InterlockedBitTestAndSet64 _interlockedbittestandset64\r
#define InterlockedBitTestAndReset64 _interlockedbittestandreset64\r
#endif\r
\r
+#endif /* !__INTERLOCKED_DECLARED */\r
\r
#if defined(_M_IX86)\r
#define YieldProcessor _mm_pause\r
#define PSLIST_ENTRY PSINGLE_LIST_ENTRY\r
\r
#if defined(_WIN64)\r
-typedef union _SLIST_HEADER {\r
+typedef union DECLSPEC_ALIGN(16) _SLIST_HEADER {\r
struct {\r
ULONGLONG Alignment;\r
ULONGLONG Region;\r
ULONGLONG Reserved:59;\r
ULONGLONG Region:3;\r
} Header8;\r
+ struct {\r
ULONGLONG Depth:16;\r
ULONGLONG Sequence:48;\r
ULONGLONG HeaderType:1;\r
ULONGLONG Init:1;\r
ULONGLONG Reserved:2;\r
- ULONGLONG Region:60;\r
- struct {\r
+ ULONGLONG NextEntry:60;\r
} Header16;\r
} SLIST_HEADER, *PSLIST_HEADER;\r
#else\r
#define QUOTA_LIMITS_HARDWS_MAX_DISABLE 0x00000008\r
#define QUOTA_LIMITS_USE_DEFAULT_LIMITS 0x00000010\r
\r
+\r
+/******************************************************************************\r
+ * WINBASE Functions *\r
+ ******************************************************************************/\r
+#if !defined(_WINBASE_)\r
+\r
+#if defined(_WIN64)\r
+\r
+#define InterlockedPopEntrySList(Head) \\r
+ ExpInterlockedPopEntrySList(Head)\r
+\r
+#define InterlockedPushEntrySList(Head, Entry) \\r
+ ExpInterlockedPushEntrySList(Head, Entry)\r
+\r
+#define InterlockedFlushSList(Head) \\r
+ ExpInterlockedFlushSList(Head)\r
+\r
+#define QueryDepthSList(Head) \\r
+ ExQueryDepthSList(Head)\r
+\r
+#else // !defined(_WIN64)\r
+\r
+NTKERNELAPI\r
+PSLIST_ENTRY\r
+FASTCALL\r
+InterlockedPopEntrySList(\r
+ IN PSLIST_HEADER ListHead);\r
+\r
+NTKERNELAPI\r
+PSLIST_ENTRY\r
+FASTCALL\r
+InterlockedPushEntrySList(\r
+ IN PSLIST_HEADER ListHead,\r
+ IN PSLIST_ENTRY ListEntry);\r
+\r
+#define InterlockedFlushSList(ListHead) \\r
+ ExInterlockedFlushSList(ListHead)\r
+\r
+#define QueryDepthSList(Head) \\r
+ ExQueryDepthSList(Head)\r
+\r
+#endif // !defined(_WIN64)\r
+\r
+#endif // !defined(_WINBASE_)\r
+\r
+\r
/******************************************************************************\r
* Kernel Types *\r
******************************************************************************/\r
IN CONST UNICODE_STRING *String2,\r
IN BOOLEAN CaseInSensitive);\r
\r
+#if !defined(_AMD64_) && !defined(_IA64_)\r
+NTSYSAPI\r
+LARGE_INTEGER\r
+NTAPI\r
+RtlExtendedIntegerMultiply(\r
+ IN LARGE_INTEGER Multiplicand,\r
+ IN LONG Multiplier);\r
+\r
+NTSYSAPI\r
+LARGE_INTEGER\r
+NTAPI\r
+RtlExtendedLargeIntegerDivide(\r
+ IN LARGE_INTEGER Dividend,\r
+ IN ULONG Divisor,\r
+ IN OUT PULONG Remainder);\r
+#endif\r
+\r
+#if defined(_X86_) || defined(_IA64_)\r
+NTSYSAPI\r
+LARGE_INTEGER\r
+NTAPI\r
+RtlExtendedMagicDivide(\r
+ IN LARGE_INTEGER Dividend,\r
+ IN LARGE_INTEGER MagicDivisor,\r
+ IN CCHAR ShiftCount);\r
+#endif\r
+\r
NTSYSAPI\r
VOID\r
NTAPI\r
NTAPI_INLINE\r
RtlConvertLongToLargeInteger(LONG SignedInteger)\r
{\r
- LARGE_INTEGER Result;\r
- Result.QuadPart = SignedInteger;\r
- return Result;\r
+ LARGE_INTEGER ret;\r
+ ret.QuadPart = SignedInteger;\r
+ return ret;\r
}\r
\r
//DECLSPEC_DEPRECATED_DDK_WINXP\r
return ret;\r
}\r
\r
+//DECLSPEC_DEPRECATED_DDK\r
+static __inline\r
+ULONG\r
+NTAPI_INLINE\r
+RtlEnlargedUnsignedDivide(\r
+ IN ULARGE_INTEGER Dividend,\r
+ IN ULONG Divisor,\r
+ IN OUT PULONG Remainder)\r
+{\r
+ if (Remainder)\r
+ *Remainder = Dividend.QuadPart % Divisor;\r
+ return Dividend.QuadPart / Divisor;\r
+}\r
+\r
+//DECLSPEC_DEPRECATED_DDK\r
+static __inline\r
+LARGE_INTEGER\r
+NTAPI_INLINE\r
+RtlEnlargedUnsignedMultiply(\r
+ IN ULONG Multiplicand,\r
+ IN ULONG Multiplier)\r
+{\r
+ LARGE_INTEGER ret;\r
+ ret.QuadPart = (ULONGLONG)Multiplicand * (ULONGLONG)Multiplier;\r
+ return ret;\r
+}\r
+\r
+//DECLSPEC_DEPRECATED_DDK\r
+static __inline\r
+LARGE_INTEGER\r
+NTAPI_INLINE\r
+RtlEnlargedIntegerMultiply(\r
+ IN LONG Multiplicand,\r
+ IN LONG Multiplier)\r
+{\r
+ LARGE_INTEGER ret;\r
+ ret.QuadPart = (LONGLONG)Multiplicand * (ULONGLONG)Multiplier;\r
+ return ret;\r
+}\r
+\r
FORCEINLINE\r
VOID\r
RtlInitEmptyAnsiString(OUT PANSI_STRING AnsiString,\r
UnicodeString->Buffer = Buffer;\r
}\r
\r
-#ifdef _M_AMD64\r
+#if defined(_AMD64_) || defined(_IA64_)\r
static __inline\r
LARGE_INTEGER\r
NTAPI_INLINE\r
}\r
#endif\r
\r
+#if defined(_AMD64_)\r
+\r
+#define MultiplyHigh __mulh\r
+#define UnsignedMultiplyHigh __umulh\r
+\r
+//DECLSPEC_DEPRECATED_DDK\r
+static __inline\r
+LARGE_INTEGER\r
+NTAPI_INLINE\r
+RtlExtendedMagicDivide(\r
+ IN LARGE_INTEGER Dividend,\r
+ IN LARGE_INTEGER MagicDivisor,\r
+ IN CCHAR ShiftCount)\r
+{\r
+ LARGE_INTEGER ret;\r
+ ULONG64 ret64;\r
+ BOOLEAN Pos;\r
+ Pos = (Dividend.QuadPart >= 0);\r
+ ret64 = UnsignedMultiplyHigh(Pos ? Dividend.QuadPart : -Dividend.QuadPart,\r
+ MagicDivisor.QuadPart);\r
+ ret64 >>= ShiftCount;\r
+ ret.QuadPart = Pos ? ret64 : -ret64;\r
+ return ret;\r
+}\r
+#endif\r
+\r
+//DECLSPEC_DEPRECATED_DDK\r
+static __inline\r
+LARGE_INTEGER\r
+NTAPI_INLINE\r
+RtlLargeIntegerAdd(\r
+ IN LARGE_INTEGER Addend1,\r
+ IN LARGE_INTEGER Addend2)\r
+{\r
+ LARGE_INTEGER ret;\r
+ ret.QuadPart = Addend1.QuadPart + Addend2.QuadPart;\r
+ return ret;\r
+}\r
+\r
+/* VOID\r
+ * RtlLargeIntegerAnd(\r
+ * IN OUT LARGE_INTEGER Result,\r
+ * IN LARGE_INTEGER Source,\r
+ * IN LARGE_INTEGER Mask);\r
+ */\r
+#define RtlLargeIntegerAnd(Result, Source, Mask) \\r
+ Result.QuadPart = Source.QuadPart & Mask.QuadPart\r
+\r
+//DECLSPEC_DEPRECATED_DDK\r
+static __inline\r
+LARGE_INTEGER\r
+NTAPI_INLINE\r
+RtlLargeIntegerArithmeticShift(\r
+ IN LARGE_INTEGER LargeInteger,\r
+ IN CCHAR ShiftCount)\r
+{\r
+ LARGE_INTEGER ret;\r
+ ret.QuadPart = LargeInteger.QuadPart >> ShiftCount;\r
+ return ret;\r
+}\r
+\r
+/* BOOLEAN\r
+ * RtlLargeIntegerEqualTo(\r
+ * IN LARGE_INTEGER Operand1,\r
+ * IN LARGE_INTEGER Operand2);\r
+ */\r
+#define RtlLargeIntegerEqualTo(X,Y) \\r
+ (!(((X).LowPart ^ (Y).LowPart) | ((X).HighPart ^ (Y).HighPart)))\r
+\r
FORCEINLINE\r
PVOID\r
RtlSecureZeroMemory(\r
{\r
volatile char* vptr = (volatile char*)Pointer;\r
#if defined(_M_AMD64)\r
- _stosb((PUCHAR)vptr, 0, Size);\r
+ __stosb((PUCHAR)vptr, 0, Size);\r
#else\r
char * endptr = (char *)vptr + Size;\r
while (vptr < endptr)\r
ULONG\r
RtlCheckBit(\r
IN PRTL_BITMAP BitMapHeader,\r
- IN ULONG BitPosition);\r
+ IN ULONG BitPosition)\r
{\r
return BitTest((LONG CONST*)BitMapHeader->Buffer, BitPosition);\r
}\r
//\r
// Byte Swap Functions\r
//\r
-#if (defined(_M_IX86) && (_MSC_FULL_VER > 13009037)) || \\r
- ((defined(_M_AMD64) || \\r
- defined(_M_IA64)) && (_MSC_FULL_VER > 13009175))\r
-\r
-unsigned short __cdecl _byteswap_ushort(unsigned short);\r
-unsigned long __cdecl _byteswap_ulong (unsigned long);\r
-unsigned __int64 __cdecl _byteswap_uint64(unsigned __int64);\r
-#pragma intrinsic(_byteswap_ushort)\r
-#pragma intrinsic(_byteswap_ulong)\r
-#pragma intrinsic(_byteswap_uint64)\r
+#if (defined(_M_IX86) && (_MSC_FULL_VER > 13009037 || defined(__GNUC__))) || \\r
+ ((defined(_M_AMD64) || defined(_M_IA64)) \\r
+ && (_MSC_FULL_VER > 13009175 || defined(__GNUC__)))\r
+\r
#define RtlUshortByteSwap(_x) _byteswap_ushort((USHORT)(_x))\r
#define RtlUlongByteSwap(_x) _byteswap_ulong((_x))\r
#define RtlUlonglongByteSwap(_x) _byteswap_uint64((_x))\r
\r
-#elif defined(__GNUC__) && (defined(_M_IX86) || defined(_M_AMD64))\r
+#endif\r
\r
-#define RtlUshortByteSwap(_x) _byteswap_ushort((USHORT)(_x))\r
-#define RtlUlongByteSwap(_x) _byteswap_ulong((_x))\r
-#define RtlUlonglongByteSwap(_x) _byteswap_uint64((_x))\r
+/******************************************************************************\r
+ * Memory manager Types *\r
+ ******************************************************************************/\r
+\r
+typedef struct _MDL {\r
+ struct _MDL *Next;\r
+ CSHORT Size;\r
+ CSHORT MdlFlags;\r
+ struct _EPROCESS *Process;\r
+ PVOID MappedSystemVa;\r
+ PVOID StartVa;\r
+ ULONG ByteCount;\r
+ ULONG ByteOffset;\r
+} MDL, *PMDL;\r
+\r
+\r
+/******************************************************************************\r
+ * Memory manager Functions *\r
+ ******************************************************************************/\r
+\r
+/* PVOID MmGetSystemAddressForMdl(\r
+ * IN PMDL Mdl);\r
+ */\r
+#define MmGetSystemAddressForMdl(Mdl) \\r
+ (((Mdl)->MdlFlags & (MDL_MAPPED_TO_SYSTEM_VA | \\r
+ MDL_SOURCE_IS_NONPAGED_POOL)) ? \\r
+ ((Mdl)->MappedSystemVa) : \\r
+ (MmMapLockedPages((Mdl), KernelMode)))\r
+\r
+/* PVOID\r
+ * MmGetSystemAddressForMdlSafe(\r
+ * IN PMDL Mdl,\r
+ * IN MM_PAGE_PRIORITY Priority)\r
+ */\r
+#define MmGetSystemAddressForMdlSafe(_Mdl, _Priority) \\r
+ (((_Mdl)->MdlFlags & (MDL_MAPPED_TO_SYSTEM_VA \\r
+ | MDL_SOURCE_IS_NONPAGED_POOL)) ? \\r
+ (_Mdl)->MappedSystemVa : \\r
+ (PVOID) MmMapLockedPagesSpecifyCache((_Mdl), \\r
+ KernelMode, MmCached, NULL, FALSE, (_Priority)))\r
+\r
+#if (NTDDI_VERSION >= NTDDI_WIN2K)\r
+NTKERNELAPI\r
+PMDL\r
+NTAPI\r
+MmCreateMdl(\r
+ IN PMDL MemoryDescriptorList OPTIONAL,\r
+ IN PVOID Base,\r
+ IN SIZE_T Length);\r
+\r
+#endif\r
+\r
+\r
+/******************************************************************************\r
+ * I/O Manager Functions *\r
+ ******************************************************************************/\r
+\r
+#if defined(USE_DMA_MACROS) && !defined(_NTHAL_) && \\r
+ (defined(_NTDDK_) || defined(_NTDRIVER_)) || defined(_WDM_INCLUDED_)\r
+\r
+#define DMA_MACROS_DEFINED\r
+\r
+FORCEINLINE\r
+NTSTATUS\r
+IoAllocateAdapterChannel(\r
+ IN PADAPTER_OBJECT AdapterObject,\r
+ IN PDEVICE_OBJECT DeviceObject,\r
+ IN ULONG NumberOfMapRegisters,\r
+ IN PDRIVER_CONTROL ExecutionRoutine,\r
+ IN PVOID Context)\r
+{\r
+ PALLOCATE_ADAPTER_CHANNEL AllocateAdapterChannel;\r
+ AllocateAdapterChannel =\r
+ *(DmaAdapter)->DmaOperations->AllocateAdapterChannel;\r
+ ASSERT(AllocateAdapterChannel);\r
+ return AllocateAdapterChannel(DmaAdapter,\r
+ DeviceObject,\r
+ NumberOfMapRegisters,\r
+ ExecutionRoutine,\r
+ Context );\r
+}\r
+\r
+FORCEINLINE\r
+BOOLEAN\r
+IoFlushAdapterBuffers(\r
+ IN PADAPTER_OBJECT AdapterObject,\r
+ IN PMDL Mdl,\r
+ IN PVOID MapRegisterBase,\r
+ IN PVOID CurrentVa,\r
+ IN ULONG Length,\r
+ IN BOOLEAN WriteToDevice)\r
+{\r
+ PFLUSH_ADAPTER_BUFFERS FlushAdapterBuffers;\r
+ FlushAdapterBuffers = *(DmaAdapter)->DmaOperations->FlushAdapterBuffers;\r
+ ASSERT(FlushAdapterBuffers);\r
+ return FlushAdapterBuffers(DmaAdapter,\r
+ Mdl,\r
+ MapRegisterBase,\r
+ CurrentVa,\r
+ Length,\r
+ WriteToDevice );\r
+}\r
\r
+FORCEINLINE\r
+VOID\r
+IoFreeAdapterChannel(\r
+ IN PADAPTER_OBJECT AdapterObject)\r
+{\r
+ PFREE_ADAPTER_CHANNEL FreeAdapterChannel;\r
+ FreeAdapterChannel = *(DmaAdapter)->DmaOperations->FreeAdapterChannel;\r
+ ASSERT(FreeAdapterChannel);\r
+ FreeAdapterChannel(DmaAdapter);\r
+}\r
+\r
+FORCEINLINE\r
+VOID\r
+IoFreeMapRegisters(\r
+ IN PADAPTER_OBJECT AdapterObject,\r
+ IN PVOID MapRegisterBase,\r
+ IN ULONG NumberOfMapRegisters)\r
+{\r
+ PFREE_MAP_REGISTERS FreeMapRegisters;\r
+ FreeMapRegisters = *(DmaAdapter)->DmaOperations->FreeMapRegisters;\r
+ ASSERT(FreeMapRegisters);\r
+ FreeMapRegisters(DmaAdapter, MapRegisterBase, NumberOfMapRegisters);\r
+}\r
+\r
+FORCEINLINE\r
+PHYSICAL_ADDRESS\r
+IoMapTransfer(\r
+ IN PDMA_ADAPTER DmaAdapter,\r
+ IN PMDL Mdl,\r
+ IN PVOID MapRegisterBase,\r
+ IN PVOID CurrentVa,\r
+ IN OUT PULONG Length,\r
+ IN BOOLEAN WriteToDevice)\r
+{\r
+ PMAP_TRANSFER MapTransfer;\r
+\r
+ MapTransfer = *(DmaAdapter)->DmaOperations->MapTransfer;\r
+ ASSERT(MapTransfer);\r
+ return MapTransfer(DmaAdapter,\r
+ Mdl,\r
+ MapRegisterBase,\r
+ CurrentVa,\r
+ Length,\r
+ WriteToDevice);\r
+}\r
#endif\r
\r
\r
#if !defined(_WIN64) && (defined(_NTDDK_) || defined(_NTIFS_) || defined(_NDIS_))\r
#define LOOKASIDE_ALIGN\r
#else\r
-#define LOOKASIDE_ALIGN DECLSPEC_CACHEALIGN\r
+#define LOOKASIDE_ALIGN /* FIXME: DECLSPEC_CACHEALIGN */\r
#endif\r
\r
typedef struct _LOOKASIDE_LIST_EX *PLOOKASIDE_LIST_EX;\r
};\r
} EX_RUNDOWN_REF, *PEX_RUNDOWN_REF;\r
\r
+typedef struct _EX_RUNDOWN_REF_CACHE_AWARE *PEX_RUNDOWN_REF_CACHE_AWARE;\r
+\r
+typedef enum _WORK_QUEUE_TYPE {\r
+ CriticalWorkQueue,\r
+ DelayedWorkQueue,\r
+ HyperCriticalWorkQueue,\r
+ MaximumWorkQueue\r
+} WORK_QUEUE_TYPE;\r
+\r
+typedef VOID\r
+(DDKAPI *PWORKER_THREAD_ROUTINE)(\r
+ IN PVOID Parameter);\r
+\r
+typedef struct _WORK_QUEUE_ITEM {\r
+ LIST_ENTRY List;\r
+ PWORKER_THREAD_ROUTINE WorkerRoutine;\r
+ volatile PVOID Parameter;\r
+} WORK_QUEUE_ITEM, *PWORK_QUEUE_ITEM;\r
+\r
\r
/******************************************************************************\r
* Executive Functions *\r
******************************************************************************/\r
\r
-#if defined (_WIN64)\r
-#if defined(_NTDRIVER_) || defined(_NTDDK) || defined(_NTIFS_) || \\r
+#if defined(_X86_)\r
+#if defined(_NTHAL_)\r
+#define ExAcquireFastMutex ExiAcquireFastMutex\r
+#define ExReleaseFastMutex ExiReleaseFastMutex\r
+#define ExTryToAcquireFastMutex ExiTryToAcquireFastMutex\r
+#endif\r
+#define ExInterlockedAddUlong ExfInterlockedAddUlong\r
+#define ExInterlockedInsertHeadList ExfInterlockedInsertHeadList\r
+#define ExInterlockedInsertTailList ExfInterlockedInsertTailList\r
+#define ExInterlockedRemoveHeadList ExfInterlockedRemoveHeadList\r
+#define ExInterlockedPopEntryList ExfInterlockedPopEntryList\r
+#define ExInterlockedPushEntryList ExfInterlockedPushEntryList\r
+#endif\r
+\r
+#if defined(_WIN64)\r
+\r
+#if defined(_NTDRIVER_) || defined(_NTDDK_) || defined(_NTIFS_) || \\r
defined(_NTHAL_) || defined(_NTOSP_)\r
-NTKRNLAPI\r
+NTKERNELAPI\r
USHORT\r
-ExQueryDepthSList(IN PSLIST_HEADER Listhead);\r
+ExQueryDepthSList(IN PSLIST_HEADER ListHead);\r
#else\r
FORCEINLINE\r
USHORT\r
-ExQueryDepthSList(IN PSLIST_HEADER Listhead)\r
+ExQueryDepthSList(IN PSLIST_HEADER ListHead)\r
{\r
return (USHORT)(ListHead->Alignment & 0xffff);\r
}\r
#endif\r
-#else\r
-#define ExQueryDepthSList(listhead) (listhead)->Depth\r
-#endif\r
-\r
-#if defined(_WIN64)\r
\r
NTKERNELAPI\r
PSLIST_ENTRY\r
\r
#else // !defined(_WIN64)\r
\r
+#define ExQueryDepthSList(listhead) (listhead)->Depth\r
+\r
NTKERNELAPI\r
PSINGLE_LIST_ENTRY\r
FASTCALL\r
InterlockedPushEntrySList(_ListHead, _ListEntry)\r
#endif // _WIN2K_COMPAT_SLIST_USAGE\r
\r
+#endif // !defined(_WIN64)\r
+\r
/* ERESOURCE_THREAD\r
* ExGetCurrentResourceThread(\r
* VOID);\r
*/\r
#define ExGetCurrentResourceThread() ((ERESOURCE_THREAD)PsGetCurrentThread())\r
\r
-#endif // !defined(_WIN64)\r
-\r
-#if (NTDDI_VERSION >= NTDDI_WIN2K)\r
+#define ExReleaseResource(R) (ExReleaseResourceLite(R))\r
\r
-#if defined(_NTHAL_) && defined(_X86_)\r
-#define ExAcquireFastMutex ExiAcquireFastMutex\r
-#define ExReleaseFastMutex ExiReleaseFastMutex\r
-#define ExTryToAcquireFastMutex ExiTryToAcquireFastMutex\r
-#endif\r
+/* VOID\r
+ * ExInitializeWorkItem(\r
+ * IN PWORK_QUEUE_ITEM Item,\r
+ * IN PWORKER_THREAD_ROUTINE Routine,\r
+ * IN PVOID Context)\r
+ */\r
+#define ExInitializeWorkItem(Item, Routine, Context) \\r
+{ \\r
+ (Item)->WorkerRoutine = Routine; \\r
+ (Item)->Parameter = Context; \\r
+ (Item)->List.Flink = NULL; \\r
+}\r
\r
-#if defined(_X86_)\r
-#define ExInterlockedAddUlong ExfInterlockedAddUlong\r
-#define ExInterlockedInsertHeadList ExfInterlockedInsertHeadList\r
-#define ExInterlockedInsertTailList ExfInterlockedInsertTailList\r
-#define ExInterlockedRemoveHeadList ExfInterlockedRemoveHeadList\r
-#define ExInterlockedPopEntryList ExfInterlockedPopEntryList\r
-#define ExInterlockedPushEntryList ExfInterlockedPushEntryList\r
-#endif\r
+#if (NTDDI_VERSION >= NTDDI_WIN2K)\r
\r
NTKERNELAPI\r
VOID\r
ExTryToAcquireFastMutex(\r
IN OUT PFAST_MUTEX FastMutex);\r
\r
+NTKERNELAPI\r
+VOID\r
+FASTCALL\r
+ExAcquireFastMutexUnsafe(\r
+ IN OUT PFAST_MUTEX FastMutex);\r
+\r
+NTKERNELAPI\r
+VOID\r
+FASTCALL\r
+ExReleaseFastMutexUnsafe(\r
+ IN OUT PFAST_MUTEX FastMutex);\r
+\r
NTKERNELAPI\r
BOOLEAN\r
NTAPI\r
IN PVOID Argument1,\r
IN PVOID Argument2);\r
\r
+NTKERNELAPI\r
+VOID\r
+NTAPI\r
+ExQueueWorkItem(\r
+ IN PWORK_QUEUE_ITEM WorkItem,\r
+ IN WORK_QUEUE_TYPE QueueType);\r
+\r
NTKERNELAPI\r
DECLSPEC_NORETURN\r
VOID\r
#endif\r
\r
\r
-/******************************************************************************\r
- * WINBASE Functions *\r
- ******************************************************************************/\r
-#if !defined(_WINBASE_)\r
-\r
-#if defined(_WIN64)\r
-\r
-#define InterlockedPopEntrySList(Head) \\r
- ExpInterlockedPopEntrySList(Head)\r
-\r
-#define InterlockedPushEntrySList(Head, Entry) \\r
- ExpInterlockedPushEntrySList(Head, Entry)\r
-\r
-#define InterlockedFlushSList(Head) \\r
- ExpInterlockedFlushSList(Head)\r
-\r
-#define QueryDepthSList(Head) \\r
- ExQueryDepthSList(Head)\r
+#if !defined(MIDL_PASS)\r
\r
-#else // !defined(_WIN64)\r
+static __inline PVOID\r
+ExAllocateFromNPagedLookasideList(\r
+ IN PNPAGED_LOOKASIDE_LIST Lookaside)\r
+{\r
+ PVOID Entry;\r
+\r
+ Lookaside->L.TotalAllocates++;\r
+ Entry = InterlockedPopEntrySList(&Lookaside->L.ListHead);\r
+ if (Entry == NULL) {\r
+ Lookaside->L.AllocateMisses++;\r
+ Entry = (Lookaside->L.Allocate)(Lookaside->L.Type,\r
+ Lookaside->L.Size,\r
+ Lookaside->L.Tag);\r
+ }\r
+ return Entry;\r
+}\r
\r
-NTKERNELAPI\r
-PSLIST_ENTRY\r
-FASTCALL\r
-InterlockedPopEntrySList(\r
- IN PSLIST_HEADER ListHead);\r
+static __inline PVOID\r
+ExAllocateFromPagedLookasideList(\r
+ IN PPAGED_LOOKASIDE_LIST Lookaside)\r
+{\r
+ PVOID Entry;\r
+\r
+ Lookaside->L.TotalAllocates++;\r
+ Entry = InterlockedPopEntrySList(&Lookaside->L.ListHead);\r
+ if (Entry == NULL) {\r
+ Lookaside->L.AllocateMisses++;\r
+ Entry = (Lookaside->L.Allocate)(Lookaside->L.Type,\r
+ Lookaside->L.Size,\r
+ Lookaside->L.Tag);\r
+ }\r
+ return Entry;\r
+}\r
\r
-NTKERNELAPI\r
-PSLIST_ENTRY\r
-FASTCALL\r
-InterlockedPushEntrySList(\r
- IN PSLIST_HEADER ListHead,\r
- IN PSLIST_ENTRY ListEntry);\r
+static __inline VOID\r
+ExFreeToNPagedLookasideList(\r
+ IN PNPAGED_LOOKASIDE_LIST Lookaside,\r
+ IN PVOID Entry)\r
+{\r
+ Lookaside->L.TotalFrees++;\r
+ if (ExQueryDepthSList(&Lookaside->L.ListHead) >= Lookaside->L.Depth) {\r
+ Lookaside->L.FreeMisses++;\r
+ (Lookaside->L.Free)(Entry);\r
+ } else {\r
+ InterlockedPushEntrySList(&Lookaside->L.ListHead, (PSLIST_ENTRY)Entry);\r
+ }\r
+}\r
\r
-#define InterlockedFlushSList(ListHead) \\r
- ExInterlockedFlushSList(ListHead)\r
+static __inline VOID\r
+ExFreeToPagedLookasideList(\r
+ IN PPAGED_LOOKASIDE_LIST Lookaside,\r
+ IN PVOID Entry)\r
+{\r
+ Lookaside->L.TotalFrees++;\r
+ if (ExQueryDepthSList(&Lookaside->L.ListHead) >= Lookaside->L.Depth) {\r
+ Lookaside->L.FreeMisses++;\r
+ (Lookaside->L.Free)(Entry);\r
+ } else {\r
+ InterlockedPushEntrySList(&Lookaside->L.ListHead, (PSLIST_ENTRY)Entry);\r
+ }\r
+}\r
\r
-#define QueryDepthSList(Head) \\r
- ExQueryDepthSList(Head)\r
\r
-#endif // !defined(_WIN64)\r
+#endif // !defined(MIDL_PASS)\r
\r
-#endif // !defined(_WINBASE_)\r
\r
#ifdef __cplusplus\r
}\r