home *** CD-ROM | disk | FTP | other *** search
/ Chip 1997 April / Chip_1997-04_cd.bin / prezent / cb / data.z / OPENFILE.ASM < prev    next >
Assembly Source File  |  1997-01-16  |  3KB  |  194 lines

  1.  
  2. ; *******************************************************
  3. ; *                            *
  4. ; *     Delphi Runtime Library                          *
  5. ; *                            *
  6. ; *    Copyright (c) 1996 Borland International    *
  7. ; *                            *
  8. ; *******************************************************
  9.  
  10.     INCLUDE    SE.ASM
  11.     INCLUDE    FILEIO.ASM
  12.  
  13.     .386
  14.     .MODEL    FLAT
  15.  
  16.     EXTRN    GetLastError:NEAR, CreateFileA:NEAR, CloseHandle:NEAR
  17.     EXTRN    GetStdHandle:NEAR, FileMode:BYTE, SetInOutRes:NEAR, InOutError:NEAR
  18.  
  19.     PUBLIC    _ResetFile, _RewritFile
  20.  
  21.     .CODE
  22.  
  23. ;    PROCEDURE OpenFile( VAR f: File; recSiz: Longint; mode: Longint );
  24.  
  25. OpenFile PROC
  26.  
  27. ; ->    EAX    Pointer to file record
  28. ;    EDX    Record size
  29. ;    ECX    File mode
  30.  
  31.     PUSH    EBX
  32.     PUSH    ESI
  33.     PUSH    EDI
  34.  
  35.     MOV    EBX,EAX
  36.     MOV    ESI,EDX
  37.     MOV    EDI,ECX
  38.  
  39.     MOV    EDX,[EBX].Mode
  40.     SUB    EDX,fmClosed
  41.     JE    @@alreadyClosed
  42.     CMP    EDX,fmInOut-fmClosed
  43.     JA    @@notAssignedError
  44.  
  45. ;    not yet closed: close it. File parameter is still in EAX
  46.  
  47.     CALL    [EBX].CloseFunc
  48.     TEST    EAX,EAX
  49.     JE    @@alreadyClosed
  50.         CALL    SetInOutRes
  51.  
  52. @@alreadyClosed:
  53.  
  54.     MOV    [EBX].Mode,fmInOut
  55.     MOV    [EBX].RecSize,ESI
  56.     MOV    [EBX].CloseFunc,offset CloseFile
  57.     MOV    [EBX].InOutFunc,offset @@NullProc
  58.  
  59.     CMP    byte ptr [EBX].FileName,0
  60.     JE    @@isCon
  61.  
  62.     MOV    EAX,GENERIC_READ OR GENERIC_WRITE
  63.     MOV    DL,FileMode
  64.     AND    EDX,070H
  65.     SHR    EDX,4-2
  66.     MOV    EDX,dword ptr [@@shareTab+EDX]
  67.     MOV    ECX,CREATE_ALWAYS
  68.  
  69.     SUB    EDI,3
  70.     JE    @@calledByRewrite
  71.  
  72.     MOV    ECX,OPEN_EXISTING
  73.     INC    EDI
  74.     JE    @@skip
  75.  
  76.     MOV    EAX,GENERIC_WRITE
  77.     INC    EDI
  78.     MOV    [EBX].Mode,fmOutput
  79.     JE    @@skip
  80.  
  81.     MOV    EAX,GENERIC_READ
  82.     MOV    [EBX].Mode,fmInput
  83.  
  84. @@skip:
  85. @@calledByRewrite:
  86.  
  87. ;    CreateFile(t.FileName, EAX, EDX, Nil, ECX, FILE_ATTRIBUTE_NORMAL, 0);
  88.  
  89.     PUSH    0
  90.     PUSH    FILE_ATTRIBUTE_NORMAL
  91.     PUSH    ECX
  92.     PUSH    0
  93.     PUSH    EDX
  94.     PUSH    EAX
  95.     LEA    EAX,[EBX].FileName
  96.     PUSH    EAX
  97.     CALL    CreateFileA
  98. @@checkHandle:
  99.     CMP    EAX,-1
  100.     JZ    @@error
  101.  
  102.     MOV    [EBX].Handle,EAX
  103. @@exit:
  104.     POP    EDI
  105.     POP    ESI
  106.     POP    EBX
  107.     RET
  108.  
  109. @@NullProc:
  110.     XOR    EAX,EAX
  111.     RET
  112.  
  113. @@isCon:
  114.     MOV    [EBX].CloseFunc,offset @@NullProc
  115.     CMP    EDI,3
  116.     JE    @@output
  117.     PUSH    STD_INPUT_HANDLE
  118.     JMP    @@1
  119. @@output:
  120.     PUSH    STD_OUTPUT_HANDLE
  121. @@1:
  122.     CALL    GetStdHandle
  123.     JMP    @@checkHandle
  124.  
  125. @@notAssignedError:
  126.     MOV    EAX,102
  127.     JMP    @@errExit
  128.  
  129. @@error:
  130.     MOV    [EBX].Mode,fmClosed
  131.     CALL    GetLastError
  132. @@errExit:
  133.         CALL    SetInOutRes
  134.     JMP    @@exit
  135.  
  136. @@shareTab:
  137.     DD    FILE_SHARE_READ OR FILE_SHARE_WRITE    ; OF_SHARE_COMPAT     0x00000000
  138.     DD    0                    ; OF_SHARE_EXCLUSIVE  0x00000010
  139.     DD    FILE_SHARE_READ                ; OF_SHARE_DENY_WRITE 0x00000020
  140.     DD    FILE_SHARE_WRITE            ; OF_SHARE_DENY_READ  0x00000030
  141.     DD    FILE_SHARE_READ OR FILE_SHARE_WRITE    ; OF_SHARE_DENY_NONE  0x00000040
  142.     DD    0
  143.     DD    0
  144.     DD    0
  145.  
  146. OpenFile ENDP
  147.  
  148.  
  149. ;    PROCEDURE _ResetFile( VAR f: File; recSize: Longint );
  150.  
  151. _ResetFile PROC
  152.  
  153. ; ->    EAX    Pointer to file record
  154. ;    EDX    Record size
  155.  
  156.     XOR    ECX,ECX
  157.     MOV    CL,FileMode
  158.     AND    CL,3
  159.     CMP    CL,2
  160.     JBE    @@skip
  161.     MOV    CL,2
  162. @@skip:
  163.     JMP    OpenFile
  164.  
  165. _ResetFile ENDP
  166.  
  167.  
  168. ;    PROCEDURE _RewritFile( VAR f: File; recSize: Longint );
  169.  
  170. _RewritFile PROC
  171.  
  172. ; ->    EAX    Pointer to file record
  173. ;    EDX    Record size
  174.  
  175.     MOV    ECX,3
  176.     JMP    OpenFile
  177.  
  178. _RewritFile ENDP
  179.  
  180.  
  181. CloseFile PROC
  182.  
  183. ; ->    EAX    Pointer to file record
  184.  
  185.     PUSH    [EAX].Handle
  186.     MOV    [EAX].Mode,fmClosed
  187.     Call    CloseHandle
  188.     DEC    EAX
  189.     JNZ    InOutError
  190.     RET
  191.  
  192. CloseFile ENDP
  193.     END
  194.