Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 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/

Ответ отправил: Alexander A. Gribanov (статус: 2-ой класс)
Время отправки: 14 декабря 2006, 16:51

Ответ #2. Отвечает эксперт: Матвеев Игорь Владимирович

Здравствуйте, Князев А.А.!
Alexander A. Gribanov совершенно прав.
Вот еще пример получения информации о геометрии. На С++, но портировать на Delphi совсем просто - главное принцип.

Приложение:
  1. /* The code of interest is in the subroutine GetDriveGeometry. The
  2. code in main shows how to interpret the results of the IOCTL call. */
  3.  
  4. #include <windows.h>
  5. #include <winioctl.h>
  6. #include <stdio.h>
  7.  
  8. BOOL GetDriveGeometry(DISK_GEOMETRY *pdg)
  9. {
  10. HANDLE hDevice; // handle to the drive to be examined
  11. BOOL bResult; // results flag
  12. DWORD junk; // discard results
  13.  
  14. hDevice = CreateFile("\\.\PhysicalDrive0", // drive to open
  15. 0, // no access to the drive
  16. FILE_SHARE_READ | // share mode
  17. FILE_SHARE_WRITE,
  18. NULL, // default security attributes
  19. OPEN_EXISTING, // disposition
  20. 0, // file attributes
  21. NULL); // do not copy file attributes
  22.  
  23. if (hDevice == INVALID_HANDLE_VALUE) // cannot open the drive
  24. {
  25. return (FALSE);
  26. }
  27.  
  28. bResult = DeviceIoControl(hDevice, // device to be queried
  29. IOCTL_DISK_GET_DRIVE_GEOMETRY, // operation to perform
  30. NULL, 0, // no input buffer
  31. pdg, sizeof(*pdg), // output buffer
  32. &junk, // # bytes returned
  33. (LPOVERLAPPED) NULL); // synchronous I/O
  34.  
  35. CloseHandle(hDevice);
  36.  
  37. return (bResult);
  38. }
  39.  
  40. int main(int argc, char *argv[])
  41. {
  42. DISK_GEOMETRY pdg; // disk drive geometry structure
  43. BOOL bResult; // generic results flag
  44. ULONGLONG DiskSize; // size of the drive, in bytes
  45.  
  46. bResult = GetDriveGeometry (&pdg);
  47.  
  48. if (bResult)
  49. {
  50. printf("Cylinders = %I64dn", pdg.Cylinders);
  51. printf("Tracks per cylinder = %ldn", (ULONG) pdg.TracksPerCylinder);
  52. printf("Sectors per track = %ldn", (ULONG) pdg.SectorsPerTrack);
  53. printf("Bytes per sector = %ldn", (ULONG) pdg.BytesPerSector);
  54.  
  55. DiskSize = pdg.Cylinders.QuadPart * (ULONG)pdg.TracksPerCylinder *
  56. (ULONG)pdg.SectorsPerTrack * (ULONG)pdg.BytesPerSector;
  57. printf("Disk size = %I64d (Bytes) = %I64d (Gb)n", DiskSize,
  58. DiskSize / (1024 * 1024 * 1024));
  59. }
  60. else
  61. {
  62. printf ("GetDriveGeometry failed. Error %ld.n", GetLastError ());
  63. }
  64.  
  65. return ((int)bResult);
  66. }


Ответ отправил: Матвеев Игорь Владимирович (статус: Студент)
Время отправки: 14 декабря 2006, 23:51
Оценка за ответ: 5

Комментарий к оценке: Спасибо большое.

Мини-форум вопроса

Мини-форум пуст.

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:58
Выполнено за 0.02 сек.