;driver sceletone format MS COFF include 'proc32.inc' include 'imports.inc' OS_BASE equ 0; new_app_base equ 0x60400000 PROC_BASE equ OS_BASE+0x0080000 struc IOCTL { .handle dd ? .io_code dd ? .input dd ? .inp_size dd ? .output dd ? .out_size dd ? } virtual at 0 IOCTL IOCTL end virtual public START public service_proc public version DEBUG equ 1 DRV_ENTRY equ 1 DRV_EXIT equ -1 STRIDE equ 4 ;size of row in devices table section '.flat' code readable align 16 proc START stdcall, state:dword cmp [state], 1 jne .exit .entry: if DEBUG mov esi, msgInit call SysMsgBoardStr end if stdcall RegService, my_service, service_proc ret .fail: .exit: xor eax, eax ret endp handle equ IOCTL.handle io_code equ IOCTL.io_code input equ IOCTL.input inp_size equ IOCTL.inp_size output equ IOCTL.output out_size equ IOCTL.out_size align 4 proc service_proc stdcall, ioctl:dword ; mov edi, [ioctl] ; mov eax, [edi+io_code] xor eax, eax ret endp restore handle restore io_code restore input restore inp_size restore output restore out_size align 4 proc detect locals last_bus dd ? endl xor eax, eax mov [bus], eax inc eax call PciApi cmp eax, -1 je .err mov [last_bus], eax .next_bus: and [devfn], 0 .next_dev: stdcall PciRead32, [bus], [devfn], dword 0 test eax, eax jz .next cmp eax, -1 je .next mov edi, devices @@: mov ebx, [edi] test ebx, ebx jz .next cmp eax, ebx je .found add edi, STRIDE jmp @B .next: inc [devfn] cmp [devfn], 256 jb .next_dev mov eax, [bus] inc eax mov [bus], eax cmp eax, [last_bus] jna .next_bus xor eax, eax ret .found: xor eax, eax inc eax ret .err: xor eax, eax ret endp ;DEVICE_ID equ ; pci device id ;VENDOR_ID equ ; device vendor id ;all initialized data place here align 4 devices dd (DEVICE_ID shl 16)+VENDOR_ID dd 0 ;terminator version dd 0x00030003 my_service db 'MY_SERVICE',0 ;max 16 chars include zero msgInit db 'detect hardware...',13,10,0 msgPCI db 'PCI accsess not supported',13,10,0 msgFail db 'device not found',13,10,0 section '.data' data readable writable align 16 ;all uninitialized data place here