3 * COPYRIGHT: See COPYING in the top level directory
4 * PROJECT: ReactOS system libraries
5 * FILE: lib/kernel32/file/tape.c
6 * PURPOSE: Tape functions
7 * PROGRAMMER: Ariadne ( ariadne@xs4all.nl)
12 /* INCLUDES *****************************************************************/
17 #include "../include/debug.h"
19 /* FUNCTIONS ****************************************************************/
25 CreateTapePartition (HANDLE hDevice
,
26 DWORD dwPartitionMethod
,
30 TAPE_CREATE_PARTITION TapeCreatePartition
;
31 IO_STATUS_BLOCK IoStatusBlock
;
35 TapeCreatePartition
.Method
= dwPartitionMethod
;
36 TapeCreatePartition
.Count
= dwCount
;
37 TapeCreatePartition
.Size
= dwSize
;
39 Status
= NtDeviceIoControlFile (hDevice
,
44 IOCTL_TAPE_CREATE_PARTITION
,
46 sizeof(TAPE_CREATE_PARTITION
),
49 if (!NT_SUCCESS(Status
))
51 ErrorCode
= RtlNtStatusToDosError(Status
);
52 SetLastError (ErrorCode
);
64 EraseTape (HANDLE hDevice
,
69 IO_STATUS_BLOCK IoStatusBlock
;
73 TapeErase
.Type
= dwEraseType
;
74 TapeErase
.Immediate
= (BOOLEAN
)bImmediate
;
76 Status
= NtDeviceIoControlFile (hDevice
,
86 if (!NT_SUCCESS(Status
))
88 ErrorCode
= RtlNtStatusToDosError(Status
);
89 SetLastError (ErrorCode
);
101 GetTapeParameters (HANDLE hDevice
,
104 LPVOID lpTapeInformation
)
106 IO_STATUS_BLOCK IoStatusBlock
;
110 if (dwOperation
== GET_TAPE_MEDIA_INFORMATION
)
112 if (*lpdwSize
< sizeof(TAPE_GET_MEDIA_PARAMETERS
))
114 *lpdwSize
= sizeof(TAPE_GET_MEDIA_PARAMETERS
);
115 return ERROR_MORE_DATA
;
118 Status
= NtDeviceIoControlFile (hDevice
,
123 IOCTL_TAPE_GET_MEDIA_PARAMS
,
127 sizeof(TAPE_GET_MEDIA_PARAMETERS
));
129 else if (dwOperation
== GET_TAPE_DRIVE_INFORMATION
)
131 if (*lpdwSize
< sizeof(TAPE_GET_DRIVE_PARAMETERS
))
133 *lpdwSize
= sizeof(TAPE_GET_DRIVE_PARAMETERS
);
134 return ERROR_MORE_DATA
;
137 Status
= NtDeviceIoControlFile (hDevice
,
142 IOCTL_TAPE_GET_DRIVE_PARAMS
,
146 sizeof(TAPE_GET_DRIVE_PARAMETERS
));
150 return ERROR_INVALID_FUNCTION
;
153 if (!NT_SUCCESS(Status
))
155 ErrorCode
= RtlNtStatusToDosError(Status
);
156 SetLastError (ErrorCode
);
160 return ERROR_SUCCESS
;
168 GetTapePosition (HANDLE hDevice
,
169 DWORD dwPositionType
,
170 LPDWORD lpdwPartition
,
171 LPDWORD lpdwOffsetLow
,
172 LPDWORD lpdwOffsetHigh
)
174 TAPE_GET_POSITION TapeGetPosition
;
175 IO_STATUS_BLOCK IoStatusBlock
;
179 TapeGetPosition
.Type
= dwPositionType
;
181 Status
= NtDeviceIoControlFile (hDevice
,
186 IOCTL_TAPE_GET_POSITION
,
188 sizeof(TAPE_GET_POSITION
),
190 sizeof(TAPE_GET_POSITION
));
191 if (!NT_SUCCESS(Status
))
197 ErrorCode
= RtlNtStatusToDosError(Status
);
198 SetLastError (ErrorCode
);
202 *lpdwPartition
= TapeGetPosition
.Partition
;
203 *lpdwOffsetLow
= TapeGetPosition
.Offset
.u
.LowPart
;
204 *lpdwOffsetHigh
= TapeGetPosition
.Offset
.u
.HighPart
;
206 return ERROR_SUCCESS
;
214 GetTapeStatus (HANDLE hDevice
)
216 IO_STATUS_BLOCK IoStatusBlock
;
220 Status
= NtDeviceIoControlFile (hDevice
,
225 IOCTL_TAPE_GET_STATUS
,
230 if (!NT_SUCCESS(Status
))
232 ErrorCode
= RtlNtStatusToDosError(Status
);
233 SetLastError (ErrorCode
);
237 return ERROR_SUCCESS
;
245 PrepareTape (HANDLE hDevice
,
249 TAPE_PREPARE TapePrepare
;
250 IO_STATUS_BLOCK IoStatusBlock
;
254 TapePrepare
.Operation
= dwOperation
;
255 TapePrepare
.Immediate
= (BOOLEAN
)bImmediate
;
257 Status
= NtDeviceIoControlFile (hDevice
,
264 sizeof(TAPE_PREPARE
),
267 if (!NT_SUCCESS(Status
))
269 ErrorCode
= RtlNtStatusToDosError(Status
);
270 SetLastError (ErrorCode
);
274 return ERROR_SUCCESS
;
282 SetTapeParameters (HANDLE hDevice
,
284 LPVOID lpTapeInformation
)
286 IO_STATUS_BLOCK IoStatusBlock
;
290 if (dwOperation
== SET_TAPE_MEDIA_INFORMATION
)
292 Status
= NtDeviceIoControlFile (hDevice
,
297 IOCTL_TAPE_SET_MEDIA_PARAMS
,
299 sizeof(TAPE_SET_MEDIA_PARAMETERS
),
303 else if (dwOperation
== SET_TAPE_DRIVE_INFORMATION
)
305 Status
= NtDeviceIoControlFile (hDevice
,
310 IOCTL_TAPE_SET_DRIVE_PARAMS
,
312 sizeof(TAPE_SET_DRIVE_PARAMETERS
),
318 return ERROR_INVALID_FUNCTION
;
321 if (!NT_SUCCESS(Status
))
323 ErrorCode
= RtlNtStatusToDosError(Status
);
324 SetLastError (ErrorCode
);
328 return ERROR_SUCCESS
;
336 SetTapePosition (HANDLE hDevice
,
337 DWORD dwPositionMethod
,
343 TAPE_SET_POSITION TapeSetPosition
;
344 IO_STATUS_BLOCK IoStatusBlock
;
348 TapeSetPosition
.Method
= dwPositionMethod
;
349 TapeSetPosition
.Partition
= dwPartition
;
350 TapeSetPosition
.Offset
.u
.LowPart
= dwOffsetLow
;
351 TapeSetPosition
.Offset
.u
.HighPart
= dwOffsetHigh
;
352 TapeSetPosition
.Immediate
= (BOOLEAN
)bImmediate
;
354 Status
= NtDeviceIoControlFile (hDevice
,
359 IOCTL_TAPE_SET_POSITION
,
361 sizeof(TAPE_SET_POSITION
),
364 if (!NT_SUCCESS(Status
))
366 ErrorCode
= RtlNtStatusToDosError(Status
);
367 SetLastError (ErrorCode
);
371 return ERROR_SUCCESS
;
379 WriteTapemark (HANDLE hDevice
,
380 DWORD dwTapemarkType
,
381 DWORD dwTapemarkCount
,
384 TAPE_WRITE_MARKS TapeWriteMarks
;
385 IO_STATUS_BLOCK IoStatusBlock
;
389 TapeWriteMarks
.Type
= dwTapemarkType
;
390 TapeWriteMarks
.Count
= dwTapemarkCount
;
391 TapeWriteMarks
.Immediate
= (BOOLEAN
)bImmediate
;
393 Status
= NtDeviceIoControlFile (hDevice
,
398 IOCTL_TAPE_WRITE_MARKS
,
400 sizeof(TAPE_WRITE_MARKS
),
403 if (!NT_SUCCESS(Status
))
405 ErrorCode
= RtlNtStatusToDosError(Status
);
406 SetLastError (ErrorCode
);
410 return ERROR_SUCCESS
;