/drivers/examples/asm_drv/Makefile |
---|
0,0 → 1,9 |
FASM = fasm |
KPACK = kpack |
all: |
$(FASM) asm_drv.asm |
$(KPACK) asm_drv.sys |
clean: |
rm *.sys |
/drivers/examples/asm_drv/asm_drv.asm |
---|
0,0 → 1,61 |
format PE DLL native |
entry START |
__DEBUG__ = 1 |
__DEBUG_LEVEL__ = 2 |
section '.flat' readable writable executable |
include '../../proc32.inc' |
include '../../struct.inc' |
include '../../macros.inc' |
include '../../fdo.inc' |
proc START c, reason:dword |
DEBUGF 2,"Loading 'asm_drv' driver\n" |
cmp [reason], DRV_ENTRY |
jne .fail |
invoke RegService, my_service, service_proc |
ret |
.fail: |
xor eax, eax |
ret |
endp |
proc service_proc stdcall, ioctl:dword |
mov ebx, [ioctl] |
mov eax, [ebx + IOCTL.io_code] |
cmp eax, 0 ; FUNCTION ADD(a+b); |
jne .fail |
mov eax, [ebx + IOCTL.input] |
mov ecx, eax |
add ecx, 4 |
mov eax, [eax] |
add eax, [ecx] |
mov ecx, [ebx + IOCTL.output] |
mov [ecx], eax |
xor eax, eax |
ret |
.fail: |
or eax, -1 |
ret |
endp |
data fixups |
end data |
include '../../peimport.inc' |
my_service db 'asm_drv',0 ; max 16 chars include zero |
include_debug_strings |
/drivers/examples/c_drv/Makefile |
---|
0,0 → 1,42 |
CC = kos32-gcc |
LD = kos32-ld |
KPACK = kpack |
DDK_TOPDIR = ../../ddk |
DRV_INCLUDES = ../../include |
INCLUDES = -I$(DRV_INCLUDES) \ |
-I$(DRV_INCLUDES)/asm \ |
-I$(DRV_INCLUDES)/uapi \ |
-I$(DRV_INCLUDES)/drm |
NAME=c_drv |
DEFINES = -DKOLIBRI -D__KERNEL__ -DCONFIG_X86_32 -DCONFIG_DMI -DCONFIG_TINY_RCU |
DEFINES+= -DCONFIG_X86_L1_CACHE_SHIFT=6 -DCONFIG_ARCH_HAS_CACHE_LINE_SIZE |
DEFINES+= -DCONFIG_PRINTK |
CFLAGS= -c -O2 $(DEFINES) $(INCLUDES) -march=i686 -fno-ident -msse2 -fomit-frame-pointer -fno-builtin-printf |
CFLAGS+= -mno-stack-arg-probe -mpreferred-stack-boundary=2 -mincoming-stack-boundary=2 -mno-ms-bitfields |
LIBPATH = -L $(DDK_TOPDIR) |
LIBPATH+= -L ../../../contrib/sdk/lib |
LIBS:= -lddk -lcore -lgcc |
PE_FLAGS = --major-os-version 0 --minor-os-version 7 --major-subsystem-version 0 \ |
--minor-subsystem-version 5 --subsystem native |
LDFLAGS = -nostdlib -shared -s $(PE_FLAGS) --image-base 0\ |
--file-alignment 512 --section-alignment 4096 |
all: $(NAME).dll |
$(NAME).dll: |
$(CC) $(CFLAGS) c_drv.c |
$(LD) $(LIBPATH) $(LDFLAGS) -T drv.lds c_drv.o -o $@ $(NAME_OBJS) $(LIBS) |
$(KPACK) $(NAME).dll |
clean: |
rm -rf *.o *.dll |
/drivers/examples/c_drv/c_drv.c |
---|
0,0 → 1,21 |
#include "linux/kernel.h" |
#include <ddk.h> |
#include <syscall.h> |
static int __stdcall service_proc(ioctl_t *my_ctl){ |
int c = 0; |
int a = *(int*)(my_ctl->input); |
int b = *(int*)(my_ctl->input+4); |
if(my_ctl->io_code==0){ |
c = a + b; |
}else{ |
return -1; |
} |
*(int*)(my_ctl->output) = c; |
return 0; |
} |
unsigned drvEntry(int action, char *cmdline){ |
printk("Driver c_drv.dll loaded!\n"); |
return RegService("c_drv", service_proc); |
} |
/drivers/examples/c_drv/drv.lds |
---|
0,0 → 1,57 |
OUTPUT_FORMAT(pei-i386) |
ENTRY("_drvEntry") |
SECTIONS |
{ |
. = SIZEOF_HEADERS; |
. = ALIGN(__section_alignment__); |
.text __image_base__ + ( __section_alignment__ < 0x1000 ? . : __section_alignment__ ) : |
{ |
*(.text) *(.rdata) |
} |
.data ALIGN(__section_alignment__) : |
{ |
*(.data) |
} |
.bss ALIGN(__section_alignment__): |
{ |
*(.bss) |
*(COMMON) |
} |
/DISCARD/ : |
{ |
*(.debug$S) |
*(.debug$T) |
*(.debug$F) |
*(.drectve) |
*(.edata) |
*(.eh_frame) |
} |
.idata ALIGN(__section_alignment__): |
{ |
SORT(*)(.idata$2) |
SORT(*)(.idata$3) |
/* These zeroes mark the end of the import list. */ |
LONG (0); LONG (0); LONG (0); LONG (0); LONG (0); |
SORT(*)(.idata$4) |
SORT(*)(.idata$5) |
SORT(*)(.idata$6) |
SORT(*)(.idata$7) |
} |
.reloc ALIGN(__section_alignment__) : |
{ |
*(.reloc) |
} |
} |
/drivers/examples/test/Makefile |
---|
0,0 → 1,12 |
KTCC=../../../programs/develop/ktcc/trunk/bin/kos32-tcc |
KPACK = kpack |
KLIBC = ../../../programs/develop/libraries/kolibri-libc |
CFLAGS = -I $(KLIBC)/include |
LDFLAGS = -nostdlib -L$(KLIBC)/lib $(KLIBC)/lib/crt0.o |
all: |
$(KTCC) $(CFLAGS) $(LDFLAGS) drv_test.c -o drv_test -lc.obj |
$(KPACK) --nologo drv_test |
clean: |
rm *.kex |
/drivers/examples/test/drv_test.c |
---|
0,0 → 1,66 |
#include <sys/ksys.h> |
#include <stdio.h> |
#include <stdlib.h> |
char* drv_name = NULL; |
struct{ |
int a; |
int b; |
}add_struct; |
int sum=0; |
ksys_drv_hand_t drv = 0; |
#define DRV_ADD_FUNC 0 |
int main(int argc, char** argv){ |
puts("Which driver?"); |
puts("1 - asm_drv.sys\n2 - c_drv.dll"); |
int num_drv = (char)getchar()-'0'; |
switch (num_drv) { |
case 1 : |
drv_name = "asm_drv"; |
drv = _ksys_load_driver(drv_name); |
break; |
case 2 : |
drv_name = "/rd/1/drivers/c_drv.dll"; |
drv = _ksys_load_pe_driver(drv_name, NULL); |
break; |
default: |
printf("No driver selected!\n"); |
exit(0); |
} |
if(!drv){ |
printf("'%s' driver not load!\n", drv_name); |
exit(0); |
}else{ |
printf("'%s' driver is load!\n", drv_name); |
} |
add_struct.a = 43; |
add_struct.b = 532; |
ksys_drv_ctl_t ioctl; |
ioctl.func_num = DRV_ADD_FUNC; |
ioctl.handler = drv; |
ioctl.in_data_ptr = &add_struct; |
ioctl.in_data_size = sizeof(add_struct); |
ioctl.out_data_ptr = ∑ |
ioctl.out_data_size = sizeof(sum); |
unsigned status =_ksys_work_driver(&ioctl); |
if(status==-1){ |
puts("Error!"); |
}else { |
printf("%d + %d = %d\n", add_struct.a, add_struct.b, sum); |
if(sum == add_struct.a + add_struct.b){ |
puts("True!"); |
}else{ |
puts("False!"); |
} |
} |
exit(0); |
} |