Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как получить количество физических жестких дисков?


Nomolos ©   (2004-06-26 20:48:00) 

subj


Игорь Шевченко   (2004-06-29 16:10:00) [1]


>  Оказывается, NtQuerySystemInformation просит конкретный
> указатель, а не ссылку на переменную. Казалось бы, разницы
> почти нет, а эффект налицо. Надо объявлять переменную psci
> типа PSYSTEM_CONFIGURATION_INFORMATION, выделять память
> и давать этот указатель вместо @sci.


Глупость.


Nomolos   (2004-06-29 10:30:00) [2]

Извиняюсь за флэйм в этой теме, но я наконец разобрался, в чём дело. Оказывается, NtQuerySystemInformation просит конкретный указатель, а не ссылку на переменную. Казалось бы, разницы почти нет, а эффект налицо. Надо объявлять переменную psci типа PSYSTEM_CONFIGURATION_INFORMATION, выделять память и давать этот указатель вместо @sci. Возможно, кому-то пригодится...


Nomolos   (2004-06-28 18:45:00) [3]

В том и трабл, что функции даются те же параметры... Ещё поискать попробую. Может, чего не так, я даже проследил, есть ли там инициализация, может, не сделал...


Игорь Шевченко   (2004-06-28 10:32:00) [4]


> dw = 0 - это из NtDll.pas, но всё равно в dw - какое-то
> дикое значение, отличное от sizeof(sci), а структура не
> заполняется


У тебя же мой код есть - ищи разницу, мой пример работает


Nomolos   (2004-06-28 10:23:00) [5]

В "Моём компьютере" логические диски, их можно и програмно посчитать, как два пальца.
dw = 0 - это из NtDll.pas, но всё равно в dw - какое-то дикое значение, отличное от sizeof(sci), а структура не заполняется


Sanek_metaller   (2004-06-28 00:47:00) [6]

Открыть "Мой компьютер" и посчитаь:)


Игорь Шевченко   (2004-06-27 23:19:00) [7]


> однако в dw выдаёт совсем не ноль


dw должна быть равна SizeOf(sci) вообще-то, а не 0.

нулем должно быть значение самой функции


Nomolos   (2004-06-27 10:29:00) [8]

Пример Игоря Шевченко DeviceIOControl помогает мне уже давно, огромное за это спасибо, но получить количество HDD так же, как в демонстрации, не получается...
Вот шмат кода (упрощённый вариант), где я напутал?

type
 SYSTEM_CONFIGURATION_INFORMATION = packed record
   DiskCount : ULONG;
   FloppyCount : ULONG;
   CdRomCount : ULONG;
   TapeCount : ULONG;
   SerialCount : ULONG;
   ParallelCount : ULONG;
 end;
 TNtQuerySystemInformation = function(SystemInformationClass: LongInt;
             SystemInformation: Pointer; SystemInformationLength: ULONG;
             ReturnLength: PDWORD): Integer; stdcall;
var
 sci: SYSTEM_CONFIGURATION_INFORMATION;
 dw: DWORD;
 hDLL: THandle;
 NtQuerySystemInformation: TNtQuerySystemInformation;
 i: Integer;
begin
 hDLL := GetModuleHandle('ntdll.dll');
 if hDLL <> 0 then begin
   @NtQuerySystemInformation := GetProcAddress(hDLL,
     'NtQuerySystemInformation');
   NtQuerySystemInformation(7, @sci, SizeOf(sci), @dw);
   if dw = 0 then
     for i := 0 to sci.DiskCount - 1 do
       ListBox1.Items.Add('Физический диск ' + IntToStr(i));
   FreeLibrary(hDLL)
 end
end;

Библиотека открывается, даже функция считывается, однако в dw выдаёт совсем не ноль... Возможно, я неправильно осуществляю вызов? Вроде-бы, старался сделать, как в примере, там работает, культурно возвращает два диска...


GuAV   (2004-06-27 00:42:00) [9]

Изините, я невнимательно прочитал Ihor Osov'yak ©   (26.06.04 22:22) [3]


GuAV   (2004-06-27 00:40:00) [10]


> никто такого не утверждал.

Поэтому я и спросил, чтоб уже была определенность можно/нет


Ihor Osov'yak   (2004-06-27 00:32:00) [11]

2 GuAV ©   (27.06.04 00:23) [5]

> Может вы ещё скажете что нет надёжного способа узнать их количество?

У меня сложилось впечатление, что никто такого не утверждал.


Игорь Шевченко   (2004-06-27 00:25:00) [12]


> Может вы ещё скажете что нет надёжного способа узнать их
> количество?


Для NT-систем я знаю, что есть. Для Win9x не знаю, как, но тоже есть.


GuAV   (2004-06-27 00:23:00) [13]

Может вы ещё скажете что нет надёжного способа узнать их количество?


Anatoly Podgoretsky   (2004-06-26 23:26:00) [14]

И не факт, что логический диск занимает один физизический, есть жа RAID


Ihor Osov'yak   (2004-06-26 22:22:00) [15]

для W9X - к сожалению только через соотв. функции int13, к которым из win32 посредством VWIN32 обратиться то можно, но для HDD они будут неработоспособны. C int13 под W9X можно нормально работать либо с vxd, либо с 16-битной dll.

2 [1] Mim1 ©   (26.06.04 21:16)

Не факт, что физический диск будет иметь хотя бы один логический том.
Не факт, что физический диск будет иметь только один логический том.


Игорь Шевченко   (2004-06-26 21:31:00) [16]

Nomolos   (26.06.04 20:48)


> Как получить количество физических жестких дисков?


Для NT-систем: http://www.schevchenko.net.ru/SRC/DeviceIoControl_60.zip+
http://www.schevchenko.net.ru/SRC/Common_60.zip


Mim1   (2004-06-26 21:16:00) [17]

var
 c:cardinal;
 b:byte;
 i:integer;
const drvs='ABCDEFGHIJKLMNOPQRSTUVWXYZ';
begin
 i := 0;
 c:=GetLogicalDrives();
 for b:=1 to 26 do
   begin
     if c and 1 = 1 then
       begin
         s:=drvs[b]+#$9;
         if GetDriveType(pchar(drvs[b]+':\')) = DRIVE_FIXED then inc(i);
       end;
     c:=c shr 1;
   end;
end;


Наверх

Титульная страница Поиск, карта сайта Написать письмо