小编Sui*_*hX2的帖子

Delphi - 使用DeviceIoControl传递IOCTL_DISK_GET_LENGTH_INFO来获取闪存介质物理大小(非分区)

好吧,这是其他几个问题的结果.看来我对这些建议做了一些错误,并且在使用建议的API获取媒体大小时,此时出现了错误.我的问题的新手我在物理磁盘级别工作,而不是在分区或文件系统的范围内.

我在做什么

我试图从第一个块到最后一个,启动记录分区空间和所有的闪存卡的大小.虽然我不需要它从卡片中转储信息,但我确实需要动态写作能力.我想能够说,尽管它的尺寸可能是多大,但是距离卡片的末端还有一个标记.有人建议我将IOCTL_DISK_GET_LENGTH_INFO传递给DeviceIoControl,起初我没有结果,但现在我终于从Windows 50收到错误了.

该项目的来源

这是主单元的pastebin代码(Delphi 2009) - http://clutchx2.pastebin.com/iMnq8kSx

这是应用程序源和可执行文件,其中包含一个表单,用于输出正在进行的状态 - http://www.mediafire.com/?js8e6ci8zrjq0de

它可能更容易使用下载,除非你只是在代码中寻找问题.我也会在这里粘贴代码.

unit Main;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TfrmMain = class(TForm)
    edtDrive: TEdit;
    lblDrive: TLabel;
    btnMethod1: TButton;
    btnMethod2: TButton;
    lblSpace: TLabel;
    edtSpace: TEdit;
    lblFail: TLabel;
    edtFail: TEdit;
    lblError: TLabel;
    edtError: TEdit;
    procedure btnMethod1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

  TDiskExtent = record
    DiskNumber: Cardinal;
    StartingOffset: Int64;
    ExtentLength: Int64;
  end;
  DISK_EXTENT = TDiskExtent;
  PDiskExtent = …
Run Code Online (Sandbox Code Playgroud)

delphi pascal

3
推荐指数
1
解决办法
5576
查看次数

Delphi Pascal - 使用SetFilePointerEx和GetFileSizeEx,在读取文件时获取物理媒体的确切大小

我不知道如何使用RTL中没有的任何API.我一直在使用SetFilePointer和GetFileSize将物理磁盘读入缓冲区并将其转储到文件中,这样的循环就可以完成2GB以下闪存卡的工作:

SetFilePointer(PD,0,nil,FILE_BEGIN);
SetLength(Buffer,512);
ReadFile(PD,Buffer[0],512,BytesReturned,nil);
Run Code Online (Sandbox Code Playgroud)

但是,GetFileSize的限制为2GB,SetFilePointer也是如此.我有绝对不知道如何delcare一个外部API,我已经看了RTL和谷歌搜索了很多例子,并没有找到正确的答案.

我试过这个

function GetFileSizeEx(hFile: THandle; lpFileSizeHigh: Pointer): DWORD; 
    external 'kernel32';
Run Code Online (Sandbox Code Playgroud)

并按照建议这样做

function GetFileSizeEx(hFile: THandle; var FileSize: Int64): DWORD;
    stdcall; external 'kernel32';
Run Code Online (Sandbox Code Playgroud)

但是该函数返回0,即使我使用的是有效的磁盘句柄,我已经确认并使用较旧的API转储数据.

我正在使用SetFilePointer跳转每512字节和ReadFile写入缓冲区,反过来我可以使用它来设置我何时使用WriteFile将初始程序加载程序代码或其他内容写入磁盘.我需要能够将文件指针设置超出2gb.

有人可以帮我做外部声明和调用GetFileSizeEx和SetFilePointerEx工作,所以我可以修改我的旧代码,使用4到32GB的闪存卡.

delphi api pascal delphi-2009

2
推荐指数
1
解决办法
3971
查看次数

标签 统计

delphi ×2

pascal ×2

api ×1

delphi-2009 ×1