xref: /reactos/dll/win32/kernel32/client/file/tape.c (revision 845faec4)
1 /*
2  * COPYRIGHT:       See COPYING in the top level directory
3  * PROJECT:         ReactOS system libraries
4  * FILE:            dll/win32/kernel32/client/file/tape.c
5  * PURPOSE:         Tape functions
6  * PROGRAMMER:      Ariadne ( ariadne@xs4all.nl)
7  * UPDATE HISTORY:
8  *                  Created 01/11/98
9  */
10 
11 /* INCLUDES *******************************************************************/
12 
13 #include <k32.h>
14 #define NDEBUG
15 #include <debug.h>
16 
17 /* PRIVATE FUNCTIONS **********************************************************/
18 
19 DWORD
20 WINAPI
21 BasepDoTapeOperation(IN HANDLE DeviceHandle,
22                      IN ULONG Ioctl,
23                      IN PVOID Input,
24                      IN ULONG InputLength,
25                      IN PVOID Output,
26                      IN ULONG OutputLength)
27 {
28     HANDLE TapeEvent;
29     DWORD ErrorCode;
30     NTSTATUS Status;
31     IO_STATUS_BLOCK IoStatusBlock;
32 
33     /* Create the wait event */
34     TapeEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
35     if (!TapeEvent) return GetLastError();
36 
37     /* Send the IOCTL */
38     Status = NtDeviceIoControlFile(DeviceHandle,
39                                    TapeEvent,
40                                    0,
41                                    0,
42                                    &IoStatusBlock,
43                                    Ioctl,
44                                    Input,
45                                    InputLength,
46                                    Output,
47                                    OutputLength);
48     if (Status == STATUS_PENDING)
49     {
50         /* Wait for its completion */
51         WaitForSingleObject(TapeEvent, INFINITE);
52         Status = IoStatusBlock.Status;
53     }
54 
55     /* Get rid of the wait event and check status */
56     CloseHandle(TapeEvent);
57     if (!NT_SUCCESS(Status))
58     {
59         /* Convert to Win32 */
60         BaseSetLastNTError(Status);
61         ErrorCode = GetLastError();
62     }
63     else
64     {
65         /* Set success */
66         ErrorCode = ERROR_SUCCESS;
67     }
68 
69     /* Return the Win32 error code */
70     return ErrorCode;
71 }
72 
73 /* PUBLIC FUNCTIONS ***********************************************************/
74 
75 /*
76  * @implemented
77  */
78 DWORD
79 WINAPI
80 CreateTapePartition(IN HANDLE hDevice,
81                     IN DWORD dwPartitionMethod,
82                     IN DWORD dwCount,
83                     IN DWORD dwSize)
84 {
85     TAPE_CREATE_PARTITION TapeCreatePartition;
86 
87     TapeCreatePartition.Method = dwPartitionMethod;
88     TapeCreatePartition.Count = dwCount;
89     TapeCreatePartition.Size = dwSize;
90     return BasepDoTapeOperation(hDevice,
91                                 IOCTL_TAPE_CREATE_PARTITION,
92                                 &TapeCreatePartition,
93                                 sizeof(TapeCreatePartition),
94                                 NULL,
95                                 0);
96 }
97 
98 /*
99  * @implemented
100  */
101 DWORD
102 WINAPI
103 EraseTape(IN HANDLE hDevice,
104           IN DWORD dwEraseType,
105           IN BOOL bImmediate)
106 {
107     TAPE_ERASE TapeErase;
108 
109     TapeErase.Type = dwEraseType;
110     TapeErase.Immediate = (BOOLEAN)bImmediate;
111     return BasepDoTapeOperation(hDevice,
112                                 IOCTL_TAPE_ERASE,
113                                 &TapeErase,
114                                 sizeof(TapeErase),
115                                 NULL,
116                                 0);
117 }
118 
119 /*
120  * @implemented
121  */
122 DWORD
123 WINAPI
124 GetTapeParameters(IN HANDLE hDevice,
125                   IN DWORD dwOperation,
126                   IN LPDWORD lpdwSize,
127                   IN LPVOID lpTapeInformation)
128 {
129     if (dwOperation == GET_TAPE_MEDIA_INFORMATION)
130     {
131         if (*lpdwSize < sizeof(TAPE_GET_MEDIA_PARAMETERS))
132         {
133             *lpdwSize = sizeof(TAPE_GET_MEDIA_PARAMETERS);
134             return ERROR_MORE_DATA;
135         }
136 
137         return BasepDoTapeOperation(hDevice,
138                                     IOCTL_TAPE_GET_MEDIA_PARAMS,
139                                     NULL,
140                                     0,
141                                     lpTapeInformation,
142                                     sizeof(TAPE_GET_MEDIA_PARAMETERS));
143     }
144     else if (dwOperation == GET_TAPE_DRIVE_INFORMATION)
145     {
146         if (*lpdwSize < sizeof(TAPE_GET_DRIVE_PARAMETERS))
147         {
148             *lpdwSize = sizeof(TAPE_GET_DRIVE_PARAMETERS);
149             return ERROR_MORE_DATA;
150         }
151 
152         return BasepDoTapeOperation(hDevice,
153                                     IOCTL_TAPE_GET_DRIVE_PARAMS,
154                                     NULL,
155                                     0,
156                                     lpTapeInformation,
157                                     sizeof(TAPE_GET_DRIVE_PARAMETERS));
158     }
159 
160     return ERROR_INVALID_FUNCTION;
161 }
162 
163 /*
164  * @implemented
165  */
166 DWORD
167 WINAPI
168 GetTapePosition(IN HANDLE hDevice,
169                 IN DWORD dwPositionType,
170                 IN LPDWORD lpdwPartition,
171                 IN LPDWORD lpdwOffsetLow,
172                 IN LPDWORD lpdwOffsetHigh)
173 {
174     TAPE_GET_POSITION TapeGetPosition;
175     DWORD Result;
176 
177     TapeGetPosition.Type = dwPositionType;
178     Result = BasepDoTapeOperation(hDevice,
179                                   IOCTL_TAPE_GET_POSITION,
180                                   &TapeGetPosition,
181                                   sizeof(TapeGetPosition),
182                                   &TapeGetPosition,
183                                   sizeof(TapeGetPosition));
184 
185     if (Result)
186     {
187         *lpdwPartition = 0;
188         *lpdwOffsetLow = 0;
189         *lpdwOffsetHigh = 0;
190     }
191     else
192     {
193         *lpdwPartition = TapeGetPosition.Partition;
194         *lpdwOffsetLow = TapeGetPosition.Offset.u.LowPart;
195         *lpdwOffsetHigh = TapeGetPosition.Offset.u.HighPart;
196     }
197 
198     return Result;
199 }
200 
201 /*
202  * @implemented
203  */
204 DWORD
205 WINAPI
206 GetTapeStatus(IN HANDLE hDevice)
207 {
208     return BasepDoTapeOperation(hDevice,
209                                 IOCTL_TAPE_GET_STATUS,
210                                 NULL,
211                                 0,
212                                 NULL,
213                                 0);
214 }
215 
216 /*
217  * @implemented
218  */
219 DWORD
220 WINAPI
221 PrepareTape(IN HANDLE hDevice,
222             IN DWORD dwOperation,
223             IN BOOL bImmediate)
224 {
225     TAPE_PREPARE TapePrepare;
226 
227     TapePrepare.Operation = dwOperation;
228     TapePrepare.Immediate = (BOOLEAN)bImmediate;
229     return BasepDoTapeOperation(hDevice,
230                                 IOCTL_TAPE_PREPARE,
231                                 &TapePrepare,
232                                 sizeof(TapePrepare),
233                                 NULL,
234                                 0);
235 }
236 
237 /*
238  * @implemented
239  */
240 DWORD
241 WINAPI
242 SetTapeParameters(IN HANDLE hDevice,
243                   IN DWORD dwOperation,
244                   IN LPVOID lpTapeInformation)
245 {
246     if (dwOperation == SET_TAPE_MEDIA_INFORMATION)
247     {
248         return BasepDoTapeOperation(hDevice,
249                                     IOCTL_TAPE_SET_MEDIA_PARAMS,
250                                     lpTapeInformation,
251                                     sizeof(TAPE_SET_MEDIA_PARAMETERS),
252                                     NULL,
253                                     0);
254     }
255     else if (dwOperation == SET_TAPE_DRIVE_INFORMATION)
256     {
257         return BasepDoTapeOperation(hDevice,
258                                     IOCTL_TAPE_SET_DRIVE_PARAMS,
259                                     lpTapeInformation,
260                                     sizeof(TAPE_SET_DRIVE_PARAMETERS),
261                                     NULL,
262                                     0);
263     }
264 
265     return ERROR_INVALID_FUNCTION;
266 }
267 
268 /*
269  * @implemented
270  */
271 DWORD
272 WINAPI
273 SetTapePosition(IN HANDLE hDevice,
274                 IN DWORD dwPositionMethod,
275                 IN DWORD dwPartition,
276                 IN DWORD dwOffsetLow,
277                 IN DWORD dwOffsetHigh,
278                 IN BOOL bImmediate)
279 {
280     TAPE_SET_POSITION TapeSetPosition;
281 
282     TapeSetPosition.Method = dwPositionMethod;
283     TapeSetPosition.Partition = dwPartition;
284     TapeSetPosition.Offset.u.LowPart = dwOffsetLow;
285     TapeSetPosition.Offset.u.HighPart = dwOffsetHigh;
286     TapeSetPosition.Immediate = (BOOLEAN)bImmediate;
287     return BasepDoTapeOperation(hDevice,
288                                 IOCTL_TAPE_SET_POSITION,
289                                 &TapeSetPosition,
290                                 sizeof(TapeSetPosition),
291                                 NULL,
292                                 0);
293 }
294 
295 /*
296  * @implemented
297  */
298 DWORD
299 WINAPI
300 WriteTapemark(IN HANDLE hDevice,
301               IN DWORD dwTapemarkType,
302               IN DWORD dwTapemarkCount,
303               IN BOOL bImmediate)
304 {
305     TAPE_WRITE_MARKS TapeWriteMarks;
306 
307     TapeWriteMarks.Type = dwTapemarkType;
308     TapeWriteMarks.Count = dwTapemarkCount;
309     TapeWriteMarks.Immediate = (BOOLEAN)bImmediate;
310     return BasepDoTapeOperation(hDevice,
311                                 IOCTL_TAPE_WRITE_MARKS,
312                                 &TapeWriteMarks,
313                                 sizeof(TapeWriteMarks),
314                                 NULL,
315                                 0);
316 }
317 
318 /* EOF */
319