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 *****************************************************************/
18 /* FUNCTIONS ****************************************************************/
24 CreateTapePartition (HANDLE hDevice
,
25 DWORD dwPartitionMethod
,
29 TAPE_CREATE_PARTITION TapeCreatePartition
;
30 IO_STATUS_BLOCK IoStatusBlock
;
34 TapeCreatePartition
.Method
= dwPartitionMethod
;
35 TapeCreatePartition
.Count
= dwCount
;
36 TapeCreatePartition
.Size
= dwSize
;
38 Status
= NtDeviceIoControlFile (hDevice
,
43 IOCTL_TAPE_CREATE_PARTITION
,
45 sizeof(TAPE_CREATE_PARTITION
),
48 if (!NT_SUCCESS(Status
))
50 ErrorCode
= RtlNtStatusToDosError(Status
);
51 SetLastError (ErrorCode
);
63 EraseTape (HANDLE hDevice
,
68 IO_STATUS_BLOCK IoStatusBlock
;
72 TapeErase
.Type
= dwEraseType
;
73 TapeErase
.Immediate
= (BOOLEAN
)bImmediate
;
75 Status
= NtDeviceIoControlFile (hDevice
,
85 if (!NT_SUCCESS(Status
))
87 ErrorCode
= RtlNtStatusToDosError(Status
);
88 SetLastError (ErrorCode
);
100 GetTapeParameters (HANDLE hDevice
,
103 LPVOID lpTapeInformation
)
105 IO_STATUS_BLOCK IoStatusBlock
;
109 if (dwOperation
== GET_TAPE_MEDIA_INFORMATION
)
111 if (*lpdwSize
< sizeof(TAPE_GET_MEDIA_PARAMETERS
))
113 *lpdwSize
= sizeof(TAPE_GET_MEDIA_PARAMETERS
);
114 return ERROR_MORE_DATA
;
117 Status
= NtDeviceIoControlFile (hDevice
,
122 IOCTL_TAPE_GET_MEDIA_PARAMS
,
126 sizeof(TAPE_GET_MEDIA_PARAMETERS
));
128 else if (dwOperation
== GET_TAPE_DRIVE_INFORMATION
)
130 if (*lpdwSize
< sizeof(TAPE_GET_DRIVE_PARAMETERS
))
132 *lpdwSize
= sizeof(TAPE_GET_DRIVE_PARAMETERS
);
133 return ERROR_MORE_DATA
;
136 Status
= NtDeviceIoControlFile (hDevice
,
141 IOCTL_TAPE_GET_DRIVE_PARAMS
,
145 sizeof(TAPE_GET_DRIVE_PARAMETERS
));
149 return ERROR_INVALID_FUNCTION
;
152 if (!NT_SUCCESS(Status
))
154 ErrorCode
= RtlNtStatusToDosError(Status
);
155 SetLastError (ErrorCode
);
159 return ERROR_SUCCESS
;
167 GetTapePosition (HANDLE hDevice
,
168 DWORD dwPositionType
,
169 LPDWORD lpdwPartition
,
170 LPDWORD lpdwOffsetLow
,
171 LPDWORD lpdwOffsetHigh
)
173 TAPE_GET_POSITION TapeGetPosition
;
174 IO_STATUS_BLOCK IoStatusBlock
;
178 TapeGetPosition
.Type
= dwPositionType
;
180 Status
= NtDeviceIoControlFile (hDevice
,
185 IOCTL_TAPE_GET_POSITION
,
187 sizeof(TAPE_GET_POSITION
),
189 sizeof(TAPE_GET_POSITION
));
190 if (!NT_SUCCESS(Status
))
196 ErrorCode
= RtlNtStatusToDosError(Status
);
197 SetLastError (ErrorCode
);
201 *lpdwPartition
= TapeGetPosition
.Partition
;
202 *lpdwOffsetLow
= TapeGetPosition
.Offset
.u
.LowPart
;
203 *lpdwOffsetHigh
= TapeGetPosition
.Offset
.u
.HighPart
;
205 return ERROR_SUCCESS
;
213 GetTapeStatus (HANDLE hDevice
)
215 IO_STATUS_BLOCK IoStatusBlock
;
219 Status
= NtDeviceIoControlFile (hDevice
,
224 IOCTL_TAPE_GET_STATUS
,
229 if (!NT_SUCCESS(Status
))
231 ErrorCode
= RtlNtStatusToDosError(Status
);
232 SetLastError (ErrorCode
);
236 return ERROR_SUCCESS
;
244 PrepareTape (HANDLE hDevice
,
248 TAPE_PREPARE TapePrepare
;
249 IO_STATUS_BLOCK IoStatusBlock
;
253 TapePrepare
.Operation
= dwOperation
;
254 TapePrepare
.Immediate
= (BOOLEAN
)bImmediate
;
256 Status
= NtDeviceIoControlFile (hDevice
,
263 sizeof(TAPE_PREPARE
),
266 if (!NT_SUCCESS(Status
))
268 ErrorCode
= RtlNtStatusToDosError(Status
);
269 SetLastError (ErrorCode
);
273 return ERROR_SUCCESS
;
281 SetTapeParameters (HANDLE hDevice
,
283 LPVOID lpTapeInformation
)
285 IO_STATUS_BLOCK IoStatusBlock
;
289 if (dwOperation
== SET_TAPE_MEDIA_INFORMATION
)
291 Status
= NtDeviceIoControlFile (hDevice
,
296 IOCTL_TAPE_SET_MEDIA_PARAMS
,
298 sizeof(TAPE_SET_MEDIA_PARAMETERS
),
302 else if (dwOperation
== SET_TAPE_DRIVE_INFORMATION
)
304 Status
= NtDeviceIoControlFile (hDevice
,
309 IOCTL_TAPE_SET_DRIVE_PARAMS
,
311 sizeof(TAPE_SET_DRIVE_PARAMETERS
),
317 return ERROR_INVALID_FUNCTION
;
320 if (!NT_SUCCESS(Status
))
322 ErrorCode
= RtlNtStatusToDosError(Status
);
323 SetLastError (ErrorCode
);
327 return ERROR_SUCCESS
;
335 SetTapePosition (HANDLE hDevice
,
336 DWORD dwPositionMethod
,
342 TAPE_SET_POSITION TapeSetPosition
;
343 IO_STATUS_BLOCK IoStatusBlock
;
347 TapeSetPosition
.Method
= dwPositionMethod
;
348 TapeSetPosition
.Partition
= dwPartition
;
349 TapeSetPosition
.Offset
.u
.LowPart
= dwOffsetLow
;
350 TapeSetPosition
.Offset
.u
.HighPart
= dwOffsetHigh
;
351 TapeSetPosition
.Immediate
= (BOOLEAN
)bImmediate
;
353 Status
= NtDeviceIoControlFile (hDevice
,
358 IOCTL_TAPE_SET_POSITION
,
360 sizeof(TAPE_SET_POSITION
),
363 if (!NT_SUCCESS(Status
))
365 ErrorCode
= RtlNtStatusToDosError(Status
);
366 SetLastError (ErrorCode
);
370 return ERROR_SUCCESS
;
378 WriteTapemark (HANDLE hDevice
,
379 DWORD dwTapemarkType
,
380 DWORD dwTapemarkCount
,
383 TAPE_WRITE_MARKS TapeWriteMarks
;
384 IO_STATUS_BLOCK IoStatusBlock
;
388 TapeWriteMarks
.Type
= dwTapemarkType
;
389 TapeWriteMarks
.Count
= dwTapemarkCount
;
390 TapeWriteMarks
.Immediate
= (BOOLEAN
)bImmediate
;
392 Status
= NtDeviceIoControlFile (hDevice
,
397 IOCTL_TAPE_WRITE_MARKS
,
399 sizeof(TAPE_WRITE_MARKS
),
402 if (!NT_SUCCESS(Status
))
404 ErrorCode
= RtlNtStatusToDosError(Status
);
405 SetLastError (ErrorCode
);
409 return ERROR_SUCCESS
;