




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
象、IO完成端口、可等待定時(shí)器、互斥、事件、信號(hào)量等,這些都是‘可等待’對(duì)象,可用于WaitForSingleObject等函數(shù)。StructKSEMAPHORE{DISPATCHER_HEADERHeader;//公共頭LONGLimit;//最大信號(hào)量個(gè)數(shù)}Struct{…LONGSignalState;//信號(hào)狀態(tài)量(>0表示有信號(hào),<=0表示無信號(hào))LIST_ENTRYWaitListHead;//等待塊隊(duì)列…}INBOOLEertable,//表示本次等待操作是否可被吵醒(即被強(qiáng)制喚醒)INPLARGE_INTEGERTimeOutOPTIONAL)//超時(shí){PVOIDObject,KPROCESSOR_MODEPreviousMode=ExGetPreviousMode();LARGE_INTEGERSafeTimeOut;NTSTATUSif((TimeOut)&&(PreviousMode!={{SafeTimeOut=ProbeForReadLargeInteger(TimeOut);TimeOut=&SafeTimeOut;}{_SEH2_YIELD(return}}Status=if{WaitableObject=OBJECT_TO_OBJECT_HEADER(Object)->Type->DefaultObject;if(IsPointerOffset(WaitableObject))//ifDefaultObject是個(gè)偏移,不是指針{WaitableObject=(PVOID)((ULONG_PTR)Object+}{=}{Status=}}return}#defineIsPointerOffset(Ptr)((LONG)(Ptr)>=如果是個(gè)偏移值,那么DefaultObject值的最為0,否則為1。象記錄在其對(duì)象類型的DefaultObject字段中。較大,函數(shù)也較長(zhǎng)。重要的是對(duì)喚醒原因的理解。(把WaitStatus理解為喚醒原因就好了)NTSTATUS//返回值表示本次睡眠的喚醒原//注意下面的函數(shù)只能在DISPATCH_LEVEL以下調(diào)用,否則藍(lán)屏。(除非Timeout!=NULL&&*Timeout==0)KeWaitForSingleObject(INPVOIDObject,//要等待的‘可直接等待對(duì)象’INKWAIT_REASONWaitReason,//線程上次被切出原INKPROCESSOR_MODEWaitMode,//表示這是來自用戶模式/內(nèi)核模式的等待請(qǐng)求INBOOLEertable,//表示本次等待操作是否可以被強(qiáng)制喚醒INPLARGE_INTEGERTimeoutOPTIONAL)//超時(shí){PKTHREADThread=PKMUTANTCurrentObject(PKMUTANT)Object;//其實(shí)意思是(DISPATCHER_HEADER*)ObjectPKWAIT_BLOCKWaitBlock=&Thread->WaitBlock[0];PKWAIT_BLOCKTimerBlock&Thread->WaitBlock[TIMER_WAIT_BLOCK];PKTIMERTimer=&Thread->Timer;//復(fù)用這個(gè)超時(shí)定時(shí)器NTSTATUSWaitStatus;//其實(shí)表示‘上次喚醒原因’BOOLEANSwappable;//內(nèi)核棧是否可換到外存LARGE_INTEGERDueTimeNewDueTimeInterruptTime;PLARGE_INTEGEROriginalDueTime=Timeout;ULONGHand=if(!Thread->WaitNext)gotoWaitStart;Thread->WaitNextFALSE;//復(fù){=//fir是AP_EVLKiwpontxIntrlPfrq是AP_EECPCif((Thread->ApcState.KernelApcPending)&&!(Thread->SpecialApcDisable)&&(Thread->WaitIrql==PASSIVE_LEVEL)){}1、所等待的對(duì)象有信號(hào)了2、被強(qiáng)制喚醒{if(CurrentObject->Header.Type==MutantObject){if((CurrentObject->Header.SignalState>0)||(Thread==CurrentObject->OwnerThread)){if(CurrentObject->Header.SignalState!={KiSatisfyMutantWait(CurrentObjectThread);WaitStatus=Thread->WaitStatus;//喚醒原因gotoDontWait;//退出函數(shù)}Else異常}}//普通的等待對(duì)象只要DISPATCHER_HEADER頭部中的SignalState0就表示有信號(hào)了elseif(CurrentObject->Header.SignalState>0){WaitStatus=STATUS_WAIT_0;//喚醒原因?yàn)椤鎲拘选痝otoDontWait;退出函}WaitStatusKiCheckAlertability(Thread,AlertableWaitMode);ifWaitStatusSTATUS_WAIT_0)//if強(qiáng)制喚醒了,就break({InterruptTime.QuadPart=if((ULONGLONG)InterruptTime.QuadPart>=Timer-{WaitStatusSTATUS_TIMEOUT;//喚醒原因?yàn)椤瑫r(shí)’gotoDontWait;//退出函數(shù)}Timer->Header.Inserted=}if(Thread->Queue)KiActivateWaiterQueue(Thread->Queue);Thread->State=Waiting;//將線程標(biāo)記為等待狀態(tài)(即睡眠狀態(tài))if(Timeout)
=,1、臨時(shí)喚醒。指被其他線程發(fā)來的內(nèi)核APC臨時(shí)喚醒,要求執(zhí)行緊急APC任務(wù)強(qiáng)if(WaitStatusSTATUS_KERNEL_APC)//if喚醒原因不是臨時(shí)喚醒,就退出函數(shù)了returnWaitStatus;(Timeout=}Thread->WaitIrqlKeRaiseIrqlToSynchLevel();}returnWaitStatus;}typedefstruct_KWAIT_BLOCK{struct_KTHREAD*Thread;//所屬線程struct_KWAIT_BLOCK*NextWaitBlock;//下一個(gè)等待塊(用來掛入線程的等待塊鏈表)USHORTWaitKey;//本等待塊是所屬線程的第幾個(gè)等待對(duì)象UCHARWaitType;//WaitAll/WaitAnyvolatileUCHARBlockState;}KWAIT_BLOCK,*PKWAIT_BLOCK,#defineThread->WaitBlockListWaitBlock;//等待塊鏈表WaitBlock->WaitKey=0;//即等待塊的索引WaitBlock->Object=Object;//要等待的目標(biāo)對(duì)象Thread->WaitStatus=0;//復(fù)位喚醒原因if {}{}
KxSetTimerForThreadWait(Timer,*Timeout,&Hand);//設(shè)置好定時(shí)器對(duì)象DueTime.QuadPart=Timer->DueTime.QuadPart;TimerBlock->NextWaitBlock=WaitBlock;//單循環(huán)鏈表Timer->Header.WaitListHead.Flink=&TimerBlock->WaitListEntry;Timer->Header.WaitListHead.Blink=&TimerBlock-WaitBlock->NextWaitBlockWaitBlock;單循環(huán)鏈Thread->AlertableAlertable;//線程睡眠模式,是否可被提醒(即強(qiáng)制喚醒)Thread->WaitMode=WaitMode;//來自用戶還是內(nèi)核模式的等待請(qǐng)求Thread->WaitReasonWaitReason;上次線程切換原因Thread->WaitListEntry.Flink=NULL;SwappableKiCheckThreadStackSwap(Thread,WaitMode);//檢測(cè)本線程的內(nèi)核棧是否可以換到外存Thread->WaitTime=KeTickCount.Lort;//記錄上次切出時(shí)間的函數(shù)KiCheckThreadStackSwap用來檢測(cè)本線程的內(nèi)核棧是否可以置換到外存BOOLEANKiCheckThreadStackSwap(INPKTHREADThread,INKPROCESSOR_MODE{if((WaitMode==UserMode)&&(Thread->EnableStackSwap)(Thread->Priority>=(LOW_REALTIME_PRIORITY+{}{
returnreturn}}KiCheckAlertability(INPKTHREADINBOOLEertable,//本次睡眠操作是否支持強(qiáng)制喚醒{{{Thread->Alerted[WaitMode]=FALSE;//復(fù)位}elseif((WaitMode!=KernelMode)&&{Thread->ApcState.UserApcPending=}elseif(Thread->Alerted[KernelMode]){Thread->Alerted[KernelMode]=}}elseif((WaitModeKernelMode&&(Thread-{;//}return}不支持強(qiáng)制喚醒,也會(huì)被其他線程發(fā)來的用戶APC給強(qiáng)制搞醒。#defineKiAddThreadToWaitList(Thread,Swappable){if(Swappable)//為什么要滿足這個(gè)條件,我也搞不清InsertTailList(&KeGetCurrentPrcb()->WaitListHead,&Thread->WaitListEntry);}VOIDINKPRIORITYIncrement)//喚醒線程后的優(yōu)先級(jí)增量(以便盡快得到調(diào)度運(yùn)行{PLIST_ENTRYWaitEntry,WaitList;PKWAIT_BLOCKWaitBlock;PKTHREADWaitThread;PKMUTANTFirstObject=ObjectPointer;NTSTATUSWaitStatus;WaitList=&FirstObject->Header.WaitListHead;WaitEntry=WaitList->Flink;while((FirstObject->Header.SignalState>0)&&(WaitEntry!={WaitBlock=CONTAINING_RECORD(WaitEntry,KWAIT_BLOCK,WaitListEntry);WaitThread=WaitBlock->Thread;WaitStatusSTATUS_KERNEL_APC;//模擬給那個(gè)等待者線程發(fā)送內(nèi)核apc而臨時(shí)喚醒它if(WaitBlock->WaitType==WaitAny)//WaitAnt類型的話,肯定滿足分配了{(lán)WaitStatus=(NTSTATUS)WaitBlock->WaitKey;//喚醒原因改為‘真喚醒’,此處即索引}KiUnwaitThread(WaitThread,WaitStatus,Increment);//關(guān)鍵函數(shù)WaitEntry=WaitList->Flink;//下一個(gè)線程}}擬給它發(fā)送內(nèi)核apc方式(其實(shí)沒發(fā)送),臨時(shí)喚醒它,進(jìn)入下輪循環(huán),繼續(xù)測(cè)試它所等待的其他對(duì)象,#defineKiSatisfyObjectWait(Object,{if(Object)->Header.TypeMutantObject)互斥對(duì)象要特殊處{if((Object)->Header.SignalState==0)//if擁有計(jì)數(shù)==0{(Object)->OwnerThread=Thread->KernelApcDisable=Thread->KernelApcDisable-(Object)->ApcDisable;(({(Object)->AbandonedFALSE;//復(fù)=}}}elseif(((Object)->Header.Type&TIMER_OR_EVENT_TYPE)==EventSynchronizationObject)(Object)->Header.SignalState=0;elseif((Object)->Header.Type==}多只是要提醒一下,不管是什么同步對(duì)象,其的SignalState表示信號(hào)狀態(tài)量計(jì)數(shù),當(dāng)該值<=0時(shí)表示01兩種情況的‘特殊信號(hào)量’。VOIDKiUnwaitThread(INPKTHREADThread,//目INLONG_PTRWaitStatus,//喚醒原{,Thread->AdjustIncrementSCHAR)Increment;//上次優(yōu)先級(jí)調(diào)整增量Thread->AdjustReason=AdjustUnwait;//調(diào)整原因}每當(dāng)一個(gè)apc的時(shí)候,將調(diào)用下面的函數(shù)NTSTATUS{if(Thread!={if(ApcMode==KernelMode)//若要給其他線程一個(gè)內(nèi)核{(lán)Thread->ApcState.KernelApcPending=TRUE;if(Thread->State==Running){RequestInterrupt=}elseif((Thread->State==Waiting)&&(Thread->WaitIrql==PASSIVE_LEVEL)!(Thread->SpecialApcDisable)&&(!(Apc->NormalRoutine)||{Status=,,}}elseif((Thread->State==Waiting)&&(Thread->WaitMode==UserMode)&&((Thread->Alertable)||(Thread->ApcState.UserApcPending))){Thread->ApcState.UserApcPending=TRUE;Status=STATUS_USER_APC;}}VOIDKiUnlinkThread(INPKTHREADThread,INNTSTATUS{PKTIMERTimer;Thread->WaitStatus|=WaitStatus;WaitBlock=Thread-{WaitBlock=WaitBlock->NextWaitBlock;}while(WaitBlock!=Thread-if(Thread->WaitListEntry.Flink)RemoveEntryList(&Thread-Timer=&Thread-if(Timer->Header.Inserted)KxRemoveTreeTimer(Timer);if(Thread->Queue)Thread->Queue->CurrentCount++;}LONGKiSwapThread(INPKTHREADCurrentThread,INPKPRCB{BOOLEANApcState=KIRQLWaitIrql;//上次切出時(shí)的irqlLONG_PTRWaitStatus;//上次喚醒原因PKTHREADNextThread;NextThreadPrcb->NextThread;//當(dāng)前的搶占者線程if(NextThread){}{
Prcb->NextThread=Prcb->CurrentThread=NextThread;NextThread->State=Running;NextThreadKiSelectReadyThread(0Prcb);//調(diào)度處一個(gè)if(NextThread){}{}}
Prcb->CurrentThread=NextThread;NextThread->State=Running;InterlockedOr((PLONG)&KiIdleSummary,Prcb->SetMember);NextThread=Prcb->IdleThread;//使用空轉(zhuǎn)線程Prcb->CurrentThread=NextThread;NextThread->State=Running;WaitIrqlCurrentThread->WaitIrql;//記錄上次切出時(shí)的irqlApcState=KiSwapContext(CurrentThread,ifApcState)//切回來后,例行執(zhí)行內(nèi)核{(lán)KiDeliverApc(KernelMode,NULL,NULL);ASSERT(WaitIrql==PASSIVE_LEVEL);}WaitStatusCurrentThread->WaitStatus;//關(guān)鍵。返回該線程上次喚醒的原因returnWaitStatus;}INPVOIDObject[],//等待對(duì)INWAIT_TYPEWaitType,//WaitAll/AitAnyINKWAIT_REASONWaitReason,//上次切換原因INKPROCESSOR_MODEWaitMode,//來自用戶模式/內(nèi)核模式的等待請(qǐng)求INBOOLEertable,//本次等待是否可提醒(指是否可被強(qiáng)制喚醒)INPLARGE_INTEGERTimeoutOPTIONAL,//超時(shí)OUTPKWAIT_BLOCKWaitBlockArrayOPTIONAL)//等待塊數(shù){PKWAIT_BLOCKPKTHREADThread=PKWAIT_BLOCKTimerBlock&Thread->WaitBlock[TIMER_WAIT_BLOCK];//定時(shí)器等待塊是固定的PKTIMERTimer=&Thread->Timer;NTSTATUSWaitStatus=BOOLEANPLARGE_INTEGEROriginalDueTime=Timeout;LARGE_INTEGERDueTime,NewDueTime,InterruptTime;ULONGIndex,Hand=0;WaitBlockArray=&Thread->WaitBlock[0];ifThread->WaitNextgotoWaitStart;//首輪循環(huán)從WaitStart處開始Thread->WaitNext=FALSE;for(;;){{{Thread->Preempted=if((Thread->ApcState.KernelApcPending)&&!(Thread->SpecialApcDisable)&&(Thread->WaitIrql<APC_LEVEL)){}{
Index=if(WaitType=={{CurrentObject=if(CurrentObject->Header.Type=={if((CurrentObject->Header.SignalState>0)||(Thread==CurrentObject->OwnerThread)){if(CurrentObject->Header.SignalState!={}{}}}
KiSatisfyMutantWait(CurrentObject,Thread);WaitStatus=Thread->WaitStatus|Index;gotoDontWait;//只要滿足一個(gè)就退出函數(shù)elseif(CurrentObject->Header.SignalState>{WaitStatus=Index;}}while(Index<}Else{CurrentObject=if(CurrentObject->Header.Type=={if((Thread==CurrentObject->OwnerThread)&&(CurrentObject->Header.SignalState==(LONG)MINLONG)){}elseif((CurrentObject->Header.SignalState<=0)&&(Thread!=CurrentObject->OwnerThread)){}}elseif(CurrentObject->Header.SignalState<={//}}while(Index<if(IndexCount)//if所有對(duì)象都有信號(hào){WaitBlock=WaitBlockArray;{CurrentObject=(PKMUTANT)WaitBlock->Object;KiSatisfyObjectWait(CurrentObject,Thread);WaitBlock=WaitBlock->NextWaitBlock;}while(WaitBlock!=WaitStatusThread->WaitStatus;//喚醒原因?yàn)椤鎲拘选愋蚲otoDontWait;}}WaitStatus=KiCheckAlertability(Thread,Alertable,WaitMode);if(WaitStatus!=STATUS_WAIT_0)break;if{InterruptTime.QuadPart=if((ULONGLONG)InterruptTime.QuadPart>=Timer-WaitStatus=STATUS_TIMEOUT;gotoDontWait;}Timer->Header.Inserted=TRUE;WaitBlock->NextWaitBlock=TimerBlock;}WaitBlock=WaitBlockArray;{CurrentObject=WaitBlock-WaitBlock=WaitBlock->NextWaitBlock;}while(WaitBlock!=if(Thread->Queue)KiActivateWaiterQueue(Thread->Queue);Thread->State=Waiting;KiAddThreadToWaitList(Thread,Swappable);if}
WaitStatus=KiSwapThread(Thread,喚醒原if(WaitStatus!=STATUS_KERNEL_APC)returnif(Timeout)Timeout=Thread->WaitIrql=KeRaiseIrqlToSynchLevel();}returnWaitStatus;return}#defineThread->WaitBlockList=WaitBlockArray;Index=0;{WaitBlock=&WaitBlockArray[Index];WaitBlock->Object=Object[Index];WaitBlock->WaitKey(USHORT)Index;//關(guān)鍵WaitBlock->WaitTypeWaitType;//所有等待塊的等待類型都相同WaitBlock->Thread=Thread;WaitBlock->NextWaitBlock=&WaitBlockArray[Index+1];}while(Index<WaitBlock->NextWaitBlockWaitBlockArray;單循環(huán)鏈表Thread->WaitStatus=STATUS_WAIT_0;if{TimerBlock->NextWaitBlock=WaitBlockArray;KxSetTimerForThreadWait(Timer,*Timeout,&Hand);DueTime.QuadPart=Timer->DueTime.QuadPart;}Thread->AlertableAlertable;//是否可被強(qiáng)制喚Thread->WaitModeWaitMode;//來自用戶模式/內(nèi)核模式的等待請(qǐng)求Thread->WaitReason=WaitReason;//上次被切原因Thread->WaitListEntry.Flink=Swappable=KiCheckThreadStackSwap(Thread,typedefstructDISPATCHER_HEADERHeader;//公共頭部LONGLimit;//信號(hào)量的最大信號(hào)個(gè)}KSEMAPHORE,NtCreateSemaphore(OUTPHANDLESemaphoreHandle,//返回信號(hào)量對(duì)象的句柄INACCESS_MASKDesiredAccess,INPOBJECT_ATTRIBUTESObjectAttributesOPTIONAL,//信號(hào)量的名稱及其他屬性INLONGInitialCount,//信號(hào)量的初始信號(hào)個(gè)數(shù)INLONGumCount)//支持的最大信號(hào)個(gè){HANDLEKPROCESSOR_MODEPreviousMode=ExGetPreviousMode();NTSTATUSStatus;if(PreviousMode!={{}{_SEH2_YIELD(return}}if((umCount<=0)||(InitialCount<0)||(InitialCount>umCount))returnSTATUS_INVALID_PARAMETER;NULL,sizeof(KSEMAPHORE),0,0,(PVOID*)&Semaphore);if{ Status=ObInsertObject((PVOID)Semaphore,NULL,DesiredAccess,0,NULL,&hSemaphore);if(NT_SUCCESS(Status)){{*SemaphoreHandle=}{Status=}}}return}KeInitializeSemaphore(INPKSEMAPHORESemaphore,INLONGCount,INLONG{sizeof(KSEMAPHORE)/Semaphore->Limit=}#defineKeInitializeDispatcherHeader(Header,t,s, (Header)->Type= (Header)->Absolute= (Header)->Size= (Header)->Inserted= (Header)->SignalState=State;//初始信號(hào)個(gè)數(shù) }當(dāng)SignalState減到0時(shí),就需要等待其他線程釋放信號(hào)量。NtReleaseSemaphore(INHANDLEINLONGReleaseCount,//一次可以釋放多個(gè)信號(hào)量,這將一次喚醒多個(gè)線程OUTPLONGPreviousCountOPTIONAL)//返回之前的信號(hào)個(gè)數(shù){KPROCESSOR_MODEPreviousMode=ExGetPreviousMode();PKSEMAPHORESemaphore;NTSTATUSif((PreviousCount)&&(PreviousMode!={{}{_SEH2_YIELD(return}}if(ReleaseCount<=returnStatus=if{
{LONGPrevCount=if(PreviousCount)*PreviousCount=PrevCount;}{Status=}}return}KeReleaseSemaphore(INPKSEMAPHOREINKPRIORITYIncrement,//優(yōu)先級(jí)增INBOOLEAN{LONGInitialState,State;KIRQLOldIrql;PKTHREADCurrentThread;OldIrql=InitialState=Semaphore->Header.SignalState;StateInitialStateAdjustment;//一次增加N個(gè)信號(hào)if((Semaphore->Limit<State)||Adjustment<0)){}Semaphore->Header.SignalState=if(!(InitialState)&&!(IsListEmpty(&Semaphore->Header.WaitListHead)))KiWaitTest(&Semaphore->Header,Increment);if(Wait==FALSE){}
CurrentThread=KeGetCurrentThread();CurrentThread->WaitNext=TRUE;CurrentThread->WaitIrql=OldIrql;return}用typedefstruct_KMUTANT{struct_KTHREAD*RESTRICTED_POINTEROwnerThread;//關(guān)鍵。當(dāng)前擁有者線程BOOLEANAbandoned;//是否被擁有者線程因意外終止而拋棄了}KMUTANT,*PKMUTANT,KMUTEX,*PKMUTEX;KeInitializeMutant(INPKMUTANT{KIRQLOldIrql;if{}
CurrentThread=KeGetCurrentThread();Mutant->OwnerThreadCurrentThread;//看OldIrql=KiAcquireDispatcherLock();Mutant->OwnerThread=sizeof(KMUTANT)/InitialOwner01);//初始對(duì)外信號(hào)個(gè)數(shù)為0或者M(jìn)utant->Abandoned=Mutant->ApcDisable=}NtReleaseMutant(INHANDLEINPLONGPreviousCount{PKMUTANTKPROCESSOR_MODEPreviousMode=ExGetPreviousMode();NTSTATUSStatus;if((PreviousCount)&&(PreviousMode!={{}{_SEH2_YIELD(return}}Status=PreviousMode,if{{LONGPrev=KeReleaseMutant(Mutant,MUTANT_INCREMENT,FALSE,FALSE);if(PreviousCount)*PreviousCount=Prev;}{Status=}}return}KeReleaseMutant(INPKMUTANTINKPRIORITYINBOOLEANAbandon,//是否是因?yàn)榫€程意外終止而拋棄的INBOOLEANWait){KIRQLOldIrql;PKTHREADCurrentThread=KeGetCurrentThread();BOOLEANEnableApc=FALSE;OldIrql=PreviousStateMutant->Header.SignalState;//先前的擁有計(jì)數(shù)if(Abandon==FALSE)//最典型{if(Mutant->OwnerThread!={ExRaiseStatus(Mutant->Abandoned?STATUS_ABANDONED}}{}
Mutant->Header.SignalState1;//復(fù)位成1,表示直接對(duì)外有信號(hào)Mutant->Abandoned=TRUE;//標(biāo)記為被擁有者線程意外拋棄了if(Mutant->Header.SignalState1)//如果該互斥對(duì)象變得對(duì)其他線程可用{ifPreviousState0)//若是正常釋放的互斥對(duì)象(非意外終止原因{EnableApc=Mutant->ApcDisable;}Mutant->OwnerThreadNULL不再有擁有者線程了ifIsListEmpty(&Mutant-,}if(Wait==FALSE){}
CurrentThread->WaitNext=TRUE;CurrentThread->WaitIrql=OldIrql;if(EnableApc)KeLeaveCriticalRegion();returnPreviousState;}層的WaiFor操作就會(huì)一直阻塞,等待外層的WaitFor操作釋放互斥對(duì)象,這樣就會(huì)死鎖。KeSetEvent(INPKEVENTINKPRIORITYIncrement,INBOOLEANWait){KIRQLOldIrql;PKTHREADThread;{return}OldIrql=KiAcquireDispatcherLock();PreviousState=Event->Header.SignalState;Event->Header.SignalState1;//置為有信號(hào)狀(!(!({if(Event->Header.TypeEventNotificationObject)醒所有正在等待的線KxUnwaitThread(&Event->Header,Increment);KxUnwaitThreadForEvent(Event,}if{Thread=KeGetCurrentThread();Thread->WaitNext=TRUE;Thread->WaitIrql=OldIrql;}return}LONGKeResetEvent(INPKEVENT{KIRQLLONGPreviousState;OldIrql=KiAcquireDispatcherLock();PreviousState=Event->Header.SignalState;Event->Header.SignalState0;//復(fù)位成無信號(hào)狀態(tài)return}#define*(OldIrql)= 義為unsignedint64。VOIDKeInitializeSpinLock(outPKSPIN_LOCKSpinLock{*SpinLock=}INPKSPIN_LOCKOUTPKIRQL);INPKSPIN_LOCKINKIRQL *(OldIrql)= 翻forceinlineKeAcquireSpinLockRaiseToDpc(inoutPKSPIN_LOCK{KIRQLOldIr
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025標(biāo)準(zhǔn)裝修合同模板
- 2025房屋租賃代理合同
- 2025探討房屋租賃合同中的優(yōu)先購(gòu)買權(quán)
- 跨境電商平臺(tái)發(fā)展戰(zhàn)略與市場(chǎng)規(guī)劃
- 健康教育在學(xué)校中的重要性計(jì)劃
- 制定健康管理的實(shí)施方案計(jì)劃
- 建立有效的離職管理流程計(jì)劃
- 教育行業(yè)開發(fā)在線學(xué)習(xí)平臺(tái)計(jì)劃
- 主管年度工作計(jì)劃的創(chuàng)新和創(chuàng)業(yè)機(jī)會(huì)
- 河北省新樂市第一中學(xué)高中政治 2.2 價(jià)格變動(dòng)的影響教學(xué)設(shè)計(jì) 新人教版必修1
- 職業(yè)高中高二上學(xué)期期末英語試題卷(含答案)1697
- 2022河南大學(xué)版四年級(jí)信息技術(shù)下冊(cè)全冊(cè)教案
- 《格林童話》讀書分享ppt
- DNA的粗提取和鑒定(香蕉)
- 2023年大學(xué)生創(chuàng)業(yè)的商業(yè)計(jì)劃書模板(四篇)
- GA 137-2007消防梯
- 通用報(bào)價(jià)單模板
- 血精的診治課件
- 考研考博-英語-北京建筑大學(xué)考試押題三合一+答案詳解4
- 《三角形的分類》-完整版課件
- 吊裝安全心得體會(huì)(6篇)
評(píng)論
0/150
提交評(píng)論