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)
11 /* INCLUDES *******************************************************************/
17 /* PRIVATE FUNCTIONS **********************************************************/
21 BasepDoTapeOperation(IN HANDLE DeviceHandle
,
26 IN ULONG OutputLength
)
31 IO_STATUS_BLOCK IoStatusBlock
;
33 /* Create the wait event */
34 TapeEvent
= CreateEvent(NULL
, FALSE
, FALSE
, NULL
);
35 if (!TapeEvent
) return GetLastError();
38 Status
= NtDeviceIoControlFile(DeviceHandle
,
48 if (Status
== STATUS_PENDING
)
50 /* Wait for its completion */
51 WaitForSingleObject(TapeEvent
, INFINITE
);
52 Status
= IoStatusBlock
.Status
;
55 /* Get rid of the wait event and check status */
56 CloseHandle(TapeEvent
);
57 if (!NT_SUCCESS(Status
))
59 /* Convert to Win32 */
60 BaseSetLastNTError(Status
);
61 ErrorCode
= GetLastError();
66 ErrorCode
= ERROR_SUCCESS
;
69 /* Return the Win32 error code */
73 /* PUBLIC FUNCTIONS ***********************************************************/
80 CreateTapePartition(IN HANDLE hDevice
,
81 IN DWORD dwPartitionMethod
,
85 TAPE_CREATE_PARTITION TapeCreatePartition
;
87 TapeCreatePartition
.Method
= dwPartitionMethod
;
88 TapeCreatePartition
.Count
= dwCount
;
89 TapeCreatePartition
.Size
= dwSize
;
90 return BasepDoTapeOperation(hDevice
,
91 IOCTL_TAPE_CREATE_PARTITION
,
93 sizeof(TapeCreatePartition
),
103 EraseTape(IN HANDLE hDevice
,
104 IN DWORD dwEraseType
,
107 TAPE_ERASE TapeErase
;
109 TapeErase
.Type
= dwEraseType
;
110 TapeErase
.Immediate
= (BOOLEAN
)bImmediate
;
111 return BasepDoTapeOperation(hDevice
,
124 GetTapeParameters(IN HANDLE hDevice
,
125 IN DWORD dwOperation
,
127 IN LPVOID lpTapeInformation
)
129 if (dwOperation
== GET_TAPE_MEDIA_INFORMATION
)
131 if (*lpdwSize
< sizeof(TAPE_GET_MEDIA_PARAMETERS
))
133 *lpdwSize
= sizeof(TAPE_GET_MEDIA_PARAMETERS
);
134 return ERROR_MORE_DATA
;
137 return BasepDoTapeOperation(hDevice
,
138 IOCTL_TAPE_GET_MEDIA_PARAMS
,
142 sizeof(TAPE_GET_MEDIA_PARAMETERS
));
144 else if (dwOperation
== GET_TAPE_DRIVE_INFORMATION
)
146 if (*lpdwSize
< sizeof(TAPE_GET_DRIVE_PARAMETERS
))
148 *lpdwSize
= sizeof(TAPE_GET_DRIVE_PARAMETERS
);
149 return ERROR_MORE_DATA
;
152 return BasepDoTapeOperation(hDevice
,
153 IOCTL_TAPE_GET_DRIVE_PARAMS
,
157 sizeof(TAPE_GET_DRIVE_PARAMETERS
));
160 return ERROR_INVALID_FUNCTION
;
168 GetTapePosition(IN HANDLE hDevice
,
169 IN DWORD dwPositionType
,
170 IN LPDWORD lpdwPartition
,
171 IN LPDWORD lpdwOffsetLow
,
172 IN LPDWORD lpdwOffsetHigh
)
174 TAPE_GET_POSITION TapeGetPosition
;
177 TapeGetPosition
.Type
= dwPositionType
;
178 Result
= BasepDoTapeOperation(hDevice
,
179 IOCTL_TAPE_GET_POSITION
,
181 sizeof(TapeGetPosition
),
183 sizeof(TapeGetPosition
));
193 *lpdwPartition
= TapeGetPosition
.Partition
;
194 *lpdwOffsetLow
= TapeGetPosition
.Offset
.u
.LowPart
;
195 *lpdwOffsetHigh
= TapeGetPosition
.Offset
.u
.HighPart
;
206 GetTapeStatus(IN HANDLE hDevice
)
208 return BasepDoTapeOperation(hDevice
,
209 IOCTL_TAPE_GET_STATUS
,
221 PrepareTape(IN HANDLE hDevice
,
222 IN DWORD dwOperation
,
225 TAPE_PREPARE TapePrepare
;
227 TapePrepare
.Operation
= dwOperation
;
228 TapePrepare
.Immediate
= (BOOLEAN
)bImmediate
;
229 return BasepDoTapeOperation(hDevice
,
242 SetTapeParameters(IN HANDLE hDevice
,
243 IN DWORD dwOperation
,
244 IN LPVOID lpTapeInformation
)
246 if (dwOperation
== SET_TAPE_MEDIA_INFORMATION
)
248 return BasepDoTapeOperation(hDevice
,
249 IOCTL_TAPE_SET_MEDIA_PARAMS
,
251 sizeof(TAPE_SET_MEDIA_PARAMETERS
),
255 else if (dwOperation
== SET_TAPE_DRIVE_INFORMATION
)
257 return BasepDoTapeOperation(hDevice
,
258 IOCTL_TAPE_SET_DRIVE_PARAMS
,
260 sizeof(TAPE_SET_DRIVE_PARAMETERS
),
265 return ERROR_INVALID_FUNCTION
;
273 SetTapePosition(IN HANDLE hDevice
,
274 IN DWORD dwPositionMethod
,
275 IN DWORD dwPartition
,
276 IN DWORD dwOffsetLow
,
277 IN DWORD dwOffsetHigh
,
280 TAPE_SET_POSITION TapeSetPosition
;
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
,
290 sizeof(TapeSetPosition
),
300 WriteTapemark(IN HANDLE hDevice
,
301 IN DWORD dwTapemarkType
,
302 IN DWORD dwTapemarkCount
,
305 TAPE_WRITE_MARKS TapeWriteMarks
;
307 TapeWriteMarks
.Type
= dwTapemarkType
;
308 TapeWriteMarks
.Count
= dwTapemarkCount
;
309 TapeWriteMarks
.Immediate
= (BOOLEAN
)bImmediate
;
310 return BasepDoTapeOperation(hDevice
,
311 IOCTL_TAPE_WRITE_MARKS
,
313 sizeof(TapeWriteMarks
),