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

Applications development, KoOS API questions
  • Ладно. Хрен с ним, с этим адресом (видимо, это секрет). :? Пойду медитировать с адресом видео буфера (воспользуюсь методом тыка :idea: ). Может что получится.
  • Если установлен признак KOLIBRI_PE, то адрес видеобуфера начинается с адреса 0xDF000000, т.е. это для ядра KolibriPE.
    Для обычного ядра адрес 0xFE000000. Оператор и параметры условия можно было запомнить еще с Бейсика.
  • Почему код не работает?

    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];
    Из хаоса в космос
  • Leency wrote:проблема наверно в bukovka=ESBYTE[buff+bj];
    Сам спросил, сам ответил.

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

    А вообще, зачем делать массив из одного элемента?
    Leency wrote:native = 0x00;
    Тут что-то не так. Ты теряешь указатель на изначальный массив.
  • как очистить переменную правильно, чтобы она была (native==0) ?
    Из хаоса в космос
  • Leency wrote:как очистить переменную правильно, чтобы она была (native==0) ?
    Значение native изменять не нужно. Если ты действительно хочешь указатель, который то будет указывать на массив, то нулевым, то заведи какой-нибудь char *p и присваивай ему то native, то NULL.

    И я не совсем понимаю, что должен делать код в целом. # -- это взятие адреса? Если да, то попробуй debug(bukovka) и debug(native).
  • О, точно, я уже 100 раз видел, что так делают, а как правильно:
    #define NULL 0x00
    #define NULL '\0'

    ?
    Из хаоса в космос
  • Leency wrote:#define NULL 0x00
    #define NULL '\0'
    Да просто 0 (как в твоём первом варианте) или (void*)0. Если речь об указателе.
  • Ясно, спасибо :)
    Из хаоса в космос
  • Пишу прогу для управления tmpdisk, как когда-то и обещал CleverMouse. Лучше позно, чем никогда. Вещь нужная.

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

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

    Не совсем разобрался ,что должно быть в output.
    Attachments
    tmpdisk.zip (263.97 KiB)
    Downloaded 542 times
    Из хаоса в космос
  • Leency, структуры объявлены неверно. DiskId должен быть одним байтом, а не dword. В output и out_size нужно писать нули, хотя в данный момент это не играет роли, ибо текущая реализация их игнорирует.
    Сделаем мир лучше!
  • Я уже заменил эти ошибки и исправил. Всё равно выдаёт ошибку - слишком большой размер диска.
    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();
    }
    Из хаоса в космос
  • Эх, это очень странно, но у меня вышло :) Ждите скоро новую версию Эолайта и дистра.
    Из хаоса в космос
  • На 200 секторов драйвер и должен ругаться, только не "слишком большой", а "слишком маленький" размер - туда ни FAT16, ни FAT32 не поместятся в принципе. Должно быть минимум несколько мегабайт.
    Сделаем мир лучше!
  • Who is online

    Users browsing this forum: No registered users and 7 guests