Форматирование раздела API-функциями

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

Форматирование раздела API-функциями

Сообщение sosed213 » 10.04.2012 (Вт) 12:55

Хочу сказать сразу, искал ответ давно и долго, так что особо на ответы не рассчитываю, но как говорится, Вдруг кто знает.

Задача такая: форматировать\отформатировать раздел на жестком диске в выбранной ФС (NTFS или FAT32) API-средствами, зная букву раздела, или номер раздела, или его точку монтирования.

Вот что я уже узнал:
Первое, и правильное форматирование происходит на заводе производителя HDD (когда создаются сектора на поверхности магнитного диска). Эту информацию нашел только в одном месте, и не знаю, стоит ли принимать за правду.

Есть еще 2 способа: Быстрое и Полное.
При быстром форматировании выполняется команда DeviceIoControl(hDevice, IOCTL_DISK_VERIFY,...) для проверки целостности поверхности, а затем стирается таблица файлов, при этом сами файлы остаются лежать на жестком диске, и буду перезаписываться по мере появлении новых файлов.

При полном же форматировании, так же выполняется команда DeviceIoControl(hDevice, IOCTL_DISK_VERIFY,...), а затем все файлы, указанные в таблице файлов, затираются по отдельности, а в конце процесса и сама таблица файлов затирается.

Вот как-то так.

Существует еще такая команда IOCTL_DISK_FORMAT_TRACKS_EX (но на сайте Microsoft сказано "for floppy disk devices only"

Есть еще один момент, но это уже зависит именно от механизма форматирования. Полоса прогресса, или просто проценты. Если форматирование идет в цикле, то грубо говоря прогресс зависит от N1 to N2, другой вариант если используется CallBack, то есть узнаем о прогрессе через ответ из системы.

Есть еще API функция SHFormatDrive она здесь вообще неуместна.


Вот собственно вопрос, как отформатировать раздел? :)


P.S. Уже умею делать аналогичные функции Diskpart'a
Clean -> IOCTL_DISK_DELETE_DRIVE_LAYOUT
Create Partition Primary -> IOCTL_DISK_CREATE_DISK + IOCTL_DISK_SET_DRIVE_LAYOUT_EX
Detail Disk -> IOCTL_DISK_GET_DRIVE_LAYOUT_EX

Подчеркиваю что аналогичные, потому что Diskpart.exe работает через vds.

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

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

Сообщение Qwertiy » 10.04.2012 (Вт) 19:36

Теоретически, можно использовать функцию CreateFile. Где-то попадался соответствующий пример.

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

Re: Форматирование раздела API-функциями

Сообщение sosed213 » 10.04.2012 (Вт) 19:57

Сейчас как раз ковыряю CreateFile , ReadFile, WriteFile, SetFilePointerEx, и еще раз штудирую MBR (Master Boot Record)

:)

P.S. Более менее подходящий пример нашел тут Direct Physical Disk Reads and Binary Editor v2.0
Не могу сказать что знаю все, но и за дурака прошу меня не считать.

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

Re: Форматирование раздела API-функциями

Сообщение sosed213 » 11.04.2012 (Ср) 5:37

Есть ли "простой" способ инвертирования и преобразования массива байт B(1 to 3) в Long число?

Поясню. При разборе MBR столкнулся с тем что смещение и размер каждого раздела записано в HEX-виде, и в обратном порядке (видимо особенность какой то там архитектуры).

Так например размер тома в 20GB будет записан так:
20GB = 21474836480 Байт / 512 Байт/Сектор = 41943040 Секторов = &H02800000

В MBR это конечное число будет записано в обратном порядке:
&H(02.80.00.00)
B(0)=00
B(1)=00
B(2)=80
B(3)=02

Пока я вижу только один выход, написать 2 функции конвертации: ByteToLong и LongToByte.
В первой будет сначала "склеивание" содержимое ячеек в обратном порядке и переводом в HEX
Dim sTmp as String, nTmp as Long
sTmp = "&H" & toHex(B(3)) & toHex(B(2)) toHex(B(1)) toHex(B(0))
nTmp = Clng(Val(sTmp))

Вторая функция будет работать в обратном направлении.

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

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

Сообщение Qwertiy » 11.04.2012 (Ср) 7:48

sosed213 писал(а):число будет записано в обратном порядке

Так и должно быть. Long так и хранится.

sosed213 писал(а):Пока я вижу только один выход, написать 2 функции конвертации: ByteToLong и LongToByte.

Копирование памяти и всё.

sosed213 писал(а):B(1 to 3)

Пересчитай-ка байты.

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

Re:

Сообщение sosed213 » 11.04.2012 (Ср) 7:55

Qwertiy писал(а):
sosed213 писал(а):B(1 to 3)

Пересчитай-ка байты.


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

ger_kar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1957
Зарегистрирован: 19.05.2011 (Чт) 19:23
Откуда: Кыргызстан, Иссык-Куль, г. Каракол

Re: Форматирование раздела API-функциями

Сообщение ger_kar » 11.04.2012 (Ср) 8:31

sosed213 писал(а):Первое, и правильное форматирование происходит на заводе производителя HDD (когда создаются сектора на поверхности магнитного диска).
Ну вообще форматирование, т.е. нанесение разметки бывает разным, то что делается на заводе - это нанесение разметки диска, т.е. так называемое низкоуровневое форматирование, то что делается на пользовательском уровне - это тоже разметка, только уже под файловую систему. Таким образом это две различные системы разметки и сравнивать их вообще некорректно. Это все равно что сравнивать мягкое с круглым.
sosed213 писал(а):При полном же форматировании, так же выполняется команда DeviceIoControl(hDevice, IOCTL_DISK_VERIFY,...), а затем все файлы, указанные в таблице файлов, затираются по отдельности, а в конце процесса и сама таблица файлов затирается.
Что касается файлов то они не затираются при любом способе форматирования, если и затираются, то только если это место перезаписывается другой информацией, так как это место помечается как свободное. Информацию можно восстановить одинаково легко, что после быстрого форматирования, хоть после полного. Если надо уничтожить информацию, то об этом нужно позаботиться отдельно. Вообще полное форматирование отличается от быстрого, тем что система проводит контроль поверхности диска выявляя Bad Sector, при быстром форматировании этого не происходит.
sosed213 писал(а):Есть ли "простой" способ инвертирования и преобразования массива байт B(1 to 3) в Long число?Поясню. При разборе MBR столкнулся с тем что смещение и размер каждого раздела записано в HEX-виде, и в обратном порядке (видимо особенность какой то там архитектуры).
Это особенность работы не какой-то там архитектуры, а особенность процессора вообще. И эта особенность очень логична, достаточно представить массив ячеек памяти длинной строкой, где ячейки адресуются 00000000, 00000001, 00000002, 00000003 и т.д. А теперь попробуй например в первую ячейку записать байт. Все прекрасно, байт записан, так как он занимает как раз одну ячейку. Далее тебе нужно записать число занимающее два байта, три байта, четыре и т.д., а может вообще это будет строка. Так вот с точки зрения машинной логики число размером два байта или более удобно записывать именно так сначала младшие байты, затем старшие. Т.е. все очень логично, младшие байты занимают младшие ячейки памяти (с меньшими адресами) старшие с большими адресами. Для человека это конечно не очень удобно для восприятия, но для машины в самый раз. Человек, который знает эту особенность, тоже вполне к этому адаптируется и впоследствии воспринимает это тоже вполне естественно. Таким образом твою задачу можно решить множеством способов, не используя те извращения которые ты описал.
И так!
Способ первый:
Заводим две структуры:
Код: Выделить всё
Type S_Byte
     b1 as Byte
     b2 as Byte
     b3 as Byte
     b4 as Byte
End Type

Type S_Long
    L1 as Long
End Type


Далее объявляем переменные нужных типов, заполняем первую, присваиваем значение одной структуры другой через
LSet SLong = SByte
Вот собственно и все преобразование. В переменной SLong типа S_Long будет нужное тебе значение типа Long (получилось немного тафтологично :) )

Способ второй (он же и самый быстрый):
Используем функцию GetMem4, описывать что это за функция не буду, на этом форуме про эти ф-ции написано столько, что повторяться не вижу смысла. Почитай сначала здесь.
Так вот второй способ состоит в получении адреса первой переменной типа байт через VarPtr и затем надо просто взять этот адрес и присвоить через GetMem4 значение переменной лонг, вот собственно и все преобразование.
Есть еще и куча других способов, например через 2 массива, ссылающихся на один участок памяти и другие. Описывать лень, думаю двух первых тебе будет вполне достаточно.
Бороться и искать, найти и перепрятать

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

Re: Форматирование раздела API-функциями

Сообщение sosed213 » 11.04.2012 (Ср) 10:40

ger_kar, спасибо большое за разъяснение, особенно про старшие и младшие байты и за подсказку, теперь использую GetMem4 и PutMem4.

Теперь, без проблем, формирую MBR (512 байт) , и загоняю его на диск (SetFilePointer и WriteFile), обновляю инф. о диске (IOCTL_DISK_UPDATE_PROPERTIES).

Вот только разделы создаются, но в формате RAW, то есть тут как раз вернулся к основной задачи, сделать чтобы было NTFS или FAT32.

При создании раздела я указываю смещение и длину раздела (в секторах). Например (но не точно) если раздел начинается с сектора 2048, то нужно перейти по этому адресу, и что то там прописать, может ФС, Размер кластера, Метка (полюбому эта информация хранится где то на диске)


P.S. Если кому нужны исходники, готов выложить.
Не могу сказать что знаю все, но и за дурака прошу меня не считать.

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

Re: Форматирование раздела API-функциями

Сообщение sosed213 » 11.04.2012 (Ср) 14:18

Я нашел способ форматирования в формате NTFS (но это ппц, ща разбираюсь :shock: )

Способ сводится к тому, что надо перейти в нулевой сектор термостатируемого раздела, и переписать все файл с префиксом $
$MFT, $Boot, $Volume...

Так например, в файле $Volume хранится метка тома :)

Источник 1 Источник 2
Последний раз редактировалось sosed213 11.04.2012 (Ср) 14:23, всего редактировалось 1 раз.
Не могу сказать что знаю все, но и за дурака прошу меня не считать.

NashRus
Постоялец
Постоялец
 
Сообщения: 388
Зарегистрирован: 18.03.2006 (Сб) 1:16

Re: Форматирование раздела API-функциями

Сообщение NashRus » 11.04.2012 (Ср) 14:20

ger_kar писал(а):Это особенность работы не какой-то там архитектуры, а особенность процессора вообще.


Как раз это особенность работы какой-то там архитектуры: http://ru.wikipedia.org/wiki/%CF%EE%F0%FF%E4%EE%EA_%E1%E0%E9%F2%EE%E2

ger_kar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1957
Зарегистрирован: 19.05.2011 (Чт) 19:23
Откуда: Кыргызстан, Иссык-Куль, г. Каракол

Re: Форматирование раздела API-функциями

Сообщение ger_kar » 11.04.2012 (Ср) 15:24

Порядок от младшего к старшему

Порядок от младшего к старшему или (англ. little-endian, дословно: «малоконечный», «мелкоконечный»), о происхождении термина ниже): , запись начинается с младшего и заканчивается старшим. Этот порядок записи принят в памяти персональных компьютеров с x86-процессорами, в связи с чем иногда его называют интеловский порядок байтов (по названию фирмы-создателя архитектуры x86).
Спорное утверждение в части архитектуры X86, потому, что такой порядок существует не только на процессорах семейства X86 и появился задолго до появления X86. X86 - это всего лишь частный случай из множества.
sosed213 писал(а):Поясню. При разборе MBR столкнулся с тем что смещение и размер каждого раздела записано в HEX-виде, и в обратном порядке (видимо особенность какой то там архитектуры).
Из написанного вообще непонятно о какой архитектуре идет речь, я уточнил, что это особенность работы процессора, углубляться дальше не стал.
Бороться и искать, найти и перепрятать

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

Re: Форматирование раздела API-функциями

Сообщение sosed213 » 11.04.2012 (Ср) 19:28

Ура!!! Теперь я знаю как отформатировать раздел API функцией!!!! :) :) :)

На самом деле в инете примеров оказалось куча, но приведу один, т.к. он самый красивый :D , т.е. японский.

Используется недокументированная функция FormatEx из библиотеке FMIFS.DLL, но она требует прав администратора.
Есть еще FormatEx2 она может вызывать с ограниченными правами пользователя, правда я не нашел ни одного примера, а было бы забавно на это посмотреть :D
Не могу сказать что знаю все, но и за дурака прошу меня не считать.

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

Re: Форматирование раздела API-функциями

Сообщение Хакер » 11.04.2012 (Ср) 20:11

sosed213 писал(а):Используется недокументированная функция FormatEx из библиотеке FMIFS.DLL, но она требует прав администратора.

Кем нужно быть, чтобы всерьёз допускать хотя бы возможность, что форматирование можно будет сделать не-из-под-админа?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

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

Re: Форматирование раздела API-функциями

Сообщение sosed213 » 11.04.2012 (Ср) 20:22

Хе
:D вот было бы забавно.

Теперь хоть поспать смогу. последние 2 недели ложусь около 5 и встаю в 7.10 :shock:
Не могу сказать что знаю все, но и за дурака прошу меня не считать.

ger_kar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1957
Зарегистрирован: 19.05.2011 (Чт) 19:23
Откуда: Кыргызстан, Иссык-Куль, г. Каракол

Re: Форматирование раздела API-функциями

Сообщение ger_kar » 11.04.2012 (Ср) 21:12

Хакер писал(а):Кем нужно быть, чтобы всерьёз допускать хотя бы возможность, что форматирование можно будет сделать не-из-под-админа?
И что даже флешку нельзя без админа форматнуть? Надо провести эксперимент. Попробовать форматнуть флеху и внешний хард будучи под юзером. То что касается встроенного харда, то все понятно, а вот внешние носители... Странно, что раньше у меня такой вопрос даже не возникал.
Бороться и искать, найти и перепрятать

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

Re: Форматирование раздела API-функциями

Сообщение sosed213 » 12.04.2012 (Чт) 6:19

Существует ли способ выяснить какие, сколько и какого типа, передаются параметры в функцию FormatEx2 библиотеке FMIFS.DLL ??? (при условии что эта функция нигде не документирована, по крайней мере я не нашел)
Не могу сказать что знаю все, но и за дурака прошу меня не считать.

ger_kar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1957
Зарегистрирован: 19.05.2011 (Чт) 19:23
Откуда: Кыргызстан, Иссык-Куль, г. Каракол

Re: Форматирование раздела API-функциями

Сообщение ger_kar » 12.04.2012 (Чт) 9:33

Существует конечно, может даже и не один. Например можно найти приложение вызывающее эту функцию, загнать в отладчик, поставить точку останова да и посмотреть. Сколько параметров передалось видно сразу, что за параметры и их тип здесь уже посложнее будет, придется повозится. Может кто еще способы предложит.
Бороться и искать, найти и перепрятать

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

Re: Форматирование раздела API-функциями

Сообщение sosed213 » 12.04.2012 (Чт) 9:54

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

ger_kar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1957
Зарегистрирован: 19.05.2011 (Чт) 19:23
Откуда: Кыргызстан, Иссык-Куль, г. Каракол

Re: Форматирование раздела API-функциями

Сообщение ger_kar » 12.04.2012 (Чт) 10:34

Ничего сложного, наоборот откроешь для себя много нового и интересного.
Сейчас глянул, дизасcемблер IDAPro сказала следующее:
int __stdcall FormatEx2(UINT uMode, int, int, int, int)
Т.е. функции передается 5 параметров: Первый аргумент UINT и дальше 4 аргумента Int.
Если ты скажешь каким процессом эта функция вызывается, то можно будет в отладчике посмотреть что конкретно передается при разных вызовах и таким образом определиться, что за аргументы.
Посмотрел, консольный Format.com эту функцию не вызывает.
Надо смотреть другие.
Бороться и искать, найти и перепрятать

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

Re: Форматирование раздела API-функциями

Сообщение sosed213 » 12.04.2012 (Чт) 11:02

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

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

Re: Форматирование раздела API-функциями

Сообщение sosed213 » 12.04.2012 (Чт) 11:14

Я так понял, форматирование занимается iFsUtil.dll, a format.com и FMIFS.DLL всего лишь надстройки над ней. :roll:
Не могу сказать что знаю все, но и за дурака прошу меня не считать.

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

Re: Форматирование раздела API-функциями

Сообщение sosed213 » 12.04.2012 (Чт) 11:46

Вот что то нарыл, но не подтверждено

Код: Выделить всё
typedef void (STDAPICALLTYPE *PFORMATEX2)
(IN PWSTR pDrive, IN FMIFS_MEDIA_TYPE dwMediaType, IN PWSTR
pFileSystem,
  IN PFORMATEX2PARAM pFormatEx2Param, IN PFMIFSCALLBACK Callback);
with
typedef struct _FORMATEX2PARAM
{
        int nMajorVersion;
        long nFlags;
        PWSTR pVolumeLabel;
        DWORD dwClusterSize;
        int nVersion;
}FORMATEX2PARAM, *PFORMATEX2PARAM;
Не могу сказать что знаю все, но и за дурака прошу меня не считать.

ger_kar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1957
Зарегистрирован: 19.05.2011 (Чт) 19:23
Откуда: Кыргызстан, Иссык-Куль, г. Каракол

Re: Форматирование раздела API-функциями

Сообщение ger_kar » 12.04.2012 (Чт) 20:10

sosed213 писал(а):Я так понял, форматирование занимается iFsUtil.dll, a format.com и FMIFS.DLL всего лишь надстройки над ней.
Ну видимо так и есть, у FMIFS.DLL библа iFsUtil.dll в импортах присутствует и у format.com она также есть.

sosed213 писал(а):Вот что то нарыл, но не подтверждено
Ну вообще параметры подходят и по количеству и по размерности и по логике, если посмотреть в дизассемблере.
Ты уже пробовал ее вызывать с такими параметрами?
Бороться и искать, найти и перепрятать

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

Re: Форматирование раздела API-функциями

Сообщение sosed213 » 12.04.2012 (Чт) 20:19

Пока еще не побывал. Непонятным остается что передавать в int nMajorVersion, long nFlags, и int nVersion. Знать бы откуда берутся эти параметры.
Не могу сказать что знаю все, но и за дурака прошу меня не считать.

ger_kar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1957
Зарегистрирован: 19.05.2011 (Чт) 19:23
Откуда: Кыргызстан, Иссык-Куль, г. Каракол

Re: Форматирование раздела API-функциями

Сообщение ger_kar » 12.04.2012 (Чт) 20:49

int nMajorVersion - Это скорее всего версия файловой системы.
long nFlags - Это с очень большой вероятностью флаг быстрого/полного форматирования
int nVersion - Даже и не знаю, что-бы это могло быть.
Но если отловить реальный вызов из приложения можно посмотреть, хотя бы что передается, какие значения.
Какое приложение вызывает эту библу?
Бороться и искать, найти и перепрятать

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

Re: Форматирование раздела API-функциями

Сообщение sosed213 » 12.04.2012 (Чт) 21:02

At format start under NTFS from shell.

Код: Выделить всё
ntoskrnl.exe!ExpInterlockedFlushSList+0x126f
ntoskrnl.exe!KeWaitForMultipleObjects+0xcca
ntoskrnl.exe! KeWaitForMutexObject+0x2da
fastfat. SYS+0x16655
fastfat. SYS+0x2ebed
fastfat. SYS+0x3511
fltmgr.sys!FltAcquirePushLockShared+0xc87
fltmgr.sys+0x10dd
eamon.sys+0x3e2d
ntoskrnl.exe! ProbeForWrite+0x52c
ntoskrnl.exe! NtWriteFile+0x7ef
ntoskrnl.exe! ZwUnloadKeyEx+0x20d3
ntdll.dll! ZwWriteFile+0xa
ifsutil.dll! IO_DP_DRIVE:: HardWrite+0x1e0
UEXFAT.dll! EXFAT_VOL:: Initialize+0x659
UEXFAT.dll! EXFAT_VOL:: Initialize+0x32f
UEXFAT.dll! EXFAT_VOL:: Initialize+0xd6
UEXFAT.dll! FormatEx+0x1b2
[b]FMIFS.DLL! FormatEx2+0x579[/b]
SHELL32.dll! PifMgr_CloseProperties+0xe1b
SHELL32.dll!PifMgr_CloseProperties+0x29d5
kernel32.dll! BaseThreadInitThunk+0xd
ntdll.dll! RtlUserThreadStart+0x21



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

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

Re: Форматирование раздела API-функциями

Сообщение sosed213 » 12.04.2012 (Чт) 21:10

Вызываю функцию FormatEx2, и она сразу передает в Callback, параметр FMIFS_Done и Status: False. Это означает что функция работает, но я передаю не правильные параметры.

Код: Выделить всё
Public Type FormatEx2Param
    nMajorVersion   As Long
    nFlags          As Long
    pVolumeLabel    As String
    dwClusterSize   As Long
    nVersion        As Long
End Type

Private Declare Sub FormatEx2 Lib "FMIFS.DLL" _
                        (ByVal pDrive As Byte, _
                        ByVal dwMediaType As Long, _
                        ByVal pFileSystem As Byte, _
                        ByRef pFormatEx2Param As FormatEx2Param, _
                        ByVal Callback As Long)


В структуре FormatEx2Param поле pVolumeLabel пробовал объявлять так pVolumeLabel() As Byte.
В процедуре FormatEx2, пробовал так ByRef pFormatEx2Param As FormatEx2Param и ByVal pFormatEx2Param As Any
Не могу сказать что знаю все, но и за дурака прошу меня не считать.

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

Re: Форматирование раздела API-функциями

Сообщение sosed213 » 12.04.2012 (Чт) 21:37

"Офигенный" момент функции FormatEX, в качестве первого аргумента DriveRoot можно указывать как букву диска (например Q:\) так и ее точку монтирования (\\?\Volume{b79a4c54-832b-11e1-94de-005056c00008}) :D
Не могу сказать что знаю все, но и за дурака прошу меня не считать.

ger_kar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1957
Зарегистрирован: 19.05.2011 (Чт) 19:23
Откуда: Кыргызстан, Иссык-Куль, г. Каракол

Re: Форматирование раздела API-функциями

Сообщение ger_kar » 12.04.2012 (Чт) 21:48

Ну параметры передаются не правильно, во первых все параметры длиной 4 байта, т.е. long, никаких Byte там быть не должно!
Первый параметр - указатель на юникодовую строку - имя диска, можно объявить ByVal ... As Long, строку передавать так StrPtr(sString).
Второй параметр - Энумерация типа диска, тут все правильно у тебя.
Третий параметр - Файловая система т.е. опять указатель на сроку, как и в первом параметре. Строка вида "NTFS", "FAT32" и т.д.
Далее уже понятно это указатель на структуру и указатель на функцию.
Бороться и искать, найти и перепрятать

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

Re: Форматирование раздела API-функциями

Сообщение sosed213 » 12.04.2012 (Чт) 22:09

Сделал вот так:

Код: Выделить всё
Private Declare Sub FormatEx2 Lib "FMIFS.DLL" _
                        (ByVal pDrive As Long, _
                        ByVal dwMediaType As Long, _
                        ByVal pFileSystem As Long, _
                        ByRef pFormatEx2Param As Any, _
                        ByVal Callback As Long)


    Call FormatEx2(ByVal StrPtr(sDriveRoot), _
                  FMIFS_HARDDISK, _
                  ByVal StrPtr(sFS), _
                  ByVal VarPtr(vFormat), _
                  AddressOf Callback.FormatExCallBack)


и результат пока стабильный, т.е. нерабочий :)


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

След.

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

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

Сейчас этот форум просматривают: Google-бот, Yandex-бот и гости: 40

    TopList