Home | Info | Community | Development | myReactOS | Contact Us
ReactOS Development > Doxygentape.c
Go to the documentation of this file.
00001 /* $Id: tape.c 54334 2011-11-07 07:41:52Z ion $ 00002 * 00003 * COPYRIGHT: See COPYING in the top level directory 00004 * PROJECT: ReactOS system libraries 00005 * FILE: lib/kernel32/file/tape.c 00006 * PURPOSE: Tape functions 00007 * PROGRAMMER: Ariadne ( ariadne@xs4all.nl) 00008 * UPDATE HISTORY: 00009 * Created 01/11/98 00010 */ 00011 00012 /* INCLUDES *******************************************************************/ 00013 00014 #include <k32.h> 00015 #define NDEBUG 00016 #include <debug.h> 00017 00018 /* PRIVATE FUNCTIONS **********************************************************/ 00019 00020 DWORD 00021 WINAPI 00022 BasepDoTapeOperation(IN HANDLE DeviceHandle, 00023 IN ULONG Ioctl, 00024 IN PVOID Input, 00025 IN ULONG InputLength, 00026 IN PVOID Output, 00027 IN ULONG OutputLength) 00028 { 00029 HANDLE TapeEvent; 00030 DWORD ErrorCode; 00031 NTSTATUS Status; 00032 IO_STATUS_BLOCK IoStatusBlock; 00033 00034 /* Create the wait event */ 00035 TapeEvent = CreateEvent(NULL, FALSE, FALSE, NULL); 00036 if (!TapeEvent) return GetLastError(); 00037 00038 /* Send the IOCTL */ 00039 Status = NtDeviceIoControlFile(DeviceHandle, 00040 TapeEvent, 00041 0, 00042 0, 00043 &IoStatusBlock, 00044 Ioctl, 00045 Input, 00046 InputLength, 00047 Output, 00048 OutputLength); 00049 if (Status == STATUS_PENDING) 00050 { 00051 /* Wait for its completion */ 00052 WaitForSingleObject(TapeEvent, INFINITE); 00053 Status = IoStatusBlock.Status; 00054 } 00055 00056 /* Get rid of the wait event and check status */ 00057 CloseHandle(TapeEvent); 00058 if (!NT_SUCCESS(Status)) 00059 { 00060 /* Convert to Win32 */ 00061 BaseSetLastNTError(Status); 00062 ErrorCode = GetLastError(); 00063 } 00064 else 00065 { 00066 /* Set sucess */ 00067 ErrorCode = ERROR_SUCCESS; 00068 } 00069 00070 /* Return the Win32 error code */ 00071 return ErrorCode; 00072 } 00073 00074 /* PUBLIC FUNCTIONS ***********************************************************/ 00075 00076 /* 00077 * @implemented 00078 */ 00079 DWORD 00080 WINAPI 00081 CreateTapePartition(IN HANDLE hDevice, 00082 IN DWORD dwPartitionMethod, 00083 IN DWORD dwCount, 00084 IN DWORD dwSize) 00085 { 00086 TAPE_CREATE_PARTITION TapeCreatePartition; 00087 00088 TapeCreatePartition.Method = dwPartitionMethod; 00089 TapeCreatePartition.Count = dwCount; 00090 TapeCreatePartition.Size = dwSize; 00091 return BasepDoTapeOperation(hDevice, 00092 IOCTL_TAPE_CREATE_PARTITION, 00093 &TapeCreatePartition, 00094 sizeof(TapeCreatePartition), 00095 NULL, 00096 0); 00097 } 00098 00099 /* 00100 * @implemented 00101 */ 00102 DWORD 00103 WINAPI 00104 EraseTape(IN HANDLE hDevice, 00105 IN DWORD dwEraseType, 00106 IN BOOL bImmediate) 00107 { 00108 TAPE_ERASE TapeErase; 00109 00110 TapeErase.Type = dwEraseType; 00111 TapeErase.Immediate = (BOOLEAN)bImmediate; 00112 return BasepDoTapeOperation(hDevice, 00113 IOCTL_TAPE_ERASE, 00114 &TapeErase, 00115 sizeof(TapeErase), 00116 NULL, 00117 0); 00118 } 00119 00120 /* 00121 * @implemented 00122 */ 00123 DWORD 00124 WINAPI 00125 GetTapeParameters(IN HANDLE hDevice, 00126 IN DWORD dwOperation, 00127 IN LPDWORD lpdwSize, 00128 IN LPVOID lpTapeInformation) 00129 { 00130 if (dwOperation == GET_TAPE_MEDIA_INFORMATION) 00131 { 00132 if (*lpdwSize < sizeof(TAPE_GET_MEDIA_PARAMETERS)) 00133 { 00134 *lpdwSize = sizeof(TAPE_GET_MEDIA_PARAMETERS); 00135 return ERROR_MORE_DATA; 00136 } 00137 00138 return BasepDoTapeOperation(hDevice, 00139 IOCTL_TAPE_GET_MEDIA_PARAMS, 00140 NULL, 00141 0, 00142 lpTapeInformation, 00143 sizeof(TAPE_GET_MEDIA_PARAMETERS)); 00144 } 00145 else if (dwOperation == GET_TAPE_DRIVE_INFORMATION) 00146 { 00147 if (*lpdwSize < sizeof(TAPE_GET_DRIVE_PARAMETERS)) 00148 { 00149 *lpdwSize = sizeof(TAPE_GET_DRIVE_PARAMETERS); 00150 return ERROR_MORE_DATA; 00151 } 00152 00153 return BasepDoTapeOperation(hDevice, 00154 IOCTL_TAPE_GET_DRIVE_PARAMS, 00155 NULL, 00156 0, 00157 lpTapeInformation, 00158 sizeof(TAPE_GET_DRIVE_PARAMETERS)); 00159 } 00160 00161 return ERROR_INVALID_FUNCTION; 00162 } 00163 00164 /* 00165 * @implemented 00166 */ 00167 DWORD 00168 WINAPI 00169 GetTapePosition(IN HANDLE hDevice, 00170 IN DWORD dwPositionType, 00171 IN LPDWORD lpdwPartition, 00172 IN LPDWORD lpdwOffsetLow, 00173 IN LPDWORD lpdwOffsetHigh) 00174 { 00175 TAPE_GET_POSITION TapeGetPosition; 00176 DWORD Result; 00177 00178 TapeGetPosition.Type = dwPositionType; 00179 Result = BasepDoTapeOperation(hDevice, 00180 IOCTL_TAPE_GET_POSITION, 00181 &TapeGetPosition, 00182 sizeof(TapeGetPosition), 00183 &TapeGetPosition, 00184 sizeof(TapeGetPosition)); 00185 00186 if (Result) 00187 { 00188 *lpdwPartition = 0; 00189 *lpdwOffsetLow = 0; 00190 *lpdwOffsetHigh = 0; 00191 } 00192 else 00193 { 00194 *lpdwPartition = TapeGetPosition.Partition; 00195 *lpdwOffsetLow = TapeGetPosition.Offset.u.LowPart; 00196 *lpdwOffsetHigh = TapeGetPosition.Offset.u.HighPart; 00197 } 00198 00199 return Result; 00200 } 00201 00202 /* 00203 * @implemented 00204 */ 00205 DWORD 00206 WINAPI 00207 GetTapeStatus(IN HANDLE hDevice) 00208 { 00209 return BasepDoTapeOperation(hDevice, 00210 IOCTL_TAPE_GET_STATUS, 00211 NULL, 00212 0, 00213 NULL, 00214 0); 00215 } 00216 00217 /* 00218 * @implemented 00219 */ 00220 DWORD 00221 WINAPI 00222 PrepareTape(IN HANDLE hDevice, 00223 IN DWORD dwOperation, 00224 IN BOOL bImmediate) 00225 { 00226 TAPE_PREPARE TapePrepare; 00227 00228 TapePrepare.Operation = dwOperation; 00229 TapePrepare.Immediate = (BOOLEAN)bImmediate; 00230 return BasepDoTapeOperation(hDevice, 00231 IOCTL_TAPE_PREPARE, 00232 &TapePrepare, 00233 sizeof(TapePrepare), 00234 NULL, 00235 0); 00236 } 00237 00238 /* 00239 * @implemented 00240 */ 00241 DWORD 00242 WINAPI 00243 SetTapeParameters(IN HANDLE hDevice, 00244 IN DWORD dwOperation, 00245 IN LPVOID lpTapeInformation) 00246 { 00247 if (dwOperation == SET_TAPE_MEDIA_INFORMATION) 00248 { 00249 return BasepDoTapeOperation(hDevice, 00250 IOCTL_TAPE_SET_MEDIA_PARAMS, 00251 lpTapeInformation, 00252 sizeof(TAPE_SET_MEDIA_PARAMETERS), 00253 NULL, 00254 0); 00255 } 00256 else if (dwOperation == SET_TAPE_DRIVE_INFORMATION) 00257 { 00258 return BasepDoTapeOperation(hDevice, 00259 IOCTL_TAPE_SET_DRIVE_PARAMS, 00260 lpTapeInformation, 00261 sizeof(TAPE_SET_DRIVE_PARAMETERS), 00262 NULL, 00263 0); 00264 } 00265 00266 return ERROR_INVALID_FUNCTION; 00267 } 00268 00269 /* 00270 * @implemented 00271 */ 00272 DWORD 00273 WINAPI 00274 SetTapePosition(IN HANDLE hDevice, 00275 IN DWORD dwPositionMethod, 00276 IN DWORD dwPartition, 00277 IN DWORD dwOffsetLow, 00278 IN DWORD dwOffsetHigh, 00279 IN BOOL bImmediate) 00280 { 00281 TAPE_SET_POSITION TapeSetPosition; 00282 00283 TapeSetPosition.Method = dwPositionMethod; 00284 TapeSetPosition.Partition = dwPartition; 00285 TapeSetPosition.Offset.u.LowPart = dwOffsetLow; 00286 TapeSetPosition.Offset.u.HighPart = dwOffsetHigh; 00287 TapeSetPosition.Immediate = (BOOLEAN)bImmediate; 00288 return BasepDoTapeOperation(hDevice, 00289 IOCTL_TAPE_SET_POSITION, 00290 &TapeSetPosition, 00291 sizeof(TapeSetPosition), 00292 NULL, 00293 0); 00294 } 00295 00296 /* 00297 * @implemented 00298 */ 00299 DWORD 00300 WINAPI 00301 WriteTapemark(IN HANDLE hDevice, 00302 IN DWORD dwTapemarkType, 00303 IN DWORD dwTapemarkCount, 00304 IN BOOL bImmediate) 00305 { 00306 TAPE_WRITE_MARKS TapeWriteMarks; 00307 00308 TapeWriteMarks.Type = dwTapemarkType; 00309 TapeWriteMarks.Count = dwTapemarkCount; 00310 TapeWriteMarks.Immediate = (BOOLEAN)bImmediate; 00311 return BasepDoTapeOperation(hDevice, 00312 IOCTL_TAPE_WRITE_MARKS, 00313 &TapeWriteMarks, 00314 sizeof(TapeWriteMarks), 00315 NULL, 00316 0); 00317 } 00318 00319 /* EOF */ Generated on Sun May 27 2012 04:24:27 for ReactOS by
1.7.6.1
|