ReactOS Fundraising Campaign 2012
 
€ 4,410 / € 30,000

Information | Donate

Home | Info | Community | Development | myReactOS | Contact Us

  1. Home
  2. Community
  3. Development
  4. myReactOS
  5. Fundraiser 2012

  1. Main Page
  2. Alphabetical List
  3. Data Structures
  4. Directories
  5. File List
  6. Data Fields
  7. Globals
  8. Related Pages

ReactOS Development > Doxygen

tape.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 doxygen 1.7.6.1

ReactOS is a registered trademark or a trademark of ReactOS Foundation in the United States and other countries.