|
|
| Посл.отвђт | Сообщен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 |