From 8eb00f284b65ca8298a442d51b62cd22ac9db088 Mon Sep 17 00:00:00 2001 From: pathoswithin Date: Fri, 25 Nov 2016 15:11:25 +0000 Subject: [PATCH] alternate ways of setting the string encoding for absolute paths git-svn-id: svn://kolibrios.org@6758 a494cfbc-eb01-0410-851d-a64ba20cac60 --- kernel/trunk/core/taskman.inc | 8 +++- kernel/trunk/docs/sysfuncr.txt | 25 ++++++------- kernel/trunk/docs/sysfuncs.txt | 68 +++++++++++++++++----------------- kernel/trunk/fs/fs_lfn.inc | 12 +++++- 4 files changed, 63 insertions(+), 50 deletions(-) diff --git a/kernel/trunk/core/taskman.inc b/kernel/trunk/core/taskman.inc index e72c07e4a6..08a0eb6c84 100644 --- a/kernel/trunk/core/taskman.inc +++ b/kernel/trunk/core/taskman.inc @@ -828,10 +828,16 @@ common_app_entry: [ebp+APP_HDR.img_base], [ebp+APP_HDR.img_size] mov esi, [ebp+APP_HDR.path_string] mov edi, [ebp+APP_HDR.path] + mov ecx, [ebp+APP_HDR.filename_size] + cmp ecx, 1023 + jc @f + mov ecx, 1022 +@@: push esi test edi, edi jz @f - mov ecx, [ebp+APP_HDR.filename_size] + mov al, '/' + stosb rep movsb mov byte [edi], 0 @@: diff --git a/kernel/trunk/docs/sysfuncr.txt b/kernel/trunk/docs/sysfuncr.txt index f9654d3eb2..948b74b262 100644 --- a/kernel/trunk/docs/sysfuncr.txt +++ b/kernel/trunk/docs/sysfuncr.txt @@ -3900,12 +3900,16 @@ Architecture Software Developer's Manual, Volume 3, Appendix B); * +20 = +0x14: byte: 0 * +21 = +0x15: dword: указатель на строку Чувствительность к регистру букв зависит от файловой системы. -Можно указать кодировку, поместив в начале строки байт со значениями: +Если путь начинается не с '/', то он считается относительным. +Получить или установить текущую папку можно с помощью сисфункции 30. +'../' в начале пути означает подъём на одну папку относительно текущей. +Можно указать кодировку строки, поместив в её начале байт со значениями: * 1 = cp866 * 2 = UTF-16LE * 3 = UTF-8 - иначе будет использоваться кодировка cp866. -Формат строки: +иначе будет использоваться кодировка cp866. В абсолютном пути можно +поместить этот байт после '/' или добавить дополнительный '/' перед ним. +Формат абсолютного пути: /base/number/dir1/dir2/.../dirn/file, где base/number идентифицирует устройство, на котором ищется файл: * RD/1 = рамдиск @@ -3924,9 +3928,6 @@ Architecture Software Developer's Manual, Volume 3, Appendix B); * '/HD0/1/folder/file.txt',0 * '/hd2/2/pics/tanzania.bmp',0 * 2,'/',0,'sys','/',0,'F',0,'I',0,'L',0,'E',0,0,0 -Также функция поддерживает относительные имена. Если путь начинается -не с '/', то он считается относительно текущей папки. Получить или -установить текущую папку можно с помощью сисфункции 30. Доступные подфункции: * подфункция 0 - чтение файла @@ -4134,7 +4135,6 @@ Architecture Software Developer's Manual, Volume 3, Appendix B); * +0: dword: 4 = номер подфункции * +4: dword: младший dword нового размера файла * +8: dword: старший dword нового размера файла - (должен быть 0 для FAT) * +12 = +0xC: dword: 0 (зарезервировано) * +16 = +0x10: dword: 0 (зарезервировано) * +20 = +0x14: путь, правила формирования имён указаны в общем описании @@ -4142,10 +4142,9 @@ Architecture Software Developer's Manual, Volume 3, Appendix B); * eax = 0 - успешно, иначе код ошибки файловой системы * ebx разрушается Замечания: - * Если новый размер файла меньше старого, файл усекается. Если - новый размер больше старого, файл расширяется нулевыми символами. - Если новый размер равен старому, единственным результатом вызова - является установка даты/времени модификации и доступа в текущие. + * Если новый размер файла меньше старого, файл усекается. + Если новый размер больше старого, файл расширяется, и если + разница в размере не больше 16 МБ, новое место очищается нулями. * Если свободного места на диске недостаточно для расширения файла, то функция расширит насколько возможно, после чего вернёт код ошибки 8. @@ -4599,7 +4598,7 @@ Architecture Software Developer's Manual, Volume 3, Appendix B); * esi = длина структуры sockaddr Формат структуры SockAddr: * +0: Word: Family - * +2: 14*Byte: Data + * +2: 14*Byte: Data Возвращаемое значение: * eax = -1 для ошибки * ebx = код ошибки @@ -4618,7 +4617,7 @@ Architecture Software Developer's Manual, Volume 3, Appendix B); * esi = длина структуры sockaddr Формат структуры SockAddr: * +0: Word: Family - * +2: 14*Byte: Data + * +2: 14*Byte: Data Возвращаемое значение: * eax = номер сокета из принятого сокета, -1 для ошибки * ebx = код ошибки diff --git a/kernel/trunk/docs/sysfuncs.txt b/kernel/trunk/docs/sysfuncs.txt index 82ffa3da7c..578d8fe769 100644 --- a/kernel/trunk/docs/sysfuncs.txt +++ b/kernel/trunk/docs/sysfuncs.txt @@ -3670,6 +3670,7 @@ Parameters: * ebx = 2 - subfunction number * ecx = thread identifier * edx = size of context structure, must be 0x28=40 bytes + * esi -> context structure Returned value: * function does not return value Format of context structure is shown in the description of @@ -3855,12 +3856,16 @@ General format of the information structure: * +20 = +0x14: byte: 0 * +21 = +0x15: dword: pointer to string Case sensitivity depends on filesystem. +If a path not begins with '/', it is considered a relative. +To get or set the current folder, use the function 30. +'../' in the beginning 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: * 1 = cp866 * 2 = UTF-16LE * 3 = UTF-8 - otherwise will be used cp866. -Format of filename: + otherwise will be used cp866. In an absolute path + you may put this byte after the '/' or put an additional '/' before it. +Format of an absolute path: /base/number/dir1/dir2/.../dirn/file, where base/number identifies device, on which file is located: * RD/1 = ramdisk @@ -3879,9 +3884,6 @@ Examples: * '/HD0/1/folder/file.txt',0 * '/hd2/2/pics/tanzania.bmp',0 * 2,'/',0,'sys','/',0,'F',0,'I',0,'L',0,'E',0,0,0 -Also function supports relative names. If the path begins not -with '/', it is considered relative to a current folder. To get or -set a current folder, use the function 30. Available subfunctions: * subfunction 0 - read file @@ -4094,11 +4096,9 @@ Returned value: * eax = 0 - success, otherwise file system error code * ebx destroyed Remarks: - * If the new file size is less than old one, file is truncated. - If the new size is greater than old one, file is expanded with - characters with code 0. If the new size is equal to old one, - the only result of call is set date/time of modification and - access to the current date/time. + * If new file size is less than old one, file will be truncated. + If new size is greater than old one, file will be expanded, and if + size difference is up to 16 MB, new space will be cleared with 0. * If there is not enough free space on disk for expansion, the function will expand to maximum possible size and then return error code 8. @@ -4549,7 +4549,7 @@ Parameters: * esi = length of sockaddr structure Format of SockAddr structure: * +0: Word: Family - * +2: 14*Byte: Data + * +2: 14*Byte: Data Returned value: * eax = -1 on error * ebx = errorcode @@ -4568,7 +4568,7 @@ Parameters: * esi = length of sockaddr structure Format of SockAddr structure: * +0: Word: Family - * +2: 14*Byte: Data + * +2: 14*Byte: Data Returned value: * eax = socket number of accepted socket, -1 on error * ebx = errorcode @@ -4687,7 +4687,7 @@ Parameters: Returned value: * eax = -1 on error, otherwise lower bits of MAC * bx = upper bits of MAC - + ====================================================================== = Function 76, Protocol 1 - IPv4, Subfunction 0, Read # Packets sent = ====================================================================== @@ -4698,7 +4698,7 @@ Parameters: * bl = 0 (Read # packets sent) Returned value: * eax = number of packets sent (-1 on error) - + ====================================================================== = Function 76, Protocol 1 - IPv4, Subfunction 1, Read # Packets rcvd = ====================================================================== @@ -4709,7 +4709,7 @@ Parameters: * bl = 1 (Read # packets received) Returned value: * eax = number of packets received (-1 on error) - + ====================================================================== === Function 76, Protocol 1 - IPv4, Subfunction 2, Read IP address === ====================================================================== @@ -4720,7 +4720,7 @@ Parameters: * bl = 2 (Read IP address) Returned value: * eax = IP address (-1 on error) - + ====================================================================== === Function 76, Protocol 1 - IPv4, Subfunction 3, Set IP address ==== ====================================================================== @@ -4743,7 +4743,7 @@ Parameters: * bl = 4 (Read DNS server IP address) Returned value: * eax = DNS server IP address (-1 on error) - + ====================================================================== === Function 76, Protocol 1 - IPv4, Subfunction 5, Set DNS address === ====================================================================== @@ -4766,7 +4766,7 @@ Parameters: * bl = 6 (Read subnet mask) Returned value: * eax = subnet mask (-1 on error) - + ====================================================================== === Function 76, Protocol 1 - IPv4, Subfunction 7, Set subnet mask === ====================================================================== @@ -4778,7 +4778,7 @@ Parameters: * ecx = subnet mask Returned value: * eax = -1 on error - + ====================================================================== ===== Function 76, Protocol 1 - IPv4, Subfunction 8, Read gateway ==== ====================================================================== @@ -4789,7 +4789,7 @@ Parameters: * bl = 8 (Read gateway IP address) Returned value: * eax = gateway IP address (-1 on error) - + ====================================================================== ===== Function 76, Protocol 1 - IPv4, Subfunction 9, Set gateway ===== ====================================================================== @@ -4801,7 +4801,7 @@ Parameters: * ecx = gateway IP address Returned value: * eax = -1 on error - + ====================================================================== = Function 76, Protocol 2 - ICMP, Subfunction 0, Read # Packets sent = ====================================================================== @@ -4812,7 +4812,7 @@ Parameters: * bl = 0 (Read # packets sent) Returned value: * eax = number of packets sent (-1 on error) - + ====================================================================== = Function 76, Protocol 2 - ICMP, Subfunction 1, Read # Packets rcvd = ====================================================================== @@ -4823,7 +4823,7 @@ Parameters: * bl = 1 (Read # packets received) Returned value: * eax = number of packets received (-1 on error) - + ====================================================================== = Function 76, Protocol 3 - UDP, Subfunction 0, Read # Packets sent == ====================================================================== @@ -4834,7 +4834,7 @@ Parameters: * bl = 0 (Read # packets sent) Returned value: * eax = number of packets sent (-1 on error) - + ====================================================================== = Function 76, Protocol 3 - UDP, Subfunction 1, Read # Packets rcvd == ====================================================================== @@ -4845,7 +4845,7 @@ Parameters: * bl = 1 (Read # packets received) Returned value: * eax = number of packets received (-1 on error) - + ====================================================================== = Function 76, Protocol 4 - TCP, Subfunction 0, Read # Packets sent == ====================================================================== @@ -4856,7 +4856,7 @@ Parameters: * bl = 0 (Read # packets sent) Returned value: * eax = number of packets sent (-1 on error) - + ====================================================================== = Function 76, Protocol 4 - TCP, Subfunction 1, Read # Packets rcvd == ====================================================================== @@ -4867,7 +4867,7 @@ Parameters: * bl = 1 (Read # packets received) Returned value: * eax = number of packets received (-1 on error) - + ====================================================================== = Function 76, Protocol 5 - ARP, Subfunction 0, Read # Packets sent == ====================================================================== @@ -4878,7 +4878,7 @@ Parameters: * bl = 0 (Read # packets sent) Returned value: * eax = number of packets sent (-1 on error) - + ====================================================================== = Function 76, Protocol 5 - ARP, Subfunction 1, Read # Packets rcvd == ====================================================================== @@ -4889,7 +4889,7 @@ Parameters: * bl = 1 (Read # packets received) Returned value: * eax = number of packets received (-1 on error) - + ====================================================================== == Function 76, Protocol 5 - ARP, Subfunction 2, Read # ARP entries == ====================================================================== @@ -4913,14 +4913,14 @@ Parameters: * edi = ptr to buffer where ARP entry will be written Returned value: * eax = -1 on error -Remarks: +Remarks: ARP_entry struct is defined in ARP.inc in kernel and currently looks like this: struct ARP_entry IP dd ? MAC dp ? Status dw ? TTL dw ? -ends +ends ====================================================================== ==== Function 76, Protocol 5 - ARP, Subfunction 4, Add ARP entry ==== @@ -4933,9 +4933,9 @@ Parameters: * esi = ptr to buffer holding ARP entry Returned value: * eax = -1 on error -Remarks: +Remarks: See previous function for details on ARP entry. - + ====================================================================== === Function 76, Protocol 5 - ARP, Subfunction 5, Remove ARP entry ==== ====================================================================== @@ -4958,7 +4958,7 @@ Parameters: * bl = 6 (Send ARP announce) Returned value: * eax = -1 on error - + ====================================================================== === Function 76, Protocol 5 - ARP, Subfunction 7, Read # conflicts === ====================================================================== diff --git a/kernel/trunk/fs/fs_lfn.inc b/kernel/trunk/fs/fs_lfn.inc index ab35228ac8..fd48d5929f 100644 --- a/kernel/trunk/fs/fs_lfn.inc +++ b/kernel/trunk/fs/fs_lfn.inc @@ -510,10 +510,18 @@ get_full_file_name: cmp byte [esi], '/' jnz .set_relative inc esi - cmp byte [ebx], 2 - jnz @f + cmp byte [esi], 4 + jnc @f + mov ebx, esi + inc esi + cmp byte [esi], '/' + jnz .start inc esi @@: + cmp byte [ebx], 2 + jnz .start + inc esi +.start: call process_replace_file_name mov edi, [esp+12] mov ecx, [esp+16]