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
);