Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 21.10.2015, 20:59   #1
SomeOneAndrey
Пользователь
 
Регистрация: 28.06.2014
Сообщений: 20
По умолчанию IOCTL_DISK_GET_PARTITION_INFO

Приветствую всем. Необходимо получить информацию о диске при помощи IOCTL_DISK_GET_PARTITION_INFO в DISK_CACHE_INFORMATION

https://msdn.microsoft.com/en-us/lib...(v=vs.85).aspx

К сожалению, ни структуры, ни константы в модуле дельфи 7 нет. Нашел в интернете константу

Цитата:
IOCTL_DISK_GET_CACHE_INFORMATION = 0x000740D4
А так-же структуру

Цитата:
typedef struct _DISK_CACHE_INFORMATION {
BOOLEAN ParametersSavable;
BOOLEAN ReadCacheEnabled;
BOOLEAN WriteCacheEnabled;
DISK_CACHE_RETENTION_PRIORITY ReadRetentionPriority;
DISK_CACHE_RETENTION_PRIORITY WriteRetentionPriority;
WORD DisablePrefetchTransferLength;
BOOLEAN PrefetchScalar;
union {
struct {
WORD Minimum;
WORD Maximum;
WORD MaximumBlocks;
} ScalarPrefetch;
struct {
WORD Minimum;
WORD Maximum;
} BlockPrefetch;
};
} DISK_CACHE_INFORMATION, *PDISK_CACHE_INFORMATION;
Которую переписал под дельфи. Но что-то не работает. Возможно дело в структуре

Код:
Код:
type
  TScalarPrefetch = packed record
    Minimum: Word;
    Maximum: Word;
    MaximumBlocks: Word;
  end;

  TBlockPrefetch = packed record
    Minimum: Word;
    Maximum: Word;
  end;

  DISK_CACHE_RETENTION_PRIORITY = (EqualPriority, KeepPrefetchedData, KeepReadData);

  TDISK_CACHE_INFORMATION = packed record
    ParametersSavable: Boolean;
    ReadCacheEnabled: Boolean;
    WriteCacheEnabled: Boolean;
    ReadRetentionPriority: DISK_CACHE_RETENTION_PRIORITY;
    WriteRetentionPriority: DISK_CACHE_RETENTION_PRIORITY;
    DisablePrefetchTransferLength: Word;
    PrefetchScalar: Bool;
    ScalarPrefetch: TScalarPrefetch;
    BlockPrefetch: TBlockPrefetch;
  end;

  PDISK_CACHE_INFORMATION = ^TDISK_CACHE_INFORMATION;
var
  h: THandle;
  info: PDISK_CACHE_INFORMATION;
  response: DWord;
  E: Integer;
begin
  h:=CreateFile(PChar('\\.\D:'), GENERIC_READ or GENERIC_WRITE, FILE_SHARE_READ or FILE_SHARE_WRITE, nil, OPEN_EXISTING, FILE_ATTRIBUTE_SYSTEM, 0);

  if h = INVALID_HANDLE_VALUE then begin
    ShowMessage('Can''t access disk.');
    Exit;
  end;

  if not DeviceIoControl(h, $740D4, nil, 0, @info, SizeOf(info), response, nil) then begin
    E:=GetLastError;
    Showmessage(Format('Error: %d', [E]));
    Exit;
  end;
end;
DeviceIoControl возвращает False, из за ошибки 122
Цитата:
122 - ERROR_INSUFFICIENT_BUFFER
Дело в структуре? Что в ней не так?

Последний раз редактировалось SomeOneAndrey; 21.10.2015 в 21:07.
SomeOneAndrey вне форума Ответить с цитированием
Старый 21.10.2015, 21:07   #2
cotseec
Пользователь
 
Регистрация: 02.05.2012
Сообщений: 45
По умолчанию

если так: DeviceIoControl(h, $740D4, nil, 0, @info, SizeOf(info), response, nil), то info: ТDISK_CACHE_INFORMATION;
в имеющемся случае (с info: PDISK_CACHE_INFORMATION; ) необходимо передавать непосредственно info, выделив предварительно память


IOCTL_DISK_GET_CACHE_INFORMATION
Skype: cotseec
ICQ: 330-171-495
cotseec вне форума Ответить с цитированием
Старый 21.10.2015, 21:35   #3
SomeOneAndrey
Пользователь
 
Регистрация: 28.06.2014
Сообщений: 20
По умолчанию

Цитата:
Сообщение от cotseec Посмотреть сообщение
если так: DeviceIoControl(h, $740D4, nil, 0, @info, SizeOf(info), response, nil), то info: ТDISK_CACHE_INFORMATION;
в имеющемся случае (с info: PDISK_CACHE_INFORMATION; ) необходимо передавать непосредственно info, выделив предварительно память


IOCTL_DISK_GET_CACHE_INFORMATION
Что-то я просмотрел. Теперь новая ошибка - 998
Код:
ERROR_NOACCESS = Invalid access to memory location.
Выделил память
Код:
GetMem(info, SizeOf(TDISK_CACHE_INFORMATION));
В итоге, вернулось к ошибке 122
SomeOneAndrey вне форума Ответить с цитированием
Старый 21.10.2015, 23:09   #4
SomeOneAndrey
Пользователь
 
Регистрация: 28.06.2014
Сообщений: 20
По умолчанию

Проблема была в том, что запись была packed. Тему можно закрывать
SomeOneAndrey вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц