如果當前程序為system程序,就意味著此次開啟的核心物件訪問許可權屬於核心,那麼就使用核心控制代碼表, 內
核控制代碼與使用者控制代碼不同的地方就在於核心控制代碼需要或上乙個0x80000000即最高位置為1作為標識,
但是實際在使用控制代碼的時候還是不需要這個最高位值的。程序的控制代碼表由eprocess中的
objecttable成員進行管理, 控制代碼表有3種記憶體結構分別為一級表,二級表以及**表。表的結構
由程序中的控制代碼數決定,屬於乙個動態增長以及改變的過程,一級表能夠儲存控制代碼數為512, 二級為
1024*512,**表為1024*1024*512。
// 獲取pspcidtable位址
pulong_ptr getpspcidtable()
kdprint(("pslookupprocessbyprocessid:%p\n", ppslookupprocessbyprocessid));
// 488bd1 mov rdx, rcx
// 488b0d9149edff mov rcx, qword ptr[nt!pspcidtable(fffff800`0402ebc8)]
for (puchar i = (puchar)ppslookupprocessbyprocessid; i < ppslookupprocessbyprocessid + 0xff; i++) }
return 0;
}//自己實現乙個山寨的myenumhandletable,介面和exenumhandletable一樣
boolean
myenumhandletable(
phandle_table handletable,
my_enumerate_handle_routine enumhandleprocedure,
pvoid enumparameter,
phandle handle
) //取表基址和表的級數 , tablecode 的低兩位用於表示當前控制代碼表的級數: 0、1、2 分別表示一級表、二級表和**表。
capturedtable = (handletable->tablecode)&~3;
tablelevel = (handletable->tablecode) & 3;
maxhandle = handletable->nexthandleneedingpool;
dbgprint("控制代碼上限值為0x%x\n", maxhandle);
//判斷表的等級
switch (tablelevel)
}resultvalue = true;
} break;
case 1:}}
resultvalue = true;
} break;
case 2:}}
}resultvalue = true;
} break;
default:
break;
} dbgprint("processcount:0x%x", g_processcount);
return resultvalue;
}void startenum()
控制代碼表和pspcidtable
首先要先bs一下自己.一直以為程序的控制代碼表和pspcidtable是一樣的.結果因為概念上的理解錯誤導致偶浪費了不少時間.多虧好心的fc的耐心指導算是明白一些.總結一下fc教偶的 pspcidtable與程序控制代碼表沒有直接關係.它只是借用了控制代碼表的結構.它裡面存的內容是 eprocess...
通過手寫列舉理解列舉
在jdk1.5之前都需要程式設計師手寫列舉,在1.5之後便可以使用enum完成列舉 手寫列舉 public class seasontest class season public string getseaname public string getseadesc override public ...
通過普通類實現列舉
平時開發過程中,我們在接受某個引數的時候,該引數是乙個物件,並且只能是固定的某幾個物件,假如我們定義了乙個類color,我們程式中只有兩種color,white和black,這種情況下我們可能首先想到的是通過關鍵字enum定義乙個列舉類,今天我們不通過enum關鍵字來實現這種效果。首先,color這...