Mercurial > games > semicongine
comparison fuhtark_test/include/ddk/wdm.h @ 1500:91c8c3b7cbf0
add: futhark tests for generating vulkan api
| author | sam <sam@basx.dev> |
|---|---|
| date | Wed, 26 Nov 2025 21:36:48 +0700 |
| parents | |
| children |
comparison
equal
deleted
inserted
replaced
| 1499:1f58458b7ef7 | 1500:91c8c3b7cbf0 |
|---|---|
| 1 #ifndef _WDMDDK_ | |
| 2 #define _WDMDDK_ | |
| 3 | |
| 4 // | |
| 5 // Dependencies | |
| 6 // | |
| 7 #define NT_INCLUDED | |
| 8 #include <excpt.h> | |
| 9 #include <ntdef.h> | |
| 10 #include <ntstatus.h> | |
| 11 | |
| 12 #ifndef GUID_DEFINED | |
| 13 #include <guiddef.h> | |
| 14 #endif /* GUID_DEFINED */ | |
| 15 | |
| 16 #include "intrin.h" | |
| 17 | |
| 18 #ifdef __cplusplus | |
| 19 extern "C" { | |
| 20 #endif | |
| 21 | |
| 22 #define NTKERNELAPI DECLSPEC_IMPORT | |
| 23 | |
| 24 #ifdef _WIN64 | |
| 25 #define PORT_MAXIMUM_MESSAGE_LENGTH 512 | |
| 26 #else | |
| 27 #define PORT_MAXIMUM_MESSAGE_LENGTH 256 | |
| 28 #endif | |
| 29 | |
| 30 | |
| 31 #if defined(_MSC_VER) | |
| 32 | |
| 33 // | |
| 34 // Indicate if #pragma alloc_text() is supported | |
| 35 // | |
| 36 #if defined(_M_IX86) || defined(_M_AMD64) || defined(_M_IA64) | |
| 37 #define ALLOC_PRAGMA 1 | |
| 38 #endif | |
| 39 | |
| 40 // | |
| 41 // Indicate if #pragma data_seg() is supported | |
| 42 // | |
| 43 #if defined(_M_IX86) || defined(_M_AMD64) | |
| 44 #define ALLOC_DATA_PRAGMA 1 | |
| 45 #endif | |
| 46 | |
| 47 #endif | |
| 48 | |
| 49 | |
| 50 /* Simple types */ | |
| 51 typedef UCHAR KPROCESSOR_MODE; | |
| 52 typedef LONG KPRIORITY; | |
| 53 typedef PVOID PSECURITY_DESCRIPTOR; | |
| 54 typedef ULONG SECURITY_INFORMATION, *PSECURITY_INFORMATION; | |
| 55 | |
| 56 /* Structures not exposed to drivers */ | |
| 57 typedef struct _OBJECT_TYPE *POBJECT_TYPE; | |
| 58 typedef struct _HAL_DISPATCH_TABLE *PHAL_DISPATCH_TABLE; | |
| 59 typedef struct _HAL_PRIVATE_DISPATCH_TABLE *PHAL_PRIVATE_DISPATCH_TABLE; | |
| 60 typedef struct _DEVICE_HANDLER_OBJECT *PDEVICE_HANDLER_OBJECT; | |
| 61 typedef struct _BUS_HANDLER *PBUS_HANDLER; | |
| 62 | |
| 63 typedef struct _ADAPTER_OBJECT *PADAPTER_OBJECT; | |
| 64 typedef struct _CALLBACK_OBJECT *PCALLBACK_OBJECT; | |
| 65 typedef struct _ETHREAD *PETHREAD; | |
| 66 typedef struct _EPROCESS *PEPROCESS; | |
| 67 typedef struct _IO_TIMER *PIO_TIMER; | |
| 68 typedef struct _KINTERRUPT *PKINTERRUPT; | |
| 69 typedef struct _KPROCESS *PKPROCESS; | |
| 70 typedef struct _KTHREAD *PKTHREAD, *PRKTHREAD; | |
| 71 | |
| 72 | |
| 73 typedef struct _CONTEXT *PCONTEXT; | |
| 74 | |
| 75 // | |
| 76 // Resource list definitions | |
| 77 // | |
| 78 typedef int CM_RESOURCE_TYPE; | |
| 79 | |
| 80 #define CmResourceTypeNull 0 | |
| 81 #define CmResourceTypePort 1 | |
| 82 #define CmResourceTypeInterrupt 2 | |
| 83 #define CmResourceTypeMemory 3 | |
| 84 #define CmResourceTypeDma 4 | |
| 85 #define CmResourceTypeDeviceSpecific 5 | |
| 86 #define CmResourceTypeBusNumber 6 | |
| 87 #define CmResourceTypeNonArbitrated 128 | |
| 88 #define CmResourceTypeConfigData 128 | |
| 89 #define CmResourceTypeDevicePrivate 129 | |
| 90 #define CmResourceTypePcCardConfig 130 | |
| 91 #define CmResourceTypeMfCardConfig 131 | |
| 92 | |
| 93 typedef enum _INTERFACE_TYPE { | |
| 94 InterfaceTypeUndefined = -1, | |
| 95 Internal, | |
| 96 Isa, | |
| 97 Eisa, | |
| 98 MicroChannel, | |
| 99 TurboChannel, | |
| 100 PCIBus, | |
| 101 VMEBus, | |
| 102 NuBus, | |
| 103 PCMCIABus, | |
| 104 CBus, | |
| 105 MPIBus, | |
| 106 MPSABus, | |
| 107 ProcessorInternal, | |
| 108 InternalPowerBus, | |
| 109 PNPISABus, | |
| 110 PNPBus, | |
| 111 MaximumInterfaceType | |
| 112 } INTERFACE_TYPE, *PINTERFACE_TYPE; | |
| 113 | |
| 114 /* IO_RESOURCE_DESCRIPTOR.Option */ | |
| 115 | |
| 116 #define IO_RESOURCE_PREFERRED 0x01 | |
| 117 #define IO_RESOURCE_DEFAULT 0x02 | |
| 118 #define IO_RESOURCE_ALTERNATIVE 0x08 | |
| 119 | |
| 120 typedef struct _IO_RESOURCE_DESCRIPTOR { | |
| 121 UCHAR Option; | |
| 122 UCHAR Type; | |
| 123 UCHAR ShareDisposition; | |
| 124 UCHAR Spare1; | |
| 125 USHORT Flags; | |
| 126 USHORT Spare2; | |
| 127 union { | |
| 128 struct { | |
| 129 ULONG Length; | |
| 130 ULONG Alignment; | |
| 131 PHYSICAL_ADDRESS MinimumAddress; | |
| 132 PHYSICAL_ADDRESS MaximumAddress; | |
| 133 } Port; | |
| 134 struct { | |
| 135 ULONG Length; | |
| 136 ULONG Alignment; | |
| 137 PHYSICAL_ADDRESS MinimumAddress; | |
| 138 PHYSICAL_ADDRESS MaximumAddress; | |
| 139 } Memory; | |
| 140 struct { | |
| 141 ULONG MinimumVector; | |
| 142 ULONG MaximumVector; | |
| 143 } Interrupt; | |
| 144 struct { | |
| 145 ULONG MinimumChannel; | |
| 146 ULONG MaximumChannel; | |
| 147 } Dma; | |
| 148 struct { | |
| 149 ULONG Length; | |
| 150 ULONG Alignment; | |
| 151 PHYSICAL_ADDRESS MinimumAddress; | |
| 152 PHYSICAL_ADDRESS MaximumAddress; | |
| 153 } Generic; | |
| 154 struct { | |
| 155 ULONG Data[3]; | |
| 156 } DevicePrivate; | |
| 157 struct { | |
| 158 ULONG Length; | |
| 159 ULONG MinBusNumber; | |
| 160 ULONG MaxBusNumber; | |
| 161 ULONG Reserved; | |
| 162 } BusNumber; | |
| 163 struct { | |
| 164 ULONG Priority; | |
| 165 ULONG Reserved1; | |
| 166 ULONG Reserved2; | |
| 167 } ConfigData; | |
| 168 } u; | |
| 169 } IO_RESOURCE_DESCRIPTOR, *PIO_RESOURCE_DESCRIPTOR; | |
| 170 | |
| 171 typedef struct _IO_RESOURCE_LIST { | |
| 172 USHORT Version; | |
| 173 USHORT Revision; | |
| 174 ULONG Count; | |
| 175 IO_RESOURCE_DESCRIPTOR Descriptors[1]; | |
| 176 } IO_RESOURCE_LIST, *PIO_RESOURCE_LIST; | |
| 177 | |
| 178 typedef struct _IO_RESOURCE_REQUIREMENTS_LIST { | |
| 179 ULONG ListSize; | |
| 180 INTERFACE_TYPE InterfaceType; | |
| 181 ULONG BusNumber; | |
| 182 ULONG SlotNumber; | |
| 183 ULONG Reserved[3]; | |
| 184 ULONG AlternativeLists; | |
| 185 IO_RESOURCE_LIST List[1]; | |
| 186 } IO_RESOURCE_REQUIREMENTS_LIST, *PIO_RESOURCE_REQUIREMENTS_LIST; | |
| 187 | |
| 188 // | |
| 189 // Global debug flag | |
| 190 // | |
| 191 extern ULONG NtGlobalFlag; | |
| 192 | |
| 193 | |
| 194 #include <pshpack4.h> | |
| 195 typedef struct _CM_PARTIAL_RESOURCE_DESCRIPTOR { | |
| 196 UCHAR Type; | |
| 197 UCHAR ShareDisposition; | |
| 198 USHORT Flags; | |
| 199 union { | |
| 200 struct { | |
| 201 PHYSICAL_ADDRESS Start; | |
| 202 ULONG Length; | |
| 203 } Generic; | |
| 204 struct { | |
| 205 PHYSICAL_ADDRESS Start; | |
| 206 ULONG Length; | |
| 207 } Port; | |
| 208 struct { | |
| 209 ULONG Level; | |
| 210 ULONG Vector; | |
| 211 KAFFINITY Affinity; | |
| 212 } Interrupt; | |
| 213 #if (NTDDI_VERSION >= NTDDI_LONGHORN) | |
| 214 struct { | |
| 215 union { | |
| 216 struct { | |
| 217 USHORT Reserved; | |
| 218 USHORT MessageCount; | |
| 219 ULONG Vector; | |
| 220 KAFFINITY Affinity; | |
| 221 } Raw; | |
| 222 struct { | |
| 223 ULONG Level; | |
| 224 ULONG Vector; | |
| 225 KAFFINITY Affinity; | |
| 226 } Translated; | |
| 227 }; | |
| 228 } MessageInterrupt; | |
| 229 #endif | |
| 230 struct { | |
| 231 PHYSICAL_ADDRESS Start; | |
| 232 ULONG Length; | |
| 233 } Memory; | |
| 234 struct { | |
| 235 ULONG Channel; | |
| 236 ULONG Port; | |
| 237 ULONG Reserved1; | |
| 238 } Dma; | |
| 239 struct { | |
| 240 ULONG Data[3]; | |
| 241 } DevicePrivate; | |
| 242 struct { | |
| 243 ULONG Start; | |
| 244 ULONG Length; | |
| 245 ULONG Reserved; | |
| 246 } BusNumber; | |
| 247 struct { | |
| 248 ULONG DataSize; | |
| 249 ULONG Reserved1; | |
| 250 ULONG Reserved2; | |
| 251 } DeviceSpecificData; | |
| 252 #if (NTDDI_VERSION >= NTDDI_LONGHORN) | |
| 253 struct { | |
| 254 PHYSICAL_ADDRESS Start; | |
| 255 ULONG Length40; | |
| 256 } Memory40; | |
| 257 struct { | |
| 258 PHYSICAL_ADDRESS Start; | |
| 259 ULONG Length48; | |
| 260 } Memory48; | |
| 261 struct { | |
| 262 PHYSICAL_ADDRESS Start; | |
| 263 ULONG Length64; | |
| 264 } Memory64; | |
| 265 #endif | |
| 266 } u; | |
| 267 } CM_PARTIAL_RESOURCE_DESCRIPTOR, *PCM_PARTIAL_RESOURCE_DESCRIPTOR; | |
| 268 #include <poppack.h> | |
| 269 | |
| 270 // | |
| 271 // Section map options | |
| 272 // | |
| 273 typedef enum _SECTION_INHERIT { | |
| 274 ViewShare = 1, | |
| 275 ViewUnmap = 2 | |
| 276 } SECTION_INHERIT; | |
| 277 | |
| 278 // | |
| 279 // Section access rights | |
| 280 // | |
| 281 #define SECTION_QUERY 0x0001 | |
| 282 #define SECTION_MAP_WRITE 0x0002 | |
| 283 #define SECTION_MAP_READ 0x0004 | |
| 284 #define SECTION_MAP_EXECUTE 0x0008 | |
| 285 #define SECTION_EXTEND_SIZE 0x0010 | |
| 286 #define SECTION_MAP_EXECUTE_EXPLICIT 0x0020 | |
| 287 | |
| 288 #define SECTION_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED|SECTION_QUERY|\ | |
| 289 SECTION_MAP_WRITE | \ | |
| 290 SECTION_MAP_READ | \ | |
| 291 SECTION_MAP_EXECUTE | \ | |
| 292 SECTION_EXTEND_SIZE) | |
| 293 | |
| 294 #define SESSION_QUERY_ACCESS 0x0001 | |
| 295 #define SESSION_MODIFY_ACCESS 0x0002 | |
| 296 | |
| 297 #define SESSION_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | \ | |
| 298 SESSION_QUERY_ACCESS | \ | |
| 299 SESSION_MODIFY_ACCESS) | |
| 300 | |
| 301 | |
| 302 | |
| 303 #define SEGMENT_ALL_ACCESS SECTION_ALL_ACCESS | |
| 304 | |
| 305 #define PAGE_NOACCESS 0x01 | |
| 306 #define PAGE_READONLY 0x02 | |
| 307 #define PAGE_READWRITE 0x04 | |
| 308 #define PAGE_WRITECOPY 0x08 | |
| 309 #define PAGE_EXECUTE 0x10 | |
| 310 #define PAGE_EXECUTE_READ 0x20 | |
| 311 #define PAGE_EXECUTE_READWRITE 0x40 | |
| 312 #define PAGE_EXECUTE_WRITECOPY 0x80 | |
| 313 #define PAGE_GUARD 0x100 | |
| 314 #define PAGE_NOCACHE 0x200 | |
| 315 #define PAGE_WRITECOMBINE 0x400 | |
| 316 | |
| 317 #define MEM_COMMIT 0x1000 | |
| 318 #define MEM_RESERVE 0x2000 | |
| 319 #define MEM_DECOMMIT 0x4000 | |
| 320 #define MEM_RELEASE 0x8000 | |
| 321 #define MEM_FREE 0x10000 | |
| 322 #define MEM_PRIVATE 0x20000 | |
| 323 #define MEM_MAPPED 0x40000 | |
| 324 #define MEM_RESET 0x80000 | |
| 325 #define MEM_TOP_DOWN 0x100000 | |
| 326 #define MEM_LARGE_PAGES 0x20000000 | |
| 327 #define MEM_4MB_PAGES 0x80000000 | |
| 328 | |
| 329 #define SEC_RESERVE 0x4000000 | |
| 330 #define SEC_LARGE_PAGES 0x80000000 | |
| 331 | |
| 332 #define PROCESS_DUP_HANDLE (0x0040) | |
| 333 | |
| 334 #if (NTDDI_VERSION >= NTDDI_VISTA) | |
| 335 #define PROCESS_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | \ | |
| 336 0xFFFF) | |
| 337 #else | |
| 338 #define PROCESS_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | \ | |
| 339 0xFFF) | |
| 340 #endif | |
| 341 | |
| 342 | |
| 343 | |
| 344 // | |
| 345 // Processor features | |
| 346 // | |
| 347 #define PF_FLOATING_POINT_PRECISION_ERRATA 0 | |
| 348 #define PF_FLOATING_POINT_EMULATED 1 | |
| 349 #define PF_COMPARE_EXCHANGE_DOUBLE 2 | |
| 350 #define PF_MMX_INSTRUCTIONS_AVAILABLE 3 | |
| 351 #define PF_PPC_MOVEMEM_64BIT_OK 4 | |
| 352 #define PF_ALPHA_BYTE_INSTRUCTIONS 5 | |
| 353 #define PF_XMMI_INSTRUCTIONS_AVAILABLE 6 | |
| 354 #define PF_3DNOW_INSTRUCTIONS_AVAILABLE 7 | |
| 355 #define PF_RDTSC_INSTRUCTION_AVAILABLE 8 | |
| 356 #define PF_PAE_ENABLED 9 | |
| 357 #define PF_XMMI64_INSTRUCTIONS_AVAILABLE 10 | |
| 358 #define PF_SSE_DAZ_MODE_AVAILABLE 11 | |
| 359 #define PF_NX_ENABLED 12 | |
| 360 #define PF_SSE3_INSTRUCTIONS_AVAILABLE 13 | |
| 361 #define PF_COMPARE_EXCHANGE128 14 | |
| 362 #define PF_COMPARE64_EXCHANGE128 15 | |
| 363 #define PF_CHANNELS_ENABLED 16 | |
| 364 | |
| 365 | |
| 366 | |
| 367 // | |
| 368 // Intrinsics (note: taken from our winnt.h) | |
| 369 // FIXME: 64-bit | |
| 370 // | |
| 371 #if defined(__GNUC__) | |
| 372 | |
| 373 static __inline__ BOOLEAN | |
| 374 InterlockedBitTestAndSet(IN LONG volatile *Base, | |
| 375 IN LONG Bit) | |
| 376 { | |
| 377 #if defined(_M_IX86) | |
| 378 LONG OldBit; | |
| 379 __asm__ __volatile__("lock " | |
| 380 "btsl %2,%1\n\t" | |
| 381 "sbbl %0,%0\n\t" | |
| 382 :"=r" (OldBit),"+m" (*Base) | |
| 383 :"Ir" (Bit) | |
| 384 : "memory"); | |
| 385 return OldBit; | |
| 386 #else | |
| 387 return (_InterlockedOr(Base, 1 << Bit) >> Bit) & 1; | |
| 388 #endif | |
| 389 } | |
| 390 | |
| 391 static __inline__ BOOLEAN | |
| 392 InterlockedBitTestAndReset(IN LONG volatile *Base, | |
| 393 IN LONG Bit) | |
| 394 { | |
| 395 #if defined(_M_IX86) | |
| 396 LONG OldBit; | |
| 397 __asm__ __volatile__("lock " | |
| 398 "btrl %2,%1\n\t" | |
| 399 "sbbl %0,%0\n\t" | |
| 400 :"=r" (OldBit),"+m" (*Base) | |
| 401 :"Ir" (Bit) | |
| 402 : "memory"); | |
| 403 return OldBit; | |
| 404 #else | |
| 405 return (_InterlockedAnd(Base, ~(1 << Bit)) >> Bit) & 1; | |
| 406 #endif | |
| 407 } | |
| 408 | |
| 409 #endif | |
| 410 | |
| 411 #define BitScanForward _BitScanForward | |
| 412 #define BitScanReverse _BitScanReverse | |
| 413 | |
| 414 #define BitTest _bittest | |
| 415 #define BitTestAndComplement _bittestandcomplement | |
| 416 #define BitTestAndSet _bittestandset | |
| 417 #define BitTestAndReset _bittestandreset | |
| 418 #define InterlockedBitTestAndSet _interlockedbittestandset | |
| 419 #define InterlockedBitTestAndReset _interlockedbittestandreset | |
| 420 | |
| 421 | |
| 422 /** INTERLOCKED FUNCTIONS *****************************************************/ | |
| 423 | |
| 424 #if !defined(__INTERLOCKED_DECLARED) | |
| 425 #define __INTERLOCKED_DECLARED | |
| 426 | |
| 427 #if defined (_X86_) | |
| 428 #if defined(NO_INTERLOCKED_INTRINSICS) | |
| 429 NTKERNELAPI | |
| 430 LONG | |
| 431 FASTCALL | |
| 432 InterlockedIncrement( | |
| 433 IN OUT LONG volatile *Addend); | |
| 434 | |
| 435 NTKERNELAPI | |
| 436 LONG | |
| 437 FASTCALL | |
| 438 InterlockedDecrement( | |
| 439 IN OUT LONG volatile *Addend); | |
| 440 | |
| 441 NTKERNELAPI | |
| 442 LONG | |
| 443 FASTCALL | |
| 444 InterlockedCompareExchange( | |
| 445 IN OUT LONG volatile *Destination, | |
| 446 IN LONG Exchange, | |
| 447 IN LONG Comparand); | |
| 448 | |
| 449 NTKERNELAPI | |
| 450 LONG | |
| 451 FASTCALL | |
| 452 InterlockedExchange( | |
| 453 IN OUT LONG volatile *Destination, | |
| 454 IN LONG Value); | |
| 455 | |
| 456 NTKERNELAPI | |
| 457 LONG | |
| 458 FASTCALL | |
| 459 InterlockedExchangeAdd( | |
| 460 IN OUT LONG volatile *Addend, | |
| 461 IN LONG Value); | |
| 462 | |
| 463 #else // !defined(NO_INTERLOCKED_INTRINSICS) | |
| 464 | |
| 465 #define InterlockedExchange _InterlockedExchange | |
| 466 #define InterlockedIncrement _InterlockedIncrement | |
| 467 #define InterlockedDecrement _InterlockedDecrement | |
| 468 #define InterlockedExchangeAdd _InterlockedExchangeAdd | |
| 469 #define InterlockedCompareExchange _InterlockedCompareExchange | |
| 470 #define InterlockedOr _InterlockedOr | |
| 471 #define InterlockedAnd _InterlockedAnd | |
| 472 #define InterlockedXor _InterlockedXor | |
| 473 | |
| 474 #endif // !defined(NO_INTERLOCKED_INTRINSICS) | |
| 475 | |
| 476 #endif // defined (_X86_) | |
| 477 | |
| 478 #if !defined (_WIN64) | |
| 479 /* | |
| 480 * PVOID | |
| 481 * InterlockedExchangePointer( | |
| 482 * IN OUT PVOID volatile *Target, | |
| 483 * IN PVOID Value) | |
| 484 */ | |
| 485 #define InterlockedExchangePointer(Target, Value) \ | |
| 486 ((PVOID) InterlockedExchange((PLONG) Target, (LONG) Value)) | |
| 487 | |
| 488 /* | |
| 489 * PVOID | |
| 490 * InterlockedCompareExchangePointer( | |
| 491 * IN OUT PVOID *Destination, | |
| 492 * IN PVOID Exchange, | |
| 493 * IN PVOID Comparand) | |
| 494 */ | |
| 495 #define InterlockedCompareExchangePointer(Destination, Exchange, Comparand) \ | |
| 496 ((PVOID) InterlockedCompareExchange((PLONG) Destination, (LONG) Exchange, (LONG) Comparand)) | |
| 497 | |
| 498 #define InterlockedExchangeAddSizeT(a, b) InterlockedExchangeAdd((LONG *)a, b) | |
| 499 #define InterlockedIncrementSizeT(a) InterlockedIncrement((LONG *)a) | |
| 500 #define InterlockedDecrementSizeT(a) InterlockedDecrement((LONG *)a) | |
| 501 | |
| 502 #endif // !defined (_WIN64) | |
| 503 | |
| 504 #if defined (_M_AMD64) | |
| 505 | |
| 506 #define InterlockedExchangeAddSizeT(a, b) InterlockedExchangeAdd64((LONGLONG *)a, (LONGLONG)b) | |
| 507 #define InterlockedIncrementSizeT(a) InterlockedIncrement64((LONGLONG *)a) | |
| 508 #define InterlockedDecrementSizeT(a) InterlockedDecrement64((LONGLONG *)a) | |
| 509 #define InterlockedAnd _InterlockedAnd | |
| 510 #define InterlockedOr _InterlockedOr | |
| 511 #define InterlockedXor _InterlockedXor | |
| 512 #define InterlockedIncrement _InterlockedIncrement | |
| 513 #define InterlockedDecrement _InterlockedDecrement | |
| 514 #define InterlockedAdd _InterlockedAdd | |
| 515 #define InterlockedExchange _InterlockedExchange | |
| 516 #define InterlockedExchangeAdd _InterlockedExchangeAdd | |
| 517 #define InterlockedCompareExchange _InterlockedCompareExchange | |
| 518 #define InterlockedAnd64 _InterlockedAnd64 | |
| 519 #define InterlockedOr64 _InterlockedOr64 | |
| 520 #define InterlockedXor64 _InterlockedXor64 | |
| 521 #define InterlockedIncrement64 _InterlockedIncrement64 | |
| 522 #define InterlockedDecrement64 _InterlockedDecrement64 | |
| 523 #define InterlockedAdd64 _InterlockedAdd64 | |
| 524 #define InterlockedExchange64 _InterlockedExchange64 | |
| 525 #define InterlockedExchangeAdd64 _InterlockedExchangeAdd64 | |
| 526 #define InterlockedCompareExchange64 _InterlockedCompareExchange64 | |
| 527 #define InterlockedCompareExchangePointer _InterlockedCompareExchangePointer | |
| 528 #define InterlockedExchangePointer _InterlockedExchangePointer | |
| 529 #define InterlockedBitTestAndSet64 _interlockedbittestandset64 | |
| 530 #define InterlockedBitTestAndReset64 _interlockedbittestandreset64 | |
| 531 | |
| 532 #endif // _M_AMD64 | |
| 533 | |
| 534 #if defined(_M_AMD64) && !defined(RC_INVOKED) && !defined(MIDL_PASS) | |
| 535 //#if !defined(_X86AMD64_) // FIXME: what's _X86AMD64_ used for? | |
| 536 FORCEINLINE | |
| 537 LONG64 | |
| 538 InterlockedAdd64( | |
| 539 IN OUT LONG64 volatile *Addend, | |
| 540 IN LONG64 Value) | |
| 541 { | |
| 542 return InterlockedExchangeAdd64(Addend, Value) + Value; | |
| 543 } | |
| 544 //#endif | |
| 545 #endif | |
| 546 | |
| 547 #endif /* !__INTERLOCKED_DECLARED */ | |
| 548 | |
| 549 #if defined(_M_IX86) | |
| 550 #define YieldProcessor _mm_pause | |
| 551 #elif defined (_M_AMD64) | |
| 552 #define YieldProcessor _mm_pause | |
| 553 #elif defined(_M_PPC) | |
| 554 #define YieldProcessor() __asm__ __volatile__("nop"); | |
| 555 #elif defined(_M_MIPS) | |
| 556 #define YieldProcessor() __asm__ __volatile__("nop"); | |
| 557 #elif defined(_M_ARM) | |
| 558 #define YieldProcessor() | |
| 559 #else | |
| 560 #error Unknown architecture | |
| 561 #endif | |
| 562 | |
| 563 | |
| 564 | |
| 565 // | |
| 566 // Slist Header | |
| 567 // | |
| 568 #ifndef _SLIST_HEADER_ | |
| 569 #define _SLIST_HEADER_ | |
| 570 | |
| 571 #if defined(_WIN64) | |
| 572 typedef struct DECLSPEC_ALIGN(16) _SLIST_ENTRY *PSLIST_ENTRY; | |
| 573 typedef struct DECLSPEC_ALIGN(16) _SLIST_ENTRY { | |
| 574 PSLIST_ENTRY Next; | |
| 575 } SLIST_ENTRY; | |
| 576 typedef union DECLSPEC_ALIGN(16) _SLIST_HEADER { | |
| 577 struct { | |
| 578 ULONGLONG Alignment; | |
| 579 ULONGLONG Region; | |
| 580 } DUMMYSTRUCTNAME; | |
| 581 struct { | |
| 582 ULONGLONG Depth:16; | |
| 583 ULONGLONG Sequence:9; | |
| 584 ULONGLONG NextEntry:39; | |
| 585 ULONGLONG HeaderType:1; | |
| 586 ULONGLONG Init:1; | |
| 587 ULONGLONG Reserved:59; | |
| 588 ULONGLONG Region:3; | |
| 589 } Header8; | |
| 590 struct { | |
| 591 ULONGLONG Depth:16; | |
| 592 ULONGLONG Sequence:48; | |
| 593 ULONGLONG HeaderType:1; | |
| 594 ULONGLONG Init:1; | |
| 595 ULONGLONG Reserved:2; | |
| 596 ULONGLONG NextEntry:60; | |
| 597 } Header16; | |
| 598 } SLIST_HEADER, *PSLIST_HEADER; | |
| 599 #else | |
| 600 #define SLIST_ENTRY SINGLE_LIST_ENTRY | |
| 601 #define _SLIST_ENTRY _SINGLE_LIST_ENTRY | |
| 602 #define PSLIST_ENTRY PSINGLE_LIST_ENTRY | |
| 603 typedef union _SLIST_HEADER { | |
| 604 ULONGLONG Alignment; | |
| 605 struct { | |
| 606 SLIST_ENTRY Next; | |
| 607 USHORT Depth; | |
| 608 USHORT Sequence; | |
| 609 } DUMMYSTRUCTNAME; | |
| 610 } SLIST_HEADER, *PSLIST_HEADER; | |
| 611 #endif | |
| 612 | |
| 613 #endif /* _SLIST_HEADER_ */ | |
| 614 | |
| 615 | |
| 616 | |
| 617 // | |
| 618 // Power States/Levels | |
| 619 // | |
| 620 typedef enum _SYSTEM_POWER_STATE { | |
| 621 PowerSystemUnspecified, | |
| 622 PowerSystemWorking, | |
| 623 PowerSystemSleeping1, | |
| 624 PowerSystemSleeping2, | |
| 625 PowerSystemSleeping3, | |
| 626 PowerSystemHibernate, | |
| 627 PowerSystemShutdown, | |
| 628 PowerSystemMaximum | |
| 629 } SYSTEM_POWER_STATE, *PSYSTEM_POWER_STATE; | |
| 630 | |
| 631 #define POWER_SYSTEM_MAXIMUM PowerSystemMaximum | |
| 632 | |
| 633 typedef enum _POWER_INFORMATION_LEVEL { | |
| 634 SystemPowerPolicyAc, | |
| 635 SystemPowerPolicyDc, | |
| 636 VerifySystemPolicyAc, | |
| 637 VerifySystemPolicyDc, | |
| 638 SystemPowerCapabilities, | |
| 639 SystemBatteryState, | |
| 640 SystemPowerStateHandler, | |
| 641 ProcessorStateHandler, | |
| 642 SystemPowerPolicyCurrent, | |
| 643 AdministratorPowerPolicy, | |
| 644 SystemReserveHiberFile, | |
| 645 ProcessorInformation, | |
| 646 SystemPowerInformation, | |
| 647 ProcessorStateHandler2, | |
| 648 LastWakeTime, | |
| 649 LastSleepTime, | |
| 650 SystemExecutionState, | |
| 651 SystemPowerStateNotifyHandler, | |
| 652 ProcessorPowerPolicyAc, | |
| 653 ProcessorPowerPolicyDc, | |
| 654 VerifyProcessorPowerPolicyAc, | |
| 655 VerifyProcessorPowerPolicyDc, | |
| 656 ProcessorPowerPolicyCurrent | |
| 657 } POWER_INFORMATION_LEVEL; | |
| 658 | |
| 659 typedef enum { | |
| 660 PowerActionNone, | |
| 661 PowerActionReserved, | |
| 662 PowerActionSleep, | |
| 663 PowerActionHibernate, | |
| 664 PowerActionShutdown, | |
| 665 PowerActionShutdownReset, | |
| 666 PowerActionShutdownOff, | |
| 667 PowerActionWarmEject | |
| 668 } POWER_ACTION, *PPOWER_ACTION; | |
| 669 | |
| 670 typedef enum _DEVICE_POWER_STATE { | |
| 671 PowerDeviceUnspecified, | |
| 672 PowerDeviceD0, | |
| 673 PowerDeviceD1, | |
| 674 PowerDeviceD2, | |
| 675 PowerDeviceD3, | |
| 676 PowerDeviceMaximum | |
| 677 } DEVICE_POWER_STATE, *PDEVICE_POWER_STATE; | |
| 678 | |
| 679 #define ES_SYSTEM_REQUIRED 0x00000001 | |
| 680 #define ES_DISPLAY_REQUIRED 0x00000002 | |
| 681 #define ES_USER_PRESENT 0x00000004 | |
| 682 #define ES_CONTINUOUS 0x80000000 | |
| 683 | |
| 684 typedef ULONG EXECUTION_STATE; | |
| 685 | |
| 686 typedef enum { | |
| 687 LT_DONT_CARE, | |
| 688 LT_LOWEST_LATENCY | |
| 689 } LATENCY_TIME; | |
| 690 | |
| 691 | |
| 692 | |
| 693 // | |
| 694 // Access/Security Stuff | |
| 695 // | |
| 696 typedef ULONG ACCESS_MASK, *PACCESS_MASK; | |
| 697 typedef PVOID PACCESS_TOKEN; | |
| 698 | |
| 699 #define DELETE 0x00010000L | |
| 700 #define READ_CONTROL 0x00020000L | |
| 701 #define WRITE_DAC 0x00040000L | |
| 702 #define WRITE_OWNER 0x00080000L | |
| 703 #define SYNCHRONIZE 0x00100000L | |
| 704 #define STANDARD_RIGHTS_REQUIRED 0x000F0000L | |
| 705 #define STANDARD_RIGHTS_READ READ_CONTROL | |
| 706 #define STANDARD_RIGHTS_WRITE READ_CONTROL | |
| 707 #define STANDARD_RIGHTS_EXECUTE READ_CONTROL | |
| 708 #define STANDARD_RIGHTS_ALL 0x001F0000L | |
| 709 #define SPECIFIC_RIGHTS_ALL 0x0000FFFFL | |
| 710 #define ACCESS_SYSTEM_SECURITY 0x01000000L | |
| 711 #define MAXIMUM_ALLOWED 0x02000000L | |
| 712 #define GENERIC_READ 0x80000000L | |
| 713 #define GENERIC_WRITE 0x40000000L | |
| 714 #define GENERIC_EXECUTE 0x20000000L | |
| 715 #define GENERIC_ALL 0x10000000L | |
| 716 | |
| 717 typedef struct _GENERIC_MAPPING { | |
| 718 ACCESS_MASK GenericRead; | |
| 719 ACCESS_MASK GenericWrite; | |
| 720 ACCESS_MASK GenericExecute; | |
| 721 ACCESS_MASK GenericAll; | |
| 722 } GENERIC_MAPPING, *PGENERIC_MAPPING; | |
| 723 | |
| 724 #define ACL_REVISION 2 | |
| 725 #define ACL_REVISION_DS 4 | |
| 726 | |
| 727 #define ACL_REVISION1 1 | |
| 728 #define ACL_REVISION2 2 | |
| 729 #define ACL_REVISION3 3 | |
| 730 #define ACL_REVISION4 4 | |
| 731 #define MIN_ACL_REVISION ACL_REVISION2 | |
| 732 #define MAX_ACL_REVISION ACL_REVISION4 | |
| 733 | |
| 734 typedef struct _ACL { | |
| 735 UCHAR AclRevision; | |
| 736 UCHAR Sbz1; | |
| 737 USHORT AclSize; | |
| 738 USHORT AceCount; | |
| 739 USHORT Sbz2; | |
| 740 } ACL, *PACL; | |
| 741 | |
| 742 | |
| 743 | |
| 744 // | |
| 745 // Current security descriptor revision value | |
| 746 // | |
| 747 #define SECURITY_DESCRIPTOR_REVISION (1) | |
| 748 #define SECURITY_DESCRIPTOR_REVISION1 (1) | |
| 749 | |
| 750 // | |
| 751 // Privilege attributes | |
| 752 // | |
| 753 #define SE_PRIVILEGE_ENABLED_BY_DEFAULT (0x00000001L) | |
| 754 #define SE_PRIVILEGE_ENABLED (0x00000002L) | |
| 755 #define SE_PRIVILEGE_REMOVED (0X00000004L) | |
| 756 #define SE_PRIVILEGE_USED_FOR_ACCESS (0x80000000L) | |
| 757 | |
| 758 #define SE_PRIVILEGE_VALID_ATTRIBUTES (SE_PRIVILEGE_ENABLED_BY_DEFAULT | \ | |
| 759 SE_PRIVILEGE_ENABLED | \ | |
| 760 SE_PRIVILEGE_REMOVED | \ | |
| 761 SE_PRIVILEGE_USED_FOR_ACCESS) | |
| 762 | |
| 763 #include <pshpack4.h> | |
| 764 typedef struct _LUID_AND_ATTRIBUTES { | |
| 765 LUID Luid; | |
| 766 ULONG Attributes; | |
| 767 } LUID_AND_ATTRIBUTES, *PLUID_AND_ATTRIBUTES; | |
| 768 #include <poppack.h> | |
| 769 typedef LUID_AND_ATTRIBUTES LUID_AND_ATTRIBUTES_ARRAY[ANYSIZE_ARRAY]; | |
| 770 typedef LUID_AND_ATTRIBUTES_ARRAY *PLUID_AND_ATTRIBUTES_ARRAY; | |
| 771 | |
| 772 | |
| 773 | |
| 774 // | |
| 775 // Privilege sets | |
| 776 // | |
| 777 #define PRIVILEGE_SET_ALL_NECESSARY (1) | |
| 778 | |
| 779 typedef struct _PRIVILEGE_SET { | |
| 780 ULONG PrivilegeCount; | |
| 781 ULONG Control; | |
| 782 LUID_AND_ATTRIBUTES Privilege[ANYSIZE_ARRAY]; | |
| 783 } PRIVILEGE_SET,*PPRIVILEGE_SET; | |
| 784 | |
| 785 typedef enum _SECURITY_IMPERSONATION_LEVEL { | |
| 786 SecurityAnonymous, | |
| 787 SecurityIdentification, | |
| 788 SecurityImpersonation, | |
| 789 SecurityDelegation | |
| 790 } SECURITY_IMPERSONATION_LEVEL, * PSECURITY_IMPERSONATION_LEVEL; | |
| 791 | |
| 792 #define SECURITY_MAX_IMPERSONATION_LEVEL SecurityDelegation | |
| 793 #define SECURITY_MIN_IMPERSONATION_LEVEL SecurityAnonymous | |
| 794 #define DEFAULT_IMPERSONATION_LEVEL SecurityImpersonation | |
| 795 #define VALID_IMPERSONATION_LEVEL(Level) (((Level) >= SECURITY_MIN_IMPERSONATION_LEVEL) && ((Level) <= SECURITY_MAX_IMPERSONATION_LEVEL)) | |
| 796 | |
| 797 #define SECURITY_DYNAMIC_TRACKING (TRUE) | |
| 798 #define SECURITY_STATIC_TRACKING (FALSE) | |
| 799 | |
| 800 typedef BOOLEAN SECURITY_CONTEXT_TRACKING_MODE, *PSECURITY_CONTEXT_TRACKING_MODE; | |
| 801 | |
| 802 typedef struct _SECURITY_QUALITY_OF_SERVICE { | |
| 803 ULONG Length; | |
| 804 SECURITY_IMPERSONATION_LEVEL ImpersonationLevel; | |
| 805 SECURITY_CONTEXT_TRACKING_MODE ContextTrackingMode; | |
| 806 BOOLEAN EffectiveOnly; | |
| 807 } SECURITY_QUALITY_OF_SERVICE, *PSECURITY_QUALITY_OF_SERVICE; | |
| 808 | |
| 809 typedef struct _SE_IMPERSONATION_STATE { | |
| 810 PACCESS_TOKEN Token; | |
| 811 BOOLEAN CopyOnOpen; | |
| 812 BOOLEAN EffectiveOnly; | |
| 813 SECURITY_IMPERSONATION_LEVEL Level; | |
| 814 } SE_IMPERSONATION_STATE, *PSE_IMPERSONATION_STATE; | |
| 815 | |
| 816 #define OWNER_SECURITY_INFORMATION (0x00000001L) | |
| 817 #define GROUP_SECURITY_INFORMATION (0x00000002L) | |
| 818 #define DACL_SECURITY_INFORMATION (0x00000004L) | |
| 819 #define SACL_SECURITY_INFORMATION (0x00000008L) | |
| 820 #define LABEL_SECURITY_INFORMATION (0x00000010L) | |
| 821 | |
| 822 #define PROTECTED_DACL_SECURITY_INFORMATION (0x80000000L) | |
| 823 #define PROTECTED_SACL_SECURITY_INFORMATION (0x40000000L) | |
| 824 #define UNPROTECTED_DACL_SECURITY_INFORMATION (0x20000000L) | |
| 825 #define UNPROTECTED_SACL_SECURITY_INFORMATION (0x10000000L) | |
| 826 | |
| 827 | |
| 828 | |
| 829 // | |
| 830 // Registry Access Rights | |
| 831 // | |
| 832 #define KEY_QUERY_VALUE (0x0001) | |
| 833 #define KEY_SET_VALUE (0x0002) | |
| 834 #define KEY_CREATE_SUB_KEY (0x0004) | |
| 835 #define KEY_ENUMERATE_SUB_KEYS (0x0008) | |
| 836 #define KEY_NOTIFY (0x0010) | |
| 837 #define KEY_CREATE_LINK (0x0020) | |
| 838 #define KEY_WOW64_32KEY (0x0200) | |
| 839 #define KEY_WOW64_64KEY (0x0100) | |
| 840 #define KEY_WOW64_RES (0x0300) | |
| 841 | |
| 842 #define KEY_READ ((STANDARD_RIGHTS_READ |\ | |
| 843 KEY_QUERY_VALUE |\ | |
| 844 KEY_ENUMERATE_SUB_KEYS |\ | |
| 845 KEY_NOTIFY) \ | |
| 846 & \ | |
| 847 (~SYNCHRONIZE)) | |
| 848 | |
| 849 #define KEY_WRITE ((STANDARD_RIGHTS_WRITE |\ | |
| 850 KEY_SET_VALUE |\ | |
| 851 KEY_CREATE_SUB_KEY) \ | |
| 852 & \ | |
| 853 (~SYNCHRONIZE)) | |
| 854 | |
| 855 #define KEY_EXECUTE ((KEY_READ) \ | |
| 856 & \ | |
| 857 (~SYNCHRONIZE)) | |
| 858 | |
| 859 #define KEY_ALL_ACCESS ((STANDARD_RIGHTS_ALL |\ | |
| 860 KEY_QUERY_VALUE |\ | |
| 861 KEY_SET_VALUE |\ | |
| 862 KEY_CREATE_SUB_KEY |\ | |
| 863 KEY_ENUMERATE_SUB_KEYS |\ | |
| 864 KEY_NOTIFY |\ | |
| 865 KEY_CREATE_LINK) \ | |
| 866 & \ | |
| 867 (~SYNCHRONIZE)) | |
| 868 | |
| 869 // | |
| 870 // Registry Open/Create Options | |
| 871 // | |
| 872 #define REG_OPTION_RESERVED (0x00000000L) | |
| 873 #define REG_OPTION_NON_VOLATILE (0x00000000L) | |
| 874 #define REG_OPTION_VOLATILE (0x00000001L) | |
| 875 #define REG_OPTION_CREATE_LINK (0x00000002L) | |
| 876 #define REG_OPTION_BACKUP_RESTORE (0x00000004L) | |
| 877 #define REG_OPTION_OPEN_LINK (0x00000008L) | |
| 878 | |
| 879 #define REG_LEGAL_OPTION \ | |
| 880 (REG_OPTION_RESERVED |\ | |
| 881 REG_OPTION_NON_VOLATILE |\ | |
| 882 REG_OPTION_VOLATILE |\ | |
| 883 REG_OPTION_CREATE_LINK |\ | |
| 884 REG_OPTION_BACKUP_RESTORE |\ | |
| 885 REG_OPTION_OPEN_LINK) | |
| 886 | |
| 887 // | |
| 888 // Key creation/open disposition | |
| 889 // | |
| 890 #define REG_CREATED_NEW_KEY (0x00000001L) | |
| 891 #define REG_OPENED_EXISTING_KEY (0x00000002L) | |
| 892 | |
| 893 // | |
| 894 // Key restore & hive load flags | |
| 895 // | |
| 896 #define REG_WHOLE_HIVE_VOLATILE (0x00000001L) | |
| 897 #define REG_REFRESH_HIVE (0x00000002L) | |
| 898 #define REG_NO_LAZY_FLUSH (0x00000004L) | |
| 899 #define REG_FORCE_RESTORE (0x00000008L) | |
| 900 #define REG_APP_HIVE (0x00000010L) | |
| 901 #define REG_PROCESS_PRIVATE (0x00000020L) | |
| 902 #define REG_START_JOURNAL (0x00000040L) | |
| 903 #define REG_HIVE_EXACT_FILE_GROWTH (0x00000080L) | |
| 904 #define REG_HIVE_NO_RM (0x00000100L) | |
| 905 #define REG_HIVE_SINGLE_LOG (0x00000200L) | |
| 906 | |
| 907 // | |
| 908 // Unload Flags | |
| 909 // | |
| 910 #define REG_FORCE_UNLOAD 1 | |
| 911 | |
| 912 // | |
| 913 // Notify Filter Values | |
| 914 // | |
| 915 #define REG_NOTIFY_CHANGE_NAME (0x00000001L) | |
| 916 #define REG_NOTIFY_CHANGE_ATTRIBUTES (0x00000002L) | |
| 917 #define REG_NOTIFY_CHANGE_LAST_SET (0x00000004L) | |
| 918 #define REG_NOTIFY_CHANGE_SECURITY (0x00000008L) | |
| 919 | |
| 920 #define REG_LEGAL_CHANGE_FILTER \ | |
| 921 (REG_NOTIFY_CHANGE_NAME |\ | |
| 922 REG_NOTIFY_CHANGE_ATTRIBUTES |\ | |
| 923 REG_NOTIFY_CHANGE_LAST_SET |\ | |
| 924 REG_NOTIFY_CHANGE_SECURITY) | |
| 925 | |
| 926 | |
| 927 | |
| 928 // | |
| 929 // Thread Access Rights | |
| 930 // | |
| 931 #define THREAD_TERMINATE (0x0001) | |
| 932 #define THREAD_SUSPEND_RESUME (0x0002) | |
| 933 #define THREAD_ALERT (0x0004) | |
| 934 #define THREAD_GET_CONTEXT (0x0008) | |
| 935 #define THREAD_SET_CONTEXT (0x0010) | |
| 936 #define THREAD_SET_INFORMATION (0x0020) | |
| 937 #define THREAD_SET_LIMITED_INFORMATION (0x0400) | |
| 938 #define THREAD_QUERY_LIMITED_INFORMATION (0x0800) | |
| 939 #if (NTDDI_VERSION >= NTDDI_VISTA) | |
| 940 #define THREAD_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | \ | |
| 941 0xFFFF) | |
| 942 #else | |
| 943 #define THREAD_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | \ | |
| 944 0x3FF) | |
| 945 #endif | |
| 946 | |
| 947 // | |
| 948 // Service Start Types | |
| 949 // | |
| 950 #define SERVICE_BOOT_START 0x00000000 | |
| 951 #define SERVICE_SYSTEM_START 0x00000001 | |
| 952 #define SERVICE_AUTO_START 0x00000002 | |
| 953 #define SERVICE_DEMAND_START 0x00000003 | |
| 954 #define SERVICE_DISABLED 0x00000004 | |
| 955 | |
| 956 // | |
| 957 // Exception Records | |
| 958 // | |
| 959 #define EXCEPTION_NONCONTINUABLE 1 | |
| 960 #define EXCEPTION_MAXIMUM_PARAMETERS 15 | |
| 961 | |
| 962 typedef struct _EXCEPTION_RECORD { | |
| 963 NTSTATUS ExceptionCode; | |
| 964 ULONG ExceptionFlags; | |
| 965 struct _EXCEPTION_RECORD *ExceptionRecord; | |
| 966 PVOID ExceptionAddress; | |
| 967 ULONG NumberParameters; | |
| 968 ULONG_PTR ExceptionInformation[EXCEPTION_MAXIMUM_PARAMETERS]; | |
| 969 } EXCEPTION_RECORD, *PEXCEPTION_RECORD; | |
| 970 | |
| 971 typedef struct _EXCEPTION_RECORD32 { | |
| 972 NTSTATUS ExceptionCode; | |
| 973 ULONG ExceptionFlags; | |
| 974 ULONG ExceptionRecord; | |
| 975 ULONG ExceptionAddress; | |
| 976 ULONG NumberParameters; | |
| 977 ULONG ExceptionInformation[EXCEPTION_MAXIMUM_PARAMETERS]; | |
| 978 } EXCEPTION_RECORD32, *PEXCEPTION_RECORD32; | |
| 979 | |
| 980 typedef struct _EXCEPTION_RECORD64 { | |
| 981 NTSTATUS ExceptionCode; | |
| 982 ULONG ExceptionFlags; | |
| 983 ULONG64 ExceptionRecord; | |
| 984 ULONG64 ExceptionAddress; | |
| 985 ULONG NumberParameters; | |
| 986 ULONG __unusedAlignment; | |
| 987 ULONG64 ExceptionInformation[EXCEPTION_MAXIMUM_PARAMETERS]; | |
| 988 } EXCEPTION_RECORD64, *PEXCEPTION_RECORD64; | |
| 989 | |
| 990 typedef struct _EXCEPTION_POINTERS { | |
| 991 PEXCEPTION_RECORD ExceptionRecord; | |
| 992 PCONTEXT ContextRecord; | |
| 993 } EXCEPTION_POINTERS, *PEXCEPTION_POINTERS; | |
| 994 | |
| 995 | |
| 996 | |
| 997 // | |
| 998 // Process Qoutas | |
| 999 // | |
| 1000 typedef struct _QUOTA_LIMITS { | |
| 1001 SIZE_T PagedPoolLimit; | |
| 1002 SIZE_T NonPagedPoolLimit; | |
| 1003 SIZE_T MinimumWorkingSetSize; | |
| 1004 SIZE_T MaximumWorkingSetSize; | |
| 1005 SIZE_T PagefileLimit; | |
| 1006 LARGE_INTEGER TimeLimit; | |
| 1007 } QUOTA_LIMITS, *PQUOTA_LIMITS; | |
| 1008 | |
| 1009 #define QUOTA_LIMITS_HARDWS_MIN_ENABLE 0x00000001 | |
| 1010 #define QUOTA_LIMITS_HARDWS_MIN_DISABLE 0x00000002 | |
| 1011 #define QUOTA_LIMITS_HARDWS_MAX_ENABLE 0x00000004 | |
| 1012 #define QUOTA_LIMITS_HARDWS_MAX_DISABLE 0x00000008 | |
| 1013 #define QUOTA_LIMITS_USE_DEFAULT_LIMITS 0x00000010 | |
| 1014 | |
| 1015 | |
| 1016 /****************************************************************************** | |
| 1017 * WINBASE Functions * | |
| 1018 ******************************************************************************/ | |
| 1019 #if !defined(_WINBASE_) | |
| 1020 | |
| 1021 #if defined(_WIN64) | |
| 1022 | |
| 1023 #define InterlockedPopEntrySList(Head) \ | |
| 1024 ExpInterlockedPopEntrySList(Head) | |
| 1025 | |
| 1026 #define InterlockedPushEntrySList(Head, Entry) \ | |
| 1027 ExpInterlockedPushEntrySList(Head, Entry) | |
| 1028 | |
| 1029 #define InterlockedFlushSList(Head) \ | |
| 1030 ExpInterlockedFlushSList(Head) | |
| 1031 | |
| 1032 #define QueryDepthSList(Head) \ | |
| 1033 ExQueryDepthSList(Head) | |
| 1034 | |
| 1035 #else // !defined(_WIN64) | |
| 1036 | |
| 1037 NTKERNELAPI | |
| 1038 PSLIST_ENTRY | |
| 1039 FASTCALL | |
| 1040 InterlockedPopEntrySList( | |
| 1041 IN PSLIST_HEADER ListHead); | |
| 1042 | |
| 1043 NTKERNELAPI | |
| 1044 PSLIST_ENTRY | |
| 1045 FASTCALL | |
| 1046 InterlockedPushEntrySList( | |
| 1047 IN PSLIST_HEADER ListHead, | |
| 1048 IN PSLIST_ENTRY ListEntry); | |
| 1049 | |
| 1050 #define InterlockedFlushSList(ListHead) \ | |
| 1051 ExInterlockedFlushSList(ListHead) | |
| 1052 | |
| 1053 #define QueryDepthSList(Head) \ | |
| 1054 ExQueryDepthSList(Head) | |
| 1055 | |
| 1056 #endif // !defined(_WIN64) | |
| 1057 | |
| 1058 #endif // !defined(_WINBASE_) | |
| 1059 | |
| 1060 | |
| 1061 /****************************************************************************** | |
| 1062 * Kernel Types * | |
| 1063 ******************************************************************************/ | |
| 1064 | |
| 1065 typedef struct _DISPATCHER_HEADER | |
| 1066 { | |
| 1067 union | |
| 1068 { | |
| 1069 struct | |
| 1070 { | |
| 1071 UCHAR Type; | |
| 1072 union | |
| 1073 { | |
| 1074 UCHAR Absolute; | |
| 1075 UCHAR NpxIrql; | |
| 1076 }; | |
| 1077 union | |
| 1078 { | |
| 1079 UCHAR Size; | |
| 1080 UCHAR Hand; | |
| 1081 }; | |
| 1082 union | |
| 1083 { | |
| 1084 UCHAR Inserted; | |
| 1085 BOOLEAN DebugActive; | |
| 1086 }; | |
| 1087 }; | |
| 1088 volatile LONG Lock; | |
| 1089 }; | |
| 1090 LONG SignalState; | |
| 1091 LIST_ENTRY WaitListHead; | |
| 1092 } DISPATCHER_HEADER, *PDISPATCHER_HEADER; | |
| 1093 | |
| 1094 typedef ULONG_PTR KSPIN_LOCK, *PKSPIN_LOCK; | |
| 1095 | |
| 1096 typedef struct _KEVENT { | |
| 1097 DISPATCHER_HEADER Header; | |
| 1098 } KEVENT, *PKEVENT, *RESTRICTED_POINTER PRKEVENT; | |
| 1099 | |
| 1100 typedef struct _KSEMAPHORE { | |
| 1101 DISPATCHER_HEADER Header; | |
| 1102 LONG Limit; | |
| 1103 } KSEMAPHORE, *PKSEMAPHORE, *RESTRICTED_POINTER PRKSEMAPHORE; | |
| 1104 | |
| 1105 /****************************************************************************** | |
| 1106 * RTL Types * | |
| 1107 ******************************************************************************/ | |
| 1108 | |
| 1109 #define RTL_REGISTRY_ABSOLUTE 0 | |
| 1110 #define RTL_REGISTRY_SERVICES 1 | |
| 1111 #define RTL_REGISTRY_CONTROL 2 | |
| 1112 #define RTL_REGISTRY_WINDOWS_NT 3 | |
| 1113 #define RTL_REGISTRY_DEVICEMAP 4 | |
| 1114 #define RTL_REGISTRY_USER 5 | |
| 1115 #define RTL_REGISTRY_MAXIMUM 6 | |
| 1116 #define RTL_REGISTRY_HANDLE 0x40000000 | |
| 1117 #define RTL_REGISTRY_OPTIONAL 0x80000000 | |
| 1118 | |
| 1119 /* RTL_QUERY_REGISTRY_TABLE.Flags */ | |
| 1120 #define RTL_QUERY_REGISTRY_SUBKEY 0x00000001 | |
| 1121 #define RTL_QUERY_REGISTRY_TOPKEY 0x00000002 | |
| 1122 #define RTL_QUERY_REGISTRY_REQUIRED 0x00000004 | |
| 1123 #define RTL_QUERY_REGISTRY_NOVALUE 0x00000008 | |
| 1124 #define RTL_QUERY_REGISTRY_NOEXPAND 0x00000010 | |
| 1125 #define RTL_QUERY_REGISTRY_DIRECT 0x00000020 | |
| 1126 #define RTL_QUERY_REGISTRY_DELETE 0x00000040 | |
| 1127 | |
| 1128 typedef struct _RTL_BITMAP { | |
| 1129 ULONG SizeOfBitMap; | |
| 1130 PULONG Buffer; | |
| 1131 } RTL_BITMAP, *PRTL_BITMAP; | |
| 1132 | |
| 1133 typedef struct _RTL_BITMAP_RUN { | |
| 1134 ULONG StartingIndex; | |
| 1135 ULONG NumberOfBits; | |
| 1136 } RTL_BITMAP_RUN, *PRTL_BITMAP_RUN; | |
| 1137 | |
| 1138 typedef NTSTATUS | |
| 1139 (DDKAPI *PRTL_QUERY_REGISTRY_ROUTINE)( | |
| 1140 IN PWSTR ValueName, | |
| 1141 IN ULONG ValueType, | |
| 1142 IN PVOID ValueData, | |
| 1143 IN ULONG ValueLength, | |
| 1144 IN PVOID Context, | |
| 1145 IN PVOID EntryContext); | |
| 1146 | |
| 1147 typedef struct _RTL_QUERY_REGISTRY_TABLE { | |
| 1148 PRTL_QUERY_REGISTRY_ROUTINE QueryRoutine; | |
| 1149 ULONG Flags; | |
| 1150 PCWSTR Name; | |
| 1151 PVOID EntryContext; | |
| 1152 ULONG DefaultType; | |
| 1153 PVOID DefaultData; | |
| 1154 ULONG DefaultLength; | |
| 1155 } RTL_QUERY_REGISTRY_TABLE, *PRTL_QUERY_REGISTRY_TABLE; | |
| 1156 | |
| 1157 typedef struct _TIME_FIELDS { | |
| 1158 CSHORT Year; | |
| 1159 CSHORT Month; | |
| 1160 CSHORT Day; | |
| 1161 CSHORT Hour; | |
| 1162 CSHORT Minute; | |
| 1163 CSHORT Second; | |
| 1164 CSHORT Milliseconds; | |
| 1165 CSHORT Weekday; | |
| 1166 } TIME_FIELDS, *PTIME_FIELDS; | |
| 1167 | |
| 1168 | |
| 1169 /****************************************************************************** | |
| 1170 * RTL Functions * | |
| 1171 ******************************************************************************/ | |
| 1172 | |
| 1173 NTSYSAPI | |
| 1174 VOID | |
| 1175 NTAPI | |
| 1176 RtlAssert( | |
| 1177 IN PVOID FailedAssertion, | |
| 1178 IN PVOID FileName, | |
| 1179 IN ULONG LineNumber, | |
| 1180 IN PCHAR Message); | |
| 1181 | |
| 1182 /* VOID | |
| 1183 * RtlCopyMemory( | |
| 1184 * IN VOID UNALIGNED *Destination, | |
| 1185 * IN CONST VOID UNALIGNED *Source, | |
| 1186 * IN SIZE_T Length) | |
| 1187 */ | |
| 1188 #define RtlCopyMemory(Destination, Source, Length) \ | |
| 1189 memcpy(Destination, Source, Length) | |
| 1190 | |
| 1191 #define RtlCopyBytes RtlCopyMemory | |
| 1192 | |
| 1193 #if defined(_M_AMD64) | |
| 1194 NTSYSAPI | |
| 1195 VOID | |
| 1196 NTAPI | |
| 1197 RtlCopyMemoryNonTemporal( | |
| 1198 VOID UNALIGNED *Destination, | |
| 1199 CONST VOID UNALIGNED *Source, | |
| 1200 SIZE_T Length); | |
| 1201 #else | |
| 1202 #define RtlCopyMemoryNonTemporal RtlCopyMemory | |
| 1203 #endif | |
| 1204 | |
| 1205 /* BOOLEAN | |
| 1206 * RtlEqualLuid( | |
| 1207 * IN PLUID Luid1, | |
| 1208 * IN PLUID Luid2) | |
| 1209 */ | |
| 1210 #define RtlEqualLuid(Luid1, Luid2) \ | |
| 1211 (((Luid1)->LowPart == (Luid2)->LowPart) && ((Luid1)->HighPart == (Luid2)->HighPart)) | |
| 1212 | |
| 1213 /* ULONG | |
| 1214 * RtlEqualMemory( | |
| 1215 * IN VOID UNALIGNED *Destination, | |
| 1216 * IN CONST VOID UNALIGNED *Source, | |
| 1217 * IN SIZE_T Length) | |
| 1218 */ | |
| 1219 #define RtlEqualMemory(Destination, Source, Length) \ | |
| 1220 (!memcmp(Destination, Source, Length)) | |
| 1221 | |
| 1222 /* VOID | |
| 1223 * RtlFillMemory( | |
| 1224 * IN VOID UNALIGNED *Destination, | |
| 1225 * IN SIZE_T Length, | |
| 1226 * IN UCHAR Fill) | |
| 1227 */ | |
| 1228 #define RtlFillMemory(Destination, Length, Fill) \ | |
| 1229 memset(Destination, Fill, Length) | |
| 1230 | |
| 1231 #define RtlFillBytes RtlFillMemory | |
| 1232 | |
| 1233 NTSYSAPI | |
| 1234 VOID | |
| 1235 NTAPI | |
| 1236 RtlFreeUnicodeString( | |
| 1237 IN PUNICODE_STRING UnicodeString); | |
| 1238 | |
| 1239 NTSYSAPI | |
| 1240 NTSTATUS | |
| 1241 NTAPI | |
| 1242 RtlGUIDFromString( | |
| 1243 IN PUNICODE_STRING GuidString, | |
| 1244 OUT GUID *Guid); | |
| 1245 | |
| 1246 NTSYSAPI | |
| 1247 VOID | |
| 1248 NTAPI | |
| 1249 RtlInitUnicodeString( | |
| 1250 IN OUT PUNICODE_STRING DestinationString, | |
| 1251 IN PCWSTR SourceString); | |
| 1252 | |
| 1253 /* VOID | |
| 1254 * RtlMoveMemory( | |
| 1255 * IN VOID UNALIGNED *Destination, | |
| 1256 * IN CONST VOID UNALIGNED *Source, | |
| 1257 * IN SIZE_T Length) | |
| 1258 */ | |
| 1259 #define RtlMoveMemory(Destination, Source, Length) \ | |
| 1260 memmove(Destination, Source, Length) | |
| 1261 | |
| 1262 NTSYSAPI | |
| 1263 NTSTATUS | |
| 1264 NTAPI | |
| 1265 RtlStringFromGUID( | |
| 1266 IN REFGUID Guid, | |
| 1267 OUT PUNICODE_STRING GuidString); | |
| 1268 | |
| 1269 /* VOID | |
| 1270 * RtlZeroMemory( | |
| 1271 * IN VOID UNALIGNED *Destination, | |
| 1272 * IN SIZE_T Length) | |
| 1273 */ | |
| 1274 #define RtlZeroMemory(Destination, Length) \ | |
| 1275 memset(Destination, 0, Length) | |
| 1276 | |
| 1277 #define RtlZeroBytes RtlZeroMemory | |
| 1278 | |
| 1279 | |
| 1280 #if (NTDDI_VERSION >= NTDDI_WIN2K) | |
| 1281 NTSYSAPI | |
| 1282 BOOLEAN | |
| 1283 NTAPI | |
| 1284 RtlAreBitsClear( | |
| 1285 IN PRTL_BITMAP BitMapHeader, | |
| 1286 IN ULONG StartingIndex, | |
| 1287 IN ULONG Length); | |
| 1288 | |
| 1289 NTSYSAPI | |
| 1290 BOOLEAN | |
| 1291 NTAPI | |
| 1292 RtlAreBitsSet( | |
| 1293 IN PRTL_BITMAP BitMapHeader, | |
| 1294 IN ULONG StartingIndex, | |
| 1295 IN ULONG Length); | |
| 1296 | |
| 1297 NTSYSAPI | |
| 1298 NTSTATUS | |
| 1299 NTAPI | |
| 1300 RtlAnsiStringToUnicodeString( | |
| 1301 IN OUT PUNICODE_STRING DestinationString, | |
| 1302 IN PANSI_STRING SourceString, | |
| 1303 IN BOOLEAN AllocateDestinationString); | |
| 1304 | |
| 1305 NTSYSAPI | |
| 1306 ULONG | |
| 1307 NTAPI | |
| 1308 RtlxAnsiStringToUnicodeSize( | |
| 1309 IN PCANSI_STRING AnsiString); | |
| 1310 | |
| 1311 #define RtlAnsiStringToUnicodeSize(String) ( \ | |
| 1312 NLS_MB_CODE_PAGE_TAG ? \ | |
| 1313 RtlxAnsiStringToUnicodeSize(String) : \ | |
| 1314 ((String)->Length + sizeof(ANSI_NULL)) * sizeof(WCHAR) \ | |
| 1315 ) | |
| 1316 | |
| 1317 NTSYSAPI | |
| 1318 NTSTATUS | |
| 1319 NTAPI | |
| 1320 RtlAppendUnicodeStringToString( | |
| 1321 IN OUT PUNICODE_STRING Destination, | |
| 1322 IN PCUNICODE_STRING Source); | |
| 1323 | |
| 1324 NTSYSAPI | |
| 1325 NTSTATUS | |
| 1326 NTAPI | |
| 1327 RtlAppendUnicodeToString( | |
| 1328 IN OUT PUNICODE_STRING Destination, | |
| 1329 IN PCWSTR Source); | |
| 1330 | |
| 1331 NTSYSAPI | |
| 1332 NTSTATUS | |
| 1333 NTAPI | |
| 1334 RtlCheckRegistryKey( | |
| 1335 IN ULONG RelativeTo, | |
| 1336 IN PWSTR Path); | |
| 1337 | |
| 1338 NTSYSAPI | |
| 1339 VOID | |
| 1340 NTAPI | |
| 1341 RtlClearAllBits( | |
| 1342 IN PRTL_BITMAP BitMapHeader); | |
| 1343 | |
| 1344 NTSYSAPI | |
| 1345 VOID | |
| 1346 NTAPI | |
| 1347 RtlClearBits( | |
| 1348 IN PRTL_BITMAP BitMapHeader, | |
| 1349 IN ULONG StartingIndex, | |
| 1350 IN ULONG NumberToClear); | |
| 1351 | |
| 1352 NTSYSAPI | |
| 1353 SIZE_T | |
| 1354 NTAPI | |
| 1355 RtlCompareMemory( | |
| 1356 IN CONST VOID *Source1, | |
| 1357 IN CONST VOID *Source2, | |
| 1358 IN SIZE_T Length); | |
| 1359 | |
| 1360 NTSYSAPI | |
| 1361 LONG | |
| 1362 NTAPI | |
| 1363 RtlCompareUnicodeString( | |
| 1364 IN PCUNICODE_STRING String1, | |
| 1365 IN PCUNICODE_STRING String2, | |
| 1366 IN BOOLEAN CaseInSensitive); | |
| 1367 | |
| 1368 NTSYSAPI | |
| 1369 LONG | |
| 1370 NTAPI | |
| 1371 RtlCompareUnicodeStrings( | |
| 1372 IN PCWCH String1, | |
| 1373 IN SIZE_T String1Length, | |
| 1374 IN PCWCH String2, | |
| 1375 IN SIZE_T String2Length, | |
| 1376 IN BOOLEAN CaseInSensitive); | |
| 1377 | |
| 1378 NTSYSAPI | |
| 1379 VOID | |
| 1380 NTAPI | |
| 1381 RtlCopyUnicodeString( | |
| 1382 IN OUT PUNICODE_STRING DestinationString, | |
| 1383 IN PCUNICODE_STRING SourceString); | |
| 1384 | |
| 1385 NTSYSAPI | |
| 1386 NTSTATUS | |
| 1387 NTAPI | |
| 1388 RtlCreateRegistryKey( | |
| 1389 IN ULONG RelativeTo, | |
| 1390 IN PWSTR Path); | |
| 1391 | |
| 1392 NTSYSAPI | |
| 1393 NTSTATUS | |
| 1394 NTAPI | |
| 1395 RtlCreateSecurityDescriptor( | |
| 1396 IN OUT PSECURITY_DESCRIPTOR SecurityDescriptor, | |
| 1397 IN ULONG Revision); | |
| 1398 | |
| 1399 NTSYSAPI | |
| 1400 NTSTATUS | |
| 1401 NTAPI | |
| 1402 RtlDeleteRegistryValue( | |
| 1403 IN ULONG RelativeTo, | |
| 1404 IN PCWSTR Path, | |
| 1405 IN PCWSTR ValueName); | |
| 1406 | |
| 1407 NTSYSAPI | |
| 1408 BOOLEAN | |
| 1409 NTAPI | |
| 1410 RtlEqualUnicodeString( | |
| 1411 IN CONST UNICODE_STRING *String1, | |
| 1412 IN CONST UNICODE_STRING *String2, | |
| 1413 IN BOOLEAN CaseInSensitive); | |
| 1414 | |
| 1415 #if !defined(_AMD64_) && !defined(_IA64_) | |
| 1416 NTSYSAPI | |
| 1417 LARGE_INTEGER | |
| 1418 NTAPI | |
| 1419 RtlExtendedIntegerMultiply( | |
| 1420 IN LARGE_INTEGER Multiplicand, | |
| 1421 IN LONG Multiplier); | |
| 1422 | |
| 1423 NTSYSAPI | |
| 1424 LARGE_INTEGER | |
| 1425 NTAPI | |
| 1426 RtlExtendedLargeIntegerDivide( | |
| 1427 IN LARGE_INTEGER Dividend, | |
| 1428 IN ULONG Divisor, | |
| 1429 IN OUT PULONG Remainder); | |
| 1430 #endif | |
| 1431 | |
| 1432 #if defined(_X86_) || defined(_IA64_) | |
| 1433 NTSYSAPI | |
| 1434 LARGE_INTEGER | |
| 1435 NTAPI | |
| 1436 RtlExtendedMagicDivide( | |
| 1437 IN LARGE_INTEGER Dividend, | |
| 1438 IN LARGE_INTEGER MagicDivisor, | |
| 1439 IN CCHAR ShiftCount); | |
| 1440 #endif | |
| 1441 | |
| 1442 NTSYSAPI | |
| 1443 VOID | |
| 1444 NTAPI | |
| 1445 RtlFreeAnsiString( | |
| 1446 IN PANSI_STRING AnsiString); | |
| 1447 | |
| 1448 NTSYSAPI | |
| 1449 ULONG | |
| 1450 NTAPI | |
| 1451 RtlFindClearBits( | |
| 1452 IN PRTL_BITMAP BitMapHeader, | |
| 1453 IN ULONG NumberToFind, | |
| 1454 IN ULONG HintIndex); | |
| 1455 | |
| 1456 NTSYSAPI | |
| 1457 ULONG | |
| 1458 NTAPI | |
| 1459 RtlFindClearBitsAndSet( | |
| 1460 IN PRTL_BITMAP BitMapHeader, | |
| 1461 IN ULONG NumberToFind, | |
| 1462 IN ULONG HintIndex); | |
| 1463 | |
| 1464 NTSYSAPI | |
| 1465 ULONG | |
| 1466 NTAPI | |
| 1467 RtlFindFirstRunClear( | |
| 1468 IN PRTL_BITMAP BitMapHeader, | |
| 1469 OUT PULONG StartingIndex); | |
| 1470 | |
| 1471 NTSYSAPI | |
| 1472 ULONG | |
| 1473 NTAPI | |
| 1474 RtlFindClearRuns( | |
| 1475 IN PRTL_BITMAP BitMapHeader, | |
| 1476 OUT PRTL_BITMAP_RUN RunArray, | |
| 1477 IN ULONG SizeOfRunArray, | |
| 1478 IN BOOLEAN LocateLongestRuns); | |
| 1479 | |
| 1480 NTSYSAPI | |
| 1481 ULONG | |
| 1482 NTAPI | |
| 1483 RtlFindLastBackwardRunClear( | |
| 1484 IN PRTL_BITMAP BitMapHeader, | |
| 1485 IN ULONG FromIndex, | |
| 1486 OUT PULONG StartingRunIndex); | |
| 1487 | |
| 1488 NTSYSAPI | |
| 1489 CCHAR | |
| 1490 NTAPI | |
| 1491 RtlFindLeastSignificantBit( | |
| 1492 IN ULONGLONG Set); | |
| 1493 | |
| 1494 NTSYSAPI | |
| 1495 ULONG | |
| 1496 NTAPI | |
| 1497 RtlFindLongestRunClear( | |
| 1498 IN PRTL_BITMAP BitMapHeader, | |
| 1499 OUT PULONG StartingIndex); | |
| 1500 | |
| 1501 NTSYSAPI | |
| 1502 CCHAR | |
| 1503 NTAPI | |
| 1504 RtlFindMostSignificantBit( | |
| 1505 IN ULONGLONG Set); | |
| 1506 | |
| 1507 NTSYSAPI | |
| 1508 ULONG | |
| 1509 NTAPI | |
| 1510 RtlFindNextForwardRunClear( | |
| 1511 IN PRTL_BITMAP BitMapHeader, | |
| 1512 IN ULONG FromIndex, | |
| 1513 OUT PULONG StartingRunIndex); | |
| 1514 | |
| 1515 NTSYSAPI | |
| 1516 ULONG | |
| 1517 NTAPI | |
| 1518 RtlFindSetBits( | |
| 1519 IN PRTL_BITMAP BitMapHeader, | |
| 1520 IN ULONG NumberToFind, | |
| 1521 IN ULONG HintIndex); | |
| 1522 | |
| 1523 NTSYSAPI | |
| 1524 ULONG | |
| 1525 NTAPI | |
| 1526 RtlFindSetBitsAndClear( | |
| 1527 IN PRTL_BITMAP BitMapHeader, | |
| 1528 IN ULONG NumberToFind, | |
| 1529 IN ULONG HintIndex); | |
| 1530 | |
| 1531 NTSYSAPI | |
| 1532 NTSTATUS | |
| 1533 NTAPI | |
| 1534 RtlHashUnicodeString( | |
| 1535 IN CONST UNICODE_STRING *String, | |
| 1536 IN BOOLEAN CaseInSensitive, | |
| 1537 IN ULONG HashAlgorithm, | |
| 1538 OUT PULONG HashValue); | |
| 1539 | |
| 1540 NTSYSAPI | |
| 1541 VOID | |
| 1542 NTAPI | |
| 1543 RtlInitAnsiString( | |
| 1544 IN OUT PANSI_STRING DestinationString, | |
| 1545 IN PCSZ SourceString); | |
| 1546 | |
| 1547 NTSYSAPI | |
| 1548 VOID | |
| 1549 NTAPI | |
| 1550 RtlInitializeBitMap( | |
| 1551 IN PRTL_BITMAP BitMapHeader, | |
| 1552 IN PULONG BitMapBuffer, | |
| 1553 IN ULONG SizeOfBitMap); | |
| 1554 | |
| 1555 NTSYSAPI | |
| 1556 VOID | |
| 1557 NTAPI | |
| 1558 RtlInitString( | |
| 1559 IN OUT PSTRING DestinationString, | |
| 1560 IN PCSZ SourceString); | |
| 1561 | |
| 1562 NTSYSAPI | |
| 1563 NTSTATUS | |
| 1564 NTAPI | |
| 1565 RtlIntegerToUnicodeString( | |
| 1566 IN ULONG Value, | |
| 1567 IN ULONG Base OPTIONAL, | |
| 1568 IN OUT PUNICODE_STRING String); | |
| 1569 | |
| 1570 NTSYSAPI | |
| 1571 NTSTATUS | |
| 1572 NTAPI | |
| 1573 RtlInt64ToUnicodeString( | |
| 1574 IN ULONGLONG Value, | |
| 1575 IN ULONG Base OPTIONAL, | |
| 1576 IN OUT PUNICODE_STRING String); | |
| 1577 | |
| 1578 #ifdef _WIN64 | |
| 1579 #define RtlIntPtrToUnicodeString(Value, Base, String) \ | |
| 1580 RtlInt64ToUnicodeString(Value, Base, String) | |
| 1581 #else | |
| 1582 #define RtlIntPtrToUnicodeString(Value, Base, String) \ | |
| 1583 RtlIntegerToUnicodeString(Value, Base, String) | |
| 1584 #endif | |
| 1585 | |
| 1586 /* BOOLEAN | |
| 1587 * RtlIsZeroLuid( | |
| 1588 * IN PLUID L1); | |
| 1589 */ | |
| 1590 #define RtlIsZeroLuid(_L1) \ | |
| 1591 ((BOOLEAN) ((!(_L1)->LowPart) && (!(_L1)->HighPart))) | |
| 1592 | |
| 1593 NTSYSAPI | |
| 1594 ULONG | |
| 1595 NTAPI | |
| 1596 RtlLengthSecurityDescriptor( | |
| 1597 IN PSECURITY_DESCRIPTOR SecurityDescriptor); | |
| 1598 | |
| 1599 NTSYSAPI | |
| 1600 ULONG | |
| 1601 NTAPI | |
| 1602 RtlNumberOfClearBits( | |
| 1603 IN PRTL_BITMAP BitMapHeader); | |
| 1604 | |
| 1605 NTSYSAPI | |
| 1606 ULONG | |
| 1607 NTAPI | |
| 1608 RtlNumberOfSetBits( | |
| 1609 IN PRTL_BITMAP BitMapHeader); | |
| 1610 | |
| 1611 NTSYSAPI | |
| 1612 NTSTATUS | |
| 1613 NTAPI | |
| 1614 RtlQueryRegistryValues( | |
| 1615 IN ULONG RelativeTo, | |
| 1616 IN PCWSTR Path, | |
| 1617 IN PRTL_QUERY_REGISTRY_TABLE QueryTable, | |
| 1618 IN PVOID Context, | |
| 1619 IN PVOID Environment OPTIONAL); | |
| 1620 | |
| 1621 #define LONG_SIZE (sizeof(LONG)) | |
| 1622 #define LONG_MASK (LONG_SIZE - 1) | |
| 1623 | |
| 1624 /* VOID | |
| 1625 * RtlRetrieveUlong( | |
| 1626 * PULONG DestinationAddress, | |
| 1627 * PULONG SourceAddress); | |
| 1628 */ | |
| 1629 #if defined(_AMD64_) | |
| 1630 #define RtlRetrieveUlong(DestAddress,SrcAddress) \ | |
| 1631 *(ULONG UNALIGNED *)(DestAddress) = *(PULONG)(SrcAddress) | |
| 1632 #else | |
| 1633 #define RtlRetrieveUlong(DestAddress,SrcAddress) \ | |
| 1634 if ((ULONG_PTR)(SrcAddress) & LONG_MASK) \ | |
| 1635 { \ | |
| 1636 ((PUCHAR)(DestAddress))[0]=((PUCHAR)(SrcAddress))[0]; \ | |
| 1637 ((PUCHAR)(DestAddress))[1]=((PUCHAR)(SrcAddress))[1]; \ | |
| 1638 ((PUCHAR)(DestAddress))[2]=((PUCHAR)(SrcAddress))[2]; \ | |
| 1639 ((PUCHAR)(DestAddress))[3]=((PUCHAR)(SrcAddress))[3]; \ | |
| 1640 } \ | |
| 1641 else \ | |
| 1642 { \ | |
| 1643 *((PULONG)(DestAddress))=*((PULONG)(SrcAddress)); \ | |
| 1644 } | |
| 1645 #endif | |
| 1646 | |
| 1647 /* VOID | |
| 1648 * RtlRetrieveUshort( | |
| 1649 * PUSHORT DestinationAddress, | |
| 1650 * PUSHORT SourceAddress); | |
| 1651 */ | |
| 1652 #if defined(_AMD64_) | |
| 1653 #define RtlRetrieveUshort(DestAddress,SrcAddress) \ | |
| 1654 *(USHORT UNALIGNED *)(DestAddress) = *(USHORT)(SrcAddress) | |
| 1655 #else | |
| 1656 #define RtlRetrieveUshort(DestAddress,SrcAddress) \ | |
| 1657 if ((ULONG_PTR)(SrcAddress) & LONG_MASK) \ | |
| 1658 { \ | |
| 1659 ((PUCHAR)(DestAddress))[0]=((PUCHAR)(SrcAddress))[0]; \ | |
| 1660 ((PUCHAR)(DestAddress))[1]=((PUCHAR)(SrcAddress))[1]; \ | |
| 1661 } \ | |
| 1662 else \ | |
| 1663 { \ | |
| 1664 *((PUSHORT)(DestAddress))=*((PUSHORT)(SrcAddress)); \ | |
| 1665 } | |
| 1666 #endif | |
| 1667 | |
| 1668 NTSYSAPI | |
| 1669 VOID | |
| 1670 NTAPI | |
| 1671 RtlSetAllBits( | |
| 1672 IN PRTL_BITMAP BitMapHeader); | |
| 1673 | |
| 1674 NTSYSAPI | |
| 1675 VOID | |
| 1676 NTAPI | |
| 1677 RtlSetBits( | |
| 1678 IN PRTL_BITMAP BitMapHeader, | |
| 1679 IN ULONG StartingIndex, | |
| 1680 IN ULONG NumberToSet); | |
| 1681 | |
| 1682 NTSYSAPI | |
| 1683 NTSTATUS | |
| 1684 NTAPI | |
| 1685 RtlSetDaclSecurityDescriptor( | |
| 1686 IN OUT PSECURITY_DESCRIPTOR SecurityDescriptor, | |
| 1687 IN BOOLEAN DaclPresent, | |
| 1688 IN PACL Dacl OPTIONAL, | |
| 1689 IN BOOLEAN DaclDefaulted OPTIONAL); | |
| 1690 | |
| 1691 /* VOID | |
| 1692 * RtlStoreUlong( | |
| 1693 * IN PULONG Address, | |
| 1694 * IN ULONG Value); | |
| 1695 */ | |
| 1696 #if defined(_AMD64_) | |
| 1697 #define RtlStoreUlong(Address,Value) \ | |
| 1698 *(ULONG UNALIGNED *)(Address) = (Value) | |
| 1699 #else | |
| 1700 #define RtlStoreUlong(Address,Value) \ | |
| 1701 if ((ULONG_PTR)(Address) & LONG_MASK) { \ | |
| 1702 ((PUCHAR) (Address))[LONG_LEAST_SIGNIFICANT_BIT] = (UCHAR)(FIRSTBYTE(Value)); \ | |
| 1703 ((PUCHAR) (Address))[LONG_3RD_MOST_SIGNIFICANT_BIT] = (UCHAR)(SECONDBYTE(Value)); \ | |
| 1704 ((PUCHAR) (Address))[LONG_2ND_MOST_SIGNIFICANT_BIT] = (UCHAR)(THIRDBYTE(Value)); \ | |
| 1705 ((PUCHAR) (Address))[LONG_MOST_SIGNIFICANT_BIT] = (UCHAR)(FOURTHBYTE(Value)); \ | |
| 1706 } \ | |
| 1707 else { \ | |
| 1708 *((PULONG)(Address)) = (ULONG) (Value); \ | |
| 1709 } | |
| 1710 #endif | |
| 1711 | |
| 1712 /* VOID | |
| 1713 * RtlStoreUlonglong( | |
| 1714 * IN OUT PULONGLONG Address, | |
| 1715 * ULONGLONG Value); | |
| 1716 */ | |
| 1717 #if defined(_AMD64_) | |
| 1718 #define RtlStoreUlonglong(Address,Value) \ | |
| 1719 *(ULONGLONG UNALIGNED *)(Address) = (Value) | |
| 1720 #else | |
| 1721 #define RtlStoreUlonglong(Address,Value) \ | |
| 1722 if ((ULONG_PTR)(Address) & LONGLONG_MASK) { \ | |
| 1723 RtlStoreUlong((ULONG_PTR)(Address), \ | |
| 1724 (ULONGLONG)(Value) & 0xFFFFFFFF); \ | |
| 1725 RtlStoreUlong((ULONG_PTR)(Address)+sizeof(ULONG), \ | |
| 1726 (ULONGLONG)(Value) >> 32); \ | |
| 1727 } else { \ | |
| 1728 *((PULONGLONG)(Address)) = (ULONGLONG)(Value); \ | |
| 1729 } | |
| 1730 #endif | |
| 1731 | |
| 1732 /* VOID | |
| 1733 * RtlStoreUlongPtr( | |
| 1734 * IN OUT PULONG_PTR Address, | |
| 1735 * IN ULONG_PTR Value); | |
| 1736 */ | |
| 1737 #ifdef _WIN64 | |
| 1738 #define RtlStoreUlongPtr(Address,Value) \ | |
| 1739 RtlStoreUlonglong(Address,Value) | |
| 1740 #else | |
| 1741 #define RtlStoreUlongPtr(Address,Value) \ | |
| 1742 RtlStoreUlong(Address,Value) | |
| 1743 #endif | |
| 1744 | |
| 1745 /* VOID | |
| 1746 * RtlStoreUshort( | |
| 1747 * IN PUSHORT Address, | |
| 1748 * IN USHORT Value); | |
| 1749 */ | |
| 1750 #if defined(_AMD64_) | |
| 1751 #define RtlStoreUshort(Address,Value) \ | |
| 1752 *(USHORT UNALIGNED *)(Address) = (Value) | |
| 1753 #else | |
| 1754 #define RtlStoreUshort(Address,Value) \ | |
| 1755 if ((ULONG_PTR)(Address) & SHORT_MASK) { \ | |
| 1756 ((PUCHAR) (Address))[SHORT_LEAST_SIGNIFICANT_BIT] = (UCHAR)(FIRSTBYTE(Value)); \ | |
| 1757 ((PUCHAR) (Address))[SHORT_MOST_SIGNIFICANT_BIT ] = (UCHAR)(SECONDBYTE(Value)); \ | |
| 1758 } \ | |
| 1759 else { \ | |
| 1760 *((PUSHORT) (Address)) = (USHORT)Value; \ | |
| 1761 } | |
| 1762 #endif | |
| 1763 | |
| 1764 NTSYSAPI | |
| 1765 BOOLEAN | |
| 1766 NTAPI | |
| 1767 RtlTimeFieldsToTime( | |
| 1768 IN PTIME_FIELDS TimeFields, | |
| 1769 IN PLARGE_INTEGER Time); | |
| 1770 | |
| 1771 NTSYSAPI | |
| 1772 VOID | |
| 1773 NTAPI | |
| 1774 RtlTimeToTimeFields( | |
| 1775 IN PLARGE_INTEGER Time, | |
| 1776 IN PTIME_FIELDS TimeFields); | |
| 1777 | |
| 1778 NTSYSAPI | |
| 1779 ULONG | |
| 1780 FASTCALL | |
| 1781 RtlUlongByteSwap( | |
| 1782 IN ULONG Source); | |
| 1783 | |
| 1784 NTSYSAPI | |
| 1785 ULONGLONG | |
| 1786 FASTCALL | |
| 1787 RtlUlonglongByteSwap( | |
| 1788 IN ULONGLONG Source); | |
| 1789 | |
| 1790 NTSYSAPI | |
| 1791 NTSTATUS | |
| 1792 NTAPI | |
| 1793 RtlUnicodeStringToAnsiString( | |
| 1794 IN OUT PANSI_STRING DestinationString, | |
| 1795 IN PCUNICODE_STRING SourceString, | |
| 1796 IN BOOLEAN AllocateDestinationString); | |
| 1797 | |
| 1798 NTSYSAPI | |
| 1799 ULONG | |
| 1800 NTAPI | |
| 1801 RtlxUnicodeStringToAnsiSize( | |
| 1802 IN PCUNICODE_STRING UnicodeString); | |
| 1803 | |
| 1804 #define RtlUnicodeStringToAnsiSize(String) ( \ | |
| 1805 NLS_MB_CODE_PAGE_TAG ? \ | |
| 1806 RtlxUnicodeStringToAnsiSize(String) : \ | |
| 1807 ((String)->Length + sizeof(UNICODE_NULL)) / sizeof(WCHAR) \ | |
| 1808 ) | |
| 1809 | |
| 1810 NTSYSAPI | |
| 1811 NTSTATUS | |
| 1812 NTAPI | |
| 1813 RtlUnicodeStringToInteger( | |
| 1814 IN PCUNICODE_STRING String, | |
| 1815 IN ULONG Base OPTIONAL, | |
| 1816 OUT PULONG Value); | |
| 1817 | |
| 1818 NTSYSAPI | |
| 1819 WCHAR | |
| 1820 NTAPI | |
| 1821 RtlUpcaseUnicodeChar( | |
| 1822 IN WCHAR SourceCharacter); | |
| 1823 | |
| 1824 NTSYSAPI | |
| 1825 USHORT | |
| 1826 FASTCALL | |
| 1827 RtlUshortByteSwap( | |
| 1828 IN USHORT Source); | |
| 1829 | |
| 1830 NTSYSAPI | |
| 1831 BOOLEAN | |
| 1832 NTAPI | |
| 1833 RtlValidRelativeSecurityDescriptor( | |
| 1834 IN PSECURITY_DESCRIPTOR SecurityDescriptorInput, | |
| 1835 IN ULONG SecurityDescriptorLength, | |
| 1836 IN SECURITY_INFORMATION RequiredInformation); | |
| 1837 | |
| 1838 NTSYSAPI | |
| 1839 BOOLEAN | |
| 1840 NTAPI | |
| 1841 RtlValidSecurityDescriptor( | |
| 1842 IN PSECURITY_DESCRIPTOR SecurityDescriptor); | |
| 1843 | |
| 1844 NTSYSAPI | |
| 1845 NTSTATUS | |
| 1846 NTAPI | |
| 1847 RtlWriteRegistryValue( | |
| 1848 IN ULONG RelativeTo, | |
| 1849 IN PCWSTR Path, | |
| 1850 IN PCWSTR ValueName, | |
| 1851 IN ULONG ValueType, | |
| 1852 IN PVOID ValueData, | |
| 1853 IN ULONG ValueLength); | |
| 1854 | |
| 1855 #endif // (NTDDI_VERSION >= NTDDI_WIN2K) | |
| 1856 | |
| 1857 #if (NTDDI_VERSION >= NTDDI_WIN2KSP3) | |
| 1858 NTSYSAPI | |
| 1859 VOID | |
| 1860 FASTCALL | |
| 1861 RtlPrefetchMemoryNonTemporal( | |
| 1862 IN PVOID Source, | |
| 1863 IN SIZE_T Length); | |
| 1864 #endif | |
| 1865 | |
| 1866 #if (NTDDI_VERSION >= NTDDI_WINXP) | |
| 1867 NTSYSAPI | |
| 1868 VOID | |
| 1869 NTAPI | |
| 1870 RtlClearBit( | |
| 1871 PRTL_BITMAP BitMapHeader, | |
| 1872 ULONG BitNumber); | |
| 1873 | |
| 1874 NTSYSAPI | |
| 1875 WCHAR | |
| 1876 NTAPI | |
| 1877 RtlDowncaseUnicodeChar( | |
| 1878 IN WCHAR SourceCharacter); | |
| 1879 | |
| 1880 NTSYSAPI | |
| 1881 VOID | |
| 1882 NTAPI | |
| 1883 RtlSetBit( | |
| 1884 PRTL_BITMAP BitMapHeader, | |
| 1885 ULONG BitNumber); | |
| 1886 | |
| 1887 NTSYSAPI | |
| 1888 BOOLEAN | |
| 1889 NTAPI | |
| 1890 RtlTestBit( | |
| 1891 IN PRTL_BITMAP BitMapHeader, | |
| 1892 IN ULONG BitNumber); | |
| 1893 | |
| 1894 #endif // (NTDDI_VERSION >= NTDDI_WINXP) | |
| 1895 | |
| 1896 #if (NTDDI_VERSION >= NTDDI_VISTA) | |
| 1897 NTSYSAPI | |
| 1898 ULONG | |
| 1899 NTAPI | |
| 1900 RtlNumberOfSetBitsUlongPtr( | |
| 1901 IN ULONG_PTR Target); | |
| 1902 | |
| 1903 NTSYSAPI | |
| 1904 ULONGLONG | |
| 1905 NTAPI | |
| 1906 RtlIoDecodeMemIoResource ( | |
| 1907 IN PIO_RESOURCE_DESCRIPTOR Descriptor, | |
| 1908 OUT PULONGLONG Alignment OPTIONAL, | |
| 1909 OUT PULONGLONG MinimumAddress OPTIONAL, | |
| 1910 OUT PULONGLONG MaximumAddress OPTIONAL); | |
| 1911 | |
| 1912 NTSYSAPI | |
| 1913 NTSTATUS | |
| 1914 NTAPI | |
| 1915 RtlIoEncodeMemIoResource( | |
| 1916 IN PIO_RESOURCE_DESCRIPTOR Descriptor, | |
| 1917 IN UCHAR Type, | |
| 1918 IN ULONGLONG Length, | |
| 1919 IN ULONGLONG Alignment, | |
| 1920 IN ULONGLONG MinimumAddress, | |
| 1921 IN ULONGLONG MaximumAddress); | |
| 1922 | |
| 1923 NTSYSAPI | |
| 1924 ULONGLONG | |
| 1925 NTAPI | |
| 1926 RtlCmDecodeMemIoResource( | |
| 1927 IN PCM_PARTIAL_RESOURCE_DESCRIPTOR Descriptor, | |
| 1928 OUT PULONGLONG Start OPTIONAL); | |
| 1929 | |
| 1930 NTSYSAPI | |
| 1931 NTSTATUS | |
| 1932 NTAPI | |
| 1933 RtlFindClosestEncodableLength( | |
| 1934 IN ULONGLONG SourceLength, | |
| 1935 OUT PULONGLONG TargetLength); | |
| 1936 | |
| 1937 #endif | |
| 1938 | |
| 1939 #if !defined(MIDL_PASS) | |
| 1940 /* inline funftions */ | |
| 1941 //DECLSPEC_DEPRECATED_DDK_WINXP | |
| 1942 static __inline | |
| 1943 LARGE_INTEGER | |
| 1944 NTAPI_INLINE | |
| 1945 RtlConvertLongToLargeInteger(LONG SignedInteger) | |
| 1946 { | |
| 1947 LARGE_INTEGER ret; | |
| 1948 ret.QuadPart = SignedInteger; | |
| 1949 return ret; | |
| 1950 } | |
| 1951 | |
| 1952 //DECLSPEC_DEPRECATED_DDK_WINXP | |
| 1953 static __inline | |
| 1954 LARGE_INTEGER | |
| 1955 NTAPI_INLINE | |
| 1956 RtlConvertUlongToLargeInteger( | |
| 1957 ULONG UnsignedInteger) | |
| 1958 { | |
| 1959 LARGE_INTEGER ret; | |
| 1960 ret.QuadPart = UnsignedInteger; | |
| 1961 return ret; | |
| 1962 } | |
| 1963 | |
| 1964 //DECLSPEC_DEPRECATED_DDK | |
| 1965 static __inline | |
| 1966 ULONG | |
| 1967 NTAPI_INLINE | |
| 1968 RtlEnlargedUnsignedDivide( | |
| 1969 IN ULARGE_INTEGER Dividend, | |
| 1970 IN ULONG Divisor, | |
| 1971 IN OUT PULONG Remainder) | |
| 1972 { | |
| 1973 if (Remainder) | |
| 1974 *Remainder = (ULONG)(Dividend.QuadPart % Divisor); | |
| 1975 return (ULONG)(Dividend.QuadPart / Divisor); | |
| 1976 } | |
| 1977 | |
| 1978 //DECLSPEC_DEPRECATED_DDK | |
| 1979 static __inline | |
| 1980 LARGE_INTEGER | |
| 1981 NTAPI_INLINE | |
| 1982 RtlEnlargedUnsignedMultiply( | |
| 1983 IN ULONG Multiplicand, | |
| 1984 IN ULONG Multiplier) | |
| 1985 { | |
| 1986 LARGE_INTEGER ret; | |
| 1987 ret.QuadPart = (ULONGLONG)Multiplicand * (ULONGLONG)Multiplier; | |
| 1988 return ret; | |
| 1989 } | |
| 1990 | |
| 1991 //DECLSPEC_DEPRECATED_DDK | |
| 1992 static __inline | |
| 1993 LARGE_INTEGER | |
| 1994 NTAPI_INLINE | |
| 1995 RtlEnlargedIntegerMultiply( | |
| 1996 IN LONG Multiplicand, | |
| 1997 IN LONG Multiplier) | |
| 1998 { | |
| 1999 LARGE_INTEGER ret; | |
| 2000 ret.QuadPart = (LONGLONG)Multiplicand * (ULONGLONG)Multiplier; | |
| 2001 return ret; | |
| 2002 } | |
| 2003 | |
| 2004 FORCEINLINE | |
| 2005 VOID | |
| 2006 RtlInitEmptyAnsiString(OUT PANSI_STRING AnsiString, | |
| 2007 IN PCHAR Buffer, | |
| 2008 IN USHORT BufferSize) | |
| 2009 { | |
| 2010 AnsiString->Length = 0; | |
| 2011 AnsiString->MaximumLength = BufferSize; | |
| 2012 AnsiString->Buffer = Buffer; | |
| 2013 } | |
| 2014 | |
| 2015 FORCEINLINE | |
| 2016 VOID | |
| 2017 RtlInitEmptyUnicodeString( | |
| 2018 OUT PUNICODE_STRING UnicodeString, | |
| 2019 IN PWSTR Buffer, | |
| 2020 IN USHORT BufferSize) | |
| 2021 { | |
| 2022 UnicodeString->Length = 0; | |
| 2023 UnicodeString->MaximumLength = BufferSize; | |
| 2024 UnicodeString->Buffer = Buffer; | |
| 2025 } | |
| 2026 | |
| 2027 #if defined(_AMD64_) || defined(_IA64_) | |
| 2028 static __inline | |
| 2029 LARGE_INTEGER | |
| 2030 NTAPI_INLINE | |
| 2031 RtlExtendedIntegerMultiply( | |
| 2032 LARGE_INTEGER Multiplicand, | |
| 2033 LONG Multiplier) | |
| 2034 { | |
| 2035 LARGE_INTEGER ret; | |
| 2036 ret.QuadPart = Multiplicand.QuadPart * Multiplier; | |
| 2037 return ret; | |
| 2038 } | |
| 2039 | |
| 2040 static __inline | |
| 2041 LARGE_INTEGER | |
| 2042 NTAPI_INLINE | |
| 2043 RtlExtendedLargeIntegerDivide( | |
| 2044 LARGE_INTEGER Dividend, | |
| 2045 ULONG Divisor, | |
| 2046 PULONG Remainder) | |
| 2047 { | |
| 2048 LARGE_INTEGER ret; | |
| 2049 ret.QuadPart = (ULONG64)Dividend.QuadPart / Divisor; | |
| 2050 if (Remainder) | |
| 2051 *Remainder = (ULONG)(Dividend.QuadPart % Divisor); | |
| 2052 return ret; | |
| 2053 } | |
| 2054 #endif | |
| 2055 | |
| 2056 #if defined(_AMD64_) | |
| 2057 | |
| 2058 #define MultiplyHigh __mulh | |
| 2059 #define UnsignedMultiplyHigh __umulh | |
| 2060 | |
| 2061 //DECLSPEC_DEPRECATED_DDK | |
| 2062 static __inline | |
| 2063 LARGE_INTEGER | |
| 2064 NTAPI_INLINE | |
| 2065 RtlExtendedMagicDivide( | |
| 2066 IN LARGE_INTEGER Dividend, | |
| 2067 IN LARGE_INTEGER MagicDivisor, | |
| 2068 IN CCHAR ShiftCount) | |
| 2069 { | |
| 2070 LARGE_INTEGER ret; | |
| 2071 ULONG64 ret64; | |
| 2072 BOOLEAN Pos; | |
| 2073 Pos = (Dividend.QuadPart >= 0); | |
| 2074 ret64 = UnsignedMultiplyHigh(Pos ? Dividend.QuadPart : -Dividend.QuadPart, | |
| 2075 MagicDivisor.QuadPart); | |
| 2076 ret64 >>= ShiftCount; | |
| 2077 ret.QuadPart = Pos ? ret64 : -ret64; | |
| 2078 return ret; | |
| 2079 } | |
| 2080 #endif | |
| 2081 | |
| 2082 //DECLSPEC_DEPRECATED_DDK | |
| 2083 static __inline | |
| 2084 LARGE_INTEGER | |
| 2085 NTAPI_INLINE | |
| 2086 RtlLargeIntegerAdd( | |
| 2087 IN LARGE_INTEGER Addend1, | |
| 2088 IN LARGE_INTEGER Addend2) | |
| 2089 { | |
| 2090 LARGE_INTEGER ret; | |
| 2091 ret.QuadPart = Addend1.QuadPart + Addend2.QuadPart; | |
| 2092 return ret; | |
| 2093 } | |
| 2094 | |
| 2095 /* VOID | |
| 2096 * RtlLargeIntegerAnd( | |
| 2097 * IN OUT LARGE_INTEGER Result, | |
| 2098 * IN LARGE_INTEGER Source, | |
| 2099 * IN LARGE_INTEGER Mask); | |
| 2100 */ | |
| 2101 #define RtlLargeIntegerAnd(Result, Source, Mask) \ | |
| 2102 Result.QuadPart = Source.QuadPart & Mask.QuadPart | |
| 2103 | |
| 2104 //DECLSPEC_DEPRECATED_DDK | |
| 2105 static __inline | |
| 2106 LARGE_INTEGER | |
| 2107 NTAPI_INLINE | |
| 2108 RtlLargeIntegerArithmeticShift( | |
| 2109 IN LARGE_INTEGER LargeInteger, | |
| 2110 IN CCHAR ShiftCount) | |
| 2111 { | |
| 2112 LARGE_INTEGER ret; | |
| 2113 ret.QuadPart = LargeInteger.QuadPart >> ShiftCount; | |
| 2114 return ret; | |
| 2115 } | |
| 2116 | |
| 2117 /* BOOLEAN | |
| 2118 * RtlLargeIntegerEqualTo( | |
| 2119 * IN LARGE_INTEGER Operand1, | |
| 2120 * IN LARGE_INTEGER Operand2); | |
| 2121 */ | |
| 2122 #define RtlLargeIntegerEqualTo(X,Y) \ | |
| 2123 (!(((X).LowPart ^ (Y).LowPart) | ((X).HighPart ^ (Y).HighPart))) | |
| 2124 | |
| 2125 FORCEINLINE | |
| 2126 PVOID | |
| 2127 RtlSecureZeroMemory( | |
| 2128 OUT PVOID Pointer, | |
| 2129 IN SIZE_T Size) | |
| 2130 { | |
| 2131 volatile char* vptr = (volatile char*)Pointer; | |
| 2132 #if defined(_M_AMD64) | |
| 2133 __stosb((PUCHAR)vptr, 0, Size); | |
| 2134 #else | |
| 2135 char * endptr = (char *)vptr + Size; | |
| 2136 while (vptr < endptr) | |
| 2137 { | |
| 2138 *vptr = 0; vptr++; | |
| 2139 } | |
| 2140 #endif | |
| 2141 return Pointer; | |
| 2142 } | |
| 2143 | |
| 2144 #if defined(_M_AMD64) | |
| 2145 FORCEINLINE | |
| 2146 ULONG | |
| 2147 RtlCheckBit( | |
| 2148 IN PRTL_BITMAP BitMapHeader, | |
| 2149 IN ULONG BitPosition) | |
| 2150 { | |
| 2151 return BitTest((LONG CONST*)BitMapHeader->Buffer, BitPosition); | |
| 2152 } | |
| 2153 #else | |
| 2154 #define RtlCheckBit(BMH,BP) (((((PLONG)(BMH)->Buffer)[(BP)/32]) >> ((BP)%32)) & 0x1) | |
| 2155 #endif // defined(_M_AMD64) | |
| 2156 | |
| 2157 #endif // !defined(MIDL_PASS) | |
| 2158 | |
| 2159 // | |
| 2160 // Byte Swap Functions | |
| 2161 // | |
| 2162 #if (defined(_M_IX86) && (_MSC_FULL_VER > 13009037 || defined(__GNUC__))) || \ | |
| 2163 ((defined(_M_AMD64) || defined(_M_IA64)) \ | |
| 2164 && (_MSC_FULL_VER > 13009175 || defined(__GNUC__))) | |
| 2165 | |
| 2166 #define RtlUshortByteSwap(_x) _byteswap_ushort((USHORT)(_x)) | |
| 2167 #define RtlUlongByteSwap(_x) _byteswap_ulong((_x)) | |
| 2168 #define RtlUlonglongByteSwap(_x) _byteswap_uint64((_x)) | |
| 2169 | |
| 2170 #endif | |
| 2171 | |
| 2172 /****************************************************************************** | |
| 2173 * Memory manager Types * | |
| 2174 ******************************************************************************/ | |
| 2175 | |
| 2176 typedef struct _MDL { | |
| 2177 struct _MDL *Next; | |
| 2178 CSHORT Size; | |
| 2179 CSHORT MdlFlags; | |
| 2180 struct _EPROCESS *Process; | |
| 2181 PVOID MappedSystemVa; | |
| 2182 PVOID StartVa; | |
| 2183 ULONG ByteCount; | |
| 2184 ULONG ByteOffset; | |
| 2185 } MDL, *PMDL; | |
| 2186 | |
| 2187 | |
| 2188 /****************************************************************************** | |
| 2189 * Memory manager Functions * | |
| 2190 ******************************************************************************/ | |
| 2191 | |
| 2192 /* PVOID MmGetSystemAddressForMdl( | |
| 2193 * IN PMDL Mdl); | |
| 2194 */ | |
| 2195 #define MmGetSystemAddressForMdl(Mdl) \ | |
| 2196 (((Mdl)->MdlFlags & (MDL_MAPPED_TO_SYSTEM_VA | \ | |
| 2197 MDL_SOURCE_IS_NONPAGED_POOL)) ? \ | |
| 2198 ((Mdl)->MappedSystemVa) : \ | |
| 2199 (MmMapLockedPages((Mdl), KernelMode))) | |
| 2200 | |
| 2201 /* PVOID | |
| 2202 * MmGetSystemAddressForMdlSafe( | |
| 2203 * IN PMDL Mdl, | |
| 2204 * IN MM_PAGE_PRIORITY Priority) | |
| 2205 */ | |
| 2206 #define MmGetSystemAddressForMdlSafe(_Mdl, _Priority) \ | |
| 2207 (((_Mdl)->MdlFlags & (MDL_MAPPED_TO_SYSTEM_VA \ | |
| 2208 | MDL_SOURCE_IS_NONPAGED_POOL)) ? \ | |
| 2209 (_Mdl)->MappedSystemVa : \ | |
| 2210 (PVOID) MmMapLockedPagesSpecifyCache((_Mdl), \ | |
| 2211 KernelMode, MmCached, NULL, FALSE, (_Priority))) | |
| 2212 | |
| 2213 #if (NTDDI_VERSION >= NTDDI_WIN2K) | |
| 2214 NTKERNELAPI | |
| 2215 PMDL | |
| 2216 NTAPI | |
| 2217 MmCreateMdl( | |
| 2218 IN PMDL MemoryDescriptorList OPTIONAL, | |
| 2219 IN PVOID Base, | |
| 2220 IN SIZE_T Length); | |
| 2221 | |
| 2222 #endif | |
| 2223 | |
| 2224 | |
| 2225 /****************************************************************************** | |
| 2226 * I/O Manager Functions * | |
| 2227 ******************************************************************************/ | |
| 2228 | |
| 2229 #if defined(USE_DMA_MACROS) && !defined(_NTHAL_) && \ | |
| 2230 (defined(_NTDDK_) || defined(_NTDRIVER_)) || defined(_WDM_INCLUDED_) | |
| 2231 | |
| 2232 #define DMA_MACROS_DEFINED | |
| 2233 | |
| 2234 FORCEINLINE | |
| 2235 NTSTATUS | |
| 2236 IoAllocateAdapterChannel( | |
| 2237 IN PADAPTER_OBJECT AdapterObject, | |
| 2238 IN PDEVICE_OBJECT DeviceObject, | |
| 2239 IN ULONG NumberOfMapRegisters, | |
| 2240 IN PDRIVER_CONTROL ExecutionRoutine, | |
| 2241 IN PVOID Context) | |
| 2242 { | |
| 2243 PALLOCATE_ADAPTER_CHANNEL AllocateAdapterChannel; | |
| 2244 AllocateAdapterChannel = | |
| 2245 *(DmaAdapter)->DmaOperations->AllocateAdapterChannel; | |
| 2246 ASSERT(AllocateAdapterChannel); | |
| 2247 return AllocateAdapterChannel(DmaAdapter, | |
| 2248 DeviceObject, | |
| 2249 NumberOfMapRegisters, | |
| 2250 ExecutionRoutine, | |
| 2251 Context ); | |
| 2252 } | |
| 2253 | |
| 2254 FORCEINLINE | |
| 2255 BOOLEAN | |
| 2256 IoFlushAdapterBuffers( | |
| 2257 IN PADAPTER_OBJECT AdapterObject, | |
| 2258 IN PMDL Mdl, | |
| 2259 IN PVOID MapRegisterBase, | |
| 2260 IN PVOID CurrentVa, | |
| 2261 IN ULONG Length, | |
| 2262 IN BOOLEAN WriteToDevice) | |
| 2263 { | |
| 2264 PFLUSH_ADAPTER_BUFFERS FlushAdapterBuffers; | |
| 2265 FlushAdapterBuffers = *(DmaAdapter)->DmaOperations->FlushAdapterBuffers; | |
| 2266 ASSERT(FlushAdapterBuffers); | |
| 2267 return FlushAdapterBuffers(DmaAdapter, | |
| 2268 Mdl, | |
| 2269 MapRegisterBase, | |
| 2270 CurrentVa, | |
| 2271 Length, | |
| 2272 WriteToDevice ); | |
| 2273 } | |
| 2274 | |
| 2275 FORCEINLINE | |
| 2276 VOID | |
| 2277 IoFreeAdapterChannel( | |
| 2278 IN PADAPTER_OBJECT AdapterObject) | |
| 2279 { | |
| 2280 PFREE_ADAPTER_CHANNEL FreeAdapterChannel; | |
| 2281 FreeAdapterChannel = *(DmaAdapter)->DmaOperations->FreeAdapterChannel; | |
| 2282 ASSERT(FreeAdapterChannel); | |
| 2283 FreeAdapterChannel(DmaAdapter); | |
| 2284 } | |
| 2285 | |
| 2286 FORCEINLINE | |
| 2287 VOID | |
| 2288 IoFreeMapRegisters( | |
| 2289 IN PADAPTER_OBJECT AdapterObject, | |
| 2290 IN PVOID MapRegisterBase, | |
| 2291 IN ULONG NumberOfMapRegisters) | |
| 2292 { | |
| 2293 PFREE_MAP_REGISTERS FreeMapRegisters; | |
| 2294 FreeMapRegisters = *(DmaAdapter)->DmaOperations->FreeMapRegisters; | |
| 2295 ASSERT(FreeMapRegisters); | |
| 2296 FreeMapRegisters(DmaAdapter, MapRegisterBase, NumberOfMapRegisters); | |
| 2297 } | |
| 2298 | |
| 2299 FORCEINLINE | |
| 2300 PHYSICAL_ADDRESS | |
| 2301 IoMapTransfer( | |
| 2302 IN PDMA_ADAPTER DmaAdapter, | |
| 2303 IN PMDL Mdl, | |
| 2304 IN PVOID MapRegisterBase, | |
| 2305 IN PVOID CurrentVa, | |
| 2306 IN OUT PULONG Length, | |
| 2307 IN BOOLEAN WriteToDevice) | |
| 2308 { | |
| 2309 PMAP_TRANSFER MapTransfer; | |
| 2310 | |
| 2311 MapTransfer = *(DmaAdapter)->DmaOperations->MapTransfer; | |
| 2312 ASSERT(MapTransfer); | |
| 2313 return MapTransfer(DmaAdapter, | |
| 2314 Mdl, | |
| 2315 MapRegisterBase, | |
| 2316 CurrentVa, | |
| 2317 Length, | |
| 2318 WriteToDevice); | |
| 2319 } | |
| 2320 #endif | |
| 2321 | |
| 2322 | |
| 2323 /****************************************************************************** | |
| 2324 * Executive Types * | |
| 2325 ******************************************************************************/ | |
| 2326 | |
| 2327 typedef enum _POOL_TYPE { | |
| 2328 NonPagedPool, | |
| 2329 PagedPool, | |
| 2330 NonPagedPoolMustSucceed, | |
| 2331 DontUseThisType, | |
| 2332 NonPagedPoolCacheAligned, | |
| 2333 PagedPoolCacheAligned, | |
| 2334 NonPagedPoolCacheAlignedMustS, | |
| 2335 MaxPoolType, | |
| 2336 NonPagedPoolSession = 32, | |
| 2337 PagedPoolSession, | |
| 2338 NonPagedPoolMustSucceedSession, | |
| 2339 DontUseThisTypeSession, | |
| 2340 NonPagedPoolCacheAlignedSession, | |
| 2341 PagedPoolCacheAlignedSession, | |
| 2342 NonPagedPoolCacheAlignedMustSSession | |
| 2343 } POOL_TYPE; | |
| 2344 | |
| 2345 typedef enum _SUITE_TYPE { | |
| 2346 SmallBusiness, | |
| 2347 Enterprise, | |
| 2348 BackOffice, | |
| 2349 CommunicationServer, | |
| 2350 TerminalServer, | |
| 2351 SmallBusinessRestricted, | |
| 2352 EmbeddedNT, | |
| 2353 DataCenter, | |
| 2354 SingleUserTS, | |
| 2355 Personal, | |
| 2356 Blade, | |
| 2357 MaxSuiteType | |
| 2358 } SUITE_TYPE; | |
| 2359 | |
| 2360 typedef enum _EX_POOL_PRIORITY { | |
| 2361 LowPoolPriority, | |
| 2362 LowPoolPrioritySpecialPoolOverrun = 8, | |
| 2363 LowPoolPrioritySpecialPoolUnderrun = 9, | |
| 2364 NormalPoolPriority = 16, | |
| 2365 NormalPoolPrioritySpecialPoolOverrun = 24, | |
| 2366 NormalPoolPrioritySpecialPoolUnderrun = 25, | |
| 2367 HighPoolPriority = 32, | |
| 2368 HighPoolPrioritySpecialPoolOverrun = 40, | |
| 2369 HighPoolPrioritySpecialPoolUnderrun = 41 | |
| 2370 } EX_POOL_PRIORITY; | |
| 2371 | |
| 2372 typedef struct _FAST_MUTEX | |
| 2373 { | |
| 2374 LONG Count; | |
| 2375 PKTHREAD Owner; | |
| 2376 ULONG Contention; | |
| 2377 KEVENT Gate; | |
| 2378 ULONG OldIrql; | |
| 2379 } FAST_MUTEX, *PFAST_MUTEX; | |
| 2380 | |
| 2381 typedef ULONG_PTR ERESOURCE_THREAD, *PERESOURCE_THREAD; | |
| 2382 | |
| 2383 typedef struct _OWNER_ENTRY { | |
| 2384 ERESOURCE_THREAD OwnerThread; | |
| 2385 _ANONYMOUS_UNION union { | |
| 2386 LONG OwnerCount; | |
| 2387 ULONG TableSize; | |
| 2388 } DUMMYUNIONNAME; | |
| 2389 } OWNER_ENTRY, *POWNER_ENTRY; | |
| 2390 | |
| 2391 typedef struct _ERESOURCE | |
| 2392 { | |
| 2393 LIST_ENTRY SystemResourcesList; | |
| 2394 POWNER_ENTRY OwnerTable; | |
| 2395 SHORT ActiveCount; | |
| 2396 USHORT Flag; | |
| 2397 volatile PKSEMAPHORE SharedWaiters; | |
| 2398 volatile PKEVENT ExclusiveWaiters; | |
| 2399 OWNER_ENTRY OwnerEntry; | |
| 2400 ULONG ActiveEntries; | |
| 2401 ULONG ContentionCount; | |
| 2402 ULONG NumberOfSharedWaiters; | |
| 2403 ULONG NumberOfExclusiveWaiters; | |
| 2404 union | |
| 2405 { | |
| 2406 PVOID Address; | |
| 2407 ULONG_PTR CreatorBackTraceIndex; | |
| 2408 }; | |
| 2409 KSPIN_LOCK SpinLock; | |
| 2410 } ERESOURCE, *PERESOURCE; | |
| 2411 | |
| 2412 #if !defined(_WIN64) && (defined(_NTDDK_) || defined(_NTIFS_) || defined(_NDIS_)) | |
| 2413 #define LOOKASIDE_ALIGN | |
| 2414 #else | |
| 2415 #define LOOKASIDE_ALIGN /* FIXME: DECLSPEC_CACHEALIGN */ | |
| 2416 #endif | |
| 2417 | |
| 2418 typedef struct _LOOKASIDE_LIST_EX *PLOOKASIDE_LIST_EX; | |
| 2419 | |
| 2420 typedef PVOID | |
| 2421 (DDKAPI *PALLOCATE_FUNCTION)( | |
| 2422 IN POOL_TYPE PoolType, | |
| 2423 IN SIZE_T NumberOfBytes, | |
| 2424 IN ULONG Tag); | |
| 2425 | |
| 2426 typedef PVOID | |
| 2427 (DDKAPI *PALLOCATE_FUNCTION_EX)( | |
| 2428 IN POOL_TYPE PoolType, | |
| 2429 IN SIZE_T NumberOfBytes, | |
| 2430 IN ULONG Tag, | |
| 2431 IN OUT PLOOKASIDE_LIST_EX Lookaside); | |
| 2432 | |
| 2433 typedef VOID | |
| 2434 (DDKAPI *PFREE_FUNCTION)( | |
| 2435 IN PVOID Buffer); | |
| 2436 | |
| 2437 typedef VOID | |
| 2438 (DDKAPI *PFREE_FUNCTION_EX)( | |
| 2439 IN PVOID Buffer, | |
| 2440 IN OUT PLOOKASIDE_LIST_EX Lookaside); | |
| 2441 | |
| 2442 typedef VOID | |
| 2443 (DDKAPI *PCALLBACK_FUNCTION)( | |
| 2444 IN PVOID CallbackContext, | |
| 2445 IN PVOID Argument1, | |
| 2446 IN PVOID Argument2); | |
| 2447 | |
| 2448 typedef struct LOOKASIDE_ALIGN _GENERAL_LOOKASIDE { | |
| 2449 union { | |
| 2450 SLIST_HEADER ListHead; | |
| 2451 SINGLE_LIST_ENTRY SingleListHead; | |
| 2452 } DUMMYUNIONNAME; | |
| 2453 USHORT Depth; | |
| 2454 USHORT MaximumDepth; | |
| 2455 ULONG TotalAllocates; | |
| 2456 union { | |
| 2457 ULONG AllocateMisses; | |
| 2458 ULONG AllocateHits; | |
| 2459 } DUMMYUNIONNAME2; | |
| 2460 ULONG TotalFrees; | |
| 2461 union { | |
| 2462 ULONG FreeMisses; | |
| 2463 ULONG FreeHits; | |
| 2464 } DUMMYUNIONNAME3; | |
| 2465 POOL_TYPE Type; | |
| 2466 ULONG Tag; | |
| 2467 ULONG Size; | |
| 2468 union { | |
| 2469 PALLOCATE_FUNCTION_EX AllocateEx; | |
| 2470 PALLOCATE_FUNCTION Allocate; | |
| 2471 } DUMMYUNIONNAME4; | |
| 2472 union { | |
| 2473 PFREE_FUNCTION_EX FreeEx; | |
| 2474 PFREE_FUNCTION Free; | |
| 2475 } DUMMYUNIONNAME5; | |
| 2476 LIST_ENTRY ListEntry; | |
| 2477 ULONG LastTotalAllocates; | |
| 2478 union { | |
| 2479 ULONG LastAllocateMisses; | |
| 2480 ULONG LastAllocateHits; | |
| 2481 } DUMMYUNIONNAME6; | |
| 2482 ULONG Future[2]; | |
| 2483 } GENERAL_LOOKASIDE, *PGENERAL_LOOKASIDE; | |
| 2484 | |
| 2485 typedef struct _PAGED_LOOKASIDE_LIST { | |
| 2486 GENERAL_LOOKASIDE L; | |
| 2487 #if !defined(_AMD64_) && !defined(_IA64_) | |
| 2488 FAST_MUTEX Lock__ObsoleteButDoNotDelete; | |
| 2489 #endif | |
| 2490 } PAGED_LOOKASIDE_LIST, *PPAGED_LOOKASIDE_LIST; | |
| 2491 | |
| 2492 typedef struct LOOKASIDE_ALIGN _NPAGED_LOOKASIDE_LIST { | |
| 2493 GENERAL_LOOKASIDE L; | |
| 2494 #if !defined(_AMD64_) && !defined(_IA64_) | |
| 2495 KSPIN_LOCK Lock__ObsoleteButDoNotDelete; | |
| 2496 #endif | |
| 2497 } NPAGED_LOOKASIDE_LIST, *PNPAGED_LOOKASIDE_LIST; | |
| 2498 | |
| 2499 //typedef struct _LOOKASIDE_LIST_EX { | |
| 2500 // GENERAL_LOOKASIDE_POOL L; | |
| 2501 //} LOOKASIDE_LIST_EX, *PLOOKASIDE_LIST_EX; | |
| 2502 | |
| 2503 typedef struct _EX_RUNDOWN_REF { | |
| 2504 union { | |
| 2505 volatile ULONG_PTR Count; | |
| 2506 volatile PVOID Ptr; | |
| 2507 }; | |
| 2508 } EX_RUNDOWN_REF, *PEX_RUNDOWN_REF; | |
| 2509 | |
| 2510 typedef struct _EX_RUNDOWN_REF_CACHE_AWARE *PEX_RUNDOWN_REF_CACHE_AWARE; | |
| 2511 | |
| 2512 typedef enum _WORK_QUEUE_TYPE { | |
| 2513 CriticalWorkQueue, | |
| 2514 DelayedWorkQueue, | |
| 2515 HyperCriticalWorkQueue, | |
| 2516 MaximumWorkQueue | |
| 2517 } WORK_QUEUE_TYPE; | |
| 2518 | |
| 2519 typedef VOID | |
| 2520 (DDKAPI *PWORKER_THREAD_ROUTINE)( | |
| 2521 IN PVOID Parameter); | |
| 2522 | |
| 2523 typedef struct _WORK_QUEUE_ITEM { | |
| 2524 LIST_ENTRY List; | |
| 2525 PWORKER_THREAD_ROUTINE WorkerRoutine; | |
| 2526 volatile PVOID Parameter; | |
| 2527 } WORK_QUEUE_ITEM, *PWORK_QUEUE_ITEM; | |
| 2528 | |
| 2529 | |
| 2530 /****************************************************************************** | |
| 2531 * Executive Functions * | |
| 2532 ******************************************************************************/ | |
| 2533 | |
| 2534 #if defined(_X86_) | |
| 2535 #if defined(_NTHAL_) | |
| 2536 #define ExAcquireFastMutex ExiAcquireFastMutex | |
| 2537 #define ExReleaseFastMutex ExiReleaseFastMutex | |
| 2538 #define ExTryToAcquireFastMutex ExiTryToAcquireFastMutex | |
| 2539 #endif | |
| 2540 #define ExInterlockedAddUlong ExfInterlockedAddUlong | |
| 2541 #define ExInterlockedInsertHeadList ExfInterlockedInsertHeadList | |
| 2542 #define ExInterlockedInsertTailList ExfInterlockedInsertTailList | |
| 2543 #define ExInterlockedRemoveHeadList ExfInterlockedRemoveHeadList | |
| 2544 #define ExInterlockedPopEntryList ExfInterlockedPopEntryList | |
| 2545 #define ExInterlockedPushEntryList ExfInterlockedPushEntryList | |
| 2546 #endif | |
| 2547 | |
| 2548 #if defined(_WIN64) | |
| 2549 | |
| 2550 #if defined(_NTDRIVER_) || defined(_NTDDK_) || defined(_NTIFS_) || \ | |
| 2551 defined(_NTHAL_) || defined(_NTOSP_) | |
| 2552 NTKERNELAPI | |
| 2553 USHORT | |
| 2554 ExQueryDepthSList(IN PSLIST_HEADER ListHead); | |
| 2555 #else | |
| 2556 FORCEINLINE | |
| 2557 USHORT | |
| 2558 ExQueryDepthSList(IN PSLIST_HEADER ListHead) | |
| 2559 { | |
| 2560 return (USHORT)(ListHead->Alignment & 0xffff); | |
| 2561 } | |
| 2562 #endif | |
| 2563 | |
| 2564 NTKERNELAPI | |
| 2565 PSLIST_ENTRY | |
| 2566 ExpInterlockedFlushSList( | |
| 2567 PSLIST_HEADER ListHead); | |
| 2568 | |
| 2569 NTKERNELAPI | |
| 2570 PSLIST_ENTRY | |
| 2571 ExpInterlockedPopEntrySList( | |
| 2572 PSLIST_HEADER ListHead); | |
| 2573 | |
| 2574 NTKERNELAPI | |
| 2575 PSLIST_ENTRY | |
| 2576 ExpInterlockedPushEntrySList( | |
| 2577 PSLIST_HEADER ListHead, | |
| 2578 PSLIST_ENTRY ListEntry); | |
| 2579 | |
| 2580 #define ExInterlockedFlushSList(Head) \ | |
| 2581 ExpInterlockedFlushSList(Head) | |
| 2582 #define ExInterlockedPopEntrySList(Head, Lock) \ | |
| 2583 ExpInterlockedPopEntrySList(Head) | |
| 2584 #define ExInterlockedPushEntrySList(Head, Entry, Lock) \ | |
| 2585 ExpInterlockedPushEntrySList(Head, Entry) | |
| 2586 | |
| 2587 #else // !defined(_WIN64) | |
| 2588 | |
| 2589 #define ExQueryDepthSList(listhead) (listhead)->Depth | |
| 2590 | |
| 2591 NTKERNELAPI | |
| 2592 PSINGLE_LIST_ENTRY | |
| 2593 FASTCALL | |
| 2594 ExInterlockedFlushSList( | |
| 2595 IN PSLIST_HEADER ListHead); | |
| 2596 | |
| 2597 #if defined(_WIN2K_COMPAT_SLIST_USAGE) && defined(_X86_) | |
| 2598 NTKERNELAPI | |
| 2599 PSINGLE_LIST_ENTRY | |
| 2600 FASTCALL | |
| 2601 ExInterlockedPopEntrySList( | |
| 2602 IN PSLIST_HEADER ListHead, | |
| 2603 IN PKSPIN_LOCK Lock); | |
| 2604 | |
| 2605 NTKERNELAPI | |
| 2606 PSINGLE_LIST_ENTRY | |
| 2607 FASTCALL | |
| 2608 ExInterlockedPushEntrySList( | |
| 2609 IN PSLIST_HEADER ListHead, | |
| 2610 IN PSINGLE_LIST_ENTRY ListEntry, | |
| 2611 IN PKSPIN_LOCK Lock); | |
| 2612 #else | |
| 2613 #define ExInterlockedPopEntrySList(_ListHead, _Lock) \ | |
| 2614 InterlockedPopEntrySList(_ListHead) | |
| 2615 #define ExInterlockedPushEntrySList(_ListHead, _ListEntry, _Lock) \ | |
| 2616 InterlockedPushEntrySList(_ListHead, _ListEntry) | |
| 2617 #endif // _WIN2K_COMPAT_SLIST_USAGE | |
| 2618 | |
| 2619 #endif // !defined(_WIN64) | |
| 2620 | |
| 2621 /* ERESOURCE_THREAD | |
| 2622 * ExGetCurrentResourceThread( | |
| 2623 * VOID); | |
| 2624 */ | |
| 2625 #define ExGetCurrentResourceThread() ((ERESOURCE_THREAD)PsGetCurrentThread()) | |
| 2626 | |
| 2627 #define ExReleaseResource(R) (ExReleaseResourceLite(R)) | |
| 2628 | |
| 2629 /* VOID | |
| 2630 * ExInitializeWorkItem( | |
| 2631 * IN PWORK_QUEUE_ITEM Item, | |
| 2632 * IN PWORKER_THREAD_ROUTINE Routine, | |
| 2633 * IN PVOID Context) | |
| 2634 */ | |
| 2635 #define ExInitializeWorkItem(Item, Routine, Context) \ | |
| 2636 { \ | |
| 2637 (Item)->WorkerRoutine = Routine; \ | |
| 2638 (Item)->Parameter = Context; \ | |
| 2639 (Item)->List.Flink = NULL; \ | |
| 2640 } | |
| 2641 | |
| 2642 #if (NTDDI_VERSION >= NTDDI_WIN2K) | |
| 2643 | |
| 2644 NTKERNELAPI | |
| 2645 VOID | |
| 2646 FASTCALL | |
| 2647 ExAcquireFastMutex( | |
| 2648 IN OUT PFAST_MUTEX FastMutex); | |
| 2649 | |
| 2650 NTKERNELAPI | |
| 2651 VOID | |
| 2652 FASTCALL | |
| 2653 ExReleaseFastMutex( | |
| 2654 IN OUT PFAST_MUTEX FastMutex); | |
| 2655 | |
| 2656 NTKERNELAPI | |
| 2657 BOOLEAN | |
| 2658 FASTCALL | |
| 2659 ExTryToAcquireFastMutex( | |
| 2660 IN OUT PFAST_MUTEX FastMutex); | |
| 2661 | |
| 2662 NTKERNELAPI | |
| 2663 VOID | |
| 2664 FASTCALL | |
| 2665 ExAcquireFastMutexUnsafe( | |
| 2666 IN OUT PFAST_MUTEX FastMutex); | |
| 2667 | |
| 2668 NTKERNELAPI | |
| 2669 VOID | |
| 2670 FASTCALL | |
| 2671 ExReleaseFastMutexUnsafe( | |
| 2672 IN OUT PFAST_MUTEX FastMutex); | |
| 2673 | |
| 2674 NTKERNELAPI | |
| 2675 BOOLEAN | |
| 2676 NTAPI | |
| 2677 ExAcquireResourceExclusiveLite( | |
| 2678 IN PERESOURCE Resource, | |
| 2679 IN BOOLEAN Wait); | |
| 2680 | |
| 2681 NTKERNELAPI | |
| 2682 BOOLEAN | |
| 2683 NTAPI | |
| 2684 ExAcquireResourceSharedLite( | |
| 2685 IN PERESOURCE Resource, | |
| 2686 IN BOOLEAN Wait); | |
| 2687 | |
| 2688 NTKERNELAPI | |
| 2689 BOOLEAN | |
| 2690 NTAPI | |
| 2691 ExAcquireSharedStarveExclusive( | |
| 2692 IN PERESOURCE Resource, | |
| 2693 IN BOOLEAN Wait); | |
| 2694 | |
| 2695 NTKERNELAPI | |
| 2696 BOOLEAN | |
| 2697 NTAPI | |
| 2698 ExAcquireSharedWaitForExclusive( | |
| 2699 IN PERESOURCE Resource, | |
| 2700 IN BOOLEAN Wait); | |
| 2701 | |
| 2702 NTKERNELAPI | |
| 2703 PVOID | |
| 2704 NTAPI | |
| 2705 ExAllocatePool( | |
| 2706 IN POOL_TYPE PoolType, | |
| 2707 IN SIZE_T NumberOfBytes); | |
| 2708 | |
| 2709 #ifdef POOL_TAGGING | |
| 2710 #define ExAllocatePool(p,n) ExAllocatePoolWithTag(p,n,' kdD') | |
| 2711 #endif /* POOL_TAGGING */ | |
| 2712 | |
| 2713 NTKERNELAPI | |
| 2714 PVOID | |
| 2715 NTAPI | |
| 2716 ExAllocatePoolWithQuota( | |
| 2717 IN POOL_TYPE PoolType, | |
| 2718 IN SIZE_T NumberOfBytes); | |
| 2719 | |
| 2720 #ifdef POOL_TAGGING | |
| 2721 #define ExAllocatePoolWithQuota(p,n) ExAllocatePoolWithQuotaTag(p,n,' kdD') | |
| 2722 #endif /* POOL_TAGGING */ | |
| 2723 | |
| 2724 NTKERNELAPI | |
| 2725 PVOID | |
| 2726 NTAPI | |
| 2727 ExAllocatePoolWithQuotaTag( | |
| 2728 IN POOL_TYPE PoolType, | |
| 2729 IN SIZE_T NumberOfBytes, | |
| 2730 IN ULONG Tag); | |
| 2731 | |
| 2732 #ifndef POOL_TAGGING | |
| 2733 #define ExAllocatePoolWithQuotaTag(a,b,c) ExAllocatePoolWithQuota(a,b) | |
| 2734 #endif /* POOL_TAGGING */ | |
| 2735 | |
| 2736 NTKERNELAPI | |
| 2737 PVOID | |
| 2738 NTAPI | |
| 2739 ExAllocatePoolWithTag( | |
| 2740 IN POOL_TYPE PoolType, | |
| 2741 IN SIZE_T NumberOfBytes, | |
| 2742 IN ULONG Tag); | |
| 2743 | |
| 2744 NTKERNELAPI | |
| 2745 PVOID | |
| 2746 NTAPI | |
| 2747 ExAllocatePoolWithTagPriority( | |
| 2748 IN POOL_TYPE PoolType, | |
| 2749 IN SIZE_T NumberOfBytes, | |
| 2750 IN ULONG Tag, | |
| 2751 IN EX_POOL_PRIORITY Priority); | |
| 2752 | |
| 2753 NTKERNELAPI | |
| 2754 VOID | |
| 2755 NTAPI | |
| 2756 ExConvertExclusiveToSharedLite( | |
| 2757 IN PERESOURCE Resource); | |
| 2758 | |
| 2759 NTKERNELAPI | |
| 2760 NTSTATUS | |
| 2761 NTAPI | |
| 2762 ExCreateCallback( | |
| 2763 OUT PCALLBACK_OBJECT *CallbackObject, | |
| 2764 IN POBJECT_ATTRIBUTES ObjectAttributes, | |
| 2765 IN BOOLEAN Create, | |
| 2766 IN BOOLEAN AllowMultipleCallbacks); | |
| 2767 | |
| 2768 NTKERNELAPI | |
| 2769 VOID | |
| 2770 NTAPI | |
| 2771 ExDeleteNPagedLookasideList( | |
| 2772 IN PNPAGED_LOOKASIDE_LIST Lookaside); | |
| 2773 | |
| 2774 NTKERNELAPI | |
| 2775 VOID | |
| 2776 NTAPI | |
| 2777 ExDeletePagedLookasideList( | |
| 2778 IN PPAGED_LOOKASIDE_LIST Lookaside); | |
| 2779 | |
| 2780 NTKERNELAPI | |
| 2781 NTSTATUS | |
| 2782 NTAPI | |
| 2783 ExDeleteResourceLite( | |
| 2784 IN PERESOURCE Resource); | |
| 2785 | |
| 2786 NTKERNELAPI | |
| 2787 VOID | |
| 2788 NTAPI | |
| 2789 ExFreePool( | |
| 2790 IN PVOID P); | |
| 2791 | |
| 2792 #ifdef POOL_TAGGING | |
| 2793 #define ExFreePool(P) ExFreePoolWithTag(P, 0) | |
| 2794 #endif | |
| 2795 | |
| 2796 NTKERNELAPI | |
| 2797 VOID | |
| 2798 NTAPI | |
| 2799 ExFreePoolWithTag( | |
| 2800 IN PVOID P, | |
| 2801 IN ULONG Tag); | |
| 2802 | |
| 2803 NTKERNELAPI | |
| 2804 ULONG | |
| 2805 NTAPI | |
| 2806 ExGetExclusiveWaiterCount( | |
| 2807 IN PERESOURCE Resource); | |
| 2808 | |
| 2809 NTKERNELAPI | |
| 2810 KPROCESSOR_MODE | |
| 2811 NTAPI | |
| 2812 ExGetPreviousMode( | |
| 2813 VOID); | |
| 2814 | |
| 2815 NTKERNELAPI | |
| 2816 ULONG | |
| 2817 NTAPI | |
| 2818 ExGetSharedWaiterCount( | |
| 2819 IN PERESOURCE Resource); | |
| 2820 | |
| 2821 NTKERNELAPI | |
| 2822 VOID | |
| 2823 NTAPI | |
| 2824 ExInitializeNPagedLookasideList( | |
| 2825 IN PNPAGED_LOOKASIDE_LIST Lookaside, | |
| 2826 IN PALLOCATE_FUNCTION Allocate OPTIONAL, | |
| 2827 IN PFREE_FUNCTION Free OPTIONAL, | |
| 2828 IN ULONG Flags, | |
| 2829 IN SIZE_T Size, | |
| 2830 IN ULONG Tag, | |
| 2831 IN USHORT Depth); | |
| 2832 | |
| 2833 NTKERNELAPI | |
| 2834 VOID | |
| 2835 NTAPI | |
| 2836 ExInitializePagedLookasideList( | |
| 2837 IN PPAGED_LOOKASIDE_LIST Lookaside, | |
| 2838 IN PALLOCATE_FUNCTION Allocate OPTIONAL, | |
| 2839 IN PFREE_FUNCTION Free OPTIONAL, | |
| 2840 IN ULONG Flags, | |
| 2841 IN SIZE_T Size, | |
| 2842 IN ULONG Tag, | |
| 2843 IN USHORT Depth); | |
| 2844 | |
| 2845 NTKERNELAPI | |
| 2846 NTSTATUS | |
| 2847 NTAPI | |
| 2848 ExInitializeResourceLite( | |
| 2849 IN PERESOURCE Resource); | |
| 2850 | |
| 2851 NTKERNELAPI | |
| 2852 LARGE_INTEGER | |
| 2853 NTAPI | |
| 2854 ExInterlockedAddLargeInteger( | |
| 2855 IN PLARGE_INTEGER Addend, | |
| 2856 IN LARGE_INTEGER Increment, | |
| 2857 IN PKSPIN_LOCK Lock); | |
| 2858 | |
| 2859 #if defined(_WIN64) | |
| 2860 #define ExInterlockedAddLargeStatistic(Addend, Increment) \ | |
| 2861 (VOID)InterlockedAdd64(&(Addend)->QuadPart, Increment) | |
| 2862 #else | |
| 2863 #define ExInterlockedAddLargeStatistic(Addend, Increment) \ | |
| 2864 _InterlockedAddLargeStatistic((PLONGLONG)&(Addend)->QuadPart, Increment) | |
| 2865 #endif | |
| 2866 | |
| 2867 NTKERNELAPI | |
| 2868 ULONG | |
| 2869 FASTCALL | |
| 2870 ExInterlockedAddUlong( | |
| 2871 IN PULONG Addend, | |
| 2872 IN ULONG Increment, | |
| 2873 PKSPIN_LOCK Lock); | |
| 2874 | |
| 2875 #if defined(_AMD64_) || defined(_IA64_) | |
| 2876 #define ExInterlockedCompareExchange64(Destination, Exchange, Comperand, Lock) \ | |
| 2877 InterlockedCompareExchange64(Destination, *(Exchange), *(Comperand)) | |
| 2878 #elif defined(_X86_) | |
| 2879 NTKERNELAPI | |
| 2880 LONGLONG | |
| 2881 FASTCALL | |
| 2882 ExfInterlockedCompareExchange64( | |
| 2883 IN OUT LONGLONG volatile *Destination, | |
| 2884 IN PLONGLONG Exchange, | |
| 2885 IN PLONGLONG Comperand); | |
| 2886 #define ExInterlockedCompareExchange64(Destination, Exchange, Comperand, Lock) \ | |
| 2887 ExfInterlockedCompareExchange64(Destination, Exchange, Comperand) | |
| 2888 #else | |
| 2889 NTKERNELAPI | |
| 2890 LONGLONG | |
| 2891 FASTCALL | |
| 2892 ExInterlockedCompareExchange64( | |
| 2893 IN OUT LONGLONG volatile *Destination, | |
| 2894 IN PLONGLONG Exchange, | |
| 2895 IN PLONGLONG Comparand, | |
| 2896 IN PKSPIN_LOCK Lock); | |
| 2897 #endif | |
| 2898 | |
| 2899 NTKERNELAPI | |
| 2900 PLIST_ENTRY | |
| 2901 FASTCALL | |
| 2902 ExInterlockedInsertHeadList( | |
| 2903 IN PLIST_ENTRY ListHead, | |
| 2904 IN PLIST_ENTRY ListEntry, | |
| 2905 IN PKSPIN_LOCK Lock); | |
| 2906 | |
| 2907 NTKERNELAPI | |
| 2908 PLIST_ENTRY | |
| 2909 FASTCALL | |
| 2910 ExInterlockedInsertTailList( | |
| 2911 IN PLIST_ENTRY ListHead, | |
| 2912 IN PLIST_ENTRY ListEntry, | |
| 2913 IN PKSPIN_LOCK Lock); | |
| 2914 | |
| 2915 NTKERNELAPI | |
| 2916 PSINGLE_LIST_ENTRY | |
| 2917 FASTCALL | |
| 2918 ExInterlockedPopEntryList( | |
| 2919 IN PSINGLE_LIST_ENTRY ListHead, | |
| 2920 IN PKSPIN_LOCK Lock); | |
| 2921 | |
| 2922 NTKERNELAPI | |
| 2923 PSINGLE_LIST_ENTRY | |
| 2924 FASTCALL | |
| 2925 ExInterlockedPushEntryList( | |
| 2926 IN PSINGLE_LIST_ENTRY ListHead, | |
| 2927 IN PSINGLE_LIST_ENTRY ListEntry, | |
| 2928 IN PKSPIN_LOCK Lock); | |
| 2929 | |
| 2930 NTKERNELAPI | |
| 2931 PLIST_ENTRY | |
| 2932 FASTCALL | |
| 2933 ExInterlockedRemoveHeadList( | |
| 2934 IN PLIST_ENTRY ListHead, | |
| 2935 IN PKSPIN_LOCK Lock); | |
| 2936 | |
| 2937 NTKERNELAPI | |
| 2938 BOOLEAN | |
| 2939 NTAPI | |
| 2940 ExIsProcessorFeaturePresent( | |
| 2941 IN ULONG ProcessorFeature); | |
| 2942 | |
| 2943 NTKERNELAPI | |
| 2944 BOOLEAN | |
| 2945 NTAPI | |
| 2946 ExIsResourceAcquiredExclusiveLite( | |
| 2947 IN PERESOURCE Resource); | |
| 2948 | |
| 2949 NTKERNELAPI | |
| 2950 ULONG | |
| 2951 NTAPI | |
| 2952 ExIsResourceAcquiredSharedLite( | |
| 2953 IN PERESOURCE Resource); | |
| 2954 | |
| 2955 #define ExIsResourceAcquiredLite ExIsResourceAcquiredSharedLite | |
| 2956 | |
| 2957 NTKERNELAPI | |
| 2958 VOID | |
| 2959 NTAPI | |
| 2960 ExLocalTimeToSystemTime( | |
| 2961 IN PLARGE_INTEGER LocalTime, | |
| 2962 OUT PLARGE_INTEGER SystemTime); | |
| 2963 | |
| 2964 NTKERNELAPI | |
| 2965 VOID | |
| 2966 NTAPI | |
| 2967 ExNotifyCallback( | |
| 2968 IN PCALLBACK_OBJECT CallbackObject, | |
| 2969 IN PVOID Argument1, | |
| 2970 IN PVOID Argument2); | |
| 2971 | |
| 2972 NTKERNELAPI | |
| 2973 VOID | |
| 2974 NTAPI | |
| 2975 ExQueueWorkItem( | |
| 2976 IN PWORK_QUEUE_ITEM WorkItem, | |
| 2977 IN WORK_QUEUE_TYPE QueueType); | |
| 2978 | |
| 2979 NTKERNELAPI | |
| 2980 DECLSPEC_NORETURN | |
| 2981 VOID | |
| 2982 NTAPI | |
| 2983 ExRaiseStatus( | |
| 2984 IN NTSTATUS Status); | |
| 2985 | |
| 2986 NTKERNELAPI | |
| 2987 PVOID | |
| 2988 NTAPI | |
| 2989 ExRegisterCallback( | |
| 2990 IN PCALLBACK_OBJECT CallbackObject, | |
| 2991 IN PCALLBACK_FUNCTION CallbackFunction, | |
| 2992 IN PVOID CallbackContext); | |
| 2993 | |
| 2994 NTKERNELAPI | |
| 2995 NTSTATUS | |
| 2996 NTAPI | |
| 2997 ExReinitializeResourceLite( | |
| 2998 IN PERESOURCE Resource); | |
| 2999 | |
| 3000 NTKERNELAPI | |
| 3001 VOID | |
| 3002 NTAPI | |
| 3003 ExReleaseResourceForThreadLite( | |
| 3004 IN PERESOURCE Resource, | |
| 3005 IN ERESOURCE_THREAD ResourceThreadId); | |
| 3006 | |
| 3007 NTKERNELAPI | |
| 3008 VOID | |
| 3009 FASTCALL | |
| 3010 ExReleaseResourceLite( | |
| 3011 IN PERESOURCE Resource); | |
| 3012 | |
| 3013 NTKERNELAPI | |
| 3014 VOID | |
| 3015 NTAPI | |
| 3016 ExSetResourceOwnerPointer( | |
| 3017 IN PERESOURCE Resource, | |
| 3018 IN PVOID OwnerPointer); | |
| 3019 | |
| 3020 NTKERNELAPI | |
| 3021 ULONG | |
| 3022 NTAPI | |
| 3023 ExSetTimerResolution( | |
| 3024 IN ULONG DesiredTime, | |
| 3025 IN BOOLEAN SetResolution); | |
| 3026 | |
| 3027 NTKERNELAPI | |
| 3028 VOID | |
| 3029 NTAPI | |
| 3030 ExSystemTimeToLocalTime( | |
| 3031 IN PLARGE_INTEGER SystemTime, | |
| 3032 OUT PLARGE_INTEGER LocalTime); | |
| 3033 | |
| 3034 NTKERNELAPI | |
| 3035 VOID | |
| 3036 NTAPI | |
| 3037 ExUnregisterCallback( | |
| 3038 IN PVOID CbRegistration); | |
| 3039 | |
| 3040 | |
| 3041 #endif // (NTDDI_VERSION >= NTDDI_WIN2K) | |
| 3042 | |
| 3043 #if (NTDDI_VERSION >= NTDDI_WINXP) | |
| 3044 NTKERNELAPI | |
| 3045 BOOLEAN | |
| 3046 FASTCALL | |
| 3047 ExAcquireRundownProtection( | |
| 3048 IN OUT PEX_RUNDOWN_REF RunRef); | |
| 3049 | |
| 3050 NTKERNELAPI | |
| 3051 VOID | |
| 3052 FASTCALL | |
| 3053 ExInitializeRundownProtection( | |
| 3054 OUT PEX_RUNDOWN_REF RunRef); | |
| 3055 | |
| 3056 NTKERNELAPI | |
| 3057 VOID | |
| 3058 FASTCALL | |
| 3059 ExReInitializeRundownProtection( | |
| 3060 OUT PEX_RUNDOWN_REF RunRef); | |
| 3061 | |
| 3062 NTKERNELAPI | |
| 3063 VOID | |
| 3064 FASTCALL | |
| 3065 ExReleaseRundownProtection( | |
| 3066 IN OUT PEX_RUNDOWN_REF RunRef); | |
| 3067 | |
| 3068 NTKERNELAPI | |
| 3069 VOID | |
| 3070 FASTCALL | |
| 3071 ExRundownCompleted( | |
| 3072 OUT PEX_RUNDOWN_REF RunRef); | |
| 3073 | |
| 3074 NTKERNELAPI | |
| 3075 BOOLEAN | |
| 3076 NTAPI | |
| 3077 ExVerifySuite( | |
| 3078 IN SUITE_TYPE SuiteType); | |
| 3079 | |
| 3080 NTKERNELAPI | |
| 3081 VOID | |
| 3082 FASTCALL | |
| 3083 ExWaitForRundownProtectionRelease( | |
| 3084 IN OUT PEX_RUNDOWN_REF RunRef); | |
| 3085 | |
| 3086 #endif // (NTDDI_VERSION >= NTDDI_WINXP) | |
| 3087 | |
| 3088 #if (NTDDI_VERSION >= NTDDI_WINXPSP2) | |
| 3089 NTKERNELAPI | |
| 3090 BOOLEAN | |
| 3091 FASTCALL | |
| 3092 ExAcquireRundownProtectionEx( | |
| 3093 IN OUT PEX_RUNDOWN_REF RunRef, | |
| 3094 IN ULONG Count); | |
| 3095 | |
| 3096 NTKERNELAPI | |
| 3097 VOID | |
| 3098 FASTCALL | |
| 3099 ExReleaseRundownProtectionEx( | |
| 3100 IN OUT PEX_RUNDOWN_REF RunRef, | |
| 3101 IN ULONG Count); | |
| 3102 #endif // (NTDDI_VERSION >= NTDDI_WINXPSP2) | |
| 3103 | |
| 3104 #if (NTDDI_VERSION >= NTDDI_WS03) | |
| 3105 | |
| 3106 #endif // (NTDDI_VERSION >= NTDDI_WS03) | |
| 3107 | |
| 3108 #if (NTDDI_VERSION >= NTDDI_WS03SP1) | |
| 3109 NTKERNELAPI | |
| 3110 PEX_RUNDOWN_REF_CACHE_AWARE | |
| 3111 ExAllocateCacheAwareRundownProtection( | |
| 3112 IN POOL_TYPE PoolType, | |
| 3113 IN ULONG PoolTag); | |
| 3114 | |
| 3115 NTKERNELAPI | |
| 3116 SIZE_T | |
| 3117 ExSizeOfRundownProtectionCacheAware(VOID); | |
| 3118 | |
| 3119 #endif // (NTDDI_VERSION >= NTDDI_WS03SP1) | |
| 3120 | |
| 3121 #if (NTDDI_VERSION >= NTDDI_VISTA) | |
| 3122 NTKERNELAPI | |
| 3123 NTSTATUS | |
| 3124 ExInitializeLookasideListEx( | |
| 3125 OUT PLOOKASIDE_LIST_EX Lookaside, | |
| 3126 IN PALLOCATE_FUNCTION_EX Allocate OPTIONAL, | |
| 3127 IN PFREE_FUNCTION_EX Free OPTIONAL, | |
| 3128 IN POOL_TYPE PoolType, | |
| 3129 IN ULONG Flags, | |
| 3130 IN SIZE_T Size, | |
| 3131 IN ULONG Tag, | |
| 3132 IN USHORT Depth); | |
| 3133 #endif | |
| 3134 | |
| 3135 | |
| 3136 #if !defined(MIDL_PASS) | |
| 3137 | |
| 3138 static __inline PVOID | |
| 3139 ExAllocateFromNPagedLookasideList( | |
| 3140 IN PNPAGED_LOOKASIDE_LIST Lookaside) | |
| 3141 { | |
| 3142 PVOID Entry; | |
| 3143 | |
| 3144 Lookaside->L.TotalAllocates++; | |
| 3145 Entry = InterlockedPopEntrySList(&Lookaside->L.ListHead); | |
| 3146 if (Entry == NULL) { | |
| 3147 Lookaside->L.AllocateMisses++; | |
| 3148 Entry = (Lookaside->L.Allocate)(Lookaside->L.Type, | |
| 3149 Lookaside->L.Size, | |
| 3150 Lookaside->L.Tag); | |
| 3151 } | |
| 3152 return Entry; | |
| 3153 } | |
| 3154 | |
| 3155 static __inline PVOID | |
| 3156 ExAllocateFromPagedLookasideList( | |
| 3157 IN PPAGED_LOOKASIDE_LIST Lookaside) | |
| 3158 { | |
| 3159 PVOID Entry; | |
| 3160 | |
| 3161 Lookaside->L.TotalAllocates++; | |
| 3162 Entry = InterlockedPopEntrySList(&Lookaside->L.ListHead); | |
| 3163 if (Entry == NULL) { | |
| 3164 Lookaside->L.AllocateMisses++; | |
| 3165 Entry = (Lookaside->L.Allocate)(Lookaside->L.Type, | |
| 3166 Lookaside->L.Size, | |
| 3167 Lookaside->L.Tag); | |
| 3168 } | |
| 3169 return Entry; | |
| 3170 } | |
| 3171 | |
| 3172 static __inline VOID | |
| 3173 ExFreeToNPagedLookasideList( | |
| 3174 IN PNPAGED_LOOKASIDE_LIST Lookaside, | |
| 3175 IN PVOID Entry) | |
| 3176 { | |
| 3177 Lookaside->L.TotalFrees++; | |
| 3178 if (ExQueryDepthSList(&Lookaside->L.ListHead) >= Lookaside->L.Depth) { | |
| 3179 Lookaside->L.FreeMisses++; | |
| 3180 (Lookaside->L.Free)(Entry); | |
| 3181 } else { | |
| 3182 InterlockedPushEntrySList(&Lookaside->L.ListHead, (PSLIST_ENTRY)Entry); | |
| 3183 } | |
| 3184 } | |
| 3185 | |
| 3186 static __inline VOID | |
| 3187 ExFreeToPagedLookasideList( | |
| 3188 IN PPAGED_LOOKASIDE_LIST Lookaside, | |
| 3189 IN PVOID Entry) | |
| 3190 { | |
| 3191 Lookaside->L.TotalFrees++; | |
| 3192 if (ExQueryDepthSList(&Lookaside->L.ListHead) >= Lookaside->L.Depth) { | |
| 3193 Lookaside->L.FreeMisses++; | |
| 3194 (Lookaside->L.Free)(Entry); | |
| 3195 } else { | |
| 3196 InterlockedPushEntrySList(&Lookaside->L.ListHead, (PSLIST_ENTRY)Entry); | |
| 3197 } | |
| 3198 } | |
| 3199 | |
| 3200 | |
| 3201 #endif // !defined(MIDL_PASS) | |
| 3202 | |
| 3203 | |
| 3204 #ifdef __cplusplus | |
| 3205 } | |
| 3206 #endif | |
| 3207 | |
| 3208 #endif // _WDMDDK_ |
