IOCTL_DISK_GET_DRIVE_LAYOUT_EX возможно ли на vb6 ?!

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
sosed213
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 150
Зарегистрирован: 13.11.2007 (Вт) 21:19
Откуда: Омск

IOCTL_DISK_GET_DRIVE_LAYOUT_EX возможно ли на vb6 ?!

Сообщение sosed213 » 20.02.2012 (Пн) 7:19

Я пишу прогу что то типо diskpart.exe только с большими возможностями.
Для начала хочу разобраться с большинством функция типа IOCTL_*

Уже научился и разобрался с этими функциями.
IOCTL_VOLUME_GET_VOLUME_DISK_EXTENTS
IOCTL_STORAGE_GET_DEVICE_NUMBER
IOCTL_STORAGE_GET_MEDIA_SERIAL_NUMBER
IOCTL_DISK_GET_LENGTH_INFO
IOCTL_DISK_GET_DRIVE_GEOMETRY

Затык начался на этих функциях:
IOCTL_DISK_GET_DRIVE_LAYOUT_EX
IOCTL_DISK_GET_PARTITION_INFO_EX

Точнее проблема в структуре данных DRIVE_LAYOUT_INFORMATION_EX и PARTITION_INFORMATION_EX
Не получается, видимо, ее правильно описать.

Зато если я делаю так, то все успешно:
Код: Выделить всё
Dim temp(4096) As Byte
If DeviceIoControl(hDrive, IOCTL_DISK_GET_PARTITION_INFO_EX, ByVal 0&, 0, temp(0), 4096, dwOutBytes, ByVal 0&) Then
   MsgBox "Good!"
Else
   MsgBox "Failed!"
End If


так я и понял что проблема в структуре.


Структура у меня выглядит так:
Код: Выделить всё
Private Enum PARTITION_STYLE
   PARTITION_STYLE_MBR = 0
   PARTITION_STYLE_GPT = 1
   PARTITION_STYLE_RAW = 2

Private Type DRIVE_LAYOUT_INFORMATION_MBR
   Signature As Long
End Type

Private Type DRIVE_LAYOUT_INFORMATION_GPT
   DiskId As Long
   StartingUsableOffset As Long
   UsableLength As Long
   MaxPartitionCount As Long
End Type

Private Type PARTITION_INFORMATION_EX
   PartitionStyle As PARTITION_STYLE
   StartingOffset As Long
   PartitionLength As Long
   PartitionNumber As Long
   RewritePartition As Boolean
   Mbr As PARTITION_INFORMATION_MBR
   Gpt As PARTITION_INFORMATION_GPT
End Type

Private Type DRIVE_LAYOUT_INFORMATION_EX
   PartitionStyle As PARTITION_STYLE
   PartitionCount As Long
   Mbr As PARTITION_INFORMATION_MBR
   Gpt As PARTITION_INFORMATION_GPT
   PartitionEntry(1) As PARTITION_INFORMATION_EX
End Type


Скажу сразу, что эта проблема в инете есть, но мало кто этим занимается.
Буду рад если кто поможет.

Если проблему решить не удастся то наверно придется вручную копать и разбирать MBR (читал тут: http://dimnsk.clan.su/publ/master_boot_record_mbr/25-1-0-50)
Не могу сказать что знаю все, но и за дурака прошу меня не считать.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16095
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: IOCTL_DISK_GET_DRIVE_LAYOUT_EX возможно ли на vb6 ?!

Сообщение Хакер » 21.02.2012 (Вт) 6:40

Конечно, структура описана неправильно.

Объявление PARTITION_INFORMATION_EX неправильное:
  • Поле StartingOffset. В оригинале тип LARGE_INTEGER, а у тебя Long. Это разные типы, LARGE_INTEGER — это 8-байтное число.
  • Поле PartitionLength. В оригинале тип LARGE_INTEGER, а у тебя Long. Это разные типы, LARGE_INTEGER — это 8-байтное число.
  • Поле RewritePartition. В оригинале BOOLEAN, а у тебя Boolean. При этом, в оригинале BOOLEAN объявлен в winnt.h как псевдоним типа BYTE. В VB же тип Boolean — двухбайтный.
  • Поля Mbr и Gpt. В оригинале находятся внутри union-а, а у тебя просто стоят подряд, друг-за-другом.


Объявление DRIVE_LAYOUT_INFORMATION_EX неправильное:
  • Поля Mbr и Gpt. В оригинале находятся внутри union-а, а у тебя просто стоят подряд, друг-за-другом.
  • Поле Mbr имеет тип PARTITION_INFORMATION_MBR, а должно было бы иметь тип DRIVE_LAYOUT_INFORMATION_MBR.
  • Поле Gpt имеет тип PARTITION_INFORMATION_GPT, а должно было бы иметь тип DRIVE_LAYOUT_INFORMATION_GPT.
  • PartitionEntry(1) — может быть ошибкой, если Option Base 0 (по умолчанию). Это не играет такой роли, как в Си, потому что обратиться к 6574-ому элементу массива всё равно не получится, но при вычислении доп. размера буфера это приведёт к ошибке.


Объявление DRIVE_LAYOUT_INFORMATION_MBR правильное, но бесполезное (из-за неприятности с union-ом).


Объявление DRIVE_LAYOUT_INFORMATION_GPT неправильное:
  • Поле DiskId. В оригинале тип GUID, а у тебя Long. Возмутительно! :shock:
  • Поле StartingUsableOffset. В оригинале тип LARGE_INTEGER, а у тебя Long.
  • Поле UsableLength. В оригинале тип LARGE_INTEGER, а у тебя Long.


Объявление типа DRIVE_LAYOUT_INFORMATION_MBR ты не привёл.

Объявление типа DRIVE_LAYOUT_INFORMATION_GPT ты не привёл.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

sosed213
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 150
Зарегистрирован: 13.11.2007 (Вт) 21:19
Откуда: Омск

Re: IOCTL_DISK_GET_DRIVE_LAYOUT_EX возможно ли на vb6 ?!

Сообщение sosed213 » 21.02.2012 (Вт) 6:57

Во первых, спасибо большое Хакер.

Можно чуть подробнее, что значит внутри внутри union-а ?

С типом LARGE_INTEGER поэксперементирую, может Double или Currency...
RewritePartition As Boolean попробую заменить на RewritePartition As Byte :?:
Ну и DiskId As Long наверно это лучше поставить Integer ?! :?:
Не могу сказать что знаю все, но и за дурака прошу меня не считать.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16095
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: IOCTL_DISK_GET_DRIVE_LAYOUT_EX возможно ли на vb6 ?!

Сообщение Хакер » 21.02.2012 (Вт) 7:00

sosed213 писал(а):Можно чуть подробнее, что значит внутри внутри union-а ?

Код: Выделить всё
union { type1 filed1; type2 field2; } x;


sosed213 писал(а):С типом LARGE_INTEGER поэксперементирую, может Double или Currency...

Издеваешься? :x
Код: Выделить всё
Type LARGE_INTEGER
    LowPart As Long
    HiPart As Long
End Type


sosed213 писал(а):Ну и DiskId As Long наверно это лучше поставить Integer ?! :?:

ИЗДЕВАЕШЬСЯ? :x :x :x
Я же написал, что это GUID. Фига-ли Integer?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

sosed213
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 150
Зарегистрирован: 13.11.2007 (Вт) 21:19
Откуда: Омск

Re: IOCTL_DISK_GET_DRIVE_LAYOUT_EX возможно ли на vb6 ?!

Сообщение sosed213 » 21.02.2012 (Вт) 7:04

Ладно, не ругайся так. :wink:

Просто не очень понял сразу. ща поэксперементирую.
Не могу сказать что знаю все, но и за дурака прошу меня не считать.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16095
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: IOCTL_DISK_GET_DRIVE_LAYOUT_EX возможно ли на vb6 ?!

Сообщение Хакер » 21.02.2012 (Вт) 7:10

sosed213 писал(а):Просто не очень понял сразу. ща поэксперементирую.

Когда так пишут, это худший признак. Это значит, что хотят сказать «не понял сразу, не понял сейчас, и не пойму дальше. Буду делать всякую разную случайную фигню, пока вдруг чудом не заработает».

Это ужасно.

Таким методом добиться успеха в конкретно данном деле — может уйти хоть два года. Единственый вариант — понимания, что делать, решить проблему, потратив (без преуменьшения) одну минуту.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

sosed213
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 150
Зарегистрирован: 13.11.2007 (Вт) 21:19
Откуда: Омск

Re: IOCTL_DISK_GET_DRIVE_LAYOUT_EX возможно ли на vb6 ?!

Сообщение sosed213 » 21.02.2012 (Вт) 7:37

Из каждого момента стараюсь узнать что-то новое. Так например с Type LARGE_INTEGER и GUID - запомню навсегда
Вот только с union { type1 filed1; type2 field2; } до сих пор не разобрался, как это работает в VB6 и работает ли вообще.

Но с IOCTL_DISK_GET_DRIVE_LAYOUT_EX вроде бы получилось, по крайней мере DeviceIoControl теперь отрабатывает нормально, буду разбираться дальше, с корректностью полученных данных.

Интересно DWord64 в VB6 как будет выглядеть Long или Double или ?!

Вот код который у меня получился:


Код: Выделить всё
Private Type LARGE_INTEGER
    LowPart As Long
    highpart As Long
End Type

Private Enum PARTITION_STYLE
    PARTITION_STYLE_MBR = 0
    PARTITION_STYLE_GPT = 1
    PARTITION_STYLE_RAW = 2
End Enum

Private Type PARTITION_INFORMATION_MBR
    PartitionType As Byte
    BootIndicator As Byte           'Boolean
    RecognizedPartition  As Byte    'Boolean
    HiddenSectors As Long           'Dword
End Type

Private Type PARTITION_INFORMATION_GPT
    PartitionType As GUID
    PartitionId As GUID
    Attributes As Long 'Double     'DWord64
    Name As String * 36
End Type

Private Type DRIVE_LAYOUT_INFORMATION_MBR
    Signature As Long
End Type

Private Type DRIVE_LAYOUT_INFORMATION_GPT
    DiskId As GUID
    StartingUsableOffset As LARGE_INTEGER
    UsableLength As LARGE_INTEGER
    MaxPartitionCount As Long
End Type

Private Type PARTITION_INFORMATION_EX
    PartitionStyle As PARTITION_STYLE
    StartingOffset As LARGE_INTEGER
    PartitionLength As LARGE_INTEGER
    PartitionNumber As Long
    RewritePartition As Byte
    Mbr As PARTITION_INFORMATION_MBR
    Gpt As PARTITION_INFORMATION_GPT
End Type

Private Type DRIVE_LAYOUT_INFORMATION_EX
    PartitionStyle As PARTITION_STYLE
    PartitionCount As Long
    Mbr As DRIVE_LAYOUT_INFORMATION_MBR
    Gpt As DRIVE_LAYOUT_INFORMATION_GPT
    PartitionEntry(90) As PARTITION_INFORMATION_EX
End Type



    Dim DL As DRIVE_LAYOUT_INFORMATION_EX
    If DeviceIoControl(hDrive, IOCTL_DISK_GET_DRIVE_LAYOUT_EX, ByVal 0&, 0, DL, Len(DL), dwOutBytes, ByVal 0&) Then
        MsgBox "Good!"
    Else
        MsgBox "Failed!"
    End If
Не могу сказать что знаю все, но и за дурака прошу меня не считать.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16095
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: IOCTL_DISK_GET_DRIVE_LAYOUT_EX возможно ли на vb6 ?!

Сообщение Хакер » 21.02.2012 (Вт) 7:43

sosed213 писал(а):Вот только с union { type1 filed1; type2 field2; } до сих пор не разобрался, как это работает в VB6 и работает ли вообще.

Нету union-ов в VB по причине их небезопасности.

Поэтому соответствующие поля юнионов в VB-шных типах должны быть либо «скомбинированы», либо объявлены все варианты типов для всех сочетаний.

То есть
Код: Выделить всё
typedef struct
{
    long X;
    long Y;
    long Z;
} XYZ;

typedef struct
{
    long A;
    long B;
    long C;
} ABC;

typedef struct
{
     long K;
     union
     {
         XYZ f1;
         ABC f2;
     };
     long M;
} Sample


Придётся делать либо так:
Код: Выделить всё
Type Sample
     K as Long
     A_or_X as Long
     B_or_Y as Long
     C_or_Z as Long
     L As Long
End Type


либо объявлять два варианта Sample.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

sosed213
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 150
Зарегистрирован: 13.11.2007 (Вт) 21:19
Откуда: Омск

Re: IOCTL_DISK_GET_DRIVE_LAYOUT_EX возможно ли на vb6 ?!

Сообщение sosed213 » 22.02.2012 (Ср) 6:35

Всю голову сломал над новой задачкой, как жесткий диск перевести в автономный режим, т.е. Offline (как тут http://img154.imageshack.us/img154/8158/ss1hi3.jpg)

Единственное нашел тут, но это не работает http://www.experts-exchange.com/Programming/Languages/.NET/Visual_Basic.NET/Q_26031071.html , вероятно автор там описывал только в теории.

Пробовал Api Monitor'om отслеживать события diskpart'a , но также безуспешно.

Но буду пробовать дальше...
Не могу сказать что знаю все, но и за дурака прошу меня не считать.

sosed213
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 150
Зарегистрирован: 13.11.2007 (Вт) 21:19
Откуда: Омск

Re: IOCTL_DISK_GET_DRIVE_LAYOUT_EX возможно ли на vb6 ?!

Сообщение sosed213 » 05.03.2012 (Пн) 7:14

Интересно, тип данных в Си DWORD в Windef.h объявляется как typedef unsigned long DWORD; , то есть это те же самые 4 байта что и просто Long но диапазон уже не от -2147483648 до 2147483647 , а от 0 до 4294967295 .

На примерах я видел что в VB6 DWORD заменяют просто Long, но если число перевалит за 2147483647 возникает ошибка. Как с этим быть в VB6, может уже такой вопрос поднимался?
Не могу сказать что знаю все, но и за дурака прошу меня не считать.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16095
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: IOCTL_DISK_GET_DRIVE_LAYOUT_EX возможно ли на vb6 ?!

Сообщение Хакер » 05.03.2012 (Пн) 7:28

sosed213 писал(а):На примерах я видел что в VB6 DWORD заменяют просто Long, но если число перевалит за 2147483647 возникает ошибка. Как с этим быть в VB6, может уже такой вопрос поднимался?

Не возникает ошибки, просто число становится отрицательным с точки зрения преобразования числа в текст.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

sosed213
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 150
Зарегистрирован: 13.11.2007 (Вт) 21:19
Откуда: Омск

Re: IOCTL_DISK_GET_DRIVE_LAYOUT_EX возможно ли на vb6 ?!

Сообщение sosed213 » 05.03.2012 (Пн) 7:37

Дает ошибку, переполнение.

Код: Выделить всё
Dim n As Long

Private Sub Command1_Click()
    n = n + 1
    Label1.Caption = n
End Sub

Private Sub Form_Load()
    n = 2147483647
End Sub
Не могу сказать что знаю все, но и за дурака прошу меня не считать.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16095
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: IOCTL_DISK_GET_DRIVE_LAYOUT_EX возможно ли на vb6 ?!

Сообщение Хакер » 05.03.2012 (Пн) 7:41

Если ты прибавляешь на стороне VB, то конечно.
Но изначально постановка была такой, словно число уже приходит «перевалившим за».

Для чисел в VB, чтобы не обращть внимание на их знаковость, следует «перереализовать» арифм. операции и операцию сравнения. Это сделать достаточно легко, но если тебя не хватит, то я возможно выложу свой модуль.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

sosed213
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 150
Зарегистрирован: 13.11.2007 (Вт) 21:19
Откуда: Омск

Re: IOCTL_DISK_GET_DRIVE_LAYOUT_EX возможно ли на vb6 ?!

Сообщение sosed213 » 05.03.2012 (Пн) 7:55

Модуль был бы кстати (заранее спасибо).

И я кажется разобрался с Union :)
Так понял что в Union выбирается одно из нескольких параметров, в зависимости от какого то параметра.

например
Код: Выделить всё
Private Type DRIVE_LAYOUT_INFORMATION_EX
   PartitionStyle As PARTITION_STYLE
   PartitionCount As Long

   [b]Mbr As PARTITION_INFORMATION_MBR or Gpt As PARTITION_INFORMATION_GPT[/b]

   PartitionEntry(1) As PARTITION_INFORMATION_EX
End Type


Будет выбран Mbr или Gpt в зависимости от переменной PartitionStyle. Не знаю как это работает в Си, но думаю как бы это адаптировать под VB.
Например после того как функция возвратит заполненную структуру DRIVE_LAYOUT_INFORMATION_EX, смотрим на значение переменной PartitionStyle (там может быть 0, 1 или 2), и соответственно вызываем функцию еще раз, но как структуру подставляем уже нужную.

Поправть если есть более оптимальный подход, или может я вовсе не прав.

Или может что то типо такого?
Код: Выделить всё
Private Type DRIVE_LAYOUT_INFORMATION_EX
   PartitionStyle As PARTITION_STYLE
   PartitionCount As Long

   #If PartitionStyle = 0 Then
   Mbr As PARTITION_INFORMATION_MBR
   #Elseif PartitionStyle = 1 Then
   Gpt As PARTITION_INFORMATION_GPT
   #End if

   PartitionEntry(1) As PARTITION_INFORMATION_EX
End Type
Не могу сказать что знаю все, но и за дурака прошу меня не считать.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16095
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: IOCTL_DISK_GET_DRIVE_LAYOUT_EX возможно ли на vb6 ?!

Сообщение Хакер » 05.03.2012 (Пн) 8:35

sosed213 писал(а):Модуль был бы кстати (заранее спасибо).

Нет. Сначала сам пробуй его написать.

sosed213 писал(а):Поправть если есть более оптимальный подход

Есть. Не вызывать функцию второй раз.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

sosed213
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 150
Зарегистрирован: 13.11.2007 (Вт) 21:19
Откуда: Омск

Re: IOCTL_DISK_GET_DRIVE_LAYOUT_EX возможно ли на vb6 ?!

Сообщение sosed213 » 05.03.2012 (Пн) 9:30

Но такой вариант ведь не совсем корректный, так как #if ... Then ... #End If проверяется только в момент инициализации программы. Тоесть если после вызова функции PartitionStyle примет значение 1 , то нужная нам структура будет пустой. Потому как в момент вызова функции PartitionStyle будет равна 0, и соответственно будет заполняться Mbr As PARTITION_INFORMATION_MBR, а после работы функции PartitionStyle может сменить значение на 1, соответственно Gpt As PARTITION_INFORMATION_GPT будет пустой.

Код: Выделить всё
Private Type DRIVE_LAYOUT_INFORMATION_EX
   PartitionStyle As PARTITION_STYLE
   PartitionCount As Long

   #If PartitionStyle = 0 Then
   Mbr As PARTITION_INFORMATION_MBR
   #Elseif PartitionStyle = 1 Then
   Gpt As PARTITION_INFORMATION_GPT
   #End if

   PartitionEntry(1) As PARTITION_INFORMATION_EX
End Type



???
Не могу сказать что знаю все, но и за дурака прошу меня не считать.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16095
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: IOCTL_DISK_GET_DRIVE_LAYOUT_EX возможно ли на vb6 ?!

Сообщение Хакер » 05.03.2012 (Пн) 9:33

sosed213 писал(а):ак как #if ... Then ... #End If проверяется только в момент инициализации программы

Чушь собачья. #If #End If проверяется в момент компиляции.

Ты не смог угадать, чем по своей сути являются Union-ы, что-ли?

Ещё раз: это когдва два поля существует в одном и том же месте. Как только понимаешь этот момент, в голове вырисовывается крайне много вариантов что-нибудь сделать в этой ситуации. Был бы один вариант, я бы может быть описал, но ведь вариантов правда очень много.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Re: IOCTL_DISK_GET_DRIVE_LAYOUT_EX возможно ли на vb6 ?!

Сообщение Antonariy » 05.03.2012 (Пн) 13:55

в голове вырисовывается крайне много вариантов
Описать два варианта прокатит? И использовать один из них в зависимости от... не знаю чего.
Лучший способ понять что-то самому — объяснить это другому.

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2751
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 05.03.2012 (Пн) 20:20

Antonariy писал(а):И использовать один из них в зависимости от... не знаю чего.

Да нету никакой зависимости. Просто есть наложение полей.
Код: Выделить всё
union
{
short a;
long b;
} var;
Переменная var занимает 4 байта, как максимальный из размеров short (2 байта) и long (4 байта). При этом в первых двух байтах значания полей a и b накладываются друг на друга.
Код: Выделить всё
байт:  0      1      2      3
var    [first inside inside last]
var::a [first  last]
var::b [first inside inside last]

Надеюсь, так понятно, что такое union?

sosed213
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 150
Зарегистрирован: 13.11.2007 (Вт) 21:19
Откуда: Омск

Re: IOCTL_DISK_GET_DRIVE_LAYOUT_EX возможно ли на vb6 ?!

Сообщение sosed213 » 06.03.2012 (Вт) 5:51

Qwertiy, спасибо. Теперь я понял :)

Можно ли в средствами VB6 как то из набора данных (строка или массив байтов) построить структуру?
Например:

Код: Выделить всё
Private Type PARTITION_INFORMATION_EX
    PartitionStyle As PARTITION_STYLE
    StartingOffset As LARGE_INTEGER
    PartitionLength As LARGE_INTEGER
    PartitionNumber As Long
    RewritePartition As Byte
    Mbr As PARTITION_INFORMATION_MBR
End Type

Private Type DRIVE_LAYOUT_INFORMATION_EX
    PartitionStyle As PARTITION_STYLE
    PartitionCount As Long
    Mbr As DRIVE_LAYOUT_INFORMATION_MBR
    Gpt As DRIVE_LAYOUT_INFORMATION_GPT
    PartitionEntry(90) As Byte
End Type

Dim DL as DRIVE_LAYOUT_INFORMATION_EX
Dim PL as PARTITION_INFORMATION_EX

PL=DL.PartitionEntry()



В Си вроде так можно.
Не могу сказать что знаю все, но и за дурака прошу меня не считать.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16095
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: IOCTL_DISK_GET_DRIVE_LAYOUT_EX возможно ли на vb6 ?!

Сообщение Хакер » 06.03.2012 (Вт) 5:57

sosed213 писал(а):Private Type DRIVE_LAYOUT_INFORMATION_EX
PartitionStyle As PARTITION_STYLE
PartitionCount As Long
Mbr As DRIVE_LAYOUT_INFORMATION_MBR
Gpt As DRIVE_LAYOUT_INFORMATION_GPT

Блин. Дай пойми ты наконец, что нет никакого смысла объявлять Mbr и следом Gpt. Потому что это два поля, идущих подряд, а необходимо два поля, наложенных одно на другое.

Есть куча способов работать с этим. Я не хочу писать их списком, потому что меня раздражает, когда люди не думают сами.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

sosed213
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 150
Зарегистрирован: 13.11.2007 (Вт) 21:19
Откуда: Омск

Re: IOCTL_DISK_GET_DRIVE_LAYOUT_EX возможно ли на vb6 ?!

Сообщение sosed213 » 06.03.2012 (Вт) 6:04

Хакер писал(а): нет никакого смысла объявлять Mbr и следом Gpt. Потому что это два поля, идущих подряд, а необходимо два поля, наложенных одно на другое.

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

Но раз много способов, буду искать. Спасибо.
Не могу сказать что знаю все, но и за дурака прошу меня не считать.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16095
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: IOCTL_DISK_GET_DRIVE_LAYOUT_EX возможно ли на vb6 ?!

Сообщение Хакер » 06.03.2012 (Вт) 6:07

Скажу только две базовые вещи. Данные из одним образом объявленной структуру можно скопировать в другим образом объявленную структуру. Способом копировать много.

Указатель на одним образом объявленную структуру (или даже встроенный тип) можно навешать на любые данные. Способов навешать указатель — много.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

sosed213
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 150
Зарегистрирован: 13.11.2007 (Вт) 21:19
Откуда: Омск

Re: IOCTL_DISK_GET_DRIVE_LAYOUT_EX возможно ли на vb6 ?!

Сообщение sosed213 » 06.03.2012 (Вт) 6:12

Я вот и думал что надо как то одну структуру переводить в другую, используя указатели (как я понимаю, указатель это адрес в памяти, обозначающий начало структуры или переменной), но не понятно как одни данные переходят в другие, например CopyMemory разве может это сделать.
Не могу сказать что знаю все, но и за дурака прошу меня не считать.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16095
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: IOCTL_DISK_GET_DRIVE_LAYOUT_EX возможно ли на vb6 ?!

Сообщение Хакер » 06.03.2012 (Вт) 7:12

sosed213 писал(а):CopyMemory

Может, но это не путь с указателями, это первый путь (с копированием), и лучше использовать LSet вместо CopyMemory.

Код: Выделить всё
Type DATA_AS_FOUR_BYTES
     b1 as byte
     b2 as byte
     b3 as byte
     b4 as byte
End Type

Type DATA_AS_TWO_INTS
    i1 as integer
    i2 as integer
end type
...
Dim foo as DATA_AS_FOUR_BYTES
Dim bar as DATA_AS_TWO_INTS

foo.b1 = 11
foo.b2 = 22
foo.b3 = 33
foo.b4 = 44

lset bar = foo

'Смотри значения bar.i1 и bar.i2
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2751
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 06.03.2012 (Вт) 21:59

А нужные структуры одинакового размера?

sosed213
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 150
Зарегистрирован: 13.11.2007 (Вт) 21:19
Откуда: Омск

Re: IOCTL_DISK_GET_DRIVE_LAYOUT_EX возможно ли на vb6 ?!

Сообщение sosed213 » 07.03.2012 (Ср) 4:16

Не проверял, но судя по описанию разного.

Странно, раньше никогда не видел ф-ю LSet. Нашел описание тут http://server2009.ucoz.ru/publ/1-1-0-14 и тут http://msdn.microsoft.com/en-us/library/9efbwtwx(v=VS.71).aspx но хочется знать что именно она делает с памятью, прям побайтно.

Хакер, из вашего примера переменная foo остается неизменной, это то и понятно, но bar приняла значение 5643 и 11297 , как??? Есть описание что именно происходит при LSet ?

Код: Выделить всё
Private Type DATA_AS_FOUR_BYTES
     b1 As Byte
     b2 As Byte
     b3 As Byte
     b4 As Byte
End Type

Private Type DATA_AS_TWO_INTS
    i1 As Integer
    i2 As Integer
End Type

Dim foo As DATA_AS_FOUR_BYTES
Dim bar As DATA_AS_TWO_INTS

foo.b1 = 11
foo.b2 = 22
foo.b3 = 33
foo.b4 = 44

LSet bar = foo
Не могу сказать что знаю все, но и за дурака прошу меня не считать.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16095
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: IOCTL_DISK_GET_DRIVE_LAYOUT_EX возможно ли на vb6 ?!

Сообщение Хакер » 07.03.2012 (Ср) 4:17

sosed213 писал(а):Странно, раньше никогда не видел ф-ю LSet.

Это не функция.

sosed213 писал(а):Хакер, из вашего примера переменная foo остается неизменной, это то и понятно, но bar приняла значение 5643 и 11297 , как??? Есть описание что именно происходит при LSet ?

Происходит копирование содержимого foo в bar.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

sosed213
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 150
Зарегистрирован: 13.11.2007 (Вт) 21:19
Откуда: Омск

Re: IOCTL_DISK_GET_DRIVE_LAYOUT_EX возможно ли на vb6 ?!

Сообщение sosed213 » 10.03.2012 (Сб) 12:25

Хочу отписаться о результатах проделанной работы.
Мне удалось заставить работать управляющий код IOCTL_DISK_GET_DRIVE_LAYOUT_EX, структура DRIVE_LAYOUT_INFORMATION_EX заполняется правильно и почти полностью.
Честно говоря иногда делалось подгоном, например в некоторые структуры вставлял "апендиксы" чтобы подогнать данные.

Так например должно быть:
Код: Выделить всё
typedef struct {
  PARTITION_STYLE PartitionStyle;
  LARGE_INTEGER   StartingOffset;
  LARGE_INTEGER   PartitionLength;
  DWORD           PartitionNumber;
  BOOLEAN         RewritePartition;
  union {
    PARTITION_INFORMATION_MBR Mbr;
    PARTITION_INFORMATION_GPT Gpt;
  };
} PARTITION_INFORMATION_EX;


А я делаю:

Код: Выделить всё
Private Type PARTITION_INFORMATION_EX
    PartitionStyle                  As Long
   
    Apendix                         As Long 'Apendix
   
    StartingOffset                  As LARGE_INTEGER ' LARGE_INTEGER
    PartitionLength                 As LARGE_INTEGER
    PartitionNumber                 As Long
    RewritePartition(3)             As Byte '0..3
   
    UNION_PARTITION_INFORMATION As PARTITION_INFORMATION_GPT
End Type


Спасибо Хакеру за помощь с оператором Lset.

Знаю, что подгон, это худший вариант, но это последниее к чему я пришел спустя две ночи.
Прикладываю файл exe который получился, если кому нужен листинг, пишите.
Многое до сих пор остается непонятным, например что такое Disk Partition Types http://msdn.microsoft.com/en-us/library/windows/desktop/aa363990(v=vs.85).aspx и почему там где NTFS программа возвращает PARTITION_IFS (0x07). Хотя это может результат подгона. И еще в описании к PARTITION_INFORMATION_EX сказано что RewritePartition всегда должно быть равно True, у меня же все время какая то ерунда.
Вложения
IOCTL_DISK_GET_DRIVE_LAYOUT_EX.zip
(8.87 Кб) Скачиваний: 170
Не могу сказать что знаю все, но и за дурака прошу меня не считать.

sosed213
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 150
Зарегистрирован: 13.11.2007 (Вт) 21:19
Откуда: Омск

Re: IOCTL_DISK_GET_DRIVE_LAYOUT_EX возможно ли на vb6 ?!

Сообщение sosed213 » 10.03.2012 (Сб) 12:49

С типом разделов разобрался, это тоже самое что и у Diskpart'a когда спрашиваешь Detail Partition.
Не могу сказать что знаю все, но и за дурака прошу меня не считать.

След.

Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 4

    TopList  
cron