DELPHI下如何读取磁盘扇区???

zz791224 2004-05-05 11:51:40
在DELPHI下如何读取磁盘扇区?求高手解释一下,最好有一个例子,谢谢了???
...全文
108 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
ly_liuyang 2004-05-06
  • 打赏
  • 举报
回复
NT/2000/XP下通过DeviceIOControl的API可以实现
以VC版的最多见,Delphi的少见,但都可以的
pankun 2004-05-06
  • 打赏
  • 举报
回复
参考如下文章。

了解实模式编程的朋友都知道,可以利用BIOS的INT 13中断来进行磁盘的绝对读写,但在NT环境下,却不能使用INT 13中断来直接读写硬盘.在这里,我们可以利用CreateFile并将路径名设为"\\.\X:"来打开逻辑盘,并进行读写.在进里X为盘符.

CreateFile函数原型如下:
HANDLE CreateFile(LPCTSTR lpFileName, DWORD dwDesiredAccess, DWORD dwShareMode, LPSECURITY_ATTRIBUTES lpSecurityAttributes, DWORD dwCreationDistribution, DWORD dwFlagsAndAttributes, HANDLE hTemplateFile);
lpFileName: 要打开的文件的名字
dwDesiredAccess: 如果为 GENERIC_READ 表示允许对设备进行读访问;如果为 GENERIC_WRITE 表示允许对设备进行写访问(可组合使用);如果为零,表示只允许获取与一个设备有关的信息.
dwShareMode: 零表示不共享; FILE_SHARE_READ 和/或 FILE_SHARE_WRITE 表示允许对文件进行共享访问
lpSecurityAttributes: 指向一个SECURITY_ATTRIBUTES结构的指针,定义了文件的安全特性
dwCreationDistribution: 建立方式
dwFlagsAndAttributes: 其它属性
hTemplateFile: 如果不为零,则指定一个文件句柄。新文件将从这个文件中复制扩展属性


下面的例子在Windows XP下编译通过, 其实现的功能为读取C盘的引导扇区,并将读出的数据显示出来.

program ReadDisk;


uses
SysUtils,
Windows;

var
Buf: array [0..511] of Byte; //数据缓冲区
ShowText, TmpStr: string;
FileHandle: THandle;
ReadCount, i: Cardinal;
begin
//打开磁盘
FileHandle := CreateFile('\\.\C:', GENERIC_READ, FILE_SHARE_READ or FILE_SHARE_WRITE,
nil, OPEN_EXISTING, 0, 0);
if FileHandle = INVALID_HANDLE_VALUE then
begin
MessageBox(GetDesktopWindow, '打开磁盘失败', 'ERROR', MB_OK);
ExitProcess(0);
end;
//读出引导扇区数据
if ReadFile(FileHandle, Buf, 512, ReadCount, nil) then
begin
SetLength(ShowText, Length(Buf) * 3);
//将数据转为字串
for i := Low(Buf) to High(Buf) do
begin
TmpStr := Format('%2.2x ', [Buf[i]]);
CopyMemory(@ShowText[i*3+1], @TmpStr[1], 3);
end;
end;
MessageBox(GetDesktopWindow, PChar(ShowText), '引导扇区', MB_OK);
CloseHandle(FileHandle);
ExitProcess(0);
end.

Delphi基于Ring0技术读写Windows系统下的硬盘物理扇区磁盘读写操作一例,包括了VxD和仿CIH两种方法,VxD方法中还包括了所调用控件的VC 源代码,并且包括了一个测试的例子,运行效果如演示截图所示。相关的源代码分享如下:   IOR_next:longword;{ 为BCB的(MBZ for IORF_VERSION_002) 的客户链接 }   IOR_func:word;{子功能号}   IOR_status:word;{请求的状态}   IOR_flags:longword;{请求控制标志}   IOR_callback:procedure;{如果IORF_SYNC_COMMAND未设置,则为回调函数地址}   IOR_start_addr:array[0..1]of longword;{相对开始地址}   IOR_xfer_count:longword;{处理的扇区数}   IOR_buffer_ptr:longword;{客户缓冲区指针}   IOR_private_client:longword;{ BlockDev/IOS客户保留}   IOR_private_IOS:longword;{IOS保留空间}   IOR_private_port:longword;{端口驱动的私有区域}   _ureq:Turequestor_usage;   IOR_req_req_handle:longword;{请求句柄}   IOR_req_vol_handle:longword;{媒体句柄,指向VRP结构}   IOR_sgd_lin_phys:longword;{指向第一个物理SGD }   IOR_num_sgds:byte;{物理SGD的数目}   IOR_vol_designtr:byte;{视子功能号的不同,可能是以下两种情况:(1)A盘为0,B盘为1,C盘为2……(2)软盘是0-7F,硬盘是80-FF}   IOR_ios_private_1:word;{由IOS保留强制对齐}   IOR_reserved_2:array[0..1]of longword; {保留,内部使用}

1,183

社区成员

发帖
与我相关
我的任务
社区描述
Delphi Windows SDK/API
社区管理员
  • Windows SDK/API社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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