Как мне использовать CreateFile для доступа к физическому диску? - PullRequest
4 голосов
/ 14 декабря 2011

Я спросил на форуме программирования Lazarus , как открыть физический диск .Я хочу позволить пользователю выбирать физические диски из своей системы, когда они нажимают кнопку «Выбрать диск».Здесь есть несколько примеров переполнения стека, которые похожи, но не совсем совпадают (например, Delphi - Использование DeviceIoControl для передачи IOCTL_DISK_GET_LENGTH_INFO для получения физического размера флэш-носителя (не раздела) ).

Есть много примеров использования C и C ++ CreateFile ( в документации и особенно пример вызова DeviceIoControl), но я не могу найти ни одного для Free Pascal или Delphiи я еще недостаточно хорош, чтобы понять, как это сделать.

Может ли кто-нибудь указать мне направление, которое объясняет это, или, что еще лучше, настоящий пример, написанный на Delphi или Free Pascal?Может кто-нибудь помочь мне понять, как его использовать?

1 Ответ

7 голосов
/ 14 декабря 2011

Ваш пример C имеет следующий код:

/* LPWSTR wszPath */

hDevice = CreateFileW(wszPath,          // drive to open
                      0,                // no access to the drive
                      FILE_SHARE_READ | // share mode
                      FILE_SHARE_WRITE, 
                      NULL,             // default security attributes
                      OPEN_EXISTING,    // disposition
                      0,                // file attributes
                      NULL);            // do not copy file attributes

Преобразование этого вызова функции в Delphi - это всего лишь вопрос изменения синтаксиса:

// wszPath: PWideChar

hDevice := CreateFileW(wszPath,
                       0,
                       FILE_SHARE_READ or
                       FILE_SHARE_WRITE,
                       nil,
                       OPEN_EXISTING,
                       0,
                       0);

То есть используйте :=для присваивания, or для объединения битовых флагов, nil для нулевых указателей и 0 для нулевых файловых дескрипторов.

Функция вызывается так:

#define wszDrive L"\\\\.\\PhysicalDrive0"

DISK_GEOMETRY pdg = { 0 }; // disk drive geometry structure

bResult = GetDriveGeometry (wszDrive, &pdg);

Сновапросто измените синтаксис на Delphi:

const wszDrive = '\\.\PhysicalDrive0';

var pdg: DISK_GEOMETRY;

ZeroMemory(@pdg, SizeOf(pdg));
bResult := GetDriveGeometry(wszDrive, @pdg);

Нетипизированные строковые константы Delphi автоматически относятся к любому типу, который им нужен для контекста, поэтому нам не нужен префикс L, подобный Си.Обратная косая черта не является особенной в Delphi, поэтому их не нужно экранировать.Delphi не позволяет инициализировать локальные переменные в объявлении, поэтому мы используем ZeroMemory, чтобы установить все на ноль.Используйте @ вместо &, чтобы получить указатель на переменную.

...