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)
12 /* FIXME: the large integer manipulations in this file dont handle overflow */
14 /* INCLUDES ****************************************************************/
17 #include <wine/debug.h>
19 WINE_DEFAULT_DEBUG_CHANNEL(kernel32file
);
21 /* FUNCTIONS ****************************************************************/
28 LockFile(HANDLE hFile
,
29 DWORD dwFileOffsetLow
,
30 DWORD dwFileOffsetHigh
,
31 DWORD nNumberOfBytesToLockLow
,
32 DWORD nNumberOfBytesToLockHigh
)
35 OVERLAPPED Overlapped
;
37 Overlapped
.Offset
= dwFileOffsetLow
;
38 Overlapped
.OffsetHigh
= dwFileOffsetHigh
;
39 Overlapped
.hEvent
= NULL
;
42 return LockFileEx(hFile
,
43 LOCKFILE_FAIL_IMMEDIATELY
|
44 LOCKFILE_EXCLUSIVE_LOCK
,
46 nNumberOfBytesToLockLow
,
47 nNumberOfBytesToLockHigh
,
57 LockFileEx(HANDLE hFile
,
60 DWORD nNumberOfBytesToLockLow
,
61 DWORD nNumberOfBytesToLockHigh
,
62 LPOVERLAPPED lpOverlapped
/* required! */)
64 LARGE_INTEGER BytesToLock
;
70 if(dwReserved
!= 0 || lpOverlapped
==NULL
)
72 SetLastError(ERROR_INVALID_PARAMETER
);
76 TRACE( "%p %x%08x %x%08x flags %x\n",
77 hFile
, lpOverlapped
->OffsetHigh
, lpOverlapped
->Offset
,
78 nNumberOfBytesToLockHigh
, nNumberOfBytesToLockLow
, dwFlags
);
80 lpOverlapped
->Internal
= STATUS_PENDING
;
82 Offset
.u
.LowPart
= lpOverlapped
->Offset
;
83 Offset
.u
.HighPart
= lpOverlapped
->OffsetHigh
;
85 if ( (dwFlags
& LOCKFILE_FAIL_IMMEDIATELY
) == LOCKFILE_FAIL_IMMEDIATELY
)
88 LockImmediate
= FALSE
;
90 if ( (dwFlags
& LOCKFILE_EXCLUSIVE_LOCK
) == LOCKFILE_EXCLUSIVE_LOCK
)
93 LockExclusive
= FALSE
;
95 BytesToLock
.u
.LowPart
= nNumberOfBytesToLockLow
;
96 BytesToLock
.u
.HighPart
= nNumberOfBytesToLockHigh
;
98 errCode
= NtLockFile(hFile
,
102 (PIO_STATUS_BLOCK
)lpOverlapped
,
106 (BOOLEAN
)LockImmediate
,
107 (BOOLEAN
)LockExclusive
);
109 if ( !NT_SUCCESS(errCode
) )
111 SetLastErrorByStatus(errCode
);
124 UnlockFile(HANDLE hFile
,
125 DWORD dwFileOffsetLow
,
126 DWORD dwFileOffsetHigh
,
127 DWORD nNumberOfBytesToUnlockLow
,
128 DWORD nNumberOfBytesToUnlockHigh
)
130 OVERLAPPED Overlapped
;
132 Overlapped
.Offset
= dwFileOffsetLow
;
133 Overlapped
.OffsetHigh
= dwFileOffsetHigh
;
136 return UnlockFileEx(hFile
,
138 nNumberOfBytesToUnlockLow
,
139 nNumberOfBytesToUnlockHigh
,
149 UnlockFileEx(HANDLE hFile
,
151 DWORD nNumberOfBytesToUnLockLow
,
152 DWORD nNumberOfBytesToUnLockHigh
,
153 LPOVERLAPPED lpOverlapped
/* required! */)
155 LARGE_INTEGER BytesToUnLock
;
156 LARGE_INTEGER StartAddress
;
159 if(dwReserved
!= 0 || lpOverlapped
== NULL
)
161 SetLastError(ERROR_INVALID_PARAMETER
);
165 TRACE( "%p %x%08x %x%08x\n",
166 hFile
, lpOverlapped
->OffsetHigh
, lpOverlapped
->Offset
,
167 nNumberOfBytesToUnLockHigh
, nNumberOfBytesToUnLockLow
);
169 BytesToUnLock
.u
.LowPart
= nNumberOfBytesToUnLockLow
;
170 BytesToUnLock
.u
.HighPart
= nNumberOfBytesToUnLockHigh
;
172 StartAddress
.u
.LowPart
= lpOverlapped
->Offset
;
173 StartAddress
.u
.HighPart
= lpOverlapped
->OffsetHigh
;
175 errCode
= NtUnlockFile(hFile
,
176 (PIO_STATUS_BLOCK
)lpOverlapped
,
181 if ( !NT_SUCCESS(errCode
) )
183 SetLastErrorByStatus(errCode
);