forked from KolibriOS/kolibrios
proper unicode support
git-svn-id: svn://kolibrios.org@6798 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
parent
2c0a9cbf44
commit
755c9fe4d1
@ -1103,7 +1103,7 @@ f68:
|
|||||||
jbe sys_sheduler
|
jbe sys_sheduler
|
||||||
cmp ebx, 11
|
cmp ebx, 11
|
||||||
jb undefined_syscall
|
jb undefined_syscall
|
||||||
cmp ebx, 27
|
cmp ebx, 28
|
||||||
ja undefined_syscall
|
ja undefined_syscall
|
||||||
xor eax, eax
|
xor eax, eax
|
||||||
jmp dword [f68call+ebx*4-11*4]
|
jmp dword [f68call+ebx*4-11*4]
|
||||||
@ -1138,6 +1138,8 @@ f68:
|
|||||||
call srv_handlerEx ;ecx
|
call srv_handlerEx ;ecx
|
||||||
mov [esp+SYSCALL_STACK._eax], eax
|
mov [esp+SYSCALL_STACK._eax], eax
|
||||||
ret
|
ret
|
||||||
|
.18:
|
||||||
|
mov eax, edx
|
||||||
.19:
|
.19:
|
||||||
cmp ecx, OS_BASE
|
cmp ecx, OS_BASE
|
||||||
jae .fail
|
jae .fail
|
||||||
@ -1199,6 +1201,24 @@ f68:
|
|||||||
mov [esp+SYSCALL_STACK._edx], edx
|
mov [esp+SYSCALL_STACK._edx], edx
|
||||||
mov [esp+SYSCALL_STACK._eax], eax
|
mov [esp+SYSCALL_STACK._eax], eax
|
||||||
ret
|
ret
|
||||||
|
.28:
|
||||||
|
cmp ecx, OS_BASE
|
||||||
|
jae .fail
|
||||||
|
push ecx edx
|
||||||
|
stdcall kernel_alloc, maxPathLength
|
||||||
|
mov edi, eax
|
||||||
|
pop eax esi
|
||||||
|
push edi
|
||||||
|
call getFullPath
|
||||||
|
pop ebp
|
||||||
|
test eax, eax
|
||||||
|
jz @f
|
||||||
|
stdcall load_file_umode, ebp
|
||||||
|
mov [esp+SYSCALL_STACK._edx], edx
|
||||||
|
@@:
|
||||||
|
mov [esp+SYSCALL_STACK._eax], eax
|
||||||
|
stdcall kernel_free, ebp
|
||||||
|
ret
|
||||||
|
|
||||||
.fail:
|
.fail:
|
||||||
mov [esp+SYSCALL_STACK._eax], eax
|
mov [esp+SYSCALL_STACK._eax], eax
|
||||||
@ -1214,7 +1234,7 @@ f68call: ; keep this table closer to main code
|
|||||||
dd f68.fail ; moved to f68.24
|
dd f68.fail ; moved to f68.24
|
||||||
dd f68.16 ; get_service
|
dd f68.16 ; get_service
|
||||||
dd f68.17 ; call_service
|
dd f68.17 ; call_service
|
||||||
dd f68.fail ; moved to f68.25
|
dd f68.18 ; loadLibUnicode
|
||||||
dd f68.19 ; load_dll
|
dd f68.19 ; load_dll
|
||||||
dd f68.20 ; user_realloc
|
dd f68.20 ; user_realloc
|
||||||
dd f68.21 ; load_driver
|
dd f68.21 ; load_driver
|
||||||
@ -1224,7 +1244,7 @@ f68call: ; keep this table closer to main code
|
|||||||
dd f68.25 ; unmask exception
|
dd f68.25 ; unmask exception
|
||||||
dd f68.26 ; user_unmap
|
dd f68.26 ; user_unmap
|
||||||
dd f68.27 ; load_file_umode
|
dd f68.27 ; load_file_umode
|
||||||
|
dd f68.28 ; loadFileUnicode
|
||||||
|
|
||||||
align 4
|
align 4
|
||||||
proc load_pe_driver stdcall, file:dword, cmdline:dword
|
proc load_pe_driver stdcall, file:dword, cmdline:dword
|
||||||
|
@ -176,6 +176,9 @@ iglobal
|
|||||||
dd sys_socket ; 75-reserved for new stack
|
dd sys_socket ; 75-reserved for new stack
|
||||||
dd sys_protocols ; 76-reserved for new stack
|
dd sys_protocols ; 76-reserved for new stack
|
||||||
dd sys_synchronization ; 77
|
dd sys_synchronization ; 77
|
||||||
|
dd undefined_syscall ; 78-free
|
||||||
|
dd undefined_syscall ; 79-free
|
||||||
|
dd fileSystemUnicode ; 80-File system interface for different encodings
|
||||||
|
|
||||||
times 255 - ( ($-servetable2) /4 ) dd undefined_syscall
|
times 255 - ( ($-servetable2) /4 ) dd undefined_syscall
|
||||||
dd sys_end ; -1-end application
|
dd sys_end ; -1-end application
|
||||||
|
@ -1695,7 +1695,6 @@ Remarks:
|
|||||||
======================================================================
|
======================================================================
|
||||||
================ Функция 30 - работа с текущей папкой. ===============
|
================ Функция 30 - работа с текущей папкой. ===============
|
||||||
======================================================================
|
======================================================================
|
||||||
|
|
||||||
-------- Подфункция 1 - установить текущую папку для потока. ---------
|
-------- Подфункция 1 - установить текущую папку для потока. ---------
|
||||||
Параметры:
|
Параметры:
|
||||||
* eax = 30 - номер функции
|
* eax = 30 - номер функции
|
||||||
@ -1704,7 +1703,7 @@ Remarks:
|
|||||||
правила формирования строки указаны в описании функции 70.
|
правила формирования строки указаны в описании функции 70.
|
||||||
Возвращаемое значение:
|
Возвращаемое значение:
|
||||||
* функция не возвращает значения
|
* функция не возвращает значения
|
||||||
|
----------------------------------------------------------------------
|
||||||
--------- Подфункция 2 - получить текущую папку для потока. ----------
|
--------- Подфункция 2 - получить текущую папку для потока. ----------
|
||||||
Параметры:
|
Параметры:
|
||||||
* eax = 30 - номер функции
|
* eax = 30 - номер функции
|
||||||
@ -1712,27 +1711,21 @@ Remarks:
|
|||||||
* ecx = указатель на буфер
|
* ecx = указатель на буфер
|
||||||
* edx = размер буфера
|
* edx = размер буфера
|
||||||
Возвращаемое значение:
|
Возвращаемое значение:
|
||||||
* eax = длина имени текущей папки (включая завершающий 0)
|
* eax = длина строки (включая завершающий 0)
|
||||||
Замечания:
|
Замечания:
|
||||||
* Если размера буфера недостаточно для копирования всего имени,
|
* Если размера буфера недостаточно для копирования всего пути,
|
||||||
копируются только первые (edx-1) байт и в конце ставится
|
копируются только часть строки и в конце ставится завершающий 0.
|
||||||
завершающий 0.
|
|
||||||
* По умолчанию, текущая папка для потока - "/rd/1".
|
* По умолчанию, текущая папка для потока - "/rd/1".
|
||||||
* При создании процесса/потока текущая папка наследуется от
|
* При создании процесса/потока текущая папка наследуется от
|
||||||
родителя.
|
родителя.
|
||||||
|
----------------------------------------------------------------------
|
||||||
---- Подфункция 3 - установить доп. системную директорию для ядра ----
|
---- Подфункция 3 - установить доп. системную директорию для ядра ----
|
||||||
Параметры:
|
Параметры:
|
||||||
* eax = 30 - номер функции
|
* eax = 30 - номер функции
|
||||||
* ebx = 3 - номер подфункции
|
* ebx = 3 - номер подфункции
|
||||||
* ecx = указатель на блок данных:
|
* ecx = указатель на блок данных:
|
||||||
для кодировки cp866:
|
|
||||||
key rb 64
|
key rb 64
|
||||||
path rb 64
|
path rb 64
|
||||||
для кодировки UTF-16LE:
|
|
||||||
key rb 64
|
|
||||||
dw 2
|
|
||||||
path rw 31
|
|
||||||
Пример:
|
Пример:
|
||||||
align 64
|
align 64
|
||||||
key db 'kolibrios',0 ; ключ должен быть в нижнем регистре
|
key db 'kolibrios',0 ; ключ должен быть в нижнем регистре
|
||||||
@ -1743,20 +1736,29 @@ path db 'HD0/1',0
|
|||||||
* функция не возвращает значения
|
* функция не возвращает значения
|
||||||
Замечания:
|
Замечания:
|
||||||
* Функция может быть вызвана только 1 раз за 1 сессию работы ОС.
|
* Функция может быть вызвана только 1 раз за 1 сессию работы ОС.
|
||||||
* Кодировка не влияет на символьный ключ.
|
* При вводе пути символьный ключ не зависит от кодировки.
|
||||||
|
----------------------------------------------------------------------
|
||||||
----- Подфункция 4 - получить текущую папку в кодировке UTF-16LE -----
|
--- Подфункция 4 - установить текущую папку с указанием кодировки. ---
|
||||||
Параметры:
|
Параметры:
|
||||||
* eax = 30 - номер функции
|
* eax = 30 - номер функции
|
||||||
* ebx = 4 - номер подфункции
|
* ebx = 4 - номер подфункции
|
||||||
|
* ecx = указатель на строку с путём к новой текущей папке
|
||||||
|
* edx = кодировка строки, подробности указаны в описании функции 80.
|
||||||
|
Возвращаемое значение:
|
||||||
|
* функция не возвращает значения
|
||||||
|
----------------------------------------------------------------------
|
||||||
|
---- Подфункция 5 - получить текущую папку с указанием кодировки. ----
|
||||||
|
Параметры:
|
||||||
|
* eax = 30 - номер функции
|
||||||
|
* ebx = 5 - номер подфункции
|
||||||
* ecx = указатель на буфер
|
* ecx = указатель на буфер
|
||||||
* edx = размер буфера
|
* edx = размер буфера
|
||||||
|
* esi = кодировка строки
|
||||||
Возвращаемое значение:
|
Возвращаемое значение:
|
||||||
* eax = количество символов в строке (включая завершающий 0)
|
* eax = длина строки в байтах (включая завершающий 0)
|
||||||
Замечания:
|
Замечания:
|
||||||
* Если размера буфера недостаточно для копирования всего имени,
|
* Если размера буфера недостаточно для копирования всего пути,
|
||||||
копируются только первые (edx-2) байт и в конце ставится
|
копируются только часть строки и в конце ставится завершающий 0.
|
||||||
завершающий 0.
|
|
||||||
* По умолчанию, текущая папка для потока - "/rd/1".
|
* По умолчанию, текущая папка для потока - "/rd/1".
|
||||||
* При создании процесса/потока текущая папка наследуется от
|
* При создании процесса/потока текущая папка наследуется от
|
||||||
родителя.
|
родителя.
|
||||||
@ -3380,6 +3382,22 @@ Architecture Software Developer's Manual, Volume 3, Appendix B);
|
|||||||
eax - SF_SYS_MISC (68)
|
eax - SF_SYS_MISC (68)
|
||||||
ebx - SSF_CONTROL_DRIVER (17)
|
ebx - SSF_CONTROL_DRIVER (17)
|
||||||
======================================================================
|
======================================================================
|
||||||
|
== Функция 68, подфункция 18 - загрузить DLL с указанием кодировки. ==
|
||||||
|
======================================================================
|
||||||
|
Параметры:
|
||||||
|
* eax = 68 - номер функции
|
||||||
|
* ebx = 18 - номер подфункции
|
||||||
|
* ecx = указатель на строку с путём к DLL
|
||||||
|
* edx = кодировка строки, подробности указаны в описании функции 80.
|
||||||
|
Возвращаемое значение:
|
||||||
|
* eax = 0 - неудача
|
||||||
|
* иначе eax = указатель на таблицу экспорта DLL
|
||||||
|
Замечания:
|
||||||
|
* Таблица экспорта представляет собой массив структур по 2 dword'а,
|
||||||
|
заканчивающийся нулём. Первый dword в структуре является
|
||||||
|
указателем на имя функции, второй содержит адрес функции.
|
||||||
|
|
||||||
|
======================================================================
|
||||||
============= Функция 68, подфункция 19 - загрузить DLL. =============
|
============= Функция 68, подфункция 19 - загрузить DLL. =============
|
||||||
======================================================================
|
======================================================================
|
||||||
Параметры:
|
Параметры:
|
||||||
@ -3390,10 +3408,6 @@ Architecture Software Developer's Manual, Volume 3, Appendix B);
|
|||||||
Возвращаемое значение:
|
Возвращаемое значение:
|
||||||
* eax = 0 - неудача
|
* eax = 0 - неудача
|
||||||
* иначе eax = указатель на таблицу экспорта DLL
|
* иначе eax = указатель на таблицу экспорта DLL
|
||||||
Замечания:
|
|
||||||
* Таблица экспорта представляет собой массив структур по 2 dword'а,
|
|
||||||
заканчивающийся нулём. Первый dword в структуре является
|
|
||||||
указателем на имя функции, второй содержит адрес функции.
|
|
||||||
|
|
||||||
---------------------- Константы для регистров: ----------------------
|
---------------------- Константы для регистров: ----------------------
|
||||||
eax - SF_SYS_MISC (68)
|
eax - SF_SYS_MISC (68)
|
||||||
@ -3557,7 +3571,7 @@ Architecture Software Developer's Manual, Volume 3, Appendix B);
|
|||||||
eax - SF_SYS_MISC (68)
|
eax - SF_SYS_MISC (68)
|
||||||
ebx - SSF_SET_EXCEPTION_STATE (25)
|
ebx - SSF_SET_EXCEPTION_STATE (25)
|
||||||
======================================================================
|
======================================================================
|
||||||
= Функция 68, подфункция 26 - освободить страницы памяти ============
|
======= Функция 68, подфункция 26 - освободить страницы памяти =======
|
||||||
======================================================================
|
======================================================================
|
||||||
Параметры:
|
Параметры:
|
||||||
* eax = 68 - номер функции
|
* eax = 68 - номер функции
|
||||||
@ -3573,7 +3587,7 @@ Architecture Software Developer's Manual, Volume 3, Appendix B);
|
|||||||
eax - SF_SYS_MISC (68)
|
eax - SF_SYS_MISC (68)
|
||||||
ebx - SSF_MEM_FREE_EXT (26)
|
ebx - SSF_MEM_FREE_EXT (26)
|
||||||
======================================================================
|
======================================================================
|
||||||
= Функция 68, подфункция 27 - загрузить файл ===================
|
============= Функция 68, подфункция 27 - загрузить файл =============
|
||||||
======================================================================
|
======================================================================
|
||||||
Параметры:
|
Параметры:
|
||||||
* eax = 68 - номер функции
|
* eax = 68 - номер функции
|
||||||
@ -3590,6 +3604,20 @@ Architecture Software Developer's Manual, Volume 3, Appendix B);
|
|||||||
eax - SF_SYS_MISC (68)
|
eax - SF_SYS_MISC (68)
|
||||||
ebx - SSF_LOAD_FILE (27)
|
ebx - SSF_LOAD_FILE (27)
|
||||||
======================================================================
|
======================================================================
|
||||||
|
== Функция 68, подфункция 28 - загрузить файл с указанием кодировки ==
|
||||||
|
======================================================================
|
||||||
|
Параметры:
|
||||||
|
* eax = 68 - номер функции
|
||||||
|
* ebx = 28 - номер подфункции
|
||||||
|
* ecx = указатель на строку с путём к файлу
|
||||||
|
* edx = кодировка строки, подробности указаны в описании функции 80.
|
||||||
|
Возвращаемое значение:
|
||||||
|
* eax = указатель на загруженный файл или 0
|
||||||
|
* edx = размер загруженного файла или 0
|
||||||
|
Примечания:
|
||||||
|
* функция загружает и, при необходимости, распаковывает файл (kunpack)
|
||||||
|
|
||||||
|
======================================================================
|
||||||
======================== Функция 69 - отладка. =======================
|
======================== Функция 69 - отладка. =======================
|
||||||
======================================================================
|
======================================================================
|
||||||
Процесс может загрузить другой процесс как отлаживаемый установкой
|
Процесс может загрузить другой процесс как отлаживаемый установкой
|
||||||
@ -3891,9 +3919,9 @@ Architecture Software Developer's Manual, Volume 3, Appendix B);
|
|||||||
в других регистрах
|
в других регистрах
|
||||||
Общий формат информационной структуры:
|
Общий формат информационной структуры:
|
||||||
* +0: dword: номер подфункции
|
* +0: dword: номер подфункции
|
||||||
* +4: dword: смещение в файле
|
* +4: dword: смещение в файле или папке
|
||||||
* +8: dword: старший dword смещения (должен быть 0) или поле флагов
|
* +8: dword: старшая часть смещения или поле флагов
|
||||||
* +12 = +0xC: dword: размер
|
* +12 = +0xC: dword: размер данных
|
||||||
* +16 = +0x10: dword: указатель на данные
|
* +16 = +0x10: dword: указатель на данные
|
||||||
* +20 = +0x14: ?: текстовая строка - путь к файлу, заканчивается нулём
|
* +20 = +0x14: ?: текстовая строка - путь к файлу, заканчивается нулём
|
||||||
или
|
или
|
||||||
@ -3902,13 +3930,14 @@ Architecture Software Developer's Manual, Volume 3, Appendix B);
|
|||||||
Чувствительность к регистру букв зависит от файловой системы.
|
Чувствительность к регистру букв зависит от файловой системы.
|
||||||
Если путь начинается не с '/', то он считается относительным.
|
Если путь начинается не с '/', то он считается относительным.
|
||||||
Получить или установить текущую папку можно с помощью сисфункции 30.
|
Получить или установить текущую папку можно с помощью сисфункции 30.
|
||||||
'../' в начале пути означает подъём на одну папку относительно текущей.
|
'../' в пути означает подъём на одну папку относительно текущей.
|
||||||
Можно указать кодировку строки, поместив в её начале байт со значениями:
|
Можно указать кодировку строки, поместив в её начале байт со значениями:
|
||||||
* 1 = cp866
|
* 1 = cp866
|
||||||
* 2 = UTF-16LE
|
* 2 = UTF-16LE
|
||||||
* 3 = UTF-8
|
* 3 = UTF-8
|
||||||
иначе будет использоваться кодировка cp866. В абсолютном пути можно
|
иначе будет использоваться кодировка cp866. В абсолютном пути можно
|
||||||
поместить этот байт после '/' или добавить дополнительный '/' перед ним.
|
поместить этот байт после '/' или добавить дополнительный '/' перед ним.
|
||||||
|
Также, можно использовать сисфункцию 80.
|
||||||
Формат абсолютного пути:
|
Формат абсолютного пути:
|
||||||
/base/number/dir1/dir2/.../dirn/file,
|
/base/number/dir1/dir2/.../dirn/file,
|
||||||
где base/number идентифицирует устройство, на котором ищется файл:
|
где base/number идентифицирует устройство, на котором ищется файл:
|
||||||
@ -3992,11 +4021,12 @@ Architecture Software Developer's Manual, Volume 3, Appendix B);
|
|||||||
* +0: dword: 1 = номер подфункции
|
* +0: dword: 1 = номер подфункции
|
||||||
* +4: dword: индекс начального блока (считая с 0)
|
* +4: dword: индекс начального блока (считая с 0)
|
||||||
* +8: dword: в какой кодировке возвращать имена:
|
* +8: dword: в какой кодировке возвращать имена:
|
||||||
0 = cp866 -> байт на символ
|
0 = по умолчанию
|
||||||
1 = UTF-16LE -> 2 байта на символ
|
1 = cp866
|
||||||
|
2 = UTF-16LE
|
||||||
|
3 = UTF-8
|
||||||
* +12 = +0xC: dword: сколько блоков читать
|
* +12 = +0xC: dword: сколько блоков читать
|
||||||
* +16 = +0x10: dword: указатель на буфер, куда будут записаны
|
* +16 = +0x10: dword: указатель на буфер, куда будут записаны данные.
|
||||||
данные, размер буфера должен быть не меньше 32+n(40+256*enc+8) байт
|
|
||||||
* +20 = +0x14: путь, правила формирования имён указаны в общем описании
|
* +20 = +0x14: путь, правила формирования имён указаны в общем описании
|
||||||
Возвращаемое значение:
|
Возвращаемое значение:
|
||||||
* eax = 0 - успешно, иначе код ошибки файловой системы
|
* eax = 0 - успешно, иначе код ошибки файловой системы
|
||||||
@ -4029,9 +4059,7 @@ Architecture Software Developer's Manual, Volume 3, Appendix B);
|
|||||||
это может быть полезно для автоматического создания
|
это может быть полезно для автоматического создания
|
||||||
backup-архивов, ибо при записи бит обычно устанавливается
|
backup-архивов, ибо при записи бит обычно устанавливается
|
||||||
(не в Kolibri, правда)
|
(не в Kolibri, правда)
|
||||||
* +4: dword: кодировка имени:
|
* +4: dword: кодировка имени, соответствует полю +8 информационной структуры
|
||||||
* 0 = cp866 -> байт на символ
|
|
||||||
* 1 = UTF-16LE -> 2 байта на символ
|
|
||||||
* +8: 4*byte: время создания файла
|
* +8: 4*byte: время создания файла
|
||||||
* +12 = +0xC: 4*byte: дата создания файла
|
* +12 = +0xC: 4*byte: дата создания файла
|
||||||
* +16 = +0x10: 4*byte: время последнего доступа (чтение или запись)
|
* +16 = +0x10: 4*byte: время последнего доступа (чтение или запись)
|
||||||
@ -4039,7 +4067,7 @@ Architecture Software Developer's Manual, Volume 3, Appendix B);
|
|||||||
* +24 = +0x18: 4*byte: время последней модификации
|
* +24 = +0x18: 4*byte: время последней модификации
|
||||||
* +28 = +0x1C: 4*byte: дата последней модификации
|
* +28 = +0x1C: 4*byte: дата последней модификации
|
||||||
* +32 = +0x20: qword: размер файла в байтах (до 16777216 Тб)
|
* +32 = +0x20: qword: размер файла в байтах (до 16777216 Тб)
|
||||||
* +40 = +0x28: (256*enc+8)*byte: имя
|
* +40 = +0x28: имя, размер в cp866 составляет 264 байта, иначе - 520 байт.
|
||||||
Формат времени:
|
Формат времени:
|
||||||
* +0: byte: секунды
|
* +0: byte: секунды
|
||||||
* +1: byte: минуты
|
* +1: byte: минуты
|
||||||
@ -4052,9 +4080,8 @@ Architecture Software Developer's Manual, Volume 3, Appendix B);
|
|||||||
* +2: word: год
|
* +2: word: год
|
||||||
* например, 25.11.1979 записывается как (в hex) 19 0B BB 07
|
* например, 25.11.1979 записывается как (в hex) 19 0B BB 07
|
||||||
Замечания:
|
Замечания:
|
||||||
* Если в БДВК присутствует имя в cp866, то длина БДВК составляет
|
* Если БДВК содержит имя в cp866, то длина БДВК составляет
|
||||||
304 байта, если в UTF-16LE - 560 байт. Значение длины выравнено
|
304 байта, иначе - 560 байт.
|
||||||
на целое кратное 16 байт для ускорения обработки в кэш-памяти CPU.
|
|
||||||
* Строка имени заканчивается нулём, дальнейшие данные содержат мусор.
|
* Строка имени заканчивается нулём, дальнейшие данные содержат мусор.
|
||||||
* Если файлы в папке кончились раньше, чем было прочитано
|
* Если файлы в папке кончились раньше, чем было прочитано
|
||||||
запрошенное количество, то функция прочитает, сколько сможет,
|
запрошенное количество, то функция прочитает, сколько сможет,
|
||||||
@ -4343,7 +4370,7 @@ Architecture Software Developer's Manual, Volume 3, Appendix B);
|
|||||||
B - блит на фоновую поферхность
|
B - блит на фоновую поферхность
|
||||||
T - блит с прозрачностью
|
T - блит с прозрачностью
|
||||||
CR - относительно клиентской области окна
|
CR - относительно клиентской области окна
|
||||||
|
|
||||||
* ecx = указатель на параметры функции
|
* ecx = указатель на параметры функции
|
||||||
смещение цели и отсечение
|
смещение цели и отсечение
|
||||||
+0 signed dword: смещение по X окна, для целевого прямоугольника
|
+0 signed dword: смещение по X окна, для целевого прямоугольника
|
||||||
@ -4834,6 +4861,31 @@ Architecture Software Developer's Manual, Volume 3, Appendix B);
|
|||||||
|
|
||||||
---------------------- Константы для регистров: ----------------------
|
---------------------- Константы для регистров: ----------------------
|
||||||
eax - SF_TERMINATE_PROCESS (-1)
|
eax - SF_TERMINATE_PROCESS (-1)
|
||||||
|
======================================================================
|
||||||
|
=== Функция 80 - работа с файловой системой с указанием кодировки. ===
|
||||||
|
======================================================================
|
||||||
|
Параметры:
|
||||||
|
* eax = 80
|
||||||
|
* ebx = указатель на информационную структуру
|
||||||
|
Возвращаемое значение:
|
||||||
|
* eax = 0 - успешно; иначе код ошибки файловой системы
|
||||||
|
* в зависимости от подфункции может возвращаться значение и
|
||||||
|
в других регистрах
|
||||||
|
Общий формат информационной структуры:
|
||||||
|
* +0: dword: номер подфункции
|
||||||
|
* +4: dword: смещение в файле или папке
|
||||||
|
* +8: dword: старшая часть смещения или поле флагов
|
||||||
|
* +12 = +0xC: dword: размер данных
|
||||||
|
* +16 = +0x10: dword: указатель на данные
|
||||||
|
* +20 = +0x14: dword: кодировка строки:
|
||||||
|
1 = cp866
|
||||||
|
2 = UTF-16LE
|
||||||
|
3 = UTF-8
|
||||||
|
0 = по умолчанию (поддерживает байт кодировки в начале строки)
|
||||||
|
* +24 = +0x18: dword: указатель на строку пути (заканчивается нулём)
|
||||||
|
|
||||||
|
В остальном полностью соответствует функции 70.
|
||||||
|
|
||||||
======================================================================
|
======================================================================
|
||||||
=========================== Список событий ===========================
|
=========================== Список событий ===========================
|
||||||
======================================================================
|
======================================================================
|
||||||
|
@ -1677,7 +1677,6 @@ Remarks:
|
|||||||
======================================================================
|
======================================================================
|
||||||
============= Function 30 - work with the current folder. ============
|
============= Function 30 - work with the current folder. ============
|
||||||
======================================================================
|
======================================================================
|
||||||
|
|
||||||
--------- Subfunction 1 - set current folder for the thread. ---------
|
--------- Subfunction 1 - set current folder for the thread. ---------
|
||||||
Parameters:
|
Parameters:
|
||||||
* eax = 30 - function number
|
* eax = 30 - function number
|
||||||
@ -1686,7 +1685,7 @@ Parameters:
|
|||||||
rules of path forming can be found in function 70 description.
|
rules of path forming can be found in function 70 description.
|
||||||
Returned value:
|
Returned value:
|
||||||
* function does not return value
|
* function does not return value
|
||||||
|
----------------------------------------------------------------------
|
||||||
--------- Subfunction 2 - get current folder for the thread. ---------
|
--------- Subfunction 2 - get current folder for the thread. ---------
|
||||||
Parameters:
|
Parameters:
|
||||||
* eax = 30 - function number
|
* eax = 30 - function number
|
||||||
@ -1694,26 +1693,21 @@ Parameters:
|
|||||||
* ecx = pointer to buffer
|
* ecx = pointer to buffer
|
||||||
* edx = size of buffer
|
* edx = size of buffer
|
||||||
Returned value:
|
Returned value:
|
||||||
* eax = size of the current folder's name (including terminating 0)
|
* eax = size of the string (including terminating 0)
|
||||||
Remarks:
|
Remarks:
|
||||||
* If the buffer is too small to hold all data, only first (edx-1)
|
* If the buffer is too small to hold all path, only part of the string
|
||||||
bytes are copied and than terminating 0 is inserted.
|
will be copied and terminated with 0.
|
||||||
* By default, current folder for the thread is "/rd/1".
|
* By default, current folder for the thread is "/rd/1".
|
||||||
* At process/thread creation the current folder will be inherited
|
* At process/thread creation the current folder will be inherited
|
||||||
from the parent.
|
from the parent.
|
||||||
|
----------------------------------------------------------------------
|
||||||
--- Subfunction 3 - install the add.system directory for the kernel --
|
--- Subfunction 3 - install the add.system directory for the kernel --
|
||||||
Parameters:
|
Parameters:
|
||||||
* eax = 30 - function number
|
* eax = 30 - function number
|
||||||
* ebx = 3 - subfunction number
|
* ebx = 3 - subfunction number
|
||||||
* ecx = pointer to a block of data:
|
* ecx = pointer to a block of data:
|
||||||
for cp866 encoding:
|
|
||||||
key rb 64
|
key rb 64
|
||||||
path rb 64
|
path rb 64
|
||||||
for UTF-16LE encoding:
|
|
||||||
key rb 64
|
|
||||||
dw 2
|
|
||||||
path rw 31
|
|
||||||
Example:
|
Example:
|
||||||
align 64
|
align 64
|
||||||
key db 'kolibrios',0 ; key must be in lower case
|
key db 'kolibrios',0 ; key must be in lower case
|
||||||
@ -1724,19 +1718,29 @@ Returned value:
|
|||||||
* function does not return value
|
* function does not return value
|
||||||
Remarks:
|
Remarks:
|
||||||
* The function can be called only 1 time for 1 session of the OS.
|
* The function can be called only 1 time for 1 session of the OS.
|
||||||
* The key is not affected by encoding.
|
* On input the symbolic key is not changing by encoding.
|
||||||
|
----------------------------------------------------------------------
|
||||||
------ Subfunction 4 - get current folder in UTF-16LE encoding. ------
|
---- Subfunction 4 - set current folder, specifying the encoding. ----
|
||||||
Parameters:
|
Parameters:
|
||||||
* eax = 30 - function number
|
* eax = 30 - function number
|
||||||
* ebx = 4 - subfunction number
|
* ebx = 4 - subfunction number
|
||||||
|
* ecx = pointer to string with the path to new current folder
|
||||||
|
* edx = string encoding, details can be found in function 80 description.
|
||||||
|
Returned value:
|
||||||
|
* function does not return value
|
||||||
|
----------------------------------------------------------------------
|
||||||
|
---- Subfunction 5 - get current folder, specifying the encoding. ----
|
||||||
|
Parameters:
|
||||||
|
* eax = 30 - function number
|
||||||
|
* ebx = 5 - subfunction number
|
||||||
* ecx = pointer to buffer
|
* ecx = pointer to buffer
|
||||||
* edx = size of buffer
|
* edx = size of buffer
|
||||||
|
* esi = string encoding
|
||||||
Returned value:
|
Returned value:
|
||||||
* eax = number of chars in the buffer (including terminating 0)
|
* eax = size of the string in bytes (including terminating 0)
|
||||||
Remarks:
|
Remarks:
|
||||||
* If the buffer is too small to hold all data, only first (edx-2)
|
* If the buffer is too small to hold all path, only part of the string
|
||||||
bytes are copied and than terminating 0 is inserted.
|
will be copied and terminated with 0.
|
||||||
* By default, current folder for the thread is "/rd/1".
|
* By default, current folder for the thread is "/rd/1".
|
||||||
* At process/thread creation the current folder will be inherited
|
* At process/thread creation the current folder will be inherited
|
||||||
from the parent.
|
from the parent.
|
||||||
@ -3343,6 +3347,22 @@ Remarks:
|
|||||||
eax - SF_SYS_MISC (68)
|
eax - SF_SYS_MISC (68)
|
||||||
ebx - SSF_CONTROL_DRIVER (17)
|
ebx - SSF_CONTROL_DRIVER (17)
|
||||||
======================================================================
|
======================================================================
|
||||||
|
== Function 68, subfunction 18 - load DLL, specifying the encoding. ==
|
||||||
|
======================================================================
|
||||||
|
Parameters:
|
||||||
|
* eax = 68 - function number
|
||||||
|
* ebx = 18 - subfunction number
|
||||||
|
* ecx = pointer to the string with path to DLL
|
||||||
|
* edx = string encoding, details can be found in function 80 description.
|
||||||
|
Returned value:
|
||||||
|
* eax = 0 - failed
|
||||||
|
* otherwise eax = pointer to DLL export table
|
||||||
|
Remarks:
|
||||||
|
* Export table is an array of structures of 2 dword's, terminated
|
||||||
|
by zero. The first dword in structure points to function name,
|
||||||
|
the second dword contains address of function.
|
||||||
|
|
||||||
|
======================================================================
|
||||||
=============== Function 68, subfunction 19 - load DLL. ==============
|
=============== Function 68, subfunction 19 - load DLL. ==============
|
||||||
======================================================================
|
======================================================================
|
||||||
Parameters:
|
Parameters:
|
||||||
@ -3353,10 +3373,6 @@ Parameters:
|
|||||||
Returned value:
|
Returned value:
|
||||||
* eax = 0 - failed
|
* eax = 0 - failed
|
||||||
* otherwise eax = pointer to DLL export table
|
* otherwise eax = pointer to DLL export table
|
||||||
Remarks:
|
|
||||||
* Export table is an array of structures of 2 dword's, terminated
|
|
||||||
by zero. The first dword in structure points to function name,
|
|
||||||
the second dword contains address of function.
|
|
||||||
|
|
||||||
---------------------- Constants for registers: ----------------------
|
---------------------- Constants for registers: ----------------------
|
||||||
eax - SF_SYS_MISC (68)
|
eax - SF_SYS_MISC (68)
|
||||||
@ -3552,6 +3568,20 @@ Remarks:
|
|||||||
eax - SF_SYS_MISC (68)
|
eax - SF_SYS_MISC (68)
|
||||||
ebx - SSF_LOAD_FILE (27)
|
ebx - SSF_LOAD_FILE (27)
|
||||||
======================================================================
|
======================================================================
|
||||||
|
== Function 68, subfunction 28 - load file, specifying the encoding ==
|
||||||
|
======================================================================
|
||||||
|
Parameters:
|
||||||
|
* eax = 68 - function number
|
||||||
|
* ebx = 28 - subfunction number
|
||||||
|
* ecx = pointer to the string with path to file
|
||||||
|
* edx = string encoding, details can be found in function 80 description.
|
||||||
|
Returned value:
|
||||||
|
* eax = pointer to the loaded file, or zero
|
||||||
|
* edx = size of the loaded file, or zero
|
||||||
|
Remarks:
|
||||||
|
* function loads file and unpacks, if necessary
|
||||||
|
|
||||||
|
======================================================================
|
||||||
====================== Function 69 - debugging. ======================
|
====================== Function 69 - debugging. ======================
|
||||||
======================================================================
|
======================================================================
|
||||||
A process can load other process as debugged by set of corresponding
|
A process can load other process as debugged by set of corresponding
|
||||||
@ -3847,9 +3877,9 @@ Returned value:
|
|||||||
* some subfunctions return value in other registers too
|
* some subfunctions return value in other registers too
|
||||||
General format of the information structure:
|
General format of the information structure:
|
||||||
* +0: dword: subfunction number
|
* +0: dword: subfunction number
|
||||||
* +4: dword: file offset
|
* +4: dword: offset in file or folder
|
||||||
* +8: dword: high dword of offset (must be 0) or flags field
|
* +8: dword: higher part of offset or flags
|
||||||
* +12 = +0xC: dword: size
|
* +12 = +0xC: dword: size of data
|
||||||
* +16 = +0x10: dword: pointer to data
|
* +16 = +0x10: dword: pointer to data
|
||||||
* +20 = +0x14: ?: path - zero terminated string
|
* +20 = +0x14: ?: path - zero terminated string
|
||||||
or
|
or
|
||||||
@ -3857,14 +3887,15 @@ General format of the information structure:
|
|||||||
* +21 = +0x15: dword: pointer to string
|
* +21 = +0x15: dword: pointer to string
|
||||||
Case sensitivity depends on filesystem.
|
Case sensitivity depends on filesystem.
|
||||||
If a path not begins with '/', it is considered a relative.
|
If a path not begins with '/', it is considered a relative.
|
||||||
To get or set the current folder, use the function 30.
|
To get or set the current folder, use the sysfunction 30.
|
||||||
'../' in the beginning means a lift by one folder relatively current folder.
|
'../' in the path means a lift by one folder relatively current folder.
|
||||||
To set the encoding, put at the start of the string a byte with next values:
|
To set the encoding, put at the start of the string a byte with next values:
|
||||||
* 1 = cp866
|
* 1 = cp866
|
||||||
* 2 = UTF-16LE
|
* 2 = UTF-16LE
|
||||||
* 3 = UTF-8
|
* 3 = UTF-8
|
||||||
otherwise will be used cp866. In an absolute path
|
otherwise will be used cp866. In an absolute path
|
||||||
you may put this byte after the '/' or put an additional '/' before it.
|
you may put this byte after the '/' or put an additional '/' before it.
|
||||||
|
Also, you may use the sysfunction 80.
|
||||||
Format of an absolute path:
|
Format of an absolute path:
|
||||||
/base/number/dir1/dir2/.../dirn/file,
|
/base/number/dir1/dir2/.../dirn/file,
|
||||||
where base/number identifies device, on which file is located:
|
where base/number identifies device, on which file is located:
|
||||||
@ -3945,12 +3976,13 @@ Parameters:
|
|||||||
Format of the information structure:
|
Format of the information structure:
|
||||||
* +0: dword: 1 = subfunction number
|
* +0: dword: 1 = subfunction number
|
||||||
* +4: dword: index of starting block (beginning from 0)
|
* +4: dword: index of starting block (beginning from 0)
|
||||||
* +8: dword: encoding:
|
* +8: dword: names encoding:
|
||||||
* 0 = cp866 -> byte per char
|
0 = default
|
||||||
* 1 = UTF-16LE -> word per char
|
1 = cp866
|
||||||
|
2 = UTF-16LE
|
||||||
|
3 = UTF-8
|
||||||
* +12 = +0xC: dword: number of blocks to read
|
* +12 = +0xC: dword: number of blocks to read
|
||||||
* +16 = +0x10: dword: pointer to buffer for data, buffer size
|
* +16 = +0x10: dword: pointer to buffer for data
|
||||||
must be not less than 32+n(40+256*enc+8) bytes
|
|
||||||
* +20 = +0x14: path, general rules of names forming
|
* +20 = +0x14: path, general rules of names forming
|
||||||
Returned value:
|
Returned value:
|
||||||
* eax = 0 - success, otherwise file system error code
|
* eax = 0 - success, otherwise file system error code
|
||||||
@ -3982,9 +4014,7 @@ Structure of block of data for folder entry (BDFE):
|
|||||||
and after archiving this bit is cleared - it can be useful
|
and after archiving this bit is cleared - it can be useful
|
||||||
for automatically creating of backup-archives as at writing
|
for automatically creating of backup-archives as at writing
|
||||||
this bit is usually set
|
this bit is usually set
|
||||||
* +4: dword: encoding:
|
* +4: dword: encoding, equals to field +8 in the information structure
|
||||||
* 0 = cp866 -> byte per char
|
|
||||||
* 1 = UTF-16LE -> word per char
|
|
||||||
* +8: 4*byte: time of file creation
|
* +8: 4*byte: time of file creation
|
||||||
* +12 = +0xC: 4*byte: date of file creation
|
* +12 = +0xC: 4*byte: date of file creation
|
||||||
* +16 = +0x10: 4*byte: time of last access (read or write)
|
* +16 = +0x10: 4*byte: time of last access (read or write)
|
||||||
@ -3992,7 +4022,7 @@ Structure of block of data for folder entry (BDFE):
|
|||||||
* +24 = +0x18: 4*byte: time of last modification
|
* +24 = +0x18: 4*byte: time of last modification
|
||||||
* +28 = +0x1C: 4*byte: date of last modification
|
* +28 = +0x1C: 4*byte: date of last modification
|
||||||
* +32 = +0x20: qword: file size in bytes (up to 16777216 Tb)
|
* +32 = +0x20: qword: file size in bytes (up to 16777216 Tb)
|
||||||
* +40 = +0x28: (256*enc+8)*byte: name
|
* +40 = +0x28: name, 264 bytes in cp866, otherwise - 520 bytes.
|
||||||
Time format:
|
Time format:
|
||||||
* +0: byte: seconds
|
* +0: byte: seconds
|
||||||
* +1: byte: minutes
|
* +1: byte: minutes
|
||||||
@ -4006,8 +4036,7 @@ Date format:
|
|||||||
* for example, 25.11.1979 is written as (in hex) 19 0B BB 07
|
* for example, 25.11.1979 is written as (in hex) 19 0B BB 07
|
||||||
Remarks:
|
Remarks:
|
||||||
* If BDFE contains cp866 name, the length of BDFE is 304 bytes,
|
* If BDFE contains cp866 name, the length of BDFE is 304 bytes,
|
||||||
if UTF-16LE name - 560 bytes. Value of length is aligned
|
otherwise - 560 bytes.
|
||||||
on 16-byte bound to accelerate processing in CPU cache.
|
|
||||||
* Name string is zero terminated, further data contain garbage.
|
* Name string is zero terminated, further data contain garbage.
|
||||||
* If files in folder were ended before requested number was read,
|
* If files in folder were ended before requested number was read,
|
||||||
the function will read as many as it can, and after that return
|
the function will read as many as it can, and after that return
|
||||||
@ -5046,6 +5075,30 @@ Remarks:
|
|||||||
---------------------- Constants for registers: ----------------------
|
---------------------- Constants for registers: ----------------------
|
||||||
eax - SF_FUTEX (77)
|
eax - SF_FUTEX (77)
|
||||||
ebx - SSF_WAKE (3)
|
ebx - SSF_WAKE (3)
|
||||||
|
======================================================================
|
||||||
|
=== Function 80 - file system interface with parameter of encoding ===
|
||||||
|
======================================================================
|
||||||
|
Parameters:
|
||||||
|
* eax = 80
|
||||||
|
* ebx = pointer to the information structure
|
||||||
|
Returned value:
|
||||||
|
* eax = 0 - success; otherwise file system error code
|
||||||
|
* some subfunctions return value in other registers too
|
||||||
|
General format of the information structure:
|
||||||
|
* +0: dword: subfunction number
|
||||||
|
* +4: dword: offset in file or folder
|
||||||
|
* +8: dword: higher part of offset or flags
|
||||||
|
* +12 = +0xC: dword: size of data
|
||||||
|
* +16 = +0x10: dword: pointer to data
|
||||||
|
* +20 = +0x14: dword: string encoding:
|
||||||
|
1 = cp866
|
||||||
|
2 = UTF-16LE
|
||||||
|
3 = UTF-8
|
||||||
|
0 = default (supports encoding byte at the start of the string)
|
||||||
|
* +24 = +0x18: dword: pointer to zero terminated string with path
|
||||||
|
|
||||||
|
The rest is similar to sysfunction 70.
|
||||||
|
|
||||||
======================================================================
|
======================================================================
|
||||||
=============== Function -1 - terminate thread/process ===============
|
=============== Function -1 - terminate thread/process ===============
|
||||||
======================================================================
|
======================================================================
|
||||||
|
@ -1900,13 +1900,15 @@ ext_ReadFolder:
|
|||||||
mov esi, [esp+12]
|
mov esi, [esp+12]
|
||||||
movzx ecx, [esi+DIRENTRY.nameLength]
|
movzx ecx, [esi+DIRENTRY.nameLength]
|
||||||
lea esi, [esi+DIRENTRY.name]
|
lea esi, [esi+DIRENTRY.name]
|
||||||
add ecx, esi
|
|
||||||
cmp byte [esi], '.'
|
cmp byte [esi], '.'
|
||||||
jnz @f
|
jnz @f
|
||||||
or byte [edx], KOS_HIDDEN
|
or byte [edx], KOS_HIDDEN
|
||||||
@@:
|
@@:
|
||||||
lea edi, [edx+40]
|
lea edi, [edx+40]
|
||||||
cmp byte [edx+4], 1
|
cmp byte [edx+4], 3
|
||||||
|
jz .utf8
|
||||||
|
add ecx, esi
|
||||||
|
cmp byte [edx+4], 2
|
||||||
jz .utf16
|
jz .utf16
|
||||||
@@:
|
@@:
|
||||||
call utf8to16
|
call utf8to16
|
||||||
@ -1932,6 +1934,12 @@ ext_ReadFolder:
|
|||||||
push .wanted_start
|
push .wanted_start
|
||||||
jmp .end_block
|
jmp .end_block
|
||||||
|
|
||||||
|
.utf8:
|
||||||
|
rep movsb
|
||||||
|
mov byte [edi], 0
|
||||||
|
add edx, 40+520
|
||||||
|
jmp @b
|
||||||
|
|
||||||
.utf16:
|
.utf16:
|
||||||
call utf8to16
|
call utf8to16
|
||||||
stosw
|
stosw
|
||||||
|
@ -1410,26 +1410,36 @@ fat_entry_to_bdfe2:
|
|||||||
push edi esi
|
push edi esi
|
||||||
mov edi, esi
|
mov edi, esi
|
||||||
mov esi, ebp
|
mov esi, ebp
|
||||||
test byte [ebp-4], 1
|
cmp byte [ebp-4], 2
|
||||||
jz .ansi
|
jz .utf16
|
||||||
.uni:
|
cmp byte [ebp-4], 3
|
||||||
lodsw
|
jz .utf8
|
||||||
stosw
|
@@:
|
||||||
test eax, eax
|
|
||||||
jnz .uni
|
|
||||||
pop esi edi
|
|
||||||
add esi, 520
|
|
||||||
.ret:
|
|
||||||
ret
|
|
||||||
|
|
||||||
.ansi:
|
|
||||||
lodsw
|
lodsw
|
||||||
call uni2ansi_char
|
call uni2ansi_char
|
||||||
stosb
|
stosb
|
||||||
test al, al
|
test al, al
|
||||||
jnz .ansi
|
jnz @b
|
||||||
pop esi edi
|
pop esi edi
|
||||||
add esi, 264
|
add esi, 264
|
||||||
|
.ret:
|
||||||
|
ret
|
||||||
|
|
||||||
|
.utf8:
|
||||||
|
push ecx
|
||||||
|
mov ecx, 519
|
||||||
|
call UTF16to8_string
|
||||||
|
pop ecx
|
||||||
|
jmp @f
|
||||||
|
|
||||||
|
.utf16:
|
||||||
|
lodsw
|
||||||
|
stosw
|
||||||
|
test eax, eax
|
||||||
|
jnz .utf16
|
||||||
|
@@:
|
||||||
|
pop esi edi
|
||||||
|
add esi, 520
|
||||||
ret
|
ret
|
||||||
|
|
||||||
bdfe_to_fat_entry:
|
bdfe_to_fat_entry:
|
||||||
|
@ -38,31 +38,30 @@ file_system_lfn_protected:
|
|||||||
mov [image_of_ebx], ebx
|
mov [image_of_ebx], ebx
|
||||||
ret
|
ret
|
||||||
|
|
||||||
|
fileSystemUnicode:
|
||||||
|
; in: ebx -> f.80 parameter structure
|
||||||
|
mov edi, [ebx+20]
|
||||||
|
mov esi, [ebx+24]
|
||||||
|
jmp @f
|
||||||
|
|
||||||
file_system_lfn:
|
file_system_lfn:
|
||||||
; in: ebx -> parameter structure
|
; in: ebx -> f.70 parameter structure
|
||||||
lea ebp, [ebx+20]
|
xor edi, edi
|
||||||
cmp byte [ebp], 0
|
lea esi, [ebx+20]
|
||||||
|
cmp byte [esi], 0
|
||||||
jnz @f
|
jnz @f
|
||||||
mov ebp, [ebx+21]
|
mov esi, [ebx+21]
|
||||||
@@:
|
@@:
|
||||||
cmp word [ebp], '/'
|
cmp word [esi], '/'
|
||||||
jz .rootdir
|
|
||||||
cmp byte [ebp], 4
|
|
||||||
jnc @f
|
|
||||||
cmp byte [ebp], 0
|
|
||||||
jz @f
|
|
||||||
cmp word [ebp+1], '/'
|
|
||||||
jnz @f
|
jnz @f
|
||||||
cmp byte [ebp], 2
|
cmp edi, 2
|
||||||
jnz .rootdir
|
jnz .rootdir
|
||||||
cmp word [ebp+3], 0
|
cmp dword[esi], '/'
|
||||||
jz .rootdir
|
jz .rootdir
|
||||||
@@:
|
@@:
|
||||||
stdcall kernel_alloc, maxPathLength
|
stdcall kernel_alloc, maxPathLength
|
||||||
push eax ebx
|
push eax ebx
|
||||||
xchg eax, edi
|
xchg eax, edi
|
||||||
mov esi, ebp
|
|
||||||
xor eax, eax
|
|
||||||
call getFullPath
|
call getFullPath
|
||||||
pop ebx ebp
|
pop ebx ebp
|
||||||
test eax, eax
|
test eax, eax
|
||||||
@ -367,9 +366,11 @@ process_replace_file_name:
|
|||||||
lodsb
|
lodsb
|
||||||
test al, al
|
test al, al
|
||||||
jz .cont
|
jz .cont
|
||||||
or al, 20h
|
|
||||||
scasb
|
scasb
|
||||||
jz @b
|
jz @b
|
||||||
|
or al, 20h
|
||||||
|
cmp [edi-1], al
|
||||||
|
jz @b
|
||||||
.cont:
|
.cont:
|
||||||
pop edi esi
|
pop edi esi
|
||||||
inc edi
|
inc edi
|
||||||
@ -397,14 +398,19 @@ endg
|
|||||||
sys_current_directory: ; sysfunction 30
|
sys_current_directory: ; sysfunction 30
|
||||||
mov eax, [current_slot]
|
mov eax, [current_slot]
|
||||||
mov edi, [eax+APPDATA.cur_dir]
|
mov edi, [eax+APPDATA.cur_dir]
|
||||||
|
xor eax, eax
|
||||||
dec ebx
|
dec ebx
|
||||||
jz .set
|
jz .set
|
||||||
dec ebx
|
dec ebx
|
||||||
jz .get
|
jz .get
|
||||||
dec ebx
|
dec ebx
|
||||||
jz .mount_additional_directory
|
jz .mount_additional_directory
|
||||||
|
mov eax, edx
|
||||||
dec ebx
|
dec ebx
|
||||||
jz .get16
|
jz .set
|
||||||
|
mov eax, esi
|
||||||
|
dec ebx
|
||||||
|
jz .get
|
||||||
@@:
|
@@:
|
||||||
ret
|
ret
|
||||||
|
|
||||||
@ -416,26 +422,17 @@ sys_current_directory: ; sysfunction 30
|
|||||||
jnz @b
|
jnz @b
|
||||||
mov esi, ecx
|
mov esi, ecx
|
||||||
mov edi, sysdir_name1
|
mov edi, sysdir_name1
|
||||||
mov ecx, 63
|
mov ecx, 64
|
||||||
rep movsb ; copying fake directory name
|
rep movsb ; copying fake directory name
|
||||||
inc esi
|
mov byte [edi-1], 0
|
||||||
xor eax, eax
|
|
||||||
stosb ; terminator of name, in case if we get the inlet trash
|
|
||||||
mov cl, 63
|
mov cl, 63
|
||||||
cmp word [esi], 2
|
|
||||||
jz .utf16
|
|
||||||
call cp866toUTF8_string
|
call cp866toUTF8_string
|
||||||
@@:
|
|
||||||
mov byte [edi], 0
|
mov byte [edi], 0
|
||||||
mov [full_file_name_table.size], 2
|
mov [full_file_name_table.size], 2
|
||||||
ret
|
ret
|
||||||
|
|
||||||
.utf16:
|
.get:
|
||||||
add esi, 2
|
; in: ecx -> buffer, edx = length, eax = encoding
|
||||||
call UTF16to8_string
|
|
||||||
jmp @b
|
|
||||||
|
|
||||||
.get: ; in: ecx -> buffer, edx = length
|
|
||||||
mov esi, edi
|
mov esi, edi
|
||||||
inc esi
|
inc esi
|
||||||
mov edi, ecx
|
mov edi, ecx
|
||||||
@ -444,6 +441,11 @@ sys_current_directory: ; sysfunction 30
|
|||||||
mov edx, maxPathLength
|
mov edx, maxPathLength
|
||||||
@@:
|
@@:
|
||||||
mov ecx, edx
|
mov ecx, edx
|
||||||
|
jecxz .ret
|
||||||
|
cmp eax, 2
|
||||||
|
jz .get16
|
||||||
|
cmp eax, 3
|
||||||
|
jz .get8
|
||||||
@@:
|
@@:
|
||||||
dec ecx
|
dec ecx
|
||||||
js @f
|
js @f
|
||||||
@ -453,21 +455,26 @@ sys_current_directory: ; sysfunction 30
|
|||||||
test al, al
|
test al, al
|
||||||
jnz @b
|
jnz @b
|
||||||
sub edx, ecx
|
sub edx, ecx
|
||||||
mov ecx, edx
|
|
||||||
@@:
|
@@:
|
||||||
mov [esp+32], ecx
|
mov byte [edi-1], 0
|
||||||
|
.ret:
|
||||||
|
mov [esp+32], edx
|
||||||
ret
|
ret
|
||||||
|
|
||||||
.get16:
|
.get8:
|
||||||
mov esi, edi
|
push edi
|
||||||
inc esi
|
mov edi, esi
|
||||||
mov edi, ecx
|
xor eax, eax
|
||||||
cmp edx, maxPathLength
|
repnz scasb
|
||||||
jc @f
|
sub edx, ecx
|
||||||
mov edx, maxPathLength
|
|
||||||
@@:
|
|
||||||
shr edx, 1
|
|
||||||
mov ecx, edx
|
mov ecx, edx
|
||||||
|
pop edi
|
||||||
|
rep movsb
|
||||||
|
jmp @b
|
||||||
|
|
||||||
|
.get16:
|
||||||
|
shr ecx, 1
|
||||||
|
shr edx, 1
|
||||||
@@:
|
@@:
|
||||||
dec ecx
|
dec ecx
|
||||||
js @f
|
js @f
|
||||||
@ -476,14 +483,13 @@ sys_current_directory: ; sysfunction 30
|
|||||||
test ax, ax
|
test ax, ax
|
||||||
jnz @b
|
jnz @b
|
||||||
sub edx, ecx
|
sub edx, ecx
|
||||||
mov ecx, edx
|
|
||||||
@@:
|
@@:
|
||||||
mov [esp+32], ecx
|
shl edx, 1
|
||||||
ret
|
mov word [edi-2], 0
|
||||||
|
jmp .ret
|
||||||
|
|
||||||
.set:
|
.set:
|
||||||
mov esi, ecx
|
mov esi, ecx
|
||||||
xor eax, eax
|
|
||||||
getFullPath:
|
getFullPath:
|
||||||
; in: esi -> file path, eax = string encoding, edi -> destination
|
; in: esi -> file path, eax = string encoding, edi -> destination
|
||||||
; out: UTF-8 string (with marker), eax = length, 0 -> error
|
; out: UTF-8 string (with marker), eax = length, 0 -> error
|
||||||
|
@ -297,34 +297,44 @@ fs_CdReadFolder:
|
|||||||
push edi
|
push edi
|
||||||
call cd_find_lfn
|
call cd_find_lfn
|
||||||
jnc .found
|
jnc .found
|
||||||
|
|
||||||
pop edi
|
pop edi
|
||||||
cmp [DevErrorCode], 0
|
cmp [DevErrorCode], 0
|
||||||
jne .noaccess_1
|
jne .noaccess_1
|
||||||
|
|
||||||
or ebx, -1
|
or ebx, -1
|
||||||
mov eax, ERROR_FILE_NOT_FOUND
|
mov eax, ERROR_FILE_NOT_FOUND
|
||||||
ret
|
ret
|
||||||
;--------------------------------------
|
|
||||||
.found:
|
.found:
|
||||||
mov edi, [cd_current_pointer_of_input]
|
mov edi, [cd_current_pointer_of_input]
|
||||||
test byte [edi+25], 10b ; do not allow read directories
|
test byte [edi+25], 10b ; do not allow read directories
|
||||||
jnz .found_dir
|
jnz .found_dir
|
||||||
|
|
||||||
pop edi
|
pop edi
|
||||||
;--------------------------------------
|
|
||||||
.noaccess_1:
|
.noaccess_1:
|
||||||
or ebx, -1
|
or ebx, -1
|
||||||
mov eax, ERROR_ACCESS_DENIED
|
mov eax, ERROR_ACCESS_DENIED
|
||||||
ret
|
ret
|
||||||
;--------------------------------------
|
|
||||||
|
.end_buffer:
|
||||||
|
pop edx eax
|
||||||
|
sub eax, 2048 ; directory is over?
|
||||||
|
ja .read_to_buffer
|
||||||
|
mov eax, [cd_counter_block]
|
||||||
|
mov [edx+8], eax
|
||||||
|
mov eax, [ebx]
|
||||||
|
sub [edx+4], eax
|
||||||
|
xor eax, eax
|
||||||
|
dec ecx
|
||||||
|
js @f
|
||||||
|
mov al, ERROR_END_OF_FILE
|
||||||
|
@@:
|
||||||
|
pop ecx edi
|
||||||
|
mov ebx, [edx+4]
|
||||||
|
ret
|
||||||
|
|
||||||
.found_dir:
|
.found_dir:
|
||||||
mov eax, [edi+2] ; eax=cluster
|
mov eax, [edi+2] ; eax=cluster
|
||||||
mov [CDSectorAddress], eax
|
mov [CDSectorAddress], eax
|
||||||
mov eax, [edi+10] ; directory size
|
mov eax, [edi+10] ; directory size
|
||||||
;--------------------------------------
|
|
||||||
.doit:
|
|
||||||
; init header
|
|
||||||
push eax ecx
|
push eax ecx
|
||||||
mov edi, edx
|
mov edi, edx
|
||||||
mov ecx, 32/4
|
mov ecx, 32/4
|
||||||
@ -334,153 +344,115 @@ fs_CdReadFolder:
|
|||||||
mov byte [edx], 1 ; version
|
mov byte [edx], 1 ; version
|
||||||
mov [cd_mem_location], edx
|
mov [cd_mem_location], edx
|
||||||
add [cd_mem_location], 32
|
add [cd_mem_location], 32
|
||||||
;.mainloop:
|
|
||||||
mov [cd_counter_block], dword 0
|
mov [cd_counter_block], dword 0
|
||||||
dec dword [CDSectorAddress]
|
dec dword [CDSectorAddress]
|
||||||
push ecx
|
push ecx
|
||||||
;--------------------------------------
|
|
||||||
.read_to_buffer:
|
.read_to_buffer:
|
||||||
inc dword [CDSectorAddress]
|
inc dword [CDSectorAddress]
|
||||||
mov [CDDataBuf_pointer], CDDataBuf
|
mov [CDDataBuf_pointer], CDDataBuf
|
||||||
call ReadCDWRetr ; read sector of directory
|
call ReadCDWRetr ; read sector of directory
|
||||||
cmp [DevErrorCode], 0
|
cmp [DevErrorCode], 0
|
||||||
jne .noaccess_1
|
jne .noaccess_1
|
||||||
|
|
||||||
call .get_names_from_buffer
|
|
||||||
sub eax, 2048
|
|
||||||
; directory is over?
|
|
||||||
ja .read_to_buffer
|
|
||||||
|
|
||||||
mov edi, [cd_counter_block]
|
|
||||||
mov [edx+8], edi
|
|
||||||
mov edi, [ebx]
|
|
||||||
sub [edx+4], edi
|
|
||||||
xor eax, eax
|
|
||||||
dec ecx
|
|
||||||
js @f
|
|
||||||
|
|
||||||
mov al, ERROR_END_OF_FILE
|
|
||||||
;--------------------------------------
|
|
||||||
@@:
|
|
||||||
pop ecx edi
|
|
||||||
mov ebx, [edx+4]
|
|
||||||
ret
|
|
||||||
;--------------------------------------
|
|
||||||
.get_names_from_buffer:
|
|
||||||
mov [cd_current_pointer_of_input_2], CDDataBuf
|
mov [cd_current_pointer_of_input_2], CDDataBuf
|
||||||
push eax esi edi edx
|
push eax edx
|
||||||
;--------------------------------------
|
.get_names_from_buffer:
|
||||||
.get_names_from_buffer_1:
|
|
||||||
call cd_get_name
|
call cd_get_name
|
||||||
jc .end_buffer
|
jc .end_buffer
|
||||||
|
|
||||||
inc dword [cd_counter_block]
|
inc dword [cd_counter_block]
|
||||||
mov eax, [cd_counter_block]
|
mov eax, [cd_counter_block]
|
||||||
cmp [ebx], eax
|
cmp [ebx], eax
|
||||||
jae .get_names_from_buffer_1
|
jae .get_names_from_buffer
|
||||||
|
|
||||||
test ecx, ecx
|
test ecx, ecx
|
||||||
jz .get_names_from_buffer_1
|
jz .get_names_from_buffer
|
||||||
|
|
||||||
mov edi, [cd_counter_block]
|
mov edi, [cd_counter_block]
|
||||||
mov [edx+4], edi
|
mov [edx+4], edi
|
||||||
dec ecx
|
dec ecx
|
||||||
mov esi, ebp
|
mov esi, ebp
|
||||||
mov edi, [cd_mem_location]
|
call cd_get_parameters_of_file
|
||||||
add edi, 40
|
add edi, 40
|
||||||
test dword [ebx+4], 1; 0=ANSI, 1=UNICODE
|
mov ax, '.'
|
||||||
jnz .unicode
|
cmp dword[ebx+4], 2
|
||||||
;--------------------------------------
|
jz .utf16
|
||||||
.ansi:
|
cmp dword[ebx+4], 3
|
||||||
|
jz .utf8
|
||||||
cmp [cd_counter_block], 2
|
cmp [cd_counter_block], 2
|
||||||
jbe .ansi_parent_directory
|
jbe .parentDirectory
|
||||||
|
@@:
|
||||||
cld
|
|
||||||
lodsw
|
lodsw
|
||||||
xchg ah, al
|
xchg ah, al
|
||||||
call uni2ansi_char
|
call uni2ansi_char
|
||||||
cld
|
|
||||||
stosb
|
stosb
|
||||||
; check end of file
|
call .checkForEnd
|
||||||
mov ax, [esi]
|
jc @b
|
||||||
cmp ax, word 3B00h ; separator end of file ';'
|
@@:
|
||||||
je .cd_get_parameters_of_file_1
|
|
||||||
; check for files not ending with separator
|
|
||||||
movzx eax, byte [ebp-33]
|
|
||||||
add eax, ebp
|
|
||||||
sub eax, 34
|
|
||||||
cmp esi, eax
|
|
||||||
je .cd_get_parameters_of_file_1
|
|
||||||
; check the end of the directory
|
|
||||||
movzx eax, byte [ebp-1]
|
|
||||||
add eax, ebp
|
|
||||||
cmp esi, eax
|
|
||||||
jb .ansi
|
|
||||||
;--------------------------------------
|
|
||||||
.cd_get_parameters_of_file_1:
|
|
||||||
mov [edi], byte 0
|
mov [edi], byte 0
|
||||||
call cd_get_parameters_of_file
|
|
||||||
add [cd_mem_location], 304
|
add [cd_mem_location], 304
|
||||||
jmp .get_names_from_buffer_1
|
jmp .get_names_from_buffer
|
||||||
;--------------------------------------
|
|
||||||
.ansi_parent_directory:
|
|
||||||
cmp [cd_counter_block], 2
|
|
||||||
je @f
|
|
||||||
|
|
||||||
mov [edi], byte '.'
|
.parentDirectory:
|
||||||
inc edi
|
stosb
|
||||||
jmp .cd_get_parameters_of_file_1
|
cmp [cd_counter_block], 2
|
||||||
;--------------------------------------
|
jnz @b
|
||||||
|
stosb
|
||||||
|
jmp @b
|
||||||
|
|
||||||
|
.utf8:
|
||||||
|
add [cd_mem_location], 256
|
||||||
|
cmp [cd_counter_block], 2
|
||||||
|
jbe .parentDirectory
|
||||||
|
push ecx
|
||||||
|
mov ecx, 519
|
||||||
@@:
|
@@:
|
||||||
mov [edi], word '..'
|
lodsw
|
||||||
add edi, 2
|
xchg ah, al
|
||||||
jmp .cd_get_parameters_of_file_1
|
call UTF16to8
|
||||||
;--------------------------------------
|
js @f
|
||||||
.unicode:
|
call .checkForEnd
|
||||||
cmp [cd_counter_block], 2
|
jc @b
|
||||||
jbe .unicode_parent_directory
|
@@:
|
||||||
|
pop ecx
|
||||||
|
mov [edi], byte 0
|
||||||
|
add [cd_mem_location], 304
|
||||||
|
jmp .get_names_from_buffer
|
||||||
|
|
||||||
cld
|
.checkForEnd:
|
||||||
movsw
|
|
||||||
; check end of file
|
|
||||||
mov ax, [esi]
|
mov ax, [esi]
|
||||||
cmp ax, word 3B00h; separator end of file ';'
|
cmp ax, 3B00h ; ';'
|
||||||
je .cd_get_parameters_of_file_2
|
jz @f
|
||||||
; check for files not ending with separator
|
; check for files not ending with separator
|
||||||
movzx eax, byte [ebp-33]
|
movzx eax, byte [ebp-33]
|
||||||
add eax, ebp
|
add eax, ebp
|
||||||
sub eax, 34
|
sub eax, 34
|
||||||
cmp esi, eax
|
cmp esi, eax
|
||||||
je .cd_get_parameters_of_file_2
|
jz @f
|
||||||
; check the end of the directory
|
; check the end of the directory
|
||||||
movzx eax, byte [ebp-1]
|
movzx eax, byte [ebp-1]
|
||||||
add eax, ebp
|
add eax, ebp
|
||||||
cmp esi, eax
|
cmp esi, eax
|
||||||
jb .unicode
|
|
||||||
;--------------------------------------
|
|
||||||
.cd_get_parameters_of_file_2:
|
|
||||||
mov [edi], word 0
|
|
||||||
call cd_get_parameters_of_file
|
|
||||||
add [cd_mem_location], 560
|
|
||||||
jmp .get_names_from_buffer_1
|
|
||||||
;--------------------------------------
|
|
||||||
.unicode_parent_directory:
|
|
||||||
cmp [cd_counter_block], 2
|
|
||||||
je @f
|
|
||||||
|
|
||||||
mov [edi], word 2E00h; '.'
|
|
||||||
add edi, 2
|
|
||||||
jmp .cd_get_parameters_of_file_2
|
|
||||||
;--------------------------------------
|
|
||||||
@@:
|
@@:
|
||||||
mov [edi], dword 2E002E00h; '..'
|
|
||||||
add edi, 4
|
|
||||||
jmp .cd_get_parameters_of_file_2
|
|
||||||
;--------------------------------------
|
|
||||||
.end_buffer:
|
|
||||||
pop edx edi esi eax
|
|
||||||
ret
|
ret
|
||||||
;-----------------------------------------------------------------------------
|
|
||||||
|
.utf16:
|
||||||
|
cmp [cd_counter_block], 2
|
||||||
|
jbe .utf16ParentDirectory
|
||||||
|
@@:
|
||||||
|
lodsw
|
||||||
|
xchg ah, al
|
||||||
|
stosw
|
||||||
|
call .checkForEnd
|
||||||
|
jc @b
|
||||||
|
@@:
|
||||||
|
mov [edi], word 0
|
||||||
|
add [cd_mem_location], 560
|
||||||
|
jmp .get_names_from_buffer
|
||||||
|
|
||||||
|
.utf16ParentDirectory:
|
||||||
|
stosw
|
||||||
|
cmp [cd_counter_block], 2
|
||||||
|
jnz @b
|
||||||
|
stosw
|
||||||
|
jmp @b
|
||||||
|
|
||||||
cd_get_parameters_of_file:
|
cd_get_parameters_of_file:
|
||||||
mov edi, [cd_mem_location]
|
mov edi, [cd_mem_location]
|
||||||
cd_get_parameters_of_file_1:
|
cd_get_parameters_of_file_1:
|
||||||
@ -492,9 +464,7 @@ cd_get_parameters_of_file_1:
|
|||||||
; is a directory?
|
; is a directory?
|
||||||
test [ebp-8], byte 2
|
test [ebp-8], byte 2
|
||||||
jz .file
|
jz .file
|
||||||
|
|
||||||
inc eax
|
inc eax
|
||||||
;--------------------------------------
|
|
||||||
.file:
|
.file:
|
||||||
; not as a volume label in the FAT, in this form not available
|
; not as a volume label in the FAT, in this form not available
|
||||||
; file is not a system
|
; file is not a system
|
||||||
@ -502,14 +472,14 @@ cd_get_parameters_of_file_1:
|
|||||||
; file is hidden? (attribute of existence)
|
; file is hidden? (attribute of existence)
|
||||||
test [ebp-8], byte 1
|
test [ebp-8], byte 1
|
||||||
jz .hidden
|
jz .hidden
|
||||||
|
|
||||||
inc eax
|
inc eax
|
||||||
;--------------------------------------
|
|
||||||
.hidden:
|
.hidden:
|
||||||
shl eax, 1
|
shl eax, 1
|
||||||
; file is always read-only, as this CD
|
; file is always read-only, as this CD
|
||||||
inc eax
|
inc eax
|
||||||
mov [edi], eax
|
mov [edi], eax
|
||||||
|
mov eax, [ebx+4]
|
||||||
|
mov [edi+4], eax
|
||||||
; get the time to file
|
; get the time to file
|
||||||
; hour
|
; hour
|
||||||
movzx eax, byte [ebp-12]
|
movzx eax, byte [ebp-12]
|
||||||
@ -541,19 +511,6 @@ cd_get_parameters_of_file_1:
|
|||||||
mov [edi+20], eax
|
mov [edi+20], eax
|
||||||
; last write date
|
; last write date
|
||||||
mov [edi+28], eax
|
mov [edi+28], eax
|
||||||
; get the data type of name
|
|
||||||
xor eax, eax
|
|
||||||
test dword [ebx+4], 1; 0=ANSI, 1=UNICODE
|
|
||||||
jnz .unicode_1
|
|
||||||
|
|
||||||
mov [edi+4], eax
|
|
||||||
jmp @f
|
|
||||||
;--------------------------------------
|
|
||||||
.unicode_1:
|
|
||||||
inc eax
|
|
||||||
mov [edi+4], eax
|
|
||||||
;--------------------------------------
|
|
||||||
@@:
|
|
||||||
; get the file size in bytes
|
; get the file size in bytes
|
||||||
xor eax, eax
|
xor eax, eax
|
||||||
mov [edi+32+4], eax
|
mov [edi+32+4], eax
|
||||||
|
@ -1676,23 +1676,22 @@ ntfs_ReadFolder:
|
|||||||
mov al, '.'
|
mov al, '.'
|
||||||
push edi ecx
|
push edi ecx
|
||||||
lea ecx, [esi+1]
|
lea ecx, [esi+1]
|
||||||
test byte [edi-0x24], 1
|
cmp dword[edi-36], 2
|
||||||
|
jz .utf16sp
|
||||||
|
rep stosb
|
||||||
|
mov byte [edi], 0
|
||||||
|
pop ecx edi
|
||||||
|
cmp dword[edi-36], 3
|
||||||
jz @f
|
jz @f
|
||||||
rep stosw
|
add edi, 264
|
||||||
pop ecx
|
|
||||||
xor eax, eax
|
|
||||||
stosw
|
|
||||||
pop edi
|
|
||||||
add edi, 520
|
|
||||||
ret
|
ret
|
||||||
|
|
||||||
|
.utf16sp:
|
||||||
|
rep stosw
|
||||||
|
mov word [edi], 0
|
||||||
|
pop ecx edi
|
||||||
@@:
|
@@:
|
||||||
rep stosb
|
add edi, 520
|
||||||
pop ecx
|
|
||||||
xor eax, eax
|
|
||||||
stosb
|
|
||||||
pop edi
|
|
||||||
add edi, 264
|
|
||||||
.ret:
|
.ret:
|
||||||
ret
|
ret
|
||||||
|
|
||||||
@ -1701,9 +1700,10 @@ ntfs_ReadFolder:
|
|||||||
cmp byte [esi+namespace], 2
|
cmp byte [esi+namespace], 2
|
||||||
jz .ret
|
jz .ret
|
||||||
; do not return system files
|
; do not return system files
|
||||||
; ... note that there will be no bad effects if system files also were reported ...
|
cmp dword[esi+fileRecordReference], 16
|
||||||
cmp dword [esi+fileRecordReference], 0x10
|
|
||||||
jb .ret
|
jb .ret
|
||||||
|
cmp byte [esi+fileNameLength], 0
|
||||||
|
jz .ret
|
||||||
mov eax, [edx]
|
mov eax, [edx]
|
||||||
inc dword [eax+8] ; new file found
|
inc dword [eax+8] ; new file found
|
||||||
dec ebx
|
dec ebx
|
||||||
@ -1716,33 +1716,42 @@ ntfs_ReadFolder:
|
|||||||
push ecx esi edi
|
push ecx esi edi
|
||||||
movzx ecx, byte [esi+fileNameLength]
|
movzx ecx, byte [esi+fileNameLength]
|
||||||
add esi, fileName
|
add esi, fileName
|
||||||
test byte [edi-0x24], 1
|
cmp dword[edi-36], 2
|
||||||
jz .ansi
|
jz .utf16
|
||||||
shr ecx, 1
|
cmp dword[edi-36], 3
|
||||||
rep movsd
|
jz .utf8
|
||||||
adc ecx, ecx
|
|
||||||
rep movsw
|
|
||||||
and word [edi], 0
|
|
||||||
pop edi
|
|
||||||
add edi, 520
|
|
||||||
pop esi ecx
|
|
||||||
ret
|
|
||||||
|
|
||||||
.ansi:
|
|
||||||
jecxz .skip
|
|
||||||
@@:
|
@@:
|
||||||
lodsw
|
lodsw
|
||||||
call uni2ansi_char
|
call uni2ansi_char
|
||||||
stosb
|
stosb
|
||||||
loop @b
|
loop @b
|
||||||
.skip:
|
mov byte [edi], 0
|
||||||
xor al, al
|
pop edi esi ecx
|
||||||
stosb
|
|
||||||
pop edi
|
|
||||||
add edi, 264
|
add edi, 264
|
||||||
pop esi ecx
|
|
||||||
ret
|
ret
|
||||||
|
|
||||||
|
.utf8:
|
||||||
|
push ecx
|
||||||
|
mov cx, 519
|
||||||
|
@@:
|
||||||
|
lodsw
|
||||||
|
call UTF16to8
|
||||||
|
js @f
|
||||||
|
dec dword[esp]
|
||||||
|
jnz @b
|
||||||
|
@@:
|
||||||
|
mov byte [edi], 0
|
||||||
|
pop edi
|
||||||
|
@@:
|
||||||
|
pop edi esi ecx
|
||||||
|
add edi, 520
|
||||||
|
ret
|
||||||
|
|
||||||
|
.utf16:
|
||||||
|
rep movsw
|
||||||
|
mov word [edi], 0
|
||||||
|
jmp @b
|
||||||
|
|
||||||
ntfs_direntry_to_bdfe:
|
ntfs_direntry_to_bdfe:
|
||||||
mov [edi+4], eax ; ANSI/UNICODE name
|
mov [edi+4], eax ; ANSI/UNICODE name
|
||||||
mov eax, [esi+fileFlags]
|
mov eax, [esi+fileFlags]
|
||||||
|
Loading…
Reference in New Issue
Block a user