· Начало · Отвђтить · Статистика · Поиск · FAQ · Правила · Установки · Язык · Выход · WASM.RU · Noir.Ru ·

 WASM Phorum —› WASM.WIN32 —› Вопро для Four-F

Посл.отвђт Сообщенiе


Дата: Мар 6, 2004 18:25:56

Есть библиотека KmdKit, в которой есть пример RamDisk-а работает нормально только в w2k (русской); в xp (русской)-работает, но в "Мой компьютер" не появляется новый диск, ну это половина беды проблема в том, что в xp (англ.) если ввести "g:\" (для примера) винда выдает ответ "Incorrect function" :( При более детальной проверке нашел, что в DispatchControl передается IoControlCode=7405ch 7h-девайс, 1h-FILE_READ_ACCESS, 17h-неизвестная функция, 0h-METHOD_BUFFERED Вот "засада", что за функция не понятно. Если на запрос отвечать
[edi].Parameters.DeviceIoControl.IoControlCode == 7405ch
mov [esi].IoStatus.Status, STATUS_SUCCESS
and [esi].IoStatus.Information, 0
то получаем ответ системы "том не содержит распознаваемую систему. Проверте, что диск не испочен...." не могу по русски написать, а по англицки... далеко бежать до другой машины. Вопрос - что за функция и что не учтено в xp англ.


Дата: Мар 7, 2004 13:12:44 · Поправил: Four-F

07405Ch - это
#define IOCTL_DISK_GET_LENGTH_INFO CTL_CODE(IOCTL_DISK_BASE, 0x0017, METHOD_BUFFERED, FILE_READ_ACCESS)

На кириллической ХР ещё влетает
00070048 = IOCTL_DISK_GET_PARTITION_INFO_EX
002D0C14 = IOCTL_STORAGE_GET_HOTPLUG_INFO
их, похоже, тоже придется обрабатывать.

В общем, буду разбираться когда время найду. Если раньше меня разберешься, дай знать, пожалуйста.

ЗЫ: Спасибо за наколку.

ЗЗЫ: Какие файловые системы на твоих машинах?


Дата: Мар 9, 2004 13:26:57

Есть еще одна команда в xp (англ.) 4D0008. Огромная просьба выслать winioctl.h для хр (где описаны эти коды). У меня DDK только для 2000 :( адрес steelrat собака inbox точка ru IOCTL_DISK_GET_PARTITION_INFO_EX и другие описаны в MSDN - это не проблема. Засада именно в этоих кодах :(
А файловая система только NTFS


Дата: Мар 9, 2004 15:20:05

Ушло.


Дата: Мар 11, 2004 17:20:20

Рассказ мой, о мытарствах и скитаниях, будет не долгим, хотя и поучительным Ж:)
Все началось с того, что в моей w2k рус. драйвер, подобный RamDisk из KmdKit увжаемого Four-F, работал

на все 100. Возникла идея поверить это драйвер на других виндах XP рус. и англ. Парадокс, но там он

отказался работать нормально, если посмотреть старый мой вопрос

[url=]http://www.wasm.ru/forum/index.php?action=vthread&forum=4&topic=5147[/url] драйвер при отсутствии

файла на диске создавал новый, исполняя ф-цию
invoke ZwCreateFile, addr hDiskFile, SYNCHRONIZE, addr oa, addr iosb, 0, FILE_ATTRIBUTE_NORMAL,\
0, FILE_CREATE, FILE_SYNCHRONOUS_IO_NONALERT, NULL, 0
.if eax==STATUS_SUCCESS
....

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

"FILE_READ_DATA+FILE_WRITE_DATA" чтобы указать системе, что будем читать и записывать - фикция, но этот

код работал нормально и создавал файл, и читал, и записывал. Однако в ХР рус. работало как положено,

при записи "ERROR_ACCESS_DENIED", хотя чтение разрешалось. Вопрос - что это дыра в системе w2k pro рус.

(sp4), недочет в ядре или у меня просто "глюки" ?
Дальше стало интереснее Ж:) (Спасибо Марку Руссиновичу за DebugView) При входе в DispatchControl

драйвера я обнаружил, что ХР рус. подает IoControlCode несколько не те, которые были в w2k pro рус. но

драйвер работал нормально с учетом исправлений выше изложенной особенности файловой системы. Самое

интересное, что в ХР англ. ситема с драйвером отказывалась работать "Invalid function" и все. При

более детальном рассмотрении нашёл, что ХР англ. делает верификацию, всякие проверки...
IOCTL_DISK_CHECK_VERIFY
IOCTL_DISK_IS_WRITABLE
IOCTL_DISK_MEDIA_REMOVAL
IOCTL_DISK_GET_DRIVE_GEOMETRY
повторяя это 5 раз (в w2k 2 раза) и потом подает интересную команду :)
IOCTL_DISK_GET_LENGTH_INFO
На MSDN написано, что драйвер должен возвращать длину диска в байатах, в структуре

GET_LENGTH_INFORMATION. Интересное "кино" если знаешь геометрию диска, просто прикинув даже на

калькуляторе можно определить его размер Ж:) Может что-то не так я понял... Зачем делать то, что уже

сделано.
Подолжим дальше, ведь диск так и не хотел откликаться, но дальше винда ругалась матными словами, что не

может "прилудить" драйвер файловой системы и при этом постоянно тычила в драйвер вопросом

IOCTL_MOUNTDEV_QUERY_DEVICE_NAME в книге "Внутренне устройство Windows 2000" на стр. 530 (глава

Монтирование томов) написано как происходит монтирование тома и за это отвечает File System Recognizer

считывая загрузочную запись с диска. Получается следующее w2k рус. и хр рус. считывают 0-й сектор с

диска для распознавания системы, а хр англ. подавайте все на "блюдечке с голубой каемочкой" - ленивая

винда :)
И так рассмотрим IOCTL_MOUNTDEV_QUERY_DEVICE_NAME мы должны возвратить структуру MOUNTDEV_NAME в

которой находится, если логически рассуждать, имя файловой системы на диске... (Спасибо Марку

Руссиновичу за WinObject) нашел нечто подходящее \FileSystem\FastFat - драйвер файловой системы FAT. И

так, вставив в DispatchControl обработку ответа про файловую систему видим о чудо - хр англ. заработала

как положено...

P.S. Обязательные запросы которые должен обрабатывать драйвер:

IOCTL_DISK_GET_DRIVE_GEOMETRY или IOCTL_DISK_GET_MEDIA_TYPES
IOCTL_DISK_GET_PARTITION_INFO
IOCTL_DISK_GET_LENGTH_INFO
IOCTL_MOUNTDEV_QUERY_DEVICE_NAME
IOCTL_DISK_CHECK_VERIFY или IOCTL_STORAGE_CHECK_VERIFY
IOCTL_DISK_IS_WRITABLE
IOCTL_DISK_MEDIA_REMOVAL (если он REMOVAL)

Запросы, без обработки которых все (возможно) винды работают

IOCTL_DISK_GET_PARTITION_INFO_EX
FT_BALANCED_READ_MODE (это я ещё не выянил что за штуковина в MSDN не нашел...)
IOCTL_STORAGE_GET_HOTPLUG_INFO

Еще особое внимание обратите на размер системного буфера, если он мал - не стесьняйтесь отвечайте

STATUS_BUFFER_TOO_SMALL, система его обработает. Иначе BAD_POOL_CALLER Ж:(

P.P.S.
Такое впечатление, что русские программеры, которые русифицировали винды попутно латали дыры и

создавали новые...
Предлагаю на форуме WASM создать раздел например WASM.FEATURE и туда складывать особенности работы ОС

разных версий. Одна такая осбенность работы с файлами в режиме ядра есть (см. выше).


Дата: Мар 13, 2004 03:34:06

Если я всё правильно понял, то щас у тя всё работает как надо в обоих ХР. Так?


Дата: Мар 15, 2004 10:54:34

Конечно работает, это мой дипломный проект :)) Сейчас пытаюсь поставить этот драйвер у всех своих знакомых, на разных виндах (сервис паки) и вроде везде работает...


Дата: Мар 18, 2004 15:20:29

Интересная тема окозалась... Исследовал PGPDisk работает... везде. Версия с прошлого века :( Ей плевать на все версии виндов, даже не предусмотренные в то время. Придется разбираться подробнее...


Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.039