Методические указания к курсовой работе по дисциплине «Системное программирование и операционные системы»




НазваниеМетодические указания к курсовой работе по дисциплине «Системное программирование и операционные системы»
страница4/11
Дата публикации05.03.2013
Размер1.32 Mb.
ТипМетодические указания
uchebilka.ru > Математика > Методические указания
1   2   3   4   5   6   7   8   9   10   11
^

Аппаратное прерывание клавиатуры.


Клавиатура подключена к линии прерывания IRQ1. Этой линии соответствует прерывание INT 09h.

Клавиатурное прерывание обслуживается модулями BIOS. Драйверы клавиатуры и резидентные программы могут организовывать дополнительную обработку прерывания INT 09h. Для этого может быть использована цепочка обработчиков прерывания. В первой книге первого тома мы приводили примеры расширения обработчика прерывания INT 09h.

Как работает стандартный обработчик клавиатурного прерывания, входящий в состав BIOS?

Этот обработчик выполняет следующие действия:

  • читает из порта 60h скан-код нажатой клавиши;

  • записывает вычисленное по скан-коду значение ASCII-кода нажатой клавиши в специальный буфер клавиатуры, расположенный в области данных BIOS;

  • устанавливает в 1 бит 7 порта 61h, разрешая дальнейшую работу клавиатуры;

  • возвращает этот бит в исходное состояние;

  • записывает в порт 20h значение 20h для правильного завершения обработки аппаратного прерывания.

Обработчик прерывания INT 09h не просто записывает значение ASCII-кода в буфер клавиатуры. Дополнительно отслеживаются нажатия таких комбинаций клавиш, как Ctrl-Alt-Del, обрабатываются специальные клавиши PrtSc и SysReq. При вычислении кода ASCII нажатой клавиши учитывается состояние клавиш Shift и CapsLock.

Буфер клавиатуры имеет длину 32 байта и расположен по адресу 0000h:041Eh для машин IBM PC/XT.

В IBM AT и PS/2 расположение клавиатурного буфера задается содержимым двух слов памяти с адресами 0000h:0480h (компонента смещения адреса начала буфера) и 0000h:0482h (смещение конца буфера). Обычно в IBM AT эти ячейки памяти содержат значения, соответственно, 001Eh и 003Eh. Так как смещения заданы относительно сегментного адреса 0040h, то видно, что обычное расположение клавиатурного буфера в IBM AT и PS/2 соответствует его расположению в IBM PC/XT.

Клавиатурный буфер организован циклически. Это означает, что при его переполнении самые старые значения будут потеряны. Две ячейки памяти, находящиеся в области данных BIOS с адресами 0000h:041Ah и 0000h:041Ch содержат, соответственно, указатели на начало и конец буфера. Если значения этих указателей равны друг другу, буфер пуст. (Можно удалить все символы из буфера клавиатуры, установив оба указателя на начало буфера. Однако есть более предпочтительный способ с использованием прерывания BIOS INT 16h).

Указателями на начало и конец клавиатурного буфера обычно управляют обработчики прерываний INT 09h и INT 16h.

Программа извлекает из буфера коды нажатых клавиш, используя различные функции прерывания INT 16h.

Помимо управления содержимым буфера клавиатуры, обработчик прерывания INT 09h отслеживает нажатия на так называемые переключающие клавиши - NumLock, ScrollLock, CapsLock, Ins. Состояние этих клавиш записывается в область данных BIOS в два байта с адресами 0000h:0417h и 0000h:0418h.

Программой обработки прерывания INT 09h отслеживаются некоторые комбинации клавиш. В таблице приведены эти комбинации и действия, выполняемые обработчиком прерывания при их обнаружении:

  • Ctrl-Alt-Del Сброс и перезагрузка системы.

  • Ctrl-NumLock,Перевод машины в состояние ожидания до нажатия любой клавиши

  • Shift-PrtSc Распечатка на принтере содержимого видеопамяти

  • Ctrl-Break Выполнение прерывания INT 1Bh,завершающего работу программы.

Многие типы клавиатур имеют отдельную альтернативную цифровую панель, напоминающую клавиатуру калькулятора. Если одновременно с нажатием на клавишу Alt набрать число на этой панели (не большее, чем 255 и не равное 0), то это число будет помещено в буфер клавиатуры, как будто бы оно было введено нажатием на одну клавишу. Это число будет также записано в слове по адресу 0000h:0419h в области данных BIOS.

При переполнении внутреннего буфера клавиатуры или буфера, расположенного в области данных BIOS, программа-обработчик прерывания INT 09h генерирует звуковой сигнал.

Тема 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 ......
Тема 6. Монитор системных ресурсов для Windows 98/NT.

Техническое задание.

Программа сбора информации о системе. Возможности ее включают в себя полный набор сведений о компьютере. Функционально присутствуют закладки: System, Memory, Software, Drives, I/O Devices. Раздел System содержит сведения о содержимом компьютера: процессоре, оперативной памяти, видеосистеме, дисках, шине PCI, Plug and Play-устройствах, BIOS и CMOS. Закладка Memory содержит информацию об оперативной памяти: памяти, занимаемой различными процессами; распределении физической памяти; системной и разделяемой памяти; содержимом первого адресуемого мегабайта. Закладка Software показывает программное обеспечение, установленное на компьютере. Summary покажет версию операционной системы, общую информацию по запущенным процессам, нитям, виртуальным машинам. Следующая закладка Drives содержит информацию о дисках: флоппи, винчестерах, CD-ROM и др. Закладка I/O это данные о сети, звуковых адаптерах, последовательных и параллельных портах, принтерах.

Методические указания.

Рекомендуется использовать следующие API функции: GetSystemInfo (информация о процессоре), GlobalMemoryStatys (информация об оперативной памяти), GetDeviseCaps и EnumDisplaySettins (позволит получить информацию о дисплее и все режимы которые поддерживаются видеокартой), CommConfigDialogs (вызовет диалоговую панель наладки параметров для коммуникационного устройства), MixerGetNumDevis (число микшеров), MixerGetDevCaps (получение их характеристик), WaveOutGetNumDevs (количество Wav устройств), WaveOutGetDevCaps (характеристики Wav устройств), MidiOutGetNumDevs (число Midi устройств), MidiOutGetDevCaps (характеристики Midi устройств), GetVolumeInformation (определить тип файловой системы).

КакЧтобы узнать, кто в данный момент присоединен через Сеть к машине можно использовать сессии:

SESSION_INFO_2 *psi2;

NET_API_STATUS Result;

wchar_t wcServerName[MAX_COMPUTERNAME_LENGTH + 1];

DWORD prefmaxlen = MAX_PREFERRED_LENGTH;

DWORD entriesread;

DWORD totalentries;

StringToWideChar( name, wcServerName, MAX_COMPUTERNAME_LENGTH );

Result = NetSessionEnum( (LPTSTR) wcServerName, NULL, NULL, 2,

(unsigned char**) &psi2, prefmaxlen, &entriesread, &totalentries, NULL );

if( Result != NERR_Success )

throw Exception("Информация о сессиях не получена!");

Чтобы узнать тип диска для NT можно воспользоваться функцией QueryDosDevice. Для Windows 95 надо использовать GetDeviceParameters.
Тема 7. Менеджер процессов и потоков для Windows 98/NT.

Техническое задание.

Разработать программу, выводящую информацию о процессах и потоках, выполняемых в системе. Предусмотреть возможность завершения выбранных процессов.

Методические указания.

Чтобы получить список всех запущенных процессов и потоков для Windows 9x используйте CreateToolhelp32Snapsot, Process32First, Process32Next, Thread32First, Thread32Next. Для WinNT: NTQuerySystemInformation. А можно так: получить список окон в системе (каким угодно способом, если нужны только процессы - можно ограничиться top-level), далее - GetWindowTreadProcessId - получаете ID процесса (и нити). OpenProcess - дает handle процесса.

При одновременном доступе нескольких процессов (или нескольких потоков одного процесса) к какому-либо ресурсу возникает проблема синхронизации. Поскольку поток в Win32 может быть остановлен в любой, заранее ему неизвестный момент времени, возможна ситуация, когда один из потоков не успел завершить модификацию ресурса (например, отображенной на файл области памяти), но был остановлен, а другой поток попытался обратиться к тому же ресурсу. В этот момент ресурс находится в несогласованном состоянии, и последствия обращения к нему могут быть самыми неожиданными — от порчи данных до нарушения защиты памяти.

Главной идеей, заложенной в основе синхронизации потоков в Win32, является использование объектов синхронизации и функций ожидания. Объекты могут находиться в одном из двух состояний — Signaled или Not Signaled. Функции ожидания блокируют выполнение потока до тех пор, пока заданный объект находится в состоянии Not Signaled. Таким образом, поток, которому необходим эксклюзивный доступ к ресурсу, должен выставить какой-либо объект синхронизации в несигнальное состояние, а по окончании — сбросить его в сигнальное. Остальные потоки должны перед доступом к этому ресурсу вызвать функцию ожидания, которая позволит им дождаться освобождения ресурса.

Функции синхронизации делятся на две основные категории: функции, ожидающие единственный объект, и функции, ожидающие один из нескольких объектов. Простейшей функцией ожидания является функция WaitForSingleObject:

DWORD WaitForSingleObject( HANDLE hHandle, // идентификатор объекта

DWORD dwMilliseconds); // период ожидания

Функция возвращает одно из следующих значений: WAIT_OBJECT_0 (объект перешел в сигнальное состояние), WAIT_TIMEOUT (истек срок ожидания.), WAIT_ABANDONED (поток, владевший объектом, завершился, не переведя объект в сигнальное состояние).

Объекты синхронизации.

Объектами синхронизации называются объекты Windows, идентификаторы которых могут использоваться в функциях синхронизации.

  1. Event (событие).

Even позволяет известить один или несколько ожидающих потоков о наступлении события. Event бывает:

    • Отключаемый вручную. Будучи установленным в сигнальное состояние, остается в нем до тех пор, пока не будет переключен явным вызовом функции ResetEvent

    • Автоматически отключаемый. Автоматически переключается в несигнальное состояние операционной системой, когда один из ожидающих его потоков завершается.

Для создания объекта используется функция CreateEvent:

HANDLE CreateEvent(LPSECURITY_ATTRIBUTES lpSecurityAttribs,

BOOL bManualReset, // Задает, будет Event переключаемым

// вручную (TRUE) или автоматически (FALSE)

BOOL bInitialState, // Задает начальное состояние. Если TRUE -

// объект в сигнальном состоянии

LPCTSTR lpszEventName); // Имя или NIL, если имя не требуется

Параметр lpszEventName позволяет разделять объекты между процессами. Если lpszEventName совпадает с именем уже существующего объекта типа Event, созданного текущим или любым другим процессом, то функция не создает нового объекта, а возвращает идентификатор уже существующего.

После получения идентификатора можно приступать к его использованию. Для этого имеются следующие функции:

BOOL SetEvent(HANDLE hEvent) – устанавливает объект в сигнальное состояние.

BOOL ResetEvent(HANDLE hEvent) – сбрасывает объект, устанавливая его в несигнальное состояние.

  1. Mutex.

Мьютекс — это объект синхронизации, который находится в сигнальном состоянии только тогда, когда не принадлежит ни одному из процессов. Как только хотя бы один процесс запрашивает владение мьютексом, он переходит в несигнальное состояние и остается таким до тех пор, пока не будет освобожден владельцем. Такое поведение позволяет использовать мьютексы для синхронизации совместного доступа нескольких процессов к разделяемому ресурсу. Для создания мьютекса используется функция:
HANDLE CreateMutex(LPSECURITY_ATTRIBUTES lpMutexAttributes,

BOOL bInitialOwner, // Задает, будет ли процесс владеть

// мьютексом сразу после создания

LPCTSTR lpszMutexName); // Имя мьютекса

Функция возвращает идентификатор созданного объекта либо 0. Если мьютекс с заданным именем уже был создан, возвращается его идентификатор.

Мьютекс переходит в сигнальное состояние после срабатывания функции ожидания, в которую был передан его идентификатор. Для возврата в несигнальное состояние служит функция ReleaseMutex:

BOOL ReleaseMutex(HANDLE hMutex).

  1. Semaphore (семафор).

Семафор представляет собой счетчик, содержащий целое число в диапазоне от 0 до максимальной величины, заданной при его создании. Счетчик уменьшается каждый раз, когда поток успешно завершает функцию ожидания, использующую семафор, и увеличивается путем вызова функции ReleaseSemaphore. При достижении семафором значения 0 он переходит в несигнальное состояние, при любых других значениях счетчика его состояние — сигнальное. Такое поведение позволяет использовать семафор в качестве ограничителя доступа к ресурсу, поддерживающему заранее заданное количество подключений.

Для создания семафора служит функция CreateSemaphore:

DWORD CreateSemaphore(LPSECURITY_ATTRIBUTES lpSemaphoreAttributes,

LONG lInitialCount, // Начальное значение счетчика

LONG lMaximumCount, // Максимальное значение счетчика

LPCTSTR lpszSemName); // Имя объекта

Функция возвращает идентификатор созданного семафора либо 0, если создать объект не удалось. Параметр lMaximumCount задает максимальное значение счетчика семафора, lInitialCount задает начальное значение счетчика и должен быть в диапазоне от 0 до lMaximumCount. lpszSemName задает имя семафора. Если в системе уже есть семафор с таким именем, то новый не создается, а возвращается идентификатор существующего семафора. В случае если семафор используется внутри одного процесса, можно создать его без имени, передав в качестве lpszSemName значение NULL.

Для увеличения счетчика семафора используется функция ReleaseSemaphore:

BOOL ReleaseSemaphore(

HANDLE hSemaphore, // Описатель семафора

LONG lReleaseCount, // Счетчик будет увеличен на эту величину

LPLONG lpPreviousCount); // Адрес 32-битной переменной, принимающей предыдущее значение счетчика.

Если значение счетчика после выполнения функции превысит заданный для него функцией CreateSemaphore максимум, то ReleaseSemaphore возвращает FALSE и значение семафора не изменяется. В качестве параметра lpPreviousCount можно передать NULL, если это значение нам не нужно.
Тема 8. Файловый менеджер для Windows 98/2000/NT.

Техническое задание.

Разработать программу для управления файлами и каталогами, аналогичную Проводнику Windows. Предусмотреть выдачу информации о дисках, поиск файлов и другие возможности.

Методические указания.

Для выяснения того, какие логические диски существуют в системе, используется функция

DWORD GetLogicalDrives( VOID);

Каждый установленный бит возвращаемого значения соответствует существующему в системе логическому устройству. Например, если в системе существуют диски A:, C: и D:, то возвращаемое функцией значение равно 13 (1101). Функция

DWORD GetLogicalDriveStrings( DWORD nBufferLength, LPTSTR lpszBuffer);

заполняет lpszBuffer информацией о корневом каталоге каждого логического диска в системе. В приведенном выше примере буфер будет заполнен символами

A:\C:\D:\

параметр nBufferLength определяет длину буфера. Функция возвращает реальную длину буфера, необходимую для размещения всей информации. Если необходимая длина буфера заранее неизвестна, то можно воспользоваться следующим классическим приемом:

DWORD dw = GetLogicalDrivesStrings( 0, NULL ) ;

LPSTR lpDriveStrings = HeapAlloc( GetProcessHeap(), 0, dw*sizeof(TCHAR));

GetLogicalDrivesStrings( dw, lpDriveStrings );

Для определения типа диска предназначена функция

UINT GetDriveType( LPTSTR lpszRootPathName );

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

Идентификатор

Значение

Описание


DRIVE_UNKNOWN

0

Тип устройства определить нельзя

DRIVE_NO_ROOT_DIR

1

Корневой каталог не существует

DRIVE_REMOVABLE

2

Гибкий диск

DRIVE_FIXED

3

Жесткий диск

DRIVE_REMOTE

4

Сетевой диск

DRIVE_CDROM

5

Дисковод для компакт-дисков

DRIVE_RAMDISK

6

RAM диск (эмулируемый в оперативной памяти)
1   2   3   4   5   6   7   8   9   10   11

Похожие:

Методические указания к курсовой работе по дисциплине «Системное программирование и операционные системы» iconМетодические указания к выполнению курсовой работы «Гребные электрические...
Методические указания к выполнению курсовой работы «гребные электрические установки» по дисциплине «электрические системы и комплексы...

Методические указания к курсовой работе по дисциплине «Системное программирование и операционные системы» iconМетодические указания к курсовой работе по курсу "Разведка месторождений полезных ископаемых"
Методические указания к выполнению курсовой работы по дисциплине «Разведка месторождений полезных ископаемых» (для студентов очной...

Методические указания к курсовой работе по дисциплине «Системное программирование и операционные системы» iconМетодические указания к курсовой работе по дисциплине «Теория электрическихцепей»

Методические указания к курсовой работе по дисциплине «Системное программирование и операционные системы» iconМетодические указания и задания к лабораторным работам по курсу «Архитектура компьютеров (АК)»
Методические указания к лабораторным работам по курсу “Архитектура компьютеров предназначены для студентов специальностей «Системное...

Методические указания к курсовой работе по дисциплине «Системное программирование и операционные системы» icon«Системное программирование и операционные системы»
Все цитаты, цифровой, фактический материал и библиографические сведенья проверены, запись единиц соответствует стандартам

Методические указания к курсовой работе по дисциплине «Системное программирование и операционные системы» iconМетодические указания к выполнению курсовой работы по дисциплине «Вычислительный практикум»
Методические указания к выполнению курсовой работы по дисциплине «Вычислительный практикум» для студентов заочной формы обучения...

Методические указания к курсовой работе по дисциплине «Системное программирование и операционные системы» iconМетодические указания к выполнению курсовой работы по дисциплине «Основы маркетинга»
Бобрушева В. В. Методические указания к выполнению курсовой работы по дисциплине «Основы маркетинга» для студентов 2 курса дневной...

Методические указания к курсовой работе по дисциплине «Системное программирование и операционные системы» iconМетодические указания к выполнению лабораторных работ по дисциплине...
Компьютерная инженерия” (для студентов дневной и заочной формы обучения специальности 091501 “Компьютерные системы и сети”, 091502...

Методические указания к курсовой работе по дисциплине «Системное программирование и операционные системы» iconМетодические указания к выполнению курсовой работы по дисциплине...
Методические указания к выполнению курсовой работы по дисциплине «Техническая термодинамика»/ Составители

Методические указания к курсовой работе по дисциплине «Системное программирование и операционные системы» iconМетодические указания к выполнению контрольной работы (ргр) по дисциплине...
Методические указания к выполнению контрольной работы (ргр) по дисциплине «Объектно-ориентированное программирование» (для студентов...

Вы можете разместить ссылку на наш сайт:
Школьные материалы


При копировании материала укажите ссылку © 2013
контакты
uchebilka.ru
Главная страница


<