Page 43 of 77

Re: Помогите новичку

Posted: Wed Nov 14, 2012 9:08 pm
by CleverMouse
Leency, ядро обрабатывает такие файлы нормально, проблемы возникают, когда родительская папка - корень, например, /rd/1/html/history/olala/../../../html/page.htm.

Re: Помогите новичку

Posted: Thu Nov 15, 2012 8:59 pm
by Leency
Функция преобразования числа в строку, написа мной. Как сделать так, чтобы строка получалась не зеркальной?

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;
}

Re: Помогите новичку

Posted: Thu Nov 15, 2012 9:12 pm
by Akyltist
может всё положить в стек, а потом всё забрать?

Re: Помогите новичку

Posted: Thu Nov 15, 2012 10:09 pm
by Leency
Вот так?

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;
}

Re: Помогите новичку

Posted: Thu Nov 15, 2012 10:17 pm
by Akyltist
Не особо понимаю всё написаное, но судя по подходу да, как то так.

Re: Помогите новичку

Posted: Fri Nov 16, 2012 7:00 pm
by Leency

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)) //это ФАЙЛ или папка?
Код для меня сложный, где-то здесь должна быть ошибка... Не могу понять где.

Re: Помогите новичку

Posted: Fri Nov 16, 2012 10:26 pm
by IgorA
ошибки не вижу, потому даю вопросы:
1) указатель off точно дает имя файла ?
2) а ESDWORD это макрос или функция, как оно выглядит ?
3) функция TestBit правильно работает? Что-бы проверить правильность работы функции TestBit попробуй 2 варианта

Code: Select all

TestBit(1, 0) // должно дать 1
TestBit(0, 0) //  должно дать 0

Re: Помогите новичку

Posted: Fri Nov 16, 2012 11:01 pm
by 0CodErr
Leency wrote: off=file_mas[filenum+za_kadrom]*304 + buf+72; //buf - буфер с данными о файлах из ф70, off - указатель на имя файла
Возможно не 72, а 32(размер заголовка)?
IgorA wrote:TestBit(0, 0) // должно дать 1
Ноль же?

Re: Помогите новичку

Posted: Fri Nov 16, 2012 11:10 pm
by IgorA
0CodErr wrote:IgorA писал(а):TestBit(0, 0) // должно дать 1Ноль же?
ошибся, предполагал 0 а написал 1, уже исправил
0CodErr wrote:Возможно не 72, а 32(размер заголовка)?
там 32 размер заголовка плюс 40 смещение на имя файла

Re: Помогите новичку

Posted: Sat Nov 17, 2012 12:01 am
by Leency
Хм... проблема не в этом...

Re: Помогите новичку

Posted: Tue Nov 20, 2012 8:28 am
by 0CodErr
Можно ли не распаковывая, упакованный Kpack-ом файл, узнать, что это приложение Kolibri?
У неупакованного, например, "MENUET01" в заголовке. А с упакованным как?

Re: Помогите новичку

Posted: Tue Nov 20, 2012 9:17 am
by Mario
KPCK

Re: Помогите новичку

Posted: Tue Nov 20, 2012 9:45 am
by 0CodErr
Но "KPCK" не говорит о том, что это именно приложение. Любой файл, упакованный Kpack-ом, будет иметь такой заголовок.
Конечно, если файл без расширения и имеет в заголовке "KPCK", то, скорее всего, это упакованное приложение. Но я хотел узнать, можно ли это определить однозначно.

Re: Помогите новичку

Posted: Tue Nov 20, 2012 10:40 am
by Mario
Без распаковки - нет.

Re: Помогите новичку

Posted: Thu Nov 22, 2012 9:52 pm
by 0CodErr
Читаю папки:
"/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, если папка не найдена.
Но она может существовать и быть в это же время недоступна.