ntu
ntu
驱动牛犊
驱动牛犊
  • 注册日期2002-01-25
  • 最后登录2002-02-05
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:756回复:0

大伙儿帮我看看这段代码有什么问题

楼主#
更多 发布于:2002-01-29 14:42

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下可以读出数据,但会使系统挂起或蓝屏 , 谁能告诉我问题出在哪里
  
游客

返回顶部