瀏覽代碼

* real implementation for FileCreate with ShareMode (plus fix for ShareMode in FileOpen)

git-svn-id: trunk@17565 -
Tomas Hajny 14 年之前
父節點
當前提交
5e3ebfab4d
共有 1 個文件被更改,包括 33 次插入17 次删除
  1. 33 17
      rtl/emx/sysutils.pp

+ 33 - 17
rtl/emx/sysutils.pp

@@ -403,10 +403,14 @@ asm
  mov ecx, Mode
  mov ecx, Mode
  mov edx, FileName
  mov edx, FileName
 {$ENDIF REGCALL}
 {$ENDIF REGCALL}
-(* DenyAll if sharing not specified. *)
- test ecx, 112
- jnz @FOpen1
- or ecx, 16
+(* DenyNone if sharing not specified. *)
+ mov eax, ecx
+ xor eax, 112
+ jz @FOpenDefSharing
+ cmp eax, 64
+ jbe FOpen1
+@FOpenDefSharing:
+ or ecx, 64
 @FOpen1:
 @FOpen1:
  mov eax, 7F2Bh
  mov eax, 7F2Bh
  call syscall
  call syscall
@@ -415,32 +419,44 @@ asm
 end {['eax', 'ebx', 'ecx', 'edx']};
 end {['eax', 'ebx', 'ecx', 'edx']};
 
 
 
 
-function FileCreate (const FileName: string): longint; assembler;
+function FileCreate (const FileName: string): longint;
+begin
+  FileCreate := FileCreate (FileName, ofReadWrite or faCreate or doDenyRW, 777);
+                                                       (* Sharing to DenyAll *)
+end;
+
+
+function FileCreate (const FileName: string; Rights: integer): longint;
+begin
+  FileCreate := FileCreate (FileName, ofReadWrite or faCreate or doDenyRW,
+                                              Rights); (* Sharing to DenyAll *)
+end;
+
+function FileCreate (const FileName: string; ShareMode: integer; Rights: integer): longint; assembler;
 asm
 asm
  push ebx
  push ebx
 {$IFDEF REGCALL}
 {$IFDEF REGCALL}
+ mov ecx, edx
  mov edx, eax
  mov edx, eax
 {$ELSE REGCALL}
 {$ELSE REGCALL}
+ mov ecx, ShareMode
  mov edx, FileName
  mov edx, FileName
 {$ENDIF REGCALL}
 {$ENDIF REGCALL}
+ and ecx, 112
+ or ecx, ecx
+ jz @FCDefSharing
+ cmp ecx, 64
+ jbe @FCSharingOK
+@FCDefSharing:
+ mov ecx, doDenyRW   (* Sharing to DenyAll *)
+@FCSharingOK:
+ or ecx, ofReadWrite or faCreate
  mov eax, 7F2Bh
  mov eax, 7F2Bh
- mov ecx, ofReadWrite or faCreate or doDenyRW   (* Sharing to DenyAll *)
  call syscall
  call syscall
  pop ebx
  pop ebx
 end {['eax', 'ebx', 'ecx', 'edx']};
 end {['eax', 'ebx', 'ecx', 'edx']};
 
 
 
 
-function FileCreate (const FileName: string; Rights: integer): longint;
-begin
-  FileCreate:=FileCreate(FileName);
-end;
-
-function FileCreate (const FileName: string; ShareMode : integer; Rights: integer): longint;
-begin
-  FileCreate:=FileCreate(FileName);
-end;
-
-
 function FileRead (Handle: longint; Out Buffer; Count: longint): longint;
 function FileRead (Handle: longint; Out Buffer; Count: longint): longint;
                                                                      assembler;
                                                                      assembler;
 asm
 asm