
- •Введение
- •Тема 1. Двухпросмотровый ассемблер
- •Тема 2. Com-сервер для обработки и хранения результатов тестирования.
- •Тема 3. Дисковая утилита для просмотра fat.
- •Тема 4. Сервер автоматизации ole.
- •Тема 5. Дефрагментатор файловой системы.
- •Элемент каталога для короткого имени
- •Тема 6. Монитор системных ресурсов для Windows 98/2000.
- •Тема 7. Менеджер процессов и потоков для Windows 98/2000.
- •Тема 8. Файловый менеджер для Windows 98/2000/nt.
- •Тема 9. Формат исполняемого pe-файле в Windows 98/nt.
- •Тема 10. Запуск в определенное время различных программ.
- •Тема 11. Утилита, сохраняющая в файле информацию из системного реестра о программах, установленных на компьтере.
- •Тема 12. Утилита для очистки системного реестра Windows.
- •Тема 13. Утилита, отслеживающая изменения в файловой системе Windows в заданных каталогах.
- •Тема 14. Просмотрщик таблицы разделов и fat.
- •Тема 15. Утилита MaxSplitter
- •Тема 16. Утилита удаленного администрирования.
- •Тема 17. Простая почтовая программа на основе протокола smtp.
- •Тема 18. Ftp - клиент.
- •Тема 19. Ftp - сервер.
- •Тема 20. Системные сервисы Windows nt/2000.
- •Литература
- •Приложение 1. Tcp/ip Программирование с использованием WinSock
- •Создание и использование сокетов
- •Закрытие сокета
- •Функция shutdown()
- •Методы прекращения работы гнезда
- •Функция bind()
- •Приложение может послать запрос на соединение с помощью функции
- •Отправка и прием данных через сокеты потоков
- •Ожидание и обработка событий
- •Использование функции wsaAsyncSelect()
- •Приложение 2. Команды ftp
- •Приложение 3. Команды smtp
- •Приложение 4. Заголовки почты smtp
Тема 4. Сервер автоматизации ole.
Техническое задание.
Разработать сервер автоматизации OLE, реализующий COM-интерфейс IDispatch. Информационное наполнение сервера продумать самостоятельно.
Тема 5. Дефрагментатор файловой системы.
Техническое задание.
Разработать программу для дефрагментации файловой системы. Проверить работу программы для файловой системы на гибком диске.
Методические указания.
Формат каталога для имени файла в формате 8.3
Формат хранения коротких имен в Windows 95 тот же (8.3), что в DOS и 16 разрядных версиях Windows. Каждому файлу на любом диске соответствует 32-байт элемент каталога, содержащий имя файла, его атрибуты (скрытый, системный, только для чтения и т.д.), дату и время, а также прочую информацию. Когда вы набираете команду DIR для просмотра некоторого каталога, на экран выводится информация из таких элементов в удобной для чтения форме.
Рис 1. Формат хранения на диске коротких имен файлов длиной 32 байт.
Элемент каталога для короткого имени
Время создания или последнего
изменения файла (2 байт)
Биты 0-4: Число секунд, деленное
Атрибуты файла (1 байт) на 2 (0-29)
Бит 0: Только для чтения Биты 5-10: Минуты (0-59)
Бит 1: Скрытый Биты 11-15: Часы (0-23)
Бит 2: Системный | Дата создания или последнего
Бит 3: Метка тома | изменения файла (2 байт)
Бит 4: Подкаталог | Биты 0-4: День месяца (0-31)
Бит 5: Архивный | Биты 5-10: Месяц (1-12)
Бит 6: Зарезервировано | Биты 11-15: Год (относительно
Бит 7: Зарезервировано | 1980)
| | | |
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |
| | | Зарезервировано | |
8 символов для | (10 байт) | Размер файла (4 байт)
имени файла | |
(8 байт) 3 символа Номер начального
для расширения кластера (2 байт)
файла (3 байт)
Первые 11 байт элемента каталога заняты восьмисимвольным именем файла и трехсимвольным расширением. В эти поля помещаются 8 разрядные ASCII-коды соответствующих символов. Если длина имени менее восьми символов, а расширение менее трех символов, то оставшаяся часть заполняется пробелами (код ASCII - 32). Следующий байт отводится под битовые флажки - атрибуты файла. В последних 10 байт элемента каталога хранятся: дата и время создания или последнего изменения файла; номер его начального кластера и длина файла в байтах. Номер начального кластера - это 16-бит значение, обозначающее первый кластер цепочки, где записано содержание файла.
Перед тем как прочитать или записать файл, ОС сверяется с соответствующей записью каталога, чтобы выяснить номер начального кластера. Если под текущий файл отведено на диске более одного кластера, то номера остальных извлекаются из находящейся на диске структуры, именуемой таблицей размещения файлов, или FAT (file allocation table).
Информация о файлах корневого каталога размещается в некоторой фиксированной специально для этого области на диске. Подчиненные каталоги представляют собой особые файлы, в записи в каталоге высшего уровня для которых четвертый бит байта атрибутов указывает на то, что это подкаталоги. Размер области на диске, отведенной под элементы корневого каталога, фиксирован и задается при форматировании диска; он не может быть изменен без применения специального программного обеспечения. Именно по этой причине максимальное число файлов и подкаталогов корневого каталога всегда ограничено (для большинства жестких дисков - 512). Число же записей в подчиненных каталогах, как, впрочем, и размер файлов для их описания, не ограничено. Единственный, влияющий на количество файлов и подкаталогов фактор - наличие свободного пространства на диске.
Каталог для хранения длинных имен файлов
Для решения проблемы использования длинных имен при соблюдении полной совместимости со старыми версиями прикладных программ, подготовленными для DOS и Windows, разработчики Windows 95 нашли решение. Как правило, прикладные программы (за исключением специальных утилит, использующих для обращения к диску операции низкого уровня - например, Norton Disk Doctor) обращаются к ОС за именами файлов и каталогов не путем прямого считывания с диска соответствующих записей, а через специальные, встроенные в ОС функции. В результате тестирования специалистами Microsoft обнаружено, что, если у некоторого элемента каталога установлена "нереальная" комбинация битов атрибутов: "только для чтения", "скрытый", "системный", "метка тома" - другими словами, если байту атрибутов некоторого элемента каталога присвоить значение 0Fh, - тогда любые функции имеющиеся во всех существующих версиях DOS и Windows (предшествующих Windows 95), не "заметят" такого элемента каталога, словно его нет.
В итоге для Windows 95 проблема была решена следующим образом: для каждого файла и подкаталога имеются два имени: короткое, "понятное" всем прикладным программам, и длинное - для приложений Windows 95 и тех программ, в которых предусмотрена возможность работы с длинными именами. Для хранения коротких имен в формате 8.3 используются обычные 32-байт записи. Короткие имена Windows создает из длинных имен, отсекая шесть старших символов и добавляя в конце этого базового имени "1". Если же существует еще одно имя, состоящее из тех же шести символов, то этот номер увеличивается на единицу. Расширение файла сохраняется прежним. Если в имени встречается символ, не допустимый в предыдущих версиях Windows и DOS, он заменяется на знак "подчеркивание" (_).
Длинные имена (LFN) хранятся в специально отформатированных 32-байт записях, байт атрибутов у которых равен 0Fh. Для конкретного файла или подкаталога непосредственно перед его единственной записью каталога с его именем в формате 8.3 находится группа из одной или нескольких записей, представляющих длинное имя. Каждая такая запись содержит часть длинного имени файла не более 13 символов, и ОС составляет полное длинное имя из всех записей.
Какие из этого следуют выводы? Если файл с длинным именем записать на гибкий диск, а затем прочитать его на компьютере, работающем под управлением DOS или Windows 3.x, то ОС распознает лишь короткое имя файла и проигнорирует все записи каталога для длинного имени. А поскольку в данном случае ОС "понятно" лишь короткое имя, прикладная программа, запросившая у нее имя файла или подкаталога, не получит неожиданно длинное имя
В Windows 95 прикладным программам для 16 разрядных систем DOS и Windows, как и прежде, "видны" лишь короткие имена файлов, поскольку в ответ на их запросы ОС передает имена файлов и подкаталогов в формате 8.3. Чтобы "добраться" до длинных имен, программа должна обратиться к системным специальным функциям. Во всех прикладных программах для 32 разрядной версии Windows эти функции вызываются по умолчанию, поэтому они автоматически получают доступ к длинным именам.
На рис. 2 показана структура записи каталога для длинного имени файла. Эти имена хранятся в формате Unicode, т. е. для каждого символа выделяется 2 байт (в отличие от ASCII, где лишь 1 байт). Символы, из которых состоит имя файла, распределяются по трем отдельным полям: первое - длиной 10 байт (5 символов), второе - 12 байт (6 символов) и третье - 4 байт (2 символа). В младших пяти битах первого байта записи содержится порядковый номер, указывающий позицию данной записи каталога относительно остальных элементов, представляющих длинное имя данного файла. Например, если для записи длинного имени требуется три элемента каталога, то для первого из них порядковый номер будет равен 1, для второго - 2, для третьего - 3. Шестой бит первого байта третьего элемента задается равным 1, что означает, что текущий элемент - последний в цепочке.
Положение поля атрибутов в записях каталога как для длинных имен, так и формата 8.3 одинаково. Объясняется это тем, что, до тех пор пока файловая система не ознакомится с содержимым байта атрибутов, она не "знает", с каким типом записи она имеет дело в данный момент. Поле с номером начального кластера также находится на прежнем месте, однако в записях каталога для длинных имен его значение всегда равно 0. Поле с указанием типа также содержит 0. Байт с 8 бит контрольной суммой для длинного имени рассчитывается как остаток от деления на 256 суммы значений определенных полей соответствующей записи в каталоге формата 8.3. В Windows 95 контрольная сумма используется для выявления "осиротевших" или испорченных записей в каталоге для длинных имен.
Рис. 2. Элемент каталога для длинного имени
Порядок следования (1 байт)
Биты 0-4: Порядковый номер (1-31)
Бит 5: По видимому, не используется (всегда 0)
Бит 6: 1=конечный элемент текущего длинного имени
Бит 7: По видимому, не используется (всегда 0)
| Номер начального кластера
| (2 байт, всегда 0)
| |
| Первые пять символов Следующие шесть символов| Следующие два символа
| длинного имени (10 байт) длинного имени (12 байт)| длинного имени
| | | | | (4 байт) |
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |
| | |
| | |
| | Контрольная сумма (1 байт)
| Указатель типа (1 байт, всегда 0)
Атрибуты файла (1 байт, всегда 0Fh)
Формирование записи для длинного имени происходит даже в том случае, если оно достаточно коротко и годится для формата 8.3, поскольку для него предусматривается регистр, а для короткого - нет. На рис. 3 показано шестнадцатеричное представление элементов каталога для файла с именем Budget.xls. Короткое имя (BUDGET.XLS) заносится в запись формата 8.3. Непосредственно перед ней располагается запись для длинного имени, содержащая имя Budget.xls. Порядковый номер данного элемента каталога длинного имени равен 1, шестой бит - также 1, что означает, что текущий элемент не только первый, но и последний. Поскольку записи в каталоге для длинного имени всегда размещаются непосредственно перед соответствующим элементом каталога формата 8.3, Windows 95, обнаружив для требуемого файла или подкаталога элемент каталога в формате 8.3, легко находит его длинное имя.
Рис. 3. Шестнадцатиричное представление элементов каталога для файла с именем Budget.xls
41 42 00 75 00 64 00 67-00 65 00 0F 00 D8 74 00 AB.u.d.g.e....t.
2E 00 78 00 6C 00 73 00-00 00 00 00 FF FF FF FF ..x.l.s.........
42 55 44 47 45 54 20 20-58 4C 53 20 00 96 34 87 BUDGET XLS ..4.
70 20 70 20 00 00 54 48-70 20 C9 03 A9 1D 00 00 p p ..THp ......
Рис. 4 иллюстрирует, как бы выглядели элементы каталога для короткого и длинного имени файла, если вместо Budget.xls его назвать Budget for Fiscal Year 1996.xls. Поскольку в этом случае длинное имя состоит из 31 символа, потребуется 3 записи для длинного имени. Обратите внимание на обратный порядок положения элементов: запись с первыми 13 символами длинного имени помещается непосредственно перед коротким именем, следующие 13 символов - перед этой записью; и наконец, в самом начале идет запись, содержащая последние пять символов.
Рис. 4. Шестнадцатиричное представление элементов каталога для файла с именем Budget for Fiscal Year 1996.xls
43 36 00 2E 00 78 00 6C-00 73 00 0F 00 E0 00 00 C6...x.l.s......
FF FF FF FF FF FF FF FF-FF FF FF FF FF FF FF FF ................
02 73 00 63 00 61 00 6C-00 20 00 0F 00 E0 59 00 .s.c.a.l. .. .y.
65 00 61 00 72 00 20 00-31 00 00 00 39 00 39 00 e.a.r. .1...9.9.
01 42 00 75 00 64 00 67-00 65 00 0F 00 D8 74 00 .B.u.d.g.e....t.
20 00 66 00 6F 00 72 00-20 00 00 00 46 00 69 00 .f.o.r. ....F.i.
42 55 44 47 45 54 7E 31-58 4C 53 20 00 4A CF 88 BUDGET~1XLS .J..
70 20 70 20 00 00 54 48-70 20 C9 03 A9 1D 00 00 p p ..THp ......