PolomWUS
驱动牛犊
驱动牛犊
  • 注册日期2003-06-20
  • 最后登录2005-12-15
  • 粉丝0
  • 关注0
  • 积分1分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:2235回复:13

一段读MBR的汇编代码,在驱动代码这为什么编译不通过?

楼主#
更多 发布于:2003-10-27 11:18
一段读磁盘第1扇区的代码,在DOS没问题,可以我在驱动代码中用的时候编译不通过。
出现下面两个错误:
d:\\WINDDK\\2600\\src\\sys\\sys\\iGuard.c(434) : error C2415: improper operand type
d:\\WINDDK\\2600\\src\\sys\\sys\\iGuard.c(434) : error C2443: operand size conflict
是什么原因啊?
或者给我一个用其他办法读磁盘的MBR扇区的建议?急啊!谢了。


__asm
{
   //;读磁盘扇区
mov     ax,sax               //;AH=2读磁盘,AL=扇区数
mov     bx,offset data       //;缓存偏移地址,缓存段地址由ES确定?
434行=> mov     cx,01            //;CH=磁道号,CL=扇区号
mov     dx,80h            //;DH=磁头号,DL=驱动器号
int     13h
cmp     ah,0
jne     L_ERROR
}
i m a newer~~:D learning... GOOD GOOD STUDY, DAY DAY UP.
luxs200
驱动牛犊
驱动牛犊
  • 注册日期2001-07-23
  • 最后登录2015-03-31
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2003-10-27 11:58
sax是什么类型,要short才可以。如果不是则要强制转换。
mov ax, WORD PTR sax
PolomWUS
驱动牛犊
驱动牛犊
  • 注册日期2003-06-20
  • 最后登录2005-12-15
  • 粉丝0
  • 关注0
  • 积分1分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2003-10-27 12:12
sax是一个unsigned short值

整个函数:

void ReadSectors(void)
{

unsigned char data[READ_SECTORS*512];
unsigned short sax = 0x0200|READ_SECTORS;
__asm
{
   //;读磁盘扇区
mov     ax,sax               //;AH=2读磁盘,AL=扇区数
mov     bx,offset data       //;缓存偏移地址,缓存段地址由ES确定?
mov     cx,01            //;CH=磁道号,CL=扇区号
mov     dx,80h            //;DH=磁头号,DL=驱动器号
int     13h
cmp     ah,0
jne     L_ERROR
}
memcpy(gSectors,data,READ_SECTORS*512);
gReadOk=TRUE;
L_ERROR:

gIsReadOnly = TRUE;
return;
}
i m a newer~~:D learning... GOOD GOOD STUDY, DAY DAY UP.
luxs200
驱动牛犊
驱动牛犊
  • 注册日期2001-07-23
  • 最后登录2015-03-31
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2003-10-27 13:25
修改 mov bx,offset data为
mov bx,WORD PTR offset data

mov ebx,offset data
PolomWUS
驱动牛犊
驱动牛犊
  • 注册日期2003-06-20
  • 最后登录2005-12-15
  • 粉丝0
  • 关注0
  • 积分1分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2003-10-27 16:10
修改 mov bx,offset data为
mov bx,WORD PTR offset data

mov ebx,offset data
 



我试了,还是不行,不过少了一个错误,只有:
e:\\PolomWUS\\iGuardit\\iGuard!\\sys\\iGuard.c(434) : error C2415: improper operand type

不正确从操作数类型?搞不清楚了。
i m a newer~~:D learning... GOOD GOOD STUDY, DAY DAY UP.
wowocock
VIP专家组
VIP专家组
  • 注册日期2002-04-08
  • 最后登录2016-01-09
  • 粉丝16
  • 关注2
  • 积分601分
  • 威望1651点
  • 贡献值1点
  • 好评度1227点
  • 原创分1分
  • 专家分0分
5楼#
发布于:2003-10-27 18:32
;*****************************
;AbsDiskNT.asm             *
;功能:Windows NT中绝对      *
;      磁盘读写     *
;*****************************
.386p
.model flat,stdcall ;平坦内存模式
;外部过程声明
extrn MessageBoxA:proc
extrn ExitProcess:proc
extrn CreateFileA:proc
extrn ReadFile:proc
extrn CloseHandle:proc

;常量定义
NULL  = 0
MB_OK = 0
INVALID_HANDLE_VALUE = -1
GENERIC_READ  = 80000000H
GENERIC_WRITE = 40000000H
FILE_SHARE_READ   = 1
FILE_SHARE_WRITE  = 2
FILE_SHARE_DELETE = 4
OPEN_EXISTING = 3


.data
FileName db \'\\\\.\\C:\',0
align 4 ;双字对齐
readed dd 0
Buffer  db 4096 dup (0)
hFile dd 0

Caption db \'NT中绝对磁盘读写\',0
ErrCreate db \'建文件错!\',0
ErrRead db \'读盘错误!\',0

ShowText db 4096*3 dup (0)
Digit db \'0123456789ABCDEF\'

.code
main:
;建立文件
call CreateFileA,offset FileName,GENERIC_READ,FILE_SHARE_READ OR FILE_SHARE_WRITE,NULL,OPEN_EXISTING,NULL,NULL
mov  [hFile],eax
cmp  eax,INVALID_HANDLE_VALUE
jnz  read
;显示错误信息
call ShowError,offset ErrCreate
read: ;读数据
call ReadFile,eax,offset Buffer,512,offset readed,NULL
cmp  eax,0
jnz  show
;显示错误信息
call ShowError,offset ErrRead
show: ;显示读出的内容
call ShowBuffer
;关闭文件句柄
call CloseHandle ,[hFile]
;退出
call ExitProcess,0

ShowError proc ,MESSAGE:DWORD ;显示出错信息并退出
call MessageBoxA,NULL,MESSAGE,offset Caption,MB_OK
cmp  [hFile],0
jz   endShowErr
call CloseHandle ,[hFile] ;关闭句柄
endShowErr:
call ExitProcess,0 ;退出
ShowError endp

ShowBuffer proc ;显示所读出的信息
;把数据转换成16进制的形式
mov  esi,offset Buffer ;数据
mov  edi,offset ShowText ;转换后的数据
mov  ebx,offset Digit
mov  ecx,0
xor  eax,eax
computeAgain:
cmp  [readed],0
jz   endCompute
dec  [readed]
mov  al,[esi]
push eax
shr  eax,4 ;高4位
mov  al,[ebx+eax]
mov  byte ptr[edi],al
inc  edi
pop  eax
and  eax,0fH ;低4位
mov  al,[ebx+eax]
mov  byte ptr[edi],al
inc  edi
mov  byte ptr[edi],\' \' ;空格
inc  edi
inc  esi
inc  ecx
cmp  ecx,16
jnz  computeAgain
xor  ecx,ecx
mov  byte ptr[edi-1],13 ;回车
jmp  computeAgain

endCompute:
;显示
call MessageBoxA,NULL,offset ShowText,offset Caption,MB_OK
ret
ShowBuffer endp
end main
花开了,然后又会凋零,星星是璀璨的,可那光芒也会消失。在这样 一瞬间,人降生了,笑者,哭着,战斗,伤害,喜悦,悲伤憎恶,爱。一切都只是刹那间的邂逅,而最后都要归入死亡的永眠
luxs200
驱动牛犊
驱动牛犊
  • 注册日期2001-07-23
  • 最后登录2015-03-31
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2003-10-27 19:16
定义全局变量unsigned char data[READ_SECTORS*512];
或用lea指令代替mov bx,offset data
lea ebx, data
PolomWUS
驱动牛犊
驱动牛犊
  • 注册日期2003-06-20
  • 最后登录2005-12-15
  • 粉丝0
  • 关注0
  • 积分1分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2003-10-27 19:18
to wowocock
这个代码是用CreateFile(\"\\\\\\\\.\\\\C:\")方式处理吧?这总方式能读MBR吗?因为MBR不在C区内啊?不由操作系统管理啊?
i m a newer~~:D learning... GOOD GOOD STUDY, DAY DAY UP.
wowocock
VIP专家组
VIP专家组
  • 注册日期2002-04-08
  • 最后登录2016-01-09
  • 粉丝16
  • 关注2
  • 积分601分
  • 威望1651点
  • 贡献值1点
  • 好评度1227点
  • 原创分1分
  • 专家分0分
8楼#
发布于:2003-10-27 19:50
CreateFile(\"\\\\\\\\.\\\\Physicaldriver0\")即可读取MBR
花开了,然后又会凋零,星星是璀璨的,可那光芒也会消失。在这样 一瞬间,人降生了,笑者,哭着,战斗,伤害,喜悦,悲伤憎恶,爱。一切都只是刹那间的邂逅,而最后都要归入死亡的永眠
PolomWUS
驱动牛犊
驱动牛犊
  • 注册日期2003-06-20
  • 最后登录2005-12-15
  • 粉丝0
  • 关注0
  • 积分1分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2003-10-28 10:20
CreateFile(\"\\\\\\\\.\\\\Physicaldriver0\")即可读取MBR



to wowocock
在驱动代码中能用CreateFile吗?
我试了在代码中用CreateFile,头文件包含winbase.h,但是编译出现了N多错误!

是不是要用IoCreateFile?
i m a newer~~:D learning... GOOD GOOD STUDY, DAY DAY UP.
wowocock
VIP专家组
VIP专家组
  • 注册日期2002-04-08
  • 最后登录2016-01-09
  • 粉丝16
  • 关注2
  • 积分601分
  • 威望1651点
  • 贡献值1点
  • 好评度1227点
  • 原创分1分
  • 专家分0分
10楼#
发布于:2003-10-28 10:34
老大,我的代码TASM编译后直接在RING3即可执行,读取MBR的简单东西,RING3足以
花开了,然后又会凋零,星星是璀璨的,可那光芒也会消失。在这样 一瞬间,人降生了,笑者,哭着,战斗,伤害,喜悦,悲伤憎恶,爱。一切都只是刹那间的邂逅,而最后都要归入死亡的永眠
PolomWUS
驱动牛犊
驱动牛犊
  • 注册日期2003-06-20
  • 最后登录2005-12-15
  • 粉丝0
  • 关注0
  • 积分1分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2003-10-28 11:01
老大,我的代码TASM编译后直接在RING3即可执行,读取MBR的简单东西,RING3足以


不是啦,我需要在驱动程序中读MBR等几个扇区。

是不是用IoCreateFile就可以,查理IoCreateFile资料,其中有个参数IN POBJECT_ATTRIBUTES ObjectAttributes,应该给它一个ObjectName这个名字这么给啊?不会像Ring3下用\"\\\\\\\\.\\\\Physicaldrivce\"吧?  帮帮我吧!

另外,刚才查了资料可用HalExamineMBR去读,但是我不知道这个函数使用的参数IN PDEVICE_OBJECT  DeviceObject,
如何创建,就是创建这个对象时的名字用什么??


i m a newer~~:D learning... GOOD GOOD STUDY, DAY DAY UP.
wowocock
VIP专家组
VIP专家组
  • 注册日期2002-04-08
  • 最后登录2016-01-09
  • 粉丝16
  • 关注2
  • 积分601分
  • 威望1651点
  • 贡献值1点
  • 好评度1227点
  • 原创分1分
  • 专家分0分
12楼#
发布于:2003-10-29 21:06
_Ring0Proc PROC ; Ring0 code here..
mov dx,1f6h ;Drive and head port
mov al,0a0h ;Drive 0,Head 0
out dx,al

mov dx,1f2h ;Sector count port
mov al,1 ;Read One Sector
out dx,al

mov dx,1f3h ;Sector number port
mov al,1 ;Read One Sector
out dx,al

mov dx,1f4h ;Cylinder low port
xor al,al ;Cylinder 0
out dx,al

mov dx,1f5h ;Cylinder high port
xor al,al ;The rest of Cylinder 0
out dx,al

mov dx,1f7h ;Command port
mov al,20h ;Read with Entry
out dx,al
Still_going:
in al,dx
test al,8 ;This means the sector buffer requires servcing
jz Still_going;do not continue until the sector buffer is ready
xor ecx,ecx
mov cx,512/2 ;one sector/2
mov edi,offset buffer
mov dx,1f0h ;data port - data comes in and out here
cli
cld
rep insw
sti
ret
_Ring0Proc ENDP

在你的驱动中执行这段代码就可以BUFFER中获得MBR了。


[编辑 -  10/29/03 by  wowocock]
花开了,然后又会凋零,星星是璀璨的,可那光芒也会消失。在这样 一瞬间,人降生了,笑者,哭着,战斗,伤害,喜悦,悲伤憎恶,爱。一切都只是刹那间的邂逅,而最后都要归入死亡的永眠
PolomWUS
驱动牛犊
驱动牛犊
  • 注册日期2003-06-20
  • 最后登录2005-12-15
  • 粉丝0
  • 关注0
  • 积分1分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
13楼#
发布于:2003-11-02 18:49
谢谢wowocock,
我在2k/xp下用ZwOpenFile、ZwReadFile实现了,

但是我在98下用V86虚拟机进入V86模式调用Int13中断时有问题,就是线性地址转换到V86地址时出现了问题,已经另开一个帖子:

http://www.driverdevelop.com/forum/html_54189.html?1067771493

您上面的代码我现在还看不明白,我回头研究一把,这个单先埋了吧。




[编辑 -  11/2/03 by  PolomWUS]
i m a newer~~:D learning... GOOD GOOD STUDY, DAY DAY UP.
游客

返回顶部