免费视频淫片aa毛片_日韩高清在线亚洲专区vr_日韩大片免费观看视频播放_亚洲欧美国产精品完整版

打開APP
userphoto
未登錄

開通VIP,暢享免費(fèi)電子書等14項(xiàng)超值服

開通VIP
WINNT.H內(nèi)的_IMAGE_IMPORT_BY_NAME變長數(shù)組示例

  研究WINNT.H里面的導(dǎo)入名表結(jié)構(gòu)體_IMAGE_IMPORT_BY_NAME 時(shí),發(fā)現(xiàn)一個(gè)問題,結(jié)構(gòu)體成員Name數(shù)組竟然是1,但是實(shí)際上反匯編看到是一個(gè)不同長度的字符串。怎么實(shí)現(xiàn)的呢?很多人在網(wǎng)上提到如下說法,但沒有深入分析為什么。這里就給出一個(gè)參考例子。說明怎么搭建那個(gè)名字表的。當(dāng)然這個(gè)名字表都是由

  1. typedef struct _IMAGE_THUNK_DATA32 {  
  2.         union {   
  3.         PBYTE ForwarderString;  
  4.                 PDWORD Function;  
  5.                 DWORD Ordinal;  
  6.                 PIMAGE_IMPORT_BY_NAME AddressOfData;  
  7.          } u1;  
  8. } IMAGE_THUNK_DATA32;  

結(jié)構(gòu)指向的。IMAGE_THUNK_DATA32則由struct _IMAGE_IMPORT_DESCRIPTOR 
中的OriginalFirstThunk;指向。

  1. typedef struct _IMAGE_IMPORT_BY_NAME {   
  2.         WORD Hint;   
  3.         BYTE Name[1];   
  4. } IMAGE_IMPORT_BY_NAME;  

    【網(wǎng)上的很多說法】其中Hint字段的內(nèi)容是可選的,如果它不是0,則它也表示函數(shù)的序號,我們編程是不必考慮它。雖然上面的定義中Name數(shù)組只包含一個(gè)元素,但其實(shí)它是一個(gè)變長數(shù)組,保存的是一個(gè)以NULL結(jié)尾的字符串,也就是函數(shù)名。


該程序演示了創(chuàng)造變長數(shù)組的辦法。必須用動(dòng)態(tài)開辟內(nèi)存辦法實(shí)現(xiàn)。
必要聲明成指針,然后在malloc的時(shí)候,根據(jù)iNum數(shù)目進(jìn)行申請,譬如iNum為5個(gè)int,
這可以這樣 p = (test *)malloc(sizeof(test) + (iNum - 1) * sizeof(int));
這樣,后面的內(nèi)容可以通過p->data[i]訪問了.

  1. #include<iostream>  
  2. using namespace std;  
  3. //#pragma pack(1)如果是設(shè)置了按字節(jié)填充,則后面int len1=sizeof(impname)+ strlen(s1)即可。  
  4. //否則需要減一。可以在各個(gè)元素之間用0隔開。  
  5. typedef struct IMPNAME  
  6. {  
  7.     short int hint;         //模擬函數(shù)序號  
  8.     char name[1];           //模擬函數(shù)名  
  9. } impname;  
  10. int main()  
  11. {  
  12.     impname *p,*s[2];  
  13.     char s1[ ]="add";     
  14.     char s2[ ]="substruct";  
  15.     char *q;  
  16.     int len1=sizeof(impname)+ strlen(s1)-1;  
  17.     int len2=sizeof(impname)+ strlen(s2)-1;  
  18.     int l=len1+len2;  
  19.     p=(impname*) malloc(l);  
  20.     p->hint=0;  
  21.     strcpy(p->name,s1);  
  22.     cout<<p->hint<<endl;  
  23.     cout<<p->name<<endl;  
  24.     s[0]=p;  
  25.     q=(char*)p;     //指針類型變換,強(qiáng)制為單個(gè)字節(jié)的指針類型??梢园醋止?jié)增加步長,否則按4的倍數(shù)增加,如p+x,實(shí)際上是p+4*x;  
  26.     q=q+len1;  
  27.     p=(impname*)q;      //類型轉(zhuǎn)換為原來的類型指向結(jié)構(gòu)體的。  
  28.     p->hint=1;  
  29.     strcpy(p->name,s2);  
  30.     cout<<p->hint<<endl;  
  31.     cout<<p->name<<endl;  
  32.     s[1]=p;  
  33.     cout<<"------------------------------"<<endl;  
  34.     cout<<"order="<<s[0]->hint<<endl;  
  35.     cout<<"function name="<<s[0]->name<<endl;  
  36.     cout<<"order="<<s[1]->hint<<endl;  
  37.     cout<<"function name="<<s[1]->name<<endl;  
  38.     return 0;  
  39. }  

BYTE Name[1], 這個(gè)變量定義看起來很奇怪,是嗎?
代學(xué)生: 是的,我很少見到這種定義。
  通常我們會(huì)定義 char buffer[256], BYTE data[8]; 等類型。
  BYTE Name[1], 只包含一個(gè)元素的數(shù)組,它也裝不下后面的"MessageBoxA"字符串啊。
代老師:這種定義是一種指針的變通用法。
  如果你真要定義成數(shù)組來包含后面的字符串,你定義成多大呢?定義成100,短字符串浪費(fèi),
  長字符串可能就真能碰到一個(gè)101個(gè)字符的名字,你定義的還是占不下。
  所以說,這個(gè)Name[1], 不是要你往里面裝東西的,C 語言里,你可以借助這個(gè)Name 變量訪問到它對應(yīng)的地址。
  這種用法通常是很少用的。因?yàn)樗『芏?,例如結(jié)構(gòu)后面不能再定義其它變量了,必須是最后一個(gè),定義了
  數(shù)組又不用它裝東西,也不符合數(shù)組的初衷. 所以你只有明白這個(gè)道理就可以了。
  
代學(xué)生:既然它那么不好用,為什么還那樣定義呢。
代老師:還是那句話,是變通。
  你看,它簡潔,它完成了使命。否則你就要把結(jié)構(gòu)變一變,例如按常規(guī)估計(jì)應(yīng)該是這樣子。
  WORD Hint; BYTE *pName; 然后你要求微軟說,Hint 后面不要跟字符串,要跟一個(gè)地址。這樣C語言好寫。
  好比說大部分人沿著盤山路往山上走,也有人愿意盤著荊棘往山上爬,后者繞了近路,但風(fēng)險(xiǎn)也大。
  
代學(xué)生:講了這么多,其實(shí)我看一個(gè)word 后面跟著一個(gè)0字終結(jié)符字符串,還是很好理解的嗎。
代老師:C 語言以其簡潔,高效,使我們受益良多。但在某些特殊的情況下,它也會(huì)力不從心。有時(shí)刻當(dāng)你看著一堆堆
  結(jié)構(gòu)套結(jié)構(gòu),一堆堆宏套宏令你頭暈時(shí),而看看它最終的list 表或二進(jìn)制輸出反而能令你豁然開朗。
  哦,有點(diǎn)扯遠(yuǎn)了。 我還是最喜歡C的。 

本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊舉報(bào)。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
C 指針數(shù)組和指向指針的指針
std::string的用法
C++復(fù)合類型
C++ 筆試之基礎(chǔ) 08 字符串?dāng)?shù)組 按字典排序
與LSGO一起學(xué)“14 數(shù)組(14.35 strcpy函數(shù))”
用非遞歸算法解決Hanoi漢諾塔問題
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服