branch update for HEAD-2003021201
[reactos.git] / lib / kernel32 / file / lock.c
1 /* $Id$
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 */