锘??xml version="1.0" encoding="utf-8" standalone="yes"?>欧美影院在线,欧美不卡视频一区,国产精品高潮呻吟http://www.shnenglu.com/shaker/category/2564.htmlshaker's Blog<br>鐢熷綋浣滀漢鏉幫紝姝諱害涓洪闆勶紝鑷充粖鎬濋」緹斤紝涓嶈偗榪囨睙涓溿?/description>zh-cnWed, 28 Dec 2011 11:59:44 GMTWed, 28 Dec 2011 11:59:44 GMT60Relocate SVNhttp://www.shnenglu.com/shaker/archive/2011/12/28/162978.htmlshaker(澶瓙)shaker(澶瓙)Wed, 28 Dec 2011 05:59:00 GMThttp://www.shnenglu.com/shaker/archive/2011/12/28/162978.htmlhttp://www.shnenglu.com/shaker/comments/162978.htmlhttp://www.shnenglu.com/shaker/archive/2011/12/28/162978.html#Feedback0http://www.shnenglu.com/shaker/comments/commentRss/162978.htmlhttp://www.shnenglu.com/shaker/services/trackbacks/162978.html鍦ㄥ伐紼嬬殑鏍圭洰褰曢噷寤轟竴涓猻vn鐩綍錛岀劧鍚庡湪svn鐩綍閲屽垱寤轟竴涓増鏈簱錛岀敤svn媯鍑轟竴涓嬨?br />榪欐牱榪欎釜宸ョ▼灝卞彲浠ヨsvn綆$悊浜嗐?br />浣嗘槸濡傛灉鏁翠釜宸ョ▼琚Щ鍔ㄨ繃浜嗭紝閭d箞svn灝變細鍑洪敊錛屼簬鏄啓浜嗕釜灝忕▼搴忔潵閲嶅畾浣嶏紝浠庢鍙互鎶婂伐紼嬫斁鍦╱鐩樺甫鐫鍒板璺戜簡銆?br />
  1 #include "stdafx.h"
  2 
  3 using namespace std;
  4 
  5 void AlertError(DWORD err)
  6 {
  7     LPVOID lpMsgBuf;
  8     LPVOID lpDisplayBuf;
  9     
 10     FormatMessage(
 11         FORMAT_MESSAGE_ALLOCATE_BUFFER | 
 12         FORMAT_MESSAGE_FROM_SYSTEM |
 13         FORMAT_MESSAGE_IGNORE_INSERTS,
 14         NULL,
 15         err,
 16         MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
 17         (LPTSTR) &lpMsgBuf,
 18         0, NULL );
 19     
 20     lpDisplayBuf = (LPVOID)LocalAlloc(LMEM_ZEROINIT, 
 21         strlen((char*)lpMsgBuf) + 40); 
 22     sprintf((char*)lpDisplayBuf,"閿欒鐮? %d\n淇°鎭? %s", err,lpMsgBuf);
 23     MessageBox(NULL, (LPCTSTR)lpDisplayBuf, "閿欒", MB_OK|MB_ICONERROR); 
 24     
 25     LocalFree(lpMsgBuf);
 26     LocalFree(lpDisplayBuf);
 27 }
 28 
 29 void GetCommandOutput(char* CmdLine, string& strOutput, bool IncludeErr=false)
 30 {
 31     strOutput="";
 32     SECURITY_ATTRIBUTES  sa;
 33     HANDLE hRead, hWrite;
 34     memset(&sa,0,sizeof(sa));
 35     sa.nLength=sizeof(sa);
 36     sa.bInheritHandle=TRUE;
 37     sa.lpSecurityDescriptor=NULL;
 38     if(CreatePipe(&hRead,&hWrite,&sa,0))
 39     {
 40         STARTUPINFO si;
 41         memset(&si,0,sizeof(si));
 42         si.cb=sizeof(si);
 43         si.hStdOutput=hWrite;
 44         si.hStdInput=GetStdHandle(STD_INPUT_HANDLE);
 45         si.hStdError=(IncludeErr?hWrite:GetStdHandle(STD_ERROR_HANDLE));
 46         si.dwFlags=STARTF_USESTDHANDLES|STARTF_USESHOWWINDOW;
 47         si.wShowWindow=SW_HIDE;
 48         
 49         PROCESS_INFORMATION pi;
 50         if(CreateProcess(NULL,CmdLine,&sa,&sa,TRUE,CREATE_NO_WINDOW|NORMAL_PRIORITY_CLASS,
 51             NULL,NULL,&si,&pi))
 52         {
 53             char szBuf[512];
 54             DWORD dwReaded;
 55             if(WaitForSingleObject(pi.hProcess,INFINITE)!=WAIT_TIMEOUT)
 56             {
 57                 CloseHandle(hWrite);
 58                 while(ReadFile(hRead,szBuf,511,&dwReaded,NULL))
 59                 {
 60                     szBuf[dwReaded]='\0';
 61                     strOutput+=szBuf;
 62                 }
 63             }
 64             else
 65             {
 66                 cout<<"WaitForSingleObject閿欒;"<<endl;
 67                 CloseHandle(hWrite);
 68                 AlertError(GetLastError());
 69             }
 70             CloseHandle(pi.hThread);
 71             CloseHandle(pi.hProcess);
 72         }
 73         else
 74         {
 75             cout<<"寤虹珛榪涚▼閿欒;"<<endl;
 76             AlertError(GetLastError());
 77         }
 78         CloseHandle(hRead);
 79     }
 80     else
 81     {
 82         cout<<"寤虹珛綆¢亾閿欒;"<<endl;
 83         AlertError(GetLastError());
 84     }
 85 }
 86 
 87 int APIENTRY WinMain(HINSTANCE hInstance,
 88                      HINSTANCE hPrevInstance,
 89                      LPSTR     lpCmdLine,
 90                      int       nCmdShow)
 91 {
 92     char szBuf[MAX_PATH+20];
 93     wchar_t wcBuf[MAX_PATH];
 94     int i, j;
 95     string msg;
 96     
 97     GetCommandOutput("svn info --xml",msg);
 98     TiXmlDocument *doc = new TiXmlDocument();
 99     doc->Parse(msg.c_str());
100     TiXmlNode *node;
101     node=doc->FirstChild("info");
102     if(node==NULL)
103     {
104         MessageBox(NULL,"褰撳墠鐩綍娌℃湁琚玈VN","緇撴灉",MB_OK|MB_ICONINFORMATION);
105         return 0;
106     }
107     node=node->FirstChild("entry");
108     if(node==NULL)
109     {
110         MessageBox(NULL,"褰撳墠鐩綍娌℃湁琚玈VN","緇撴灉",MB_OK|MB_ICONINFORMATION);
111         return 0;
112     }
113     node=node->FirstChild("wc-info");
114     if(node==NULL)
115     {
116         MessageBox(NULL,"褰撳墠鐩綍娌℃湁琚玈VN","緇撴灉",MB_OK|MB_ICONINFORMATION);
117         return 0;
118     }
119     node=node->FirstChild("wcroot-abspath");
120     if(node==NULL)
121     {
122         MessageBox(NULL,"褰撳墠鐩綍娌℃湁琚玈VN","緇撴灉",MB_OK|MB_ICONINFORMATION);
123         return 0;
124     }
125     strcpy(szBuf,node->ToElement()->GetText());
126     delete node;
127     delete doc;
128 
129     j=strlen(szBuf);
130     i=MultiByteToWideChar(CP_UTF8,0,szBuf,j,wcBuf,MAX_PATH);
131     wcBuf[i]=static_cast<wchar_t>(0);
132     strcpy(szBuf,"svn relocate file:///");
133     j=strlen(szBuf);
134     i=WideCharToMultiByte(CP_ACP,0,wcBuf,i,&szBuf[j],MAX_PATH,NULL,NULL);
135     szBuf[i+j]=static_cast<char>(0);
136     SetCurrentDirectory(&szBuf[j]);
137 
138     i+=j;
139     if((szBuf[i-1]=='\\')||(szBuf[i-1]=='/'))
140         strcat(szBuf,"svn/");
141     else
142         strcat(szBuf,"/svn/");
143     for(i=0,j=strlen(szBuf);i<j;i++)
144     {
145         if(szBuf[i]=='\\')
146             szBuf[i]='/';
147     }
148 
149     GetCommandOutput(szBuf,msg,true);
150     MessageBox(NULL,msg.c_str(),"緇撴灉",MB_OK);
151 
152     return 0;
153 }


]]>
鍙堟槸涓涓狝PIHOOKhttp://www.shnenglu.com/shaker/archive/2011/07/31/152142.htmlshaker(澶瓙)shaker(澶瓙)Sun, 31 Jul 2011 07:21:00 GMThttp://www.shnenglu.com/shaker/archive/2011/07/31/152142.htmlhttp://www.shnenglu.com/shaker/comments/152142.htmlhttp://www.shnenglu.com/shaker/archive/2011/07/31/152142.html#Feedback0http://www.shnenglu.com/shaker/comments/commentRss/152142.htmlhttp://www.shnenglu.com/shaker/services/trackbacks/152142.html闃呰鍏ㄦ枃

]]>
[zt] Windows APC鏈哄埗http://www.shnenglu.com/shaker/archive/2011/05/05/145733.htmlshaker(澶瓙)shaker(澶瓙)Thu, 05 May 2011 04:09:00 GMThttp://www.shnenglu.com/shaker/archive/2011/05/05/145733.htmlhttp://www.shnenglu.com/shaker/comments/145733.htmlhttp://www.shnenglu.com/shaker/archive/2011/05/05/145733.html#Feedback0http://www.shnenglu.com/shaker/comments/commentRss/145733.htmlhttp://www.shnenglu.com/shaker/services/trackbacks/145733.html寮傛榪囩▼璋冪敤(APCs) 鏄疦T寮傛澶勭悊浣撶郴緇撴瀯涓殑涓涓熀紜閮ㄥ垎錛岀悊瑙d簡瀹冿紝瀵逛簬浜嗚ВNT鎬庢牱鎿嶄綔鍜屾墽琛屽嚑涓牳蹇冪殑緋葷粺鎿嶄綔寰堟湁甯姪銆?/p>

1) APCs鍏佽鐢ㄦ埛紼嬪簭鍜岀郴緇熷厓浠跺湪涓涓繘紼嬬殑鍦板潃絀洪棿鍐呮煇涓嚎紼嬬殑涓婁笅鏂囦腑鎵ц浠g爜銆?br>2) I/O綆$悊鍣ㄤ嬌鐢ˋPCs鏉ュ畬鎴愪竴涓嚎紼嬪彂璧風殑寮傛鐨処/O鎿嶄綔銆備緥濡傦細褰撲竴涓澶囬┍鍔ㄨ皟鐢↖oCompleteRequest鏉ラ氱煡I/O綆$悊鍣紝瀹冨凡緇忕粨鏉熷鐞嗕竴涓紓姝/O璇鋒眰鏃訛紝I/O綆$悊鍣ㄦ帓闃熶竴涓猘pc鍒板彂璧瘋姹傜殑綰跨▼銆傜劧鍚庣嚎紼嬪湪涓涓緝浣嶪RQL綰у埆錛屾潵鎵цAPC. APC鐨勪綔鐢ㄦ槸浠庣郴緇熺┖闂存嫹璐滻/O鎿嶄綔緇撴灉鍜岀姸鎬佷俊鎭埌綰跨▼铏氭嫙鍐呭瓨絀洪棿鐨勪竴涓紦鍐蹭腑銆?br>3) 浣跨敤APC鍙互寰楀埌鎴栬呰緗竴涓嚎紼嬬殑涓婁笅鏂囧拰鎸傝搗綰跨▼鐨勬墽琛屻?/p>

涓婇潰鏄綉涓婃壘鏉ョ殑錛屼笅闈㈡槸MSDN涓婄殑璇存槑錛?/p>


An asynchronous procedure call (APC) is a function that executes asynchronously in the context of a particular thread. When an APC is queued to a thread, the system issues a software interrupt. The next time the thread is scheduled, it will run the APC function. An APC generated by the system is called a kernel-mode APC. An APC generated by an application is called a user-mode APC. A thread must be in an alertable state to run a user-mode APC.

Each thread has its own APC queue. An application queues an APC to a thread by calling the QueueUserAPC function. The calling thread specifies the address of an APC function in the call to QueueUserAPC. The queuing of an APC is a request for the thread to call the APC function.

榪樺厛鐪嬩竴涓嬮偅浜涢噸瑕佺粨鏋勶細

kd> dt KTHREAD
nt!KTHREAD
+0x000 Header : _DISPATCHER_HEADER
+0x010 MutantListHead : _LIST_ENTRY
+0x018 InitialStack : Ptr32 Void
+0x01c StackLimit : Ptr32 Void
+0x020 KernelStack : Ptr32 Void
+0x024 ThreadLock : Uint4B
+0x028 ApcState : _KAPC_STATE
+0x028 ApcStateFill : [23] UChar
+0x03f ApcQueueable : UChar
+0x040 NextProcessor : UChar
+0x041 DeferredProcessor : UChar
+0x042 AdjustReason : UChar
+0x043 AdjustIncrement : Char
+0x044 ApcQueueLock : Uint4B
+0x048 ContextSwitches : Uint4B
+0x04c State : UChar
+0x04d NpxState : UChar
+0x04e WaitIrql : UChar
+0x04f WaitMode : Char
+0x050 WaitStatus : Int4B
+0x054 WaitBlockList : Ptr32 _KWAIT_BLOCK
+0x054 GateObject : Ptr32 _KGATE
+0x058 Alertable : UChar
+0x059 WaitNext : UChar
+0x05a WaitReason : UChar
+0x05b Priority : Char
+0x05c EnableStackSwap : UChar
+0x05d SwapBusy : UChar
+0x05e Alerted : [2] UChar
+0x060 WaitListEntry : _LIST_ENTRY
+0x060 SwapListEntry : _SINGLE_LIST_ENTRY
+0x068 Queue : Ptr32 _KQUEUE
+0x06c WaitTime : Uint4B
+0x070 KernelApcDisable : Int2B
+0x072 SpecialApcDisable : Int2B
+0x070 CombinedApcDisable : Uint4B
+0x074 Teb : Ptr32 Void
+0x078 Timer : _KTIMER
+0x078 TimerFill : [40] UChar
+0x0a0 AutoAlignment : Pos 0, 1 Bit
+0x0a0 DisableBoost : Pos 1, 1 Bit
+0x0a0 ReservedFlags : Pos 2, 30 Bits
+0x0a0 ThreadFlags : Int4B
+0x0a8 WaitBlock : [4] _KWAIT_BLOCK
+0x0a8 WaitBlockFill0 : [23] UChar
+0x0bf SystemAffinityActive : UChar
+0x0a8 WaitBlockFill1 : [47] UChar
+0x0d7 PreviousMode : Char
+0x0a8 WaitBlockFill2 : [71] UChar
+0x0ef ResourceIndex : UChar
+0x0a8 WaitBlockFill3 : [95] UChar
+0x107 LargeStack : UChar
+0x108 QueueListEntry : _LIST_ENTRY
+0x110 TrapFrame : Ptr32 _KTRAP_FRAME
+0x114 CallbackStack : Ptr32 Void
+0x118 ServiceTable : Ptr32 Void
+0x11c ApcStateIndex : UChar
+0x11d IdealProcessor : UChar
+0x11e Preempted : UChar
+0x11f ProcessReadyQueue : UChar
+0x120 KernelStackResident : UChar
+0x121 BasePriority : Char
+0x122 PriorityDecrement : Char
+0x123 Saturation : Char
+0x124 UserAffinity : Uint4B
+0x128 Process : Ptr32 _KPROCESS
+0x12c Affinity : Uint4B
+0x130 ApcStatePointer : [2] Ptr32 _KAPC_STATE
+0x138 SavedApcState : _KAPC_STATE
+0x138 SavedApcStateFill : [23] UChar
+0x14f FreezeCount : Char
+0x150 SuspendCount : Char
+0x151 UserIdealProcessor : UChar
+0x152 CalloutActive : UChar
+0x153 Iopl : UChar
+0x154 Win32Thread : Ptr32 Void
+0x158 StackBase : Ptr32 Void
+0x15c SuspendApc : _KAPC
+0x15c SuspendApcFill0 : [1] UChar
…………

…………

涓婇潰綰㈣壊閮ㄥ垎鏄疉PC鏈哄埗鐢ㄥ埌鐨勫嚑涓瓧孌碉紒錛?/p>

kd> dt _KAPC_STATE
nt!_KAPC_STATE
+0x000 ApcListHead : [2] _LIST_ENTRY錛屾瘡涓寚閽堟寚鍚慱KAPC緇撴瀯
+0x010 Process : Ptr32 _KPROCESS
+0x014 KernelApcInProgress : UChar
+0x015 KernelApcPending : UChar
+0x016 UserApcPending : UChar

鏄劇劧錛岃繖閲岀殑 ApcListHead 灝辨槸 APC 闃熷垪澶淬備笉榪囪繖鏄釜澶у皬涓?2 鐨勬暟緇勶紝璇存槑瀹為檯
涓?姣忎釜綰跨▼)鏈変袱涓?APC 闃熷垪銆傝繖鏄洜涓?APC 鍑芥暟鍒嗕負鐢ㄦ埛 APC 鍜屽唴鏍?APC 涓ょ錛屽悇鏈?br>鍚勭殑闃熷垪銆傛墍璋撶敤鎴?APC錛屾槸鎸囩浉搴旂殑 APC 鍑芥暟浣嶄簬鐢ㄦ埛絀洪棿銆佸湪鐢ㄦ埛絀洪棿鎵ц錛涜屽唴鏍?br>APC錛屽垯鐩稿簲鐨?APC 鍑芥暟涓哄唴鏍稿嚱鏁般?/p>

SavedApcState涔熸槸涓猒KAPC_STATE緇撴瀯錛屽綋褰撳墠紼嬫殏鏃?#8220;鎸傞潬(Attach)”鍒板彟涓涓繘紼嬬殑鍦板潃絀洪棿鐨勬椂渚紝ApcState灝辨嫹璐濆埌SavedApcState鏆傛椂瀛樻斁錛?/p>

褰撶劧錛岃繕瑕佹湁鐘舵佷俊鎭鏄庢湰綰跨▼褰撳墠鏄浜?#8220;鍘熷鐜”榪樻槸“鎸傞潬鐜”錛岃繖灝辨槸 ApcStateIndex 鐨勪綔鐢紝浠g爜涓負 ApcStateIndex鐨勫煎畾涔変簡涓縐嶆灇涓劇被鍨嬶細

typedef enum _KAPC_ENVIRONMENT {
OriginalApcEnvironment,
AttachedApcEnvironment,
CurrentApcEnvironment,
InsertApcEnvironment
} KAPC_ENVIRONMENT;

瀹為檯鍙敤浜?ApcStateIndex 鐨勫彧鏄?OriginalApcEnvironment鍜?AttachedApcEnvironment銆?/p>

KAPC_STATE 鎸囬拡鏁扮粍 ApcStatePointer[2]錛屽氨鐢ˋpcStateIndex 鐨勫綋鍓嶅間綔涓轟笅鏍囷紝鑰屾暟緇勪腑鐨勬寚閽堝垯鏍規嵁鎯呭喌鍙互鍒嗗埆鎸囧悜涓や釜APC_STATE 鏁版嵁緇撴瀯涓殑涓涓?/p>

kd> dt _KAPC ;APC瀵硅薄
nt!_KAPC
+0x000 Type : UChar
+0x001 SpareByte0 : UChar
+0x002 Size : UChar
+0x003 SpareByte1 : UChar
+0x004 SpareLong0 : Uint4B
+0x008 Thread : Ptr32 _KTHREAD
+0x00c ApcListEntry : _LIST_ENTRY
+0x014 KernelRoutine : Ptr32 void
+0x018 RundownRoutine : Ptr32 void
+0x01c NormalRoutine : Ptr32 void
+0x020 NormalContext : Ptr32 Void
+0x024 SystemArgument1 : Ptr32 Void
+0x028 SystemArgument2 : Ptr32 Void
+0x02c ApcStateIndex : Char
+0x02d ApcMode : Char
+0x02e Inserted : UChar

KernelRoutine銆丷undownRoutine銆丯ormalRoutine銆傚叾涓彧鏈?NormalRoutine鎵嶆寚鍚?鎵ц)APC 鍑芥暟鐨勮姹傝呮墍鎻愪緵鐨勫嚱鏁幫紝鍏朵綑涓や釜閮芥槸杈呭姪鎬х殑錛?/p>

NTKERNELAPI
VOID
KeInitializeApc (
__out PRKAPC Apc,
__in PRKTHREAD Thread,
__in KAPC_ENVIRONMENT Environment,
__in PKKERNEL_ROUTINE KernelRoutine,
__in_opt PKRUNDOWN_ROUTINE RundownRoutine,
__in_opt PKNORMAL_ROUTINE NormalRoutine,
__in_opt KPROCESSOR_MODE ProcessorMode,
__in_opt PVOID NormalContext
);

榪欎釜鍑芥暟涓昏鐢ㄦ潵鍒濆鍖朅pc錛坃KAPC錛夎繖涓粨鏋勭殑錛屽鏋淓nvironment==CurrentApcEnvironment,Apc->ApcStateIndex灝辯敱KTHREAD涓殑ApcStateIndex鍐沖畾錛屼絾Environment涓嶈兘澶т簬KTHREAD涓殑ApcStateIndex錛?/p>

鏈鍚庯紝APC 璇鋒眰鐨勬ā寮廝rocessorMode錛屼絾鏄湁涓緥澶栵紝閭e氨鏄細濡傛灉鎸囬拡NormalRoutine 涓?0錛岄偅涔堝疄闄呯殑妯″紡鍙樻垚浜?KernelMode銆傝繖鏄洜涓哄湪榪欑鎯呭喌涓嬫病鏈夌敤鎴風┖闂碅PC鍑芥暟鍙互鎵ц錛?鍞竴灝嗗緱鍒版墽琛岀殑鏄疜ernelRoutine錛?/p>

鏈鍚庯紝KeInitializeApc 璁劇疆Inserted鍩熶負FALSE銆傜劧鑰屽垵濮嬪寲APC瀵硅薄錛屽茍娌℃湁鎶婂畠瀛樻斁鍒扮浉搴旂殑APC闃熷垪涓?/p>


NTKERNELAPI
BOOLEAN
KeInsertQueueApc (
__inout PRKAPC Apc,
__in_opt PVOID SystemArgument1,
__in_opt PVOID SystemArgument2,
__in KPRIORITY Increment
);

鎹瓵PC璇鋒眰鐨勫叿浣撴儏鍐碉紝鏈夋椂鍊欒鎻掑湪闃熷垪鐨勫墠澶達紝涓鑸垯鎸傚湪闃熷垪鐨勫熬閮ㄣ?/p>

_KiServiceExit:

cli ; disable interrupts
DISPATCH_USER_APC ebp, ReturnCurrentEax

;
; Exit from SystemService
;

EXIT_ALL NoRestoreSegs, NoRestoreVolatile ;榪欎釜瀹忎互鍚庡啀璁?/p>

DISPATCH_USER_APC macro TFrame, ReturnCurrentEax
local a, b, c
c:
.errnz (EFLAGS_V86_MASK AND 0FF00FFFFh)

test byte ptr [TFrame]+TsEflags+2, EFLAGS_V86_MASK/010000h ; is previous mode v86?
jnz short b ; if nz, yes, go check for APC
test byte ptr [TFrame]+TsSegCs,MODE_MASK ; is previous mode user mode?
jz a ; No, previousmode=Kernel, jump out
b: mov ebx, PCR[PcPrcbData+PbCurrentThread]; get addr of current thread
mov byte ptr [ebx]+ThAlerted, 0 ; clear kernel mode alerted
cmp byte ptr [ebx]+ThApcState.AsUserApcPending, 0
je a ; if eq, no user APC pending

mov ebx, TFrame
ifnb <ReturnCurrentEax>;鏉′歡瀹忔眹緙栵紝濡傛灉ReturnCurrentEax鍙傛暟涓嶄負絀猴紝鍒欑紪璇戯紒

;DISPATCH_USER_APC ebp, ReturnCurrentEax錛屾樉鐒惰繖閲屾槸緙栬瘧鐨勶紒
mov [ebx].TsEax, eax ; Store return code in trap frame
mov dword ptr [ebx]+TsSegFs, KGDT_R3_TEB OR RPL_MASK
mov dword ptr [ebx]+TsSegDs, KGDT_R3_DATA OR RPL_MASK
mov dword ptr [ebx]+TsSegEs, KGDT_R3_DATA OR RPL_MASK
mov dword ptr [ebx]+TsSegGs, 0
endif

;
; Save previous IRQL and set new priority level
;
RaiseIrql APC_LEVEL
push eax ; Save OldIrql

sti ; Allow higher priority ints

;
; call the APC delivery routine.
;
; ebx - Trap frame
; 0 - Null exception frame
; 1 - Previous mode
;
; call APC deliver routine
;

stdCall _KiDeliverApc, <1, 0, ebx> ;1灝辨槸UserMode

pop ecx ; (ecx) = OldIrql
LowerIrql ecx

ifnb <ReturnCurrentEax> ;鍚屼笂鍒嗘瀽
mov eax, [ebx].TsEax ; Restore eax, just in case
endif

cli
jmp b ; 娉ㄦ剰榪欎釜寰幆錛侊紒

ALIGN 4
a:
endm

榪欐浠g爜涓昏媯鏌ワ細

鍗沖皢榪斿洖鐨勬槸鍚︾敤鎴風┖闂淬?br>鏄惁鏈夌敤鎴稟PC璇鋒眰姝e湪絳夊緟鎵ц

鏉′歡絎﹀悎鎵嶇敤KiDeliverApc鐪熸鎶曢扐PC銆傛敞鎰忎唬鐮乯mp b錛屽ソ鍍忓湪榪斿洖鐢ㄦ埛絀洪棿鍓岾iDeliverApc浼氳寰幆璋冪敤鐩村埌娌℃湁user APC錛屽叾瀹炰笉鏄殑錛孠iDeliverApc姣忓鐞嗗畬涓涓猆ser APC灝辨妸UserApcPending娓呴浂錛屾墍浠ser APCs鍦ㄨ繑鍥炵敤鎴風┖闂存椂榪樻槸鍙兘鎶曢掍竴嬈★紒KiDeliverApc涓敤while澶勭悊瀹屾墍鏈塊ernel Mode APCs錛屼絾User Mode APC鍗村彧澶勭悊涓涓紒浜嬪疄涓奤ser APC鐨勬姇閫掓槸寰堢壒孌婄殑錛屼互鍚庝細璁插埌錛岃屼笖姣忔鍙兘鎶曢掍竴嬈★紒


鍓嶉潰璁茶繃錛孠THREAD 涓湁涓や釜 KAPC_STATE 鏁版嵁緇撴瀯錛屼竴涓槸 ApcState錛屽彟涓涓槸SavedApcState錛屼簩鑰呴兘鏈堿PC 闃熷垪錛屼絾鏄鎶曢掔殑鍙槸ApcState 涓殑闃熷垪銆?/p>

KiDeliverApc (
IN KPROCESSOR_MODE PreviousMode,//鍐欐垚DeliverMode涓嶆槸鏇村ソ
IN PKEXCEPTION_FRAME ExceptionFrame,//榪欎釜鍙傛暟鍑犱箮灝辨槸0
IN PKTRAP_FRAME TrapFrame
)

榪欎釜鍑芥暟閲岄潰榪樻瘮杈冨鏉傦紝浠g爜涓嶅笘浜嗐?/p>

鍙傛暟PreviousMode琛ㄧず闇瑕?#8220;鎶曢?#8221;鍝竴縐?APC錛屽彲浠ユ槸UserMode錛屼篃鍙互鏄疜ernelMode銆備笉榪囷紝KernelMode 紜疄琛ㄧず鍙姹傛墽琛屽唴鏍?APC錛岃孶serMode 鍗磋〃紺哄湪鎵ц鍐呮牳 APC 涔嬪鍐嶆墽琛岀敤鎴稟PC銆?/p>

The Windows operating system uses three kinds of APCs:


User APCs run strictly in user mode and only when the current thread is in an alertable wait state. The operating system uses user APCs to implement mechanisms such as overlapped I/O and the QueueUserApc Win32 routine. 錛坮un IRQL = PASSIVE_LEVEL錛?br>Normal kernel APCs run in kernel mode at IRQL = PASSIVE_LEVEL. A normal kernel APC preempts all user-mode code, including user APCs. Normal kernel APCs are generally used by file systems and file-system filter drivers.
Special kernel APCs run in kernel mode at IRQL = APC_LEVEL. A special kernel APC preempts user-mode code and kernel-mode code that executes at IRQL = PASSIVE_LEVEL, including both user APCs and normal kernel APCs. The operating system uses special kernel APCs to handle operations such as I/O request completion.
浠庝唬鐮佺殑瑙掑害鐪嬫槸榪欐牱鐨勶細

User APCs
_KAPC.ApcMode==UserMode,_KAPC.KernelRoutine!=NULL,_KAPC.NormolRoutine!=NULL

Normal kernel APCs

_KAPC.ApcMode==KernelMode,_KAPC.KernelRoutine!=NULL,_KAPC.NormolRoutine!=NULL

Special kernel APCs

_KAPC.ApcMode==KernelMode,_KAPC.KernelRoutine!=NULL,_KAPC.NormolRoutine==NULL

鏈変竴鐐瑰畠浠殑_KAPC.KernelRoutine鑲畾涓嶄負絀恒傚茍涓旓紝濡傛灉NormolRoutine涔熶笉涓虹┖錛岄偅涔圞ernelRoutine閮藉湪NormolRoutine琚皟鐢ㄥ墠琚皟鐢紒錛?/p>

涓婃枃涓鍒版姇閫扷ser Mode APCs鏄緢鐗規畩鐨勶紝閬撶悊寰堢畝鍗曪紝鍥犱負User Mode APC鏄痳ing3涓嬬殑鍥炶皟鍑芥暟錛屾樉鐒秗ing0涓殑KiDeliverAPC錛堬級涓嶈兘鍍廗ernel Mode APC閭f牱鐩存帴call錛屽繀欏昏鍏堝洖鍒皉ing3鐜涓嬨傚綋鐒朵笉鑳藉儚鏅氭儏鍐甸偅鏍瘋繑鍥烇紙鍚﹀垯灝卞洖鍒皉ing3緋葷粺璋冪敤鐨勫湴鏂逛簡錛夛紝鍙湁涓涓姙娉曪紝閭e氨鏄慨鏀筎rapFrame 錛屾楠楃郴緇熻繑鍥?#8220;APC鍥炶皟鍑芥暟”錛並iInitializeUserApc灝辨槸榪欎箞鍋氱殑錛?/p>

璇ュ嚱鏁伴鍏堟妸TrapFrame杞寲涓篊ontextFrame錛岀劧鍚庣Щ鍔ㄧ敤鎴鋒丒SP鎸囬拡錛屽垎閰嶅ぇ綰izeof錛圕ONTEXT錛?sizeof錛圞APC_RECORD錛変釜瀛楄妭:

UserStack-> ……

KAPC_RECORD

……

……

CONTEXT

TopOfStack-> ……

KAPC_RECORD灝辨槸KiInitializeUserApc鐨勬渶鍚庡洓涓弬鏁?/p>

nt!_KAPC_RECORD

+0x000 NormalRoutine : Ptr32 void

+0x004 NormalContext : Ptr32 Void

+0x008 SystemArgument1 : Ptr32 Void

+0x00c SystemArgument2 : Ptr32 Void

CONTEXT緇撴瀯涓昏鏉ュ瓨鏀捐淇敼鍓嶇殑TrapFrame錛屼箣鎵浠ョ敤CONTEXT緇撴瀯鏄窡APC鍑芥暟榪斿洖鏈夊叧錛?/p>

TrapFrame->HardwareEsp = UserStack;

TrapFrame->Eip = (ULONG)KeUserApcDispatcher;

TrapFrame->ErrCode = 0;

浠庝笂闈㈢殑浠g爜鐪嬪埌紜疄淇敼浜員rapFrame錛屽茍涓旇繑鍥炲埌鐨勬槸ring3涓嬬殑KeUserApcDispatcher錛屽垰鎵嶈鐨刜KAPC_RECORD鍏跺疄涔熸槸瀹冪殑鍙傛暟錛佺湡姝f垜浠殑User APC鍥炶皟鍑芥暟鏄敱KeUserApcDispatcher璋冪敤鐨勶紒

.func KiUserApcDispatcher@16

.globl _KiUserApcDispatcher@16

_KiUserApcDispatcher@16:

/* Setup SEH stack */

lea eax, [esp+CONTEXT_ALIGNED_SIZE+16]

mov ecx, fs:[TEB_EXCEPTION_LIST]

mov edx, offset _KiUserApcExceptionHandler

mov [eax], ecx

mov [eax+4], edx

/* Enable SEH */

mov fs:[TEB_EXCEPTION_LIST], eax

/* Put the Context in EDI */

pop eax

lea edi, [esp+12]

/* Call the APC Routine */

call eax

/* Restore exception list */

mov ecx, [edi+CONTEXT_ALIGNED_SIZE]

mov fs:[TEB_EXCEPTION_LIST], ecx

/* Switch back to the context */

push 1 ; TestAlert

push edi ;edi->CONTEXT緇撴瀯

call _ZwContinue@8

;;涓嶄細榪斿洖鍒拌繖閲岀殑

涓婇潰鐨勪唬鐮佸茍涓嶉毦鐞嗚В錛屾垜浠殑User APC鍥炶皟鍑芥暟榪斿洖鍚庯紝绔嬪嵆璋冪敤浜哯wContinue錛岃繖鏄釜ntdll涓殑瀵煎嚭鍑芥暟錛岃繖涓嚱鏁板張閫氳繃緋葷粺璋冪敤榪涘叆kernel涓殑NtContinue錛?/p>

NTSTATUS

; NtContinue (

; IN PCONTEXT ContextRecord,

; IN BOOLEAN TestAlert

; )

;

; Routine Description:

;

; This routine is called as a system service to continue execution after

; an exception has occurred. Its function is to transfer information from

; the specified context record into the trap frame that was built when the

; system service was executed, and then exit the system as if an exception

; had occurred.

;

; WARNING - Do not call this routine directly, always call it as

; ZwContinue!!! This is required because it needs the

; trapframe built by KiSystemService.

;

; Arguments:

;

; KTrapFrame (ebp+0: after setup) -> base of KTrapFrame

;

; ContextRecord (ebp+8: after setup) = Supplies a pointer to a context rec.

;

; TestAlert (esp+12: after setup) = Supplies a boolean value that specifies

; whether alert should be tested for the previous processor mode.

;

; Return Value:

;

; Normally there is no return from this routine. However, if the specified

; context record is misaligned or is not accessible, then the appropriate

; status code is returned.

;

;--

NcTrapFrame equ [ebp + 0]

NcContextRecord equ [ebp + 8]

NcTestAlert equ [ebp + 12]

align dword

cPublicProc _NtContinue ,2

push ebp ;ebp->TrapFrame

;

; Restore old trap frame address since this service exits directly rather

; than returning.

;

mov ebx, PCR[PcPrcbData+PbCurrentThread] ; get current thread address

mov edx, [ebp].TsEdx ; restore old trap frame address

mov [ebx].ThTrapFrame, edx ;

;

; Call KiContinue to load ContextRecord into TrapFrame. On x86 TrapFrame

; is an atomic entity, so we don't need to allocate any other space here.

;

; KiContinue(NcContextRecord, 0, NcTrapFrame)

;

mov ebp,esp

mov eax, NcTrapFrame

mov ecx, NcContextRecord

stdCall _KiContinue, <ecx, 0, eax>

or eax,eax ; return value 0?

jnz short Nc20 ; KiContinue failed, go report error

;

; Check to determine if alert should be tested for the previous processor mode.

;

cmp byte ptr NcTestAlert,0 ; Check test alert flag

je short Nc10 ; if z, don't test alert, go Nc10

mov al,byte ptr [ebx]+ThPreviousMode ; No need to xor eax, eax.

stdCall _KeTestAlertThread, <eax> ; test alert for current thread

;濡傛灉User APCs涓嶄負絀猴紝瀹冧細璁劇疆UserApcPending,

;璺烝lertable鏃犲叧

Nc10: pop ebp ; (ebp) -> TrapFrame

mov esp,ebp ; (esp) = (ebp) -> trapframe

jmp _KiServiceExit2 ; common exit

Nc20: pop ebp ; (ebp) -> TrapFrame

mov esp,ebp ; (esp) = (ebp) -> trapframe

jmp _KiServiceExit ; common exit

stdENDP _NtContinue

NtContinue鎶奀ONTEXT緇撴瀯杞寲鎴怲rapFrame錛堝洖澶嶅師鏉ョ殑闄烽槺甯э級錛岀劧鍚庡氨浠嶬iServiceExit2澶勯鍑虹郴緇熻皟鐢紒

;++

;

; _KiServiceExit2 - same as _KiServiceExit BUT the full trap_frame

; context is restored

;

;--

public _KiServiceExit2

_KiServiceExit2:

cli ; disable interrupts

DISPATCH_USER_APC ebp

;

; Exit from SystemService

;

EXIT_ALL ; RestoreAll

KiServiceExit2璺烱iServiceExit宸笉澶氾紝鍙槸瀹忓弬鏁扮殑涓嶅悓!鍚屾牱濡傛灉榪樻湁User APC鍙堜細榪涘叆涓婃枃鎻忚堪鐨勬儏褰紝鐩村埌娌℃湁User APC錛岃嚦姝ゆ墠浼氳繑鍥炵湡姝e彂璧峰師濮嬬郴緇熻皟鐢ㄧ殑鍦版柟錛?/p>


鏈枃鏉ヨ嚜CSDN鍗氬錛岃漿杞借鏍囨槑鍑哄錛?a >http://blog.csdn.net/better0332/archive/2009/06/29/4306683.aspx



]]>
[zt]璋堣皥瀵笰PC鐨勪竴鐐圭悊瑙?/title><link>http://www.shnenglu.com/shaker/archive/2011/05/05/145731.html</link><dc:creator>shaker(澶瓙)</dc:creator><author>shaker(澶瓙)</author><pubDate>Thu, 05 May 2011 03:46:00 GMT</pubDate><guid>http://www.shnenglu.com/shaker/archive/2011/05/05/145731.html</guid><wfw:comment>http://www.shnenglu.com/shaker/comments/145731.html</wfw:comment><comments>http://www.shnenglu.com/shaker/archive/2011/05/05/145731.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/shaker/comments/commentRss/145731.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/shaker/services/trackbacks/145731.html</trackback:ping><description><![CDATA[<span style="WIDOWS: 2; TEXT-TRANSFORM: none; TEXT-INDENT: 0px; LETTER-SPACING: normal; BORDER-COLLAPSE: separate; FONT: 16px Arial,Microsoft Yahei,Simsun,sans-serif; WHITE-SPACE: normal; ORPHANS: 2; COLOR: rgb(83,100,130); WORD-SPACING: 0px; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px" class=Apple-style-span><span style="LINE-HEIGHT: 18px; FONT-FAMILY: 'Lucida Grande', 'Trebuchet MS', Verdana, Helvetica, Arial, sans-serif; COLOR: rgb(51,51,51); FONT-SIZE: 13px" class=Apple-style-span>寮傛榪囩▼璋冪敤(APCs) 鏄疦T寮傛澶勭悊浣撶郴緇撴瀯涓殑涓涓熀紜閮ㄥ垎錛岀悊瑙d簡瀹冿紝瀵逛簬浜嗚ВNT鎬庢牱鎿嶄綔鍜屾墽琛屽嚑涓牳蹇冪殑緋葷粺鎿嶄綔寰堟湁甯姪銆?br style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px"><br style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px">1) APCs鍏佽鐢ㄦ埛紼嬪簭鍜岀郴緇熷厓浠跺湪涓涓繘紼嬬殑鍦板潃絀洪棿鍐呮煇涓嚎紼嬬殑涓婁笅鏂囦腑鎵ц浠g爜銆?br style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px">2) I/O綆$悊鍣ㄤ嬌鐢ˋPCs鏉ュ畬鎴愪竴涓嚎紼嬪彂璧風殑寮傛鐨処/O鎿嶄綔銆備緥濡傦細褰撲竴涓澶囬┍鍔ㄨ皟鐢↖oCompleteRequest鏉ラ氱煡I/O綆$悊鍣紝瀹冨凡緇忕粨鏉熷鐞嗕竴涓紓姝/O璇鋒眰鏃訛紝I/O綆$悊鍣ㄦ帓闃熶竴涓猘pc鍒板彂璧瘋姹傜殑綰跨▼銆傜劧鍚庣嚎紼嬪湪涓涓緝浣嶪RQL綰у埆錛屾潵鎵цAPC. APC鐨勪綔鐢ㄦ槸浠庣郴緇熺┖闂存嫹璐滻/O鎿嶄綔緇撴灉鍜岀姸鎬佷俊鎭埌綰跨▼铏氭嫙鍐呭瓨絀洪棿鐨勪竴涓紦鍐蹭腑銆?br style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px">3) 浣跨敤APC鍙互寰楀埌鎴栬呰緗竴涓嚎紼嬬殑涓婁笅鏂囧拰鎸傝搗綰跨▼鐨勬墽琛屻?br style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px"><br style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px">灝界APCs鍦╪t浣撶郴緇撴瀯涓嬭騫挎硾浣跨敤錛屼絾鏄叧浜庢庢牱浣跨敤瀹冪殑鏂囨。鍗撮潪甯哥殑緙轟箯銆傛湰綃囨垜浠緇嗕粙緇嶄笅nt緋葷粺鏄庢牱澶勭悊APCs鐨勶紝騫朵笖璁板綍瀵煎嚭鐨刵t鍑芥暟錛屾柟渚胯澶囬┍鍔ㄥ紑鍙戣呭湪浠栦滑鐨勭▼搴忎腑浣跨敤APCs銆傛垜涔熶細灞曠ず涓涓潪甯稿彲闈犵殑NT鐨凙PC璋冨害瀛愮▼搴廗iDeliverApc鐨勫疄鐜幫紝鏉ュ府鍔╀綘鏇村ソ鐨勬帉鎻PC璋冨害鐨勫唴騫曘?br style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px"><br style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px">APC瀵硅薄<br style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px"><br style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px">鍦∟T涓紝鏈変袱縐嶇被鍨嬬殑APCs錛氱敤鎴鋒ā寮忓拰鍐呮牳妯″紡銆傜敤鎴稟PCs榪愯鍦ㄧ敤鎴鋒ā寮忎笅鐩爣綰跨▼褰撳墠涓婁笅鏂囦腑錛屽茍涓旈渶瑕佷粠鐩爣綰跨▼寰楀埌璁稿彲鏉ヨ繍琛屻傜壒鍒槸錛岀敤鎴鋒ā寮忕殑APCs闇瑕佺洰鏍囩嚎紼嬪鍦╝lertable絳夊緟鐘舵佹墠鑳借鎴愬姛鐨勮皟搴︽墽琛屻傞氳繃璋冪敤涓嬮潰浠繪剰涓涓嚱鏁幫紝閮藉彲浠ヨ綰跨▼榪涘叆榪欑鐘舵併傝繖浜涘嚱鏁版槸錛欿eWaitForSingleObject, KeWaitForMultipleObjects, KeWaitForMutexObject, KeDelayExecutionThread銆?br style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px">瀵逛簬鐢ㄦ埛妯″紡涓嬶紝鍙互璋冪敤鍑芥暟SleepEx, SignalObjectAndWait, WaitForSingleObjectEx, WaitForMultipleObjectsEx,MsgWaitForMultipleObjectsEx 閮藉彲浠ヤ嬌鐩爣綰跨▼澶勪簬alertable絳夊緟鐘舵侊紝浠庤岃鐢ㄦ埛妯″紡APCs鎵ц,鍘熷洜鏄繖浜涘嚱鏁版渶緇堥兘鏄皟鐢ㄤ簡鍐呮牳涓殑KeWaitForSingleObject, KeWaitForMultipleObjects, KeWaitForMutexObject, KeDelayExecutionThread絳夊嚱鏁般傚彟澶栭氳繃璋冪敤涓涓湭鍏紑鐨刟lert-test鏈嶅姟KeTestAlertThread錛岀敤鎴風嚎紼嬪彲浠ヤ嬌鐢ㄦ埛妯″紡APCs鎵ц銆?br style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px"><br style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px">褰撲竴涓敤鎴鋒ā寮廇PC琚姇閫掑埌涓涓嚎紼嬶紝璋冪敤涓婇潰鐨勭瓑寰呭嚱鏁幫紝濡傛灉榪斿洖絳夊緟鐘舵丼TATUS_USER_APC錛屽湪榪斿洖鐢ㄦ埛妯″紡鏃訛紝鍐呮牳杞幓鎺у埗APC渚嬬▼錛屽綋APC渚嬬▼瀹屾垚鍚庯紝鍐嶇戶緇嚎紼嬬殑鎵ц.<br style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px"><br style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px">鍜岀敤鎴鋒ā寮廇PCs姣旇緝錛屽唴鏍告ā寮廇PCs鎵ц鍦ㄥ唴鏍告ā寮忎笅銆傚彲浠ヨ鍒掑垎涓哄父瑙勭殑鍜岀壒孌婄殑涓ょ被銆傚綋APCs琚姇閫掑埌涓涓壒孌婄殑綰跨▼錛岀壒孌婄殑鍐呮牳妯″紡APCs涓嶉渶瑕佷粠綰跨▼寰楀埌璁稿彲鏉ヨ繍琛屻傜劧鑰岋紝甯歌鐨勫唴鏍告ā寮廇PCs鍦ㄤ粬浠垚鍔熸墽琛屽墠錛岄渶瑕佹湁鐗瑰畾鐨勭幆澧冦傛澶栵紝鐗規畩鐨勫唴鏍窤PC琚敖鍙兘蹇湴鎵ц錛屾棦鍙APC_LEVEL綰т笂鏈夊彲璋冨害鐨勬椿鍔ㄣ傚湪寰堝鎯呭喌涓嬶紝鐗規畩鐨勫唴鏍窤PC鐢氳嚦鑳藉敜閱掗樆濉炵殑綰跨▼銆傛櫘閫氱殑鍐呮牳APC浠呭湪鎵鏈夌壒孌夾PC閮借鎵ц瀹岋紝騫朵笖鐩爣綰跨▼浠嶅湪榪愯錛屽悓鏃惰綰跨▼涓篃娌℃湁鍏跺畠鍐呮牳妯″紡APC姝f墽琛屾椂鎵嶆墽琛屻傜敤鎴鋒ā寮廇PC鍦ㄦ墍鏈夊唴鏍告ā寮廇PC鎵ц瀹屽悗鎵嶆墽琛岋紝騫朵笖浠呭湪鐩爣綰跨▼鏈塧lertable灞炴ф椂鎵嶆墽琛屻?br style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px"><br style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px">姣忎竴涓瓑寰呮墽琛岀殑APC閮藉瓨鍦ㄤ簬涓涓嚎紼嬫墽琛屼綋錛岀敱鍐呮牳綆$悊鐨勯槦鍒椾腑銆傜郴緇熶腑鐨勬瘡涓涓嚎紼嬮兘鍖呭惈涓や釜APC闃熷垪錛屼竴涓槸涓虹敤鎴鋒ā寮廇PCs,鍙︿竴涓槸涓哄唴鏍告ā寮廇PCs鐨勩?br style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px">NT閫氳繃涓涓垚涓篕APC鐨勫唴鏍告帶鍒跺璞℃潵鎻忚堪涓涓肌錛幫跡錛庡敖綆★激錛わ極涓病鏈夋槑紜殑鏂囨。鍖栵肌錛幫跡锝擄紝浣嗘槸鍦∟TDDK.H涓嵈闈炲父娓呮鐨勫畾涔変簡錛★及錛e璞°備粠涓嬮潰鐨凨APC瀵硅薄鐨勫畾涔夌湅錛屾湁浜涙槸涓嶉渶瑕佽鏄庣殑銆傚儚Type鍜孲ize銆俆ype琛ㄧず浜嗚繖鏄竴涓狝PC鍐呮牳瀵硅薄銆傚湪nt涓紝姣忎竴涓唴鏍稿璞℃垨鑰呮墽琛屼綋瀵硅薄閮芥湁Type鍜孲ize榪欎袱涓煙銆傜敱姝ゅ鐞嗗嚱鏁板彲浠ョ‘瀹氬綋鍓嶅鐞嗙殑瀵硅薄銆係ize琛ㄧず涓涓瓧瀵歸綈鐨勭粨鏋勪綋鐨勫ぇ灝忋備篃灝辨槸鎸囨槑浜嗗璞″崰鐨勫唴瀛樼┖闂村ぇ灝忋係pare0鐪嬭搗鏉ユ湁浜涙櫐娑╅毦鎳傦紝浣嗘槸瀹冩槸娌$敤浠涔堜換浣曟繁榪滅殑鎰忎箟錛屼粎浠呮槸涓轟簡鍐呭瓨琛ラ綈銆傚叾浠栫殑鍩熷皢鍦ㄤ笅闈㈢殑綃囧箙涓粙緇嶃?br style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px"><br style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px">//-------------------------------------------------------------------------------------------------------<br style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px"><br style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px">鍑犱釜鍑芥暟澹版槑鍜岀粨鏋勫畾涔夛細<br style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px"><br style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px">typedef struct _KAPC {<br style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px">CSHORT Type;<br style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px">CSHORT Size;<br style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px">ULONG Spare0;<br style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px">struct _KTHREAD *Thread;<br style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px">LIST_ENTRY ApcListEntry;<br style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px">PKKERNEL_ROUTINE KernelRoutine;<br style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px">PKRUNDOWN_ROUTINE RundownRoutine;<br style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px">PKNORMAL_ROUTINE NormalRoutine;<br style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px">PVOID NormalContext;<br style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px">//<br style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px">// N.B. The following two members MUST be together.<br style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px">//<br style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px">PVOID SystemArgument1;<br style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px">PVOID SystemArgument2;<br style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px">CCHAR ApcStateIndex;<br style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px">KPROCESSOR_MODE ApcMode;<br style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px">BOOLEAN Inserted;<br style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px">} KAPC, *PKAPC, *RESTRICTED_POINTER PRKAPC;<br style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px">//------<br style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px"><br style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px">APC鐜<br style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px"><br style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px">涓涓嚎紼嬪湪瀹冩墽琛岀殑浠繪剰鏃跺埢錛屽亣璁懼綋鍓嶇殑IRQL鏄湪Passive綰э紝瀹冨彲鑳介渶瑕佷復鏃跺湪鍏朵粬鐨勮繘紼嬩笂涓嬫枃涓墽琛屼唬鐮侊紝涓轟簡瀹屾垚榪欎釜鎿嶄綔錛岀嚎紼嬭皟鐢ㄧ郴緇熷姛鑳藉嚱鏁癒eAttachProcess錛屽湪浠庤繖涓皟鐢ㄨ繑鍥炴椂錛岀嚎紼嬫墽琛屽湪鍙︿竴涓繘紼嬬殑鍦板潃絀洪棿銆傚厛鍓嶆墍鏈夊湪綰跨▼鑷繁鐨勮繘紼嬩笂涓嬫枃涓瓑寰呮墽琛岀殑APCs,鐢變簬榪欐椂鍏舵墍灞炶繘紼嬬殑鍦板潃絀洪棿涓嶆槸褰撳墠鍙敤鐨勶紝鍥犳浠栦滑涓嶈兘琚姇閫掓墽琛屻傜劧鑰岋紝鏂扮殑鎻掑叆鍒拌繖涓嚎紼嬬殑APCs鍙互鎵ц鍦ㄨ繖涓柊鐨勮繘紼嬬┖闂淬傜敋鑷沖綋綰跨▼鏈鍚庝粠鏂扮殑榪涚▼涓垎紱繪椂錛屾柊鐨勬彃鍏ュ埌榪欎釜綰跨▼鐨凙PCs榪樺彲浠ュ湪榪欎釜綰跨▼鎵灞炵殑榪涚▼涓婁笅鏂囦腑鎵ц銆?br style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px">涓轟簡杈懼埌鎺у埗APC浼犻佺殑榪欎釜紼嬪害錛孨T涓瘡涓嚎紼嬬淮鎶や簡涓や釜APC鐜鎴栬呰鏄姸鎬併傛瘡涓涓狝PC鐜鍖呭惈浜嗙敤鎴鋒ā寮忕殑APC闃熷垪鍜屽唴鏍告ā寮忕殑APC闃熷垪錛屼竴涓寚鍚戝綋鍓嶈繘紼嬪璞$殑鎸囬拡鍜屼笁涓帶鍒跺彉閲忥紝鐢ㄤ簬鎸囧嚭錛氭槸鍚︽湁鏈喅鐨勫唴鏍告ā寮廇PCs(KernelApcPending),鏄惁鏈夊父瑙勫唴鏍告ā寮廇PC鍦ㄨ繘琛屼腑(KernelApcInProgress)錛屾槸鍚︽湁鏈喅鐨勭敤鎴鋒ā寮忕殑APC(UserApcPending). 榪欎簺APC鐨勭幆澧冧繚瀛樺湪綰跨▼瀵硅薄鐨凙pcStatePointer鍩熶腑銆傝繖涓煙鏄敱2涓厓绱犵粍鎴愮殑鏁扮粍銆傚嵆錛?0x138 ApcStatePointer : [2] Ptr32 _KAPC_STATE<br style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px"><br style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px">typedef struct _KAPC_STATE {<br style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px">LIST_ENTRY ApcListHead[MaximumMode];<br style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px">struct _KPROCESS *Process;<br style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px">BOOLEAN KernelApcInProgress;<br style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px">BOOLEAN KernelApcPending;<br style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px">BOOLEAN UserApcPending;<br style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px">} KAPC_STATE, *PKAPC_STATE, *PRKAPC_STATE;<br style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px"><br style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px">lkd> dt _kthread<br style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px">ntdll!_KTHREAD<br style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px">+0x000 Header : _DISPATCHER_HEADER<br style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px">+0x010 MutantListHead : _LIST_ENTRY<br style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px">+0x018 InitialStack : Ptr32 Void<br style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px">+0x01c StackLimit : Ptr32 Void<br style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px">+0x020 Teb : Ptr32 Void<br style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px">+0x024 TlsArray : Ptr32 Void<br style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px">+0x028 KernelStack : Ptr32 Void<br style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px">+0x02c DebugActive : UChar<br style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px">+0x02d State : UChar<br style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px">+0x02e Alerted : [2] UChar<br style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px">+0x030 Iopl : UChar<br style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px">+0x031 NpxState : UChar<br style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px">+0x032 Saturation : Char<br style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px">+0x033 Priority : Char<br style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px">+0x034 ApcState : _KAPC_STATE<br style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px">+0x04c ContextSwitches : Uint4B<br style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px">+0x050 IdleSwapBlock : UChar<br style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px">+0x051 Spare0 : [3] UChar<br style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px">+0x054 WaitStatus : Int4B<br style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px">+0x058 WaitIrql : UChar<br style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px">+0x059 WaitMode : Char<br style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px">+0x05a WaitNext : UChar<br style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px">+0x05b WaitReason : UChar<br style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px">+0x05c WaitBlockList : Ptr32 _KWAIT_BLOCK<br style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px">+0x060 WaitListEntry : _LIST_ENTRY<br style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px">+0x060 SwapListEntry : _SINGLE_LIST_ENTRY<br style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px">+0x068 WaitTime : Uint4B<br style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px">+0x06c BasePriority : Char<br style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px">+0x06d DecrementCount : UChar<br style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px">+0x06e PriorityDecrement : Char<br style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px">+0x06f Quantum : Char<br style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px">+0x070 WaitBlock : [4] _KWAIT_BLOCK<br style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px">+0x0d0 LegoData : Ptr32 Void<br style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px">+0x0d4 KernelApcDisable : Uint4B<br style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px">+0x0d8 UserAffinity : Uint4B<br style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px">+0x0dc SystemAffinityActive : UChar<br style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px">+0x0dd PowerState : UChar<br style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px">+0x0de NpxIrql : UChar<br style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px">+0x0df InitialNode : UChar<br style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px">+0x0e0 ServiceTable : Ptr32 Void<br style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px">+0x0e4 Queue : Ptr32 _KQUEUE<br style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px">+0x0e8 ApcQueueLock : Uint4B<br style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px">+0x0f0 Timer : _KTIMER<br style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px">+0x118 QueueListEntry : _LIST_ENTRY<br style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px">+0x120 SoftAffinity : Uint4B<br style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px">+0x124 Affinity : Uint4B<br style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px">+0x128 Preempted : UChar<br style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px">+0x129 ProcessReadyQueue : UChar<br style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px">+0x12a KernelStackResident : UChar<br style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px">+0x12b NextProcessor : UChar<br style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px">+0x12c CallbackStack : Ptr32 Void<br style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px">+0x130 Win32Thread : Ptr32 Void<br style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px">+0x134 TrapFrame : Ptr32 _KTRAP_FRAME<br style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px">+0x138 ApcStatePointer : [2] Ptr32 _KAPC_STATE<br style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px">+0x140 PreviousMode : Char<br style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px">+0x141 EnableStackSwap : UChar<br style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px">+0x142 LargeStack : UChar<br style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px">+0x143 ResourceIndex : UChar<br style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px">+0x144 KernelTime : Uint4B<br style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px">+0x148 UserTime : Uint4B<br style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px">+0x14c SavedApcState : _KAPC_STATE<br style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px">+0x164 Alertable : UChar<br style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px">+0x165 ApcStateIndex : UChar<br style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px">+0x166 ApcQueueable : UChar<br style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px">+0x167 AutoAlignment : UChar<br style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px">+0x168 StackBase : Ptr32 Void<br style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px">+0x16c SuspendApc : _KAPC<br style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px">+0x19c SuspendSemaphore : _KSEMAPHORE<br style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px">+0x1b0 ThreadListEntry : _LIST_ENTRY<br style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px">+0x1b8 FreezeCount : Char<br style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px">+0x1b9 SuspendCount : Char<br style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px">+0x1ba IdealProcessor : UChar<br style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px">+0x1bb DisableBoost : UChar<br style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px"><br style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px">涓籄PC鐜鏄綅浜庣嚎紼嬪璞$殑ApcState 鍩燂紝鍗籌細<br style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px">+0x034 ApcState : _KAPC_STATE<br style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px"><br style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px">綰跨▼涓瓑寰呭湪褰撳墠榪涚▼涓婁笅鏂囦腑鎵ц鐨凙PC淇濆瓨鍦ˋpcState鐨勯槦鍒椾腑銆傛棤璁轟綍鏃訛紝NT鐨凙PC媧懼彂鍣?dispatcher)鍜屽叾浠栫郴緇熷厓浠舵煡璇竴涓嚎紼嬫湭鍐崇殑APCs鏃? 浠栦滑閮戒細媯鏌ヤ富APC鐜錛屽鏋滆繖閲屾湁浠諱綍鏈喅鐨凙PCs,灝變細椹笂琚姇閫掞紝鎴栬呬慨鏀瑰畠鐨勬帶鍒跺彉閲忕◢鍚庢姇閫掋?br style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px"><br style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px">絎簩涓狝PC鐜鏄綅浜庣嚎紼嬪璞$殑SavedApcState鍩燂紝褰撶嚎紼嬩復鏃舵寕鎺ュ埌鍏朵粬榪涚▼鏃訛紝瀹冩槸鐢ㄦ潵澶囦喚涓籄PC鐜鐨勩?br style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px"><br style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px">褰撲竴涓嚎紼嬭皟鐢↘eAttachProcess錛屽湪鍙﹀鐨勮繘紼嬩笂涓嬫枃涓墽琛屽悗緇殑浠g爜鏃訛紝ApcState鍩熺殑鍐呭灝辮鎷瘋礉鍒癝avedApcState鍩熴傜劧鍚嶢pcState鍩熻娓呯┖錛屽畠鐨凙PC闃熷垪閲嶆柊鍒濆鍖栵紝鎺у埗鍙橀噺璁劇疆涓?錛屽綋鍓嶈繘紼嬪煙璁劇疆涓烘柊鐨勮繘紼嬨傝繖浜涙楠ゆ垚鍔熺殑紜繚鍏堝墠鍦ㄧ嚎紼嬫墍灞炵殑榪涚▼涓婁笅鏂囧湴鍧絀洪棿涓瓑寰呯殑APCs錛屽綋綰跨▼榪愯鍦ㄥ叾瀹冧笉鍚岀殑榪涚▼涓婁笅鏂囨椂錛岃繖浜汚PCs涓嶈浼犻佹墽琛屻傞殢鍚庯紝ApcStatePointer鍩熸暟緇勫唴瀹硅鏇存柊鏉ュ弽鏄犳柊鐨勭姸鎬侊紝鏁扮粍涓涓涓厓绱犳寚鍚慡avedApcState鍩燂紝絎簩涓厓绱犳寚鍚慉pcState鍩燂紝琛ㄦ槑綰跨▼鎵灞炶繘紼嬩笂涓嬫枃鐨凙PC鐜浣嶄簬SavedApcState鍩熴傜嚎紼嬬殑鏂扮殑榪涚▼涓婁笅鏂囩殑APC鐜浣嶄簬ApcState鍩熴傛渶鍚庯紝褰撳墠榪涚▼涓婁笅鏂囧垏鎹㈠埌鏂扮殑榪涚▼涓婁笅鏂囥?br style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px"><br style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px">瀵逛簬涓涓狝PC瀵硅薄錛屽喅瀹氬綋鍓岮PC鐜鐨勬槸ApcStateIndex鍩熴侫pcStateIndex鍩熺殑鍊間綔涓篈pcStatePointer鍩熸暟緇勭殑绱㈠紩鏉ュ緱鍒扮洰鏍嘇PC鐜鎸囬拡銆傞殢鍚庯紝鐩爣APC鐜鎸囬拡鐢ㄦ潵鍦ㄧ浉搴旂殑闃熷垪涓瓨鏀綼pc瀵硅薄.<br style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px"><br style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px">褰撶嚎紼嬩粠鏂扮殑榪涚▼涓劚紱繪椂(KeDetachProcess), 浠諱綍鍦ㄦ柊鐨勮繘紼嬪湴鍧絀洪棿涓瓑寰呮墽琛岀殑鏈喅鐨勫唴鏍窤PCs琚淳鍙戞墽琛屻傞殢鍚嶴avedApcState 鍩熺殑鍐呭琚嫹璐濆洖ApcState鍩熴係avedApcState 鍩熺殑鍐呭琚竻絀猴紝綰跨▼鐨凙pcStateIndex鍩熻璁句負OriginalApcEnvironment錛孉pcStatePointer鍩熸洿鏂幫紝褰撳墠榪涚▼涓婁笅鏂囧垏鎹㈠埌綰跨▼鎵灞炶繘紼嬨?br style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px"><br style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px">浣跨敤APCs<br style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px"><br style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px">璁懼椹卞姩紼嬪簭浣跨敤涓や釜涓昏鍑芥暟鏉ュ埄鐢ˋPCs, 絎竴涓槸KeInitializeApc錛岀敤鏉ュ垵濮嬪寲APC瀵硅薄銆傝繖涓嚱鏁版帴鍙椾竴涓┍鍔ㄥ垎閰嶇殑APC瀵硅薄錛屼竴涓洰鏍囩嚎紼嬪璞℃寚閽堬紝APC鐜绱㈠紩錛堟寚鍑篈PC瀵硅薄瀛樻斁浜庡摢涓狝PC鐜錛夛紝APC鐨刱ernel,rundown鍜宯ormal渚嬬▼鎸囬拡錛孉PC綾誨瀷錛堢敤鎴鋒ā寮忔垨鑰呭唴鏍告ā寮忥級鍜屼竴涓笂涓嬫枃鍙傛暟銆?鍑芥暟澹版槑濡備笅錛?br style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px"><br style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px">NTKERNELAPI<br style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px">VOID<br style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px">KeInitializeApc (<br style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px">IN PRKAPC Apc,<br style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px">IN PKTHREAD Thread,<br style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px">IN KAPC_ENVIRONMENT Environment,<br style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px">IN PKKERNEL_ROUTINE KernelRoutine,<br style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px">IN PKRUNDOWN_ROUTINE RundownRoutine OPTIONAL,<br style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px">IN PKNORMAL_ROUTINE NormalRoutine OPTIONAL,<br style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px">IN KPROCESSOR_MODE ApcMode,<br style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px">IN PVOID NormalContext<br style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px">);<br style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px"><br style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px">typedef enum _KAPC_ENVIRONMENT {<br style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px">OriginalApcEnvironment,<br style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px">AttachedApcEnvironment,<br style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px">CurrentApcEnvironment<br style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px">} KAPC_ENVIRONMENT;<br style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px"><br style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px">KeInitializeApc 棣栧厛璁劇疆APC瀵硅薄鐨凾ype鍜孲ize鍩熶竴涓傚綋鐨勫鹼紝鐒跺悗媯鏌ュ弬鏁癊nvironment鐨勫鹼紝濡傛灉鏄疌urrentApcEnvironment錛岄偅涔圓pcStateIndex鍩熻緗負鐩爣綰跨▼鐨凙pcStateIndex鍩熴傚惁鍒欙紝ApcStateIndex鍩熻緗負鍙傛暟Environment鐨勫箋傞殢鍚庯紝鍑芥暟鐩存帴鐢ㄥ弬鏁拌緗瓵PC瀵硅薄Thread錛孯undownRoutine錛孠ernelRoutine鍩熺殑鍊箋備負浜嗘紜湴紜畾APC鐨勭被鍨嬶紝KeInitializeApc 媯鏌ュ弬鏁癗ormalRoutine鐨勫鹼紝濡傛灉鏄疦ULL錛孉pcMode鍩熺殑鍊艱緗負KernelMode錛孨ormalContext鍩熻緗負NULL銆傚鏋淣ormalRoutine鐨勫間笉鏄疦ULL錛岃繖鏃跺欏畠涓瀹氭寚鍚戜竴涓湁鏁堢殑渚嬬▼錛屽氨鐢ㄧ浉搴旂殑鍙傛暟鏉ヨ緗瓵pcMode鍩熷拰NormalContext鍩熴傛渶鍚庯紝KeInitializeApc 璁劇疆Inserted鍩熶負FALSE.鐒惰屽垵濮嬪寲APC瀵硅薄錛屽茍娌℃湁鎶婂畠瀛樻斁鍒扮浉搴旂殑APC闃熷垪涓?br style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px"><br style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px">浠庤繖涓В閲婄湅錛屼綘鍙互浜嗚В鍒癆PCs瀵硅薄濡傛灉緙哄皯鏈夋晥鐨凬ormalRoutine錛屽氨浼氳褰撲綔鍐呮牳妯″紡APCs.灝ゅ叾鏄畠浠細琚涓烘槸鐗規畩鐨勫唴鏍告ā寮廇PCs.<br style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px">瀹為檯涓婏紝I/O綆$悊鍣ㄥ氨鏄敤榪欑被鐨凙PC鏉ュ畬鎴愬紓姝/O鎿嶄綔銆傜浉鍙嶅湴錛孉PC瀵硅薄瀹氫箟浜嗘湁鏁堢殑NormalRoutine錛屽茍涓擜pcMode鍩熸槸KernelMode錛屽氨浼氳褰撲綔甯歌鐨勫唴鏍告ā寮廇PCs,鍚﹀垯灝變細琚綋浣滄槸鐢ㄦ埛妯″紡APCs. NTDDK.H涓璌ernelRoutine, RundownRoutine, and NormalRoutine 鐨勫畾涔夊涓嬶細<br style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px">typedef<br style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px">VOID<br style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px">(*PKKERNEL_ROUTINE) (<br style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px">IN struct _KAPC *Apc,<br style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px">IN OUT PKNORMAL_ROUTINE *NormalRoutine,<br style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px">IN OUT PVOID *NormalContext,<br style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px">IN OUT PVOID *SystemArgument1,<br style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px">IN OUT PVOID *SystemArgument2<br style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px">);<br style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px"><br style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px">typedef<br style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px">VOID<br style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px">(*PKRUNDOWN_ROUTINE) (<br style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px">IN struct _KAPC *Apc<br style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px">);<br style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px"><br style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px">typedef<br style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px">VOID<br style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px">(*PKNORMAL_ROUTINE) (<br style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px">IN PVOID NormalContext,<br style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px">IN PVOID SystemArgument1,<br style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px">IN PVOID SystemArgument2<br style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px">);<br style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px">//------------------<br style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px"><br style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px">閫氬父錛屾棤璁烘槸浠涔堢被鍨嬶紝姣忎釜APC瀵硅薄蹇呴』瑕佸寘鍚竴涓湁鏁堢殑KernelRoutine 鍑芥暟鎸囬拡銆傚綋榪欎釜APC琚玁T鐨凙PC dispatcher浼犻佹墽琛屾椂錛岃繖涓緥紼嬮鍏堣鎵ц銆傜敤鎴鋒ā寮忕殑APCs蹇呴』鍖呭惈涓涓湁鏁堢殑NormalRoutine 鍑芥暟鎸囬拡錛岃繖涓嚱鏁板繀欏誨湪鐢ㄦ埛鍐呭瓨鍖哄煙銆傚悓鏍風殑錛屽父瑙勫唴鏍告ā寮廇PCs涔熷繀欏誨寘鍚竴涓湁鏁堢殑NormalRoutine錛屼絾鏄畠灝卞儚KernelRoutine涓鏍瘋繍琛屽湪鍐呮牳妯″紡銆備綔涓哄彲閫夋嫨鐨勶紝浠繪剰綾誨瀷鐨凙PC閮藉彲浠ュ畾涔変竴涓湁鏁堢殑RundownRoutine錛岃繖涓緥紼嬪繀欏誨湪鍐呮牳鍐呭瓨鍖哄煙錛屽茍涓斾粎浠呭綋緋葷粺闇瑕侀噴鏀続PC闃熷垪鐨勫唴瀹規椂錛屾墠琚皟鐢ㄣ備緥濡傜嚎紼嬮鍑烘椂錛屽湪榪欑鎯呭喌涓嬶紝KernelRoutine鍜孨ormalRoutine閮戒笉鎵ц錛屽彧鏈塕undownRoutine鎵ц銆傛病鏈夎繖涓緥紼嬬殑APC瀵硅薄浼氳鍒犻櫎銆?br style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px"><br style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px">璁頒綇錛屾姇閫扐PCs鍒頒竴涓嚎紼嬬殑鍔ㄤ綔錛屼粎浠呮槸鎿嶄綔緋葷粺璋冪敤KiDeliverApc瀹屾垚鐨勩傛墽琛孉PC瀹為檯涓婂氨鏄皟鐢ˋPC鍐呯殑渚嬬▼銆?br style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px"><br style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px">涓鏃PC瀵硅薄瀹屾垚鍒濆鍖栧悗錛岃澶囬┍鍔ㄨ皟鐢↘eInsertQueueApc鏉ュ皢APC瀵硅薄瀛樻斁鍒扮洰鏍囩嚎紼嬬殑鐩稿簲鐨凙PC闃熷垪涓傝繖涓嚱鏁版帴鍙椾竴涓敱KeInitializeApc瀹屾垚鍒濆鍖栫殑APC瀵硅薄鎸囬拡錛屼袱涓郴緇熷弬鏁板拰涓涓紭鍏堢駭澧為噺銆傝窡浼犻掔粰KeInitializeApc鍑芥暟鐨勫弬鏁癱ontext 涓鏍鳳紝榪欎袱涓郴緇熷弬鏁板彧鏄湪APC鐨勪緥紼嬫墽琛屾椂錛岀畝鍗曠殑浼犻掔粰APC鐨勪緥紼嬨?br style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px"><br style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px">NTKERNELAPI<br style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px">BOOLEAN<br style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px">KeInsertQueueApc (<br style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px">IN PRKAPC Apc,<br style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px">IN PVOID SystemArgument1,<br style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px">IN PVOID SystemArgument2,<br style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px">IN KPRIORITY Increment<br style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px">);<br style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px">//-----------------<br style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px">鍦↘eInsertQueueApc 灝咥PC瀵硅薄瀛樻斁鍒扮洰鏍囩嚎紼嬬浉搴旂殑APC闃熷垪涔嬪墠錛屽畠棣栧厛媯鏌ョ洰鏍囩嚎紼嬫槸鍚︽槸APC queueable銆傚鏋滀笉鏄紝鍑芥暟绔嬪嵆榪斿洖FALSE.濡傛灉鏄紝鍑芥暟鐩存帴鐢ㄥ弬鏁拌緗甋ystemArgument1鍩熷拰SystemArgument2 鍩燂紝闅忓悗錛屽嚱鏁拌皟鐢↘iInsertQueueApc鏉ュ皢APC瀵硅薄瀛樻斁鍒扮浉搴旂殑APC闃熷垪銆?br style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px"><br style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px">KiInsertQueueApc 浠呬粎鎺ュ彈涓涓狝PC瀵硅薄鍜屼竴涓紭鍏堢駭澧為噺銆傝繖涓嚱鏁伴鍏堝緱鍒扮嚎紼婣PC闃熷垪鐨剆pinlock騫朵笖鎸佹湁瀹冿紝闃叉鍏朵粬綰跨▼淇敼褰撳墠綰跨▼鐨凙PC緇撴瀯銆傞殢鍚庯紝媯鏌PC瀵硅薄鐨処nserted 鍩熴傚鏋滄槸TRUE,琛ㄦ槑榪欎釜APC瀵硅薄宸茬粡瀛樻斁鍒癆PC闃熷垪涓簡錛屽嚱鏁扮珛鍗寵繑鍥濬ALSE.濡傛灉APC瀵硅薄鐨処nserted 鍩熸槸FALSE.鍑芥暟閫氳繃ApcStateIndex鍩熸潵紜畾鐩爣APC鐜錛岀劧鍚庢妸APC瀵硅薄瀛樻斁鍒扮浉搴旂殑APC闃熷垪涓紝鍗沖皢APC瀵硅薄涓殑ApcListEntry 鍩熼摼鍏ュ埌APC鐜鐨凙pcListHead鍩熶腑銆傞摼鍏ョ殑浣嶇疆鐢盇PC鐨勭被鍨嬪喅瀹氥傚父瑙勭殑鍐呮牳妯″紡APC,鐢ㄦ埛妯″紡APC閮芥槸瀛樻斁鍒扮浉搴旂殑APC闃熷垪鐨勬湯绔傜浉鍙嶇殑錛屽鏋滈槦鍒椾腑宸茬粡瀛樻斁浜嗕竴浜汚PC瀵硅薄錛岀壒孌婄殑鍐呮牳妯″紡APC瀛樻斁鍒伴槦鍒椾腑絎竴涓父瑙勫唴鏍告ā寮廇PC瀵硅薄鐨勫墠闈€傚鏋滄槸鍐呮牳瀹氫箟鐨勪竴涓綋綰跨▼閫鍑烘椂浣跨敤鐨勭敤鎴稟PC,瀹冧篃浼氳鏀懼湪鐩稿簲鐨勯槦鍒楃殑鍓嶉潰銆傜劧鍚庯紝綰跨▼鐨勪富APC鐜涓殑UserApcPending鍩熸澂璁劇疆涓篢RUE銆傝繖鏃禟iInsertQueueApc 璁劇疆APC瀵硅薄鐨処nserted 鍩熶負TRUE錛岃〃鏄庤繖涓狝PC瀵硅薄宸茬粡瀛樻斁鍒癆PC闃熷垪涓簡銆傛帴涓嬫潵錛屾鏌ヨ繖涓狝PC瀵硅薄鏄惁琚帓闃熷埌綰跨▼鐨勫綋鍓嶈繘紼嬩笂涓嬫枃APC鐜涓紝濡傛灉涓嶆槸錛屽嚱鏁扮珛鍗寵繑鍥濼RUE銆傚鏋滆繖鏄竴涓唴鏍告ā寮廇PC錛岀嚎紼嬩富APC鐜涓殑KernelApcPending鍩熻緗負TRUE銆?br style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px"><br style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px">鍦╓IN32 SDK鏂囨。涓槸榪欐牱鎻忚堪APCs鐨勶細 褰撲竴涓狝PC琚垚鍔熺殑瀛樻斁鍒板畠鐨勯槦鍒楀悗錛屽彂鍑轟竴涓蔣涓柇錛孉PC灝嗕細鍦ㄧ嚎紼嬭璋冨害榪愯鐨勪笅涓涓椂闂寸墖鎵ц銆傜劧鑰岃繖涓嶆槸瀹屽叏姝g‘鐨勩傝繖鏍蜂竴涓蔣涓柇錛屼粎浠呮槸褰撲竴涓唴鏍告ā寮忕殑APC錛堟棤璁烘槸甯歌鐨勫唴鏍告ā寮廇PC榪樻槸鐗規畩鐨勫唴鏍告ā寮廇PC錛夐拡瀵逛簬璋冪敤綰跨▼鏃訛紝鎵嶄細鍙戝嚭銆傞殢鍚庡嚱鏁拌繑鍥濼RUE銆?br style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px"><br style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px">1錛夊鏋淎PC涓嶆槸閽堝浜庤皟鐢ㄧ嚎紼嬶紝鐩爣綰跨▼鍦≒assive鏉冮檺絳夌駭澶勫湪絳夊緟鐘舵侊紱<br style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px">2錛夎繖鏄竴涓父瑙勫唴鏍告ā寮廇PC<br style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px">3錛夎繖涓嚎紼嬩笉鍐嶄復鐣屽尯<br style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px">4錛夋病鏈夊叾浠栫殑甯歌鍐呮牳妯″紡APC浠嶇劧鍦ㄨ繘琛屼腑<br style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px">閭d箞榪欎釜綰跨▼琚敜閱掞紝榪斿洖鐘舵佹槸STATUS_KERNEL_APC銆備絾鏄瓑寰呯姸鎬佹病鏈塧borted銆?濡傛灉榪欐槸涓涓敤鎴鋒ā寮廇PC錛孠iInsertQueueApc媯鏌ュ垽鏂洰鏍囩嚎紼嬫槸鍚︽槸alertable絳夊緟鐘舵侊紝騫朵笖WaitMode鍩熺瓑浜嶶serMode銆傚鏋滄槸錛屼富APC鐜鐨刄serApcPending 鍩熻緗負TRUE銆傜瓑寰呯姸鎬佽繑鍥濻TATUS_USER_APC錛屾渶鍚庯紝鍑芥暟閲婃斁spinlock錛岃繑鍥濼RUE錛岃〃紺篈PC瀵硅薄宸茬粡琚垚鍔熸斁鍏ラ槦鍒椼?br style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px">鏃╂湡浣滀負APC綆$悊鍑芥暟鐨勮ˉ鍏咃紝璁懼椹卞姩寮鍙戣呭彲浠ヤ嬌鐢ㄦ湭鍏紑鐨勭郴緇熸湇鍔tQueueApcThread鏉ョ洿鎺ュ皢涓涓敤鎴鋒ā寮忕殑APC鎶曢掑埌鏌愪釜綰跨▼銆?br style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px">榪欎釜鍑芥暟鍐呴儴瀹為檯涓婃槸璋冪敤浜咾eInitializeApc 鍜孠eInsertQueueApc 鏉ュ畬鎴愯繖涓換鍔°?br style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px"><br style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px">NTSYSAPI<br style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px">NTSTATUS<br style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px">NTAPI<br style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px">NtQueueApcThread (<br style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px">IN HANDLE Thread,<br style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px">IN PKNORMAL_ROUTINE NormalRoutine,<br style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px">IN PVOID NormalContext,<br style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px">IN PVOID SystemArgument1,<br style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px">IN PVOID SystemArgument2<br style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px">);<br style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px"><br style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px">NT鐨凙PC媧懼彂鍣?br style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px"><br style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px">NT媯鏌ユ槸鍚︾嚎紼嬫湁鏈喅鐨凙PCs. 鐒跺悗APC媧懼彂鍣ㄥ瓙紼嬪簭KiDeliverApc鍦ㄨ繖涓嚎紼嬩笂涓嬫枃鎵ц鏉ュ紑濮嬪皢鏈喅鐨凙PC鎵ц銆傛敞鎰忥紝榪欎釜琛屼負涓柇浜嗙嚎紼嬬殑姝e父鎵ц嫻佺▼錛岄鍏堝皢鎺у埗鏉冪粰APC媧懼彂鍣紝闅忓悗褰揔iDeliverApc瀹屾垚鍚庯紝緇х畫綰跨▼鐨勬墽琛屻?br style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px">渚嬪錛氬綋涓涓嚎紼嬭璋冨害榪愯鏃訛紝鏈鍚庝竴姝ワ紝涓婁笅鏂囧垏鎹㈠嚱鏁?SwapContext 鐢ㄦ潵媯鏌ユ槸鍚︽柊鐨勭嚎紼嬫湁鏈喅鐨勫唴鏍窤PCs.濡傛灉鏄紝SwapContext瑕佷箞錛?錛夎姹備竴涓狝PC綰у埆鐨勮蔣涓柇鏉ュ紑濮婣PC鎵ц錛岀敱浜庢柊綰跨▼榪愯鍦ㄤ綆鐨処RQL錛圥assive綰у埆銆?br style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px">鎴栬咃紙2錛夎繑鍥濼RUE錛岃〃紺烘柊鐨勭嚎紼嬫湁鏈喅鐨勫唴鏍窤PCs銆?br style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px"><br style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px">絀剁珶鏄墽琛?1)榪樻槸(2)鍙栧喅浜庢柊綰跨▼鎵澶勭殑IRQL綰у埆. 濡傛灉瀹冪殑鏉冮檺綰у埆楂樹簬Passive綰?SwapContext 鎵ц(1),濡傛灉瀹冩槸鍦≒assive綰?鍒欓夋嫨鎵ц(2).<br style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px">SwapContext鐨勮繑鍥炲間粎浠呮槸鐗瑰畾緋葷粺鍑芥暟鍙敤鐨?榪欎簺緋葷粺鍑芥暟璋冪敤SwapContext鏉ュ己鍒跺垏鎹㈢嚎紼嬩笂涓嬫枃鍒板彟涓涓嚎紼? 鐒跺悗,褰撹繖浜涚郴緇熷嚱鏁扮粡榪囦竴孌墊椂闂村啀緇х畫鏃?浠栦滑閫氬父媯鏌wapContext 鐨勮繑鍥炲?濡傛灉鏄疶RUE,浠栦滑灝變細璋冪敤APC媧懼彂鍣ㄦ潵鎶曢掑唴鏍窤PCs鍒板綋鍓嶇殑綰跨▼. 渚嬪:<br style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px">緋葷粺鍑芥暟KiSwapThread琚瓑寰呮湇鍔$敤鏉ユ斁寮冨鐞嗗櫒錛岀洿鍒扮瓑寰呯粨鏉熴傝繖涓嚱鏁板唴閮ㄨ皟鐢⊿wapContext銆傚綋絳夊緟緇撴潫錛岀戶緇粠璋冪敤SwapContext澶勬墽琛屾椂錛屽氨浼氭鏌wapContext鐨勮繑鍥炲箋傚鏋滄槸TRUE錛孠iSwapThread浼氶檷浣嶪RQL綰у埆鍒癆PC綰э紝鐒跺悗璋冪敤KiDeliverApc鏉ュ湪褰撳墠綰跨▼鎵ц鍐呮牳APCs.<br style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px">瀵逛簬鐢ㄦ埛APCs, 鍐呮牳璋冪敤APC媧懼彂鍣ㄤ粎浠呮槸褰撶嚎紼嬪洖鍒扮敤鎴鋒ā寮忥紝騫朵笖綰跨▼鐨勪富APC鐜鐨刄serApcPending鍩熶負TRUE鏃躲備緥濡傦細褰撶郴緇熸湇鍔℃淳鍙戝櫒KiSystemService瀹屾垚涓涓郴緇熸湇鍔¤姹傛鎵撶畻鍥炲埌鐢ㄦ埛妯″紡鏃訛紝瀹冧細媯鏌ユ槸鍚︽湁鏈喅鐨勭敤鎴稟PCs銆傚湪鎵ц涓婏紝KiDeliverApc璋冪敤鐢ㄦ埛APC鐨凨ernelRoutine. 闅忓悗錛孠iInitializeUserApc鍑芥暟琚皟鐢紝鐢ㄦ潵璁劇疆綰跨▼鐨勯櫡闃卞撫銆傛墍浠ヤ粠鍐呮牳妯″紡閫鍑烘椂錛岀嚎紼嬪紑濮嬪湪鐢ㄦ埛妯″紡涓嬫墽琛?br style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px">銆侹iInitializeUserApc鐨勫嚱鏁扮殑浣滅敤鏄嫹璐濆綋鍓嶇嚎紼嬪厛鍓嶇殑鎵ц鐘舵侊紙褰撹繘鍏ュ唴鏍告ā寮忔椂錛岃繖涓姸鎬佷繚瀛樺湪綰跨▼鍐呮牳鏍堝垱寤虹殑闄烽槺甯ч噷錛夛紝浠庡唴鏍告爤鍒扮嚎紼嬬殑鐢ㄦ埛妯″紡鏍堬紝鍒濆鍖栫敤鎴鋒ā寮廇PC銆侫PC媧懼彂鍣ㄥ瓙紼嬪簭KiUserApcDispatcher鍦∟tdll.dll鍐呫傛渶鍚庯紝鍔犺澆闄烽槺甯х殑EIP瀵勫瓨鍣ㄥ拰Ntdll.dll涓璌iUserApcDispatcher鐨勫湴鍧銆傚綋闄烽槺甯ф渶鍚庨噴鏀炬椂錛屽唴鏍稿皢鎺у埗杞氦緇橩iUserApcDispatcher錛岃繖涓嚱鏁拌皟鐢ˋPC鐨凬ormalRoutine渚嬬▼錛孨ormalRoutine鍑芥暟鍦板潃浠ュ強鍙傛暟閮藉湪鏍堜腑錛屽綋渚嬬▼瀹屾垚鏃訛紝瀹冭皟鐢∟tContinue鏉ヨ綰跨▼鍒╃敤鍦ㄦ爤涓厛鍓嶇殑涓婁笅鏂囩戶緇墽琛岋紝浠夸經浠涔堜簨鎯呬篃娌℃湁鍙戠敓榪囥?br style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px"><br style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px"><br style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px">褰撳唴鏍歌皟鐢↘iDeliverApc鏉ユ墽琛屼竴涓敤鎴鋒ā寮廇PC鏃訛紝綰跨▼涓殑PreviousMode鍩熻璁句負UserMode. TrapFrame鍩熸寚鍚戠嚎紼嬬殑闄烽槺甯с傚綋鍐呮牳璋冪敤KiDeliverApc鏉ユ墽琛屽唴鏍窤PCs鏃訛紝綰跨▼涓殑PreviousMode鍩熻璁句負KernelMode. TrapFrame鍩熸寚鍚慛ULL銆?br style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px">娉ㄦ剰錛屾棤璁轟綍鏃跺彧瑕並ernelRoutine琚皟鐢紝浼犻掔粰瀹冪殑鎸囬拡鏄竴涓眬閮ㄧ殑APC灞炴х殑鍓湰錛岀敱浜嶢PC瀵硅薄宸茬粡鑴辯浜嗛槦鍒楋紝鎵浠ュ彲浠ュ畨鍏ㄧ殑鍦↘ernelRoutine涓噴鏀続PC鍐呭瓨銆傛澶栵紝榪欎釜渚嬬▼鍦ㄥ畠鐨勫弬鏁拌浼犻掔粰鍏朵粬渚嬬▼涔嬪墠錛屾湁涓涓渶鍚庣殑鏈轟細鏉ヤ慨鏀硅繖浜涘弬鏁般?br style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px"><br style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px">緇撹錛?br style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px">APC鎻愪緵浜嗕竴涓潪甯告湁鐢ㄧ殑鏈哄埗錛屽厑璁稿湪鐗瑰畾鐨勭嚎紼嬩笂涓嬫枃涓紓姝ョ殑鎵ц浠g爜銆備綔涓轟竴涓澶囬┍鍔ㄥ紑鍙戣咃紝浣犲彲浠ヤ緷璧朅PCs鍦ㄦ煇涓壒瀹氱殑綰跨▼涓婁笅鏂囦腑鎵ц涓涓緥紼嬶紝鑰屼笉闇瑕佺嚎紼嬬殑璁稿彲鍜屽共娑夈傚浜庣敤鎴峰簲鐢ㄧ▼搴忥紝鐢ㄦ埛妯″紡APCs鍙互鐢ㄦ潵鏈夋晥鍦板疄鐜頒竴浜涘洖璋冮氱煡鏈哄埗銆?/span></span><img src ="http://www.shnenglu.com/shaker/aggbug/145731.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/shaker/" target="_blank">shaker(澶瓙)</a> 2011-05-05 11:46 <a href="http://www.shnenglu.com/shaker/archive/2011/05/05/145731.html#Feedback" target="_blank" style="text-decoration:none;">鍙戣〃璇勮</a></div>]]></description></item><item><title>NtProtectVirtualMemoryhttp://www.shnenglu.com/shaker/archive/2011/03/23/142548.htmlshaker(澶瓙)shaker(澶瓙)Wed, 23 Mar 2011 02:01:00 GMThttp://www.shnenglu.com/shaker/archive/2011/03/23/142548.htmlhttp://www.shnenglu.com/shaker/comments/142548.htmlhttp://www.shnenglu.com/shaker/archive/2011/03/23/142548.html#Feedback1http://www.shnenglu.com/shaker/comments/commentRss/142548.htmlhttp://www.shnenglu.com/shaker/services/trackbacks/142548.html 

  1 NTSTATUS
  2 NTAPI
  3 NtProtectVirtualMemory(IN HANDLE ProcessHandle,
  4                        IN OUT PVOID *UnsafeBaseAddress,
  5                        IN OUT SIZE_T *UnsafeNumberOfBytesToProtect,
  6                        IN ULONG NewAccessProtection,
  7                        OUT PULONG UnsafeOldAccessProtection)
  8 {
  9     PEPROCESS Process;
 10     ULONG OldAccessProtection;
 11     ULONG Protection;
 12     PEPROCESS CurrentProcess = PsGetCurrentProcess();
 13     PVOID BaseAddress = NULL;
 14     SIZE_T NumberOfBytesToProtect = 0;
 15     KPROCESSOR_MODE PreviousMode = ExGetPreviousMode();
 16     NTSTATUS Status;
 17     BOOLEAN Attached = FALSE;
 18     KAPC_STATE ApcState;
 19     PAGED_CODE();
 20 
 21     //
 22     // Check for valid protection flags
 23     //
 24     Protection = NewAccessProtection & ~(PAGE_GUARD|PAGE_NOCACHE);
 25     if (Protection != PAGE_NOACCESS &&
 26         Protection != PAGE_READONLY &&
 27         Protection != PAGE_READWRITE &&
 28         Protection != PAGE_WRITECOPY &&
 29         Protection != PAGE_EXECUTE &&
 30         Protection != PAGE_EXECUTE_READ &&
 31         Protection != PAGE_EXECUTE_READWRITE &&
 32         Protection != PAGE_EXECUTE_WRITECOPY)
 33     {
 34         //
 35         // Fail
 36         //
 37         return STATUS_INVALID_PAGE_PROTECTION;
 38     }
 39 
 40     //
 41     // Check if we came from user mode
 42     //
 43     if (PreviousMode != KernelMode)
 44     {
 45         //
 46         // Enter SEH for probing
 47         //
 48         _SEH2_TRY
 49         {
 50             //
 51             // Validate all outputs
 52             //
 53             ProbeForWritePointer(UnsafeBaseAddress);
 54             ProbeForWriteSize_t(UnsafeNumberOfBytesToProtect);
 55             ProbeForWriteUlong(UnsafeOldAccessProtection);
 56 
 57             //
 58             // Capture them
 59             //
 60             BaseAddress = *UnsafeBaseAddress;
 61             NumberOfBytesToProtect = *UnsafeNumberOfBytesToProtect;
 62         }
 63         _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
 64         {
 65             //
 66             // Get exception code
 67             //
 68             _SEH2_YIELD(return _SEH2_GetExceptionCode());
 69         }
 70         _SEH2_END;
 71     }
 72     else
 73     {
 74         //
 75         // Capture directly
 76         //
 77         BaseAddress = *UnsafeBaseAddress;
 78         NumberOfBytesToProtect = *UnsafeNumberOfBytesToProtect;
 79     }
 80 
 81     //
 82     // Catch illegal base address
 83     //
 84     if (BaseAddress > MM_HIGHEST_USER_ADDRESS) return STATUS_INVALID_PARAMETER_2;
 85 
 86     //
 87     // Catch illegal region size
 88     //
 89     if ((MmUserProbeAddress - (ULONG_PTR)BaseAddress) < NumberOfBytesToProtect)
 90     {
 91         //
 92         // Fail
 93         //
 94         return STATUS_INVALID_PARAMETER_3;
 95     }
 96 
 97     //
 98     // 0 is also illegal
 99     //
100     if (!NumberOfBytesToProtect) return STATUS_INVALID_PARAMETER_3;
101 
102     //
103     // Get a reference to the process
104     //
105     Status = ObReferenceObjectByHandle(ProcessHandle,
106                                        PROCESS_VM_OPERATION,
107                                        PsProcessType,
108                                        PreviousMode,
109                                        (PVOID*)(&Process),
110                                        NULL);
111     if (!NT_SUCCESS(Status)) return Status;
112 
113     //
114     // Check if we should attach
115     //
116     if (CurrentProcess != Process)
117     {
118         //
119         // Do it
120         //
121         KeStackAttachProcess(&Process->Pcb, &ApcState);
122         Attached = TRUE;
123     }
124 
125     //
126     // Do the actual work
127     //
128     Status = MiProtectVirtualMemory(Process,
129                                     &BaseAddress,
130                                     &NumberOfBytesToProtect,
131                                     NewAccessProtection,
132                                     &OldAccessProtection);
133 
134     //
135     // Detach if needed
136     //
137     if (Attached) KeUnstackDetachProcess(&ApcState);
138 
139     //
140     // Release reference
141     //
142     ObDereferenceObject(Process);
143 
144     //
145     // Enter SEH to return data
146     //
147     _SEH2_TRY
148     {
149         //
150         // Return data to user
151         //
152         *UnsafeOldAccessProtection = OldAccessProtection;
153         *UnsafeBaseAddress = BaseAddress;
154         *UnsafeNumberOfBytesToProtect = NumberOfBytesToProtect;
155     }
156     _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
157     {
158     }
159     _SEH2_END;
160 
161     //
162     // Return status
163     //
164     return Status;
165 }


]]>
銆愯漿甯栥慦indows緗戠粶浣撶郴緇撴瀯鎬葷粨http://www.shnenglu.com/shaker/archive/2011/02/22/140439.htmlshaker(澶瓙)shaker(澶瓙)Tue, 22 Feb 2011 06:48:00 GMThttp://www.shnenglu.com/shaker/archive/2011/02/22/140439.htmlhttp://www.shnenglu.com/shaker/comments/140439.htmlhttp://www.shnenglu.com/shaker/archive/2011/02/22/140439.html#Feedback0http://www.shnenglu.com/shaker/comments/commentRss/140439.htmlhttp://www.shnenglu.com/shaker/services/trackbacks/140439.html鏍?棰? Windows緗戠粶浣撶郴緇撴瀯鎬葷粨
浣?鑰? jbwang
鏃?闂? 2009-11-23,11:22:25
閾?鎺? http://bbs.pediy.com/showthread.php?t=101794

鍋氫簡涓浜涗笢瑗胯嚜宸變篃鐪嬩簡涓浜涗功錛屾渶榪戞葷粨浜嗕竴涓嬶紝鎯崇粰澶у鍒嗕韓涓涓嬶紝楂樻墜鍙互椋炶繃浜嗐傚鏋滄湁浠涔堥棶棰樺彲浠ョ粰灝忓紵鎸囨涓涓嬶紝澶氳阿錛?img alt="" src="http://www.shnenglu.com/images/cppblog_com/shaker/022211_0647_Windows1.gif">

鍦ㄤ粙緇峎indows緗戠粶浣撶郴鏋舵瀯涔嬪墠錛屾垜棣栧厛浠嬬粛涓涓媁indows涓殑涓や釜閲嶈緙栫▼瑙勮寖鈥斺擳DI錛孨DIS.錛岀劧鍚庡啀浠嬬粛緗戠粶浣撶郴鐨勬灦鏋勩?br>TDI錛孴ransport Driver Interface錛屼紶杈撻┍鍔ㄧ▼搴忔帴鍙c俓Windows\System32\Drivers\Tdi.sys
鍦ㄥ疄鐜扮綉緇淎PI椹卞姩紼嬪簭鏃訛紝鐢變簬鐗墊秹鍒板緢澶氫笉鍚屽崗璁紝浼氱敤鍒頒笉鍚屽崗璁┍鍔ㄦ彁渚涚殑鎺ュ彛錛屼嬌寰楀紑鍙戠殑宸ヤ綔澶嶆潅鍖栥傛墍浠icrosoft鍦ㄧ綉緇淎PI椹卞姩紼嬪簭鍜屽崗璁┍鍔ㄤ箣闂村張澧炲姞浜嗕竴灞俆DI銆俆DI鎺ュ彛鍙槸涓縐?灝嗙綉緇滆姹傛牸寮忓寲鎴怚RP錛屼互鍙婄敵璇風綉緇滃湴鍧鍜屾暟鎹氫俊"鐨勫仛娉曡鑼冨寲銆傞伒浠嶵DI鏍囧噯鐨勪紶杈撳崗璁悜浠栦滑鐨勫鎴鳳紙濡係ocket emulator錛孨etbios emulator絳夛級瀵煎嚭浜員DI鎺ュ彛錛屾湁鍒╀簬涓婁笅灞備箣闂寸殑閫氫俊錛?br>飦?nbsp; 涓鏂歸潰錛屽浜嶵DI涓婂眰鐨勭綉緇淎PI椹卞姩紼嬪簭灝變笉闇瑕佷嬌鐢ㄦ墍鏈夊崗璁┍鍔ㄧ▼搴忔墍鎻愪緵鐨勬帴鍙o紝鐩存帴浣跨敤TDI鎻愪緵鐨勭粺涓鎺ュ彛銆?br>飦?nbsp; 鍙︿竴鏂歸潰錛屽浜庝笅灞傚崗璁┍鍔ㄧ▼搴忥紙涔熺О涓篢DI Transport Provider浼犺緭鍣級鐩存帴鐢盩DI鎺ュ彛鏉ヨ皟鐢紝鍙戝嚭璇鋒眰銆?br> 


鍦╓indows VISTA鐗堟湰涔嬪悗錛孴DI灝變笉鍐嶄嬌鐢ㄤ簡錛屽彇鑰屼唬涔嬬殑鏄疻indows filter platform鍜學insock kernel銆?br>
NDIS錛孨etwork Driver Interface Specification錛岀綉緇滈┍鍔ㄧ▼搴忔帴鍙h鑼冿紝鍦ㄦ搷浣滅郴緇熶腑鐨勪綅緗?br>\Windows\System32\Drivers\NDIS.sys
褰撲竴涓崗璁┍鍔ㄧ▼搴忔兂瑕佹寜鐓у叾鍗忚鐨勬牸寮忚В鏋愮綉涓婅鍐欑殑鏁版嵁鏃訛紝鑰岃繖浜涙暟鎹繀欏婚氳繃緗戠粶閫傞厤鍣ㄦ墠鑳藉彇寰楋紝鏈熸湜鍗忚椹卞姩紼嬪簭鑳藉鐞嗚В甯傚満涓婄殑姣忎竴嬈劇綉緇滈傞厤鍣ㄧ殑緇嗗井鍖哄埆鏄笉鍙兘鐨勩傛墍浠ュ湪1989騫達紝鐢盡icrosoft鍜?Com鑱斿悎寮鍙戠殑浜哊DIS錛屼嬌寰楀崗璁┍鍔ㄧ▼搴忓彲浠ヤ互涓縐嶄笌璁懼鏃犲叧鐨勬柟寮忔潵璺熺綉緇滈傞厤鍣ㄩ┍鍔ㄧ▼搴忚繘琛岄氫俊銆傞伒浠嶯DIS鐨勭綉緇滈傞厤鍣ㄩ┍鍔ㄧ▼搴忕О涓篘DIS minport driver銆?/span>

 

 
NDIS瑙勮寖瀹炵幇浜嗕笌TDI鏍囧噯綾諱技鐨勫姛鑳斤紝閮芥槸灝嗗鏉傜殑涓嬪眰璋冪敤瑙勮寖鍖栥佹爣鍑嗗寲錛屽ぇ澶ф彁楂樹簡Windows鎿嶄綔緋葷粺鐨勫彲鎵╁睍鎬у拰鍏煎鎬с備篃琛ㄧ幇鍦ㄤ袱涓柟闈細
飦?nbsp; 瀵逛簬涓嬪眰錛岃緗戠粶閫傞厤鍣ㄥ埗閫犲晢寰坋asy鐨勫紑鍙戣嚜宸辯殑璁懼椹卞姩紼嬪簭錛屼篃灝辨槸Ndis miniport driver銆傝繖浜沵iniport driver鐩存帴鍒╃敤NDIS鎻愪緵鐨勬帴鍙e彂閫佹寚浠わ紝NDIS瀵硅繖浜涙牸寮忓寲鐨勬寚浠よ繘琛岃В鏋愶紝鍋氳繘涓姝ュ鐞嗐傦紙榪欎簺澶勭悊灝卞埌浜咹AL浜嗭級
飦?nbsp; 瀵逛簬涓婂眰錛屽涓崗璁┍鍔ㄧ▼搴忎笌涓嬪眰minport driver涔嬮棿鐨勯氫俊錛屼篃閮芥槸閫氳繃緇熶竴鐨凬DIS鎺ュ彛錛孨idsAllocatePacket錛孨disSend絳夊嚱鏁版潵鏀跺彂鏁版嵁銆?br>
搴熻瘽涓ゅ彞錛歍DI鍜孨DIS涓ゅぇ鎺ュ彛瑙勮寖錛屾湁鍔涚殑鎻愬崌浜哤indows鎿嶄綔緋葷粺瀵逛笉鍚岃澶囧巶鍟嗙殑鏀寔錛岄檷浣庝簡璁懼鍘傚晢瀵硅澶囬┍鍔ㄧ▼搴忓紑鍙戠殑闅懼害錛涗篃澧炲姞浜嗗浜庝笉鍚岀綉緇滃崗璁殑鏀寔錛岀粰鐢ㄦ埛鏇村己澶х殑緗戠粶鍔熻兘鏀寔銆傝繖縐嶈璁℃垜浠篃鍙互鍦╓indows瀛樺偍綆$悊涓湅鍒幫紝浠庝腑鎴戜滑浼間箮鍙互浜嗚В鍒頒竴浜涳紝Windows鎿嶄綔緋葷粺鍦ㄥ晢涓氫笂鍙栧緱鎴愬姛鐨勫師鍥犮侺inux鎿嶄綔緋葷粺涓病鏈夎繖鏍風殑椹卞姩灞傛緇撴瀯銆?br>
璁懼鍒墮犲晢寮鍙戠殑Ndis miniport driver鐩存帴璋冪敤NDIS搴撲腑鐨勬帴鍙e嚱鏁幫紝鍥犳涓嶉渶瑕佽冭檻閲嶅叆鐨勯棶棰橈紝灝辨槸涓涓姹傚皻鏈粨鏉熺殑鏃跺欙紝鏂扮殑璇鋒眰鍙堣繘鏉ヤ簡銆侼DIS搴撳璇鋒眰榪涜浜嗗簭鍒楀寲錛屼絾鏄繖縐嶅簭鍒楀寲涔熷Θ紕嶄簡澶氬鐞嗗櫒鐨勬墿灞曟с傛墍浠DIS5涓彁渚涗簡闈炲簭鍒楀寲鐨勬搷浣滈」銆備笅闈紝鎴戞潵浠嬬粛涓涓嬶紝Deserialized鍜孲erialized minport driver鐨勫尯鍒細
Deserialized NDIS miniport driver鑷繁搴忓垪鍖栧MinportXxx鍑芥暟鐨勬搷浣滐紝鎺掗槦鍜岀鐞嗗涓茍鍙戣姹傜殑浠誨姟閮界敱椹卞姩紼嬪簭鑷繁鏉ュ畬鎴愩傝孲erialized NDIS miniport driver浠ヤ笂鐨勫伐浣滈兘鏄緷璧栦簬NDIS搴撴潵瀹屾垚鐨勩備粠鎬ц兘瑙掑害鐪嬶紝Deserialized NDIS miniport driver鐨勬ц兘鏄疭erialized NDIS miniport driver鎬ц兘鐨?鍊嶅錛屾墍浠ュ埌NDIS6.0涔嬪悗鐨勬墍鏈塎iniport driver閮芥槸deserialize鐨勩?br>
 
浠ヤ笂鏄垜鍙傝僊SDN浠ュ強鑷繁鐨勪竴浜涚悊瑙g敾鍑烘潵鐨剋indows緗戠粶鏋舵瀯鍥撅紝涓嬮潰鎴戝氨浠庝笂鍒頒笅鏉ョ畝鍗曚粙緇嶄竴涓嬪叾涓殑鍚勪釜灞傘?/span>

 


1.  緗戠粶搴旂敤紼嬶紝Network applicantion錛岀敤鎴鋒佺殑搴旂敤紼嬪簭璋冪敤Windows鎿嶄綔緋葷粺鎻愪緵鐨勭綉緇淎PI錛岀綉緇淎PI鍖呮嫭錛?br>a)  Windows濂楁帴瀛楋紙winsock錛?br>b)  榪滅▼榪囩▼璋冪敤RPC
c)  Web璁塊棶API
d)  鍛藉悕綆¢亾鍜岄偖浠舵Ы
e)  鍏朵粬緗戠粶API
榪欎簺API鏃㈠彲浠ュ湪鐢ㄦ埛妯″紡涓嬪疄鐜幫紝涔熷彲浠ュ悓鏃跺湪鐢ㄦ埛妯″紡鍜屽唴鏍告ā寮忎笅瀹炵幇銆備粠鏈川涓婅榪欎簺API鏄笅灞傛彁渚涙帴鍙g殑鍙︿竴灞傚皝瑁呰屽凡銆?br>2.  TDI Clients錛屼紶杈撻┍鍔ㄧ▼搴忔帴鍙e鎴鳳紝鏄唴鏍告ā寮忕殑璁懼椹卞姩紼嬪簭錛岀敤浜庡疄鐜扮綉緇淎PI鐨勫唴鏍擱儴鍒嗐傚皢緗戠粶API鐨勮姹傝漿鎹㈡垚IRP錛岄氳繃TDI鏍囧噯鏍煎紡鍖栧悗錛屽彂閫佺粰涓嬪眰鐨勫崗璁┍鍔紙涔熷氨鏄疶DI浼犺緭鍣級銆備粠sockets emulator鐨勬灦鏋勫浘鐪嬪埌錛孴DI Clients鐨勫疄鐜板彲浠ユ湁鐢ㄦ埛鎬佺殑閮ㄥ垎錛屼篃鏈夊唴鏍告佺殑閮ㄥ垎銆侫FD杈呭姪鍔熻兘椹卞姩紼嬪簭閫氳繃鍚戝崗璁┍鍔ㄧ▼搴忓彂閫乀DI IRP鏉ユ墽琛岀綉緇滃鎺ュ瓧鎿嶄綔錛屾瘮濡傚彂閫佸拰鎺ュ彈娑堟伅銆侫FD娌℃湁涓嶆槸紜畾浣跨敤鍝竴涓崗璁┍鍔紝鑰屾槸涓婂眰閫氱煡鍏惰浣跨敤鐨勫崗璁悕縐幫紝鐒跺悗AFD鍘繪墦寮鐩稿簲鍗忚鐨勮澶囧璞°?/span>

 

 
3.  TDI Transport Providers銆乀DI浼犺緭鍣ㄣ丯DIS鍗忚椹卞姩紼嬪簭銆佸崗璁┍鍔ㄧ▼搴忥紝鎵鏈夎繖浜涘叾瀹炲氨鏄寚鐨勫悓涓涓笢瑗匡紝鎴戝湪鍚庨潰灝辯О鍏朵負鍗忚椹卞姩紼嬪簭銆傝繖涓儴鍒嗗氨鏄垜浠鏌愪釜鍗忚鐨勫叿浣撳疄鐜伴儴鍒嗐傚仛榪囩綉緇滃崗璁紑鍙戠殑鏈嬪弸涓瀹氱煡閬擄紝鍗忚鍏跺疄灝辨槸鍙屽彂鍗忓晢濂界殑涓濂楅氫俊鐨勮鍒欍備互IP鍗忚涓轟緥錛屽疄闄呬笂灝辨槸瀵圭綉緇滄暟鎹殑涓縐嶅鐞嗘柟寮忥紝鏍規嵁緗戠粶鏁版嵁鍖呯殑瑙f瀽緇撴瀯錛屽仛鍑虹浉搴旂殑澶勭悊銆俉indows鐨則cpip.sys灝卞疄鐜頒簡澶氫釜鍗忚錛宨p銆乼cp銆乽dp銆乤rp銆乮cmp銆乮gmp錛屽畠涓轟笂灞傜殑TDI Clients鎻愪緵浜?涓澶囧璞★紝鐢ㄤ簬璁塊棶浣跨敤榪欎簺鍗忚錛孴DI Clients鎵撳紑榪欎簺璁懼瀵硅薄錛屽悜鍏跺彂閫両RP璇鋒眰鏉ュ疄鐜拌嚜宸辯殑鎿嶄綔銆傞氳繃DDK鐨凞eviceTree鎴戜滑鍙互寰楀埌榪欎簺璁懼瀵硅薄
a)  \Device\Rawip
b)  \Device\Tcp
c)  \Device\Udp
d)  \Device\IPMULTICAST
e)  \Device\Ip
鍗忚椹卞姩紼嬪簭澶勭悊鐨勬暟鎹槸閫氳繃NDIS搴撲腑鎻愪緵鐨勬帴鍙f潵鑾峰彇鐨勶紝涓嶉渶瑕佸彂閫両RP鏉ュ彇寰椼傚湪DDK XP涓彁渚涗簡涓涓崗璁┍鍔ㄧ▼搴忎簡婧愮▼搴廚disuio錛孌DK XP鍚庣殑鐗堟湰鎻愪緵鐨勬槸Ndisport銆傚湪DriverEntry涓垜浠彲浠ョ湅鍒幫紝椹卞姩紼嬪簭涓寮濮嬪氨娉ㄥ唽浜嗕竴涓狽DIS_PROTOCOL_CHARACTERISTICS錛岃繖涓粨鏋勪綋涓槸涓鍫哊disXxxx鍑芥暟銆侼DIS瑙勮寖鍦ㄨ繖閲屽氨寮濮嬪彂鎸ュ畠鐨勪綔鐢ㄤ簡銆?br>鍗忚椹卞姩紼嬪簭鐨勫彟涓涓綔鐢ㄥ氨鏄洃鍚綉緇滄暟鎹紝鑷繁寮鍙戜竴涓綉緇滃崗璁氳繃Ndis API鑾峰緱鎵鏈夌殑緗戠粶鏁版嵁錛屼絾鏄笉鑳藉鎷︽埅緗戠粶鏁版嵁錛屽洜涓哄叾浠栧崗璁┍鍔ㄤ篃鍙互閫氳繃Nids API鑾峰彇鏁版嵁銆備竴涓吀鍨嬬殑搴旂敤灝辨槸Winpcap浜嗭紝浣跨敤NPF.SYS鏉ユ崟鑾風綉緇滄暟鎹紝騫朵笖鍋氬ソ鍏呭垎緙撳啿澶勭悊錛岄槻姝㈠ぇ鏁版嵁閲忓埌鏉ユ椂鍑虹幇鏁版嵁鍖呬涪澶辯殑鎯呭喌銆傝鎯呮儏鑺倃inpcap鐨勫紑婧愪唬鐮併?br>鍏蜂綋鐨勫崗璁┍鍔ㄥ紑鍙戣繃紼嬶紝鎴戝氨涓嶇粏榪頒簡錛屽ぇ瀹跺彲浠ュ弬鐪婲disuio鍜孌DK doc錛屾垜鎺ㄨ崘boywhp鐨勪竴綃囨枃妗c奛DIS鍗忚椹卞姩寮鍙戙嬬粰澶у銆?br>4.  NDIS錛孨etwork Driver Interface Specification錛岀綉緇滃崗璁帴鍙f爣鍑嗐備粠鍥句腑鎴戜滑鍙互鐪嬪埌鍖呰9鍦ㄥ叾涓殑涓や釜椹卞姩紼嬪簭錛屼竴涓槸NDIS intermediate driver錛孨DIS涓棿灞傞┍鍔ㄧ▼搴忥紝鍙︿竴涓槸NDIS minport driver錛屽皬绔彛椹卞姩紼嬪簭銆備笅闈㈢畝鍗曚粙緇嶄竴涓嬭繖涓や釜椹卞姩紼嬪簭錛?br>a)  Ndis intermediate driver錛孨DIS涓棿灞傞┍鍔ㄧ▼搴忥紝瀵逛簬涓婂眰鐨刾rotocol driver瀹冨厖褰搈inport driver鐨勪綔鐢紝瀵逛簬涓嬪眰鐨刴inport driver瀹冨厖褰撲竴涓猵rotocol driver鐨勪綔鐢紝鎵浠ュ湪椹卞姩紼嬪簭DriverEntry涓氨娉ㄥ唽NDIS_PROTOCOL_CHARACTERISTICS鍜孨DIS_MINIPORT_CHARACTERISTICS錛屼嬌鐢╬rotocol characteristics涓璑DIS API浠巑iniport driver閭i噷鍙栧緱鏁版嵁鍖咃紝鍐嶇敤miniport characteristics鐨凬DIS API鍚戜笂灞傜殑protocol driver鍙戦佹暟鎹寘銆侼ids intermediate driver鏈澶х殑浼樺娍灝辨槸鎵鏈塵iniport driver鐨勬暟鎹寘閮借閫氳繃瀹冭繖閲屽掓墜緇檖rotocol driver錛屾墍浠ョ綉緇滈槻鐏灝辯湅涓婁簡榪欏潡椋庢按瀹濆湴銆傜幇鍦ㄥ緢澶氱綉緇滈槻鐏閮戒嬌鐢∟DIS intermediate driver鍋氭暟鎹寘鐨勮繃婊ゅ拰鎷︽埅宸ヤ綔錛岃繃婊ょ殑瑙勫垯璁劇疆鍒癕PSendPackets錛孭TReceive錛孭TReceiveRacket榪欎笁涓嚱鏁般傚叿浣撳紑鍙戣繃紼嬭澶у鍙傝僁DK鎻愪緵鐨凱assThru婧愪唬鐮侊紝www.ndis.com錛?nbsp;緗戜笂鏈夊緢澶氱浉鍏崇殑璧勬枡銆?br>NDIS 6.0涔嬪悗錛宖ilter driver灝卞彇浠d簡Ndis intermediate driver錛學DK涓彁渚涙簮鐮併?br>b)  Ndis miniport driver涓鑸槸鐢辮澶囧巶鍟嗘彁渚涚殑錛屽湪DDK涓篃鎻愪緵浜唌iniport driver鐨勪竴涓緥瀛恊100bex錛屾敮鎸両ntel EtherExpressTM PRO/100+ Ethernet PCI adapter 鍜孖ntel EtherExpressTM PRO/100B PCI adapter涓ゆ緗戠粶閫傞厤鍣ㄣ?br>5.  鏈鍚庝粙緇嶄竴涓嬫葷嚎錛岃綆楁満鎬葷嚎鏈夊ソ鍑犵錛孶SB鎬葷嚎銆両SA鎬葷嚎銆丳CI鎬葷嚎銆佽櫄鎷熸葷嚎絳夛紝涓鑸兘鏄互PCI鎬葷嚎浣滀負鏍規葷嚎錛屽湪Windows緋葷粺涓叾浠栫殑鎬葷嚎鍙互鐞嗚В涓篜CI鎬葷嚎涓婄殑涓涓澶囥侾CI鎬葷嚎浣滀負鏍規葷嚎錛屽叾浼犺緭閫熷害杈冮珮錛屽彲浠ヨ揪鍒?33MB/S錛屾樉鍗″拰緗戝崱寰堝閮芥槸鐢≒CI鎻掓Ы銆?br>PCI-ISA妗ヨ澶囷紝涔熺О涓哄崡妗ワ紝瀹炵幇浜咺SA鎬葷嚎涓嶱CI鎬葷嚎鐨勬ˉ鎺ワ紝 鍗楁ˉ榪樺寘鎷粓绔両DE銆乁SB銆丏MA絳夋帶鍒跺櫒璁懼銆傚叾涓璘SB-HOST璁懼瀹炵幇浜哢SB鎬葷嚎鍜孭CI鎬葷嚎鐨勬ˉ鎺ャ侶OST/PCI妗ョО涓哄寳妗ワ紝鏄富澶勭悊鍣ㄤ腑蹇冨晩鍒板熀紜PCI灞閮ㄦ葷嚎銆傚崡妗ュ拰鍖楁ˉ緇勬垚浜嗕富鏉跨殑鑺墖緇勶紝閫氳繃鑺墖鐨勬墿灞曞疄鐜頒簡澶氱鎬葷嚎涓庡熀紜PCI灞閮ㄦ葷嚎鐨勬ˉ鎺ャ?br>鎬葷嚎椹卞姩紼嬪簭鍜孭NP綆$悊鍣ㄥ疄鐜頒簡鍗蟲彃鍗崇敤鐨勫姛鑳斤紝鐗╃悊璁懼瀵硅薄PDO灝辨槸鐢辨葷嚎椹卞姩紼嬪簭浜х敓鐨勩?/span>



]]>
Pro OGRE 3D Programming 涓枃緲昏瘧鐗堟湰0.2.0http://www.shnenglu.com/shaker/archive/2010/08/18/123851.htmlshaker(澶瓙)shaker(澶瓙)Wed, 18 Aug 2010 09:04:00 GMThttp://www.shnenglu.com/shaker/archive/2010/08/18/123851.htmlhttp://www.shnenglu.com/shaker/comments/123851.htmlhttp://www.shnenglu.com/shaker/archive/2010/08/18/123851.html#Feedback0http://www.shnenglu.com/shaker/comments/commentRss/123851.htmlhttp://www.shnenglu.com/shaker/services/trackbacks/123851.html

]]>
Boost鐨勭姸鎬佹満搴撴暀紼?琛ュ厖http://www.shnenglu.com/shaker/archive/2010/08/16/123601.htmlshaker(澶瓙)shaker(澶瓙)Mon, 16 Aug 2010 06:55:00 GMThttp://www.shnenglu.com/shaker/archive/2010/08/16/123601.htmlhttp://www.shnenglu.com/shaker/comments/123601.htmlhttp://www.shnenglu.com/shaker/archive/2010/08/16/123601.html#Feedback0http://www.shnenglu.com/shaker/comments/commentRss/123601.htmlhttp://www.shnenglu.com/shaker/services/trackbacks/123601.html鏉ヨ嚜:http://www.shnenglu.com/shanoa/archive/2009/05/30/86143.html
鎺ヨЕ浜哹oost鐨勭姸鎬佹満錛屽彂鐜頒笉鏄兂璞′腑鐨勯偅涔堝ソ鐢紝鍦ㄤ竴浜涘湴鏂硅繕寰楃敤涓妋pl搴撻噷鐨勪笢瑗匡紝鐢變簬瀵規ā鏉垮厓緙栫▼涓嶆槸寰堢啛緇冿紝鎼炰簡濂戒簺澶╂墠綆楀紕鏄庣櫧榪欒姝葷殑mpl::list鐨勫師鐞嗗拰鐢ㄦ硶銆?br>boost鐨勭姸鎬佹満鏄睘浜庨潤鎬侀摼鎺ョ殑鐘舵佹満錛屼篃灝辨槸璇達紝瀹冪殑鍥劇粨鏋勬槸緙栬瘧鏈熼棿灝辯‘瀹氫簡鐨勶紝鍦ㄨ繍琛屾椂涓嶅彲浠ュ姩鎬侀厤緗傛墍浠ワ紝瀹冪殑鐢ㄩ旀槸鏈変竴瀹氬眬闄愭х殑錛屼絾鍦ㄤ竴鑸儏鍐典笅錛屽畠涓嶄粎寰堥氱敤錛岃屼笖鍦ㄤ綘浼氱敤騫剁啛緇冨湴鎯呭喌涓嬶紝榪樹細寰堝ソ鐢紝鐢ㄨ搗鏉ュ緢鑸掓湇錛岄昏緫涔熷緢鍚堢悊銆備笅闈㈠氨鏄竴孌典唬鐮侊紝褰撶劧涔熸槸鍊熼壌浜嗗埆浜虹殑涓滆タ錛岃嚜宸變慨鏀逛簡涓涓嬶紝鍦∕ainState涓坊鍔犱簡涓涓猅ransition鍋氫簡嫻嬭瘯錛屽洜涓烘鍓嶆垜榪樹笉鐭ラ亾涓涓姸鎬佸浣曞寘鍚涓猅ransition錛屽懙鍛碉紝鍘熸潵鏄敤mpl::list鏉ュ仛銆傝嚦浜庤繖涓姸鎬佹満鐨勫叆闂ㄦ暀紼嬶紝緗戜笂闅忓鍙鐨勪笁閮ㄦ洸錛氥奲oost 鐘舵佹満鍏ラ棬鏁欑▼銆嬭寰楀緢娓呮銆?br>

  1 #include <iostream>
  2 #include <ctime>
  3 
  4 #include <boost/statechart/transition.hpp>
  5 #include <boost/statechart/event.hpp>
  6 #include <boost/statechart/state_machine.hpp>
  7 #include <boost/statechart/simple_state.hpp>
  8 
  9 namespace sc = boost::statechart;
 10 
 11 
 12 
 13 class EvtStartStop : public sc::event<EvtStartStop>{};
 14 class EvtReset : public sc::event<EvtReset>{};
 15 class EvtGo : public sc::event<EvtGo>{};
 16 
 17 
 18 class MainState;
 19 class StopState;
 20 class RunState;
 21 class TwoState;
 22 
 23 class Machine : public sc::state_machine<Machine, MainState>
 24 {};
 25 
 26 
 27 
 28 
 29 
 30 
 31 class MainState : public sc::simple_state<MainState, Machine, StopState>
 32 {
 33 public:
 34     typedef sc::transition<EvtReset, MainState> reactReset;
 35     typedef sc::transition<EvtGo, TwoState> reactGo;
 36     typedef boost::mpl::list<reactReset, reactGo> reactions;
 37 
 38     MainState(void){
 39         std::cout<<"榪涘叆MainState"<<std::endl;
 40         mTime = 0;
 41     }
 42 
 43     ~MainState(void){
 44         std::cout<<"閫鍑篗ainState"<<std::endl;
 45     }
 46 
 47     double mTime;
 48 };
 49 
 50 
 51 // 璇ョ姸鎬佸睘浜庢棤鐢ㄧ姸鎬侊紝鐢ㄤ簬嫻嬭瘯mpl::list鐨勫transition鐢ㄦ硶
 52 class TwoState : public sc::simple_state<TwoState, Machine>
 53 {
 54 public:
 55     typedef sc::transition<EvtGo, MainState> reactions;
 56 
 57     TwoState(void){
 58         std::cout<<"榪涘叆TwoState"<<std::endl;
 59     }
 60 
 61     ~TwoState(void){
 62         std::cout<<"閫鍑篢woState"<<std::endl;
 63     }
 64 };
 65 
 66 
 67 class StopState : public sc::simple_state<StopState, MainState>
 68 {
 69 public:
 70     typedef sc::transition<EvtStartStop, RunState> reactions;
 71     StopState(void){
 72         std::cout<<"榪涘叆StopState"<<std::endl;
 73     }
 74 
 75     ~StopState(void){
 76         std::cout<<"閫鍑篠topState"<<std::endl;
 77     }
 78 };
 79 
 80 class RunState : public sc::simple_state<RunState, MainState>
 81 {
 82 public:
 83     typedef sc::transition<EvtStartStop, StopState> reactions;
 84     RunState(void){
 85         std::cout<<"榪涘叆RunState"<<std::endl;
 86         mStartTime = 0;
 87     }
 88 
 89     ~RunState(void){
 90         std::cout<<"閫鍑篟unState"<<std::endl;
 91         context<MainState>().mTime += std::difftime(std::time(0), mStartTime);
 92     }
 93 
 94     std::time_t mStartTime;
 95 };
 96 
 97 
 98 int _tmain(int argc, _TCHAR* argv[])
 99 {
100     Machine mc;
101     mc.initiate();
102 
103     mc.process_event(EvtStartStop());
104     mc.process_event(EvtStartStop());
105     mc.process_event(EvtReset());
106     mc.process_event(EvtGo());
107     mc.process_event(EvtGo());
108 
109     return 0;
110 }


]]>
Boost鐨勭姸鎬佹満搴撴暀紼?3)http://www.shnenglu.com/shaker/archive/2010/08/16/123599.htmlshaker(澶瓙)shaker(澶瓙)Mon, 16 Aug 2010 06:53:00 GMThttp://www.shnenglu.com/shaker/archive/2010/08/16/123599.htmlhttp://www.shnenglu.com/shaker/comments/123599.htmlhttp://www.shnenglu.com/shaker/archive/2010/08/16/123599.html#Feedback1http://www.shnenglu.com/shaker/comments/commentRss/123599.htmlhttp://www.shnenglu.com/shaker/services/trackbacks/123599.html

1.2 澧炲姞鍔ㄤ綔


    姝ゆ椂鎴戜滑灝嗗彧鐢ㄤ竴縐嶅姩浣滐細transitions錛屾垜浠湪涓嬮潰鐨勪唬鐮佷腑鎻掑叆浜嗛粦浣撶殑閮ㄥ垎銆?/span>

 1#include <boost/statechart/transition.hpp>
 2
 3// 
 4
 5struct  Stopped;
 6struct  Active : sc::simple_state< Active, StopWatch, Stopped >
 7{
 8   typedef  sc::transition< EvReset, Active > reactions;
 9}
;
10
11struct  Running : sc::simple_state< Running, Active >
12{
13   typedef  sc::transition< EvStartStop, Stopped > reactions;
14}
;
15
16struct  Stopped : sc::simple_state< Stopped, Active >
17{
18   typedef  sc::transition< EvStartStop, Running > reactions;
19}
;
20
21//涓涓姸鎬佸彲浠ュ畾涔変換鎰忔暟閲忕殑鍔ㄤ綔銆傝繖灝辨槸涓轟粈涔堝綋澶氫簬涓涓椂錛?br>22//鎴戜滑涓嶅緱涓嶅皢瀹冧滑鏀懼埌涓涓猰pl::list<> 閲屻?/span>
23
24int  main()
25{
26  StopWatch myWatch;
27  myWatch.initiate();
28  myWatch.process_event( EvStartStop() );
29  myWatch.process_event( EvStartStop() );
30  myWatch.process_event( EvStartStop() );
31  myWatch.process_event( EvReset() );
32   return  0;
33}

34


    鐜板湪鎴戜滑鏈変簡鎵鏈夌殑鐘舵侊紝騫跺湪閫傚綋鐨勪綅緗鍔犱簡鎵鏈夌殑榪佺Щ鍔ㄤ綔錛屽悓鏃舵垜浠篃鍚慡topWatch鍙戦佷簡涓浜涗簨浠躲傝繖涓姸鎬佹満浼氬敖鑱屽敖璐g殑鎸夋垜浠殑甯屾湜榪涜鐘舵佽縼縐伙紝浣嗕緷鐒剁幇鍦ㄨ繕娌℃湁鍏跺畠鐨勫姩浣溿?/span>


1.3 State-local瀛樺偍


    涓嬩竴姝ユ垜浠皢璁╄繖涓猄top watch鐪熸鐨勮褰曟椂闂翠簡銆傛牴鎹畇top watch鎵澶勪笉鍚岀殑鐘舵侊紝鎴戜滑闇瑕佷笉鍚岀殑鍙橀噺銆?/span>

Stopped鐘舵侊細闇瑕佷竴涓繚瀛橀濆幓鏃墮棿鐨勫彉閲忋?/span>

l Running鐘舵侊細闇瑕佷竴涓繚瀛橀濆幓鏃墮棿鐨勫彉閲忥紝榪橀渶瑕佷竴涓繚瀛樹笂涓嬈″惎鍔ㄧ殑鏃墮棿鐐圭殑鍙橀噺銆?/span>

    鏃犺鐘舵佹満鍦ㄤ粈涔堢姸鎬佷笅錛屾垜浠兘蹇呴』瑙傚療閫濆幓鏃墮棿榪欎釜鍙橀噺銆傛澶栵紝褰撴垜浠悜鐘舵佹満鍙戦丒vReSet浜嬩歡鏃訛紝榪欎釜鍙橀噺搴旇琚疆涓?銆傚叾瀹冪殑鍙橀噺鍙槸鐘舵佹満鍦≧unning鐘舵佹椂闇瑕併傛棤璁轟綍鏃舵垜浠繘鍏unning鐘舵佹椂錛屽畠搴旇琚疆涓虹郴緇熸椂閽熺殑褰撳墠鏃墮棿銆傚綋鎴戜滑閫鍑篟unning鐘舵佹椂錛屾垜浠粎浠呬粠緋葷粺鏃墮挓鐨勫綋鍓嶆椂闂村噺鍘誨紑濮嬫椂闂達紙榪涘叆鏃惰褰曠殑鏃墮棿錛夛紝灝嗙粨鏋滃姞鍒伴濆幓鏃墮棿閲屽氨鍙互浜嗐?/span>

 1#include <ctime>
 2
 3// 
 4
 5struct  Stopped;
 6struct  Active : sc::simple_state< Active, StopWatch, Stopped >
 7{
 8   public :
 9     typedef  sc::transition< EvReset, Active > reactions;
10
11    Active() : elapsedTime_( 0.0 ) {}
12    double  ElapsedTime()  const  {  return  elapsedTime_; }
13    double  & ElapsedTime() {  return  elapsedTime_; }
14   private :
15     double  elapsedTime_ ;
16}
;
17
18struct  Running : sc::simple_state< Running, Active >
19{
20   public :
21     typedef  sc::transition< EvStartStop, Stopped > reactions;
22
23    Running() : startTime_( std::time( 0 ) ) {}
24    ~Running()
25    {
26       // 涓庢淳鐢熺被鍙互璁塊棶瀹冪殑鍩虹被鐩鎬技錛?br>27       //context<>() 鐢ㄦ潵鑾峰緱涓涓姸鎬佺殑鐩存帴鎴栭棿鎺ョ殑涓婁笅鏂囩殑璁塊棶鏉冦?br>28       // 榪欏彲浠ユ槸鐩存帴鎴栭棿鎺ョ殑澶栧眰鐘舵佹垨鐘舵佹満鏈韓
29       // (渚嬪錛屽儚榪欐牱: context< StopWatch >()).
30      context< Active >().ElapsedTime() +=
31        std::difftime( std::time( 0 ), startTime_ );
32    }

33   private :
34    std:: time_t  startTime_;
35}
;

    榪欎釜鐘舵佹満鐜板湪鍙互嫻嬮噺鏃墮棿浜嗭紝浣嗘槸鎴戜滑榪樹笉鑳界湅鍒扮粨鏋溿?/span>

鍦ㄨ繖閲岋紝State-local storage鐨勪紭鍔胯繕娌℃湁瀹屾垚鏄劇幇鍑烘潵銆傚湪FAQ欏圭洰“State-local storage閰峰湪鍝噷錛?#8221;涓紝浼氶氳繃涓庝竴涓病鏈夌敤State-local storage鐨凷top Watch鐨勬瘮杈冩潵璇存槑銆?/span>


1.4 鍦ㄧ姸鎬佹満澶栧緱鍒扮姸鎬佷俊鎭?/span>


    涓轟簡鍙栧緱嫻嬮噺鐨勬椂闂達紝鎴戜滑闇瑕佷竴涓粠鐘舵佹満澶栧緱鍒扮姸鎬佷俊鎭殑鏈哄埗銆傛寜鎴戜滑鐜板湪鐨勭姸鎬佹満璁捐錛屽彲浠ユ湁涓ょ鏂規硶銆備負綆鍗曡搗瑙侊紝鎴戜滑鍦ㄨ繖閲岀敤涓涓綆鏁堢殑鏂瑰紡錛歴tate_cast<>()(鍦⊿topWatch2.cpp涓垜浠細鐢ㄤ竴涓◢澶嶆潅涓鐐圭殑鏇夸唬鏂規硶)錛?span style="COLOR: #000080">璇戣呮敞錛氬湪StopWatch2.cpp涓槸鍚戠姸鎬佹満鍙戦佷竴涓彇寰楅濆幓鏃墮棿鐨勪簨浠訛紝浠庝簨浠舵垚鍛橀噺涓皢閫濆幓鏃墮棿甯﹀洖鏉?/span> 錛夛紝浠庡瓧闈㈡剰鎬濆氨鍙互鐪嬪嚭錛屽畠鍦ㄨ涔変笂涓巇ynamic_cast鏈夌偣鐩鎬技銆備緥濡傦紝褰撴垜浠皟鐢╩yWatch.state_cast<const Stpped&>()鏃訛紝褰撶姸鎬佹満鍦⊿topped鐘舵佹椂錛屾垜浠細寰楀埌涓涓猄topped鐘舵佺被鐨勫紩鐢ㄣ傚惁鍒欙紝浼氭姏鍑簊td::bad_cast寮傚父銆傛垜浠彲浠ュ埄鐢ㄨ繖涓姛鑳芥潵瀹炵幇涓涓猄topWatch鐨勬垚鍛樺嚱鏁幫紝璁╁畠鐨勭粨鏋滆繑鍥為濆幓鐨勬椂闂淬傜劧鑰岋紝鎴戜滑涓嶆槸鍏堥棶涓涓嬬姸鎬佹満鍦ㄤ粈涔堢姸鎬侊紝鐒跺悗鍐嶅幓鐢ㄤ笉鍚岀殑鏂規硶璁$畻閫濆幓鏃墮棿錛岃屾槸灝嗚綆楁斁鍒癝topped鍜孯unning鐘舵佷腑錛岀敤涓涓帴鍙f潵鑾峰緱閫濆幓閫濆幓鏃墮棿銆?/span>

 

  1. #include <iostream> 
  2. // ... 
  3. struct  IElapsedTime 
  4.    virtual   double  ElapsedTime()  const  = 0; 
  5. }; 
  6. struct  Active; 
  7. struct  StopWatch : sc::state_machine< StopWatch, Active > 
  8.    double  ElapsedTime()  const  
  9.   { 
  10.      return  state_cast<  const  IElapsedTime & >().ElapsedTime(); 
  11.   } 
  12. }; 
  13. // ... 
  14. struct  Running : IElapsedTime,  
  15.   sc::simple_state< Running, Active > 
  16.    public
  17.      typedef  sc::transition< EvStartStop, Stopped > reactions; 
  18.     Running() : startTime_( std::time( 0 ) ) {} 
  19.     ~Running() 
  20.     { 
  21.       context< Active >().ElapsedTime() = ElapsedTime(); 
  22.     }
  23.      virtual   double  ElapsedTime()  const  
  24.         { 
  25.            return  context< Active >().ElapsedTime() + 
  26.             std::difftime( std::time( 0 ), startTime_ ); 
  27.         } 
  28.        private
  29.         std:: time_t  startTime_; 
  30.     };  
  31.      
  32.      struct  Stopped : IElapsedTime,  
  33.       sc::simple_state< Stopped, Active > 
  34.     { 
  35.        typedef  sc::transition< EvStartStop, Running > reactions; 
  36.      
  37.        virtual   double  ElapsedTime()  const  
  38.       { 
  39.          return  context< Active >().ElapsedTime(); 
  40.       }  
  41.     }; 
  42.      
  43.      int  main() 
  44.     { 
  45.       StopWatch myWatch; 
  46.       myWatch.initiate(); 
  47.       std::cout << myWatch.ElapsedTime() <<  "\n" ;  
  48.       myWatch.process_event( EvStartStop() ); 
  49.       std::cout << myWatch.ElapsedTime() <<  "\n"
  50.       myWatch.process_event( EvStartStop() ); 
  51.       std::cout << myWatch.ElapsedTime() <<  "\n"
  52.       myWatch.process_event( EvStartStop() ); 
  53.       std::cout << myWatch.ElapsedTime() <<  "\n"
  54.       myWatch.process_event( EvReset() ); 
  55.       std::cout << myWatch.ElapsedTime() <<  "\n"
  56.        return  0; 
  57.     }

涓轟簡紜疄鐪嬪埌琚祴閲忕殑鏃墮棿錛屼綘搴旇鎯沖姙娉曞湪main()涓崟姝ユ墽琛屻係topWatch渚嬪瓙灝嗚繖涓▼搴忔墿灞曚負涓涓氦浜掑紡鐨勭粓绔▼搴忎簡銆?/span>



]]>
Boost鐨勭姸鎬佹満搴撴暀紼?2)http://www.shnenglu.com/shaker/archive/2010/08/16/123598.htmlshaker(澶瓙)shaker(澶瓙)Mon, 16 Aug 2010 06:45:00 GMThttp://www.shnenglu.com/shaker/archive/2010/08/16/123598.htmlhttp://www.shnenglu.com/shaker/comments/123598.htmlhttp://www.shnenglu.com/shaker/archive/2010/08/16/123598.html#Feedback0http://www.shnenglu.com/shaker/comments/commentRss/123598.htmlhttp://www.shnenglu.com/shaker/services/trackbacks/123598.html1 鍩虹涓婚錛氱琛?/strong>
    涓嬮潰鎴戜滑瑕佷負涓涓満姊扮琛ㄥ緩妯′竴涓姸鎬佹満銆傝繖鏍蜂竴涓琛ㄩ氬父浼氭湁涓や釜鎸夐挳銆?br>     * Start/Stop
     * Reset
     鍚屾椂鏈変袱縐嶇姸鎬侊細
     * Stoped: 琛ㄩ拡鍋滅暀鍦ㄤ笂嬈″仠姝㈡椂鐨勪綅緗細
        o 鎸変笅Reset鎸夐挳錛岃〃閽堝洖閫鍒?鐨勪綅緗傜琛ㄤ繚鎸佸湪Stoped鐘舵佷笉鍙樸?br>        o 鎸変笅Start/Stop鎸夐挳錛岀琛ㄨ漿鍒癛unning鐘舵併?br>     * Running: 琛ㄩ拡鍦ㄧЩ鍔紝騫舵寔緇樉紺鴻繃鍘葷殑鏃墮棿錛?/span>
        o 鎸変笅Reset鎸夐挳錛岃〃閽堝洖閫鍒?鐨勪綅緗紝縐掕〃杞埌鍋滄鐘舵併?br>        o 鎸変笅Start/Stop鎸夐挳錛岃漿鍒癝toped鐘舵併?br>    涓嬮潰鏄叾UML鍥撅細



1.1 瀹氫箟鐘舵佸拰浜嬩歡
涓や釜鎸夐挳鍙互寤烘ā涓轟袱涓簨浠躲傝繘鑰岋紝瀹氫箟鍑哄繀瑕佺殑鐘舵佸拰鍒濆鐘舵併傛垜浠粠涓嬮潰鐨勪唬鐮佸紑濮嬶紝浠ュ墠鐨勪唬鐮佺墖孌典細闄嗙畫鍔犲叆鍏朵腑錛?/span>

 

#include <boost/statechart/event.hpp>
#include 
<boost/statechart/state_machine.hpp>
#include 
<boost/statechart/simple_state.hpp>

namespace sc = boost::statechart;

struct EvStartStop : sc::event< EvStartStop > {};
struct EvReset : sc::event< EvReset > {};

struct Active;
struct StopWatch : sc::state_machine< StopWatch, Active > {};

struct Stopped;

// 榪欓噷鐨剆imple_state綾繪ā鏉垮彲浠ユ帴鍙?涓弬鏁幫細
// - 絎?涓弬鏁版寚瀹氬唴閮ㄧ殑鍒濆鐘舵侊紝濡傛灉鏈変竴涓繖鏍風殑鐘舵佺殑璇濄?br>//   鍦ㄨ繖閲岋紝Active鏈変竴涓唴閮ㄧ姸鎬侊紙Stoped錛夛紝 鎵浠ュ皢榪欎釜鍐呴儴
//   鍒濆鐘舵佷紶緇欏畠鐨勫熀綾匯?br>// - 絎?涓弬鏁版寚瀹氭槸鍚︿繚鐣欏拰淇濈暀浠涔堢被鍨嬪巻鍙?br>
// Active鏄渶澶栧眰鐨勭姸鎬侊紝鍥犳瑕佹妸瀹冩墍灞炵殑鐘舵佹満綾諱紶緇欏畠
struct Active : sc::simple_state<
  Active, StopWatch, Stopped 
> {};

// Stopped 鍜?nbsp;Running 閮芥妸Active浣滀負瀹冧滑鐨勪笂涓嬫枃錛岃繖浣夸粬浠祵鍏ュ埌浜咥ctive鐘舵佷腑銆?/span>
struct Running : sc::simple_state< Running, Active > {};
struct Stopped : sc::simple_state< Stopped, Active > {};

// 鍥犱負鐘舵佺殑涓婁笅鏂囧繀欏繪槸涓涓畬鏁寸殑綾誨瀷錛堜笉鑳藉崟鍗曟槸澹版槑錛夛紝
// 鎵浠ョ姸鎬佹満蹇呴』瑕佸湪“澶栧眰鐘舵?#8221;涔嬮棿鍏堝畾涔夈?br>// 涔熷氨鏄錛屾垜浠渶瑕佷粠鐘舵佹満寮濮嬶紝鐒跺悗鏄渶澶栧眰鐨勭姸鎬侊紝鐒跺悗鏄叾鍐呴儴鐨勭姸鎬侊紝濡傛鍙嶅銆?br>// 鎴戜滑鍙互鐢ㄥ箍搴︽垨娣卞害鏂瑰紡錛屽啀鎴栨槸浠ヤ袱閮芥販鍚堢殑鏂瑰紡鏉ヨ繘琛屽畾涔夈?/span>

int main()
{
  StopWatch myWatch;
  myWatch.initiate();
  
return 0;
}

榪欎釜浠g爜宸茬粡鍙互緙栬瘧浜嗭紝浣嗕笉浼氬彂鐢熶換浣曞彲瀵熻鐨勪簨浠躲?br>



]]>
Boost鐨勭姸鎬佹満搴撴暀紼?1) http://www.shnenglu.com/shaker/archive/2010/08/16/123597.htmlshaker(澶瓙)shaker(澶瓙)Mon, 16 Aug 2010 06:42:00 GMThttp://www.shnenglu.com/shaker/archive/2010/08/16/123597.htmlhttp://www.shnenglu.com/shaker/comments/123597.htmlhttp://www.shnenglu.com/shaker/archive/2010/08/16/123597.html#Feedback0http://www.shnenglu.com/shaker/comments/commentRss/123597.htmlhttp://www.shnenglu.com/shaker/services/trackbacks/123597.html浠嬬粛
    Boost鐘舵佹満搴撲竴涓簲鐢ㄧ▼搴忔鏋訛紝浣犲彲浠ョ敤瀹冨皢UML鐘舵佸浘蹇熺殑杞崲涓哄彲鎵ц鐨刢++浠g爜錛岃屼笉闇瑕佷換浣曠殑浠g爜鐢熸垚鍣ㄣ傚畠鏀寔鍑犱箮鎵鏈夌殑UML鐗瑰緛錛屽彲浠ョ洿鎺ヤ簡褰撶殑杞崲錛屽茍涓旇漿鎹㈠悗鐨刢++浠g爜灝卞儚瀵圭姸鎬佹満榪涜涓嬈℃枃鏈弿榪頒竴鏍峰叿浣撳彲璇繪с?br>
濡備綍闃呰榪欎釜鏁欑▼
    榪欎釜鏁欑▼鏄互綰挎ч槄璇葷殑鏂瑰紡榪涜鐨勭珷鑺傝璁°傚鏋滀綘鏄涓嬈$湅榪欎釜鏁欑▼鐨勮瘽錛屼綘鍙互浠庡ご寮濮嬭錛屽埌浣犺寰椾簡瑙g殑涓滆タ瀵逛綘鎵嬪ご鐨勪換鍔℃潵璇村凡緇忚凍澶熸椂灝卞仠姝€傚叿浣撳彲浠ヨ繖鏍鳳細
    * 濡傛灉浣犵殑浠誨姟鏄瀹炵幇涓涓皬鐨勩佺畝鍗曠殑錛屽茍涓旀湁寰堝皯鍑犱釜鐘舵佺殑鐘舵佹満錛岄偅涔堜笅闈㈢殑“鍒濈駭涓婚錛氱琛?#8221;閲屾墍璁茬殑灝卞樊涓嶅澶熶綘鐢ㄧ殑浜嗐?br>    * 濡傛灉浣犺鍋氫竴涓湁寰堝鐘舵佺殑澶у瀷鐘舵佹満錛屼綘鍙互鐪嬩竴涓?#8220;涓駭涓婚錛氭暟鐮佺浉鏈?#8221;錛岄偅閲岀殑璁茶В鍙兘瀵逛綘鏈夊府鍔┿?br>    * 鏈鍚庯紝濡傛灉浣犳槸涓涓鍒涘緩寮傚父澶嶆潅鐘舵佹満鐨勭敤鎴鳳紝鎴栬呮槸涓涓兂瑕佽瘎浼頒竴涓狟oost鐘舵佹満鐨勮璁″笀鐨勮瘽錛屼綘灝辮鐪嬩竴涓?#8220;楂樼駭涓婚”閮ㄥ垎銆傚茍涓旓紝鎴戣繕寮虹儓寤鴻浣犵湅涓涓婻ationle閲岀殑Limitions閮ㄥ垎銆?br>
Hello World!
    鎴戜滑灝嗚浠庝竴涓渶綆鍗曠▼搴忓紑濮嬫垜浠殑絎竴姝ワ紝鐘舵佸浘濡備笅錛?br>
瀵逛簬榪欎釜鐘舵佸浘錛屾垜浠殑瀹炵幇浠g爜濡備笅錛?
 1#include <boost/statechart/state_machine.hpp>
 2#include <boost/statechart/simple_state.hpp>
 3#include <iostream>
 4
 5namespace  sc = boost::statechart;
 6
 7// 涓轟簡閬垮厤鍐檖ublic錛屼笅闈㈠0鏄庣殑綾誨瀷鍏ㄩ儴涓簊truct銆?br> 8// 濡傛灉浣犱笉鍦ㄤ箮鐨勮瘽鍙互鎶婂畠浠兘鏀規垚class銆?br> 9
10// 鎴戜滑闇瑕佸厛澹版槑涓涓嬪垵濮嬬姸鎬侊紝榪欐槸鍥犱負鎴戜滑瑕佸湪瀹氫箟鐘舵佹満鏃朵嬌鐢ㄥ畠
11// 浣嗗張涓嶅緱涓嶅湪鐘舵佹満榪欏悗瀹氫箟瀹冦?/span>
12
13struct  Greeting;
14
15// Boost.Statechart澶ч噺搴旂敤妯℃澘妯″紡銆?br>16// 媧劇敓綾誨繀欏誨皢鑷繁鍋氫負鍩虹被妯℃澘鐨勭涓涓弬鏁般?br>17//
18// 鐘舵佹満蹇呴』瑕佺煡閬撳綋鍏跺垵濮嬪寲鍚庤繘琛岀殑絎竴涓姸鎬併?br>19// 榪欏氨鏄負浠涔圙reeting瑕佸仛涓烘瘡浜屼釜妯℃澘鍙傛暟銆?br>20// 錛堣瘧鑰呮敞錛氫篃灝辨槸璇碐reeting鐘舵佹槸Machine鐘舵佹満鍒濆鍖栧悗榪涘叆鐨勭涓涓姸鎬侊級
21struct  Machine : sc::state_machine< Machine, Greeting > {};
22
23// 瀵逛簬姣忎竴涓姸鎬侊紝鎴戜滑闇瑕佷負鍏舵寚鏄庯細瀹冨睘浜庡摢涓涓姸鎬佹満錛屽畠浣嶄簬鐘舵佸浘鐨勫摢涓綅緗?br>24// 鎴戜滑鐢╯imple_state<>鐨勪笂涓嬫枃鍙傛暟灝卞彲浠ュ畬鎴愯繖浜涙寚瀹氫簡銆?br>25// 瀵逛簬鎴戜滑鐩墠鐨勮繖涓畝鍗曠殑鐘舵佹満鏉ヨ錛屼笂涓嬫枃灝辨槸鐘舵佹満錛圡achine)
26// 鎵浠ワ紝Machine蹇呴』瑕佸仛涓簊imple_state鐨勭浜屼釜妯″潡鍙傛暟銆?br>27// 錛堝叧浜庝笂涓嬫枃鍙傛暟鐨勮緇嗚В閲婂湪涓嬩竴涓緥瀛愪腑鏈夛級
28struct  Greeting : sc::simple_state< Greeting, Machine >
29{
30  // 涓鏃︾姸鎬佹満榪涜涓涓姸鎬佺殑鏃跺欙紝瀹冨氨瑕佸垱寤轟竴涓浉搴旂姸鎬佺被鐨勫璞★紙綾誨疄渚嬶級
31  // 鍙鐘舵佹満淇濇寔鍦ㄨ繖涓姸鎬佷笅錛岃繖涓璞″氨浼氫竴鐩村瓨鍦ㄣ?br>32  // 鏈鍚庯紝褰撶姸鎬佹満紱誨紑榪欎釜鐘舵佹椂錛屽璞¤閿姣併?br>33  // 鎵浠ワ紝涓涓姸鎬佺殑榪涘叆鍔ㄤ綔灝辨槸榪欎釜鐘舵佺被鐨勬瀯閫犲櫒錛岃屽畠鐨勯鍑哄姩浣滃垯鏄畠鐨勬瀽鏋勭被銆?nbsp;  Greeting() { std::cout <<  "Hello World!\n" ; }  // 榪涘叆
34  ~Greeting() { std::cout <<  "Bye Bye World!\n" ; }  // 閫鍑?/span>
35}
;
36
37int  main()
38{
39  Machine myMachine;
40  // 鏋勯犲畬鐘舵佹満鍚庯紝瀹冨茍鏈紑濮嬭繍琛屻傛垜浠閫氳繃璋冪敤瀹冪殑initiate()鏉ュ惎鍔ㄥ畠銆?br>41  // 鍚屾椂錛屽畠涔熷皢瑙﹀彂瀹冪殑鍒濆鐘舵侊紙Greeting錛夌殑鏋勯犮?/span>
42  myMachine.initiate();
43  // 褰撴垜浠寮main()鍑芥暟鏃訛紝myMachine灝嗚閿姣侊紝榪欏皢瀵艱嚧瀹冮攢姣佸畠鍐呴儴鐨勬墍鏈夋椿鍔ㄧ殑鐘舵佺被銆?br>44  // 錛堣瘧鑰呮敞錛氫負浠涔堜細璇存墍鏈夛紵榪欐槸鍥犱負涓涓姸鎬佹満鍙互鍚屾椂淇濇寔鍦ㄥ涓姸鎬佷腑錛屽彲浠ュ弬鑰?#8220;楂樼駭涓婚”閮ㄥ垎錛?/span>
45  return  0;
46}
榪欎釜紼嬪簭浼氭樉紺?#8220;Hello World!”鍜?#8220; Bye Bye World! ”錛岀劧鍚庨鍑恒?/span>

shaker(澶瓙) 2010-08-16 14:42 鍙戣〃璇勮
]]>
[杞琞RGB涓嶻UV杞崲http://www.shnenglu.com/shaker/archive/2010/03/26/110607.htmlshaker(澶瓙)shaker(澶瓙)Fri, 26 Mar 2010 12:27:00 GMThttp://www.shnenglu.com/shaker/archive/2010/03/26/110607.htmlhttp://www.shnenglu.com/shaker/comments/110607.htmlhttp://www.shnenglu.com/shaker/archive/2010/03/26/110607.html#Feedback0http://www.shnenglu.com/shaker/comments/commentRss/110607.htmlhttp://www.shnenglu.com/shaker/services/trackbacks/110607.html1 鍓嶈█

        鑷劧鐣岀殑棰滆壊鍗冨彉涓囧寲錛屼負浜嗙粰棰滆壊涓涓噺鍖栫殑琛¢噺鏍囧噯錛屽氨闇瑕佸緩绔嬭壊褰╃┖闂存ā鍨嬫潵鎻忚堪鍚勭鍚勬牱鐨勯鑹詫紝鐢變簬浜哄鑹插僵鐨勬劅鐭ユ槸涓涓鏉傜殑鐢熺悊鍜屽績鐞嗚仈鍚堜綔鐢?鐨勮繃紼嬶紝鎵浠ュ湪涓嶅悓鐨勫簲鐢ㄩ鍩熶腑涓轟簡鏇村ソ鏇村噯紜殑婊¤凍鍚勮嚜鐨勯渶姹傦紝灝卞嚭鐜頒簡鍚勭鍚勬牱鐨勮壊褰╃┖闂存ā鍨嬫潵閲忓寲鐨勬弿榪伴鑹層傛垜浠瘮杈冨父鎺ヨЕ鍒扮殑灝卞寘鎷?RGB / CMYK / YIQ / YUV / HSI絳夌瓑銆?/p>

        瀵逛簬鏁板瓧鐢靛瓙澶氬獟浣撻鍩熸潵璇達紝鎴戜滑緇忓父鎺ヨЕ鍒扮殑鑹插僵絀洪棿鐨勬蹇碉紝涓昏鏄疪GB , YUV榪欎袱縐嶏紙瀹為檯涓婏紝榪欎袱縐嶄綋緋誨寘鍚簡璁稿縐嶅叿浣撶殑棰滆壊琛ㄨ揪鏂瑰紡鍜屾ā鍨嬶紝濡俿RGB, Adobe RGB, YUV422, YUV420 …錛? RGB鏄寜涓夊熀鑹插姞鍏夌郴緇熺殑鍘熺悊鏉ユ弿榪伴鑹詫紝鑰孻UV鍒欐槸鎸夌収 浜害錛岃壊宸殑鍘熺悊鏉ユ弿榪伴鑹層?/p>

        鍗充嬌鍙槸RGB YUV榪欎袱澶х被鑹插僵絀洪棿錛屾墍娑夊強鍒扮殑鐭ヨ瘑涔熸槸鍗佸垎涓板瘜澶嶆潅鐨勶紝鑷煡涓嶅叿澶囪凍澶熺殑鐩稿叧涓撲笟鐭ヨ瘑錛屾墍浠ユ湰鏂囦富瑕侀拡瀵瑰伐紼嬮鍩熺殑搴旂敤鍙婄畻娉曡繘琛岃璁恒?/p>

2 YUV鐩稿叧鑹插僵絀洪棿妯″瀷

2.1 YUV 涓?YIQ YcrCb

        瀵逛簬YUV妯″瀷錛屽疄闄呬笂寰堝鏃跺欙紝鎴戜滑鏄妸瀹冨拰YIQ / YCrCb妯″瀷娣蜂負涓璋堢殑銆?/p>

        瀹為檯涓?YUV妯″瀷鐢ㄤ簬PAL鍒跺紡鐨勭數瑙嗙郴緇燂紝Y琛ㄧず浜害錛孶V騫墮潪浠諱綍鍗曡瘝鐨勭緝鍐欍?/p>

        YIQ妯″瀷涓嶻UV妯″瀷綾諱技錛岀敤浜嶯TSC鍒跺紡鐨勭數瑙嗙郴緇熴俌IQ棰滆壊絀洪棿涓殑I鍜孮鍒嗛噺鐩稿綋浜庡皢YUV絀洪棿涓殑UV鍒嗛噺鍋氫簡涓涓?3搴︾殑鏃嬭漿銆?/p>

        YCbCr棰滆壊絀洪棿鏄敱YUV棰滆壊絀洪棿媧劇敓鐨勪竴縐嶉鑹茬┖闂達紝涓昏鐢ㄤ簬鏁板瓧鐢佃緋葷粺涓備粠RGB鍒癥CbCr鐨勮漿鎹腑錛岃緭鍏ャ佽緭鍑洪兘鏄?浣嶄簩榪涘埗鏍煎紡銆?/p>

        涓夎呬笌RGB鐨勮漿鎹㈡柟紼嬪涓嬶細

        RGB -> YUV錛?/p>


        瀹為檯涓婁篃灝辨槸錛?/p>

Y=0.30R+0.59G+0.11B 錛?U=0.493(B錛峐) 錛?V=0.877(R錛峐)

        RGB -> YIQ錛?/p>


        RGB -> YCrCb錛?/p>


        浠庡叕寮忎腑錛屾垜浠叧閿鐞嗚В鐨勪竴鐐規槸錛孶V / CbCr淇″彿瀹為檯涓婂氨鏄摑鑹插樊淇″彿鍜岀孩鑹插樊淇″彿錛岃繘鑰岃█涔嬶紝瀹為檯涓婁竴瀹氱▼搴︿笂闂存帴鐨勪唬琛ㄤ簡钃濊壊鍜岀孩鑹茬殑寮哄害錛岀悊瑙h繖涓鐐瑰浜庢垜浠悊瑙e悇縐嶉鑹插彉鎹㈠鐞嗙殑榪囩▼浼氭湁寰堝ぇ鐨勫府鍔┿?/p>

        鎴戜滑鍦ㄦ暟瀛楃數瀛愬濯掍綋棰嗗煙鎵璋堝埌鐨刌UV鏍煎紡錛屽疄闄呬笂鍑嗙‘鐨勮錛屾槸浠crCb鑹插僵絀洪棿妯″瀷涓哄熀紜鐨勫叿鏈夊縐嶅瓨鍌ㄦ牸寮忕殑涓綾婚鑹叉ā鍨嬬殑瀹舵棌錛堝寘鎷?YUV444 / YUV422 / YUV420 / YUV420P絳夌瓑錛夈傚茍涓嶆槸浼犵粺鎰忎箟涓婄敤浜嶱AL鍒舵ā鎷熺數瑙嗙殑YUV妯″瀷銆傝繖浜沋UV妯″瀷鐨勫尯鍒富瑕佸湪浜嶶V鏁版嵁鐨勯噰鏍鋒柟寮忓拰瀛樺偍鏂瑰紡錛岃繖閲屽氨涓嶈榪般?/p>

        鑰屽湪Camera Sensor涓紝鏈甯哥敤鐨刌UV妯″瀷鏄?YUV422鏍煎紡錛屽洜涓哄畠閲囩敤4涓瓧鑺傛弿榪頒袱涓儚绱狅紝鑳藉拰RGB565妯″瀷姣旇緝濂界殑鍏煎銆傛湁鍒╀簬Camera Sensor鍜孋amera controller鐨勮蔣紜歡鎺ュ彛璁捐銆?/p>

3 YUV2RGB蹇熺畻娉曞垎鏋?/p>

        榪欓噷鎸囩殑YUV瀹為檯鏄痀crCb浜?8  ) YUV2RGB鐨勮漿鎹㈠叕寮忔湰韜槸寰堢畝鍗曠殑錛屼絾鏄壍娑夊埌嫻偣榪愮畻錛屾墍浠ワ紝濡傛灉瑕佸疄鐜板揩閫熺畻娉曪紝綆楁硶緇撴瀯鏈韓娌′粈涔堝ソ鐮旂┒鐨勪簡錛屼富瑕佹槸閲囩敤鏁村瀷榪愮畻鎴栬呮煡琛ㄦ潵鍔犲揩璁$畻閫熷害銆?br>棣栧厛鍙互鎺ㄥ寰楀埌杞崲鍏紡涓猴細

        R = Y + 1.4075 *錛圴-128錛?br>        G = Y – 0.3455 *錛圲 –128錛?– 0.7169 *錛圴 –128錛?br>        B = Y + 1.779 *錛圲 – 128錛?/p>

3.1 鏁村瀷綆楁硶

       瑕佺敤鏁村瀷榪愮畻浠f浛嫻偣榪愮畻錛屽綋鐒舵槸瑕佺敤縐諱綅鐨勫姙娉曚簡錛屾垜浠彲浠ュ緢瀹規槗寰楀埌涓嬪垪綆楁硶錛?/p>

        u = YUVdata[UPOS] - 128;
        v = YUVdata[VPOS] - 128;

        rdif = v + ((v * 103) >> 8);
        invgdif = ((u * 88) >> 8) +((v * 183) >> 8);
        bdif = u +( (u*198) >> 8);

        r = YUVdata[YPOS] + rdif;
        g = YUVdata[YPOS] - invgdif;
        b = YUVdata[YPOS] + bdif;

涓轟簡闃叉鍑虹幇婧㈠嚭錛岃繕闇瑕佸垽閿欒綆楃殑緇撴灉鏄惁鍦?-255鑼冨洿鍐咃紝鍋氱被浼間笅闈㈢殑鍒ゆ柇銆?/p>

        if (r>255)
            r=255;
        if (r<0)
            r=0;

        瑕佷粠RGB24杞崲鎴怰GB565鏁版嵁榪樿鍋氱Щ浣嶅拰鎴栬繍綆楋細

        RGBdata[1] =( (r & 0xF8)  | ( g >> 5) );
        RGBdata[0] =( ((g & 0x1C) << 3) | ( b >> 3) );

3.2 閮ㄥ垎鏌ヨ〃娉?/p>

        鏌ヨ〃娉曢鍏堝彲浠ユ兂鍒扮殑灝辨槸鐢ㄦ煡琛ㄦ浛浠d笂榪版暣鍨嬬畻娉曚腑鐨勪箻娉曡繍綆椼?/p>

        rdif = fac_1_4075[u];
        invgdif = fac_m_0_3455[u] + fac_m_0_7169[v];
        bdif = fac_1_779[u];

        榪欓噷涓鍏遍渶瑕?涓?緇存暟緇勶紝涓嬫爣浠?寮濮嬪埌255錛岃〃鏍煎叡鍗犵敤綰?K鐨勫唴瀛樼┖闂淬倁v鍙互涓嶉渶瑕佸仛鍑?28鐨勬搷浣滀簡銆傚湪浜嬪厛璁$畻瀵瑰簲鐨勬暟緇勫厓绱犵殑鍊肩殑鏃跺欒綆楀湪鍐呭氨濂戒簡銆?/p>

        瀵逛簬姣忎釜鍍忕礌錛岄儴鍒嗘煡琛ㄦ硶鐢ㄦ煡琛ㄦ浛浠d簡2嬈″噺娉曡繍綆楀拰4嬈′箻娉曡繍綆楋紝4嬈$Щ浣嶈繍綆椼備絾鏄紝渚濈劧闇瑕佸嬈″姞娉曡繍綆楀拰6嬈℃瘮杈冭繍綆楀拰鍙兘瀛樺湪鐨勮祴鍊兼搷浣滐紝鐩稿絎竴縐嶆柟娉曡繍綆楅熷害鎻愰珮騫朵笉鏄庢樉銆?/p>

3.3 瀹屽叏鏌ヨ〃娉?/p>

        閭d箞鏄惁鍙互鐢盰UV鐩存帴鏌ヨ〃寰楀埌瀵瑰簲鐨凴GB鍊煎憿錛熶箥涓鐪嬩技涔庝笉澶彲鑳斤紝浠ユ渶澶嶆潅鐨凣鐨勮繍綆椾負渚嬶紝鍥犱負G涓嶻UV涓夎呴兘鐩稿叧錛屾墍浠ョ被浼?G=YUV2G[Y][U][V]榪欐牱鐨勭畻娉曪紝涓涓笁緇翠笅鏍囧昂瀵擱兘涓?56鐨勬暟緇勫氨闇瑕佸崰鐢?鐨?4嬈℃柟綰?6鍏嗙┖闂達紝緇濆鏄病娉曟帴鍙楃殑銆傛墍浠ョ洰鍓嶅鏁伴兘 鏄噰鐢ㄩ儴鍒嗘煡琛ㄦ硶銆?/p>

        浣嗘槸錛屽鏋滄垜浠粩緇嗗垎鏋愬氨鍙互鍙戠幇錛屽浜嶨鎴戜滑瀹為檯涓婂畬鍏ㄦ病鏈夊繀瑕侀噰鐢ㄤ笁緇存暟緇勶紝鍥犱負Y鍙笌UV榪愮畻鐨勭粨鏋滅浉鍏籌紝涓嶶V鐨勪釜浣撴棤鍏籌紝鎵浠ユ垜浠彲浠ラ噰鐢ㄤ簩嬈℃煡琛ㄧ殑鏂規硶灝咷鐨勮繍綆楃畝鍖栦負瀵逛袱涓簩緇存暟緇勭殑鏌ヨ〃鎿嶄綔錛屽涓嬶細

        G = yig2g_table[ y ][ uv2ig_table[ u ][ v ] ]錛?/p>

        鑰孯B鏈韓灝卞彧鍜孻U鎴朰V鐩稿叧錛屾墍浠ヨ繖鏍鋒垜浠竴鍏遍渶瑕?涓?*8鐨勪簩緇磋〃鏍鹼紝闇瑕佸崰鐢?涔?鐨?6嬈℃柟鍏?56K鍐呭瓨銆傚熀鏈彲浠ユ帴鍙椼備絾鏄浜庢墜鏈鴻繖鏍風殑宓屽叆寮忚繍鐢ㄦ潵璇達紝榪樻槸鐣ユ湁浜涘ぇ浜嗐?/p>

        榪涗竴姝ュ垎鏋愶紝鎴戜滑鍙互鐪嬪埌錛屽洜涓哄湪鎵嬫満絳夊祵鍏ュ紡榪愮敤涓婃垜浠渶緇堟槸瑕佹妸鏁版嵁杞崲鎴怰GB565鏍煎紡閫佸埌LCD灞忎笂鏄劇ず鐨勶紝鎵浠ワ紝瀵逛簬RGB涓夊垎閲忔潵璇達紝鎴戜滑 鏍規湰涓嶉渶瑕?bit榪欎箞楂樼殑綺懼害錛屼負浜嗙畝鍗曞拰榪愮畻鐨勭粺涓璧瘋錛屽姣忎釜鍒嗛噺鎴戜滑鍏跺疄鍙渶瑕侀珮6bit鐨勬暟鎹氨瓚沖浜嗭紝鎵浠ユ垜浠彲浠ヨ繘涓姝ユ妸琛ㄦ牸鏀逛負4涓?6*6鐨勪簩緇磋〃鏍鹼紝榪欐牱涓鍏卞彧闇瑕佸崰鐢?6K鍐呭瓨錛佸湪璁$畻琛ㄦ牸鍏冪礌鍊肩殑鏃跺欒繕鍙互鎶婃渶緇堢殑婧㈠嚭鍒ゆ柇涔熶簨鍏堝仛瀹屻傛渶鍚庣殑綆楁硶濡備笅錛?/p>

        y = (YUVdata[Y1POS] >> 2);
        u = (YUVdata[UPOS] >> 2);
        v = (YUVdata[VPOS] >> 2);

        r = yv2r_table[ y ][ v ];
        g = yig2g_table[ y ][ uv2ig_table[ u ][ v ] ];
        b = yu2b_table[ y ][ u ];
 
        RGBdata[1] =( (r & 0xF8)  | ( g >> 5) );
        RGBdata[0] =( ((g & 0x1C) << 3) | ( b >> 3) );

        榪欐牱鐩稿閮ㄥ垎鏌ヨ〃娉曪紝鎴戜滑澧炲姞浜?嬈$Щ浣嶈繍綆楋紝鑰岃繘涓姝ュ噺灝戜簡4嬈″姞娉曡繍綆楀拰6嬈℃瘮杈冭祴鍊兼搷浣溿?/p>

        鍦ㄨ綆楄〃鏍煎厓绱犳暟鍊肩殑鏃跺欙紝瑕佽冭檻鑸嶅叆鍜屽亸縐葷瓑鍥犳暟浣垮緱璁$畻鐨勪腑闂寸粨鏋滄弧瓚蟲暟緇勪笅鏍囬潪璐熺殑瑕佹眰錛岄渶瑕佷竴瀹氱殑鎶宸с?/p>

        閲囩敤瀹屽叏鏌ヨ〃娉曪紝鐩稿浜庣涓縐嶇畻娉曪紝鏈緇堣繍綆楅熷害鍙互鏈夋瘮杈冩槑鏄劇殑鎻愰珮錛屽叿浣撴ц兘鑳芥彁楂樺灝戯紝瑕佺湅鎵鍦ㄥ鉤鍙扮殑CPU榪愮畻閫熷害鍜屽唴瀛樺瓨鍙栭熷害鐨勭浉瀵規瘮渚嬨傚唴 瀛樺瓨鍙栭熷害瓚婂揩錛岀敤鏌ヨ〃娉曞甫鏉ョ殑鎬ц兘鏀瑰杽瓚婃槑鏄俱傚湪鎴戠殑PC涓婃祴璇曠殑緇撴灉鎬ц兘澶х害鑳芥彁楂?5%銆傝屽湪鏌怉RM騫沖彴涓婃祴璇曞彧鎻愰珮浜嗙害15%銆?/p>

3.4 榪涗竴姝ョ殑鎬濊?/p>

        瀹為檯涓婏紝涓婅堪綆楁硶錛?/p>

        RGBdata[1] =( (r & 0xF8)  | ( g >> 5) );
        RGBdata[0] =( ((g & 0x1C) << 3) | ( b >> 3) );

        涓殑 (r & 0xF8) 鍜?( b >> 3) 絳夎繍綆椾篃瀹屽叏鍙互鍦ㄨ〃鏍間腑浜嬪厛璁$畻鍑烘潵銆傚彟澶栵紝YU / YV鐨勫彇鍊煎疄闄呬笂涓嶅彲鑳借鐩栨弧6*6鐨勮寖鍥達紝涓棿鏈変簺鐐規槸姘歌繙鍙栦笉鍒扮殑鏃犺緭鍏ワ紝RB鐨勮繍綆椾篃鍙互鑰冭檻鐢?*5鐨勮〃鏍箋傝繖浜涢兘鍙兘榪涗竴姝ユ彁楂樿繍綆楃殑閫熷害錛屽噺 灝忚〃鏍肩殑灝哄銆?/p>

        鍙﹀錛屽湪宓屽叆寮忚繍鐢ㄤ腑錛屽鏋滃彲鑳藉敖閲忓皢琛ㄦ牸鏀懼湪楂橀熷唴瀛樺SRAM涓簲璇ユ瘮鏀懼湪SDRAM涓洿鍔犺兘鍙戞尌鏌ヨ〃娉曠殑浼樺娍銆?/p>

4 RGB2YUV ?

        鐩墠瑙夊緱榪欎釜鏄病娉曞皢3緇磋〃鏍肩殑鏌ヨ〃榪愮畻鍖栫畝涓?緇磋〃鏍肩殑鏌ヨ〃榪愮畻浜嗐傚彧鑳界敤閮ㄥ垎鏌ヨ〃娉曟浛浠e叾涓殑涔樻硶榪愮畻銆?/p>

        鍙﹀錛屽鏁版儏鍐典笅錛屾垜浠渶瑕佺殑榪樻槸YUV2RGB鐨勮漿鎹紝鍥犱負浠嶴ensor寰楀埌鐨勬暟鎹氬父鎴戜滑浼氱敤YUV鏁版嵁錛屾澶朖PG鍜孧PEG瀹為檯涓婁篃鏄熀浜嶻UV鏍煎紡緙栫爜鐨勶紝鎵浠ヨ鏄劇ず瑙g爜鍚庣殑鏁版嵁闇瑕佺殑涔熸槸YUV2RGB鐨勮繍綆?8 錛夎繍姘旇繍姘斻?/p>

 

鏈枃鏉ヨ嚜CSDN鍗氬錛岃漿杞借鏍囨槑鍑哄錛?a >http://blog.csdn.net/ALENTAM/archive/2008/03/13/2178020.aspx



shaker(澶瓙) 2010-03-26 20:27 鍙戣〃璇勮
]]>
涓涓畝鏄撶殑閲囬泦緋葷粺http://www.shnenglu.com/shaker/archive/2009/11/08/100426.htmlshaker(澶瓙)shaker(澶瓙)Sun, 08 Nov 2009 15:14:00 GMThttp://www.shnenglu.com/shaker/archive/2009/11/08/100426.htmlhttp://www.shnenglu.com/shaker/comments/100426.htmlhttp://www.shnenglu.com/shaker/archive/2009/11/08/100426.html#Feedback0http://www.shnenglu.com/shaker/comments/commentRss/100426.htmlhttp://www.shnenglu.com/shaker/services/trackbacks/100426.html  闃呰鍏ㄦ枃

shaker(澶瓙) 2009-11-08 23:14 鍙戣〃璇勮
]]>
IE8瀵艱嚧VS2008鍑洪敊闂鐨勮В鍐蟲柟妗?/title><link>http://www.shnenglu.com/shaker/archive/2009/05/04/81842.html</link><dc:creator>shaker(澶瓙)</dc:creator><author>shaker(澶瓙)</author><pubDate>Mon, 04 May 2009 09:29:00 GMT</pubDate><guid>http://www.shnenglu.com/shaker/archive/2009/05/04/81842.html</guid><wfw:comment>http://www.shnenglu.com/shaker/comments/81842.html</wfw:comment><comments>http://www.shnenglu.com/shaker/archive/2009/05/04/81842.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/shaker/comments/commentRss/81842.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/shaker/services/trackbacks/81842.html</trackback:ping><description><![CDATA[     鎽樿:   <a href='http://www.shnenglu.com/shaker/archive/2009/05/04/81842.html'>闃呰鍏ㄦ枃</a><img src ="http://www.shnenglu.com/shaker/aggbug/81842.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/shaker/" target="_blank">shaker(澶瓙)</a> 2009-05-04 17:29 <a href="http://www.shnenglu.com/shaker/archive/2009/05/04/81842.html#Feedback" target="_blank" style="text-decoration:none;">鍙戣〃璇勮</a></div>]]></description></item><item><title>Windows涓嬫棤娉曞畨瑁匳S2005SP1鐨勮В鍐沖姙娉?/title><link>http://www.shnenglu.com/shaker/archive/2008/08/01/57781.html</link><dc:creator>shaker(澶瓙)</dc:creator><author>shaker(澶瓙)</author><pubDate>Fri, 01 Aug 2008 10:19:00 GMT</pubDate><guid>http://www.shnenglu.com/shaker/archive/2008/08/01/57781.html</guid><wfw:comment>http://www.shnenglu.com/shaker/comments/57781.html</wfw:comment><comments>http://www.shnenglu.com/shaker/archive/2008/08/01/57781.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.shnenglu.com/shaker/comments/commentRss/57781.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/shaker/services/trackbacks/57781.html</trackback:ping><description><![CDATA[     鎽樿: PolicyScope  <a href='http://www.shnenglu.com/shaker/archive/2008/08/01/57781.html'>闃呰鍏ㄦ枃</a><img src ="http://www.shnenglu.com/shaker/aggbug/57781.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/shaker/" target="_blank">shaker(澶瓙)</a> 2008-08-01 18:19 <a href="http://www.shnenglu.com/shaker/archive/2008/08/01/57781.html#Feedback" target="_blank" style="text-decoration:none;">鍙戣〃璇勮</a></div>]]></description></item><item><title>BCGSoft announces that BCGControlBar Pro for MFC version 10.0 is available!http://www.shnenglu.com/shaker/archive/2008/06/09/52636.htmlshaker(澶瓙)shaker(澶瓙)Mon, 09 Jun 2008 04:45:00 GMThttp://www.shnenglu.com/shaker/archive/2008/06/09/52636.htmlhttp://www.shnenglu.com/shaker/comments/52636.htmlhttp://www.shnenglu.com/shaker/archive/2008/06/09/52636.html#Feedback1http://www.shnenglu.com/shaker/comments/commentRss/52636.htmlhttp://www.shnenglu.com/shaker/services/trackbacks/52636.html闃呰鍏ㄦ枃

shaker(澶瓙) 2008-06-09 12:45 鍙戣〃璇勮
]]>
BCGControlBar Library Professional Edition v9.56http://www.shnenglu.com/shaker/archive/2008/02/13/42683.htmlshaker(澶瓙)shaker(澶瓙)Wed, 13 Feb 2008 03:15:00 GMThttp://www.shnenglu.com/shaker/archive/2008/02/13/42683.htmlhttp://www.shnenglu.com/shaker/comments/42683.htmlhttp://www.shnenglu.com/shaker/archive/2008/02/13/42683.html#Feedback10http://www.shnenglu.com/shaker/comments/commentRss/42683.htmlhttp://www.shnenglu.com/shaker/services/trackbacks/42683.html闃呰鍏ㄦ枃

shaker(澶瓙) 2008-02-13 11:15 鍙戣〃璇勮
]]>
[ZT]C++ Boost Thread 緙栫▼鎸囧崡 http://www.shnenglu.com/shaker/archive/2007/10/06/33583.htmlshaker(澶瓙)shaker(澶瓙)Fri, 05 Oct 2007 16:05:00 GMThttp://www.shnenglu.com/shaker/archive/2007/10/06/33583.htmlhttp://www.shnenglu.com/shaker/comments/33583.htmlhttp://www.shnenglu.com/shaker/archive/2007/10/06/33583.html#Feedback1http://www.shnenglu.com/shaker/comments/commentRss/33583.htmlhttp://www.shnenglu.com/shaker/services/trackbacks/33583.html闃呰鍏ㄦ枃

shaker(澶瓙) 2007-10-06 00:05 鍙戣〃璇勮
]]>
C++Builder2007 瀹夎鍔炴硶http://www.shnenglu.com/shaker/archive/2007/10/05/33564.htmlshaker(澶瓙)shaker(澶瓙)Fri, 05 Oct 2007 15:06:00 GMThttp://www.shnenglu.com/shaker/archive/2007/10/05/33564.htmlhttp://www.shnenglu.com/shaker/comments/33564.htmlhttp://www.shnenglu.com/shaker/archive/2007/10/05/33564.html#Feedback3http://www.shnenglu.com/shaker/comments/commentRss/33564.htmlhttp://www.shnenglu.com/shaker/services/trackbacks/33564.html杞嚜:http://www.ccrun.com/article.asp?i=1022&d=j0q784  闃呰鍏ㄦ枃

shaker(澶瓙) 2007-10-05 23:06 鍙戣〃璇勮
]]>
[鍥句功]浣跨敤wxWidgets榪涜璺ㄥ鉤鍙扮▼搴忓紑鍙?/title><link>http://www.shnenglu.com/shaker/archive/2007/09/27/33009.html</link><dc:creator>shaker(澶瓙)</dc:creator><author>shaker(澶瓙)</author><pubDate>Thu, 27 Sep 2007 05:08:00 GMT</pubDate><guid>http://www.shnenglu.com/shaker/archive/2007/09/27/33009.html</guid><wfw:comment>http://www.shnenglu.com/shaker/comments/33009.html</wfw:comment><comments>http://www.shnenglu.com/shaker/archive/2007/09/27/33009.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/shaker/comments/commentRss/33009.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/shaker/services/trackbacks/33009.html</trackback:ping><description><![CDATA[     鎽樿: PDF鏂囦歡  <a href='http://www.shnenglu.com/shaker/archive/2007/09/27/33009.html'>闃呰鍏ㄦ枃</a><img src ="http://www.shnenglu.com/shaker/aggbug/33009.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/shaker/" target="_blank">shaker(澶瓙)</a> 2007-09-27 13:08 <a href="http://www.shnenglu.com/shaker/archive/2007/09/27/33009.html#Feedback" target="_blank" style="text-decoration:none;">鍙戣〃璇勮</a></div>]]></description></item><item><title>鍙戜竴涓猰ir2鐨勫唴鎸備唬鐮?/title><link>http://www.shnenglu.com/shaker/archive/2007/08/28/31075.html</link><dc:creator>shaker(澶瓙)</dc:creator><author>shaker(澶瓙)</author><pubDate>Tue, 28 Aug 2007 15:59:00 GMT</pubDate><guid>http://www.shnenglu.com/shaker/archive/2007/08/28/31075.html</guid><wfw:comment>http://www.shnenglu.com/shaker/comments/31075.html</wfw:comment><comments>http://www.shnenglu.com/shaker/archive/2007/08/28/31075.html#Feedback</comments><slash:comments>5</slash:comments><wfw:commentRss>http://www.shnenglu.com/shaker/comments/commentRss/31075.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/shaker/services/trackbacks/31075.html</trackback:ping><description><![CDATA[     鎽樿: 榪囨椂鐨勬父鎴?鍙嶆鏀懼湪紜洏閲岄潰鐑傛帀 涓嶅鍙戝嚭鏉?鐪嬬湅鏈夋病浜洪渶瑕?nbsp; <a href='http://www.shnenglu.com/shaker/archive/2007/08/28/31075.html'>闃呰鍏ㄦ枃</a><img src ="http://www.shnenglu.com/shaker/aggbug/31075.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/shaker/" target="_blank">shaker(澶瓙)</a> 2007-08-28 23:59 <a href="http://www.shnenglu.com/shaker/archive/2007/08/28/31075.html#Feedback" target="_blank" style="text-decoration:none;">鍙戣〃璇勮</a></div>]]></description></item><item><title>浣跨敤boost::signals榪炴帴綾繪垚鍛樺嚱鏁?/title><link>http://www.shnenglu.com/shaker/archive/2007/08/28/31073.html</link><dc:creator>shaker(澶瓙)</dc:creator><author>shaker(澶瓙)</author><pubDate>Tue, 28 Aug 2007 15:40:00 GMT</pubDate><guid>http://www.shnenglu.com/shaker/archive/2007/08/28/31073.html</guid><wfw:comment>http://www.shnenglu.com/shaker/comments/31073.html</wfw:comment><comments>http://www.shnenglu.com/shaker/archive/2007/08/28/31073.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/shaker/comments/commentRss/31073.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/shaker/services/trackbacks/31073.html</trackback:ping><description><![CDATA[浣跨敤boost::signals榪炴帴綾繪垚鍛樺嚱鏁?鍙傜収boost鐨勬墜鍐?a >http://www.boost.org/doc/html/signals/tutorial.html#id1627926</a> 鐨勫啓娉曚技涔庡湪VS2005涓紪璇戜笉榪?涓嶇煡閬撴槸鏂扮殑鐗堟湰鏇存柊浜嗚繕鏄墜鍐岀殑bug<br>搴旇浣跨敤綾諱技浠ヤ笅鐨勬柟娉?<br> <div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #000000">    m_Game.sig_HpChange.connect(boost::bind(</span><span style="COLOR: #000000">&</span><span style="COLOR: #000000">CMainFrame::OnHpChange,boost::</span><span style="COLOR: #0000ff">ref</span><span style="COLOR: #000000">(</span><span style="COLOR: #000000">*</span><span style="COLOR: #0000ff">this</span><span style="COLOR: #000000">),_1,_2));<br><img src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif" align=top></span></div><img src ="http://www.shnenglu.com/shaker/aggbug/31073.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/shaker/" target="_blank">shaker(澶瓙)</a> 2007-08-28 23:40 <a href="http://www.shnenglu.com/shaker/archive/2007/08/28/31073.html#Feedback" target="_blank" style="text-decoration:none;">鍙戣〃璇勮</a></div>]]></description></item><item><title>write a simple os with asm&chttp://www.shnenglu.com/shaker/archive/2007/05/20/24411.htmlshaker(澶瓙)shaker(澶瓙)Sat, 19 May 2007 16:26:00 GMThttp://www.shnenglu.com/shaker/archive/2007/05/20/24411.htmlhttp://www.shnenglu.com/shaker/comments/24411.htmlhttp://www.shnenglu.com/shaker/archive/2007/05/20/24411.html#Feedback23http://www.shnenglu.com/shaker/comments/commentRss/24411.htmlhttp://www.shnenglu.com/shaker/services/trackbacks/24411.html闃呰鍏ㄦ枃

shaker(澶瓙) 2007-05-20 00:26 鍙戣〃璇勮
]]>
浠ュ墠鍐欑殑涓涓綉緇滄祦灝佸寘綾?/title><link>http://www.shnenglu.com/shaker/archive/2007/04/23/22682.html</link><dc:creator>shaker(澶瓙)</dc:creator><author>shaker(澶瓙)</author><pubDate>Mon, 23 Apr 2007 15:44:00 GMT</pubDate><guid>http://www.shnenglu.com/shaker/archive/2007/04/23/22682.html</guid><wfw:comment>http://www.shnenglu.com/shaker/comments/22682.html</wfw:comment><comments>http://www.shnenglu.com/shaker/archive/2007/04/23/22682.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.shnenglu.com/shaker/comments/commentRss/22682.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/shaker/services/trackbacks/22682.html</trackback:ping><description><![CDATA[     鎽樿: CStreamPacket: 涓烘棤鍥哄畾緇撴瀯鐨勭綉緇滄暟鎹寘浼犻佽璁$殑.  <a href='http://www.shnenglu.com/shaker/archive/2007/04/23/22682.html'>闃呰鍏ㄦ枃</a><img src ="http://www.shnenglu.com/shaker/aggbug/22682.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/shaker/" target="_blank">shaker(澶瓙)</a> 2007-04-23 23:44 <a href="http://www.shnenglu.com/shaker/archive/2007/04/23/22682.html#Feedback" target="_blank" style="text-decoration:none;">鍙戣〃璇勮</a></div>]]></description></item><item><title>鐢╞oost::regex鏉ュ仛璇嶆硶鍒嗘瀽http://www.shnenglu.com/shaker/archive/2007/04/11/21653.htmlshaker(澶瓙)shaker(澶瓙)Wed, 11 Apr 2007 07:20:00 GMThttp://www.shnenglu.com/shaker/archive/2007/04/11/21653.htmlhttp://www.shnenglu.com/shaker/comments/21653.htmlhttp://www.shnenglu.com/shaker/archive/2007/04/11/21653.html#Feedback0http://www.shnenglu.com/shaker/comments/commentRss/21653.htmlhttp://www.shnenglu.com/shaker/services/trackbacks/21653.html闃呰鍏ㄦ枃

shaker(澶瓙) 2007-04-11 15:20 鍙戣〃璇勮
]]>
MSDN鐨凚ug!http://www.shnenglu.com/shaker/archive/2007/02/28/19073.htmlshaker(澶瓙)shaker(澶瓙)Wed, 28 Feb 2007 14:59:00 GMThttp://www.shnenglu.com/shaker/archive/2007/02/28/19073.htmlhttp://www.shnenglu.com/shaker/comments/19073.htmlhttp://www.shnenglu.com/shaker/archive/2007/02/28/19073.html#Feedback3http://www.shnenglu.com/shaker/comments/commentRss/19073.htmlhttp://www.shnenglu.com/shaker/services/trackbacks/19073.html
CListCtrl::SortItems

This method sorts list view items using an application-defined comparison function. The index of each item changes to reflect the new sequence.

BOOL SortItems( PFNLVCOMPARE pfnCompare, DWORD dwData);
Parameters
pfnCompare
Specifies the address of the application-defined comparison function. The comparison function is called during the sort operation each time the relative order of two list items needs to be compared. The comparison function must be either a static member of a class or a standalone function that is not a member of any class.
dwData
Specifies the application-defined value that is passed to the comparison function.
Return Value

Nonzero if it is successful; otherwise, it is zero. Remarks
The comparison function has the following form:
int CALLBACK CompareFunc(LPARAM lParam1, LPARAM lParam2, 聽聽LPARAM lParamSort);

The comparison function must return a negative value if the first item should precede the second, a positive value if the first item should follow the second, or zero if the two items are equivalent.
The lParam1 and lParam2 parameters specify the item data for the two items being compared. The lParamSort parameter is the same as the dwData value.

Example


//聽Sort聽the聽item聽in聽reverse聽alphabetical聽order.
staticint聽CALLBACK聽
MyCompareProc(LPARAM聽lParam1,聽LPARAM聽lParam2,聽LPARAM聽lParamSort)
{
聽聽聽
//聽lParamSort聽contains聽a聽pointer聽to聽the聽list聽view聽control.
聽聽聽CListCtrl*聽pListCtrl聽=聽(CListCtrl*)聽lParamSort;
聽聽聽CString聽聽聽聽strItem1聽
=聽pListCtrl->GetItemText(lParam1,聽0);
聽聽聽CString聽聽聽聽strItem2聽
=聽pListCtrl->GetItemText(lParam2,聽0);

聽聽聽
return聽strcmp(strItem2,聽strItem1);
}

void聽snip_CListCtrl_SortItems()
{
聽聽聽
//聽The聽pointer聽to聽my聽list聽view聽control.
聽聽聽extern聽CListCtrl*聽pmyListCtrl;

聽聽聽
//聽Sort聽the聽list聽view聽items聽using聽my聽callback聽procedure.
聽聽聽pmyListCtrl->SortItems(MyCompareProc,聽(LPARAM)聽pmyListCtrl);
}


渚嬪瓙涓殑浠g爜鏄笉鑳芥寜鐓ч鎯崇殑宸ヤ綔鐨? 鍥犱負鍥炶皟鍑芥暟鎺ユ敹鐨?涓弬鏁版槸鐢?strong>SetItemData浼犲叆鐨勫?鑰屼笉鏄疘tem鐨処ndex!

shaker(澶瓙) 2007-02-28 22:59 鍙戣〃璇勮
]]>
鏇存柊浜嗕笅TMD!鍑犲紶鎴浘http://www.shnenglu.com/shaker/archive/2007/02/28/19072.htmlshaker(澶瓙)shaker(澶瓙)Wed, 28 Feb 2007 14:45:00 GMThttp://www.shnenglu.com/shaker/archive/2007/02/28/19072.htmlhttp://www.shnenglu.com/shaker/comments/19072.htmlhttp://www.shnenglu.com/shaker/archive/2007/02/28/19072.html#Feedback5http://www.shnenglu.com/shaker/comments/commentRss/19072.htmlhttp://www.shnenglu.com/shaker/services/trackbacks/19072.html闃呰鍏ㄦ枃

shaker(澶瓙) 2007-02-28 22:45 鍙戣〃璇勮
]]>
[宸ュ叿]VSS2005 涓嬭澆http://www.shnenglu.com/shaker/archive/2006/12/31/17052.htmlshaker(澶瓙)shaker(澶瓙)Sat, 30 Dec 2006 17:22:00 GMThttp://www.shnenglu.com/shaker/archive/2006/12/31/17052.htmlhttp://www.shnenglu.com/shaker/comments/17052.htmlhttp://www.shnenglu.com/shaker/archive/2006/12/31/17052.html#Feedback9http://www.shnenglu.com/shaker/comments/commentRss/17052.htmlhttp://www.shnenglu.com/shaker/services/trackbacks/17052.htmlhttp://www.shangdu8.com/download/Microsoft.Visual.SourceSafe.2005_01.rar

shaker(澶瓙) 2006-12-31 01:22 鍙戣〃璇勮
]]>
VC2003緙栬瘧boost::regex妯″潡鍛戒護琛?/title><link>http://www.shnenglu.com/shaker/archive/2006/12/19/16622.html</link><dc:creator>shaker(澶瓙)</dc:creator><author>shaker(澶瓙)</author><pubDate>Tue, 19 Dec 2006 11:54:00 GMT</pubDate><guid>http://www.shnenglu.com/shaker/archive/2006/12/19/16622.html</guid><wfw:comment>http://www.shnenglu.com/shaker/comments/16622.html</wfw:comment><comments>http://www.shnenglu.com/shaker/archive/2006/12/19/16622.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/shaker/comments/commentRss/16622.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/shaker/services/trackbacks/16622.html</trackback:ping><description><![CDATA[bjam "-sTOOLS=vc-7_1" "-sVC71_ROOT=D:\Program Files\Microsoft Visual Studio .NET 2003\Vc7" --with-regex install<img src ="http://www.shnenglu.com/shaker/aggbug/16622.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/shaker/" target="_blank">shaker(澶瓙)</a> 2006-12-19 19:54 <a href="http://www.shnenglu.com/shaker/archive/2006/12/19/16622.html#Feedback" target="_blank" style="text-decoration:none;">鍙戣〃璇勮</a></div>]]></description></item><item><title>[ZT]鈥淗ello World!鈥濈殑N縐嶅啓娉?/title><link>http://www.shnenglu.com/shaker/archive/2006/12/19/16620.html</link><dc:creator>shaker(澶瓙)</dc:creator><author>shaker(澶瓙)</author><pubDate>Tue, 19 Dec 2006 11:16:00 GMT</pubDate><guid>http://www.shnenglu.com/shaker/archive/2006/12/19/16620.html</guid><wfw:comment>http://www.shnenglu.com/shaker/comments/16620.html</wfw:comment><comments>http://www.shnenglu.com/shaker/archive/2006/12/19/16620.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/shaker/comments/commentRss/16620.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/shaker/services/trackbacks/16620.html</trackback:ping><description><![CDATA[鈥淗ello World!鈥濈殑N縐嶅啓娉?br /><a >http://www.ccrun.com/article.asp?i=999&d=v433i2</a><img src ="http://www.shnenglu.com/shaker/aggbug/16620.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/shaker/" target="_blank">shaker(澶瓙)</a> 2006-12-19 19:16 <a href="http://www.shnenglu.com/shaker/archive/2006/12/19/16620.html#Feedback" target="_blank" style="text-decoration:none;">鍙戣〃璇勮</a></div>]]></description></item></channel></rss> <a href="http://www.shnenglu.com/">青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品</a> <div style="position:fixed;left:-9000px;top:-9000px;"><font id="pjuwb"></font><button id="pjuwb"><pre id="pjuwb"></pre></button><sub id="pjuwb"></sub><tbody id="pjuwb"><var id="pjuwb"><address id="pjuwb"></address></var></tbody><listing id="pjuwb"><label id="pjuwb"><strong id="pjuwb"></strong></label></listing><wbr id="pjuwb"><small id="pjuwb"><tbody id="pjuwb"></tbody></small></wbr><ins id="pjuwb"><xmp id="pjuwb"></xmp></ins><style id="pjuwb"></style><label id="pjuwb"><em id="pjuwb"><li id="pjuwb"></li></em></label><samp id="pjuwb"></samp><menu id="pjuwb"><input id="pjuwb"></input></menu><pre id="pjuwb"><tbody id="pjuwb"><tfoot id="pjuwb"><button id="pjuwb"></button></tfoot></tbody></pre><form id="pjuwb"></form><i id="pjuwb"><style id="pjuwb"><label id="pjuwb"><sup id="pjuwb"></sup></label></style></i><li id="pjuwb"><table id="pjuwb"><abbr id="pjuwb"></abbr></table></li><video id="pjuwb"></video><dfn id="pjuwb"></dfn><progress id="pjuwb"></progress><strong id="pjuwb"></strong><mark id="pjuwb"></mark><em id="pjuwb"></em><tbody id="pjuwb"><p id="pjuwb"><strike id="pjuwb"><acronym id="pjuwb"></acronym></strike></p></tbody><option id="pjuwb"></option><strike id="pjuwb"></strike><u id="pjuwb"></u><td id="pjuwb"><center id="pjuwb"><tr id="pjuwb"></tr></center></td><em id="pjuwb"><mark id="pjuwb"><em id="pjuwb"><tt id="pjuwb"></tt></em></mark></em><strong id="pjuwb"></strong><wbr id="pjuwb"></wbr><s id="pjuwb"></s><strong id="pjuwb"></strong><legend id="pjuwb"></legend><nav id="pjuwb"></nav><dl id="pjuwb"><th id="pjuwb"><dl id="pjuwb"></dl></th></dl><noframes id="pjuwb"><ins id="pjuwb"></ins></noframes><font id="pjuwb"></font><strike id="pjuwb"><i id="pjuwb"><style id="pjuwb"><label id="pjuwb"></label></style></i></strike><output id="pjuwb"></output><thead id="pjuwb"><pre id="pjuwb"></pre></thead><source id="pjuwb"></source><menuitem id="pjuwb"><wbr id="pjuwb"></wbr></menuitem><pre id="pjuwb"><span id="pjuwb"><pre id="pjuwb"><big id="pjuwb"></big></pre></span></pre><cite id="pjuwb"><fieldset id="pjuwb"><s id="pjuwb"><rt id="pjuwb"></rt></s></fieldset></cite><big id="pjuwb"><progress id="pjuwb"><big id="pjuwb"></big></progress></big><samp id="pjuwb"><delect id="pjuwb"></delect></samp><dl id="pjuwb"></dl><strike id="pjuwb"><nav id="pjuwb"><dl id="pjuwb"><strong id="pjuwb"></strong></dl></nav></strike><tbody id="pjuwb"><b id="pjuwb"><optgroup id="pjuwb"><rp id="pjuwb"></rp></optgroup></b></tbody><em id="pjuwb"></em><xmp id="pjuwb"><blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote></xmp> <i id="pjuwb"><abbr id="pjuwb"><i id="pjuwb"><abbr id="pjuwb"></abbr></i></abbr></i><center id="pjuwb"><acronym id="pjuwb"><center id="pjuwb"></center></acronym></center><pre id="pjuwb"></pre><ul id="pjuwb"><thead id="pjuwb"></thead></ul><blockquote id="pjuwb"><pre id="pjuwb"><sup id="pjuwb"></sup></pre></blockquote><acronym id="pjuwb"></acronym><big id="pjuwb"><s id="pjuwb"></s></big><th id="pjuwb"></th><th id="pjuwb"></th><tbody id="pjuwb"></tbody><thead id="pjuwb"><strike id="pjuwb"></strike></thead><th id="pjuwb"><dl id="pjuwb"><wbr id="pjuwb"></wbr></dl></th><dl id="pjuwb"><strong id="pjuwb"></strong></dl><abbr id="pjuwb"><noframes id="pjuwb"><noscript id="pjuwb"></noscript></noframes></abbr><td id="pjuwb"><ol id="pjuwb"></ol></td><li id="pjuwb"><noscript id="pjuwb"><abbr id="pjuwb"></abbr></noscript></li><small id="pjuwb"><bdo id="pjuwb"><nav id="pjuwb"></nav></bdo></small><style id="pjuwb"></style><optgroup id="pjuwb"><table id="pjuwb"></table></optgroup><center id="pjuwb"><tr id="pjuwb"><dfn id="pjuwb"></dfn></tr></center><th id="pjuwb"></th><u id="pjuwb"></u><tfoot id="pjuwb"><legend id="pjuwb"><i id="pjuwb"></i></legend></tfoot><mark id="pjuwb"></mark><meter id="pjuwb"></meter><nav id="pjuwb"></nav><acronym id="pjuwb"><pre id="pjuwb"><acronym id="pjuwb"><ul id="pjuwb"></ul></acronym></pre></acronym><acronym id="pjuwb"><pre id="pjuwb"><acronym id="pjuwb"><ul id="pjuwb"></ul></acronym></pre></acronym><nobr id="pjuwb"></nobr><sub id="pjuwb"><th id="pjuwb"><menuitem id="pjuwb"><wbr id="pjuwb"></wbr></menuitem></th></sub><thead id="pjuwb"><sub id="pjuwb"></sub></thead><ul id="pjuwb"><address id="pjuwb"><menuitem id="pjuwb"><meter id="pjuwb"></meter></menuitem></address></ul><dfn id="pjuwb"></dfn><pre id="pjuwb"></pre><input id="pjuwb"><cite id="pjuwb"><fieldset id="pjuwb"></fieldset></cite></input><u id="pjuwb"><form id="pjuwb"><u id="pjuwb"></u></form></u><kbd id="pjuwb"><em id="pjuwb"><mark id="pjuwb"></mark></em></kbd><tr id="pjuwb"></tr><del id="pjuwb"><form id="pjuwb"><address id="pjuwb"></address></form></del><tfoot id="pjuwb"><legend id="pjuwb"><ol id="pjuwb"><dl id="pjuwb"></dl></ol></legend></tfoot><menu id="pjuwb"><nobr id="pjuwb"><th id="pjuwb"><nobr id="pjuwb"></nobr></th></nobr></menu><fieldset id="pjuwb"></fieldset><pre id="pjuwb"><blockquote id="pjuwb"><samp id="pjuwb"></samp></blockquote></pre><xmp id="pjuwb"><sup id="pjuwb"><pre id="pjuwb"></pre></sup></xmp><span id="pjuwb"><progress id="pjuwb"></progress></span><font id="pjuwb"></font><var id="pjuwb"><abbr id="pjuwb"></abbr></var><strong id="pjuwb"><label id="pjuwb"><i id="pjuwb"><legend id="pjuwb"></legend></i></label></strong><tr id="pjuwb"><em id="pjuwb"><em id="pjuwb"><output id="pjuwb"></output></em></em></tr><thead id="pjuwb"><strike id="pjuwb"></strike></thead> <acronym id="pjuwb"></acronym><i id="pjuwb"></i><tt id="pjuwb"></tt><rt id="pjuwb"><source id="pjuwb"><rt id="pjuwb"></rt></source></rt><strike id="pjuwb"><acronym id="pjuwb"></acronym></strike><del id="pjuwb"></del><font id="pjuwb"><output id="pjuwb"><ins id="pjuwb"><output id="pjuwb"></output></ins></output></font><kbd id="pjuwb"><tr id="pjuwb"><kbd id="pjuwb"></kbd></tr></kbd><pre id="pjuwb"><sup id="pjuwb"><delect id="pjuwb"><samp id="pjuwb"></samp></delect></sup></pre><samp id="pjuwb"></samp><track id="pjuwb"></track><tr id="pjuwb"></tr><center id="pjuwb"></center><fieldset id="pjuwb"></fieldset><i id="pjuwb"></i><td id="pjuwb"></td><rt id="pjuwb"></rt><object id="pjuwb"></object><pre id="pjuwb"><progress id="pjuwb"><sub id="pjuwb"><thead id="pjuwb"></thead></sub></progress></pre><kbd id="pjuwb"><tr id="pjuwb"><option id="pjuwb"></option></tr></kbd><output id="pjuwb"><ins id="pjuwb"></ins></output><ol id="pjuwb"></ol><source id="pjuwb"></source><strong id="pjuwb"></strong><ruby id="pjuwb"></ruby><sub id="pjuwb"><meter id="pjuwb"><menuitem id="pjuwb"><meter id="pjuwb"></meter></menuitem></meter></sub><pre id="pjuwb"></pre><center id="pjuwb"></center><tr id="pjuwb"><tbody id="pjuwb"><xmp id="pjuwb"><dd id="pjuwb"></dd></xmp></tbody></tr><video id="pjuwb"></video><pre id="pjuwb"></pre><form id="pjuwb"><optgroup id="pjuwb"></optgroup></form><samp id="pjuwb"></samp><kbd id="pjuwb"></kbd><strong id="pjuwb"><option id="pjuwb"></option></strong><object id="pjuwb"></object><abbr id="pjuwb"><noframes id="pjuwb"><abbr id="pjuwb"></abbr></noframes></abbr><ul id="pjuwb"><del id="pjuwb"><button id="pjuwb"><pre id="pjuwb"></pre></button></del></ul><abbr id="pjuwb"></abbr><strong id="pjuwb"><code id="pjuwb"><strong id="pjuwb"></strong></code></strong><option id="pjuwb"></option><optgroup id="pjuwb"><bdo id="pjuwb"><code id="pjuwb"></code></bdo></optgroup><mark id="pjuwb"><em id="pjuwb"><font id="pjuwb"></font></em></mark><acronym id="pjuwb"><code id="pjuwb"></code></acronym><dl id="pjuwb"></dl><em id="pjuwb"></em><object id="pjuwb"><input id="pjuwb"><object id="pjuwb"></object></input></object><output id="pjuwb"><dd id="pjuwb"></dd></output><option id="pjuwb"><button id="pjuwb"><option id="pjuwb"></option></button></option><small id="pjuwb"></small></div> <a href="http://312012.com" target="_blank">欧美在线三区</a>| <a href="http://312012.com" target="_blank">欧美在线视频a</a>| <a href="http://kanebocos.com" target="_blank">欧美理论电影网</a>| <a href="http://oudaole.com" target="_blank">99精品国产高清一区二区</a>| <a href="http://xsxcn.com" target="_blank">亚洲国语精品自产拍在线观看</a>| <a href="http://337795.com" target="_blank">久久人人爽人人爽</a>| <a href="http://3bmmtv.com" target="_blank">99综合在线</a>| <a href="http://taikonghua.com" target="_blank">亚洲香蕉成视频在线观看</a>| <a href="http://jm-comic3.com" target="_blank">国产欧美三级</a>| <a href="http://xjhzgy.com" target="_blank">欧美国产精品一区</a>| <a href="http://448968.com" target="_blank">欧美视频在线不卡</a>| <a href="http://www-77663.com" target="_blank">国模私拍视频一区</a>| <a href="http://heyzo1031.com" target="_blank">欧美母乳在线</a>| <a href="http://xunlei520.com" target="_blank">欧美一区二区三区在线免费观看</a>| <a href="http://xtgoldsky.com" target="_blank">亚洲欧美日韩视频二区</a>| <a href="http://wo6wo.com" target="_blank">在线免费观看日韩欧美</a>| <a href="http://baostat.com" target="_blank">日韩亚洲视频在线</a>| <a href="http://51120guahao.com" target="_blank">国内精品久久久久影院优</a>| <a href="http://shalitao.com" target="_blank">欧美激情视频一区二区三区不卡</a>| <a href="http://18av-2.com" target="_blank">欧美日韩精品一区二区</a>| <a href="http://sd-12530.com" target="_blank">久久成人免费网</a>| <a href="http://06le.com" target="_blank">免费成人黄色片</a>| <a href="http://3dmh329.com" target="_blank">午夜一区不卡</a>| <a href="http://avhai.com" target="_blank">欧美刺激午夜性久久久久久久</a>| <a href="http://www559955.com" target="_blank">9久re热视频在线精品</a>| <a href="http://710691.com" target="_blank">香蕉久久夜色精品国产</a>| <a href="http://wwwmiya728.com" target="_blank">亚洲免费观看</a>| <a href="http://663747.com" target="_blank">久久不射网站</a>| <a href="http://mmmm26.com" target="_blank">亚洲一区二区三区四区五区黄</a>| <a href="http://9e67.com" target="_blank">久久国产欧美日韩精品</a>| <a href="http://5599912.com" target="_blank">99视频精品在线</a>| <a href="http://chunhuigk.com" target="_blank">久久久久成人精品</a>| <a href="http://www280999.com" target="_blank">亚洲欧美日韩中文视频</a>| <a href="http://www18889.com" target="_blank">老妇喷水一区二区三区</a>| <a href="http://www-888690.com" target="_blank">欧美一区精品</a>| <a href="http://cao3636.com" target="_blank">欧美日韩免费观看一区三区</a>| <a href="http://dailymailnepal.com" target="_blank">久久天天躁狠狠躁夜夜爽蜜月</a>| <a href="http://kk1xx-com.com" target="_blank">欧美日韩国产麻豆</a>| <a href="http://119663.com" target="_blank">另类激情亚洲</a>| <a href="http://jiucao8.com" target="_blank">国产日韩欧美二区</a>| <a href="http://haose23.com" target="_blank">在线一区日本视频</a>| <a href="http://caihongie.com" target="_blank">亚洲人成人99网站</a>| <a href="http://free18teen.com" target="_blank">久久av在线</a>| <a href="http://1355456.com" target="_blank">欧美在线你懂的</a>| <a href="http://javdb04.com" target="_blank">国产精品国产三级国产普通话三级</a>| <a href="http://eeii33.com" target="_blank">免费永久网站黄欧美</a>| <a href="http://223533.com" target="_blank">国产欧美高清</a>| <a href="http://6055365.com" target="_blank">在线亚洲自拍</a>| <a href="http://www205sihu.com" target="_blank">亚洲亚洲精品在线观看 </a>| <a href="http://www01614.com" target="_blank">午夜国产精品视频免费体验区</a>| <a href="http://www-kj8777.com" target="_blank">亚洲精品国产精品乱码不99按摩</a>| <a href="http://xpj694.com" target="_blank">性做久久久久久免费观看欧美</a>| <a href="http://6767673.com" target="_blank">亚洲午夜一区</a>| <a href="http://wansilv.com" target="_blank">欧美日韩国产成人精品</a>| <a href="http://78757a.com" target="_blank">亚洲国产综合在线看不卡</a>| <a href="http://592xyy.com" target="_blank">亚洲国产老妈</a>| <a href="http://789583.com" target="_blank">快播亚洲色图</a>| <a href="http://080177.com" target="_blank">亚洲高清一二三区</a>| <a href="http://91porn42.com" target="_blank">亚洲高清在线视频</a>| <a href="http://59jf.com" target="_blank">欧美 日韩 国产 一区</a>| <a href="http://maogo666.com" target="_blank">老色鬼精品视频在线观看播放</a>| <a href="http://ythbhg.com" target="_blank">国产性猛交xxxx免费看久久</a>| <a href="http://91keshi.com" target="_blank">亚洲一区二区三区免费观看</a>| <a href="http://www-401313.com" target="_blank">亚洲专区欧美专区</a>| <a href="http://74va.com" target="_blank">国产精品xxxav免费视频</a>| <a href="http://www151zh.com" target="_blank">在线视频欧美一区</a>| <a href="http://gaobb52.com" target="_blank">午夜久久久久久久久久一区二区</a>| <a href="http://tk263.com" target="_blank">国产精品久久久久一区二区</a>| <a href="http://7ccdd.com" target="_blank">中文国产一区</a>| <a href="http://hongzaixian.com" target="_blank">久久精品1区</a>| <a href="http://ynzhuoyi.com" target="_blank">狠狠色伊人亚洲综合成人</a>| <a href="http://www-44899.com" target="_blank">久久精品国产第一区二区三区最新章节 </a>| <a href="http://nachang5117.com" target="_blank">欧美在线看片</a>| <a href="http://www-tk8899.com" target="_blank">在线观看不卡</a>| <a href="http://chinasck.com" target="_blank">亚洲国产美女久久久久</a>| <a href="http://www333444123.com" target="_blank">亚洲精选91</a>| <a href="http://www99mmnn.com" target="_blank">欧美体内she精视频在线观看</a>| <a href="http://k-dchina.com" target="_blank">亚洲最新合集</a>| <a href="http://270909.com" target="_blank">久久国产精品久久精品国产</a>| <a href="http://coolpaly.com" target="_blank">国产最新精品精品你懂的</a>| <a href="http://montnove.com" target="_blank">久久国产天堂福利天堂</a>| <a href="http://by4425.com" target="_blank">亚洲电影下载</a>| <a href="http://xb735.com" target="_blank">午夜精品福利在线</a>| <a href="http://viwasmart.com" target="_blank">国产在线精品一区二区夜色</a>| <a href="http://yw1998.com" target="_blank">久久人体大胆视频</a>| <a href="http://www-49hk.com" target="_blank">日韩视频在线你懂得</a>| <a href="http://rxbbei.com" target="_blank">欧美亚洲一区三区</a>| <a href="http://www446168.com" target="_blank">亚洲电影免费</a>| <a href="http://1355456.com" target="_blank">欧美视频在线看</a>| <a href="http://spyfaw.com" target="_blank">欧美专区一区二区三区</a>| <a href="http://pppp95.com" target="_blank">亚洲高清中文字幕</a>| <a href="http://8004006.com" target="_blank">亚洲欧美日韩一区二区三区在线观看 </a>| <a href="http://fuwu56.com" target="_blank">99精品国产高清一区二区</a>| <a href="http://520844www.com" target="_blank">亚洲欧美日韩国产中文</a>| <a href="http://ywbst8g4tukcsqhioikc.com" target="_blank">国产日韩亚洲欧美精品</a>| <a href="http://aaddgg66.com" target="_blank">欧美jjzz</a>| <a href="http://18mmcg.com" target="_blank">亚洲制服少妇</a>| <a href="http://6u6uuu666.com" target="_blank">欧美激情一区二区三区高清视频 </a>| <a href="http://cl6m.com" target="_blank">欧美亚洲在线视频</a>| <a href="http://jiarenlady.com" target="_blank">在线日韩精品视频</a>| <a href="http://jav1111.com" target="_blank">欧美视频在线一区二区三区</a>| <a href="http://avtb2120.com" target="_blank">亚洲欧美成人网</a>| <a href="http://cnbluebox.com" target="_blank">亚洲电影自拍</a>| <a href="http://www672hh.com" target="_blank">久久岛国电影</a>| <a href="http://chaxiangmall.com" target="_blank">一区二区三区日韩欧美精品</a>| <a href="http://gzpurefaith.com" target="_blank">国产亚洲亚洲</a>| <a href="http://ctmhotel.com" target="_blank">欧美日韩情趣电影</a>| <a href="http://www333444123.com" target="_blank">久久精品人人做人人爽电影蜜月</a>| <a href="http://11b29.com" target="_blank">亚洲精品日韩精品</a>| <a href="http://89wbw.com" target="_blank">久久亚洲一区</a>| <a href="http://qq5621.com" target="_blank">午夜精品影院</a>| <a href="http://889644.com" target="_blank">一区二区久久久久</a>| <a href="http://www-699603.com" target="_blank">在线不卡中文字幕</a>| <a href="http://678255.com" target="_blank">国产精品美女久久久久久免费</a>| <a href="http://x946.com" target="_blank">美女福利精品视频</a>| <a href="http://2061375.com" target="_blank">性欧美18~19sex高清播放</a>| <a href="http://qhzyxcd.com" target="_blank">亚洲精品久久</a>| <a href="http://www66441.com" target="_blank">欧美黄色视屏</a>| <a href="http://478884.com" target="_blank">蜜桃av久久久亚洲精品</a>| <a href="http://v63xs.com" target="_blank">久久久91精品国产一区二区精品</a>| <a href="http://21bridal.com" target="_blank">一本大道久久精品懂色aⅴ</a>| <a href="http://www-4012345.com" target="_blank">尤物九九久久国产精品的分类</a>| <a href="http://dv6699.com" target="_blank">国产精品va在线播放我和闺蜜</a>| <a href="http://dd8uau0ncu.com" target="_blank">免播放器亚洲一区</a>| <a href="http://sp106.com" target="_blank">久久影院午夜片一区</a>| <a href="http://www433444.com" target="_blank">久久精品卡一</a>| <a href="http://avtaobao7788.com" target="_blank">欧美在线电影</a>| <a href="http://000695.com" target="_blank">久久av一区二区三区亚洲</a>| <a href="http://lianjiemenye.com" target="_blank">亚洲影院免费观看</a>| <a href="http://989766.com" target="_blank">一本色道久久精品</a>| <a href="http://44ie.com" target="_blank">亚洲精品视频在线播放</a>| <a href="http://haomscq.com" target="_blank">欧美激情一区二区三区不卡</a>| <a href="http://holotu.com" target="_blank">欧美成人亚洲成人</a>| <a href="http://xiaocao-av.com" target="_blank">免费91麻豆精品国产自产在线观看</a>| <a href="http://3dmh329.com" target="_blank">新67194成人永久网站</a>| <a href="http://783956.com" target="_blank">亚洲欧美一区二区视频</a>| <a href="http://tristooges.com" target="_blank">亚洲天堂视频在线观看</a>| <a href="http://85995m.com" target="_blank">亚洲视频每日更新</a>| <a href="http://88488848.com" target="_blank">亚洲视频在线观看</a>| <a href="http://highfivewe.com" target="_blank">一本一本久久</a>| <a href="http://scqike.com" target="_blank">亚洲一区二区三区四区中文</a>| <a href="http://aass22.com" target="_blank">亚洲视频axxx</a>| <a href="http://89wbw.com" target="_blank">久久久成人精品</a>| <a href="http://1116333.com" target="_blank">午夜激情综合网</a>| <a href="http://choaoxing.com" target="_blank">夜夜嗨一区二区三区</a>| <a href="http://www8xvi.com" target="_blank">妖精成人www高清在线观看</a>| <a href="http://www51avav.com" target="_blank">亚洲精品美女久久久久</a>| <a href="http://261262.com" target="_blank">日韩视频永久免费</a>| <a href="http://677968.com" target="_blank">一区二区高清视频</a>| <a href="http://765409.com" target="_blank">亚洲一二三区在线</a>| <a href="http://czwangluoyouhua.com" target="_blank">亚洲综合色网站</a>| <a href="http://681656.com" target="_blank">欧美在线视频免费播放</a>| <a href="http://345521.com" target="_blank">久久久久久久久久看片</a>| <a href="http://785448.com" target="_blank">六月丁香综合</a>| <a href="http://ww9494.com" target="_blank">欧美日韩国产另类不卡</a>| <a href="http://saobi6.com" target="_blank">国产精品免费视频观看</a>| <a href="http://www17bxbx.com" target="_blank">国产日韩欧美视频</a>| <a href="http://tizenkorea.com" target="_blank">在线观看亚洲视频啊啊啊啊</a>| <a href="http://zzztt04.com" target="_blank">亚洲国产日韩一级</a>| <a href="http://77xyc77.com" target="_blank">中文av字幕一区</a>| <a href="http://390642.com" target="_blank">久久精视频免费在线久久完整在线看</a>| <a href="http://xccp4888.com" target="_blank">久久久久久久久久久久久女国产乱</a>| <a href="http://044925.com" target="_blank">久热精品视频在线</a>| <a href="http://dzyhjx.com" target="_blank">91久久夜色精品国产网站</a>| <a href="http://taominze.com" target="_blank">夜夜精品视频一区二区</a>| <a href="http://topjavhd.com" target="_blank">性久久久久久久久</a>| <a href="http://439368.com" target="_blank">免费不卡视频</a>| <a href="http://fyfsds.com" target="_blank">国产精品视频自拍</a>| <a href="http://19zet.com" target="_blank">在线观看亚洲专区</a>| <a href="http://www151zh.com" target="_blank">日韩一级精品</a>| <a href="http://2302345.com" target="_blank">久久精品国产亚洲一区二区</a>| <a href="http://sg-lxs.com" target="_blank">欧美激情第一页xxx</a>| <a href="http://1355456.com" target="_blank">999在线观看精品免费不卡网站</a>| <a href="http://969093.com" target="_blank">亚洲一级在线观看</a>| <a href="http://sdgs6788.com" target="_blank">久久资源在线</a>| <a href="http://wwdd44.com" target="_blank">国产精品老牛</a>| <a href="http://k-dchina.com" target="_blank">亚洲国产精品尤物yw在线观看</a>| <a href="http://tutu80.com" target="_blank">亚洲影院在线</a>| <a href="http://152mu.com" target="_blank">亚洲国产成人精品视频</a>| <a href="http://270909.com" target="_blank">亚洲一区二区免费看</a>| <a href="http://3990033.com" target="_blank">久久综合影视</a>| <a href="http://817794.com" target="_blank">国产精品视频999</a>| <a href="http://aqdw2021.com" target="_blank">亚洲欧洲日韩女同</a>| <a href="http://playav111.com" target="_blank">欧美一区二区三区在线观看视频 </a>| <a href="http://44368com.com" target="_blank">欧美激情一区二区久久久</a>| <a href="http://dlwansheng.com" target="_blank">亚洲一区二区精品在线</a>| <a href="http://rljyy.com" target="_blank">久久人人爽国产</a>| <a href="http://www24822.com" target="_blank">国产精品人人做人人爽人人添</a>| <a href="http://556626.com" target="_blank">亚洲国产精品久久久久秋霞蜜臀 </a>| <a href="http://vipaiqiyi.com" target="_blank">在线播放视频一区</a>| <a href="http://www-44899.com" target="_blank">亚洲一区二区3</a>| <a href="http://www-111111.com" target="_blank">欧美搞黄网站</a>| <a href="http://csmdjs.com" target="_blank">久久久噜噜噜久噜久久</a>| <a href="http://7kz6.com" target="_blank">国产精品私房写真福利视频</a>| <a href="http://www-798009.com" target="_blank">亚洲人成网站777色婷婷</a>| <a href="http://anxingou365.com" target="_blank">久久久精品久久久久</a>| <a href="http://cc1024.com" target="_blank">亚洲一区二区三区四区五区黄</a>| <a href="http://5456yy.com" target="_blank">欧美二区视频</a>| <a href="http://9a5x.com" target="_blank">亚洲丰满在线</a>| <a href="http://idc0558.com" target="_blank">久久久久综合网</a>| <script> (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })(); </script> </body>