好吧,这是其他几个问题的结果.看来我对这些建议做了一些错误,并且在使用建议的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) 我不知道如何使用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的闪存卡.