下載本文檔
版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
虛擬8086模式的內存管理下邊我們用到的V86即指虛擬8086模式。在以前的教程中,你學習了怎樣模擬V86中斷,但還有一個問題沒有解決:在VxD和V86代碼之間交換數(shù)據(jù)。我們將在此學習如何使用V86內存管理器來實現(xiàn)這個功能。在這里下載例子程序理論假如你的VxD和一些V86程序一起運行,如何傳送大量數(shù)據(jù)到V86程序中或從V86程序中傳送大量數(shù)據(jù)遲早是一個大問題。通過寄存器傳送大量數(shù)據(jù)是不現(xiàn)實的??赡苣愕南乱粋€想法是在ring0中分配一大塊內存,并且通過一些寄存器傳送其指針到V86程序,使其能訪問這些數(shù)據(jù)。假如你這樣做,可能會破壞你的系統(tǒng),因為V86的地址定位方式需要segment:offset對,而不是線性定位方式。對這個問題,有很多解決的方法。然而,我選擇了一個由V86內存管理器提供的一種簡便的方法。如你能在你可使用的V86內存范圍內找到一個空閑的內存塊作為通訊緩沖區(qū),這將解決其中的一個問題。然而,指針傳送的問題依然存在。你可以通過V86內存管理器的服務來解決這兩個問題。V86內存管理器是為V86應用管理內存的靜態(tài)VxD。它還為V86應用提供EMS和XMS服務和為其他VxD提供API傳送服務。API傳送是一個從ring0拷貝數(shù)據(jù)到V86范圍內的緩沖區(qū)并且傳送V86緩沖區(qū)地址到V86代碼的過程。V86內存管理器有一個在V86內存范圍內的傳送緩沖區(qū),其含有VxD拷貝到V86內存范圍內的數(shù)據(jù),反之亦然。初始的緩沖區(qū)是4K。你以調用V86MMGR_Set_Mapping_Info來增加它的大小?,F(xiàn)在你知道了傳送緩沖區(qū),我們如何拷入或拷出數(shù)據(jù)呢?這個問題通過調用兩個服務來解決:V86MMGR_Allocate_Buffer和V86MMGR_Free_Buffer。V86MMGR_Allocate_Buffer從傳送緩沖區(qū)分配一塊內存并且從ring0拷貝一些數(shù)據(jù)到分配的V86緩沖區(qū)。V86MMGR_Free_Buffer正好相反:它從分配的V86內存塊拷貝一些數(shù)據(jù)到ring0緩沖區(qū)并且釋放由V86MMGR_Allocate_Buffer分配的內存塊。記住,V86在內存管理器象堆棧一樣管理被分配的緩沖區(qū)。這意味著分配/釋放必須按先進后出的規(guī)則。所以如你調用了兩次V86MMGR_Allocate_Buffer,第一個V86MMGR_Free_Buffer將釋放由第二個V86MMGR_Allocate_Buffer調用而分配的緩沖區(qū)。我們來看一下V86MMGR_Allocate_Buffer的定義,它是一個基本寄存器傳送參數(shù)的服務。EBX當前VM的句柄EBP指向當前VM的客戶寄存器結構的指針ECX從傳送緩沖區(qū)分配的字節(jié)數(shù)CARRYFLAG進位標志位,如你不想從ring0緩沖區(qū)拷貝數(shù)據(jù)到分配的內存塊就清零,如你想從ring0緩沖區(qū)拷貝數(shù)據(jù)到分配的內存塊就置1FS:ESI指向ring0緩沖區(qū)的selector:offset指針,緩沖區(qū)中有要被拷貝到被分配的緩沖區(qū)中的數(shù)據(jù)如果進位標志位被清零,則忽略它。假如調用成功,進位標志位被清零并且ECX包含在傳送緩沖區(qū)中的字節(jié)數(shù)。這個數(shù)值應小于你要求的數(shù)值,所以你應保持這個數(shù)值,V86MMGR_Free_Buffer待會要用到它。EDI的高字包含被分配的內存塊的V86段地址,偏移地址在在低字中。進位標志位當錯誤發(fā)生時被置位。V86MMGR_Free_Buffer和V86MMGR_Allocate_Buffer接受同樣的參數(shù)。當你調用V86MMGR_Allocate_Buffer時,你在當前VM的V86內存范圍內分配了一塊內存,并且把其地址放到了EDI中。你可以使用這些服務傳送數(shù)據(jù)到V86中斷中或從V86中斷中取得數(shù)據(jù)。在附加的API傳送中,V86內存管理器也給其他VxDs提供了API映射服務。API映射服務是映射一些在擴展內存中的頁到每個VM的V86內存范圍。你可以使用V86MMGR_Map_Pages執(zhí)行API映射。使用這個服務,頁被映射到每個VM的同一線性地址空間上。如你僅僅工作在一個VM上,這將浪費地址空間。因為API映射比API傳送要慢,所以你盡可能使用API傳送方式。API映射僅僅使用在一些要訪問同一線性地址空間并作用到所有VM的V86操作上。例子:這個例子演示了API傳送方式,使用了int21h的440Dh功能(從代碼66h)。這個中斷調用得到媒體ID,你的第一個固定磁盤的卷標號。;VxDLabel.asm,.386pinclude\masm\include\vmm.incinclude\masm\include\vwin32.incinclude\masm\include\v86mmgr.incVxDNameTEXTEQUControlNameTEXTEQUVxDMajorVersionTEXTEQU<1>VxDMinorVersionTEXTEQU<0>VxD_STATIC_DATA_SEGVxD_STATIC_DATA_ENDSVXD_LOCKED_CODE_SEG;,Remember:ThenameofthevxdMUSTbeuppercaseelseitwon'twork/unload;DECLARE_VIRTUAL_DEVICE%VxDName,%VxDMajorVersion,%VxDMinorVersion,%ControlName,UNDEFINED_DEVICE_ID,UNDEFINED_INIT_ORDERBegin_control_dispatch%VxDNameControl_DispatchW32_DEVICEIOCONTROL,OnDeviceloControlEnd_control_dispatch%VxDNameVXD_LOCKED_CODE_ENDSVXD_PAGEABLE_CODE_SEGBeginProcOnDeviceIoControlassumeesi:ptrDIOCParams.if[esi].dwIoControlCode==1VMMCallGet_Sys_VM_HandlemovHandle,ebxassumeebx:ptrcb_smovebp,[ebx+CB_Client_Pointer]movecx,sizeofMIDstcpushesimovesi,OFFSET32MediaIDpushdspopfsVxDCallV86MMGR_Allocate_BufferpopesijcEndImovAllocSize,ecxPush_Client_StateVMMCallBegin_Nest_V86_Execassumeebp:ptrClient_Byte_Reg_Strucmov[ebp].Client_ch,8mov[ebp].Client_cl,66hassumeebp:ptrClient_word_reg_strucmovedx,edimov[ebp].Client_bx,3;driveAmov[ebp].Client_ax,440dhmov[ebp].Client_dx,dxshredx,16mov[ebp].Client_ds,dxmoveax,21hVMMCallExec_IntVMMCallEnd_Nest_ExecPop_Client_State;;retrievethedata;movecx,AllocSizestcmovebx,Handlepushesimovesi,OFFSET32MedialDpushdspopfsVxDCallV86MMGR_Free_Bufferpopesimovedx,esiassumeedx:ptrDIOCParamsmovedi,[edx].lpvOutBuffermovesi,OFFSET32MediaID.midVolLabelmovecx,11repmovsbmovbyteptr[edi],0movecx,[edx].lpcbBytesReturnedmovdwordptr[edx],11EndI:.endifxoreax,eaxretEndProcOnDeviceIoControlVXD_PAGEABLE_CODE_ENDSVXD_PAGEABLE_DATA_SEGMIDstructmidInfoLeveldw0midSerialNumdd?midVolLabeldb11dup(?)midFileSysTypedb8dup(?)MIDendsMedialDMID<>Handledd?AllocSizedd?VXD_PAGEABLE_DATA_ENDSendJ;Label.asm;TheWin32VxDloader.;.386.modelflat,stdcalloptioncasemap:noneinclude\masm32\include\windows.incinclude\masm32\include\user32.incinclude\masm32\include\kernel32.incincludelib\masm32\lib\user32.libincludelib\masm32\lib\kernel32.libDlgProcPROTO:DWORD,:DWORD,:DWORD,:DWORD.dataFailuredb"CannotloadVxDLabel.VXD”,0AppNamedb"GetDiskLabel”,0VxDNamedb"\\.\vxdLabel.vxd”,0OutputTemplatedb"VolumeLabelofDriveC”,0.data?hInstanceHINSTANCE?hVxDdd?DiskLabeldb12dup(?)BytesReturneddd?.constIDD_VXDRUNequ101IDC_LOADequ1000.codestart:invokeGetModuleHandle,NULLmovhInstance,eaxinvokeDialogBoxParam,hInstance,IDD_VXDRUN,NULL,addrDlgProc,NULLinvokeExitProcess,eaxDlgProcprochDlg:HWND,uMsg:UINT,wParam:WPARAM,lParam:LPARAM.IFuMsg==WM_INITDIALOGinvokeCreateFile,addrVxDName,0,0,0,0,FILE_FLAG_DELETE_ON_CLOSE,0.ifeax==INVALID_HANDLE_VALUEinvokeMessageBox,hDlg,addrFailure,addrAppName,MB_OK+MB_ICONERRORmovhVxD,0invokeEndDialog,hDlg,NULL.elsemovhVxD,eax.endif.elseifuMsg==WM_CLOSE.ifhVxD!=0invokeCloseHandle,hVxD.endifinvokeEndDialog,hDlg,0.ELSEIFuMsg==WM_COMMANDmoveax,wParammovedx,wParamshredx,16.ifdx==BN_CLICKED.IFax==IDC_LOADinvokeDeviceIoControl,hVxD,1,NULL,0,addrDiskLabel,12,addrBytesReturned,NULLinvokeMessageBox,hDlg,addrDiskLabel,addrOutputTemplate,MB_OK+MB_ICONINFORMATION.endif.endif.ELSEmoveax,FALSEret.ENDIFmoveax,TRUEretDlgProcendpendstart講解我們首先分析lable.asm,它是一個加載了VxD的WIN32應用程序。invokeDeviceIoControl,hVxD,1,NULL,0,addrDiskLabel,12,addrBytesReturned,NULL它調用DeviceIoControl,設備代碼是1,沒有輸入緩沖區(qū),一個指向輸出緩沖區(qū)的指針及其大小。DiskLable是一個接收由VxD返回的卷標號的緩沖區(qū)。BytesReturned變量存有返回的字節(jié)數(shù)。這個例子說明了怎樣傳送數(shù)據(jù)和從VxD接收數(shù)據(jù):你傳送輸入/輸出緩沖區(qū)給VxD并且VxD讀取/寫入數(shù)據(jù)到指定的緩沖區(qū)。我們下面看看VxD代碼。VMMCallGet_Sys_VM_HandlemovHandle,ebxassumeebx:ptrcb_smovebp,[ebx+CB_Client_Pointer]當一個VxD接收W32_DeviceIoControl消息,它調用Get_Sys_VM_Handle得到系統(tǒng)VM的句柄并把它存在一個叫Handle的變量中。下面將從VM控制塊中提取指向客戶寄存器結構的指針到EBP。movecx,sizeofMIDstcpushesimovesi,OFFSET32MediaIDpushdspopfsVxDCallV86MMGR_Allocate_BufferpopesijcEndImovAllocSize,ecx下面,準備傳送到V86MMGR_Allocate_Buffer的參數(shù)。我們必須初始化被分配的緩沖區(qū)。我們把MediaID的偏移量送到ESI中,并且把選擇子放在FS中,然后調用V86MMGR_Allocate_Buffer。你等會要恢復指向DIOCParams的指針,所以我們必須通過pushesi和popesi來保護它。Push_Client_StateVMMCallBegin_Nest_V86_Execassumeebp:ptrClient_Byte_Reg_Strucmov[ebp].Client_ch,8mov[ebp].Client_cl,66hassumeebp:ptrClient_word_reg_strucmovedx,edimov[ebp].Client_bx,3;driveCmov[ebp].Client_ax,440dh我們在客戶寄存器結構中準備參數(shù)值來執(zhí)行int21h的440Dh功能(從代碼66h),得到盤C的媒體ID。我們拷貝edi的值到edx中(edi中有由V86MMGR_Allocate_Buffer分配的內存塊的V86地址)。mov[ebp].Client_dx,dxshredx,16mov[ebp].Client_ds,dx調用了int21h的440Dh功能(從代碼66h)后,在ds:dx中得到一指向一個MID結構的指針,我們必須把在edx中的
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年莆田市公安局面向社會及退役軍人公開招聘警務輔助人員148人備考題庫及1套參考答案詳解
- 2025年鈉離子電池電解液五年儲能應用分析報告
- 2025重慶市黔江區(qū)婦幼保健院招聘編外1人備考核心題庫及答案解析
- 梓潼縣2025年下半年公開考核招聘衛(wèi)生專業(yè)技術人員(26人)筆試重點題庫及答案解析
- 2025陸軍軍醫(yī)大學西南醫(yī)院護士長招聘9人考試核心題庫及答案解析
- 2025隴塬大數(shù)據(jù)服務(定西)有限公司招聘53人(甘肅)參考考試試題及答案解析
- 2025年兒童益智玩具創(chuàng)新趨勢與安全標準五年發(fā)展報告
- 2025福建廈門市集美區(qū)寧寶幼兒園非在編廚房人員招聘1人筆試重點試題及答案解析
- 跨境電商平臺2025年跨境電商支付:構建與便捷交易報告
- 2025錦州市部分事業(yè)單位赴高校公開招聘2026年應屆畢業(yè)生(第二批)考試重點試題及答案解析
- 醫(yī)院培訓課件:《高血壓的診療規(guī)范》
- 北京市通州區(qū)2024-2025學年八年級上學期期末語文試題(含答案)
- 2025年銀行意識形態(tài)分析研判會議記錄
- 醫(yī)院藥學藥學信息服務
- 廣元市利州區(qū)下田埡石材廠2023年石灰?guī)r礦擴建項目環(huán)評報告
- 2025年法院聘用書記員試題(+答案)
- 網絡新技術與信息安全
- 2025年抗菌藥物培訓試卷(+答案)
- 中國婚嫁風俗課件
- 年休假申請書
- 抗菌藥物臨床應用管理工作制度和監(jiān)督管理機制(詳細完整版)
評論
0/150
提交評論