



下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
虚拟8086模式的内存管理下边我们用到的V86即指虚拟8086模式。在以前的教程中,你学习了怎样模拟V86中断,但还有一个问题没有解决:在VxD和V86代码之间交换数据。我们将在此学习如何使用V86内存管理器来实现这个功能。在这里下载例子程序理论假如你的VxD和一些V86程序一起运行,如何传送大量数据到V86程序中或从V86程序中传送大量数据迟早是一个大问题。通过寄存器传送大量数据是不现实的。可能你的下一个想法是在ring0中分配一大块内存,并且通过一些寄存器传送其指针到V86程序,使其能访问这些数据。假如你这样做,可能会破坏你的系统,因为V86的地址定位方式需要segment:offset对,而不是线性定位方式。对这个问题,有很多解决的方法。然而,我选择了一个由V86内存管理器提供的一种简便的方法。如你能在你可使用的V86内存范围内找到一个空闲的内存块作为通讯缓冲区,这将解决其中的一个问题。然而,指针传送的问题依然存在。你可以通过V86内存管理器的服务来解决这两个问题。V86内存管理器是为V86应用管理内存的静态VxD。它还为V86应用提供EMS和XMS服务和为其他VxD提供API传送服务。API传送是一个从ring0拷贝数据到V86范围内的缓冲区并且传送V86缓冲区地址到V86代码的过程。V86内存管理器有一个在V86内存范围内的传送缓冲区,其含有VxD拷贝到V86内存范围内的数据,反之亦然。初始的缓冲区是4K。你以调用V86MMGR_Set_Mapping_Info来增加它的大小。现在你知道了传送缓冲区,我们如何拷入或拷出数据呢?这个问题通过调用两个服务来解决:V86MMGR_Allocate_Buffer和V86MMGR_Free_Buffer。V86MMGR_Allocate_Buffer从传送缓冲区分配一块内存并且从ring0拷贝一些数据到分配的V86缓冲区。V86MMGR_Free_Buffer正好相反:它从分配的V86内存块拷贝一些数据到ring0缓冲区并且释放由V86MMGR_Allocate_Buffer分配的内存块。记住,V86在内存管理器象堆栈一样管理被分配的缓冲区。这意味着分配/释放必须按先进后出的规则。所以如你调用了两次V86MMGR_Allocate_Buffer,第一个V86MMGR_Free_Buffer将释放由第二个V86MMGR_Allocate_Buffer调用而分配的缓冲区。我们来看一下V86MMGR_Allocate_Buffer的定义,它是一个基本寄存器传送参数的服务。EBX当前VM的句柄EBP指向当前VM的客户寄存器结构的指针ECX从传送缓冲区分配的字节数CARRYFLAG进位标志位,如你不想从ring0缓冲区拷贝数据到分配的内存块就清零,如你想从ring0缓冲区拷贝数据到分配的内存块就置1FS:ESI指向ring0缓冲区的selector:offset指针,缓冲区中有要被拷贝到被分配的缓冲区中的数据如果进位标志位被清零,则忽略它。假如调用成功,进位标志位被清零并且ECX包含在传送缓冲区中的字节数。这个数值应小于你要求的数值,所以你应保持这个数值,V86MMGR_Free_Buffer待会要用到它。EDI的高字包含被分配的内存块的V86段地址,偏移地址在在低字中。进位标志位当错误发生时被置位。V86MMGR_Free_Buffer和V86MMGR_Allocate_Buffer接受同样的参数。当你调用V86MMGR_Allocate_Buffer时,你在当前VM的V86内存范围内分配了一块内存,并且把其地址放到了EDI中。你可以使用这些服务传送数据到V86中断中或从V86中断中取得数据。在附加的API传送中,V86内存管理器也给其他VxDs提供了API映射服务。API映射服务是映射一些在扩展内存中的页到每个VM的V86内存范围。你可以使用V86MMGR_Map_Pages执行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,没有输入缓冲区,一个指向输出缓冲区的指针及其大小。DiskLable是一个接收由VxD返回的卷标号的缓冲区。BytesReturned变量存有返回的字节数。这个例子说明了怎样传送数据和从VxD接收数据:你传送输入/输出缓冲区给VxD并且VxD读取/写入数据到指定的缓冲区。我们下面看看VxD代码。VMMCallGet_Sys_VM_HandlemovHandle,ebxassumeebx:ptrcb_smovebp,[ebx+CB_Client_Pointer]当一个VxD接收W32_DeviceIoControl消息,它调用Get_Sys_VM_Handle得到系统VM的句柄并把它存在一个叫Handle的变量中。下面将从VM控制块中提取指向客户寄存器结构的指针到EBP。movecx,sizeofMIDstcpushesimovesi,OFFSET32MediaIDpushdspopfsVxDCallV86MMGR_Allocate_BufferpopesijcEndImovAllocSize,ecx下面,准备传送到V86MMGR_Allocate_Buffer的参数。我们必须初始化被分配的缓冲区。我们把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我们在客户寄存器结构中准备参数值来执行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. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 北京市产权交易合同
- 个人名下房产无偿合同
- 2025商业房产预租协议(合同版本)
- 2025商品交易合同(合同版本)
- 尊敬老师的名言(7篇)
- pvc地板胶合同标准文本
- 以风景为话题作文(3篇)
- 保险中合同范例
- 作为甲方合同标准文本
- 写好房产合同标准文本
- 2024年硕士研究生招生考试思想政治理论考试大纲
- DL∕T 5343-2018 110kV~750kV架空输电线路张力架线施工工艺导则
- 2024-2030年中国沉淀法二氧化硅行业市场发展分析及发展趋势与前景研究报告
- 第二单元 音乐故事(二)-《大海与辛巴达的船》教学设计 2023-2024学年人教版初中音乐 九年级上册
- 高考志愿填报的志愿填报专业指导
- 公园维修施工组织设计方案方案
- 2024年互联网法律法规知识考试题库(附答案)
- 商业空间设计(高职环境艺术设计专业和室内设计专业)全套教学课件
- 2024年新疆昌吉英格玛煤电投资有限责任公司招聘笔试参考题库含答案解析
- (高清版)TDT 1013-2013 土地整治项目验收规程
- 2023年-2024年新《管理学原理》考试题库(含答案)
评论
0/150
提交评论