阅读:1446回复:4
求助:2000直接读盘出错
想了解以下文件系统,于是写程序读一些扇区来看看。
看了网上的一些资料和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,查的是“拒绝访问”。 不知道何解,所以发贴问。 这是我第一次发贴,不知道规矩,望见谅,也不知道说清楚了没。 |
|
沙发#
发布于:2003-11-09 19:10
嗯,把分都给你了
|
|
板凳#
发布于:2003-11-09 19:07
我已经找到问题所在了。Thank you all the same.
|
|
地板#
发布于: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 |
|
|
地下室#
发布于:2003-11-06 08:58
刚开始研究,就受打击,各位大哥帮帮忙啦
|
|