|
Вопрос # 196/ вопрос открыт / |
|
Здраствуйте.
Задача заключается в следующем. Необходимо организовать авторизованный доступ к дискете.Т.е.,если в привод вставлена незапароленная дискета то предлагается ввести логин и пароль, после чего находится хеш-функция этого пароля и он записывается в 8 байт boot-сектора. Если дискета запароленная, то доступ к ней можно получить только после ввода верного пароля.
Так вот меня интересует, как при помощи WinAPI сделать запись на дискету и производить считывание с нее. По возможности прошу дать ссылки. Взаранее спасибо.
 |
Вопрос задал: Князев А.А. (статус: Посетитель)
Вопрос отправлен: 14 декабря 2006, 16:23
Состояние вопроса: открыт, ответов: 2.
|
Ответ #1. Отвечает эксперт: Alexander A. Gribanov
1) Получаем прямой доступ к устройству с помощью CreateFile() (В качестве имени подставляем, например, '\\.\A:')
2) С помощью DeviceIOControl() запрашиваем информацию о геометрии устройства (IOCTL_DISK_GET_DRIVE_GEOMETRY) и убеждаемся, что это действительно дискета. Заодно получаем информацию о размере сектора.
3) Читаем/пишем с помощью ReadFile()/WriteFile()
Самая полезная ссылка на эту тему http://msdn.microsoft.com/
Ответ #2. Отвечает эксперт: Матвеев Игорь Владимирович
Здравствуйте, Князев А.А.!
Alexander A. Gribanov совершенно прав.
Вот еще пример получения информации о геометрии. На С++, но портировать на Delphi совсем просто - главное принцип.
Приложение: Переключить в обычный режим- /* The code of interest is in the subroutine GetDriveGeometry. The
- code in main shows how to interpret the results of the IOCTL call. */
-
- #include <windows.h>
- #include <winioctl.h>
- #include <stdio.h>
-
- BOOL GetDriveGeometry(DISK_GEOMETRY *pdg)
- {
- HANDLE hDevice; // handle to the drive to be examined
- BOOL bResult; // results flag
- DWORD junk; // discard results
-
- hDevice = CreateFile("\\.\PhysicalDrive0", // 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
-
- if (hDevice == INVALID_HANDLE_VALUE) // cannot open the drive
- {
- return (FALSE);
- }
-
- bResult = DeviceIoControl(hDevice, // device to be queried
- IOCTL_DISK_GET_DRIVE_GEOMETRY, // operation to perform
- NULL, 0, // no input buffer
- pdg, sizeof(*pdg), // output buffer
- &junk, // # bytes returned
- (LPOVERLAPPED) NULL); // synchronous I/O
-
- CloseHandle(hDevice);
-
- return (bResult);
- }
-
- int main(int argc, char *argv[])
- {
- DISK_GEOMETRY pdg; // disk drive geometry structure
- BOOL bResult; // generic results flag
- ULONGLONG DiskSize; // size of the drive, in bytes
-
- bResult = GetDriveGeometry (&pdg);
-
- if (bResult)
- {
- printf("Cylinders = %I64dn", pdg.Cylinders);
- printf("Tracks per cylinder = %ldn", (ULONG) pdg.TracksPerCylinder);
- printf("Sectors per track = %ldn", (ULONG) pdg.SectorsPerTrack);
- printf("Bytes per sector = %ldn", (ULONG) pdg.BytesPerSector);
-
- DiskSize = pdg.Cylinders.QuadPart * (ULONG)pdg.TracksPerCylinder *
- (ULONG)pdg.SectorsPerTrack * (ULONG)pdg.BytesPerSector;
- printf("Disk size = %I64d (Bytes) = %I64d (Gb)n", DiskSize,
- DiskSize / (1024 * 1024 * 1024));
- }
- else
- {
- printf ("GetDriveGeometry failed. Error %ld.n", GetLastError ());
- }
-
- return ((int)bResult);
- }
 |
Ответ отправил: Матвеев Игорь Владимирович (статус: Студент)
Время отправки: 14 декабря 2006, 23:51
Оценка за ответ: 5
Комментарий к оценке: Спасибо большое.
|
Мини-форум вопроса
Мини-форум пуст.
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|