|
|
1.1 ! root 1: /*++ ! 2: ! 3: Copyright (c) 1991, 1992, 1993 Microsoft Corporation ! 4: ! 5: Module Name: ! 6: ! 7: qsfile.c ! 8: ! 9: Abstract: ! 10: ! 11: This module contains the code that is very specific to query/set file ! 12: operations in the serial driver. ! 13: ! 14: Author: ! 15: ! 16: Anthony V. Ercolano 26-Sep-1991 ! 17: ! 18: Environment: ! 19: ! 20: Kernel mode ! 21: ! 22: Revision History : ! 23: ! 24: --*/ ! 25: ! 26: #include <stddef.h> ! 27: #include "ntddk.h" ! 28: #include "ntddser.h" ! 29: #include "serial.h" ! 30: #include "serialp.h" ! 31: ! 32: ! 33: NTSTATUS ! 34: SerialQueryInformationFile( ! 35: IN PDEVICE_OBJECT DeviceObject, ! 36: IN PIRP Irp ! 37: ) ! 38: ! 39: /*++ ! 40: ! 41: Routine Description: ! 42: ! 43: This routine is used to query the end of file information on ! 44: the opened serial port. Any other file information request ! 45: is retured with an invalid parameter. ! 46: ! 47: This routine always returns an end of file of 0. ! 48: ! 49: Arguments: ! 50: ! 51: DeviceObject - Pointer to the device object for this device ! 52: ! 53: Irp - Pointer to the IRP for the current request ! 54: ! 55: Return Value: ! 56: ! 57: The function value is the final status of the call ! 58: ! 59: --*/ ! 60: ! 61: { ! 62: // ! 63: // The status that gets returned to the caller and ! 64: // set in the Irp. ! 65: // ! 66: NTSTATUS Status; ! 67: ! 68: // ! 69: // The current stack location. This contains all of the ! 70: // information we need to process this particular request. ! 71: // ! 72: PIO_STACK_LOCATION IrpSp; ! 73: ! 74: UNREFERENCED_PARAMETER(DeviceObject); ! 75: ! 76: SerialDump( ! 77: SERIRPPATH, ! 78: ("SERIAL: Dispatch entry for: %x\n",Irp) ! 79: ); ! 80: if (SerialCompleteIfError( ! 81: DeviceObject, ! 82: Irp ! 83: ) != STATUS_SUCCESS) { ! 84: ! 85: return STATUS_CANCELLED; ! 86: ! 87: } ! 88: IrpSp = IoGetCurrentIrpStackLocation(Irp); ! 89: Irp->IoStatus.Information = 0L; ! 90: Status = STATUS_SUCCESS; ! 91: if (IrpSp->Parameters.QueryFile.FileInformationClass == ! 92: FileStandardInformation) { ! 93: ! 94: PFILE_STANDARD_INFORMATION Buf = Irp->AssociatedIrp.SystemBuffer; ! 95: ! 96: Buf->AllocationSize = RtlConvertUlongToLargeInteger(0ul); ! 97: Buf->EndOfFile = Buf->AllocationSize; ! 98: Buf->NumberOfLinks = 0; ! 99: Buf->DeletePending = FALSE; ! 100: Buf->Directory = FALSE; ! 101: Irp->IoStatus.Information = sizeof(FILE_STANDARD_INFORMATION); ! 102: ! 103: } else if (IrpSp->Parameters.QueryFile.FileInformationClass == ! 104: FilePositionInformation) { ! 105: ! 106: ((PFILE_POSITION_INFORMATION)Irp->AssociatedIrp.SystemBuffer)-> ! 107: CurrentByteOffset = RtlConvertUlongToLargeInteger(0ul); ! 108: Irp->IoStatus.Information = sizeof(FILE_POSITION_INFORMATION); ! 109: ! 110: } else { ! 111: ! 112: Status = STATUS_INVALID_PARAMETER; ! 113: ! 114: } ! 115: ! 116: SerialDump( ! 117: SERIRPPATH, ! 118: ("SERIAL: Complete Irp: %x\n",Irp) ! 119: ); ! 120: IoCompleteRequest( ! 121: Irp, ! 122: 0 ! 123: ); ! 124: ! 125: return Status; ! 126: ! 127: } ! 128: ! 129: NTSTATUS ! 130: SerialSetInformationFile( ! 131: IN PDEVICE_OBJECT DeviceObject, ! 132: IN PIRP Irp ! 133: ) ! 134: ! 135: /*++ ! 136: ! 137: Routine Description: ! 138: ! 139: This routine is used to set the end of file information on ! 140: the opened parallel port. Any other file information request ! 141: is retured with an invalid parameter. ! 142: ! 143: This routine always ignores the actual end of file since ! 144: the query information code always returns an end of file of 0. ! 145: ! 146: Arguments: ! 147: ! 148: DeviceObject - Pointer to the device object for this device ! 149: ! 150: Irp - Pointer to the IRP for the current request ! 151: ! 152: Return Value: ! 153: ! 154: The function value is the final status of the call ! 155: ! 156: --*/ ! 157: ! 158: { ! 159: // ! 160: // The status that gets returned to the caller and ! 161: // set in the Irp. ! 162: // ! 163: NTSTATUS Status; ! 164: ! 165: UNREFERENCED_PARAMETER(DeviceObject); ! 166: ! 167: SerialDump( ! 168: SERIRPPATH, ! 169: ("SERIAL: Dispatch entry for: %x\n",Irp) ! 170: ); ! 171: if (SerialCompleteIfError( ! 172: DeviceObject, ! 173: Irp ! 174: ) != STATUS_SUCCESS) { ! 175: ! 176: return STATUS_CANCELLED; ! 177: ! 178: } ! 179: Irp->IoStatus.Information = 0L; ! 180: if ((IoGetCurrentIrpStackLocation(Irp)-> ! 181: Parameters.SetFile.FileInformationClass == ! 182: FileEndOfFileInformation) || ! 183: (IoGetCurrentIrpStackLocation(Irp)-> ! 184: Parameters.SetFile.FileInformationClass == ! 185: FileAllocationInformation)) { ! 186: ! 187: Status = STATUS_SUCCESS; ! 188: ! 189: } else { ! 190: ! 191: Status = STATUS_INVALID_PARAMETER; ! 192: ! 193: } ! 194: ! 195: Irp->IoStatus.Status = Status; ! 196: ! 197: SerialDump( ! 198: SERIRPPATH, ! 199: ("SERIAL: Complete Irp: %x\n",Irp) ! 200: ); ! 201: IoCompleteRequest( ! 202: Irp, ! 203: 0 ! 204: ); ! 205: ! 206: return Status; ! 207: ! 208: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.