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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> DeviceIOControl в Win9x, не дает точных значений 
:(
    Опции темы
artem1987
Дата 3.10.2006, 14:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



подскажите как работать с WinAPI под 9х, мне нужно получить геометрию диска
работаю так
Код

 PDIOC_REGISTERS = ^DIOC_REGISTERS;
    DIOC_REGISTERS = packed record
       reg_EBX: DWORD;
       reg_EDX: DWORD;
       reg_ECX: DWORD;
       reg_EAX: DWORD;
       reg_EDI: DWORD;
       reg_ESI: DWORD;
       reg_Flags: DWORD;
    end;

reg:  DIOC_REGISTERS;

          times:=1; 
          repeat
            case times of
              1: dpb.specialFunc := 1;  // hit disk (1=hit, 0=do not hit)
              2: dpb.specialFunc := 0;  // return default type; do not hit disk (1=hit, 0=do not hit)
            end;
            reg.reg_EBX   := bDrive;       // BL = drive number (1-based)
            reg.reg_EDX   := DWORD(@dpb);  // DS:EDX -> DPB
            reg.reg_ECX   := $0860;        // CX = Get DPB
            reg.reg_EAX   := $440D;        // AX = Ioctl
            reg.reg_Flags := CARRY_FLAG;   // assume failure

            // Make sure both DeviceIoControl and Int 21h succeeded.
            res:=(DeviceIoControl (W95handle, VWIN32_DIOC_DOS_IOCTL, @reg,
                                 sizeof(reg), @reg, sizeof(reg), cb, 0)
                                 AND (reg.reg_Flags AND CARRY_FLAG=0));


но данные из него не совпадают с данными получеными в ХР(с пом IOCTL_GET_DRIVE_GEOMETRY)?

Это сообщение отредактировал(а) artem1987 - 3.10.2006, 14:19
--------------------
Don't ask me why, ask me how.
PM MAIL   Вверх
Rouse_
Дата 3.10.2006, 21:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



А если MSDN посмотреть? http://windowssdk.msdn.microsoft.com/en-us...y/ms680773.aspx


--------------------
 Vae Victis
(Горе побежденным (лат.))
Демо с открытым кодом: http://rouse.drkb.ru 
PM MAIL WWW ICQ   Вверх
artem1987
Дата 4.10.2006, 10:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Цитата

А если MSDN посмотреть? http://windowssdk.msdn.microsoft.com/en-us...y/ms680773.aspx

а вот если в этом вашем эмэсдээне внимательнее читать, то видно что приведенный по вашей ссылке код никакой геометрии не даст 
я и  этот код тоже не с потолка взял, почитал msdn да написал...
вот ежели почитать раздел FAT32 Structures > EA_DEVICEPARAMETERS то видно, что она нам обещает дать количество цилиндров (или я не прав?)
структурку  энту можно получитьс с помощью
FAT32 Functions > Int 21h Function 440Dh Minor Code 40h (FAT32)
вот мой вопрос , как это реализовать?
сам я пытаюсь это сделать вот так, но дыннае получаются кривые
Код

diskinfo : EA_DEVICEPARAMETERS;
reg : DIOC_REGISTERS;

result := False;
         FillChar(DiskInfo, sizeof(DiskInfo), 0);
         DiskStr := 'C:\'#0;
         hDev := CreateFile('\\.\VWin32', GENERIC_READ or GENERIC_WRITE, FILE_SHARE_READ or FILE_SHARE_WRITE,
            nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL or FILE_FLAG_DELETE_ON_CLOSE, 0);                      //hDev=W95Handle
         if hDev <> INVALID_HANDLE_VALUE then begin
            FillChar(reg, sizeof(reg), 0);
            bDeviceCat := $48;
            attempt:=1;
            repeat
               // Set up the parameters for the call.
               reg. reg_EAX := $440D;
               reg.reg_EBX := bDrive;
               reg.reg_EDX := int64(@DiskInfo);
               reg.reg_ECX := MAKEWORD($60, bDeviceCat);

               Result := DeviceIOControl(hDev, VWIN32_DIOC_DOS_DRIVEINFO, @reg, sizeof(reg), @reg, sizeof(reg), cb, nil) and
                        (not BOOL(reg.reg_Flags and CARRY_FLAG));
                                                                //or VWIN32_DIOC_DOS_IOCTL instead of VWIN32_DIOC_DOS_DRIVEINFO
             
               // See if DeviceIoControl and the unlock succeeded
               Result := Result AND (reg.reg_Flags AND CARRY_FLAG=0);

               // If DeviceIoControl or the unlock failed, and device category 0x08
               // hasn't been tried, retry the operation with device category 0x08.
               if NOT Result then bDeviceCat := $08
               else messagebox(0, pchar('succesed'),'result',MB_OK);
               inc(attempt);
            until (Result) OR (attempt > 2);
            CloseHandle(hDev);
         end;


что не правильно?
--------------------
Don't ask me why, ask me how.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "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.0427 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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