Помогите новичку
-
Leency, ядро обрабатывает такие файлы нормально, проблемы возникают, когда родительская папка - корень, например, /rd/1/html/history/olala/../../../html/page.htm.Сделаем мир лучше!
Функция преобразования числа в строку, написа мной. Как сделать так, чтобы строка получалась не зеркальной?
Code: Select all
dword itoa_my(dword from_int)
{
unsigned char to_char[11], int_index, sign;
if (from_int < 0) //запоминаем знак знак, делаем число позитивным
{
sign = 1;
from_int = -from_int;
}
for (;int_index<from_int; int_index++) //записываем числа в обратном порядке
{
to_char[int_index] = from_int % 10 + '0';
from_int /= 10;
}
int_index++;
if (sign) to_char[int_index] = '-'; //запишем знак
return #to_char;
}
Из хаоса в космос
может всё положить в стек, а потом всё забрать?
Вот так?
Code: Select all
dword itoa_my(dword from_int)
{
unsigned char to_char[11], int_index, sign;
if (from_int < 0) //запоминаем знак знак, делаем число позитивным
{
sign = 1;
from_int = -from_int;
}
for (int_index=0; from_int>0; int_index++) //записываем числа в обратном порядке
{
EAX = from_int % 10 + '0';
$push eax
from_int /= 10;
}
//int_index++;
//if (sign) to_char[int_index] = '-'; //запишем знак
for ( ;int_index>0; int_index--)
{
$pop eax
to_char[int_index] = EAX;
}
return #to_char;
}
Из хаоса в космос
Не особо понимаю всё написаное, но судя по подходу да, как то так.
Code: Select all
inline fastcall int TestBit(EAX, CL)
{
$shr eax,cl
$and eax,1
}
off=file_mas[filenum+za_kadrom]*304 + buf+72; //buf - буфер с данными о файлах из ф70, off - указатель на имя файла
if (!TestBit(ESDWORD[off-40], 4)) //это ФАЙЛ или папка?
Из хаоса в космос
ошибки не вижу, потому даю вопросы:
1) указатель off точно дает имя файла ?
2) а ESDWORD это макрос или функция, как оно выглядит ?
3) функция TestBit правильно работает? Что-бы проверить правильность работы функции TestBit попробуй 2 варианта
1) указатель off точно дает имя файла ?
2) а ESDWORD это макрос или функция, как оно выглядит ?
3) функция TestBit правильно работает? Что-бы проверить правильность работы функции TestBit попробуй 2 варианта
Code: Select all
TestBit(1, 0) // должно дать 1
TestBit(0, 0) // должно дать 0
Last edited by IgorA on Fri Nov 16, 2012 11:08 pm, edited 1 time in total.
Возможно не 72, а 32(размер заголовка)?Leency wrote: off=file_mas[filenum+za_kadrom]*304 + buf+72; //buf - буфер с данными о файлах из ф70, off - указатель на имя файла
Ноль же?IgorA wrote:TestBit(0, 0) // должно дать 1
ошибся, предполагал 0 а написал 1, уже исправил0CodErr wrote:IgorA писал(а):TestBit(0, 0) // должно дать 1Ноль же?
там 32 размер заголовка плюс 40 смещение на имя файла0CodErr wrote:Возможно не 72, а 32(размер заголовка)?
Хм... проблема не в этом...
Из хаоса в космос
Можно ли не распаковывая, упакованный Kpack-ом файл, узнать, что это приложение Kolibri?
У неупакованного, например, "MENUET01" в заголовке. А с упакованным как?
У неупакованного, например, "MENUET01" в заголовке. А с упакованным как?
KPCK
Но "KPCK" не говорит о том, что это именно приложение. Любой файл, упакованный Kpack-ом, будет иметь такой заголовок.
Конечно, если файл без расширения и имеет в заголовке "KPCK", то, скорее всего, это упакованное приложение. Но я хотел узнать, можно ли это определить однозначно.
Конечно, если файл без расширения и имеет в заголовке "KPCK", то, скорее всего, это упакованное приложение. Но я хотел узнать, можно ли это определить однозначно.
Без распаковки - нет.
Читаю папки:
"/bd0/" - файл не найден
"/bd0/1/" - успешно
Само устройство "bd0" существует.
Как вообще проверить возможность чтения папки?
В ebx возвращается -1, если папка не найдена.
Но она может существовать и быть в это же время недоступна.
"/bd0/" - файл не найден
"/bd0/1/" - успешно
Само устройство "bd0" существует.
Code: Select all
ORG 0
BITS 32
MENUET01 db 'MENUET01'
version dd 1
program.start dd start_
program.end dd end_
program.memory dd end_ + STACK_SIZE
program.stack dd end_ + STACK_SIZE
program.params dd 0
program.path dd 0
STACK_SIZE equ 256
start_:
call on_redraw
L_1:
; wait.event
mov eax, 10
int 64
cmp eax, 1
jne L_2
call on_redraw
jmp L_1
L_2:
cmp eax, 2
jne L_3
; get.key.code
; mov eax, 2
int 64
jmp L_1
L_3:
cmp eax, 3
jne L_1
; get.button.number
mov eax, 17
int 64
shr eax, 8
cmp eax, 1
jne L_1
; program.terminate
neg eax
int 64
on_redraw:
; redraw.start
mov eax, 12
mov ebx, 1
int 64
; draw.window
xor eax, eax
mov ebx, 200
mov ecx, 200
mov edx, 33AABBCCh
xor edi, edi
int 64
mov eax, 70
mov ebx, .dir.read.file_info
int 64
; draw.text
mov edx, [eax * 4 + errors]
mov eax, 4
xor ebx, ebx
mov ecx, 80000000h
int 64
; redraw.finish
mov eax, 12
mov ebx, 2
int 64
ret
.dir.read.file_info:
dd 1
dd 0
dd 0
dd 0
dd .buffer
db 0
dd .FolderName
; .FolderName db "/bd0/",0
.FolderName db "/bd0/1/",0
.buffer resb 32
errors:
dd .0
dd .1
dd .2
dd .3
dd .4
dd .5
dd .6
dd .7
dd .8
dd .9
dd .10
dd .11
.0 db "0 = успешно",0
.1 db "1 = не определена база и/или раздел жёсткого диска" ,0
.2 db "2 = функция не поддерживается для данной файловой системы",0
.3 db "3 = неизвестная файловая система",0
.4 db "4 = зарезервировано, никогда не возвращается в текущей реализации",0
.5 db "5 = файл не найден",0
.6 db "6 = файл закончился",0
.7 db "7 = указатель вне памяти приложения",0
.8 db "8 = диск заполнен",0
.9 db "9 = таблица FAT разрушена",0
.10 db "10 = доступ запрещён",0
.11 db "11 = ошибка устройства",0
end_:
В ebx возвращается -1, если папка не найдена.
Но она может существовать и быть в это же время недоступна.
Who is online
Users browsing this forum: No registered users and 7 guests