sosed213 писал(а):число будет записано в обратном порядке
sosed213 писал(а):Пока я вижу только один выход, написать 2 функции конвертации: ByteToLong и LongToByte.
sosed213 писал(а):B(1 to 3)
Ну вообще форматирование, т.е. нанесение разметки бывает разным, то что делается на заводе - это нанесение разметки диска, т.е. так называемое низкоуровневое форматирование, то что делается на пользовательском уровне - это тоже разметка, только уже под файловую систему. Таким образом это две различные системы разметки и сравнивать их вообще некорректно. Это все равно что сравнивать мягкое с круглым.sosed213 писал(а):Первое, и правильное форматирование происходит на заводе производителя HDD (когда создаются сектора на поверхности магнитного диска).
Что касается файлов то они не затираются при любом способе форматирования, если и затираются, то только если это место перезаписывается другой информацией, так как это место помечается как свободное. Информацию можно восстановить одинаково легко, что после быстрого форматирования, хоть после полного. Если надо уничтожить информацию, то об этом нужно позаботиться отдельно. Вообще полное форматирование отличается от быстрого, тем что система проводит контроль поверхности диска выявляя Bad Sector, при быстром форматировании этого не происходит.sosed213 писал(а):При полном же форматировании, так же выполняется команда DeviceIoControl(hDevice, IOCTL_DISK_VERIFY,...), а затем все файлы, указанные в таблице файлов, затираются по отдельности, а в конце процесса и сама таблица файлов затирается.
Это особенность работы не какой-то там архитектуры, а особенность процессора вообще. И эта особенность очень логична, достаточно представить массив ячеек памяти длинной строкой, где ячейки адресуются 00000000, 00000001, 00000002, 00000003 и т.д. А теперь попробуй например в первую ячейку записать байт. Все прекрасно, байт записан, так как он занимает как раз одну ячейку. Далее тебе нужно записать число занимающее два байта, три байта, четыре и т.д., а может вообще это будет строка. Так вот с точки зрения машинной логики число размером два байта или более удобно записывать именно так сначала младшие байты, затем старшие. Т.е. все очень логично, младшие байты занимают младшие ячейки памяти (с меньшими адресами) старшие с большими адресами. Для человека это конечно не очень удобно для восприятия, но для машины в самый раз. Человек, который знает эту особенность, тоже вполне к этому адаптируется и впоследствии воспринимает это тоже вполне естественно. Таким образом твою задачу можно решить множеством способов, не используя те извращения которые ты описал.sosed213 писал(а):Есть ли "простой" способ инвертирования и преобразования массива байт B(1 to 3) в Long число?Поясню. При разборе MBR столкнулся с тем что смещение и размер каждого раздела записано в HEX-виде, и в обратном порядке (видимо особенность какой то там архитектуры).
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
ger_kar писал(а):Это особенность работы не какой-то там архитектуры, а особенность процессора вообще.
Спорное утверждение в части архитектуры X86, потому, что такой порядок существует не только на процессорах семейства X86 и появился задолго до появления X86. X86 - это всего лишь частный случай из множества.Порядок от младшего к старшему
Порядок от младшего к старшему или (англ. little-endian, дословно: «малоконечный», «мелкоконечный»), о происхождении термина ниже): , запись начинается с младшего и заканчивается старшим. Этот порядок записи принят в памяти персональных компьютеров с x86-процессорами, в связи с чем иногда его называют интеловский порядок байтов (по названию фирмы-создателя архитектуры x86).
Из написанного вообще непонятно о какой архитектуре идет речь, я уточнил, что это особенность работы процессора, углубляться дальше не стал.sosed213 писал(а):Поясню. При разборе MBR столкнулся с тем что смещение и размер каждого раздела записано в HEX-виде, и в обратном порядке (видимо особенность какой то там архитектуры).
sosed213 писал(а):Используется недокументированная функция FormatEx из библиотеке FMIFS.DLL, но она требует прав администратора.
И что даже флешку нельзя без админа форматнуть? Надо провести эксперимент. Попробовать форматнуть флеху и внешний хард будучи под юзером. То что касается встроенного харда, то все понятно, а вот внешние носители... Странно, что раньше у меня такой вопрос даже не возникал.Хакер писал(а):Кем нужно быть, чтобы всерьёз допускать хотя бы возможность, что форматирование можно будет сделать не-из-под-админа?
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;
Ну видимо так и есть, у FMIFS.DLL библа iFsUtil.dll в импортах присутствует и у format.com она также есть.sosed213 писал(а):Я так понял, форматирование занимается iFsUtil.dll, a format.com и FMIFS.DLL всего лишь надстройки над ней.
Ну вообще параметры подходят и по количеству и по размерности и по логике, если посмотреть в дизассемблере.sosed213 писал(а):Вот что то нарыл, но не подтверждено
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
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)
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)
Сейчас этот форум просматривают: AhrefsBot, Google-бот, SemrushBot и гости: 67