Модераторы: Snowy, bartram, MetalFan, bems, Poseidon, Riply
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Определение кол-ва секторов с флешки, Как? 
:(
    Опции темы
kalexi
  Дата 4.9.2010, 01:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 27
Регистрация: 9.2.2008

Репутация: нет
Всего: нет



Замучился делать...

Читаю сектор так:

Код

function ReadSectors(Drive: Char; StartingSector, SectorCount: DWORD;
  Buffer: Pointer; BytesPerSector: DWORD = 512): DWORD;
var
  hFile: THandle;
  br,TmpLo,TmpHi: DWORD;
begin
  Result := 0;
  hFile := CreateFile(PChar('\\.\'+Drive+':'),
    GENERIC_READ,FILE_SHARE_READ,nil,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0);
  if hFile = INVALID_HANDLE_VALUE then Exit;
  TmpLo := __Mul(StartingSector,BytesPerSector,TmpHi);
  if SetFilePointer(hFile,TmpLo,@TmpHi,FILE_BEGIN) = TmpLo then

  begin
    SectorCount := SectorCount*BytesPerSector;
    if ReadFile(hFile,Buffer^,SectorCount,br,nil) then Result := br;
  end;
  CloseHandle(hFile);
end;


Нужно узнать количество секторов на флешке. Пытался несколькими способами -но неверные результаты. Видел варианты для HDD и CD.

Пытался переписать это, но не хватает структуры PARTITION_INFORMATION. Как она объявлена?
( "\\\\.\\PhysicalDrive0" разумеется заменю на '\\.\I:')

Код

  HANDLE hDisk;
  UNREFERENCED_PARAMETER( argc );
  UNREFERENCED_PARAMETER( argv );

  hDisk =  CreateFileW( L"\\\\.\\PhysicalDrive0", GENERIC_READ|GENERIC_WRITE,
                      FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE,
                      NULL,
                      OPEN_EXISTING,
                      FILE_ATTRIBUTE_NORMAL,
                      NULL );

  if ( INVALID_HANDLE_VALUE != hDisk )
  {
    PARTITION_INFORMATION   PartInfo;
    DWORD Ret;
    if ( DeviceIoControl( hDisk, IOCTL_DISK_GET_PARTITION_INFO,
                           NULL, 0, 
                           &PartInfo, sizeof(PartInfo),
                           &Ret, NULL )
       && Ret == sizeof(PartInfo) )
    {
      unsigned long Gb, Mb;
      PartInfo.PartitionLength.QuadPart /= 512;

      // Do simple right 21 bit shift of 64 bit value
      Gb = (PartInfo.PartitionLength.LowPart >> 21) | (PartInfo.PartitionLength.HighPart << 11);
      Mb = PartInfo.PartitionLength.LowPart & 0x1FFFFF;
      printf( "Disk 0: (%lu.%02lu Gb)\n", Gb, (Mb * 100) >> 21 );
    }
    
    CloseHandle( hDisk );
  }

  return 0;


PM MAIL WWW   Вверх
~FoX~
Дата 4.9.2010, 02:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


НЕ рыжий!!!
****


Профиль
Группа: Участник Клуба
Сообщений: 2819
Регистрация: 8.10.2003
Где: Зеленоград

Репутация: 0
Всего: 68



Цитата(kalexi @  4.9.2010,  02:46 Найти цитируемый пост)
но не хватает структуры PARTITION_INFORMATION. Как она объявлена?

Contains information about a disk partition.
Note  PARTITION_INFORMATION has been superseded by the PARTITION_INFORMATION_EX structure.
Syntax

Код

typedef struct _PARTITION_INFORMATION {  
  LARGE_INTEGER StartingOffset;  
  LARGE_INTEGER PartitionLength;  
  DWORD HiddenSectors;  
  DWORD PartitionNumber;  
  BYTE PartitionType;  
  BOOLEAN BootIndicator;  
  BOOLEAN RecognizedPartition;  
  BOOLEAN RewritePartition;
}PARTITION_INFORMATION,  
*PPARTITION_INFORMATION;


Members
StartingOffset 
The starting offset of the partition.

PartitionLength 
The length of the partition, in bytes.

HiddenSectors 
The number of hidden sectors in the partition.

PartitionNumber 
The number of the partition (1-based).

PartitionType 
The type of partition. For a list of values, see Disk Partition Types.

BootIndicator 
If this member is TRUE, the partition is bootable.

RecognizedPartition 
If this member is TRUE, the partition is of a recognized type.

RewritePartition 
If this member is TRUE, the partition information has changed. When you change a partition (with IOCTL_DISK_SET_DRIVE_LAYOUT), the system uses this member to determine which partitions have changed and need their information rewritten.



Это сообщение отредактировал(а) ~FoX~ - 4.9.2010, 02:29


--------------------
user posted image
…множественность никогда не следует полагать без необходимости…
PM MAIL WWW ICQ Jabber   Вверх
kalexi
Дата 4.9.2010, 12:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 27
Регистрация: 9.2.2008

Репутация: нет
Всего: нет



Не работает, переписал так:

Код

function GetDrInf:Cardinal;
var
 hDisk:THandle;
 PartInfo : PARTITION_INFORMATION;
 Ret: Cardinal;
 Gb, Mb:Cardinal;
begin
  hDisk :=  CreateFileW('\\.\I:', GENERIC_READ or GENERIC_WRITE,
                      FILE_SHARE_READ or FILE_SHARE_WRITE or FILE_SHARE_DELETE,
                      nil,
                      OPEN_EXISTING,
                      FILE_ATTRIBUTE_NORMAL,
                      0);

  if INVALID_HANDLE_VALUE <> hDisk  then
    if DeviceIoControl( hDisk, IOCTL_DISK_GET_PARTITION_INFO,
                           nil, 0,
                           @PartInfo, sizeof(PartInfo),
                           Ret, 0 ) and (Ret = sizeof(PartInfo)) then
    begin
      PartInfo.PartitionLength.QuadPart := PartInfo.PartitionLength.QuadPart div  512;
      // Gb = (PartInfo.PartitionLength.LowPart >> 21) | (PartInfo.PartitionLength.HighPart << 11);
      // Mb = PartInfo.PartitionLength.LowPart & 0x1FFFFF;
      //printf( "Disk 0: (%lu.%02lu Gb)\n", Gb, (Mb * 100) >> 21 );
      WriteLn(PartInfo.PartitionLength.QuadPart);
    end;

    CloseHandle( hDisk );
end;


Проблемы две, первая ф-ция CreateFileW возвращает False, вторая - Ret должно быть равно 28, а оно 4209979.
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: WinAPI и системное программирование"
Snowybartram
MetalFanbems
PoseidonRrader
Riply

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Delphi обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • 99% ответов по WinAPI можно найти в MSDN Library, оставшиеся 1% здесь

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, bartram, MetalFan, bems, Poseidon, Rrader, Riply.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: WinAPI и системное программирование | Следующая тема »


 




[ Время генерации скрипта: 0.0485 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.