⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 diskop.pas

📁 siemens PLC Prodave 通讯测试
💻 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 + -