denghaijie
驱动牛犊
驱动牛犊
  • 注册日期2003-01-04
  • 最后登录2010-09-14
  • 粉丝0
  • 关注0
  • 积分7分
  • 威望2点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1446回复:4

求助:2000直接读盘出错

楼主#
更多 发布于:2003-11-02 14:05
想了解以下文件系统,于是写程序读一些扇区来看看。
看了网上的一些资料和msdn,说先CreateFile打开,再ReadFile就可读扇区,不知道对不对,写完程序通不过。

hd=CreateFile(\"\\\\\\\\.\\\\PHYSICALDRIVE0\",0,FILE_SHARE_READ |FILE_SHARE_WRITE,0,OPEN_EXISTING,0,NULL);
返回结果ok,而且
DeviceIoControl(hd,IOCTL_DISK_GET_DRIVE_GEOMETRY,NULL,0,&dg,sizeof(DISK_GEOMETRY),&bret,NULL)
得到的硬盘参数是正确的。可是以下几个都出错了:
DeviceIoControl(hd,IOCTL_DISK_GET_PARTITION_INFO,NULL,0,&pi,sizeof(PARTITION_INFORMATION),&bret,NULL)
SetFilePointer(hd,offset.LowPart,&offset.HighPart,FILE_BEGIN);
ReadFile(hd,outbuf,1024*64,&bret,0)
通过GetLastError得到的Error Code 为5,查的是“拒绝访问”。
不知道何解,所以发贴问。

这是我第一次发贴,不知道规矩,望见谅,也不知道说清楚了没。
denghaijie
驱动牛犊
驱动牛犊
  • 注册日期2003-01-04
  • 最后登录2010-09-14
  • 粉丝0
  • 关注0
  • 积分7分
  • 威望2点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2003-11-09 19:10
嗯,把分都给你了
denghaijie
驱动牛犊
驱动牛犊
  • 注册日期2003-01-04
  • 最后登录2010-09-14
  • 粉丝0
  • 关注0
  • 积分7分
  • 威望2点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2003-11-09 19:07
我已经找到问题所在了。Thank you all the same.
wowocock
VIP专家组
VIP专家组
  • 注册日期2002-04-08
  • 最后登录2016-01-09
  • 粉丝16
  • 关注2
  • 积分601分
  • 威望1651点
  • 贡献值1点
  • 好评度1227点
  • 原创分1分
  • 专家分0分
地板#
发布于:2003-11-06 16:29
;*****************************
;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;dbr
    ;FileName db \'\\\\.\\PHYSICALDRIVE0,0 ;mbr

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
花开了,然后又会凋零,星星是璀璨的,可那光芒也会消失。在这样 一瞬间,人降生了,笑者,哭着,战斗,伤害,喜悦,悲伤憎恶,爱。一切都只是刹那间的邂逅,而最后都要归入死亡的永眠
denghaijie
驱动牛犊
驱动牛犊
  • 注册日期2003-01-04
  • 最后登录2010-09-14
  • 粉丝0
  • 关注0
  • 积分7分
  • 威望2点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2003-11-06 08:58
刚开始研究,就受打击,各位大哥帮帮忙啦
游客

返回顶部