2 * Tape handling functions
4 * Copyright 1999 Chris Morgan <cmorgan@wpi.edu>
5 * James Abbatiello <abbeyj@wpi.edu>
6 * Copyright 2006 Hans Leidekker
8 * This library is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU Lesser General Public
10 * License as published by the Free Software Foundation; either
11 * version 2.1 of the License, or (at your option) any later version.
13 * This library is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 * Lesser General Public License for more details.
18 * You should have received a copy of the GNU Lesser General Public
19 * License along with this library; if not, write to the Free Software
20 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
26 #define WIN32_NO_STATUS
32 #include "ddk/ntddtape.h"
34 #include "wine/debug.h"
36 WINE_DEFAULT_DEBUG_CHANNEL(tape);
38 static DWORD set_error_from_status( NTSTATUS status )
40 DWORD error = RtlNtStatusToDosError( status );
42 SetLastError( error );
46 /************************************************************************
47 * BackupRead (KERNEL32.@)
49 * Backup a file or directory.
51 BOOL WINAPI BackupRead( HANDLE file, LPBYTE buffer, DWORD to_read,
52 LPDWORD read, BOOL abort, BOOL security, LPVOID *context )
54 FIXME( "(%p, %p, %d, %p, %d, %d, %p)\n", file, buffer,
55 to_read, read, abort, security, context );
56 SetLastError( ERROR_NOT_SUPPORTED );
61 /************************************************************************
62 * BackupSeek (KERNEL32.@)
64 * Seek forward in a backup stream.
66 BOOL WINAPI BackupSeek( HANDLE file, DWORD seek_low, DWORD seek_high,
67 LPDWORD seeked_low, LPDWORD seeked_high, LPVOID *context )
69 FIXME( "(%p, %d, %d, %p, %p, %p)\n", file, seek_low,
70 seek_high, seeked_low, seeked_high, context );
71 SetLastError( ERROR_NOT_SUPPORTED );
76 /************************************************************************
77 * BackupWrite (KERNEL32.@)
79 * Restore a file or directory.
81 BOOL WINAPI BackupWrite( HANDLE file, LPBYTE buffer, DWORD to_write,
82 LPDWORD written, BOOL abort, BOOL security, LPVOID *context )
84 FIXME( "(%p, %p, %d, %p, %d, %d, %p)\n", file, buffer,
85 to_write, written, abort, security, context );
86 SetLastError( ERROR_NOT_SUPPORTED );
91 /************************************************************************
92 * CreateTapePartition (KERNEL32.@)
96 DWORD WINAPI CreateTapePartition( HANDLE device, DWORD method,
97 DWORD count, DWORD size )
100 TAPE_CREATE_PARTITION part;
103 TRACE( "(%p, %d, %d, %d)\n", device, method, count, size );
105 part.Method = method;
109 status = NtDeviceIoControlFile( device, NULL, NULL, NULL, &io,
110 IOCTL_TAPE_CREATE_PARTITION, &part, sizeof(TAPE_CREATE_PARTITION), NULL, 0 );
112 return set_error_from_status( status );
116 /************************************************************************
117 * EraseTape (KERNEL32.@)
121 DWORD WINAPI EraseTape( HANDLE device, DWORD type, BOOL immediate )
127 TRACE( "(%p, %d, %d)\n", device, type, immediate );
130 erase.Immediate = immediate;
132 status = NtDeviceIoControlFile( device, NULL, NULL, NULL, &io,
133 IOCTL_TAPE_ERASE, &erase, sizeof(TAPE_ERASE), NULL, 0 );
135 return set_error_from_status( status );
139 /************************************************************************
140 * GetTapeParameters (KERNEL32.@)
142 * Retrieve information about a tape or tape drive.
144 DWORD WINAPI GetTapeParameters( HANDLE device, DWORD operation,
145 LPDWORD size, LPVOID info )
147 NTSTATUS status = STATUS_INVALID_PARAMETER;
150 TRACE( "(%p, %d, %p, %p)\n", device, operation, size, info );
154 case GET_TAPE_DRIVE_INFORMATION:
155 status = NtDeviceIoControlFile( device, NULL, NULL, NULL, &io,
156 IOCTL_TAPE_GET_DRIVE_PARAMS, NULL, 0, info, *size );
158 case GET_TAPE_MEDIA_INFORMATION:
159 status = NtDeviceIoControlFile( device, NULL, NULL, NULL, &io,
160 IOCTL_TAPE_GET_MEDIA_PARAMS, NULL, 0, info, *size );
163 ERR( "Unhandled operation: 0x%08x\n", operation );
166 return set_error_from_status( status );
170 /************************************************************************
171 * GetTapePosition (KERNEL32.@)
173 * Retrieve the current tape position.
175 DWORD WINAPI GetTapePosition( HANDLE device, DWORD type, LPDWORD partition,
176 LPDWORD offset_low, LPDWORD offset_high )
179 TAPE_GET_POSITION in, out;
182 TRACE( "(%p, %d, %p, %p, %p)\n", device, type, partition, offset_low,
185 memset( &in, 0, sizeof(TAPE_GET_POSITION) );
188 status = NtDeviceIoControlFile( device, NULL, NULL, NULL, &io,
189 IOCTL_TAPE_GET_POSITION, &in, sizeof(TAPE_GET_POSITION),
190 &out, sizeof(TAPE_GET_POSITION) );
192 if (status != STATUS_SUCCESS)
193 return set_error_from_status( status );
195 *partition = out.Partition;
196 *offset_low = out.OffsetLow;
197 *offset_high = out.OffsetHigh;
199 return set_error_from_status( status );
203 /************************************************************************
204 * GetTapeStatus (KERNEL32.@)
206 * Determine if the tape device is ready for operation.
208 DWORD WINAPI GetTapeStatus( HANDLE device )
213 TRACE( "(%p)\n", device );
215 status = NtDeviceIoControlFile( device, NULL, NULL, NULL, &io,
216 IOCTL_TAPE_GET_STATUS, NULL, 0, NULL, 0 );
218 return set_error_from_status( status );
222 /************************************************************************
223 * PrepareTape (KERNEL32.@)
225 * Prepare a tape for operation.
227 DWORD WINAPI PrepareTape( HANDLE device, DWORD operation, BOOL immediate )
233 TRACE( "(%p, %d, %d)\n", device, operation, immediate );
235 prep.Operation = operation;
236 prep.Immediate = immediate;
238 status = NtDeviceIoControlFile( device, NULL, NULL, NULL, &io,
239 IOCTL_TAPE_PREPARE, &prep, sizeof(TAPE_PREPARE), NULL, 0 );
241 return set_error_from_status( status );
245 /************************************************************************
246 * SetTapeParameters (KERNEL32.@)
248 * Configure a tape or tape device.
250 DWORD WINAPI SetTapeParameters( HANDLE device, DWORD operation, LPVOID info )
252 NTSTATUS status = STATUS_INVALID_PARAMETER;
255 TRACE( "(%p, %d, %p)\n", device, operation, info );
259 case SET_TAPE_DRIVE_INFORMATION:
260 status = NtDeviceIoControlFile( device, NULL, NULL, NULL, &io,
261 IOCTL_TAPE_SET_DRIVE_PARAMS, info, sizeof(TAPE_SET_DRIVE_PARAMETERS),
264 case SET_TAPE_MEDIA_INFORMATION:
265 status = NtDeviceIoControlFile( device, NULL, NULL, NULL, &io,
266 IOCTL_TAPE_SET_MEDIA_PARAMS, info, sizeof(TAPE_SET_MEDIA_PARAMETERS),
270 ERR( "Unhandled operation: 0x%08x\n", operation );
273 return set_error_from_status( status );
277 /************************************************************************
278 * SetTapePosition (KERNEL32.@)
280 * Set the tape position on a given device.
282 DWORD WINAPI SetTapePosition( HANDLE device, DWORD method, DWORD partition,
283 DWORD offset_low, DWORD offset_high, BOOL immediate )
286 TAPE_SET_POSITION pos;
289 TRACE( "(%p, %d, %d, %d, %d, %d)\n", device, method, partition,
290 offset_low, offset_high, immediate );
293 pos.Partition = partition;
294 pos.Offset.u.LowPart = offset_low;
295 pos.Offset.u.HighPart = offset_high;
296 pos.Immediate = immediate;
298 status = NtDeviceIoControlFile( device, NULL, NULL, NULL, &io,
299 IOCTL_TAPE_SET_POSITION, &pos, sizeof(TAPE_SET_POSITION), NULL, 0 );
301 return set_error_from_status( status );
305 /************************************************************************
306 * WriteTapemark (KERNEL32.@)
308 * Write tapemarks on a tape.
310 DWORD WINAPI WriteTapemark( HANDLE device, DWORD type, DWORD count,
314 TAPE_WRITE_MARKS marks;
317 TRACE( "(%p, %d, %d, %d)\n", device, type, count, immediate );
321 marks.Immediate = immediate;
323 status = NtDeviceIoControlFile( device, NULL, NULL, NULL, &io,
324 IOCTL_TAPE_WRITE_MARKS, &marks, sizeof(TAPE_WRITE_MARKS), NULL, 0 );
326 return set_error_from_status( status );