74c9afa1129f53d87a55ddcd5d350187e6d9e266
[reactos.git] / reactos / lib / kernel32 / file / lock.c
1 /* $Id: lock.c,v 1.8 2003/01/15 21:24:34 chorns Exp $
2 *
3 * COPYRIGHT: See COPYING in the top level directory
4 * PROJECT: ReactOS system libraries
5 * FILE: lib/kernel32/file/file.c
6 * PURPOSE: Directory functions
7 * PROGRAMMER: Ariadne ( ariadne@xs4all.nl)
8 * GetTempFileName is modified from WINE [ Alexandre Juiliard ]
9 * UPDATE HISTORY:
10 * Created 01/11/98
11 */
12
13 /* FIXME: the large integer manipulations in this file dont handle overflow */
14
15 /* INCLUDES ****************************************************************/
16
17 #include <k32.h>
18
19 #define NDEBUG
20 #include <kernel32/kernel32.h>
21
22 /* FUNCTIONS ****************************************************************/
23
24 WINBOOL
25 STDCALL
26 LockFile(
27 HANDLE hFile,
28 DWORD dwFileOffsetLow,
29 DWORD dwFileOffsetHigh,
30 DWORD nNumberOfBytesToLockLow,
31 DWORD nNumberOfBytesToLockHigh
32 )
33 {
34 DWORD dwReserved;
35 OVERLAPPED Overlapped;
36
37 Overlapped.Offset = dwFileOffsetLow;
38 Overlapped.OffsetHigh = dwFileOffsetHigh;
39 dwReserved = 0;
40
41 return LockFileEx(hFile, LOCKFILE_FAIL_IMMEDIATELY|LOCKFILE_EXCLUSIVE_LOCK,dwReserved,nNumberOfBytesToLockLow, nNumberOfBytesToLockHigh, &Overlapped ) ;
42
43 }
44
45 WINBOOL
46 STDCALL
47 LockFileEx(
48 HANDLE hFile,
49 DWORD dwFlags,
50 DWORD dwReserved,
51 DWORD nNumberOfBytesToLockLow,
52 DWORD nNumberOfBytesToLockHigh,
53 LPOVERLAPPED lpOverlapped
54 )
55 {
56 LARGE_INTEGER BytesToLock;
57 BOOL LockImmediate;
58 BOOL LockExclusive;
59 NTSTATUS errCode;
60 LARGE_INTEGER Offset;
61
62 if(dwReserved != 0)
63 {
64 SetLastError(ERROR_INVALID_PARAMETER);
65 return FALSE;
66 }
67
68 lpOverlapped->Internal = STATUS_PENDING;
69
70 Offset.u.LowPart = lpOverlapped->Offset;
71 Offset.u.HighPart = lpOverlapped->OffsetHigh;
72
73 if ( (dwFlags & LOCKFILE_FAIL_IMMEDIATELY) == LOCKFILE_FAIL_IMMEDIATELY )
74 LockImmediate = TRUE;
75 else
76 LockImmediate = FALSE;
77
78 if ( (dwFlags & LOCKFILE_EXCLUSIVE_LOCK) == LOCKFILE_EXCLUSIVE_LOCK )
79 LockExclusive = TRUE;
80 else
81 LockExclusive = FALSE;
82
83 BytesToLock.u.LowPart = nNumberOfBytesToLockLow;
84 BytesToLock.u.HighPart = nNumberOfBytesToLockHigh;
85
86 errCode = NtLockFile(hFile,
87 NULL,
88 NULL,
89 NULL,
90 (PIO_STATUS_BLOCK)lpOverlapped,
91 &Offset,
92 &BytesToLock,
93 NULL,
94 LockImmediate,
95 LockExclusive);
96 if ( !NT_SUCCESS(errCode) )
97 {
98 SetLastErrorByStatus (errCode);
99 return FALSE;
100 }
101
102 return TRUE;
103
104 }
105
106 WINBOOL
107 STDCALL
108 UnlockFile(
109 HANDLE hFile,
110 DWORD dwFileOffsetLow,
111 DWORD dwFileOffsetHigh,
112 DWORD nNumberOfBytesToUnlockLow,
113 DWORD nNumberOfBytesToUnlockHigh
114 )
115 {
116 DWORD dwReserved;
117 OVERLAPPED Overlapped;
118 Overlapped.Offset = dwFileOffsetLow;
119 Overlapped.OffsetHigh = dwFileOffsetHigh;
120 dwReserved = 0;
121 return UnlockFileEx(hFile, dwReserved, nNumberOfBytesToUnlockLow, nNumberOfBytesToUnlockHigh, &Overlapped);
122
123 }
124
125
126
127 WINBOOL
128 STDCALL
129 UnlockFileEx(
130 HANDLE hFile,
131 DWORD dwReserved,
132 DWORD nNumberOfBytesToUnLockLow,
133 DWORD nNumberOfBytesToUnLockHigh,
134 LPOVERLAPPED lpOverlapped
135 )
136 {
137 LARGE_INTEGER BytesToUnLock;
138 LARGE_INTEGER StartAddress;
139 NTSTATUS errCode;
140
141 if(dwReserved != 0)
142 {
143 SetLastError(ERROR_INVALID_PARAMETER);
144 return FALSE;
145 }
146 if ( lpOverlapped == NULL )
147 {
148 SetLastError(ERROR_INVALID_PARAMETER);
149 return FALSE;
150 }
151
152 BytesToUnLock.u.LowPart = nNumberOfBytesToUnLockLow;
153 BytesToUnLock.u.HighPart = nNumberOfBytesToUnLockHigh;
154
155 StartAddress.u.LowPart = lpOverlapped->Offset;
156 StartAddress.u.HighPart = lpOverlapped->OffsetHigh;
157
158 errCode = NtUnlockFile(hFile,
159 (PIO_STATUS_BLOCK)lpOverlapped,
160 &StartAddress,
161 &BytesToUnLock,
162 NULL);
163 if ( !NT_SUCCESS(errCode) ) {
164 SetLastErrorByStatus (errCode);
165 return FALSE;
166 }
167
168 return TRUE;
169 }
170
171 /* EOF */