初學SSDT遇到的乙個指標問題

2021-06-13 01:46:33 字數 1675 閱讀 3527

最近想學驅動開發,參考別人的**,但是遇到了一些問題,昨晚調了乙個晚上都找不到原因,快12點半

的時候才找

到原因,是指標沒寫好,

其實根本原因是自己基礎不紮實。ssdt的結構如下:

typedef struct _servicedescriptortable *pservicedescriptortable;  

想要實現的功能是根據匯出函式索引獲取函式的位址,如ntopenprocess,具體的做法就是先找到描述符表結構體

keservice

descriptortable的位置,然後由keservicedescriptortable->

servicetablebase

找到基址的位置,在基址位 置

的基礎上加上

函式的偏移,去該位址的內容就是目

long *ssdt_adr,ssdt_ntopenprocess_cur_addr,t_addr; 

//讀取ssdt表中索引值為0x7a的函式

t_addr=(long)keservicedescriptortable->servicetablebase; //基址

kdprint(("當前servicetablebase位址為%x \n",t_addr));

ssdt_adr=(plong)(t_addr+0x7a*4); //基址+偏移,乘4是因為每個項佔4個位元組

kdprint(("當前t_addr+0x7a*4=%x \n",ssdt_adr)); 

ssdt_ntopenprocess_cur_addr=*ssdt_adr;//取ssdt_adr 指向的內容

kdprint(("當前ssdt_ntopenprocess_cur_addr位址為%x \n",ssdt_ntopenprocess_cur_addr));

我的**:

plong ptaddr;

ulong ssdtntopenprocess;

ptaddr=(plong)keservicedescriptortable->servicetablebase;

kdprint(("current servicestablebase addr is %x\n",ptaddr));

ptaddr=ptaddr+0x7a*4; //錯在這裡,改為ptaddr=ptaddr+0x7a才正確

kdprint(("當前t_addr+0x7a*4=%x \n",ptaddr));

ssdtntopenprocess=*ptaddr;

kdprint(("當前ssdt_ntopenprocess_cur_addr位址為%x \n",ssdtntopenprocess));

一開始我照貓畫虎的寫了一遍,包括乘4的做法,後來除錯的過程中發現老是得不出正確的位址,百思不得其解,後來細 心

發現,得出的基址是

正確的,

得出的基址+偏移確實錯誤的,原來我用的是指標,原作者用的是long型的整數運算,

ptaddr+1,其內容是第乙個目標函式所在的內

存位址,等價於

(plong)((long)

keservicedescriptortable->servicetablebase+1*4);

乙個是指標的運算,乙個是把指標的值(不是所指的

指,是指標的值)先取

出來,相當於取到基址,然後加上偏移,才得 出

正確結果,加0x7a同理。

初學python遇到的乙個小問題

python中的乙個小問題 問題是這樣的 old 1,2,3,4,5 new old old 6 print new 求輸出結果,第一眼我以為答案是 6 但是當我上機實驗才發現答案是 1,2,3,4,5 為什麼會是這個答案呢?我 檢視old 和 new 的位址 old 1,2 3,4 new old...

初學Spring遇到的第乙個問題 bean xml

問 題 exception in thread main org.springframework.beans.factory.beandefinitionstoreexception line 2 in xml document from file e lihui j2ee 學習資料 spring框...

乙個有趣的指標問題

是從網上看到的乙個例子 struct s int i int p void main struct s s int p s.i p 0 4 p 1 3 s.p p s.p 1 1 s.p 0 2 問程式會在哪一行死掉 解答 程式執行到最後一行就會報出異常,死掉.具體解答為 首先需要說明的是結構體s,...