Main Page | Class Hierarchy | Class List | File List | Class Members | File Members

ke.h

Go to the documentation of this file.
00001 /*++ BUILD Version: 0028 // Increment this if a change has global effects 00002 00003 Copyright (c) 1989 Microsoft Corporation 00004 00005 Module Name: 00006 00007 ke.h 00008 00009 Abstract: 00010 00011 This module contains the public (external) header file for the kernel. 00012 00013 Author: 00014 00015 David N. Cutler (davec) 27-Feb-1989 00016 00017 Revision History: 00018 00019 --*/ 00020 00021 #ifndef _KE_ 00022 #define _KE_ 00023 00024 // 00025 // Define the default quantum decrement values. 00026 // 00027 00028 #define CLOCK_QUANTUM_DECREMENT 3 00029 #define WAIT_QUANTUM_DECREMENT 1 00030 00031 // 00032 // Define the default ready skip and thread quantum values. 00033 // 00034 00035 #define READY_SKIP_QUANTUM 2 00036 #define THREAD_QUANTUM (READY_SKIP_QUANTUM * CLOCK_QUANTUM_DECREMENT) 00037 00038 // 00039 // Define the round trip decrement count. 00040 // 00041 00042 #define ROUND_TRIP_DECREMENT_COUNT 16 00043 00044 // 00045 // Performance data collection enable definitions. 00046 // 00047 // A definition turns on the respective data collection. 00048 // 00049 00050 //#define _COLLECT_FLUSH_SINGLE_CALLDATA_ 1 00051 //#define _COLLECT_SET_EVENT_CALLDATA_ 1 00052 //#define _COLLECT_WAIT_SINGLE_CALLDATA_ 1 00053 00054 // 00055 // Define thread switch performance data structure. 00056 // 00057 00058 typedef struct _KTHREAD_SWITCH_COUNTERS { 00059 ULONG FindAny; 00060 ULONG FindIdeal; 00061 ULONG FindLast; 00062 ULONG IdleAny; 00063 ULONG IdleCurrent; 00064 ULONG IdleIdeal; 00065 ULONG IdleLast; 00066 ULONG PreemptAny; 00067 ULONG PreemptCurrent; 00068 ULONG PreemptLast; 00069 ULONG SwitchToIdle; 00070 } KTHREAD_SWITCH_COUNTERS, *PKTHREAD_SWITCH_COUNTERS; 00071 00072 // 00073 // Public (external) constant definitions. 00074 // 00075 00076 #define BASE_PRIORITY_THRESHOLD NORMAL_BASE_PRIORITY // fast path base threshold 00077 00078 // begin_ntddk begin_wdm 00079 #define THREAD_WAIT_OBJECTS 3 // Builtin usable wait blocks 00080 // end_ntddk end_wdm 00081 00082 #define EVENT_WAIT_BLOCK 2 // Builtin event pair wait block 00083 #define SEMAPHORE_WAIT_BLOCK 2 // Builtin semaphore wait block 00084 #define TIMER_WAIT_BLOCK 3 // Builtin timer wait block 00085 00086 #if (EVENT_WAIT_BLOCK != SEMAPHORE_WAIT_BLOCK) 00087 #error "wait event and wait semaphore must use same wait block" 00088 #endif 00089 00090 // 00091 // Define timer table size. 00092 // 00093 00094 #define TIMER_TABLE_SIZE 128 00095 00096 // 00097 // Get APC environment of current thread. 00098 // 00099 00100 #define KeGetCurrentApcEnvironment() \ 00101 KeGetCurrentThread()->ApcStateIndex 00102 00103 00104 // 00105 // Enumerated kernel types 00106 // 00107 // Kernel object types. 00108 // 00109 // N.B. There are really two types of event objects; NotificationEvent and 00110 // SynchronizationEvent. The type value for a notification event is 0, 00111 // and that for a synchronization event 1. 00112 // 00113 // N.B. There are two types of new timer objects; NotificationTimer and 00114 // SynchronizationTimer. The type value for a notification timer is 00115 // 8, and that for a synchronization timer is 9. These values are 00116 // very carefully chosen so that the dispatcher object type AND'ed 00117 // with 0x7 yields 0 or 1 for event objects and the timer objects. 00118 // 00119 00120 #define DISPATCHER_OBJECT_TYPE_MASK 0x7 00121 00122 typedef enum _KOBJECTS { 00123 EventNotificationObject = 0, 00124 EventSynchronizationObject = 1, 00125 MutantObject = 2, 00126 ProcessObject = 3, 00127 QueueObject = 4, 00128 SemaphoreObject = 5, 00129 ThreadObject = 6, 00130 Spare1Object = 7, 00131 TimerNotificationObject = 8, 00132 TimerSynchronizationObject = 9, 00133 Spare2Object = 10, 00134 Spare3Object = 11, 00135 Spare4Object = 12, 00136 Spare5Object = 13, 00137 Spare6Object = 14, 00138 Spare7Object = 15, 00139 Spare8Object = 16, 00140 Spare9Object = 17, 00141 ApcObject, 00142 DpcObject, 00143 DeviceQueueObject, 00144 EventPairObject, 00145 InterruptObject, 00146 ProfileObject 00147 } KOBJECTS; 00148 00149 // 00150 // APC environments. 00151 // 00152 00153 typedef enum _KAPC_ENVIRONMENT { 00154 OriginalApcEnvironment, 00155 AttachedApcEnvironment, 00156 CurrentApcEnvironment 00157 } KAPC_ENVIRONMENT; 00158 00159 // begin_ntddk begin_wdm begin_nthal begin_ntminiport begin_ntifs begin_ntndis 00160 00161 // 00162 // Interrupt modes. 00163 // 00164 00165 typedef enum _KINTERRUPT_MODE { 00166 LevelSensitive, 00167 Latched 00168 } KINTERRUPT_MODE; 00169 00170 // end_ntddk end_wdm end_nthal end_ntminiport end_ntifs end_ntndis 00171 00172 // 00173 // Process states. 00174 // 00175 00176 typedef enum _KPROCESS_STATE { 00177 ProcessInMemory, 00178 ProcessOutOfMemory, 00179 ProcessInTransition, 00180 ProcessInSwap, 00181 ProcessOutSwap 00182 } KPROCESS_STATE; 00183 00184 // 00185 // Thread scheduling states. 00186 // 00187 00188 typedef enum _KTHREAD_STATE { 00189 Initialized, 00190 Ready, 00191 Running, 00192 Standby, 00193 Terminated, 00194 Waiting, 00195 Transition 00196 } KTHREAD_STATE; 00197 00198 // begin_ntddk begin_wdm begin_nthal begin_ntifs 00199 // 00200 // Wait reasons 00201 // 00202 00203 typedef enum _KWAIT_REASON { 00204 Executive, 00205 FreePage, 00206 PageIn, 00207 PoolAllocation, 00208 DelayExecution, 00209 Suspended, 00210 UserRequest, 00211 WrExecutive, 00212 WrFreePage, 00213 WrPageIn, 00214 WrPoolAllocation, 00215 WrDelayExecution, 00216 WrSuspended, 00217 WrUserRequest, 00218 WrEventPair, 00219 WrQueue, 00220 WrLpcReceive, 00221 WrLpcReply, 00222 WrVirtualMemory, 00223 WrPageOut, 00224 WrRendezvous, 00225 Spare2, 00226 Spare3, 00227 Spare4, 00228 Spare5, 00229 Spare6, 00230 WrKernel, 00231 MaximumWaitReason 00232 } KWAIT_REASON; 00233 00234 // end_ntddk end_wdm end_nthal 00235 00236 // 00237 // Miscellaneous type definitions 00238 // 00239 // APC state 00240 // 00241 00242 typedef struct _KAPC_STATE { 00243 LIST_ENTRY ApcListHead[MaximumMode]; 00244 struct _KPROCESS *Process; 00245 BOOLEAN KernelApcInProgress; 00246 BOOLEAN KernelApcPending; 00247 BOOLEAN UserApcPending; 00248 } KAPC_STATE, *PKAPC_STATE, *RESTRICTED_POINTER PRKAPC_STATE; 00249 00250 // begin_ntddk begin_wdm begin_nthal begin_ntndis 00251 // 00252 // Common dispatcher object header 00253 // 00254 // N.B. The size field contains the number of dwords in the structure. 00255 // 00256 00257 typedef struct _DISPATCHER_HEADER { 00258 UCHAR Type; 00259 UCHAR Absolute; 00260 UCHAR Size; 00261 UCHAR Inserted; 00262 LONG SignalState; 00263 LIST_ENTRY WaitListHead; 00264 } DISPATCHER_HEADER; 00265 00266 // end_ntddk end_wdm end_nthal end_ntifs end_ntndis 00267 00268 // 00269 // Page frame 00270 // 00271 00272 typedef ULONG KPAGE_FRAME; 00273 00274 // 00275 // Wait block 00276 // 00277 // begin_ntddk begin_wdm begin_nthal begin_ntifs 00278 00279 typedef struct _KWAIT_BLOCK { 00280 LIST_ENTRY WaitListEntry; 00281 struct _KTHREAD *RESTRICTED_POINTER Thread; 00282 PVOID Object; 00283 struct _KWAIT_BLOCK *RESTRICTED_POINTER NextWaitBlock; 00284 USHORT WaitKey; 00285 USHORT WaitType; 00286 } KWAIT_BLOCK, *PKWAIT_BLOCK, *RESTRICTED_POINTER PRKWAIT_BLOCK; 00287 00288 // end_ntddk end_wdm end_nthal end_ntifs 00289 00290 // 00291 // System service table descriptor. 00292 // 00293 // N.B. A system service number has a 12-bit service table offset and a 00294 // 3-bit service table number. 00295 // 00296 // N.B. Descriptor table entries must be a power of 2 in size. Currently 00297 // this is 16 bytes on a 32-bit system and 32 bytes on a 64-bit 00298 // system. 00299 // 00300 00301 #define NUMBER_SERVICE_TABLES 4 00302 #define SERVICE_NUMBER_MASK ((1 << 12) - 1) 00303 00304 #if defined(_WIN64) 00305 00306 #define SERVICE_TABLE_SHIFT (12 - 5) 00307 #define SERVICE_TABLE_MASK (((1 << 2) - 1) << 5) 00308 #define SERVICE_TABLE_TEST (WIN32K_SERVICE_INDEX << 5) 00309 00310 #else 00311 00312 #define SERVICE_TABLE_SHIFT (12 - 4) 00313 #define SERVICE_TABLE_MASK (((1 << 2) - 1) << 4) 00314 #define SERVICE_TABLE_TEST (WIN32K_SERVICE_INDEX << 4) 00315 00316 #endif 00317 00318 typedef struct _KSERVICE_TABLE_DESCRIPTOR { 00319 PULONG_PTR Base; 00320 PULONG Count; 00321 ULONG Limit; 00322 #if defined(_IA64_) 00323 LONG TableBaseGpOffset; 00324 #endif 00325 PUCHAR Number; 00326 } KSERVICE_TABLE_DESCRIPTOR, *PKSERVICE_TABLE_DESCRIPTOR; 00327 00328 // 00329 // Procedure type definitions 00330 // 00331 // Debug routine 00332 // 00333 00334 typedef 00335 BOOLEAN 00336 (*PKDEBUG_ROUTINE) ( 00337 IN PKTRAP_FRAME TrapFrame, 00338 IN PKEXCEPTION_FRAME ExceptionFrame, 00339 IN PEXCEPTION_RECORD ExceptionRecord, 00340 IN PCONTEXT ContextRecord, 00341 IN KPROCESSOR_MODE PreviousMode, 00342 IN BOOLEAN SecondChance 00343 ); 00344 00345 typedef 00346 BOOLEAN 00347 (*PKDEBUG_SWITCH_ROUTINE) ( 00348 IN PEXCEPTION_RECORD ExceptionRecord, 00349 IN PCONTEXT ContextRecord, 00350 IN BOOLEAN SecondChance 00351 ); 00352 00353 typedef enum { 00354 ContinueError = FALSE, 00355 ContinueSuccess = TRUE, 00356 ContinueProcessorReselected, 00357 ContinueNextProcessor 00358 } KCONTINUE_STATUS; 00359 00360 // begin_ntddk begin_wdm begin_nthal begin_ntifs 00361 // 00362 // Thread start function 00363 // 00364 00365 typedef 00366 VOID 00367 (*PKSTART_ROUTINE) ( 00368 IN PVOID StartContext 00369 ); 00370 00371 // end_ntddk end_wdm end_nthal end_ntifs 00372 00373 // 00374 // Thread system function 00375 // 00376 00377 typedef 00378 VOID 00379 (*PKSYSTEM_ROUTINE) ( 00380 IN PKSTART_ROUTINE StartRoutine OPTIONAL, 00381 IN PVOID StartContext OPTIONAL 00382 ); 00383 00384 // begin_ntddk begin_wdm begin_nthal begin_ntifs 00385 // 00386 // Kernel object structure definitions 00387 // 00388 00389 // 00390 // Device Queue object and entry 00391 // 00392 00393 typedef struct _KDEVICE_QUEUE { 00394 CSHORT Type; 00395 CSHORT Size; 00396 LIST_ENTRY DeviceListHead; 00397 KSPIN_LOCK Lock; 00398 BOOLEAN Busy; 00399 } KDEVICE_QUEUE, *PKDEVICE_QUEUE, *RESTRICTED_POINTER PRKDEVICE_QUEUE; 00400 00401 typedef struct _KDEVICE_QUEUE_ENTRY { 00402 LIST_ENTRY DeviceListEntry; 00403 ULONG SortKey; 00404 BOOLEAN Inserted; 00405 } KDEVICE_QUEUE_ENTRY, *PKDEVICE_QUEUE_ENTRY, *RESTRICTED_POINTER PRKDEVICE_QUEUE_ENTRY; 00406 00407 // begin_ntndis 00408 // 00409 // Event object 00410 // 00411 00412 typedef struct _KEVENT { 00413 DISPATCHER_HEADER Header; 00414 } KEVENT, *PKEVENT, *RESTRICTED_POINTER PRKEVENT; 00415 00416 // end_ntddk end_wdm end_nthal end_ntifs end_ntndis 00417 // 00418 // Event pair object 00419 // 00420 00421 typedef struct _KEVENT_PAIR { 00422 CSHORT Type; 00423 CSHORT Size; 00424 KEVENT EventLow; 00425 KEVENT EventHigh; 00426 } KEVENT_PAIR, *PKEVENT_PAIR, *RESTRICTED_POINTER PRKEVENT_PAIR; 00427 00428 // begin_nthal begin_ntddk begin_wdm begin_ntifs 00429 // 00430 // Define the interrupt service function type and the empty struct 00431 // type. 00432 // 00433 // end_ntddk end_wdm end_ntifs 00434 00435 struct _KINTERRUPT; 00436 00437 // begin_ntddk begin_wdm begin_ntifs 00438 typedef 00439 BOOLEAN 00440 (*PKSERVICE_ROUTINE) ( 00441 IN struct _KINTERRUPT *Interrupt, 00442 IN PVOID ServiceContext 00443 ); 00444 // end_ntddk end_wdm end_ntifs 00445 00446 // 00447 // Interrupt object 00448 // 00449 // N.B. The layout of this structure cannot change. It is exported to HALs 00450 // to short circuit interrupt dispatch. 00451 // 00452 00453 00454 typedef struct _KINTERRUPT { 00455 CSHORT Type; 00456 CSHORT Size; 00457 LIST_ENTRY InterruptListEntry; 00458 PKSERVICE_ROUTINE ServiceRoutine; 00459 PVOID ServiceContext; 00460 KSPIN_LOCK SpinLock; 00461 ULONG Spare1; 00462 PKSPIN_LOCK ActualLock; 00463 PKINTERRUPT_ROUTINE DispatchAddress; 00464 ULONG Vector; 00465 KIRQL Irql; 00466 KIRQL SynchronizeIrql; 00467 BOOLEAN FloatingSave; 00468 BOOLEAN Connected; 00469 CCHAR Number; 00470 BOOLEAN ShareVector; 00471 KINTERRUPT_MODE Mode; 00472 ULONG ServiceCount; 00473 ULONG Spare3; 00474 ULONG DispatchCode[DISPATCH_LENGTH]; 00475 } KINTERRUPT; 00476 00477 typedef struct _KINTERRUPT *PKINTERRUPT, *RESTRICTED_POINTER PRKINTERRUPT; // ntndis 00478 00479 // begin_ntifs begin_ntddk begin_wdm 00480 // 00481 // Mutant object 00482 // 00483 00484 typedef struct _KMUTANT { 00485 DISPATCHER_HEADER Header; 00486 LIST_ENTRY MutantListEntry; 00487 struct _KTHREAD *RESTRICTED_POINTER OwnerThread; 00488 BOOLEAN Abandoned; 00489 UCHAR ApcDisable; 00490 } KMUTANT, *PKMUTANT, *RESTRICTED_POINTER PRKMUTANT, KMUTEX, *PKMUTEX, *RESTRICTED_POINTER PRKMUTEX; 00491 00492 // end_ntddk end_wdm 00493 // 00494 // Queue object 00495 // 00496 00497 typedef struct _KQUEUE { 00498 DISPATCHER_HEADER Header; 00499 LIST_ENTRY EntryListHead; 00500 ULONG CurrentCount; 00501 ULONG MaximumCount; 00502 LIST_ENTRY ThreadListHead; 00503 } KQUEUE, *PKQUEUE, *RESTRICTED_POINTER PRKQUEUE; 00504 00505 // begin_ntddk begin_wdm 00506 // 00507 // 00508 // Semaphore object 00509 // 00510 00511 typedef struct _KSEMAPHORE { 00512 DISPATCHER_HEADER Header; 00513 LONG Limit; 00514 } KSEMAPHORE, *PKSEMAPHORE, *RESTRICTED_POINTER PRKSEMAPHORE; 00515 00516 // begin_ntndis 00517 // 00518 // Timer object 00519 // 00520 00521 typedef struct _KTIMER { 00522 DISPATCHER_HEADER Header; 00523 ULARGE_INTEGER DueTime; 00524 LIST_ENTRY TimerListEntry; 00525 struct _KDPC *Dpc; 00526 LONG Period; 00527 } KTIMER, *PKTIMER, *RESTRICTED_POINTER PRKTIMER; 00528 00529 // end_ntddk end_wdm end_nthal end_ntifs end_ntndis 00530 00531 // 00532 // Thread object 00533 // 00534 00535 struct _ECHANNEL; 00536 00537 typedef struct _KTHREAD { 00538 00539 // 00540 // The dispatcher header and mutant listhead are fairly infrequently 00541 // referenced, but pad the thread to a 32-byte boundary (assumption 00542 // that pool allocation is in units of 32-bytes). 00543 // 00544 00545 DISPATCHER_HEADER Header; 00546 LIST_ENTRY MutantListHead; 00547 00548 // 00549 // The following fields are referenced during trap, interrupts, or 00550 // context switches. 00551 // 00552 // N.B. The Teb address and TlsArray are loaded as a quadword quantity 00553 // on MIPS and therefore must be on a quadword boundary. 00554 // 00555 00556 PVOID InitialStack; 00557 PVOID StackLimit; 00558 #if defined(_IA64_) 00559 PVOID InitialBStore; 00560 PVOID BStoreLimit; 00561 #endif 00562 PVOID Teb; 00563 PVOID TlsArray; 00564 PVOID KernelStack; 00565 #if defined(_IA64_) 00566 PVOID KernelBStore; 00567 #endif 00568 BOOLEAN DebugActive; 00569 UCHAR State; 00570 BOOLEAN Alerted[MaximumMode]; 00571 UCHAR Iopl; 00572 UCHAR NpxState; 00573 CHAR Saturation; 00574 SCHAR Priority; 00575 KAPC_STATE ApcState; 00576 ULONG ContextSwitches; 00577 00578 // 00579 // The following fields are referenced during wait operations. 00580 // 00581 00582 LONG_PTR WaitStatus; 00583 KIRQL WaitIrql; 00584 KPROCESSOR_MODE WaitMode; 00585 BOOLEAN WaitNext; 00586 UCHAR WaitReason; 00587 PRKWAIT_BLOCK WaitBlockList; 00588 LIST_ENTRY WaitListEntry; 00589 ULONG WaitTime; 00590 SCHAR BasePriority; 00591 UCHAR DecrementCount; 00592 SCHAR PriorityDecrement; 00593 SCHAR Quantum; 00594 KWAIT_BLOCK WaitBlock[THREAD_WAIT_OBJECTS + 1]; 00595 PVOID LegoData; 00596 ULONG KernelApcDisable; 00597 KAFFINITY UserAffinity; 00598 BOOLEAN SystemAffinityActive; 00599 UCHAR PowerState; 00600 UCHAR NpxIrql; 00601 UCHAR Pad[1]; 00602 PVOID ServiceTable; 00603 // struct _ECHANNEL *Channel; 00604 // PVOID Section; 00605 // PCHANNEL_MESSAGE SystemView; 00606 // PCHANNEL_MESSAGE ThreadView; 00607 00608 // 00609 // The following fields are referenced during queue operations. 00610 // 00611 00612 PRKQUEUE Queue; 00613 KSPIN_LOCK ApcQueueLock; 00614 KTIMER Timer; 00615 LIST_ENTRY QueueListEntry; 00616 00617 // 00618 // The following fields are referenced during read and find ready 00619 // thread. 00620 // 00621 00622 KAFFINITY Affinity; 00623 BOOLEAN Preempted; 00624 BOOLEAN ProcessReadyQueue; 00625 BOOLEAN KernelStackResident; 00626 UCHAR NextProcessor; 00627 00628 // 00629 // The following fields are referenced during system calls. 00630 // 00631 00632 PVOID CallbackStack; 00633 #if defined(_IA64_) 00634 PVOID CallbackBStore; 00635 #endif 00636 PVOID Win32Thread; 00637 PKTRAP_FRAME TrapFrame; 00638 PKAPC_STATE ApcStatePointer[2]; 00639 CCHAR PreviousMode; 00640 UCHAR EnableStackSwap; 00641 UCHAR LargeStack; 00642 UCHAR ResourceIndex; 00643 00644 // 00645 // The following entries are referenced during clock interrupts. 00646 // 00647 00648 ULONG KernelTime; 00649 ULONG UserTime; 00650 00651 // 00652 // The following fields are referenced during APC queuing and process 00653 // attach/detach. 00654 // 00655 00656 KAPC_STATE SavedApcState; 00657 BOOLEAN Alertable; 00658 UCHAR ApcStateIndex; 00659 BOOLEAN ApcQueueable; 00660 BOOLEAN AutoAlignment; 00661 00662 // 00663 // The following fields are referenced when the thread is initialized 00664 // and very infrequently thereafter. 00665 // 00666 00667 PVOID StackBase; 00668 KAPC SuspendApc; 00669 KSEMAPHORE SuspendSemaphore; 00670 LIST_ENTRY ThreadListEntry; 00671 00672 // 00673 // N.B. The below four UCHARs share the same DWORD and are modified 00674 // by other threads. Therefore, they must ALWAYS be modified 00675 // under the dispatcher lock to prevent granularity problems 00676 // on Alpha machines. 00677 // 00678 00679 CCHAR FreezeCount; 00680 CCHAR SuspendCount; 00681 UCHAR IdealProcessor; 00682 UCHAR DisableBoost; 00683 00684 } KTHREAD, *PKTHREAD, *RESTRICTED_POINTER PRKTHREAD; 00685 00686 // 00687 // Process object structure definition 00688 // 00689 00690 typedef struct _KPROCESS { 00691 00692 // 00693 // The dispatch header and profile listhead are fairly infrequently 00694 // referenced, but pad the process to a 32-byte boundary (assumption 00695 // that pool block allocation is in units of 32-bytes). 00696 // 00697 00698 DISPATCHER_HEADER Header; 00699 LIST_ENTRY ProfileListHead; 00700 00701 // 00702 // The following fields are referenced during context switches. 00703 // 00704 00705 ULONG_PTR DirectoryTableBase[2]; 00706 00707 #if defined(_X86_) 00708 00709 KGDTENTRY LdtDescriptor; 00710 KIDTENTRY Int21Descriptor; 00711 USHORT IopmOffset; 00712 UCHAR Iopl; 00713 BOOLEAN VdmFlag; 00714 00715 #endif 00716 00717 #if defined(_IA64_) 00718 00719 KGDTENTRY LdtDescriptor; 00720 ULONGLONG UnscrambledLdtDescriptor; 00721 KIDTENTRY Int21Descriptor; 00722 BOOLEAN VdmFlag; 00723 00724 REGION_MAP_INFO ProcessRegion; 00725 REGION_MAP_INFO SessionRegion; 00726 PREGION_MAP_INFO SessionMapInfo; 00727 ULONG_PTR SessionParentBase; 00728 00729 #endif // _IA64_ 00730 00731 #if defined(_ALPHA_) 00732 00733 union { 00734 struct { 00735 KAFFINITY ActiveProcessors; 00736 KAFFINITY RunOnProcessors; 00737 }; 00738 00739 ULONGLONG Alignment; 00740 }; 00741 00742 ULONGLONG ProcessSequence; 00743 ULONG ProcessAsn; 00744 00745 #else 00746 00747 KAFFINITY ActiveProcessors; 00748 00749 #endif 00750 00751 // 00752 // The following fields are referenced during clock interrupts. 00753 // 00754 00755 ULONG KernelTime; 00756 ULONG UserTime; 00757 00758 // 00759 // The following fields are referenced infrequently. 00760 // 00761 00762 LIST_ENTRY ReadyListHead; 00763 LIST_ENTRY SwapListEntry; 00764 LIST_ENTRY ThreadListHead; 00765 KSPIN_LOCK ProcessLock; 00766 KAFFINITY Affinity; 00767 USHORT StackCount; 00768 SCHAR BasePriority; 00769 SCHAR ThreadQuantum; 00770 BOOLEAN AutoAlignment; 00771 UCHAR State; 00772 UCHAR ThreadSeed; 00773 BOOLEAN DisableBoost; 00774 UCHAR PowerState; 00775 BOOLEAN DisableQuantum; 00776 UCHAR Spare[2]; 00777 } KPROCESS, *PKPROCESS, *RESTRICTED_POINTER PRKPROCESS; 00778 00779 // 00780 // Profile object structure definition 00781 // 00782 00783 typedef struct _KPROFILE { 00784 CSHORT Type; 00785 CSHORT Size; 00786 LIST_ENTRY ProfileListEntry; 00787 PKPROCESS Process; 00788 PVOID RangeBase; 00789 PVOID RangeLimit; 00790 ULONG BucketShift; 00791 PVOID Buffer; 00792 ULONG Segment; 00793 KAFFINITY Affinity; 00794 CSHORT Source; 00795 BOOLEAN Started; 00796 } KPROFILE, *PKPROFILE, *RESTRICTED_POINTER PRKPROFILE; 00797 00798 // 00799 // Define kernel channel object structure and types. 00800 // 00801 00802 #define LISTEN_CHANNEL 0x1 00803 #define MESSAGE_CHANNEL 0x2 00804 00805 typedef enum _ECHANNEL_STATE { 00806 ClientIdle, 00807 ClientSendWaitReply, 00808 ClientShutdown, 00809 ServerIdle, 00810 ServerReceiveMessage, 00811 ServerShutdown 00812 } ECHANNEL_STATE; 00813 00814 typedef struct _ECHANNEL { 00815 USHORT Type; 00816 USHORT State; 00817 PKPROCESS OwnerProcess; 00818 PKTHREAD ClientThread; 00819 PKTHREAD ServerThread; 00820 PVOID ServerContext; 00821 struct _ECHANNEL *ServerChannel; 00822 KEVENT ReceiveEvent; 00823 KEVENT ClearToSendEvent; 00824 } ECHANNEL, *PECHANNEL, *RESTRICTED_POINTER PRECHANNEL; 00825 00826 00827 // 00828 // Kernel control object functions 00829 // 00830 // APC object 00831 // 00832 00833 NTKERNELAPI 00834 VOID 00835 KeInitializeApc ( 00836 IN PRKAPC Apc, 00837 IN PRKTHREAD Thread, 00838 IN KAPC_ENVIRONMENT Environment, 00839 IN PKKERNEL_ROUTINE KernelRoutine, 00840 IN PKRUNDOWN_ROUTINE RundownRoutine OPTIONAL, 00841 IN PKNORMAL_ROUTINE NormalRoutine OPTIONAL, 00842 IN KPROCESSOR_MODE ProcessorMode OPTIONAL, 00843 IN PVOID NormalContext OPTIONAL 00844 ); 00845 00846 PLIST_ENTRY 00847 KeFlushQueueApc ( 00848 IN PKTHREAD Thread, 00849 IN KPROCESSOR_MODE ProcessorMode 00850 ); 00851 00852 NTKERNELAPI 00853 BOOLEAN 00854 KeInsertQueueApc ( 00855 IN PRKAPC Apc, 00856 IN PVOID SystemArgument1, 00857 IN PVOID SystemArgument2, 00858 IN KPRIORITY Increment 00859 ); 00860 00861 BOOLEAN 00862 KeRemoveQueueApc ( 00863 IN PKAPC Apc 00864 ); 00865 00866 // begin_ntddk begin_wdm begin_nthal begin_ntifs 00867 // 00868 // DPC object 00869 // 00870 00871 NTKERNELAPI 00872 VOID 00873 KeInitializeDpc ( 00874 IN PRKDPC Dpc, 00875 IN PKDEFERRED_ROUTINE DeferredRoutine, 00876 IN PVOID DeferredContext 00877 ); 00878 00879 NTKERNELAPI 00880 BOOLEAN 00881 KeInsertQueueDpc ( 00882 IN PRKDPC Dpc, 00883 IN PVOID SystemArgument1, 00884 IN PVOID SystemArgument2 00885 ); 00886 00887 NTKERNELAPI 00888 BOOLEAN 00889 KeRemoveQueueDpc ( 00890 IN PRKDPC Dpc 00891 ); 00892 00893 // end_wdm 00894 00895 NTKERNELAPI 00896 VOID 00897 KeSetImportanceDpc ( 00898 IN PRKDPC Dpc, 00899 IN KDPC_IMPORTANCE Importance 00900 ); 00901 00902 NTKERNELAPI 00903 VOID 00904 KeSetTargetProcessorDpc ( 00905 IN PRKDPC Dpc, 00906 IN CCHAR Number 00907 ); 00908 00909 // begin_wdm 00910 // 00911 // Device queue object 00912 // 00913 00914 NTKERNELAPI 00915 VOID 00916 KeInitializeDeviceQueue ( 00917 IN PKDEVICE_QUEUE DeviceQueue 00918 ); 00919 00920 NTKERNELAPI 00921 BOOLEAN 00922 KeInsertDeviceQueue ( 00923 IN PKDEVICE_QUEUE DeviceQueue, 00924 IN PKDEVICE_QUEUE_ENTRY DeviceQueueEntry 00925 ); 00926 00927 NTKERNELAPI 00928 BOOLEAN 00929 KeInsertByKeyDeviceQueue ( 00930 IN PKDEVICE_QUEUE DeviceQueue, 00931 IN PKDEVICE_QUEUE_ENTRY DeviceQueueEntry, 00932 IN ULONG SortKey 00933 ); 00934 00935 NTKERNELAPI 00936 PKDEVICE_QUEUE_ENTRY 00937 KeRemoveDeviceQueue ( 00938 IN PKDEVICE_QUEUE DeviceQueue 00939 ); 00940 00941 NTKERNELAPI 00942 PKDEVICE_QUEUE_ENTRY 00943 KeRemoveByKeyDeviceQueue ( 00944 IN PKDEVICE_QUEUE DeviceQueue, 00945 IN ULONG SortKey 00946 ); 00947 00948 NTKERNELAPI 00949 BOOLEAN 00950 KeRemoveEntryDeviceQueue ( 00951 IN PKDEVICE_QUEUE DeviceQueue, 00952 IN PKDEVICE_QUEUE_ENTRY DeviceQueueEntry 00953 ); 00954 00955 // end_ntddk end_wdm end_nthal end_ntifs 00956 00957 // 00958 // Interrupt object 00959 // 00960 00961 NTKERNELAPI // nthal 00962 VOID // nthal 00963 KeInitializeInterrupt ( // nthal 00964 IN PKINTERRUPT Interrupt, // nthal 00965 IN PKSERVICE_ROUTINE ServiceRoutine, // nthal 00966 IN PVOID ServiceContext, // nthal 00967 IN PKSPIN_LOCK SpinLock OPTIONAL, // nthal 00968 IN ULONG Vector, // nthal 00969 IN KIRQL Irql, // nthal 00970 IN KIRQL SynchronizeIrql, // nthal 00971 IN KINTERRUPT_MODE InterruptMode, // nthal 00972 IN BOOLEAN ShareVector, // nthal 00973 IN CCHAR ProcessorNumber, // nthal 00974 IN BOOLEAN FloatingSave // nthal 00975 ); // nthal 00976 // nthal 00977 NTKERNELAPI // nthal 00978 BOOLEAN // nthal 00979 KeConnectInterrupt ( // nthal 00980 IN PKINTERRUPT Interrupt // nthal 00981 ); // nthal 00982 // nthal 00983 NTKERNELAPI 00984 BOOLEAN 00985 KeDisconnectInterrupt ( 00986 IN PKINTERRUPT Interrupt 00987 ); 00988 00989 NTKERNELAPI // ntddk wdm nthal 00990 BOOLEAN // ntddk wdm nthal 00991 KeSynchronizeExecution ( // ntddk wdm nthal 00992 IN PKINTERRUPT Interrupt, // ntddk wdm nthal 00993 IN PKSYNCHRONIZE_ROUTINE SynchronizeRoutine, // ntddk wdm nthal 00994 IN PVOID SynchronizeContext // ntddk wdm nthal 00995 ); // ntddk wdm nthal 00996 // ntddk wdm nthal 00997 // 00998 // Profile object 00999 // 01000 01001 VOID 01002 KeInitializeProfile ( 01003 IN PKPROFILE Profile, 01004 IN PKPROCESS Process OPTIONAL, 01005 IN PVOID RangeBase, 01006 IN SIZE_T RangeSize, 01007 IN ULONG BucketSize, 01008 IN ULONG Segment, 01009 IN KPROFILE_SOURCE ProfileSource, 01010 IN KAFFINITY Affinity 01011 ); 01012 01013 BOOLEAN 01014 KeStartProfile ( 01015 IN PKPROFILE Profile, 01016 IN PULONG Buffer 01017 ); 01018 01019 BOOLEAN 01020 KeStopProfile ( 01021 IN PKPROFILE Profile 01022 ); 01023 01024 VOID 01025 KeSetIntervalProfile ( 01026 IN ULONG Interval, 01027 IN KPROFILE_SOURCE Source 01028 ); 01029 01030 ULONG 01031 KeQueryIntervalProfile ( 01032 IN KPROFILE_SOURCE Source 01033 ); 01034 01035 // begin_ntddk begin_wdm begin_nthal begin_ntifs 01036 // 01037 // Kernel dispatcher object functions 01038 // 01039 // Event Object 01040 // 01041 01042 // end_wdm end_ntddk end_nthal end_ntifs 01043 01044 #if defined(_NTDRIVER_) || defined(_NTDDK_) || defined(_NTIFS_) || defined(_NTHAL_) 01045 01046 // begin_wdm begin_ntddk begin_nthal begin_ntifs 01047 01048 NTKERNELAPI 01049 VOID 01050 KeInitializeEvent ( 01051 IN PRKEVENT Event, 01052 IN EVENT_TYPE Type, 01053 IN BOOLEAN State 01054 ); 01055 01056 NTKERNELAPI 01057 VOID 01058 KeClearEvent ( 01059 IN PRKEVENT Event 01060 ); 01061 01062 // end_wdm end_ntddk end_nthal end_ntifs 01063 01064 #else 01065 01066 #define KeInitializeEvent(_Event, _Type, _State) \ 01067 (_Event)->Header.Type = (UCHAR)_Type; \ 01068 (_Event)->Header.Size = sizeof(KEVENT) / sizeof(LONG); \ 01069 (_Event)->Header.SignalState = _State; \ 01070 InitializeListHead(&(_Event)->Header.WaitListHead) 01071 01072 #define KeClearEvent(Event) (Event)->Header.SignalState = 0 01073 01074 #endif 01075 01076 01077 // begin_ntddk begin_ntifs 01078 NTKERNELAPI 01079 LONG 01080 KePulseEvent ( 01081 IN PRKEVENT Event, 01082 IN KPRIORITY Increment, 01083 IN BOOLEAN Wait 01084 ); 01085 // end_ntddk end_ntifs 01086 01087 // begin_ntddk begin_nthal begin_ntifs 01088 01089 NTKERNELAPI 01090 LONG 01091 KeReadStateEvent ( 01092 IN PRKEVENT Event 01093 ); 01094 01095 // begin_wdm 01096 01097 NTKERNELAPI 01098 LONG 01099 KeResetEvent ( 01100 IN PRKEVENT Event 01101 ); 01102 01103 NTKERNELAPI 01104 LONG 01105 KeSetEvent ( 01106 IN PRKEVENT Event, 01107 IN KPRIORITY Increment, 01108 IN BOOLEAN Wait 01109 ); 01110 01111 // end_ntddk end_wdm end_nthal end_ntifs 01112 01113 VOID 01114 KeSetEventBoostPriority ( 01115 IN PRKEVENT Event, 01116 IN PRKTHREAD *Thread OPTIONAL 01117 ); 01118 01119 VOID 01120 KeInitializeEventPair ( 01121 IN PKEVENT_PAIR EventPair 01122 ); 01123 01124 #define KeSetHighEventPair(EventPair, Increment, Wait) \ 01125 KeSetEvent(&((EventPair)->EventHigh), \ 01126 Increment, \ 01127 Wait) 01128 01129 #define KeSetLowEventPair(EventPair, Increment, Wait) \ 01130 KeSetEvent(&((EventPair)->EventLow), \ 01131 Increment, \ 01132 Wait) 01133 01134 // 01135 // Mutant object 01136 // 01137 01138 NTKERNELAPI 01139 VOID 01140 KeInitializeMutant ( 01141 IN PRKMUTANT Mutant, 01142 IN BOOLEAN InitialOwner 01143 ); 01144 01145 LONG 01146 KeReadStateMutant ( 01147 IN PRKMUTANT 01148 ); 01149 01150 NTKERNELAPI 01151 LONG 01152 KeReleaseMutant ( 01153 IN PRKMUTANT Mutant, 01154 IN KPRIORITY Increment, 01155 IN BOOLEAN Abandoned, 01156 IN BOOLEAN Wait 01157 ); 01158 01159 // begin_ntddk begin_wdm begin_nthal begin_ntifs 01160 // 01161 // Mutex object 01162 // 01163 01164 NTKERNELAPI 01165 VOID 01166 KeInitializeMutex ( 01167 IN PRKMUTEX Mutex, 01168 IN ULONG Level 01169 ); 01170 01171 #define KeReadStateMutex(Mutex) KeReadStateMutant(Mutex) 01172 01173 NTKERNELAPI 01174 LONG 01175 KeReleaseMutex ( 01176 IN PRKMUTEX Mutex, 01177 IN BOOLEAN Wait 01178 ); 01179 01180 // end_ntddk end_wdm 01181 // 01182 // Queue Object. 01183 // 01184 01185 NTKERNELAPI 01186 VOID 01187 KeInitializeQueue ( 01188 IN PRKQUEUE Queue, 01189 IN ULONG Count OPTIONAL 01190 ); 01191 01192 NTKERNELAPI 01193 LONG 01194 KeReadStateQueue ( 01195 IN PRKQUEUE Queue 01196 ); 01197 01198 NTKERNELAPI 01199 LONG 01200 KeInsertQueue ( 01201 IN PRKQUEUE Queue, 01202 IN PLIST_ENTRY Entry 01203 ); 01204 01205 NTKERNELAPI 01206 LONG 01207 KeInsertHeadQueue ( 01208 IN PRKQUEUE Queue, 01209 IN PLIST_ENTRY Entry 01210 ); 01211 01212 NTKERNELAPI 01213 PLIST_ENTRY 01214 KeRemoveQueue ( 01215 IN PRKQUEUE Queue, 01216 IN KPROCESSOR_MODE WaitMode, 01217 IN PLARGE_INTEGER Timeout OPTIONAL 01218 ); 01219 01220 PLIST_ENTRY 01221 KeRundownQueue ( 01222 IN PRKQUEUE Queue 01223 ); 01224 01225 // begin_ntddk begin_wdm 01226 // 01227 // Semaphore object 01228 // 01229 01230 NTKERNELAPI 01231 VOID 01232 KeInitializeSemaphore ( 01233 IN PRKSEMAPHORE Semaphore, 01234 IN LONG Count, 01235 IN LONG Limit 01236 ); 01237 01238 NTKERNELAPI 01239 LONG 01240 KeReadStateSemaphore ( 01241 IN PRKSEMAPHORE Semaphore 01242 ); 01243 01244 NTKERNELAPI 01245 LONG 01246 KeReleaseSemaphore ( 01247 IN PRKSEMAPHORE Semaphore, 01248 IN KPRIORITY Increment, 01249 IN LONG Adjustment, 01250 IN BOOLEAN Wait 01251 ); 01252 01253 // end_ntddk end_wdm end_nthal end_ntifs 01254 01255 // 01256 // Process object 01257 // 01258 01259 VOID 01260 KeInitializeProcess ( 01261 IN PRKPROCESS Process, 01262 IN KPRIORITY Priority, 01263 IN KAFFINITY Affinity, 01264 IN ULONG_PTR DirectoryTableBase[2], 01265 IN BOOLEAN Enable 01266 ); 01267 01268 LOGICAL 01269 KeForceAttachProcess ( 01270 IN PKPROCESS Process 01271 ); 01272 01273 // begin_ntifs 01274 01275 NTKERNELAPI 01276 VOID 01277 KeAttachProcess ( 01278 IN PRKPROCESS Process 01279 ); 01280 01281 NTKERNELAPI 01282 VOID 01283 KeDetachProcess ( 01284 VOID 01285 ); 01286 01287 NTKERNELAPI 01288 VOID 01289 KeStackAttachProcess ( 01290 IN PRKPROCESS PROCESS, 01291 OUT PRKAPC_STATE ApcState 01292 ); 01293 01294 NTKERNELAPI 01295 VOID 01296 KeUnstackDetachProcess ( 01297 IN PRKAPC_STATE ApcState 01298 ); 01299 01300 // end_ntifs 01301 01302 #define KeIsAttachedProcess() \ 01303 (KeGetCurrentThread()->ApcStateIndex == AttachedApcEnvironment) 01304 01305 LONG 01306 KeReadStateProcess ( 01307 IN PRKPROCESS Process 01308 ); 01309 01310 BOOLEAN 01311 KeSetAutoAlignmentProcess ( 01312 IN PRKPROCESS Process, 01313 IN BOOLEAN Enable 01314 ); 01315 01316 LONG 01317 KeSetProcess ( 01318 IN PRKPROCESS Process, 01319 IN KPRIORITY Increment, 01320 IN BOOLEAN Wait 01321 ); 01322 01323 KPRIORITY 01324 KeSetPriorityProcess ( 01325 IN PKPROCESS Process, 01326 IN KPRIORITY BasePriority 01327 ); 01328 01329 LOGICAL 01330 KeSetDisableQuantumProcess ( 01331 IN PKPROCESS Process, 01332 IN LOGICAL Disable 01333 ); 01334 01335 #define KeTerminateProcess(Process) \ 01336 (Process)->StackCount += 1; 01337 01338 // 01339 // Thread object 01340 // 01341 01342 VOID 01343 KeInitializeThread ( 01344 IN PKTHREAD Thread, 01345 IN PVOID KernelStack, 01346 IN PKSYSTEM_ROUTINE SystemRoutine, 01347 IN PKSTART_ROUTINE StartRoutine OPTIONAL, 01348 IN PVOID StartContext OPTIONAL, 01349 IN PCONTEXT ContextFrame OPTIONAL, 01350 IN PVOID Teb OPTIONAL, 01351 IN PKPROCESS Process 01352 ); 01353 01354 BOOLEAN 01355 KeAlertThread ( 01356 IN PKTHREAD Thread, 01357 IN KPROCESSOR_MODE ProcessorMode 01358 ); 01359 01360 ULONG 01361 KeAlertResumeThread ( 01362 IN PKTHREAD Thread 01363 ); 01364 01365 NTKERNELAPI 01366 VOID 01367 KeBoostCurrentThread ( 01368 VOID 01369 ); 01370 01371 VOID 01372 KeBoostPriorityThread ( 01373 IN PKTHREAD Thread, 01374 IN KPRIORITY Increment 01375 ); 01376 01377 KAFFINITY 01378 KeConfineThread ( 01379 VOID 01380 ); 01381 01382 NTKERNELAPI // ntddk wdm nthal ntifs 01383 NTSTATUS // ntddk wdm nthal ntifs 01384 KeDelayExecutionThread ( // ntddk wdm nthal ntifs 01385 IN KPROCESSOR_MODE WaitMode, // ntddk wdm nthal ntifs 01386 IN BOOLEAN Alertable, // ntddk wdm nthal ntifs 01387 IN PLARGE_INTEGER Interval // ntddk wdm nthal ntifs 01388 ); // ntddk wdm nthal ntifs 01389 // ntddk wdm nthal ntifs 01390 BOOLEAN 01391 KeDisableApcQueuingThread ( 01392 IN PKTHREAD Thread 01393 ); 01394 01395 BOOLEAN 01396 KeEnableApcQueuingThread ( 01397 IN PKTHREAD 01398 ); 01399 01400 LOGICAL 01401 KeSetDisableBoostThread ( 01402 IN PKTHREAD Thread, 01403 IN LOGICAL Disable 01404 ); 01405 01406 ULONG 01407 KeForceResumeThread ( 01408 IN PKTHREAD Thread 01409 ); 01410 01411 VOID 01412 KeFreezeAllThreads ( 01413 VOID 01414 ); 01415 01416 BOOLEAN 01417 KeQueryAutoAlignmentThread ( 01418 IN PKTHREAD Thread 01419 ); 01420 01421 LONG 01422 KeQueryBasePriorityThread ( 01423 IN PKTHREAD Thread 01424 ); 01425 01426 NTKERNELAPI // ntddk wdm nthal ntifs 01427 KPRIORITY // ntddk wdm nthal ntifs 01428 KeQueryPriorityThread ( // ntddk wdm nthal ntifs 01429 IN PKTHREAD Thread // ntddk wdm nthal ntifs 01430 ); // ntddk wdm nthal ntifs 01431 // ntddk wdm nthal ntifs 01432 BOOLEAN 01433 KeReadStateThread ( 01434 IN PKTHREAD Thread 01435 ); 01436 01437 VOID 01438 KeReadyThread ( 01439 IN PKTHREAD Thread 01440 ); 01441 01442 ULONG 01443 KeResumeThread ( 01444 IN PKTHREAD Thread 01445 ); 01446 01447 VOID // nthal 01448 KeRevertToUserAffinityThread ( // nthal 01449 VOID // nthal 01450 ); // nthal 01451 01452 VOID 01453 KeRundownThread ( 01454 VOID 01455 ); 01456 01457 KAFFINITY 01458 KeSetAffinityThread ( 01459 IN PKTHREAD Thread, 01460 IN KAFFINITY Affinity 01461 ); 01462 01463 VOID // nthal 01464 KeSetSystemAffinityThread ( // nthal 01465 IN KAFFINITY Affinity // nthal 01466 ); // nthal 01467 01468 BOOLEAN 01469 KeSetAutoAlignmentThread ( 01470 IN PKTHREAD Thread, 01471 IN BOOLEAN Enable 01472 ); 01473 01474 NTKERNELAPI // ntddk nthal ntifs 01475 LONG // ntddk nthal ntifs 01476 KeSetBasePriorityThread ( // ntddk nthal ntifs 01477 IN PKTHREAD Thread, // ntddk nthal ntifs 01478 IN LONG Increment // ntddk nthal ntifs 01479 ); // ntddk nthal ntifs 01480 // ntddk nthal ntifs 01481 01482 // begin_ntsrv 01483 01484 NTKERNELAPI 01485 CCHAR 01486 KeSetIdealProcessorThread ( 01487 IN PKTHREAD Thread, 01488 IN CCHAR Processor 01489 ); 01490 01491 // end_ntsrv 01492 01493 NTKERNELAPI 01494 BOOLEAN 01495 KeSetKernelStackSwapEnable ( 01496 IN BOOLEAN Enable 01497 ); 01498 01499 NTKERNELAPI // ntddk wdm nthal ntifs 01500 KPRIORITY // ntddk wdm nthal ntifs 01501 KeSetPriorityThread ( // ntddk wdm nthal ntifs 01502 IN PKTHREAD Thread, // ntddk wdm nthal ntifs 01503 IN KPRIORITY Priority // ntddk wdm nthal ntifs 01504 ); // ntddk wdm nthal ntifs 01505 // ntddk wdm nthal ntifs 01506 ULONG 01507 KeSuspendThread ( 01508 IN PKTHREAD 01509 ); 01510 01511 NTKERNELAPI 01512 VOID 01513 KeTerminateThread ( 01514 IN KPRIORITY Increment 01515 ); 01516 01517 BOOLEAN 01518 KeTestAlertThread ( 01519 IN KPROCESSOR_MODE 01520 ); 01521 01522 VOID 01523 KeThawAllThreads ( 01524 VOID 01525 ); 01526 01527 // 01528 // Define leave critical region macro used for inline and function code 01529 // generation. 01530 // 01531 // Warning: assembly versions of this code are included directly in 01532 // ntgdi assembly routines mutexs.s for MIPS and locka.asm for i386. 01533 // Any changes made to KeEnterCriticalRegion/KeEnterCriticalRegion 01534 // must be reflected in these routines. 01535 // 01536 01537 #define KiLeaveCriticalRegion() { \ 01538 PKTHREAD Thread; \ 01539 Thread = KeGetCurrentThread(); \ 01540 if (((*((volatile ULONG *)&Thread->KernelApcDisable) += 1) == 0) && \ 01541 (((volatile LIST_ENTRY *)&Thread->ApcState.ApcListHead[KernelMode])->Flink != \ 01542 &Thread->ApcState.ApcListHead[KernelMode])) { \ 01543 Thread->ApcState.KernelApcPending = TRUE; \ 01544 KiRequestSoftwareInterrupt(APC_LEVEL); \ 01545 } \ 01546 } 01547 01548 // begin_ntddk begin_nthal begin_ntifs 01549 01550 #if (defined(_NTDRIVER_) || defined(_NTDDK_) || defined(_NTIFS_) || defined(_NTHAL_)) && !defined(_NTSYSTEM_DRIVER_) 01551 01552 // begin_wdm 01553 01554 NTKERNELAPI 01555 VOID 01556 KeEnterCriticalRegion ( 01557 VOID 01558 ); 01559 01560 NTKERNELAPI 01561 VOID 01562 KeLeaveCriticalRegion ( 01563 VOID 01564 ); 01565 01566 // end_wdm 01567 01568 #else 01569 01570 //++ 01571 // 01572 // VOID 01573 // KeEnterCriticalRegion ( 01574 // VOID 01575 // ) 01576 // 01577 // 01578 // Routine Description: 01579 // 01580 // This function disables kernel APC's. 01581 // 01582 // N.B. The following code does not require any interlocks. There are 01583 // two cases of interest: 1) On an MP system, the thread cannot 01584 // be running on two processors as once, and 2) if the thread is 01585 // is interrupted to deliver a kernel mode APC which also calls 01586 // this routine, the values read and stored will stack and unstack 01587 // properly. 01588 // 01589 // Arguments: 01590 // 01591 // None. 01592 // 01593 // Return Value: 01594 // 01595 // None. 01596 //-- 01597 01598 #define KeEnterCriticalRegion() KeGetCurrentThread()->KernelApcDisable -= 1; 01599 01600 //++ 01601 // 01602 // VOID 01603 // KeLeaveCriticalRegion ( 01604 // VOID 01605 // ) 01606 // 01607 // 01608 // Routine Description: 01609 // 01610 // This function enables kernel APC's. 01611 // 01612 // N.B. The following code does not require any interlocks. There are 01613 // two cases of interest: 1) On an MP system, the thread cannot 01614 // be running on two processors as once, and 2) if the thread is 01615 // is interrupted to deliver a kernel mode APC which also calls 01616 // this routine, the values read and stored will stack and unstack 01617 // properly. 01618 // 01619 // Arguments: 01620 // 01621 // None. 01622 // 01623 // Return Value: 01624 // 01625 // None. 01626 //-- 01627 01628 #define KeLeaveCriticalRegion() KiLeaveCriticalRegion() 01629 01630 #endif 01631 01632 // begin_wdm 01633 01634 // 01635 // Timer object 01636 // 01637 01638 NTKERNELAPI 01639 VOID 01640 KeInitializeTimer ( 01641 IN PKTIMER Timer 01642 ); 01643 01644 NTKERNELAPI 01645 VOID 01646 KeInitializeTimerEx ( 01647 IN PKTIMER Timer, 01648 IN TIMER_TYPE Type 01649 ); 01650 01651 NTKERNELAPI 01652 BOOLEAN 01653 KeCancelTimer ( 01654 IN PKTIMER 01655 ); 01656 01657 NTKERNELAPI 01658 BOOLEAN 01659 KeReadStateTimer ( 01660 PKTIMER Timer 01661 ); 01662 01663 NTKERNELAPI 01664 BOOLEAN 01665 KeSetTimer ( 01666 IN PKTIMER Timer, 01667 IN LARGE_INTEGER DueTime, 01668 IN PKDPC Dpc OPTIONAL 01669 ); 01670 01671 NTKERNELAPI 01672 BOOLEAN 01673 KeSetTimerEx ( 01674 IN PKTIMER Timer, 01675 IN LARGE_INTEGER DueTime, 01676 IN LONG Period OPTIONAL, 01677 IN PKDPC Dpc OPTIONAL 01678 ); 01679 01680 // end_ntddk end_nthal end_ntifs end_wdm 01681 01682 PVOID 01683 KeCheckForTimer( 01684 IN PVOID p, 01685 IN ULONG Size 01686 ); 01687 01688 VOID 01689 KeClearTimer ( 01690 IN PKTIMER Timer 01691 ); 01692 01693 ULONGLONG 01694 KeQueryTimerDueTime ( 01695 IN PKTIMER Timer 01696 ); 01697 01698 01699 // 01700 // Wait functions 01701 // 01702 01703 NTSTATUS 01704 KiSetServerWaitClientEvent ( 01705 IN PKEVENT SeverEvent, 01706 IN PKEVENT ClientEvent, 01707 IN ULONG WaitMode 01708 ); 01709 01710 #if 0 01711 NTSTATUS 01712 KeReleaseWaitForSemaphore ( 01713 IN PKSEMAPHORE Server, 01714 IN PKSEMAPHORE Client, 01715 IN ULONG WaitReason, 01716 IN ULONG WaitMode 01717 ); 01718 #endif 01719 01720 #define KeSetHighWaitLowEventPair(EventPair, WaitMode) \ 01721 KiSetServerWaitClientEvent(&((EventPair)->EventHigh), \ 01722 &((EventPair)->EventLow), \ 01723 WaitMode) 01724 01725 #define KeSetLowWaitHighEventPair(EventPair, WaitMode) \ 01726 KiSetServerWaitClientEvent(&((EventPair)->EventLow), \ 01727 &((EventPair)->EventHigh), \ 01728 WaitMode) 01729 01730 #define KeWaitForHighEventPair(EventPair, WaitMode, Alertable, TimeOut) \ 01731 KeWaitForSingleObject(&((EventPair)->EventHigh), \ 01732 WrEventPair, \ 01733 WaitMode, \ 01734 Alertable, \ 01735 TimeOut) 01736 01737 #define KeWaitForLowEventPair(EventPair, WaitMode, Alertable, TimeOut) \ 01738 KeWaitForSingleObject(&((EventPair)->EventLow), \ 01739 WrEventPair, \ 01740 WaitMode, \ 01741 Alertable, \ 01742 TimeOut) 01743 01744 // begin_ntddk begin_wdm begin_nthal begin_ntifs 01745 01746 #define KeWaitForMutexObject KeWaitForSingleObject 01747 01748 NTKERNELAPI 01749 NTSTATUS 01750 KeWaitForMultipleObjects ( 01751 IN ULONG Count, 01752 IN PVOID Object[], 01753 IN WAIT_TYPE WaitType, 01754 IN KWAIT_REASON WaitReason, 01755 IN KPROCESSOR_MODE WaitMode, 01756 IN BOOLEAN Alertable, 01757 IN PLARGE_INTEGER Timeout OPTIONAL, 01758 IN PKWAIT_BLOCK WaitBlockArray OPTIONAL 01759 ); 01760 01761 NTKERNELAPI 01762 NTSTATUS 01763 KeWaitForSingleObject ( 01764 IN PVOID Object, 01765 IN KWAIT_REASON WaitReason, 01766 IN KPROCESSOR_MODE WaitMode, 01767 IN BOOLEAN Alertable, 01768 IN PLARGE_INTEGER Timeout OPTIONAL 01769 ); 01770 01771 // end_ntddk end_wdm end_nthal end_ntifs 01772 01773 // 01774 // Define internal kernel functions. 01775 // 01776 // N.B. These definitions are not public and are used elsewhere only under 01777 // very special circumstances. 01778 // 01779 01780 // begin_ntddk begin_wdm begin_nthal begin_ntifs begin_ntndis 01781 01782 // 01783 // On X86 the following routines are defined in the HAL and imported by 01784 // all other modules. 01785 // 01786 01787 #if defined(_X86_) && !defined(_NTHAL_) 01788 01789 #define _DECL_HAL_KE_IMPORT __declspec(dllimport) 01790 01791 #else 01792 01793 #define _DECL_HAL_KE_IMPORT 01794 01795 #endif 01796 01797 // end_ntddk end_wdm end_nthal end_ntifs end_ntndis 01798 01799 #if defined(_ALPHA_) || defined(_X86_) 01800 #if defined(NT_UP) 01801 01802 #define KeAcquireQueuedSpinLockRaiseToSynch(Number) \ 01803 KeRaiseIrqlToSynchLevel() 01804 01805 #define KeAcquireQueuedSpinLock(Number) \ 01806 KfRaiseIrql(DISPATCH_LEVEL) 01807 01808 #define KeReleaseQueuedSpinLock(Number, OldIrql) \ 01809 KeLowerIrql(OldIrql) 01810 01811 #define KeTryToAcquireQueuedSpinLockRaiseToSynch(Number, OldIrql) \ 01812 (*(OldIrql) = KeRaiseIrqlToSynchLevel(), TRUE) 01813 01814 #define KeTryToAcquireQueuedSpinLock(Number, OldIrql) \ 01815 (KeRaiseIrql(DISPATCH_LEVEL, OldIrql), TRUE) 01816 01817 #define KiAcquireQueuedSpinLock(LockQueue) 01818 01819 #define KiReleaseQueuedSpinLock(LockQueue) 01820 01821 #else // NT_UP 01822 01823 VOID 01824 FASTCALL 01825 KiAcquireQueuedSpinLock ( 01826 IN PKSPIN_LOCK_QUEUE LockQueue 01827 ); 01828 01829 VOID 01830 FASTCALL 01831 KiReleaseQueuedSpinLock ( 01832 IN PKSPIN_LOCK_QUEUE LockQueue 01833 ); 01834 01835 _DECL_HAL_KE_IMPORT 01836 KIRQL 01837 FASTCALL 01838 KeAcquireQueuedSpinLockRaiseToSynch ( 01839 IN KSPIN_LOCK_QUEUE_NUMBER Number 01840 ); 01841 01842 _DECL_HAL_KE_IMPORT 01843 KIRQL 01844 FASTCALL 01845 KeAcquireQueuedSpinLock ( 01846 IN KSPIN_LOCK_QUEUE_NUMBER Number 01847 ); 01848 01849 _DECL_HAL_KE_IMPORT 01850 VOID 01851 FASTCALL 01852 KeReleaseQueuedSpinLock ( 01853 IN KSPIN_LOCK_QUEUE_NUMBER Number, 01854 IN KIRQL OldIrql 01855 ); 01856 01857 _DECL_HAL_KE_IMPORT 01858 LOGICAL 01859 FASTCALL 01860 KeTryToAcquireQueuedSpinLockRaiseToSynch( 01861 IN KSPIN_LOCK_QUEUE_NUMBER Number, 01862 IN PKIRQL OldIrql 01863 ); 01864 01865 _DECL_HAL_KE_IMPORT 01866 LOGICAL 01867 FASTCALL 01868 KeTryToAcquireQueuedSpinLock( 01869 IN KSPIN_LOCK_QUEUE_NUMBER Number, 01870 IN PKIRQL OldIrql 01871 ); 01872 01873 #endif // NT_UP 01874 #endif // _ALPHA_ || _X86_ 01875 01876 #if defined(NT_UP) 01877 01878 // 01879 // On Uni-processor systems there is no real Dispatcher Database Lock 01880 // so raising to SYNCH won't help get the lock released any sooner. 01881 // On X86, these functions are implemented in the HAL and don't use 01882 // the KiSynchLevel variable, on other platforms, KiSynchLevel can 01883 // be set appropriately. 01884 // 01885 01886 #if defined(_X86_) 01887 01888 #define KiLockDispatcherDatabase(OldIrql) \ 01889 *(OldIrql) = KeRaiseIrqlToDpcLevel() 01890 01891 #else 01892 01893 #define KiLockDispatcherDatabase(OldIrql) \ 01894 *(OldIrql) = KeRaiseIrqlToSynchLevel() 01895 01896 #endif 01897 01898 #else // NT_UP 01899 01900 #if defined(_ALPHA_) || defined(_X86_) 01901 01902 #define KiLockDispatcherDatabase(OldIrql) \ 01903 *(OldIrql) = KeAcquireQueuedSpinLockRaiseToSynch(LockQueueDispatcherLock) 01904 01905 #else // _ALPHA_ || _X86_ 01906 01907 #define KiLockDispatcherDatabase(OldIrql) \ 01908 *(OldIrql) = KeAcquireSpinLockRaiseToSynch(&KiDispatcherLock) 01909 01910 #endif // _ALPHA_ || _X86_ 01911 #endif // NT_UP 01912 01913 VOID 01914 FASTCALL 01915 KiSetPriorityThread ( 01916 IN PRKTHREAD Thread, 01917 IN KPRIORITY Priority 01918 ); 01919 01920 // begin_ntddk begin_wdm begin_nthal begin_ntifs begin_ntndis 01921 // 01922 // spin lock functions 01923 // 01924 01925 NTKERNELAPI 01926 VOID 01927 NTAPI 01928 KeInitializeSpinLock ( 01929 IN PKSPIN_LOCK SpinLock 01930 ); 01931 01932 #if defined(_X86_) 01933 01934 NTKERNELAPI 01935 VOID 01936 FASTCALL 01937 KefAcquireSpinLockAtDpcLevel ( 01938 IN PKSPIN_LOCK SpinLock 01939 ); 01940 01941 NTKERNELAPI 01942 VOID 01943 FASTCALL 01944 KefReleaseSpinLockFromDpcLevel ( 01945 IN PKSPIN_LOCK SpinLock 01946 ); 01947 01948 #define KeAcquireSpinLockAtDpcLevel(a) KefAcquireSpinLockAtDpcLevel(a) 01949 #define KeReleaseSpinLockFromDpcLevel(a) KefReleaseSpinLockFromDpcLevel(a) 01950 01951 _DECL_HAL_KE_IMPORT 01952 KIRQL 01953 FASTCALL 01954 KfAcquireSpinLock ( 01955 IN PKSPIN_LOCK SpinLock 01956 ); 01957 01958 _DECL_HAL_KE_IMPORT 01959 VOID 01960 FASTCALL 01961 KfReleaseSpinLock ( 01962 IN PKSPIN_LOCK SpinLock, 01963 IN KIRQL NewIrql 01964 ); 01965 01966 // end_wdm 01967 01968 _DECL_HAL_KE_IMPORT 01969 KIRQL 01970 FASTCALL 01971 KeAcquireSpinLockRaiseToSynch ( 01972 IN PKSPIN_LOCK SpinLock 01973 ); 01974 01975 // begin_wdm 01976 01977 #define KeAcquireSpinLock(a,b) *(b) = KfAcquireSpinLock(a) 01978 #define KeReleaseSpinLock(a,b) KfReleaseSpinLock(a,b) 01979 01980 #else 01981 01982 NTKERNELAPI 01983 KIRQL 01984 FASTCALL 01985 KeAcquireSpinLockRaiseToSynch ( 01986 IN PKSPIN_LOCK SpinLock 01987 ); 01988 01989 NTKERNELAPI 01990 VOID 01991 KeAcquireSpinLockAtDpcLevel ( 01992 IN PKSPIN_LOCK SpinLock 01993 ); 01994 01995 NTKERNELAPI 01996 VOID 01997 KeReleaseSpinLockFromDpcLevel ( 01998 IN PKSPIN_LOCK SpinLock 01999 ); 02000 02001 NTKERNELAPI 02002 KIRQL 02003 KeAcquireSpinLockRaiseToDpc ( 02004 IN PKSPIN_LOCK SpinLock 02005 ); 02006 02007 #define KeAcquireSpinLock(SpinLock, OldIrql) \ 02008 *(OldIrql) = KeAcquireSpinLockRaiseToDpc(SpinLock) 02009 02010 NTKERNELAPI 02011 VOID 02012 KeReleaseSpinLock ( 02013 IN PKSPIN_LOCK SpinLock, 02014 IN KIRQL NewIrql 02015 ); 02016 02017 #endif 02018 02019 // end_wdm end_ntddk end_nthal end_ntifs end_ntndis 02020 02021 BOOLEAN 02022 KeTryToAcquireSpinLock ( 02023 IN PKSPIN_LOCK SpinLock, 02024 OUT PKIRQL OldIrql 02025 ); 02026 02027 // 02028 // Raise and lower IRQL functions. 02029 // 02030 02031 // begin_nthal begin_wdm begin_ntddk begin_ntifs 02032 02033 #if defined(_X86_) 02034 02035 _DECL_HAL_KE_IMPORT 02036 VOID 02037 FASTCALL 02038 KfLowerIrql ( 02039 IN KIRQL NewIrql 02040 ); 02041 02042 _DECL_HAL_KE_IMPORT 02043 KIRQL 02044 FASTCALL 02045 KfRaiseIrql ( 02046 IN KIRQL NewIrql 02047 ); 02048 02049 // end_wdm 02050 02051 _DECL_HAL_KE_IMPORT 02052 KIRQL 02053 KeRaiseIrqlToDpcLevel( 02054 VOID 02055 ); 02056 02057 _DECL_HAL_KE_IMPORT 02058 KIRQL 02059 KeRaiseIrqlToSynchLevel( 02060 VOID 02061 ); 02062 02063 // begin_wdm 02064 02065 #define KeLowerIrql(a) KfLowerIrql(a) 02066 #define KeRaiseIrql(a,b) *(b) = KfRaiseIrql(a) 02067 02068 // end_wdm 02069 02070 // begin_wdm 02071 02072 #elif defined(_ALPHA_) 02073 02074 #define KeLowerIrql(a) __swpirql(a) 02075 #define KeRaiseIrql(a,b) *(b) = __swpirql(a) 02076 02077 // end_wdm 02078 02079 #define KfRaiseIrql(a) __swpirql(a) 02080 #define KeRaiseIrqlToDpcLevel() __swpirql(DISPATCH_LEVEL) 02081 #define KeRaiseIrqlToSynchLevel() __swpirql((UCHAR)KiSynchIrql) 02082 02083 // begin_wdm 02084 02085 #elif defined(_IA64_) 02086 02087 VOID 02088 KeLowerIrql ( 02089 IN KIRQL NewIrql 02090 ); 02091 02092 VOID 02093 KeRaiseIrql ( 02094 IN KIRQL NewIrql, 02095 OUT PKIRQL OldIrql 02096 ); 02097 02098 // end_wdm 02099 02100 KIRQL 02101 KeRaiseIrqlToDpcLevel ( 02102 VOID 02103 ); 02104 02105 KIRQL 02106 KeRaiseIrqlToSynchLevel ( 02107 VOID 02108 ); 02109 02110 // begin_wdm 02111 02112 #endif 02113 02114 // end_nthal end_wdm end_ntddk end_ntifs 02115 02116 02117 // 02118 // Initialize kernel in phase 1. 02119 // 02120 02121 BOOLEAN 02122 KeInitSystem( 02123 VOID 02124 ); 02125 02126 // begin_ntddk begin_wdm begin_nthal begin_ntifs 02127 // 02128 // Miscellaneous kernel functions 02129 // 02130 02131 // end_wdm 02132 02133 BOOLEAN 02134 KeGetBugMessageText( 02135 IN ULONG MessageId, 02136 IN PANSI_STRING ReturnedString OPTIONAL 02137 ); 02138 02139 typedef enum _KBUGCHECK_BUFFER_DUMP_STATE { 02140 BufferEmpty, 02141 BufferInserted, 02142 BufferStarted, 02143 BufferFinished, 02144 BufferIncomplete 02145 } KBUGCHECK_BUFFER_DUMP_STATE; 02146 02147 typedef 02148 VOID 02149 (*PKBUGCHECK_CALLBACK_ROUTINE) ( 02150 IN PVOID Buffer, 02151 IN ULONG Length 02152 ); 02153 02154 typedef struct _KBUGCHECK_CALLBACK_RECORD { 02155 LIST_ENTRY Entry; 02156 PKBUGCHECK_CALLBACK_ROUTINE CallbackRoutine; 02157 PVOID Buffer; 02158 ULONG Length; 02159 PUCHAR Component; 02160 ULONG_PTR Checksum; 02161 UCHAR State; 02162 } KBUGCHECK_CALLBACK_RECORD, *PKBUGCHECK_CALLBACK_RECORD; 02163 02164 NTKERNELAPI 02165 DECLSPEC_NORETURN 02166 VOID 02167 NTAPI 02168 KeBugCheck ( 02169 IN ULONG BugCheckCode 02170 ); 02171 02172 // begin_wdm 02173 02174 NTKERNELAPI 02175 DECLSPEC_NORETURN 02176 VOID 02177 KeBugCheckEx( 02178 IN ULONG BugCheckCode, 02179 IN ULONG_PTR BugCheckParameter1, 02180 IN ULONG_PTR BugCheckParameter2, 02181 IN ULONG_PTR BugCheckParameter3, 02182 IN ULONG_PTR BugCheckParameter4 02183 ); 02184 02185 // end_wdm 02186 02187 #define KeInitializeCallbackRecord(CallbackRecord) \ 02188 (CallbackRecord)->State = BufferEmpty 02189 02190 NTKERNELAPI 02191 BOOLEAN 02192 KeDeregisterBugCheckCallback ( 02193 IN PKBUGCHECK_CALLBACK_RECORD CallbackRecord 02194 ); 02195 02196 NTKERNELAPI 02197 BOOLEAN 02198 KeRegisterBugCheckCallback ( 02199 IN PKBUGCHECK_CALLBACK_RECORD CallbackRecord, 02200 IN PKBUGCHECK_CALLBACK_ROUTINE CallbackRoutine, 02201 IN PVOID Buffer, 02202 IN ULONG Length, 02203 IN PUCHAR Component 02204 ); 02205 02206 NTKERNELAPI 02207 VOID 02208 KeEnterKernelDebugger ( 02209 VOID 02210 ); 02211 02212 // end_ntddk end_nthal end_ntifs 02213 02214 typedef 02215 PCHAR 02216 (*PKE_BUGCHECK_UNICODE_TO_ANSI) ( 02217 IN PUNICODE_STRING UnicodeString, 02218 OUT PCHAR AnsiBuffer, 02219 IN ULONG MaxAnsiLength 02220 ); 02221 02222 VOID 02223 KeDumpMachineState ( 02224 IN PKPROCESSOR_STATE ProcessorState, 02225 IN PCHAR Buffer, 02226 IN PULONG_PTR BugCheckParameters, 02227 IN ULONG NumberOfParameters, 02228 IN PKE_BUGCHECK_UNICODE_TO_ANSI UnicodeToAnsiRoutine 02229 ); 02230 02231 VOID 02232 KeContextFromKframes ( 02233 IN PKTRAP_FRAME TrapFrame, 02234 IN PKEXCEPTION_FRAME ExceptionFrame, 02235 IN OUT PCONTEXT ContextFrame 02236 ); 02237 02238 VOID 02239 KeContextToKframes ( 02240 IN OUT PKTRAP_FRAME TrapFrame, 02241 IN OUT PKEXCEPTION_FRAME ExceptionFrame, 02242 IN PCONTEXT ContextFrame, 02243 IN ULONG ContextFlags, 02244 IN KPROCESSOR_MODE PreviousMode 02245 ); 02246 02247 02248 // begin_nthal 02249 02250 VOID 02251 __cdecl 02252 KeSaveStateForHibernate( 02253 IN PKPROCESSOR_STATE ProcessorState 02254 ); 02255 02256 // end_nthal 02257 02258 VOID 02259 KeCopyTrapDispatcher ( 02260 VOID 02261 ); 02262 02263 BOOLEAN 02264 FASTCALL 02265 KeInvalidAccessAllowed ( 02266 IN PVOID TrapInformation OPTIONAL 02267 ); 02268 02269 // 02270 // GDI TEB Batch Flush routine 02271 // 02272 02273 typedef 02274 VOID 02275 (*PGDI_BATCHFLUSH_ROUTINE) ( 02276 VOID 02277 ); 02278 02279 NTKERNELAPI // nthal 02280 VOID // nthal 02281 KeFlushCurrentTb ( // nthal 02282 VOID // nthal 02283 ); // nthal 02284 // nthal 02285 // 02286 // UCHAR 02287 // FindFirstSetRightMember(Set) 02288 // 02289 // This function only works for MAXIMUM_PROCESSORS (which is currently 32), 02290 // and it assumes at least one bit is set 02291 // 02292 02293 #define KeFindFirstSetRightMember(Set) \ 02294 ((Set & 0xFF) ? KiFindFirstSetRight[Set & 0xFF] : \ 02295 ((Set & 0xFF00) ? KiFindFirstSetRight[(Set >> 8) & 0xFF] + 8 : \ 02296 ((Set & 0xFF0000) ? KiFindFirstSetRight[(Set >> 16) & 0xFF] + 16 : \ 02297 KiFindFirstSetRight[Set >> 24] + 24 ))) 02298 02299 // 02300 // TB Flush routines 02301 // 02302 02303 #if defined(_M_IX86) 02304 02305 #if !defined (_X86PAE_) 02306 #define KI_FILL_PTE(_PointerPte, _PteContents) \ 02307 *(_PointerPte) = (_PteContents); 02308 02309 #define KI_SWAP_PTE(_PointerPte, _PteContents, _OldPte) \ 02310 (_OldPte) = *(_PointerPte); \ 02311 *(_PointerPte) = (_PteContents); 02312 #else 02313 02314 HARDWARE_PTE 02315 KeInterlockedSwapPte ( 02316 IN PHARDWARE_PTE PtePointer, 02317 IN PHARDWARE_PTE NewPteContents 02318 ); 02319 02320 #define KI_FILL_PTE(_PointerPte, _PteContents) { \ 02321 if ((_PointerPte)->Valid == 0) { \ 02322 (_PointerPte)->HighPart = ((_PteContents).HighPart); \ 02323 (_PointerPte)->LowPart = ((_PteContents).LowPart); \ 02324 } \ 02325 else if ((_PteContents).Valid == 0) { \ 02326 (_PointerPte)->LowPart = ((_PteContents).LowPart); \ 02327 (_PointerPte)->HighPart = ((_PteContents).HighPart); \ 02328 } \ 02329 else { \ 02330 (VOID) KeInterlockedSwapPte((_PointerPte), &(_PteContents)); \ 02331 } \ 02332 } 02333 02334 #define KI_SWAP_PTE(_PointerPte, _PteContents, _OldPte) { \ 02335 (_OldPte) = *(_PointerPte); \ 02336 if ((_PointerPte)->Valid == 0) { \ 02337 (_PointerPte)->HighPart = (_PteContents).HighPart; \ 02338 (_PointerPte)->LowPart = (_PteContents).LowPart; \ 02339 } \ 02340 else if ((_PteContents).Valid == 0) { \ 02341 (_PointerPte)->LowPart = (_PteContents).LowPart; \ 02342 (_PointerPte)->HighPart = (_PteContents).HighPart; \ 02343 } \ 02344 else { \ 02345 (_OldPte) = KeInterlockedSwapPte(_PointerPte, &(_PteContents)); \ 02346 } \ 02347 } 02348 #endif 02349 02350 #endif 02351 02352 #if defined(_ALPHA_) && defined(NT_UP) && \ 02353 !defined(_NTDRIVER_) && !defined(_NTDDK_) && !defined(_NTIFS_) && !defined(_NTHAL_) 02354 02355 #define KeFlushEntireTb(Invalid, AllProcessors) __tbia() 02356 02357 #define KeFlushMultipleTb(Number, Virtual, Invalid, AllProcessors, PtePointer, PteValue) \ 02358 { \ 02359 ULONG _Index_; \ 02360 \ 02361 if (ARGUMENT_PRESENT(PtePointer)) { \ 02362 for (_Index_ = 0; _Index_ < (Number); _Index_ += 1) { \ 02363 *((PHARDWARE_PTE *)(PtePointer))[_Index_] = (PteValue); \ 02364 } \ 02365 } \ 02366 KiFlushMultipleTb((Invalid), &(Virtual)[0], (Number)); \ 02367 } 02368 02369 __inline 02370 HARDWARE_PTE 02371 KeFlushSingleTb( 02372 IN PVOID Virtual, 02373 IN BOOLEAN Invalid, 02374 IN BOOLEAN AllProcesors, 02375 IN PHARDWARE_PTE PtePointer, 02376 IN HARDWARE_PTE PteValue 02377 ) 02378 { 02379 HARDWARE_PTE OldPte; 02380 02381 OldPte = *PtePointer; 02382 *PtePointer = PteValue; 02383 __tbis(Virtual); 02384 return(OldPte); 02385 } 02386 02387 #elif defined(_M_IX86) && defined(NT_UP) && \ 02388 !defined(_NTDRIVER_) && !defined(_NTDDK_) && !defined(_NTIFS_) && !defined(_NTHAL_) 02389 02390 #define KeFlushEntireTb(Invalid, AllProcessors) KeFlushCurrentTb() 02391 02392 __inline 02393 HARDWARE_PTE 02394 KeFlushSingleTb( 02395 IN PVOID Virtual, 02396 IN BOOLEAN Invalid, 02397 IN BOOLEAN AllProcesors, 02398 IN PHARDWARE_PTE PtePointer, 02399 IN HARDWARE_PTE PteValue 02400 ) 02401 { 02402 HARDWARE_PTE OldPte; 02403 02404 KI_SWAP_PTE (PtePointer, PteValue, OldPte); 02405 __asm { 02406 mov eax, Virtual 02407 invlpg [eax] 02408 } 02409 return(OldPte); 02410 } 02411 02412 #define KeFlushMultipleTb(Number, Virtual, Invalid, AllProcessors, PtePointer, PteValue) \ 02413 { \ 02414 ULONG _Index_; \ 02415 PVOID _VA_; \ 02416 \ 02417 for (_Index_ = 0; _Index_ < (Number); _Index_ += 1) { \ 02418 if (ARGUMENT_PRESENT(PtePointer)) { \ 02419 KI_FILL_PTE ((((PHARDWARE_PTE *)(PtePointer))[_Index_]), (PteValue)); \ 02420 } \ 02421 _VA_ = (Virtual)[_Index_]; \ 02422 __asm { mov eax, _VA_ } \ 02423 __asm { invlpg [eax] } \ 02424 } \ 02425 } 02426 02427 #else 02428 02429 NTKERNELAPI 02430 VOID 02431 KeFlushEntireTb ( 02432 IN BOOLEAN Invalid, 02433 IN BOOLEAN AllProcessors 02434 ); 02435 02436 VOID 02437 KeFlushMultipleTb ( 02438 IN ULONG Number, 02439 IN PVOID *Virtual, 02440 IN BOOLEAN Invalid, 02441 IN BOOLEAN AllProcesors, 02442 IN PHARDWARE_PTE *PtePointer OPTIONAL, 02443 IN HARDWARE_PTE PteValue 02444 ); 02445 02446 HARDWARE_PTE 02447 KeFlushSingleTb ( 02448 IN PVOID Virtual, 02449 IN BOOLEAN Invalid, 02450 IN BOOLEAN AllProcesors, 02451 IN PHARDWARE_PTE PtePointer, 02452 IN HARDWARE_PTE PteValue 02453 ); 02454 02455 #endif 02456 02457 #if defined(_ALPHA_) || defined(_IA64_) 02458 02459 VOID 02460 KeFlushMultipleTb64 ( 02461 IN ULONG Number, 02462 IN PULONG_PTR Virtual, 02463 IN BOOLEAN Invalid, 02464 IN BOOLEAN AllProcesors, 02465 IN PHARDWARE_PTE *PtePointer OPTIONAL, 02466 IN HARDWARE_PTE PteValue 02467 ); 02468 02469 HARDWARE_PTE 02470 KeFlushSingleTb64 ( 02471 IN ULONG_PTR Virtual, 02472 IN BOOLEAN Invalid, 02473 IN BOOLEAN AllProcesors, 02474 IN PHARDWARE_PTE PtePointer, 02475 IN HARDWARE_PTE PteValue 02476 ); 02477 02478 #endif 02479 02480 BOOLEAN 02481 KeFreezeExecution ( 02482 IN PKTRAP_FRAME TrapFrame, 02483 IN PKEXCEPTION_FRAME ExceptionFrame 02484 ); 02485 02486 KCONTINUE_STATUS 02487 KeSwitchFrozenProcessor ( 02488 IN ULONG ProcessorNumber 02489 ); 02490 02491 VOID 02492 KeGetNonVolatileContextPointers ( 02493 IN PKNONVOLATILE_CONTEXT_POINTERS NonVolatileContext 02494 ); 02495 02496 #define DMA_READ_DCACHE_INVALIDATE 0x1 // nthal 02497 #define DMA_READ_ICACHE_INVALIDATE 0x2 // nthal 02498 #define DMA_WRITE_DCACHE_SNOOP 0x4 // nthal 02499 // nthal 02500 NTKERNELAPI // nthal 02501 VOID // nthal 02502 KeSetDmaIoCoherency ( // nthal 02503 IN ULONG Attributes // nthal 02504 ); // nthal 02505 // nthal 02506 02507 #if defined(i386) 02508 02509 NTKERNELAPI // nthal 02510 VOID // nthal 02511 KeSetProfileIrql ( // nthal 02512 IN KIRQL ProfileIrql // nthal 02513 ); // nthal 02514 // nthal 02515 #endif 02516 02517 #if defined(_ALPHA_) 02518 02519 NTKERNELAPI // nthal 02520 VOID // nthal 02521 KeSetSynchIrql ( // nthal 02522 IN KIRQL SynchIrql // nthal 02523 ); // nthal 02524 // nthal 02525 ULONG 02526 KeReadMbTimeStamp ( 02527 VOID 02528 ); 02529 02530 VOID 02531 KeSynchronizeMemoryAccess ( 02532 VOID 02533 ); 02534 02535 #endif 02536 02537 VOID 02538 KeSetSystemTime ( 02539 IN PLARGE_INTEGER NewTime, 02540 OUT PLARGE_INTEGER OldTime, 02541 IN BOOLEAN AdjustInterruptTime, 02542 IN PLARGE_INTEGER HalTimeToSet OPTIONAL 02543 ); 02544 02545 #define SYSTEM_SERVICE_INDEX 0 02546 #define WIN32K_SERVICE_INDEX 1 02547 #define IIS_SERVICE_INDEX 2 02548 02549 NTKERNELAPI 02550 BOOLEAN 02551 KeAddSystemServiceTable( 02552 IN PULONG_PTR Base, 02553 IN PULONG Count OPTIONAL, 02554 IN ULONG Limit, 02555 IN PUCHAR Number, 02556 IN ULONG Index 02557 ); 02558 02559 // begin_ntddk begin_wdm begin_nthal begin_ntifs 02560 02561 NTKERNELAPI 02562 ULONGLONG 02563 KeQueryInterruptTime ( 02564 VOID 02565 ); 02566 02567 NTKERNELAPI 02568 VOID 02569 KeQuerySystemTime ( 02570 OUT PLARGE_INTEGER CurrentTime 02571 ); 02572 02573 NTKERNELAPI 02574 ULONG 02575 KeQueryTimeIncrement ( 02576 VOID 02577 ); 02578 02579 // end_wdm 02580 NTKERNELAPI 02581 KAFFINITY 02582 KeQueryActiveProcessors ( 02583 VOID 02584 ); 02585 02586 // end_ntddk end_nthal end_ntifs 02587 02588 // begin_nthal 02589 02590 NTKERNELAPI 02591 VOID 02592 KeSetTimeIncrement ( 02593 IN ULONG MaximumIncrement, 02594 IN ULONG MimimumIncrement 02595 ); 02596 02597 // end_nthal 02598 02599 VOID 02600 KeThawExecution ( 02601 IN BOOLEAN Enable 02602 ); 02603 02604 02605 // begin_nthal 02606 02607 // 02608 // Define the firmware routine types 02609 // 02610 02611 typedef enum _FIRMWARE_REENTRY { 02612 HalHaltRoutine, 02613 HalPowerDownRoutine, 02614 HalRestartRoutine, 02615 HalRebootRoutine, 02616 HalInteractiveModeRoutine, 02617 HalMaximumRoutine 02618 } FIRMWARE_REENTRY, *PFIRMWARE_REENTRY; 02619 // end_nthal 02620 02621 02622 VOID 02623 KeReturnToFirmware ( 02624 IN FIRMWARE_REENTRY Routine 02625 ); 02626 02627 VOID 02628 KeStartAllProcessors ( 02629 VOID 02630 ); 02631 02632 // 02633 // Balance set manager thread startup function. 02634 // 02635 02636 VOID 02637 KeBalanceSetManager ( 02638 IN PVOID Context 02639 ); 02640 02641 VOID 02642 KeSwapProcessOrStack ( 02643 IN PVOID Context 02644 ); 02645 02646 // 02647 // User mode callback. 02648 // 02649 02650 NTKERNELAPI 02651 NTSTATUS 02652 KeUserModeCallback ( 02653 IN ULONG ApiNumber, 02654 IN PVOID InputBuffer, 02655 IN ULONG InputLength, 02656 OUT PVOID *OutputBuffer, 02657 OUT PULONG OutputLength 02658 ); 02659 02660 #if defined(_IA64_) 02661 PVOID 02662 KeSwitchKernelStack ( 02663 IN PVOID StackBase, 02664 IN PVOID StackLimit, 02665 IN PVOID BStoreLimit 02666 ); 02667 #else 02668 PVOID 02669 KeSwitchKernelStack ( 02670 IN PVOID StackBase, 02671 IN PVOID StackLimit 02672 ); 02673 #endif // defined(_IA64_) 02674 02675 NTSTATUS 02676 KeRaiseUserException( 02677 IN NTSTATUS ExceptionCode 02678 ); 02679 02680 // begin_nthal 02681 // 02682 // Find ARC configuration information function. 02683 // 02684 02685 NTKERNELAPI 02686 PCONFIGURATION_COMPONENT_DATA 02687 KeFindConfigurationEntry ( 02688 IN PCONFIGURATION_COMPONENT_DATA Child, 02689 IN CONFIGURATION_CLASS Class, 02690 IN CONFIGURATION_TYPE Type, 02691 IN PULONG Key OPTIONAL 02692 ); 02693 02694 NTKERNELAPI 02695 PCONFIGURATION_COMPONENT_DATA 02696 KeFindConfigurationNextEntry ( 02697 IN PCONFIGURATION_COMPONENT_DATA Child, 02698 IN CONFIGURATION_CLASS Class, 02699 IN CONFIGURATION_TYPE Type, 02700 IN PULONG Key OPTIONAL, 02701 IN PCONFIGURATION_COMPONENT_DATA *Resume 02702 ); 02703 // end_nthal 02704 02705 // 02706 // begin_ntddk begin_nthal begin_ntifs 02707 // 02708 // Context swap notify routine. 02709 // 02710 02711 typedef 02712 VOID 02713 (FASTCALL *PSWAP_CONTEXT_NOTIFY_ROUTINE)( 02714 IN HANDLE OldThreadId, 02715 IN HANDLE NewThreadId 02716 ); 02717 02718 NTKERNELAPI 02719 VOID 02720 FASTCALL 02721 KeSetSwapContextNotifyRoutine( 02722 IN PSWAP_CONTEXT_NOTIFY_ROUTINE NotifyRoutine 02723 ); 02724 02725 // 02726 // Thread select notify routine. 02727 // 02728 02729 typedef 02730 LOGICAL 02731 (FASTCALL *PTHREAD_SELECT_NOTIFY_ROUTINE)( 02732 IN HANDLE ThreadId 02733 ); 02734 02735 NTKERNELAPI 02736 VOID 02737 FASTCALL 02738 KeSetThreadSelectNotifyRoutine( 02739 IN PTHREAD_SELECT_NOTIFY_ROUTINE NotifyRoutine 02740 ); 02741 02742 // 02743 // Time update notify routine. 02744 // 02745 02746 typedef 02747 VOID 02748 (FASTCALL *PTIME_UPDATE_NOTIFY_ROUTINE)( 02749 IN HANDLE ThreadId, 02750 IN KPROCESSOR_MODE Mode 02751 ); 02752 02753 NTKERNELAPI 02754 VOID 02755 FASTCALL 02756 KeSetTimeUpdateNotifyRoutine( 02757 IN PTIME_UPDATE_NOTIFY_ROUTINE NotifyRoutine 02758 ); 02759 02760 // end_ntddk end_nthal end_ntifs 02761 02762 // 02763 // External references to public kernel data structures 02764 // 02765 02766 extern KAFFINITY KeActiveProcessors; 02767 extern LARGE_INTEGER KeBootTime; 02768 extern ULONGLONG KeBootTimeBias; 02769 extern ULONGLONG KeInterruptTimeBias; 02770 extern LIST_ENTRY KeBugCheckCallbackListHead; 02771 extern KSPIN_LOCK KeBugCheckCallbackLock; 02772 extern PGDI_BATCHFLUSH_ROUTINE KeGdiFlushUserBatch; 02773 extern PLOADER_PARAMETER_BLOCK KeLoaderBlock; 02774 extern ULONG KeMaximumIncrement; 02775 extern ULONG KeMinimumIncrement; 02776 extern CCHAR KeNumberProcessors; // nthal 02777 extern USHORT KeProcessorArchitecture; 02778 extern USHORT KeProcessorLevel; 02779 extern USHORT KeProcessorRevision; 02780 extern ULONG KeFeatureBits; 02781 extern CCHAR KiFindFirstSetRight[256]; 02782 extern PKPRCB KiProcessorBlock[]; 02783 extern ULONG KiStackProtectTime; 02784 extern KTHREAD_SWITCH_COUNTERS KeThreadSwitchCounters; 02785 02786 #if !defined(NT_UP) 02787 02788 extern ULONG KeRegisteredProcessors; 02789 extern ULONG KeLicensedProcessors; 02790 02791 #endif 02792 02793 extern PULONG KeServiceCountTable; 02794 extern KSERVICE_TABLE_DESCRIPTOR KeServiceDescriptorTable[NUMBER_SERVICE_TABLES]; 02795 extern KSERVICE_TABLE_DESCRIPTOR KeServiceDescriptorTableShadow[NUMBER_SERVICE_TABLES]; 02796 02797 extern volatile KSYSTEM_TIME KeTickCount; // ntddk wdm nthal ntifs 02798 02799 // begin_nthal 02800 02801 #if defined(_ALPHA_) 02802 02803 extern ULONG KeNumberProcessIds; 02804 extern ULONG KeNumberTbEntries; 02805 02806 #endif 02807 02808 extern PVOID KeUserApcDispatcher; 02809 extern PVOID KeUserCallbackDispatcher; 02810 extern PVOID KeUserExceptionDispatcher; 02811 extern PVOID KeRaiseUserExceptionDispatcher; 02812 extern ULONG KeTimeAdjustment; 02813 extern ULONG KeTimeIncrement; 02814 extern BOOLEAN KeTimeSynchronization; 02815 02816 // end_nthal 02817 02818 // begin_ntddk begin_wdm begin_nthal begin_ntifs 02819 02820 typedef enum _MEMORY_CACHING_TYPE_ORIG { 02821 MmFrameBufferCached = 2 02822 } MEMORY_CACHING_TYPE_ORIG; 02823 02824 typedef enum _MEMORY_CACHING_TYPE { 02825 MmNonCached = FALSE, 02826 MmCached = TRUE, 02827 MmWriteCombined = MmFrameBufferCached, 02828 MmHardwareCoherentCached, 02829 MmNonCachedUnordered, // IA64 02830 MmUSWCCached, 02831 MmMaximumCacheType 02832 } MEMORY_CACHING_TYPE; 02833 02834 // end_ntddk end_wdm end_nthal end_ntifs 02835 02836 #if defined(_X86_) 02837 02838 // 02839 // Routine for setting memory type for physical address ranges 02840 // 02841 02842 NTSTATUS 02843 KeSetPhysicalCacheTypeRange ( 02844 IN PHYSICAL_ADDRESS PhysicalAddress, 02845 IN ULONG NumberOfBytes, 02846 IN MEMORY_CACHING_TYPE CacheType 02847 ); 02848 02849 #endif 02850 02851 #if defined(_X86_) 02852 02853 // 02854 // Routine for zeroing a physical page. These are defined 02855 // as calls through a function pointer which is set to point 02856 // at the optimal routine for this processor implementation. 02857 // 02858 02859 typedef 02860 VOID 02861 (FASTCALL *KE_ZERO_PAGE_ROUTINE)( 02862 IN PVOID PageBase 02863 ); 02864 02865 extern KE_ZERO_PAGE_ROUTINE KeZeroPage; 02866 extern KE_ZERO_PAGE_ROUTINE KeZeroPageFromIdleThread; 02867 02868 #endif 02869 02870 #if defined(_IA64_) 02871 VOID 02872 KeEnableSessionSharing( 02873 PREGION_MAP_INFO SessionMapInfo 02874 ); 02875 VOID 02876 KeDetachSessionSpace( 02877 VOID 02878 ); 02879 VOID 02880 KeAddSessionSpace( 02881 PKPROCESS Process, 02882 PREGION_MAP_INFO SessionMapInfo 02883 ); 02884 VOID 02885 KeAttachSessionSpace( 02886 PREGION_MAP_INFO SessionMapInfo 02887 ); 02888 VOID 02889 KeDisableSessionSharing( 02890 PREGION_MAP_INFO SessionMapInfo 02891 ); 02892 #endif 02893 02894 #endif // _KE_ 02895

Generated on Sat May 15 19:40:35 2004 for test by doxygen 1.3.7