Sync with trunk (r48123)
[reactos.git] / dll / win32 / kernel32 / file / lfile.c
1 /* $Id$
2 *
3 * COPYRIGHT: See COPYING in the top level directory
4 * PROJECT: ReactOS system libraries
5 * FILE: lib/kernel32/file/lfile.c
6 * PURPOSE: Find functions
7 * PROGRAMMER: Ariadne ( ariadne@xs4all.nl)
8 * UPDATE HISTORY:
9 * Created 01/11/98
10 */
11
12 #include <k32.h>
13 #include <wine/debug.h>
14
15 WINE_DEFAULT_DEBUG_CHANNEL(kernel32file);
16
17 /*
18 * @implemented
19 */
20 long
21 WINAPI
22 _hread(HFILE hFile, LPVOID lpBuffer, long lBytes)
23 {
24 DWORD NumberOfBytesRead;
25
26 if (!ReadFile(LongToHandle(hFile),
27 lpBuffer,
28 (DWORD) lBytes,
29 &NumberOfBytesRead,
30 NULL))
31 {
32 return HFILE_ERROR;
33 }
34 return NumberOfBytesRead;
35 }
36
37
38 /*
39 * @implemented
40 */
41 long
42 WINAPI
43 _hwrite(HFILE hFile, LPCSTR lpBuffer, long lBytes)
44 {
45 DWORD NumberOfBytesWritten;
46
47 if (lBytes == 0)
48 {
49 if (!SetEndOfFile((HANDLE) hFile))
50 {
51 return HFILE_ERROR;
52 }
53 return 0;
54 }
55 if (!WriteFile(LongToHandle(hFile),
56 (LPVOID) lpBuffer,
57 (DWORD) lBytes,
58 &NumberOfBytesWritten,
59 NULL))
60 {
61 return HFILE_ERROR;
62 }
63 return NumberOfBytesWritten;
64 }
65
66
67 /*
68 * @implemented
69 */
70 HFILE
71 WINAPI
72 _lopen(LPCSTR lpPathName, int iReadWrite)
73 {
74 DWORD dwAccess, dwSharing, dwCreation;
75
76 if (iReadWrite & OF_CREATE)
77 {
78 dwCreation = CREATE_ALWAYS;
79 dwAccess = GENERIC_READ | GENERIC_WRITE;
80 }
81 else
82 {
83 dwCreation = OPEN_EXISTING;
84 switch(iReadWrite & 0x03)
85 {
86 case OF_READ: dwAccess = GENERIC_READ; break;
87 case OF_WRITE: dwAccess = GENERIC_WRITE; break;
88 case OF_READWRITE: dwAccess = GENERIC_READ | GENERIC_WRITE; break;
89 default: dwAccess = 0; break;
90 }
91 }
92
93 switch(iReadWrite & 0x70)
94 {
95 case OF_SHARE_EXCLUSIVE: dwSharing = 0; break;
96 case OF_SHARE_DENY_WRITE: dwSharing = FILE_SHARE_READ; break;
97 case OF_SHARE_DENY_READ: dwSharing = FILE_SHARE_WRITE; break;
98 case OF_SHARE_DENY_NONE:
99 case OF_SHARE_COMPAT:
100 default: dwSharing = FILE_SHARE_READ | FILE_SHARE_WRITE; break;
101 }
102
103 return (HFILE) CreateFileA(lpPathName,
104 dwAccess,
105 dwSharing,
106 NULL,
107 dwCreation,
108 FILE_ATTRIBUTE_NORMAL,
109 NULL);
110 }
111
112
113 /*
114 * @implemented
115 */
116 HFILE
117 WINAPI
118 _lcreat(LPCSTR lpPathName, int iAttribute)
119 {
120 HANDLE hFile;
121
122 iAttribute &= FILE_ATTRIBUTE_READONLY | FILE_ATTRIBUTE_HIDDEN | FILE_ATTRIBUTE_SYSTEM;
123 hFile = CreateFileA(lpPathName,
124 GENERIC_READ | GENERIC_WRITE,
125 (FILE_SHARE_READ | FILE_SHARE_WRITE),
126 NULL,
127 CREATE_ALWAYS,
128 iAttribute,
129 NULL);
130
131 return HandleToLong(hFile);
132 }
133
134
135 /*
136 * @implemented
137 */
138 int
139 WINAPI
140 _lclose(HFILE hFile)
141 {
142 return CloseHandle(LongToHandle(hFile)) ? 0 : HFILE_ERROR;
143 }
144
145
146 /*
147 * @implemented
148 */
149 LONG
150 WINAPI
151 _llseek(HFILE hFile, LONG lOffset, int iOrigin)
152 {
153 return SetFilePointer(LongToHandle(hFile),
154 lOffset,
155 NULL,
156 (DWORD) iOrigin);
157 }
158
159 /* EOF */