阅读:2235回复:13
一段读MBR的汇编代码,在驱动代码这为什么编译不通过?
一段读磁盘第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 } |
|
|
沙发#
发布于:2003-10-27 11:58
sax是什么类型,要short才可以。如果不是则要强制转换。
mov ax, WORD PTR sax |
|
板凳#
发布于: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; } |
|
|
地板#
发布于:2003-10-27 13:25
修改 mov bx,offset data为
mov bx,WORD PTR offset data 或 mov ebx,offset data |
|
地下室#
发布于:2003-10-27 16:10
修改 mov bx,offset data为 我试了,还是不行,不过少了一个错误,只有: e:\\PolomWUS\\iGuardit\\iGuard!\\sys\\iGuard.c(434) : error C2415: improper operand type 不正确从操作数类型?搞不清楚了。 |
|
|
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 |
|
|
6楼#
发布于:2003-10-27 19:16
定义全局变量unsigned char data[READ_SECTORS*512];
或用lea指令代替mov bx,offset data lea ebx, data |
|
7楼#
发布于:2003-10-27 19:18
to wowocock
这个代码是用CreateFile(\"\\\\\\\\.\\\\C:\")方式处理吧?这总方式能读MBR吗?因为MBR不在C区内啊?不由操作系统管理啊? |
|
|
8楼#
发布于:2003-10-27 19:50
CreateFile(\"\\\\\\\\.\\\\Physicaldriver0\")即可读取MBR
|
|
|
9楼#
发布于:2003-10-28 10:20
CreateFile(\"\\\\\\\\.\\\\Physicaldriver0\")即可读取MBR to wowocock 在驱动代码中能用CreateFile吗? 我试了在代码中用CreateFile,头文件包含winbase.h,但是编译出现了N多错误! 是不是要用IoCreateFile? |
|
|
10楼#
发布于:2003-10-28 10:34
老大,我的代码TASM编译后直接在RING3即可执行,读取MBR的简单东西,RING3足以
|
|
|
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, 如何创建,就是创建这个对象时的名字用什么?? |
|
|
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] |
|
|
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] |
|
|