1 /* 2 * wdm.h 3 * 4 * Windows NT WDM Driver Developer Kit 5 * 6 * This file is part of the ReactOS DDK package. 7 * 8 * Contributors: 9 * Amine Khaldi (amine.khaldi@reactos.org) 10 * Timo Kreuzer (timo.kreuzer@reactos.org) 11 * 12 * THIS SOFTWARE IS NOT COPYRIGHTED 13 * 14 * This source code is offered for use in the public domain. You may 15 * use, modify or distribute it freely. 16 * 17 * This code is distributed in the hope that it will be useful but 18 * WITHOUT ANY WARRANTY. ALL WARRANTIES, EXPRESS OR IMPLIED ARE HEREBY 19 * DISCLAIMED. This includes but is not limited to warranties of 20 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 21 * 22 */ 23 #pragma once 24 25 #ifndef _WDMDDK_ 26 #define _WDMDDK_ 27 28 #define WDM_MAJORVERSION 0x06 29 #define WDM_MINORVERSION 0x00 30 31 /* Included via ntddk.h? */ 32 #ifndef _NTDDK_ 33 #define _NTDDK_ 34 #define _WDM_INCLUDED_ 35 #define _DDK_DRIVER_ 36 #define NO_INTERLOCKED_INTRINSICS 37 #endif /* _NTDDK_ */ 38 39 /* Dependencies */ 40 #define NT_INCLUDED 41 #include <excpt.h> 42 #include <ntdef.h> 43 #include <ntstatus.h> 44 #include <kernelspecs.h> 45 #include <ntiologc.h> 46 #include <suppress.h> 47 48 #ifndef GUID_DEFINED 49 #include <guiddef.h> 50 #endif 51 52 #ifdef _MAC 53 #ifndef _INC_STRING 54 #include <string.h> 55 #endif /* _INC_STRING */ 56 #else 57 #include <string.h> 58 #endif /* _MAC */ 59 60 #ifndef _KTMTYPES_ 61 typedef GUID UOW, *PUOW; 62 #endif 63 64 typedef GUID *PGUID; 65 66 #if (NTDDI_VERSION >= NTDDI_WINXP) 67 #include <dpfilter.h> 68 #endif 69 70 #include "intrin.h" 71 72 __internal_kernel_driver 73 __drv_Mode_impl(WDM_INCLUDED) 74 75 #ifdef __cplusplus 76 extern "C" { 77 #endif 78 79 $define(UCHAR=UCHAR) 80 $define(ULONG=ULONG) 81 $define(USHORT=USHORT) 82 83 #if !defined(_NTHALDLL_) && !defined(_BLDR_) 84 #define NTHALAPI DECLSPEC_IMPORT 85 #else 86 #define NTHALAPI 87 #endif 88 89 /* For ReactOS */ 90 #if !defined(_NTOSKRNL_) && !defined(_BLDR_) && !defined(_NTSYSTEM_) 91 #define NTKERNELAPI DECLSPEC_IMPORT 92 #else 93 #define NTKERNELAPI 94 #ifndef _NTSYSTEM_ 95 #define _NTSYSTEM_ 96 #endif 97 #endif 98 99 #if defined(_X86_) && !defined(_NTHAL_) 100 #define _DECL_HAL_KE_IMPORT DECLSPEC_IMPORT 101 #elif defined(_X86_) 102 #define _DECL_HAL_KE_IMPORT 103 #else 104 #define _DECL_HAL_KE_IMPORT NTKERNELAPI 105 #endif 106 107 #if defined(_WIN64) 108 #define POINTER_ALIGNMENT DECLSPEC_ALIGN(8) 109 #else 110 #define POINTER_ALIGNMENT 111 #endif 112 113 /* Helper macro to enable gcc's extension. */ 114 #ifndef __GNU_EXTENSION 115 #ifdef __GNUC__ 116 #define __GNU_EXTENSION __extension__ 117 #else 118 #define __GNU_EXTENSION 119 #endif 120 #endif 121 122 #if defined(_MSC_VER) 123 124 /* Disable some warnings */ 125 #pragma warning(disable:4115) /* Named type definition in parentheses */ 126 #pragma warning(disable:4201) /* Nameless unions and structs */ 127 #pragma warning(disable:4214) /* Bit fields of other types than int */ 128 #pragma warning(disable:4820) /* Padding added, due to alignment requirement */ 129 130 /* Indicate if #pragma alloc_text() is supported */ 131 #if defined(_M_IX86) || defined(_M_AMD64) || defined(_M_IA64) 132 #define ALLOC_PRAGMA 1 133 #endif 134 135 /* Indicate if #pragma data_seg() is supported */ 136 #if defined(_M_IX86) || defined(_M_AMD64) 137 #define ALLOC_DATA_PRAGMA 1 138 #endif 139 140 #endif /* _MSC_VER */ 141 142 /* These macros are used to create aliases for imported data. We need to do 143 this to have declarations that are compatible with MS DDK */ 144 #ifdef _M_IX86 145 #define __SYMBOL(_Name) "_"#_Name 146 #define __IMPORTSYMBOL(_Name) "__imp__"#_Name 147 #define __IMPORTNAME(_Name) __imp__##_Name 148 #else 149 #define __SYMBOL(_Name) #_Name 150 #define __IMPORTSYMBOL(_Name) "__imp_"#_Name 151 #define __IMPORTNAME(_Name) __imp_##_Name 152 #endif 153 #if defined(_MSC_VER) && !defined(__clang__) 154 #define __CREATE_NTOS_DATA_IMPORT_ALIAS(_Name) \ 155 __pragma(comment(linker, "/alternatename:"__SYMBOL(_Name) "=" __IMPORTSYMBOL(_Name))) 156 #else /* !_MSC_VER */ 157 #ifndef __STRINGIFY 158 #define __STRINGIFY(_exp) #_exp 159 #endif 160 #define _Pragma_redefine_extname(_Name, _Target) _Pragma(__STRINGIFY(redefine_extname _Name _Target)) 161 #define __CREATE_NTOS_DATA_IMPORT_ALIAS(_Name) \ 162 _Pragma_redefine_extname(_Name,__IMPORTNAME(_Name)) 163 #endif 164 165 #if defined(_WIN64) 166 #if !defined(USE_DMA_MACROS) && !defined(_NTHAL_) 167 #define USE_DMA_MACROS 168 #endif 169 #if !defined(NO_LEGACY_DRIVERS) && !defined(__REACTOS__) 170 #define NO_LEGACY_DRIVERS 171 #endif 172 #endif /* defined(_WIN64) */ 173 174 /* Forward declarations */ 175 struct _IRP; 176 struct _MDL; 177 struct _KAPC; 178 struct _KDPC; 179 struct _FILE_OBJECT; 180 struct _DMA_ADAPTER; 181 struct _DEVICE_OBJECT; 182 struct _DRIVER_OBJECT; 183 struct _IO_STATUS_BLOCK; 184 struct _DEVICE_DESCRIPTION; 185 struct _SCATTER_GATHER_LIST; 186 struct _DRIVE_LAYOUT_INFORMATION; 187 struct _COMPRESSED_DATA_INFO; 188 struct _IO_RESOURCE_DESCRIPTOR; 189 190 /* Structures not exposed to drivers */ 191 typedef struct _OBJECT_TYPE *POBJECT_TYPE; 192 typedef struct _HAL_DISPATCH_TABLE *PHAL_DISPATCH_TABLE; 193 typedef struct _HAL_PRIVATE_DISPATCH_TABLE *PHAL_PRIVATE_DISPATCH_TABLE; 194 typedef struct _CALLBACK_OBJECT *PCALLBACK_OBJECT; 195 typedef struct _EPROCESS *PEPROCESS; 196 typedef struct _ETHREAD *PETHREAD; 197 typedef struct _IO_TIMER *PIO_TIMER; 198 typedef struct _KINTERRUPT *PKINTERRUPT; 199 typedef struct _KPROCESS *PKPROCESS; 200 typedef struct _KTHREAD *PKTHREAD, *PRKTHREAD; 201 typedef struct _CONTEXT *PCONTEXT; 202 203 #if defined(USE_DMA_MACROS) && !defined(_NTHAL_) 204 typedef struct _DMA_ADAPTER *PADAPTER_OBJECT; 205 #elif defined(_WDM_INCLUDED_) 206 typedef struct _DMA_ADAPTER *PADAPTER_OBJECT; 207 #else 208 typedef struct _ADAPTER_OBJECT *PADAPTER_OBJECT; 209 #endif 210 211 #ifndef DEFINE_GUIDEX 212 #ifdef _MSC_VER 213 #define DEFINE_GUIDEX(name) EXTERN_C const CDECL GUID name 214 #else 215 #define DEFINE_GUIDEX(name) EXTERN_C const GUID name 216 #endif 217 #endif /* DEFINE_GUIDEX */ 218 219 #ifndef STATICGUIDOF 220 #define STATICGUIDOF(guid) STATIC_##guid 221 #endif 222 223 /* GUID Comparison */ 224 #ifndef __IID_ALIGNED__ 225 #define __IID_ALIGNED__ 226 #ifdef __cplusplus 227 inline int IsEqualGUIDAligned(REFGUID guid1, REFGUID guid2) 228 { 229 return ( (*(PLONGLONG)(&guid1) == *(PLONGLONG)(&guid2)) && 230 (*((PLONGLONG)(&guid1) + 1) == *((PLONGLONG)(&guid2) + 1)) ); 231 } 232 #else 233 #define IsEqualGUIDAligned(guid1, guid2) \ 234 ( (*(PLONGLONG)(guid1) == *(PLONGLONG)(guid2)) && \ 235 (*((PLONGLONG)(guid1) + 1) == *((PLONGLONG)(guid2) + 1)) ) 236 #endif /* __cplusplus */ 237 #endif /* !__IID_ALIGNED__ */ 238 239 240 $define (_WDMDDK_) 241 $include (interlocked.h) 242 $include (rtltypes.h) 243 $include (ketypes.h) 244 $include (mmtypes.h) 245 $include (extypes.h) 246 $include (setypes.h) 247 $include (potypes.h) 248 $include (cmtypes.h) 249 $include (iotypes.h) 250 $include (obtypes.h) 251 $include (pstypes.h) 252 $include (wmitypes.h) 253 254 $include (kdfuncs.h) 255 $include (kefuncs.h) 256 $include (rtlfuncs.h) 257 $include (mmfuncs.h) 258 $include (sefuncs.h) 259 $include (cmfuncs.h) 260 $include (iofuncs.h) 261 $include (pofuncs.h) 262 $include (exfuncs.h) 263 $include (obfuncs.h) 264 $include (psfuncs.h) 265 $include (wmifuncs.h) 266 $include (halfuncs.h) 267 $include (nttmapi.h) 268 $include (zwfuncs.h) 269 270 #ifdef __cplusplus 271 } 272 #endif 273 274 #endif /* !_WDMDDK_ */ 275