阅读:755回复:0
大伙儿帮我看看这段代码有什么问题DWORD OnW32Deviceiocontrol(PIOCTLPARAMS p) { VMHANDLE hVM; CLIENT_STRUCT saveregs; CLIENT_STRUCT* m_regs = p-> dioc_pcrs; DWORD PageNum; WORD PageOff; DWORD Address; DWORD V86PageNum,MyPage; WORD seg,offset; hVM= Get_Cur_VM_Handle(); switch(p->dioc_IOCtlCode) { case DIOC_OPEN : case DIOC_CLOSEHANDLE : return DEVIOCTL_NOERROR ; case 2: //从物理硬盘0磁头0磁道1扇区读入一扇区 Save_Client_State(&saveregs); //输入的参数,具体怎么用看INT13的说明吧 m_regs->CBRS.Client_AH = 2; m_regs->CBRS.Client_AL = 1; m_regs->CBRS.Client_CH = 0; m_regs->CBRS.Client_CL = 1; m_regs->CBRS.Client_DH = 0; m_regs->CBRS.Client_DL = 0x80; PageNum=((DWORD)p->dioc_InBuf)>>12; PageOff=((DWORD)p->dioc_InBuf)&0xfff; LinMapIntoV86(PageNum,hVM,0x10,1,0,&MyPage); Address=(MyPage<<12)+PageOff; //计算新的线性地址 seg=LOWORD(Address>>4); //把线性地址转化成传统的段:偏 offset=LOWORD(Address-(seg<<4)); //移量的形式 m_regs->CRS.Client_Alt_ES=seg; //这里一定不能弄错了,在Win32 Ring3程序中用的 //是_ClientES,而虚拟86方式下用的段寄存器则在 //_ClientAltES中,所以要用它 m_regs->CWRS.Client_BX=offset; Begin_Nest_V86_Exec(); //这一句使得系统转入虚拟86方式 Exec_Int(0x13); //发出int 13h中断调用 End_Nest_Exec(); //退出虚拟86方式 // *(p->dioc_bytesret) = m_regs->CBRS.Client_AH; Restore_Client_State(&saveregs); MapIntoV86(GetNulPageHandle(),hVM,0x10,1,0,0); //OK return DEVIOCTL_NOERROR ; } return 0; } 说明:这段代码是用VtoolsD生成的VXD框架(C版)修改而来,用来把硬盘第一逻辑扇区读出至p->dioc_InBuf指向的缓冲区。调试时发现在98下可以读出数据,但会使系统挂起或蓝屏 , 谁能告诉我问题出在哪里 |
|