下載本文檔
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
虛擬8086模式的內(nèi)存管理下邊我們用到的V86即指虛擬8086模式。在以前的教程中,你學(xué)習(xí)了怎樣模擬V86中斷,但還有一個(gè)問題沒有解決:在VxD和V86代碼之間交換數(shù)據(jù)。我們將在此學(xué)習(xí)如何使用V86內(nèi)存管理器來實(shí)現(xiàn)這個(gè)功能。在這里下載例子程序理論假如你的VxD和一些V86程序一起運(yùn)行,如何傳送大量數(shù)據(jù)到V86程序中或從V86程序中傳送大量數(shù)據(jù)遲早是一個(gè)大問題。通過寄存器傳送大量數(shù)據(jù)是不現(xiàn)實(shí)的。可能你的下一個(gè)想法是在ring0中分配一大塊內(nèi)存,并且通過一些寄存器傳送其指針到V86程序,使其能訪問這些數(shù)據(jù)。假如你這樣做,可能會(huì)破壞你的系統(tǒng),因?yàn)閂86的地址定位方式需要segment:offset對,而不是線性定位方式。對這個(gè)問題,有很多解決的方法。然而,我選擇了一個(gè)由V86內(nèi)存管理器提供的一種簡便的方法。如你能在你可使用的V86內(nèi)存范圍內(nèi)找到一個(gè)空閑的內(nèi)存塊作為通訊緩沖區(qū),這將解決其中的一個(gè)問題。然而,指針傳送的問題依然存在。你可以通過V86內(nèi)存管理器的服務(wù)來解決這兩個(gè)問題。V86內(nèi)存管理器是為V86應(yīng)用管理內(nèi)存的靜態(tài)VxD。它還為V86應(yīng)用提供EMS和XMS服務(wù)和為其他VxD提供API傳送服務(wù)。API傳送是一個(gè)從ring0拷貝數(shù)據(jù)到V86范圍內(nèi)的緩沖區(qū)并且傳送V86緩沖區(qū)地址到V86代碼的過程。V86內(nèi)存管理器有一個(gè)在V86內(nèi)存范圍內(nèi)的傳送緩沖區(qū),其含有VxD拷貝到V86內(nèi)存范圍內(nèi)的數(shù)據(jù),反之亦然。初始的緩沖區(qū)是4K。你以調(diào)用V86MMGR_Set_Mapping_Info來增加它的大小?,F(xiàn)在你知道了傳送緩沖區(qū),我們?nèi)绾慰饺牖蚩匠鰯?shù)據(jù)呢?這個(gè)問題通過調(diào)用兩個(gè)服務(wù)來解決:V86MMGR_Allocate_Buffer和V86MMGR_Free_Buffer。V86MMGR_Allocate_Buffer從傳送緩沖區(qū)分配一塊內(nèi)存并且從ring0拷貝一些數(shù)據(jù)到分配的V86緩沖區(qū)。V86MMGR_Free_Buffer正好相反:它從分配的V86內(nèi)存塊拷貝一些數(shù)據(jù)到ring0緩沖區(qū)并且釋放由V86MMGR_Allocate_Buffer分配的內(nèi)存塊。記住,V86在內(nèi)存管理器象堆棧一樣管理被分配的緩沖區(qū)。這意味著分配/釋放必須按先進(jìn)后出的規(guī)則。所以如你調(diào)用了兩次V86MMGR_Allocate_Buffer,第一個(gè)V86MMGR_Free_Buffer將釋放由第二個(gè)V86MMGR_Allocate_Buffer調(diào)用而分配的緩沖區(qū)。我們來看一下V86MMGR_Allocate_Buffer的定義,它是一個(gè)基本寄存器傳送參數(shù)的服務(wù)。EBX當(dāng)前VM的句柄EBP指向當(dāng)前VM的客戶寄存器結(jié)構(gòu)的指針ECX從傳送緩沖區(qū)分配的字節(jié)數(shù)CARRYFLAG進(jìn)位標(biāo)志位,如你不想從ring0緩沖區(qū)拷貝數(shù)據(jù)到分配的內(nèi)存塊就清零,如你想從ring0緩沖區(qū)拷貝數(shù)據(jù)到分配的內(nèi)存塊就置1FS:ESI指向ring0緩沖區(qū)的selector:offset指針,緩沖區(qū)中有要被拷貝到被分配的緩沖區(qū)中的數(shù)據(jù)如果進(jìn)位標(biāo)志位被清零,則忽略它。假如調(diào)用成功,進(jìn)位標(biāo)志位被清零并且ECX包含在傳送緩沖區(qū)中的字節(jié)數(shù)。這個(gè)數(shù)值應(yīng)小于你要求的數(shù)值,所以你應(yīng)保持這個(gè)數(shù)值,V86MMGR_Free_Buffer待會(huì)要用到它。EDI的高字包含被分配的內(nèi)存塊的V86段地址,偏移地址在在低字中。進(jìn)位標(biāo)志位當(dāng)錯(cuò)誤發(fā)生時(shí)被置位。V86MMGR_Free_Buffer和V86MMGR_Allocate_Buffer接受同樣的參數(shù)。當(dāng)你調(diào)用V86MMGR_Allocate_Buffer時(shí),你在當(dāng)前VM的V86內(nèi)存范圍內(nèi)分配了一塊內(nèi)存,并且把其地址放到了EDI中。你可以使用這些服務(wù)傳送數(shù)據(jù)到V86中斷中或從V86中斷中取得數(shù)據(jù)。在附加的API傳送中,V86內(nèi)存管理器也給其他VxDs提供了API映射服務(wù)。API映射服務(wù)是映射一些在擴(kuò)展內(nèi)存中的頁到每個(gè)VM的V86內(nèi)存范圍。你可以使用V86MMGR_Map_Pages執(zhí)行API映射。使用這個(gè)服務(wù),頁被映射到每個(gè)VM的同一線性地址空間上。如你僅僅工作在一個(gè)VM上,這將浪費(fèi)地址空間。因?yàn)锳PI映射比API傳送要慢,所以你盡可能使用API傳送方式。API映射僅僅使用在一些要訪問同一線性地址空間并作用到所有VM的V86操作上。例子:這個(gè)例子演示了API傳送方式,使用了int21h的440Dh功能(從代碼66h)。這個(gè)中斷調(diào)用得到媒體ID,你的第一個(gè)固定磁盤的卷標(biāo)號。;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,它是一個(gè)加載了VxD的WIN32應(yīng)用程序。invokeDeviceIoControl,hVxD,1,NULL,0,addrDiskLabel,12,addrBytesReturned,NULL它調(diào)用DeviceIoControl,設(shè)備代碼是1,沒有輸入緩沖區(qū),一個(gè)指向輸出緩沖區(qū)的指針及其大小。DiskLable是一個(gè)接收由VxD返回的卷標(biāo)號的緩沖區(qū)。BytesReturned變量存有返回的字節(jié)數(shù)。這個(gè)例子說明了怎樣傳送數(shù)據(jù)和從VxD接收數(shù)據(jù):你傳送輸入/輸出緩沖區(qū)給VxD并且VxD讀取/寫入數(shù)據(jù)到指定的緩沖區(qū)。我們下面看看VxD代碼。VMMCallGet_Sys_VM_HandlemovHandle,ebxassumeebx:ptrcb_smovebp,[ebx+CB_Client_Pointer]當(dāng)一個(gè)VxD接收W32_DeviceIoControl消息,它調(diào)用Get_Sys_VM_Handle得到系統(tǒng)VM的句柄并把它存在一個(gè)叫Handle的變量中。下面將從VM控制塊中提取指向客戶寄存器結(jié)構(gòu)的指針到EBP。movecx,sizeofMIDstcpushesimovesi,OFFSET32MediaIDpushdspopfsVxDCallV86MMGR_Allocate_BufferpopesijcEndImovAllocSize,ecx下面,準(zhǔn)備傳送到V86MMGR_Allocate_Buffer的參數(shù)。我們必須初始化被分配的緩沖區(qū)。我們把MediaID的偏移量送到ESI中,并且把選擇子放在FS中,然后調(diào)用V86MMGR_Allocate_Buffer。你等會(huì)要恢復(fù)指向DIOCParams的指針,所以我們必須通過pushesi和popesi來保護(hù)它。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我們在客戶寄存器結(jié)構(gòu)中準(zhǔn)備參數(shù)值來執(zhí)行int21h的440Dh功能(從代碼66h),得到盤C的媒體ID。我們拷貝edi的值到edx中(edi中有由V86MMGR_Allocate_Buffer分配的內(nèi)存塊的V86地址)。mov[ebp].Client_dx,dxshredx,16mov[ebp].Client_ds,dx調(diào)用了int21h的440Dh功能(從代碼66h)后,在ds:dx中得到一指向一個(gè)MID結(jié)構(gòu)的指針,我們必須把在edx中的
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 商場鋁扣板裝飾合同
- 農(nóng)村土地租賃合同:鄉(xiāng)村賽車場
- 河北省工商局聘用合同指南
- 體育賽事招投標(biāo)及合同管理標(biāo)準(zhǔn)
- 商務(wù)中心辦公室租賃協(xié)議范本
- 2024版高速公路運(yùn)輸合同書
- 藝術(shù)品鑒定師聘任合同證書
- 文化設(shè)施石材施工合同
- 2024租賃物維修與保養(yǎng)服務(wù)合同
- 2024甲方乙方關(guān)于房地產(chǎn)開發(fā)的合同
- 家居保潔課件
- 換電站(充電樁)安全風(fēng)險(xiǎn)告知
- 經(jīng)營性房屋租賃項(xiàng)目投標(biāo)方案(技術(shù)標(biāo))
- 入戶調(diào)查合同范本
- 七年級道法上冊第一學(xué)期期末綜合測試卷(人教版 2024年秋)
- 上海上海市皮膚病醫(yī)院工作人員招聘筆試歷年典型考題及考點(diǎn)附答案解析
- 標(biāo)桿地產(chǎn)五星級酒店精裝修標(biāo)準(zhǔn)
- DZ∕T 0153-2014 物化探工程測量規(guī)范(正式版)
- 商業(yè)空間設(shè)計(jì)(高職環(huán)境藝術(shù)設(shè)計(jì)專業(yè)和室內(nèi)設(shè)計(jì)專業(yè))全套教學(xué)課件
- 廣東省廣州市名校聯(lián)盟重點(diǎn)名校2024屆中考化學(xué)全真模擬試卷含解析
- 大學(xué)校園交通安全現(xiàn)狀調(diào)查分析
評論
0/150
提交評論