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 #endif 95 96 /* For statically-linked ntoskrnl_vista library */ 97 #if defined(NTKRNLVISTA) 98 #define NTKRNLVISTAAPI 99 #else 100 #define NTKRNLVISTAAPI NTKERNELAPI 101 #endif 102 103 #if defined(_X86_) && !defined(_NTHAL_) 104 #define _DECL_HAL_KE_IMPORT DECLSPEC_IMPORT 105 #elif defined(_X86_) 106 #define _DECL_HAL_KE_IMPORT 107 #else 108 #define _DECL_HAL_KE_IMPORT NTKERNELAPI 109 #endif 110 111 #if defined(_WIN64) 112 #define POINTER_ALIGNMENT DECLSPEC_ALIGN(8) 113 #else 114 #define POINTER_ALIGNMENT 115 #endif 116 117 /* Helper macro to enable gcc's extension */ 118 #ifndef __GNU_EXTENSION 119 #ifdef __GNUC__ 120 #define __GNU_EXTENSION __extension__ 121 #else 122 #define __GNU_EXTENSION 123 #endif 124 #endif 125 126 #if defined(_MSC_VER) 127 128 /* Disable some warnings */ 129 #pragma warning(disable:4115) /* Named type definition in parentheses */ 130 #pragma warning(disable:4201) /* Nameless unions and structs */ 131 #pragma warning(disable:4214) /* Bit fields of other types than int */ 132 #pragma warning(disable:4820) /* Padding added, due to alignment requirement */ 133 134 /* Indicate if #pragma alloc_text() is supported */ 135 #if defined(_M_IX86) || defined(_M_AMD64) || defined(_M_IA64) 136 #define ALLOC_PRAGMA 1 137 #endif 138 139 /* Indicate if #pragma data_seg() is supported */ 140 #if defined(_M_IX86) || defined(_M_AMD64) 141 #define ALLOC_DATA_PRAGMA 1 142 #endif 143 144 #endif /* _MSC_VER */ 145 146 /* These macros are used to create aliases for imported data. We need to do 147 this to have declarations that are compatible with MS DDK */ 148 #ifdef _M_IX86 149 #define __SYMBOL(_Name) "_"#_Name 150 #define __IMPORTSYMBOL(_Name) "__imp__"#_Name 151 #define __IMPORTNAME(_Name) __imp__##_Name 152 #else 153 #define __SYMBOL(_Name) #_Name 154 #define __IMPORTSYMBOL(_Name) "__imp_"#_Name 155 #define __IMPORTNAME(_Name) __imp_##_Name 156 #endif 157 #if defined(_MSC_VER) && !defined(__clang__) 158 #define __CREATE_NTOS_DATA_IMPORT_ALIAS(_Name) \ 159 __pragma(comment(linker, "/alternatename:"__SYMBOL(_Name) "=" __IMPORTSYMBOL(_Name))) 160 #else /* !_MSC_VER */ 161 #ifndef __STRINGIFY 162 #define __STRINGIFY(_exp) #_exp 163 #endif 164 #define _Pragma_redefine_extname(_Name, _Target) _Pragma(__STRINGIFY(redefine_extname _Name _Target)) 165 #define __CREATE_NTOS_DATA_IMPORT_ALIAS(_Name) \ 166 _Pragma_redefine_extname(_Name,__IMPORTNAME(_Name)) 167 #endif 168 169 #if defined(_WIN64) 170 #if !defined(USE_DMA_MACROS) && !defined(_NTHAL_) 171 #define USE_DMA_MACROS 172 #endif 173 #if !defined(NO_LEGACY_DRIVERS) && !defined(__REACTOS__) 174 #define NO_LEGACY_DRIVERS 175 #endif 176 #endif /* defined(_WIN64) */ 177 178 /* Forward declarations */ 179 struct _IRP; 180 struct _MDL; 181 struct _KAPC; 182 struct _KDPC; 183 struct _FILE_OBJECT; 184 struct _DMA_ADAPTER; 185 struct _DEVICE_OBJECT; 186 struct _DRIVER_OBJECT; 187 struct _IO_STATUS_BLOCK; 188 struct _DEVICE_DESCRIPTION; 189 struct _SCATTER_GATHER_LIST; 190 struct _DRIVE_LAYOUT_INFORMATION; 191 struct _COMPRESSED_DATA_INFO; 192 struct _IO_RESOURCE_DESCRIPTOR; 193 194 /* Structures not exposed to drivers */ 195 typedef struct _OBJECT_TYPE *POBJECT_TYPE; 196 typedef struct _CALLBACK_OBJECT *PCALLBACK_OBJECT; 197 typedef struct _EPROCESS *PEPROCESS; 198 typedef struct _ETHREAD *PETHREAD; 199 typedef struct _IO_TIMER *PIO_TIMER; 200 typedef struct _KINTERRUPT *PKINTERRUPT; 201 typedef struct _KPROCESS *PKPROCESS; 202 typedef struct _KTHREAD *PKTHREAD, *PRKTHREAD; 203 typedef struct _CONTEXT *PCONTEXT; 204 205 #if defined(USE_DMA_MACROS) && !defined(_NTHAL_) 206 typedef struct _DMA_ADAPTER *PADAPTER_OBJECT; 207 #elif defined(_WDM_INCLUDED_) 208 typedef struct _DMA_ADAPTER *PADAPTER_OBJECT; 209 #else 210 typedef struct _ADAPTER_OBJECT *PADAPTER_OBJECT; 211 #endif 212 213 #ifndef DEFINE_GUIDEX 214 #ifdef _MSC_VER 215 #define DEFINE_GUIDEX(name) EXTERN_C const CDECL GUID name 216 #else 217 #define DEFINE_GUIDEX(name) EXTERN_C const GUID name 218 #endif 219 #endif /* DEFINE_GUIDEX */ 220 221 #ifndef STATICGUIDOF 222 #define STATICGUIDOF(guid) STATIC_##guid 223 #endif 224 225 /* GUID Comparison */ 226 #ifndef __IID_ALIGNED__ 227 #define __IID_ALIGNED__ 228 #ifdef __cplusplus 229 inline int IsEqualGUIDAligned(REFGUID guid1, REFGUID guid2) 230 { 231 return ( (*(PLONGLONG)(&guid1) == *(PLONGLONG)(&guid2)) && 232 (*((PLONGLONG)(&guid1) + 1) == *((PLONGLONG)(&guid2) + 1)) ); 233 } 234 #else 235 #define IsEqualGUIDAligned(guid1, guid2) \ 236 ( (*(PLONGLONG)(guid1) == *(PLONGLONG)(guid2)) && \ 237 (*((PLONGLONG)(guid1) + 1) == *((PLONGLONG)(guid2) + 1)) ) 238 #endif /* __cplusplus */ 239 #endif /* !__IID_ALIGNED__ */ 240 241 242 $define (_WDMDDK_) 243 $include (interlocked.h) 244 $include (rtltypes.h) 245 $include (ketypes.h) 246 $include (mmtypes.h) 247 $include (extypes.h) 248 $include (setypes.h) 249 $include (potypes.h) 250 $include (cmtypes.h) 251 $include (iotypes.h) 252 $include (obtypes.h) 253 $include (pstypes.h) 254 $include (wmitypes.h) 255 256 $include (kdfuncs.h) 257 $include (kefuncs.h) 258 $include (rtlfuncs.h) 259 $include (mmfuncs.h) 260 $include (sefuncs.h) 261 $include (cmfuncs.h) 262 $include (iofuncs.h) 263 $include (pofuncs.h) 264 $include (exfuncs.h) 265 $include (obfuncs.h) 266 $include (psfuncs.h) 267 $include (wmifuncs.h) 268 $include (halfuncs.h) 269 $include (nttmapi.h) 270 $include (zwfuncs.h) 271 272 #ifdef __cplusplus 273 } 274 #endif 275 276 #endif /* !_WDMDDK_ */ 277