1 /* $Id: lock.c 55795 2012-02-21 21:38:08Z ion $
3 * COPYRIGHT: See COPYING in the top level directory
4 * PROJECT: ReactOS system libraries
5 * FILE: dll/win32/kernel32/file/lock.c
6 * PURPOSE: Directory functions
7 * PROGRAMMER: Ariadne ( ariadne@xs4all.nl)
13 /* INCLUDES ****************************************************************/
19 /* FUNCTIONS ****************************************************************/
26 LockFile(IN HANDLE hFile
,
27 IN DWORD dwFileOffsetLow
,
28 IN DWORD dwFileOffsetHigh
,
29 IN DWORD nNumberOfBytesToLockLow
,
30 IN DWORD nNumberOfBytesToLockHigh
)
32 IO_STATUS_BLOCK IoStatusBlock
;
34 LARGE_INTEGER BytesToLock
, Offset
;
36 /* Is this a console handle? */
37 if (IsConsoleHandle(hFile
))
39 /* Can't "lock" a console! */
40 BaseSetLastNTError(STATUS_INVALID_HANDLE
);
44 /* Setup the parameters in NT style and call the native API */
45 BytesToLock
.u
.LowPart
= nNumberOfBytesToLockLow
;
46 BytesToLock
.u
.HighPart
= nNumberOfBytesToLockHigh
;
47 Offset
.u
.LowPart
= dwFileOffsetLow
;
48 Offset
.u
.HighPart
= dwFileOffsetHigh
;
49 Status
= NtLockFile(hFile
,
59 if (Status
== STATUS_PENDING
)
61 /* Wait for completion if needed */
62 Status
= NtWaitForSingleObject(hFile
, FALSE
, NULL
);
63 if (NT_SUCCESS(Status
)) Status
= IoStatusBlock
.Status
;
66 /* Check if we failed */
67 if (!NT_SUCCESS(Status
))
69 /* Convert the error code and fail */
70 BaseSetLastNTError(Status
);
83 LockFileEx(IN HANDLE hFile
,
86 IN DWORD nNumberOfBytesToLockLow
,
87 IN DWORD nNumberOfBytesToLockHigh
,
88 IN LPOVERLAPPED lpOverlapped
)
90 LARGE_INTEGER BytesToLock
, Offset
;
93 /* Is this a console handle? */
94 if (IsConsoleHandle(hFile
))
96 /* Can't "lock" a console! */
97 BaseSetLastNTError(STATUS_INVALID_HANDLE
);
101 /* This parameter should be zero */
104 /* Fail since it isn't */
105 SetLastError(ERROR_INVALID_PARAMETER
);
109 /* Set the initial status in the IO_STATUS_BLOCK to pending... */
110 lpOverlapped
->Internal
= STATUS_PENDING
;
112 /* Convert the parameters to NT format and call the native API */
113 Offset
.u
.LowPart
= lpOverlapped
->Offset
;
114 Offset
.u
.HighPart
= lpOverlapped
->OffsetHigh
;
115 BytesToLock
.u
.LowPart
= nNumberOfBytesToLockLow
;
116 BytesToLock
.u
.HighPart
= nNumberOfBytesToLockHigh
;
117 Status
= NtLockFile(hFile
,
118 lpOverlapped
->hEvent
,
121 (PIO_STATUS_BLOCK
)lpOverlapped
,
125 dwFlags
& LOCKFILE_FAIL_IMMEDIATELY
? TRUE
: FALSE
,
126 dwFlags
& LOCKFILE_EXCLUSIVE_LOCK
? TRUE
: FALSE
);
127 if ((NT_SUCCESS(Status
)) && (Status
!= STATUS_PENDING
))
129 /* Pending status is *not* allowed in the Ex API */
133 /* Convert the error code and fail */
134 BaseSetLastNTError(Status
);
143 UnlockFile(IN HANDLE hFile
,
144 IN DWORD dwFileOffsetLow
,
145 IN DWORD dwFileOffsetHigh
,
146 IN DWORD nNumberOfBytesToUnlockLow
,
147 IN DWORD nNumberOfBytesToUnlockHigh
)
149 OVERLAPPED Overlapped
;
153 /* Convert parameters to Ex format and call the new API */
154 Overlapped
.Offset
= dwFileOffsetLow
;
155 Overlapped
.OffsetHigh
= dwFileOffsetHigh
;
156 Result
= UnlockFileEx(hFile
,
158 nNumberOfBytesToUnlockLow
,
159 nNumberOfBytesToUnlockHigh
,
161 if (!(Result
) && (GetLastError() == ERROR_IO_PENDING
))
163 /* Ex fails during STATUS_PENDING, handle that here by waiting */
164 Status
= NtWaitForSingleObject(hFile
, FALSE
, NULL
);
165 if (NT_SUCCESS(Status
)) Status
= Overlapped
.Internal
;
167 /* Now if the status is successful, return */
168 if (!NT_SUCCESS(Status
)) return TRUE
;
170 /* Otherwise the asynchronous operation had a failure, so fail */
171 BaseSetLastNTError(Status
);
175 /* Success or error case -- Ex took care of the rest, just return */
184 UnlockFileEx(IN HANDLE hFile
,
186 IN DWORD nNumberOfBytesToUnLockLow
,
187 IN DWORD nNumberOfBytesToUnLockHigh
,
188 IN LPOVERLAPPED lpOverlapped
)
190 LARGE_INTEGER BytesToUnLock
, StartAddress
;
193 /* Is this a console handle? */
194 if (IsConsoleHandle(hFile
))
196 /* Can't "unlock" a console! */
197 BaseSetLastNTError(STATUS_INVALID_HANDLE
);
201 /* This parameter should be zero */
204 /* Fail since it isn't */
205 SetLastError(ERROR_INVALID_PARAMETER
);
209 /* Convert to NT format and call the native function */
210 BytesToUnLock
.u
.LowPart
= nNumberOfBytesToUnLockLow
;
211 BytesToUnLock
.u
.HighPart
= nNumberOfBytesToUnLockHigh
;
212 StartAddress
.u
.LowPart
= lpOverlapped
->Offset
;
213 StartAddress
.u
.HighPart
= lpOverlapped
->OffsetHigh
;
214 Status
= NtUnlockFile(hFile
,
215 (PIO_STATUS_BLOCK
)lpOverlapped
,
219 if (!NT_SUCCESS(Status
))
221 /* Convert the error and fail */
222 BaseSetLastNTError(Status
);