📄 diskop.pas
字号:
unit diskop;
interface
uses
SysUtils, Windows,JwaWinIoctl;
function logicdiskread(diskname: Pansichar; //磁盘扇区读取驱动盘或文件名称
SectorStart: integer; //起始扇区数
SectorCount: integer; //读写扇区数
BytesPerSector: integer; //扇区大小
var P): integer;
// function logicdiskwrite(diskname: Pansichar; //磁盘扇区写入驱动盘或文件名称
// SectorStart: integer; //起始扇区数
// SectorCount: integer; //读写扇区数
// BytesPerSector: integer; //扇区大小
// var P): integer;
function GetVolumeInfo(DriverLetter: PChar): TDiskExtent;
function GetDiskGeometry(Drive: pchar): TDiskGeometryEX; // int64;
implementation
function logicdiskread(diskname: Pansichar; //驱动盘或文件名称
SectorStart: integer; //起始扇区数
SectorCount: integer; //读写扇区数
BytesPerSector: integer; //扇区大小
var P): integer; //存储地址
// 使用完后需要释放内存
var
Hdiskhandle: THandle;
begin
Hdiskhandle := CreateFile(diskname,
GENERIC_ALL,
FILE_SHARE_READ ,
nil,
OPEN_EXISTING,
0,
0
);
if (Hdiskhandle <> INVALID_HANDLE_VALUE) then
begin
FileSeek(Hdiskhandle, SectorStart * BytesPerSector, 0); //起始扇区
if FileRead(Hdiskhandle, p, SectorCount * BytesperSector) <> //读扇区
SectorCount * BytesperSector then
raise Exception.Create('Read Error!');
Closehandle(Hdiskhandle);
result := 1;
end
else result := 0;
end;
//获取磁盘信息
function GetVolumeInfo(DriverLetter: PChar): TDiskExtent;
var
hVolume: THandle;
DiskExtents: PVolumeDiskExtents;
dwOutBytes: Cardinal;
lasterrcode :integer;
begin
with Result do
begin
DiskNumber := $FF;
StartingOffset.QuadPart := 0;
ExtentLength.QuadPart := 0;
end;
hVolume := CreateFile(PChar('\\.\' + DriverLetter), GENERIC_READ ,
FILE_SHARE_READ, nil, OPEN_EXISTING, 0, 0);
if hVolume = INVALID_HANDLE_VALUE then
begin
MessageBox(0, pchar(SysErrorMessage(GetLastError)),'createfile 错误号' ,MB_OK);
CloseHandle(hVolume);
Exit;
end;
// MessageBox(0, pchar(SysErrorMessage(GetLastError)),'createfile 错误号' ,MB_OK);
DiskExtents := AllocMem(Max_Path);
if DeviceIoControl(hVolume,
IOCTL_VOLUME_GET_VOLUME_DISK_EXTENTS,
nil, 0,
DiskExtents, Max_Path,
dwOutBytes, nil) then
begin
if DiskExtents^.NumberOfDiskExtents > 0 then
Result := DiskExtents^.Extents[0];
end else
MessageBox(0, pchar(SysErrorMessage(GetLastError)),' 错误号' ,MB_OK);
FreeMem(DiskExtents);
CloseHandle(hVolume);
end;
function GetDiskGeometry(Drive: pchar): TDiskGeometryEX; // int64;
var
hDisk: THandle;
Geometry: DISK_GEOMETRY_EX;
Returned: DWORD;
begin
//Result := -1;
hDisk := CreateFile((Drive), GENERIC_READ,
FILE_SHARE_READ, nil, OPEN_EXISTING, FILE_FLAG_SEQUENTIAL_SCAN, 0);
// Geometry.Cylinders:= _large_integer( 0);
Geometry.Geometry.TracksPerCylinder:=0;
Geometry. Geometry.SectorsPerTrack:=0;
Geometry.Geometry.BytesPerSector:=0;
if hDisk <> INVALID_HANDLE_VALUE then
begin
FillChar(Geometry, Sizeof(Geometry), 0);
if DeviceIoControl(hDisk, IOCTL_DISK_GET_DRIVE_GEOMETRY_ex, nil, 0, @Geometry,
sizeof(Geometry), Returned, nil) then
// with Geometry do
result := Geometry;
// Result := Int64(Cylinders) * Longint(TracksPerCylinder) * Longint(SectorsPerTrack) * Longint(BytesPerSector);
CloseHandle(hDisk);
end;
end;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -