Page 41 of 77

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

Posted: Tue Sep 25, 2012 7:15 pm
by Rock_maniak_forever
Serge wrote:Rock_maniak_forever

Code: Select all

#ifdef KOLIBRI_PE
  #define  LFB_BASE   0xDF000000
#else
  #define  LFB_BASE   0xFE000000
#endif
В КРЕ был другой базовый адрес видеопамяти.
Чавой-то не понял. Там же, два адреса.
Первым по условию идет 0xDF000000, если условие не верно, то определ. 0xFE000000. Вот мне и интересно что хранится там :arrow: " 0xDF000000" (какие данные), если "0xFE000000" - адрес видео буфера.

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

Posted: Tue Sep 25, 2012 7:48 pm
by Rock_maniak_forever
Ладно. Хрен с ним, с этим адресом (видимо, это секрет). :? Пойду медитировать с адресом видео буфера (воспользуюсь методом тыка :idea: ). Может что получится.

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

Posted: Tue Sep 25, 2012 7:59 pm
by Mario
Если установлен признак KOLIBRI_PE, то адрес видеобуфера начинается с адреса 0xDF000000, т.е. это для ядра KolibriPE.
Для обычного ядра адрес 0xFE000000. Оператор и параметры условия можно было запомнить еще с Бейсика.

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

Posted: Sat Nov 10, 2012 1:08 am
by Leency
Почему код не работает?

Code: Select all

void LiveSearch()
{
	dword bj, i;
	byte IsNativeWord=1;
	char native[256];
	word bukovka[1];
	
	for (bj=0; bj<fsize; bj++;)
	{
		bukovka=ESBYTE[buff+bj];
		debug(#bukovka);
		if (buff+bj==0x0a)
		{
			bj++;
			if (buff+bj!='"') IsNativeWord=1;
		}
		else
		{
			for (i=0; i<strlen(#edword); i++) if (edword[i]<>native[i]) goto __NE_RAVNO;
			debug(#native);
			__NE_RAVNO:
			native = 0x00;
			IsNativeWord = 0;
		}
		if (IsNativeWord==1) strcat(#native, #bukovka);
	}
}
на дебаг выводит мусор debug(#bukovka);
debug(#native); не выводит ничего

проблема наверно в bukovka=ESBYTE[buff+bj];

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

Posted: Sat Nov 10, 2012 1:44 am
by dunkaist
Leency wrote:проблема наверно в bukovka=ESBYTE[buff+bj];
Сам спросил, сам ответил.

У тебя bukovka -- указатель на bukovka[0], а ESBYTE[buff+bj], надо полагать, char или word. Попробуй bukovka[0]=...

А вообще, зачем делать массив из одного элемента?
Leency wrote:native = 0x00;
Тут что-то не так. Ты теряешь указатель на изначальный массив.

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

Posted: Sat Nov 10, 2012 2:11 am
by Leency
как очистить переменную правильно, чтобы она была (native==0) ?

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

Posted: Sat Nov 10, 2012 10:09 am
by dunkaist
Leency wrote:как очистить переменную правильно, чтобы она была (native==0) ?
Значение native изменять не нужно. Если ты действительно хочешь указатель, который то будет указывать на массив, то нулевым, то заведи какой-нибудь char *p и присваивай ему то native, то NULL.

И я не совсем понимаю, что должен делать код в целом. # -- это взятие адреса? Если да, то попробуй debug(bukovka) и debug(native).

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

Posted: Sat Nov 10, 2012 3:29 pm
by Leency
О, точно, я уже 100 раз видел, что так делают, а как правильно:
#define NULL 0x00
#define NULL '\0'

?

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

Posted: Sat Nov 10, 2012 5:08 pm
by dunkaist
Leency wrote:#define NULL 0x00
#define NULL '\0'
Да просто 0 (как в твоём первом варианте) или (void*)0. Если речь об указателе.

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

Posted: Sat Nov 10, 2012 5:54 pm
by Leency
Ясно, спасибо :)

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

Posted: Sat Nov 10, 2012 7:56 pm
by Leency
Пишу прогу для управления tmpdisk, как когда-то и обещал CleverMouse. Лучше позно, чем никогда. Вещь нужная.

Я даже сохранил её слова что и как делать, читал tmpdisk.asm, кое-что разобрал, что-то нет. Как для лаймера в таких делах, вроде неплохо. Но не работает :)

Посмотрите, пожалуйста что не так.

Не совсем разобрался ,что должно быть в output.

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

Posted: Mon Nov 12, 2012 1:53 pm
by CleverMouse
Leency, структуры объявлены неверно. DiskId должен быть одним байтом, а не dword. В output и out_size нужно писать нули, хотя в данный момент это не играет роли, ибо текущая реализация их игнорирует.

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

Posted: Mon Nov 12, 2012 2:38 pm
by Leency
Я уже заменил эти ошибки и исправил. Всё равно выдаёт ошибку - слишком большой размер диска.
Spoiler:

Code: Select all

#include "..\lib\kolibri.h" 
#include "..\lib\strings.h" 
#include "..\lib\file_system.h"

inline fastcall dword GetFreeRAM()
{
	$mov eax, 18
	$mov ebx, 16
	$int 0x40
	//return eax = размер свободной памяти в килобайтах
}

inline fastcall dword LoadDriver( ECX) //ECX - имя драйвера
{
	$mov eax, 68
	$mov ebx, 16
	$int 0x40
	//return 0 - неудача, иначе eax = хэндл драйвера 
}

inline fastcall dword RuleDriver( ECX) //указатель на управляющую структуру
{
	$mov eax, 68
	$mov ebx, 17
	$int 0x40
	//return eax = определяется драйвером
}

struct ioctl_struct
{
	dword	handle;
	dword	io_code;
	dword	input;
	dword	inp_size;
	dword	output;
	dword	out_size;
};

#define DEV_ADD_DISK 1	//input = structure add_disk_struc
#define DEV_DEL_DISK 2	//input = structure del_disk_struc

struct add_disk_struc
{
	dword DiskSize; // disk size in sectors, 1 sector = 512 bytes
	// Note: .DiskSize is the full size, including FAT service data.
	// Size for useful data is slightly less than this number.
	unsigned char DiskId; // from 0 to 9
};

struct del_disk_struc
{
	unsigned char DiskId; //from 0 to 9
};



void main()
{   
	int driver_handle;

	driver_handle = LoadDriver("tmpdisk");
	if (driver_handle==0)
	{
		debug("tmpdisk: driver loading failed");
		ExitProcess();
		return;
	}
	debug("tmpdisk: driver loaded successfully");
	
	//del disk
	del_disk_struc.DiskId   = 1;	
	//add disk
	add_disk_struc.DiskId   = 1;
	add_disk_struc.DiskSize = 200;
	
	ioctl_struct.handle   = driver_handle;
	ioctl_struct.io_code  = DEV_ADD_DISK;
	ioctl_struct.input    = #add_disk_struc;
	ioctl_struct.inp_size = sizeof(#add_disk_struc);
	ioctl_struct.output   = 0;
	ioctl_struct.out_size = 0;	
	
	RuleDriver(#ioctl_struct);
	
	
	switch(EAX)
	{
		case 0:
			debug("tmpdisk: disk added successfully");
			break;
		case 1:
			debug("tmpdisk: unknown IOCTL code, wrong input/output size...");
			break;
		case 2:
			debug("tmpdisk: DiskId must be from 0 to 9");
			break;
		case 3:
			debug("tmpdisk: DiskSize is too large");
			break;
		case 4:
			debug("tmpdisk: DiskSize is too small");
			break;
		case 5:
			debug("tmpdisk: memory allocation failed");
			break;
		default:
			debug("tmpdisk: unknown error O_o");
	}
	ExitProcess();
}

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

Posted: Mon Nov 12, 2012 3:02 pm
by Leency
Эх, это очень странно, но у меня вышло :) Ждите скоро новую версию Эолайта и дистра.

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

Posted: Mon Nov 12, 2012 3:17 pm
by CleverMouse
На 200 секторов драйвер и должен ругаться, только не "слишком большой", а "слишком маленький" размер - туда ни FAT16, ни FAT32 не поместятся в принципе. Должно быть минимум несколько мегабайт.