Друзья, знающие программирование в реальном режиме, знают, что вы можете использовать прерывание INT 13 BIOS для выполнения абсолютного чтения и записи диска, но в среде NT вы не можете использовать прерывание INT 13 для непосредственного чтения и записи жесткого диска. Здесь мы можем использовать CreateFile и установить путь «//./X:», чтобы открыть логический диск и выполнить чтение и запись. X — буква диска.
Прототип функции CreateFile выглядит следующим образом:
HANDLE CreateFile(LPCTSTR lpFileName, DWord dwDesiredaccess, DWORD dwShareMode,LPSECURITY_ATTRIBUTES lpSecurityAttributes, DWORD dwCreationDistribution, DWORD dwFlagsAndAttributes, HANDLE hTemplateFile);
lpFileName: имя файла, который нужно открыть.
dwDesiredAccess: Если это GENERIC_READ, это означает, что разрешен доступ на чтение к устройству; если это GENERIC_WRITE, это означает, что разрешен доступ к устройству на запись (можно использовать в комбинации, если он равен нулю, это означает, что только); разрешено получение информации, относящейся к одному устройству.
dwShareMode: ноль означает отсутствие общего доступа к файлу и/или FILE_SHARE_WRITE означает, что общий доступ к файлу разрешен;
lpSecurityAttributes: указатель на структуру SECURITY_ATTRIBUTES, которая определяет атрибуты безопасности файла.
dwCreationDistribution: метод создания.
dwFlagsAndAttributes: другие атрибуты.
hTemplateFile: если ненулевое значение, указывает дескриптор файла. Новый файл скопирует расширенные атрибуты из этого файла.
Следующий пример компилируется и передается под Windows XP. Функция, которую он реализует, — чтение загрузочного сектора диска C и отображение считанных данных.
Программа ReadDisk;
использует
СисУтилс,
Окна;
вар
Buf: массив [0..511] байтов //буфер данных;
ShowText, TmpStr: строка;
FileHandle: THandle;
ReadCount, я: Кардинал;
начинать
//Открыть диск
FileHandle := CreateFile('//./C:', GENERIC_READ, FILE_SHARE_READ или FILE_SHARE_WRITE,
ноль, OPEN_EXISTING, 0, 0);
если FileHandle = INVALID_HANDLE_VALUE, то
начинать
MessageBox(GetDesktopWindow, «Не удалось открыть диск», «ОШИБКА», MB_OK);
ВыходПроцесс(0);
конец;
//Чтение данных загрузочного сектора
если ReadFile(FileHandle, Buf, 512, ReadCount, ноль), то
начинать
SetLength(ShowText, Длина(Buf) * 3);
//Преобразуем данные в строку
for i := Low(Buf) до High(Buf) do
начинать
TmpStr := Format('%2.2x ', [Buf[i]]);
CopyMemory(@ShowText[i*3+1], @TmpStr[1], 3);
конец;
конец;
MessageBox(GetDesktopWindow, PChar(ShowText), 'Загрузочный сектор', MB_OK);
CloseHandle(FileHandle);
ВыходПроцесс(0);
конец.