Rev 4572 | Rev 4588 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 4572 | Rev 4573 | ||
---|---|---|---|
Line 814... | Line 814... | ||
814 | Замечания: |
814 | Замечания: |
815 | * Не следует полагаться на возвращаемое значение при неверном |
815 | * Не следует полагаться на возвращаемое значение при неверном |
816 | вызове, оно может измениться в последующих версиях ядра. |
816 | вызове, оно может измениться в последующих версиях ядра. |
Line 817... | Line 817... | ||
817 | 817 | ||
818 | ====================================================================== |
818 | ====================================================================== |
819 | ======== Функция 18, подфункция 10 - свернуть окно приложения. ======= |
819 | ========= Функция 18, подфункция 10 - свернуть активное окно. ======== |
820 | ====================================================================== |
820 | ====================================================================== |
821 | Сворачивает собственное окно. |
821 | Сворачивает активное окно. |
822 | Параметры: |
822 | Параметры: |
823 | * eax = 18 - номер функции |
823 | * eax = 18 - номер функции |
824 | * ebx = 10 - номер подфункции |
824 | * ebx = 10 - номер подфункции |
825 | Возвращаемое значение: |
825 | Возвращаемое значение: |
Line 1238... | Line 1238... | ||
1238 | * Проверок на корректность не делается, поскольку ядро эту |
1238 | * Проверок на корректность не делается, поскольку ядро эту |
1239 | переменную не использует. |
1239 | переменную не использует. |
1240 | * Получить язык системы можно вызовом подфункции 5 функции 26. |
1240 | * Получить язык системы можно вызовом подфункции 5 функции 26. |
Line 1241... | Line 1241... | ||
1241 | 1241 | ||
1242 | ====================================================================== |
- | |
1243 | =========== Функция 21, подфункция 7 - установить базу HD. =========== |
- | |
1244 | ====================================================================== |
- | |
1245 | База HD нужна для определения, на какой жёсткий диск писать, при |
- | |
1246 | использовании устаревшего синтаксиса /HD в устаревшей функции 58; |
- | |
1247 | при использовании современного синтаксиса /HD0,/HD1,/HD2,/HD3 |
- | |
1248 | база устанавливается автоматически. |
- | |
1249 | Параметры: |
- | |
1250 | * eax = 21 - номер функции |
- | |
1251 | * ebx = 7 - номер подфункции |
- | |
1252 | * ecx = база HD: 1=IDE0, 2=IDE1, 3=IDE2, 4=IDE3 |
- | |
1253 | Возвращаемое значение: |
- | |
1254 | * eax = 0 |
- | |
1255 | Замечания: |
- | |
1256 | * Любое приложение в любой момент времени может изменить базу. |
- | |
1257 | * Не следует изменять базу, когда какое-нибудь приложение работает |
- | |
1258 | с жёстким диском. Если не хотите глюков системы. |
- | |
1259 | * Получить установленную базу можно вызовом подфункции 7 функции 26. |
- | |
1260 | * Следует также определить используемый раздел жёсткого диска |
- | |
1261 | подфункцией 8. |
- | |
1262 | - | ||
1263 | ====================================================================== |
- | |
1264 | ========== Функция 21, подфункция 8 - установить раздел HD. ========== |
- | |
1265 | ====================================================================== |
- | |
1266 | Раздел HD нужен для определения, на какой раздел жёсткого диска |
- | |
1267 | писать, при использовании устаревшего синтаксиса /HD в устаревшей |
- | |
1268 | функции 58; при использовании современного синтаксиса |
- | |
1269 | /HD0,/HD1,/HD2,/HD3 база и раздел устанавливаются автоматически. |
- | |
1270 | Параметры: |
- | |
1271 | * eax = 21 - номер функции |
- | |
1272 | * ebx = 8 - номер подфункции |
- | |
1273 | * ecx = раздел HD (считая с 1) |
- | |
1274 | Возвращаемое значение: |
- | |
1275 | * eax = 0 |
- | |
1276 | Замечания: |
- | |
1277 | * Любое приложение в любой момент времени может изменить раздел. |
- | |
1278 | * Не следует изменять раздел, когда какое-нибудь приложение работает |
- | |
1279 | с жёстким диском. Если не хотите глюков системы. |
- | |
1280 | * Получить установленный раздел можно вызовом подфункции 8 |
- | |
1281 | функции 26. |
- | |
1282 | * Проверок на корректность не делается. |
- | |
1283 | * Узнать число разделов на жёстком диске можно вызовом |
- | |
1284 | подфункции 11 функции 18. |
- | |
1285 | * Следует также определить используемую базу жёсткого диска |
- | |
1286 | подфункцией 7. |
- | |
1287 | - | ||
1288 | ====================================================================== |
1242 | ====================================================================== |
1289 | ====================== Функция 21, подфункция 11 ===================== |
1243 | ====================== Функция 21, подфункция 11 ===================== |
1290 | =========== Разрешить/запретить низкоуровневый доступ к HD. ========== |
1244 | =========== Разрешить/запретить низкоуровневый доступ к HD. ========== |
1291 | ====================================================================== |
1245 | ====================================================================== |
1292 | Параметры: |
1246 | Параметры: |
Line 1673... | Line 1627... | ||
1673 | не используемая самим ядром, однако приложение @panel рисует |
1627 | не используемая самим ядром, однако приложение @panel рисует |
1674 | соответствующую иконку (используя описываемую функцию). |
1628 | соответствующую иконку (используя описываемую функцию). |
1675 | * Установить язык системы можно вызовом подфункции 5 функции 21. |
1629 | * Установить язык системы можно вызовом подфункции 5 функции 21. |
Line 1676... | Line 1630... | ||
1676 | 1630 | ||
1677 | ====================================================================== |
- | |
1678 | ============ Функция 26, подфункция 7 - получить базу HD. ============ |
- | |
1679 | ====================================================================== |
- | |
1680 | База HD нужна для определения, на какой жёсткий диск писать, при |
- | |
1681 | использовании устаревшего синтаксиса /HD в устаревшей функции 58; |
- | |
1682 | при использовании современного синтаксиса /HD0,/HD1,/HD2,/HD3 |
- | |
1683 | база устанавливается автоматически. |
- | |
1684 | Параметры: |
- | |
1685 | * eax = 26 - номер функции |
- | |
1686 | * ebx = 7 - номер подфункции |
- | |
1687 | Возвращаемое значение: |
- | |
1688 | * eax = база HD: 1=IDE0, 2=IDE1, 3=IDE2, 4=IDE3 |
- | |
1689 | Замечания: |
- | |
1690 | * Любое приложение в любой момент времени может изменить базу. |
- | |
1691 | * Установить базу можно вызовом подфункции 7 функции 21. |
- | |
1692 | * Получить используемый раздел жёсткого диска можно подфункцией 8. |
- | |
1693 | - | ||
1694 | ====================================================================== |
- | |
1695 | =========== Функция 26, подфункция 8 - получить раздел HD. =========== |
- | |
1696 | ====================================================================== |
- | |
1697 | Раздел HD нужен для определения, на какой раздел жёсткого диска |
- | |
1698 | писать, при использовании устаревшего синтаксиса /HD в устаревшей |
- | |
1699 | функции 58; при использовании современного синтаксиса |
- | |
1700 | /HD0,/HD1,/HD2,/HD3 база и раздел устанавливаются автоматически. |
- | |
1701 | Параметры: |
- | |
1702 | * eax = 26 - номер функции |
- | |
1703 | * ebx = 8 - номер подфункции |
- | |
1704 | Возвращаемое значение: |
- | |
1705 | * eax = раздел HD (считая с 1) |
- | |
1706 | Замечания: |
- | |
1707 | * Любое приложение в любой момент времени может изменить раздел. |
- | |
1708 | * Установить раздел можно вызовом подфункции 8 функции 21. |
- | |
1709 | * Узнать число разделов на жёстком диске можно вызовом |
- | |
1710 | подфункции 11 функции 18. |
- | |
1711 | * Получить используемую базу жёсткого диска можно подфункцией 7. |
- | |
1712 | - | ||
1713 | ====================================================================== |
1631 | ====================================================================== |
1714 | === Функция 26, подфункция 9 - получить значение счётчика времени. === |
1632 | === Функция 26, подфункция 9 - получить значение счётчика времени. === |
1715 | ====================================================================== |
1633 | ====================================================================== |
1716 | Параметры: |
1634 | Параметры: |
1717 | * eax = 26 - номер функции |
1635 | * eax = 26 - номер функции |
Line 2542... | Line 2460... | ||
2542 | например, в http://alpha1.dyns.net/files/PCI/bios21.pdf. |
2460 | например, в http://alpha1.dyns.net/files/PCI/bios21.pdf. |
2543 | * Если BIOS не поддерживает это расширение, поведение функции |
2461 | * Если BIOS не поддерживает это расширение, поведение функции |
2544 | эмулируется (через аналоги подфункций функции 62 режима ядра). |
2462 | эмулируется (через аналоги подфункций функции 62 режима ядра). |
Line 2545... | Line 2463... | ||
2545 | 2463 | ||
2546 | ====================================================================== |
- | |
2547 | ============== Функция 58 - работа с файловой системой. ============== |
- | |
2548 | ====================================================================== |
- | |
2549 | Параметры: |
- | |
2550 | * eax = 58 |
- | |
2551 | * ebx = указатель на информационную структуру |
- | |
2552 | Возвращаемое значение: |
- | |
2553 | * eax = 0 - успешно; иначе код ошибки файловой системы |
- | |
2554 | * в зависимости от подфункции может возвращаться значение и |
- | |
2555 | в других регистрах |
- | |
2556 | Общий формат информационной структуры: |
- | |
2557 | * +0: dword: номер подфункции |
- | |
2558 | * +4: dword: номер блока |
- | |
2559 | * +8: dword: размер |
- | |
2560 | * +12 = +0xC: dword: указатель на данные |
- | |
2561 | * +16 = +0x10: dword: указатель на память для работы системы |
- | |
2562 | (4096 байт) |
- | |
2563 | * +20 = +0x14: n db: ASCIIZ-строка с именем файла |
- | |
2564 | Уточнения - в документации на соответствующую подфункцию. |
- | |
2565 | Имя файла нечувствительно к регистру латинских букв, |
- | |
2566 | русские буквы должны быть заглавными. |
- | |
2567 | Формат имени файла: |
- | |
2568 | /base/number/dir1/dir2/.../dirn/file, |
- | |
2569 | где /base/number идентифицирует устройство, на котором ищется файл: |
- | |
2570 | одно из |
- | |
2571 | * /RD/1 = /RAMDISK/1 для доступа к рамдиску |
- | |
2572 | * /FD/1 = /FLOPPYDISK/1 для доступа к первому флоппи-дисководу, |
- | |
2573 | /FD/2 = /FLOPPYDISK/2 для второго флоппи-дисковода |
- | |
2574 | * /HD/x = /HARDDISK/x - устаревший вариант доступа к жёсткому диску |
- | |
2575 | (в этом случае база определяется подфункцией 7 функции 21), |
- | |
2576 | x - номер раздела (считая с 1) |
- | |
2577 | * /HD0/x, /HD1/x, /HD2/x, /HD3/x для доступа соответственно |
- | |
2578 | к устройствам IDE0 (Primary Master), IDE1 (Primary Slave), |
- | |
2579 | IDE2 (Secondary Master), IDE3 (Secondary Slave); |
- | |
2580 | x - номер раздела на выбранном винчестере, изменяется от 1 до 255 |
- | |
2581 | (на каждом из винчестеров нумерация начинается с 1) |
- | |
2582 | Замечания: |
- | |
2583 | * В первых двух случаях допускается использование FIRST вместо 1, |
- | |
2584 | SECOND вместо 2, но использовать эту возможность |
- | |
2585 | не рекомендуется для удобства перехода на будущие расширения. |
- | |
2586 | * Накладывается ограничение n<=39. |
- | |
2587 | * Имена папок и файла dir1,...,dirn,file должны быть в формате 8.3: |
- | |
2588 | имя не более 8 символов, точка, расширение не более 3 символов. |
- | |
2589 | Хвостовые пробелы игнорируются. Других пробелов быть не должно. |
- | |
2590 | Если имя занимает ровно 8 символов, точку можно опустить |
- | |
2591 | (хотя пользоваться этим не рекомендуется для удобства перехода |
- | |
2592 | на будущие расширения). |
- | |
2593 | * Функция не поддерживает папок на рамдиске. |
- | |
2594 | Примеры: |
- | |
2595 | * '/RAMDISK/FIRST/KERNEL.ASM',0 |
- | |
2596 | '/rd/1/kernel.asm',0 |
- | |
2597 | * '/HD0/1/kernel.asm',0 |
- | |
2598 | * '/hd0/1/menuet/pics/tanzania.bmp',0 |
- | |
2599 | Доступные подфункции: |
- | |
2600 | * подфункция 0 - чтение файла/папки |
- | |
2601 | * подфункция 8 - LBA-чтение с устройства |
- | |
2602 | * подфункция 15 - получение информации о файловой системе |
- | |
2603 | - | ||
2604 | ====================================================================== |
- | |
2605 | ========== Функция 58, подфункция 0 - прочитать файл/папку. ========== |
- | |
2606 | ====================================================================== |
- | |
2607 | Параметры: |
- | |
2608 | * eax = 58 |
- | |
2609 | * ebx = указатель на информационную структуру |
- | |
2610 | Формат информационной структуры: |
- | |
2611 | * +0: dword: 0 = номер подфункции |
- | |
2612 | * +4: dword: номер блока для чтения (считая с 0) |
- | |
2613 | * +8: dword: число блоков для чтения |
- | |
2614 | * +12 = +0xC: dword: указатель на буфер, куда будут записаны данные |
- | |
2615 | * +16 = +0x10: dword: указатель на буфер для работы системы |
- | |
2616 | (4096 байт) |
- | |
2617 | * +20 = +0x14: ASCIIZ-имя файла, правила формирования имён указаны в |
- | |
2618 | общем описании |
- | |
2619 | Возвращаемое значение: |
- | |
2620 | * eax = 0 - успешно, иначе код ошибки файловой системы |
- | |
2621 | * ebx = размер файла (в байтах) или |
- | |
2622 | -1=0xffffffff, если файл не найден |
- | |
2623 | Замечания: |
- | |
2624 | * Размер блока - 512 байт. |
- | |
2625 | * Эта функция устарела, для чтения файлов используйте подфункцию 0 |
- | |
2626 | функции 70, для чтения папок - подфункцию 1 функции 70. |
- | |
2627 | * Функция позволяет читать содержимое папки. Из файловых систем |
- | |
2628 | поддерживается только FAT. Формат FAT-папки описан в любой |
- | |
2629 | документации по FAT. |
- | |
2630 | * Размер папки определяется по размеру цепочки кластеров в FAT. |
- | |
2631 | * Если файл кончился раньше, чем был прочитан последний запрошенный |
- | |
2632 | блок, то функция прочитает, сколько сможет, после чего вернёт |
- | |
2633 | eax=6 (EOF). |
- | |
2634 | * Функция позволяет читать корневые папки /rd/1,/fd/x,/hd[n]/x, но |
- | |
2635 | в первых двух случаях текущая реализация не следует |
- | |
2636 | установленным правилам: |
- | |
2637 | для /rd/1: |
- | |
2638 | * если указано 0 блоков для чтения, считается, |
- | |
2639 | что запрашивается 1; |
- | |
2640 | * если запрашивается больше 14 блоков или начальный блок |
- | |
2641 | не меньше 14-го, то возвращается eax=5 (not found) и ebx=-1; |
- | |
2642 | * размер корневого каталога рамдиска = 14 блоков, |
- | |
2643 | 0x1C00=7168 байт; но возвращается ebx=0 |
- | |
2644 | (за исключением случая предыдущего пункта); |
- | |
2645 | * как ни странно, можно прочитать 14-й блок (там, вообще говоря, |
- | |
2646 | мусор - напоминаю, счёт ведётся с 0); |
- | |
2647 | * если был запрошен хотя бы один блок с номером, не меньшим 14, |
- | |
2648 | то возвращается eax=6(EOF); иначе eax=0. |
- | |
2649 | Для /fd/x: |
- | |
2650 | * если начальный блок не меньше 14-го, то возвращается |
- | |
2651 | eax=5 (not found) и ebx=0; |
- | |
2652 | * кстати говоря, формат FAT12 допускает дискеты с размером |
- | |
2653 | корневого каталога меньше или больше 14 блоков; |
- | |
2654 | * проверки длины не делается; |
- | |
2655 | * если удалось прочитать данные с дискеты, возвращается |
- | |
2656 | eax=0,ebx=0; в противном случае eax=10 (access denied), ebx=-1. |
- | |
2657 | * Функция обрабатывает чтение специальных папок /,/rd,/fd,/hd[n]; |
- | |
2658 | но результат не соответствует ожидаемому |
- | |
2659 | (по работе с обычными файлами/папками), не следует установленным |
- | |
2660 | правилам, может измениться в следующих версиях ядра и потому |
- | |
2661 | не описывается. Для получения информации об оборудовании |
- | |
2662 | используйте подфункцию 11 функции 18 или |
- | |
2663 | читайте соответствующие папки подфункцией 1 функции 70. |
- | |
2664 | - | ||
2665 | ====================================================================== |
- | |
2666 | ========= Функция 58, подфункция 8 - LBA-чтение с устройства. ======== |
- | |
2667 | ====================================================================== |
- | |
2668 | Параметры: |
- | |
2669 | * eax = 58 - номер функции |
- | |
2670 | * ebx = указатель на информационную структуру |
- | |
2671 | Формат информационной структуры: |
- | |
2672 | * +0: dword: 8 = номер подфункции |
- | |
2673 | * +4: dword: номер блока для чтения (считая с 0) |
- | |
2674 | * +8: dword: игнорируется (устанавливайте в 1) |
- | |
2675 | * +12 = +0xC: dword: указатель на буфер, куда будут записаны данные |
- | |
2676 | (512 байт) |
- | |
2677 | * +16 = +0x10: dword: указатель на буфер для работы системы |
- | |
2678 | (4096 байт) |
- | |
2679 | * +20 = +0x14: ASCIIZ-имя устройства: нечувствительно к регистру, |
- | |
2680 | одно из /rd/1 = /RamDisk/1, /hd/n = /HardDisk/n, |
- | |
2681 | 1<=n<=4 - номер устройства: 1=IDE0, ..., 4=IDE3. |
- | |
2682 | Вместо цифр допускается, хотя и не рекомендуется для удобства |
- | |
2683 | перехода на будущие расширения, |
- | |
2684 | использование 'first','second','third','fourth'. |
- | |
2685 | Возвращаемое значение: |
- | |
2686 | * если указано имя устройства /hd/xxx, где xxx не находится |
- | |
2687 | в списке выше: |
- | |
2688 | * eax = ebx = 1 |
- | |
2689 | * если указано неправильное имя устройства |
- | |
2690 | (за исключением предыдущего случая): |
- | |
2691 | * eax = 5 |
- | |
2692 | * ebx не меняется |
- | |
2693 | * если LBA-доступ запрещён подфункцией 11 функции 21: |
- | |
2694 | * eax = 2 |
- | |
2695 | * ebx разрушается |
- | |
2696 | * для рамдиска: попытка чтения блока за пределами рамдиска |
- | |
2697 | (18*2*80 блоков) приводит к |
- | |
2698 | * eax = 3 |
- | |
2699 | * ebx = 0 |
- | |
2700 | * при успешном чтении: |
- | |
2701 | * eax = ebx = 0 |
- | |
2702 | Замечания: |
- | |
2703 | * Размер блока - 512 байт; читается один блок. |
- | |
2704 | * Не следует полагаться на возвращаемое значение, |
- | |
2705 | оно может измениться в следующих версиях. |
- | |
2706 | * Требуется, чтобы был разрешён LBA-доступ к устройствам |
- | |
2707 | подфункцией 11 функции 21. Узнать это можно вызовом |
- | |
2708 | подфункцией 11 функции 26. |
- | |
2709 | * LBA-чтение дискеты не поддерживается. |
- | |
2710 | * Функция считывает данные физического жёсткого диска; |
- | |
2711 | если по каким-то причинам нужны данные конкретного раздела, |
- | |
2712 | придётся определять начальный сектор этого раздела |
- | |
2713 | (либо напрямую через MBR, либо из расширенной структуры, |
- | |
2714 | возвращаемой той же подфункцией 11 функции 18). |
- | |
2715 | * Функция не проверяет код ошибки жёсткого диска, так что запрос |
- | |
2716 | несуществующего сектора всё равно что-то прочитает |
- | |
2717 | (вероятнее всего, нули, но это определяется устройством) и |
- | |
2718 | это будет считаться успехом (eax=0). |
- | |
2719 | - | ||
2720 | ====================================================================== |
- | |
2721 | = Функция 58, подфункция 15 - получить информацию о файловой системе. |
- | |
2722 | ====================================================================== |
- | |
2723 | Параметры: |
- | |
2724 | * eax = 58 - номер функции |
- | |
2725 | * ebx = указатель на информационную структуру |
- | |
2726 | Формат информационной структуры: |
- | |
2727 | * +0: dword: 15 = номер подфункции |
- | |
2728 | * +4: dword: игнорируется |
- | |
2729 | * +8: dword: игнорируется |
- | |
2730 | * +12 = +0xC: dword: игнорируется |
- | |
2731 | * +16 = +0x10: dword: игнорируется |
- | |
2732 | * +20 = +0x14: (проверяется только второй символ, сразу после слэша) |
- | |
2733 | /rd=/RAMDISK или /hd=/HARDDISK |
- | |
2734 | Возвращаемое значение: |
- | |
2735 | * если второй символ не принадлежит множеству {'r','R','h','H'}: |
- | |
2736 | * eax = 3 |
- | |
2737 | * ebx = ecx = dword [fileinfo] = 0 |
- | |
2738 | * для рамдиска: |
- | |
2739 | * eax = 0 (успех) |
- | |
2740 | * ebx = общее число кластеров = 2847 |
- | |
2741 | * ecx = число свободных кластеров |
- | |
2742 | * dword [fileinfo] = размер кластера = 512 |
- | |
2743 | * для жёсткого диска: база и раздел определяются подфункциями 7 и 8 |
- | |
2744 | функции 21: |
- | |
2745 | * eax = 0 (успех) |
- | |
2746 | * ebx = общее число кластеров |
- | |
2747 | * ecx = число свободных кластеров |
- | |
2748 | * dword [fileinfo] = размер кластера (в байтах) |
- | |
2749 | Замечания: |
- | |
2750 | * Не удивляйтесь странному расположению 4-го возвращаемого |
- | |
2751 | параметра - когда писался этот код, при системных вызовах |
- | |
2752 | приложению возвращались только регистры eax,ebx,ecx (из |
- | |
2753 | pushad-структуры, передающейся как аргумент системной функции). |
- | |
2754 | Теперь это исправлено, так что, возможно, имеет смысл возвращать |
- | |
2755 | размер кластера в edx, пока эту функцию не начали использовать. |
- | |
2756 | * Вообще-то ещё существует подфункция 11 функции 18, возвращающая |
- | |
2757 | информацию о файловой системе. По расширенной таблице дисковой |
- | |
2758 | подсистемы можно определить размер кластера (там он хранится |
- | |
2759 | в секторах) и общее число кластеров для жёстких дисков. |
- | |
2760 | - | ||
2761 | ====================================================================== |
2464 | ====================================================================== |
2762 | =========== Функция 60 - Inter Process Communication (IPC). ========== |
2465 | =========== Функция 60 - Inter Process Communication (IPC). ========== |
2763 | ====================================================================== |
2466 | ====================================================================== |
2764 | IPC применяется для посылок сообщений от одного процесса/потока |
2467 | IPC применяется для посылок сообщений от одного процесса/потока |
2765 | другому. При этом следует предварительно договориться о том, как |
2468 | другому. При этом следует предварительно договориться о том, как |