欧美另类日韩中文色综合,天堂va亚洲va欧美va国产,www.av在线播放,大香视频伊人精品75,奇米777888,欧美日本道免费二区三区,中文字幕亚洲综久久2021

準確定制Windows應(yīng)用程序堆棧大小

時間:2023-05-01 08:08:33 計算機論文 我要投稿
  • 相關(guān)推薦

準確定制Windows應(yīng)用程序堆棧大小

在編寫Windows應(yīng)用程序時,我們是通過模塊定義文件(.def)中的STACKSIZE語句來定義以字節(jié)為單位的應(yīng)用程序堆棧大小,以用于函數(shù)參數(shù)的中間存儲。根據(jù)Windows SDK手冊的推薦,最小堆棧大小應(yīng)為5120字節(jié)。事實上,這是一個比實際需求放寬了許多的推薦值。Microsoft公司沒有對如何準確設(shè)定這一參數(shù)提供有效方法。由于Windows本身是一個多任務(wù)環(huán)境,可以同時運行多個應(yīng)用程序,因此,我們對堆棧參數(shù)的選擇會導(dǎo)致有限內(nèi)存空間的浪費。在此,本文給出一種準確定制Windows應(yīng)用程序堆棧大小的方法,具體的實現(xiàn)方法如下。

根據(jù)Andrew Schulman在《未公開的Windows核心技術(shù)》中提供的資料,在應(yīng)用程序的實例句柄所指向的缺省數(shù)據(jù)段起始位置,Windows定義了如下的INSTDATA結(jié)構(gòu):

typedef struct {

WORD wMustBeZero; //此參數(shù)必須為零

DWORD dw01dSSSP; //保存當(dāng)前的SS:SP指針;

WORD pLocalHeap; //指向局部堆信息結(jié)構(gòu)的近指針

WORD pAtomTable; //指向任務(wù)原子表的近指針

WORD pStackTop; //指向棧頂?shù)慕羔?/p>

WORD pStackMin; //當(dāng)前使用的堆棧大小

WORD pStackBottom; //指向棧底的近指針

} INSTDATA;

我們提供的方法的思路是,在應(yīng)用程序被加載時,先在堆棧區(qū)的棧頂位置到當(dāng)前SP之間填充固定字節(jié)(如0xaa)來進行初始化。在程序執(zhí)行結(jié)束時,通過對堆棧區(qū)初始化值的改變情況來計算應(yīng)用程序所使用的實際堆棧的大小。以上的工作主要依靠下面兩個函數(shù)來完成。

1.堆棧初始化函數(shù)

void FAR PASCAL SetStack(void)

{

BYTE near *npStackTop,near *npStackCurrent;

npStackTop=((NPINSTDATA)0x0000)→pStackTop;

-asm mov npStackCurrent,SP;

npStackCurrent-=2;

while(npStackTop<npStackCurrent) *npStackTop =0xaa;

}

2.堆棧大小計算函數(shù)

WORD FAR PASCAL CacuStack(void)

{

BYTE near *npStackTop,near *npStackBottom;

npStackTop=((NPINSTDATA)0x0000)→pStackTop;

npStackBottom=((NPINSTDATA)0x0000)→pStackBottom;

while(*npStackTop=0xaa) npStackTop ;

return((WORD)(npStackBottom-npStackTop));

}

在應(yīng)用程序中調(diào)用以上兩個函數(shù)以定制堆棧大小的方法如下例所

示:

int PASCAL WinMain(hInstance, hPrevInstance, 1pCmdLine,

nCmdShow)

HANDLE hInstance; /*current instance*/

HANDLE hPrevInstance; /*previous instance*/

LPSTR 1pCmdLine; /*command line*/

int nCmdShow; /*show-window type (open/icon)*/

{

char szEchoMsg[60];

MSC msg;

SetStack ();

if (!hPrevInstance) /*Other instances of app running?*/

if (!InitApplication(hInstance)) /*Initialize shared thi

ngs*/

return (FALSE); /*Exit if unable to initialize*/

/*Perform initializations that apply to a specific insta

nce*/

if (!InitInstance(hInstance,nCmdShow))

return (FALSE);

/*Acquire and di

[1] [2] 

【準確定制Windows應(yīng)用程序堆棧大小】相關(guān)文章:

準確04-29

WINDOWS XP教案04-25

安裝Windows或啟動Windows時鼠標不可用06-20

定制04-29

大小04-29

windows及應(yīng)用實踐報告04-14

初識Windows的教學(xué)方案01-17

準確定位作文09-25

重提準確把握教材04-30

廣告的定位要準確04-29