drivers/usb: fix usbother driver
Added array of endpoints in DRV_CONTEXT and save params for ioctl API.
This commit is contained in:
@@ -76,6 +76,7 @@ USBDRV_TYPE_NOLOCK = 0 ; usb device not controlled (native driver
|
|||||||
USBDRV_TYPE_NATIVE = 1 ; native PE kernel driver for usb
|
USBDRV_TYPE_NATIVE = 1 ; native PE kernel driver for usb
|
||||||
USBDRV_TYPE_IOCTL = 2 ; usb device is controlled by IOCTL service
|
USBDRV_TYPE_IOCTL = 2 ; usb device is controlled by IOCTL service
|
||||||
; (driver or userspace process/threads)
|
; (driver or userspace process/threads)
|
||||||
|
USBDRV_IOCTL_BLOCKED = 4 ; blocked IOCTL interface, device disconnected
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -86,10 +87,11 @@ struct DRV_CONTEXT
|
|||||||
drv_pdata dd ?
|
drv_pdata dd ?
|
||||||
flags dd ?
|
flags dd ?
|
||||||
|
|
||||||
config_pipe dd ?
|
|
||||||
config_descr dd ?
|
config_descr dd ?
|
||||||
interface_descr dd ?
|
interface_descr dd ?
|
||||||
|
ep rd 64 ; 32 IN + 32 OUT endpointers pipe
|
||||||
ends
|
ends
|
||||||
|
DRV_CONTEXT.ep0 fix (DRV_CONTEXT.ep + 0)
|
||||||
|
|
||||||
|
|
||||||
section '.flat' code readable writable executable
|
section '.flat' code readable writable executable
|
||||||
@@ -108,6 +110,9 @@ proc START c, state:dword, cmdline:dword
|
|||||||
mov ecx, drv_list_lock
|
mov ecx, drv_list_lock
|
||||||
invoke MutexInit
|
invoke MutexInit
|
||||||
|
|
||||||
|
mov ecx, interface_list_lock
|
||||||
|
invoke MutexInit
|
||||||
|
|
||||||
; load drv_list
|
; load drv_list
|
||||||
stdcall load_drv_list, default_list
|
stdcall load_drv_list, default_list
|
||||||
test eax, eax
|
test eax, eax
|
||||||
@@ -161,7 +166,7 @@ proc service_proc stdcall, .ioctl:dword
|
|||||||
cmp ecx, .count_ioctl_codes
|
cmp ecx, .count_ioctl_codes
|
||||||
jae .fail
|
jae .fail
|
||||||
|
|
||||||
jmp dword[.table_subfunction + ecx]
|
jmp dword[.table_subfunction + ecx*4]
|
||||||
|
|
||||||
.table_subfunction:
|
.table_subfunction:
|
||||||
dd .get_version
|
dd .get_version
|
||||||
@@ -205,6 +210,7 @@ proc service_proc stdcall, .ioctl:dword
|
|||||||
.get_full_dev_data:
|
.get_full_dev_data:
|
||||||
.open_dev:
|
.open_dev:
|
||||||
.close_dev:
|
.close_dev:
|
||||||
|
;
|
||||||
.control_transfer:
|
.control_transfer:
|
||||||
.bulk_transfer:
|
.bulk_transfer:
|
||||||
.interrupt_transfer:
|
.interrupt_transfer:
|
||||||
@@ -227,23 +233,20 @@ proc AddDevice stdcall, .config_pipe:dword, \
|
|||||||
|
|
||||||
mov esi, eax
|
mov esi, eax
|
||||||
|
|
||||||
; mov ecx, interface_list_lock
|
mov ecx, interface_list_lock
|
||||||
; invoke MutexLock
|
invoke MutexLock
|
||||||
;
|
|
||||||
; mov edx, [usb_interface_list]
|
mov edx, [usb_interface_list] ; next
|
||||||
; test edx, edx
|
mov [esi + DRV_CONTEXT.next], edx
|
||||||
; jz @f
|
mov [esi + DRV_CONTEXT.prev], usb_interface_list
|
||||||
; mov [edx + DRV_CONTEXT.prev], esi
|
mov [usb_interface_list], esi
|
||||||
;@@:
|
mov [edx + DRV_CONTEXT.prev], esi
|
||||||
; mov [esi + DRV_CONTEXT.next], edx
|
|
||||||
; mov [esi + DRV_CONTEXT.prev], 0
|
mov ecx, interface_list_lock
|
||||||
; mov [usb_interface_list], esi
|
invoke MutexUnlock
|
||||||
;
|
|
||||||
; mov ecx, interface_list_lock
|
|
||||||
; invoke MutexUnlock
|
|
||||||
|
|
||||||
and [esi + DRV_CONTEXT.drv_hand], 0
|
and [esi + DRV_CONTEXT.drv_hand], 0
|
||||||
mov [esi + DRV_CONTEXT.flags], 0
|
mov [esi + DRV_CONTEXT.flags], USBDRV_TYPE_NOLOCK
|
||||||
|
|
||||||
; lock mutex
|
; lock mutex
|
||||||
mov ecx, drv_list_lock
|
mov ecx, drv_list_lock
|
||||||
@@ -251,7 +254,7 @@ proc AddDevice stdcall, .config_pipe:dword, \
|
|||||||
|
|
||||||
; save device context data
|
; save device context data
|
||||||
mov eax, [.config_pipe]
|
mov eax, [.config_pipe]
|
||||||
mov [esi + DRV_CONTEXT.config_pipe], eax
|
mov [esi + DRV_CONTEXT.ep0], eax
|
||||||
mov eax, [.config_descr]
|
mov eax, [.config_descr]
|
||||||
mov [esi + DRV_CONTEXT.config_descr], eax
|
mov [esi + DRV_CONTEXT.config_descr], eax
|
||||||
mov eax, [.interface]
|
mov eax, [.interface]
|
||||||
@@ -456,26 +459,17 @@ proc DeviceDisconnected stdcall, .pdata:dword
|
|||||||
stdcall [edx + USBFUNC.device_disconnect], [eax + DRV_CONTEXT.drv_pdata]
|
stdcall [edx + USBFUNC.device_disconnect], [eax + DRV_CONTEXT.drv_pdata]
|
||||||
.free:
|
.free:
|
||||||
; clear list of DRV_CONTENT
|
; clear list of DRV_CONTENT
|
||||||
; mov ecx, interface_list_lock
|
mov ecx, interface_list_lock
|
||||||
; invoke MutexLock
|
invoke MutexLock
|
||||||
;
|
|
||||||
; mov eax, [.pdata]
|
mov eax, [.pdata]
|
||||||
; mov edx, [eax + DRV_CONTEXT.prev]
|
mov edx, [eax + DRV_CONTEXT.prev]
|
||||||
; mov ecx, [eax + DRV_CONTEXT.next]
|
mov ecx, [eax + DRV_CONTEXT.next]
|
||||||
; test edx, edx
|
mov [edx + DRV_CONTEXT.next], ecx
|
||||||
; jz @f
|
mov [ecx + DRV_CONTEXT.prev], edx
|
||||||
; mov [edx + DRV_CONTEXT.next], ecx
|
|
||||||
;@@:
|
mov ecx, interface_list_lock
|
||||||
; test ecx, ecx
|
invoke MutexUnlock
|
||||||
; jz @f
|
|
||||||
; mov [ecx + DRV_CONTEXT.prev], edx
|
|
||||||
;@@:
|
|
||||||
; cmp [usb_interface_list], eax
|
|
||||||
; jne @f
|
|
||||||
; mov [usb_interface_list], ecx
|
|
||||||
;@@:
|
|
||||||
; mov ecx, interface_list_lock
|
|
||||||
; invoke MutexUnlock
|
|
||||||
|
|
||||||
; free context
|
; free context
|
||||||
mov eax, [.pdata]
|
mov eax, [.pdata]
|
||||||
@@ -485,6 +479,15 @@ proc DeviceDisconnected stdcall, .pdata:dword
|
|||||||
test [eax + DRV_CONTEXT.flags], USBDRV_TYPE_IOCTL
|
test [eax + DRV_CONTEXT.flags], USBDRV_TYPE_IOCTL
|
||||||
jz .free
|
jz .free
|
||||||
|
|
||||||
|
; set state for block user api and clear struct
|
||||||
|
or [eax + DRV_CONTEXT.flags], USBDRV_IOCTL_BLOCKED
|
||||||
|
xor ecx, ecx
|
||||||
|
;mov [eax + DRV_CONTEXT.drv_hand], ecx
|
||||||
|
;mov [eax + DRV_CONTEXT.drv_pdata], ecx
|
||||||
|
mov [eax + DRV_CONTEXT.config_descr], ecx
|
||||||
|
mov [eax + DRV_CONTEXT.interface_descr], ecx
|
||||||
|
mov [eax + DRV_CONTEXT.ep0], ecx
|
||||||
|
; TODO
|
||||||
jmp .free
|
jmp .free
|
||||||
endp
|
endp
|
||||||
|
|
||||||
@@ -495,8 +498,8 @@ drv_list dd ?
|
|||||||
|
|
||||||
interface_list_lock MUTEX
|
interface_list_lock MUTEX
|
||||||
usb_interface_list:
|
usb_interface_list:
|
||||||
dd ?
|
dd usb_interface_list
|
||||||
dd ?
|
dd usb_interface_list
|
||||||
|
|
||||||
|
|
||||||
usb_functions:
|
usb_functions:
|
||||||
|
Reference in New Issue
Block a user