关于VXD 方面的问题?????

hk318 2000-05-20 08:35:00
各位软件高手:
小弟在开发一个VXD时,(使用VToolsD for 95/98)
在myDevice类中自定义一个函数
bool ReadDiskSector(LPSTR buffer)//读软盘物理第1扇区 到 buffer 中
在其中使用中断函数 int 13h
{
DWORD mm_buf=(DWORD)buffer;
__asm{
mov eax,201h
mov ebx,mm_buf
mov cx,0001h
mov dx,0000h
int 13h
}
.
.
.
}
但一执行中断就蓝屏,报告错误。 本人百思不得其解????!!!
不是说在Ring0级下的Vxd 文件中可以使用任意低级操作吗?(难道不包括int 13h??)
还望行家指点!!
另:关于传入的buffer参数,是在Win32程序中申请的内存缓冲(use new )
是否可以直接传给 Ebx 寄存器? 还是要做变动?( in Vxd )
因为:
used "C " in DOS mode
{
resg.x.ax=0x0201; /* 02 for Read, 03 for Write ,05 for Format */
reg.x.bx=FP_OFF(buffer);
reg.x.cx=0x0001 /* for boot sector */
reg.x.dx=0 ; /* for drive A *
sreg.es=FP_SEG(buffer);
int86x(0x13,®,®,&sreg);
}
...全文
93 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
shak 2001-09-01
  • 打赏
  • 举报
回复
我帮你推上去
DingBoy 2000-05-21
  • 打赏
  • 举报
回复
哈哈~~~~~~Ring0级别的int可不是这样用的!

--------------------------------------------------------------------
windows9x下绝对读写硬盘扇区的例程
由于win9x下由win32程序对硬盘的写操作被屏蔽,所以绝对硬盘的读写的思路在于
设法转入16位程序,因此有两种方法可以达到这种目的:使用THUNK机制调用16位DLL
或用VxD转到16位方式,我觉得用THUNK太麻烦,其实VxD挺好编的,而且用起来也方便,
当时也是出于学习目的,编了这么一个VxD,还是挺好用的,我看精华区对这个问题的讨
论好像没有什么结果,就把它贴出来,算是班门弄斧吧!
我是用DDK编的,主要是因为我当时是出于学习.

//这是程序的主要部分,其中有一些宏定义,从字面上就能知道是干什么的,我就不罗嗦
//了
DWORD _stdcall CVXD_W32_DeviceIOControl(LPDIOC lpDIOCParms,
CLIENT_STRUCT *pRegs)
{
DWORD dwRetVal = 0,retu;
DWORD *i;
PVMMCB hVM;
DIOC_REGISTERS *lpReg,*lpOutReg;
CLIENT_STRUCT saveregs;
DWORD PageNum;
WORD PageOff;
DWORD Address;
DWORD V86PageNum,MyPage;
WORD seg,offset;

hVM=Get_Cur_VM_Handle();
i=(DWORD *)(lpDIOCParms->lpvOutBuffer);
lpReg=(DIOC_REGISTERS *)(lpDIOCParms->lpvInBuffer);
lpOutReg=(DIOC_REGISTERS *)(lpDIOCParms->lpvOutBuffer);
switch(lpDIOCParms->dwIoControlCode)
{
.
.
.
case 2:
if(lpDIOCParms->cbInBuffer!=sizeof(DIOC_REGISTERS))
return dwRetVal=-1;

//保存当前虚拟机的寄存器状态
_asm push edi
_asm lea edi,saveregs
VMMCall(Save_Client_State);
_asm pop edi

//输入的参数,具体怎么用看INT13的说明吧
_ClientEAX=lpReg->reg_EAX;
_ClientEDX=lpReg->reg_EDX;
_ClientECX=lpReg->reg_ECX;
_ClientEFlags=lpReg->reg_Flags;

/* 以下这一段是编写这个VxD时要考虑的主要问题:把缓冲区的地址映射入虚拟86的地址
区,Win32中用的都是线性地址,先根据它求出页面号,再把缓冲区所在的页映射到虚拟86区
中去,下面程序中有一个Bug,它没有考虑到缓冲区所占页面大于一页时的情形,事实上,缓
冲区可能处在叶面的边界上,而且它的大小可能超过一页,这些都要根据上面参数中给出
的缓冲区大小计算,当时我嫌麻烦,随便应付了一下.用的时候要把这段代码改一下
*/
PageNum=(lpReg->reg_EBX)>>12;
PageOff=(lpReg->reg_EBX)&0xfff;
_asm{
push 0
push 1
push 10
push hVM
push PageNum
}
VMMCall(_LinMapIntoV86);
_asm add esp,14h
_asm mov retu,eax
_asm mov MyPage,edx //返回的页面号在edx寄存器中
if(retu==0) return 3;//这是我自己胡乱选的错误码,你可以自己定成
//其它值
Address=(MyPage<<12)+PageOff;//计算新的线性地址
seg=LOWORD(Address>>4); //把线性地址转化成传统的段:偏
offset=LOWORD(Address-(seg<<4)); //移量的形式
_ClientAltES=seg;//这里一定不能弄错了,在Win32 Ring3程序中用的
//是_ClientES,而虚拟86方式下用的段寄存器则在
//_ClientAltES中,所以要用它
_ClientBX=offset;

//xixi,好戏开始了
VMMCall(Begin_Nest_V86_Exec);//这一句使得系统转入虚拟86方式
_asm mov eax,13h
VMMCall(Exec_Int);//发出int 13h中断调用
//保存返回值
if(lpDIOCParms->cbOutBuffer==sizeof(DIOC_REGISTERS))
{
lpOutReg->reg_Flags=_ClientEFlags;
lpOutReg->reg_EAX=_ClientEAX;
lpOutReg->reg_EBX=_ClientEBX;
lpOutReg->reg_ECX=_ClientECX;
lpOutReg->reg_EDX=_ClientEDX;
}
End_Nest_Exec();//退出虚拟86方式

//轻轻地我走了,正如我轻轻地来,我挥一挥衣袖,不带走一片云彩
_asm push esi
_asm lea esi,saveregs
VMMCall(Restore_Client_State);
_asm pop esi
//这一段取消原来的映射
VMMCall(_GetNulPageHandle);
_asm mov PageNum,eax
_asm{
push 0
push 0
push 1
push 10
push hVM
push PageNum
}
VMMCall(_MapIntoV86);
_asm add esp,18h

//OK
return dwRetVal=0;
}
return dwRetVal;
}

1.VB是什么? VB是visual Basic的简称,即初学者通用符号代码,是很容易入门的语言,从BASIC发展而来。 2.学VB有什么用? VB是一门编程语言,所以能用VB做的很多很多,基本上除了底层开发(系统软件),VB都能做,而且在数据库应用方面VB也有他独到的一面。 3.如何学好VB(请详细说明) 这不是一句两句可以说清楚的。给你一个学习的过程: 3.1.入门,这段时间你应该学会VB的基本语法,基本语句和基本控件等。能够写一些简单的计算程序就算可以乐。比如写一个解1元2次方程的程序,写一个求解两数的最新公约数的程序等等。 3.2.开始做VB界面的一些东西,了解控件,窗体的使用,事件,方法、过程和函数等。 3.3 开始用类设计VB程序。封装一个VB类。学会VB中类的使用方法。 3.4 学习使用API增强程序的功能。 3.5 这是转入学习C语言,不一定要很强,能懂一些语法就行,当然能够深入的话,就可以转C++乐。 3.6 有乐C的基础,就可以去学习数据结构乐。数据结构很重要,一定要学好。 3.7 开始在VB里面尝试实现数据结构,比如做一个链表,vb没有指针,所以不能向c那样做链表,但我想这时候你应该知道怎么做乐。 3.8 开始尝试做游戏,做不同的程序,做自己想做的东西。 3.9 深入VB。 VB到了这个阶段,深入是很困难的了。需要API的帮助。做一些窗口回调,挂钩等程序。 4.0 你已经有相当的VB经验了,这时候要确定一个方向了,比如游戏编程directx,比如大数据量的数学计算,人工智能等等。。。 4.1 等等等 5.VB可以作什么程序? VB能做的太多了,除不不能开发ddk程序,不能开发sys,vxd其他的基本都能做。(呵呵,开发OS肯定不行了。) ,而用VB做个图书管理系统,医院管理系统等做毕业设计,是再快速和简便不过的了,功能也可以做的非常强大,现在好多流行软件也用VB开发。当然Delphi也很好使。
EPSW98集成版 【 WKPE KEYPRO 模擬器 v1.7 for WIN95 】 徐英超 ┌────┐ │聲明啟事│ └────┘ 本軟體的開發僅希望使用原版軟體者 ,不必再受到 KeyPro 的摧殘 ,讓您不必受 到拔、插、帶來帶去、遺失之苦。作者僅允許您為了自己使用原版軟體的方便 ,而使 用本軟體去欺騙它 ,禁止使用於其它非法環境。其它權利作者保留。 如何與作者連絡: e-mail : jack@ms1.hinet.net 軟蛀 email : werongho@home.90.net.tw Homepage : http://www.90.net.tw/~softbug/ ------------------------------------------------------------------------- ┌────┐ │最新狀況│ └────┘ V1.7 **新的模擬引擎 修正 WKPE 退出後會當機的 BUG 修正 WKPE 退出後,使用 DEBUG 會當機的 BUG 從 V1.5 到 V1.7 相隔了一段時間,WKPE 的受歡迎是我始料未 及的,到現在成為各廠商注目的目標,心裡真是五味雜陳,原 本打算 WKPE 到 V1.5就壽終正寢的,最大的原因是覺得 WKPE 的能力能可再加強的地方有限,也想不出更好的模擬方法了,1.7 版是全新的模擬引擎,當初覺得不夠力而把它樹之高閣,最近 則在撰寫 WKPE 文件時無意中發現了它的 BUG ,因此,讓它重 見天日,當成是各位支持者的另一個選擇,目前,WKPE 在廠商 的全力防堵下,能做的事有限,好消息是,V2.0 版已在動工中    ,我將把兩種功能結合在一起,未來,只要是使用 VxD 動作的    程式,將無法逃過 WKPE 的監視和模擬,而且我目前還想不出有 方法可以來防治,不像 V1.5,早在推出之前,就知道它的漏洞了,    V2.0 推出時間仍然未定.... PS.聽說 NT 5.0 可 RUN WKPE V1.5 **支援所有 KEYPRO 的攔截, 攔截能力 100% 正式宣布, WKPE 進入 586 的時代, 從這一版本開始 , 只能在 586 的機器上跑 , 486 的用戶請使用 V1.2 , 實際上 V1.2 的攔截能力已經很強了,接近 100% , 為了顧及 486 的 USER , 若是未來的改版改進的是模擬核心(跟模擬成功率有關) 我會連 V1.2 一起改進. 這一版本的推出, 我心裡有很大的感慨, 原先寫 WKPE 是為了 學習的目的, 當時想 WKPE 的攔截能力頂多達到一般程度, 面 對市場上眾多的 VxD 型式的 KEYPRO , 應該是無能為力了, 不僅我這麼想, 軟蛀兄這麼想, 我想 KEYPRO 廠商也是一樣的 想法, 但是在我和軟蛀兄的腦力激逿下, 試過無數次的方法, WKPE 一直突破, 從原來不可攔 VxD 到可攔部份 VxD, 到可攔 大部份 VxD , 現在的 V1.5 更是達到了 100%的攔截能力,只能 說 WKPE 的能力已經超越了我的理想. 當然, WKPE 還是有不足的地方, 模擬核心從 0.98 以後就一直沒 動過, 這一方面其實才是最困難的地方, 目前我只能這麼說, 如果您有遇過攔得到資料卻無法模擬的情形, 絕大部份是資料的 問題, 透過 WKPE 來最佳化有它的限制, 約可使 80% 的 KEYPRO 可用, 其它的就必須用手工的方式用人腦來最佳化, 目前我還在 跟軟蛀兄學習最佳化的方法, 如果可行的話, 我會將我所學加入

13,825

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧