Модуль "P2KApi" (часть 50) - TP2KAPI.USB_ReadDataEx

Рубрика: Исходники
Среда, 21 апреля 2010 г.
Просмотров: 129
последняя версия: 3.0.9 build 961 beta
от 07 декабря 2007 г.
function TP2KAPI.USB_ReadDataEx(Buf: Pointer; var SSize: Dword; Mode: byte; TimeOut: LongInt): boolean;
var
  ovr: OVERLAPPED;
  PBuf, pOvr,pSize, pRBuf:pointer;
  packet_buf:array[0..4095]of byte;
  result_buf:array[0..4100]of byte;
  xRez: integer;
  Size:dword;

begin
xRez:= 0;
result:= false;
//pBuf:=@packet_buf;
//pRBuf:=@result_buf;
pBuf:=Buf;
pRBuf:=@result_buf[0];
pOvr:=@ovr;
Size:=SSize;
PSize:=@Size;
asm
                push    ecx
                push    edx
                push    ebx
                push    esi
                push    edi
                push    0
                push    0
                push    1
                push    0
                call    CreateEventA
                cmp     eax, 0
                jnz     @@event_ok
//                push    offset msg_usb_event_fail
//                call    logstat
                mov     eax, 0
                mov     xRez, 0
                jmp     @@exit
@@event_ok:
                mov     ovr.hEvent, eax
                push    ovr.hEvent
                call    ResetEvent
                cmp     eax, 0
                jnz     @@reset_ok
                push    ovr.hEvent
                call    CloseHandle
//                push    offset msg_usb_reset_fail
//                call    logstat
                mov     eax, 0
                mov     xRez, 0
                jmp     @@exit
@@reset_ok:
                mov     edi, pBuf
                mov     al, Mode
                stosb
                mov     eax, Size
                stosd
                push    pOvr
                push    0
                push    1005h
                push    pRBuf
                push    5
                push    pBuf
                push    8000201Ch
                push    HDev
                call    DeviceIOControl
                push    TimeOut
                push    ovr.hEvent
                call    WaitForSingleObject
                cmp     eax, 0
                jz      @@wait_ok
                push    HDev
                call    CancelIo
                push    ovr.hEvent
                call    CloseHandle
//                push    offset msg_usb_wait_fail
//                call    logstat
                mov     eax, 0
                mov     xRez, 0
                jmp     @@exit
@@wait_ok:
                push    0
                push    pSize
                push    pOvr
                push    HDev
                call    GetOverlappedResult
                cmp     eax, 0
                jnz     @@devio_ok
                push    HDev
                call    CancelIo
                push    ovr.hEvent
                call    CloseHandle
//                push    offset msg_usb_result_fail
//                call    logstat
                mov     eax, 0
                mov     xRez, 0
                jmp     @@exit
@@devio_ok:
                mov     ecx, Size
                cmp     ecx, 4
                jnb     @@size_ok
                push    ovr.hEvent
                call    CloseHandle
//                push    offset msg_usb_size_fail
//                call    logstat
                mov     eax, 0
                mov     xRez, 0
                jmp     @@exit
@@size_ok:
                sub     ecx, 4
                mov     Size, ecx
                mov     esi, pRBuf
                add     esi, 4
                mov     edi, Buf
                rep     movsb
                push    ovr.hEvent
                call    CloseHandle
//                push    offset msg_usb_read_ok
//                call    logstat
                mov     eax, 1
                mov     xRez, 1
@@exit:
                pop     edi
                pop     esi
                pop     ebx
                pop     edx
                pop     ecx
end;
  SSize:=Size;
  result:= boolean(xRez);
  //Logger(Format('End of USB_ReadDataEx .... xRez = %d, result = %s',[xRez, BoolToStr(result, true)]));
end;
Rambler's Top100