1 /* 2 * COPYRIGHT: See COPYING in the top level directory 3 * PROJECT: Parallel Port Function Driver 4 * FILE: drivers/parallel/parport/pdo.c 5 * PURPOSE: PDO functions 6 */ 7 8 #include "parport.h" 9 10 /* FUNCTIONS ****************************************************************/ 11 12 NTSTATUS 13 NTAPI 14 PdoCreate(IN PDEVICE_OBJECT DeviceObject, 15 IN PIRP Irp) 16 { 17 PPDO_DEVICE_EXTENSION DeviceExtension; 18 PIO_STACK_LOCATION Stack; 19 NTSTATUS Status = STATUS_SUCCESS; 20 21 DPRINT("PdoCreate()\n"); 22 23 Stack = IoGetCurrentIrpStackLocation(Irp); 24 DeviceExtension = (PPDO_DEVICE_EXTENSION)DeviceObject->DeviceExtension; 25 26 if (Stack->Parameters.Create.Options & FILE_DIRECTORY_FILE) 27 { 28 DPRINT1("Not a directory\n"); 29 Status = STATUS_NOT_A_DIRECTORY; 30 goto done; 31 } 32 33 DPRINT("Open LPT%lu: successful\n", DeviceExtension->LptPort); 34 DeviceExtension->OpenCount++; 35 36 done: 37 Irp->IoStatus.Status = Status; 38 Irp->IoStatus.Information = 0; 39 IoCompleteRequest(Irp, IO_NO_INCREMENT); 40 41 return Status; 42 } 43 44 45 NTSTATUS 46 NTAPI 47 PdoClose(IN PDEVICE_OBJECT DeviceObject, 48 IN PIRP Irp) 49 { 50 PPDO_DEVICE_EXTENSION pDeviceExtension; 51 52 DPRINT("PdoClose()\n"); 53 54 pDeviceExtension = (PPDO_DEVICE_EXTENSION)DeviceObject->DeviceExtension; 55 pDeviceExtension->OpenCount--; 56 57 Irp->IoStatus.Information = 0; 58 Irp->IoStatus.Status = STATUS_SUCCESS; 59 IoCompleteRequest(Irp, IO_NO_INCREMENT); 60 61 return STATUS_SUCCESS; 62 } 63 64 65 NTSTATUS 66 NTAPI 67 PdoCleanup(IN PDEVICE_OBJECT DeviceObject, 68 IN PIRP Irp) 69 { 70 DPRINT("PdoCleanup()\n"); 71 72 Irp->IoStatus.Information = 0; 73 Irp->IoStatus.Status = STATUS_SUCCESS; 74 IoCompleteRequest(Irp, IO_NO_INCREMENT); 75 return STATUS_SUCCESS; 76 } 77 78 79 NTSTATUS 80 NTAPI 81 PdoRead(IN PDEVICE_OBJECT DeviceObject, 82 IN PIRP Irp) 83 { 84 DPRINT("PdoRead()\n"); 85 86 Irp->IoStatus.Information = 0; 87 Irp->IoStatus.Status = STATUS_SUCCESS; 88 IoCompleteRequest(Irp, IO_NO_INCREMENT); 89 return STATUS_SUCCESS; 90 } 91 92 93 NTSTATUS 94 NTAPI 95 PdoWrite(IN PDEVICE_OBJECT DeviceObject, 96 IN PIRP Irp) 97 { 98 PPDO_DEVICE_EXTENSION PdoDeviceExtension; 99 PFDO_DEVICE_EXTENSION FdoDeviceExtension; 100 PIO_STACK_LOCATION IoStack; 101 PUCHAR Buffer; 102 ULONG i; 103 UCHAR PortStatus; 104 ULONG ulCount; 105 106 DPRINT("PdoWrite()\n"); 107 108 PdoDeviceExtension = (PPDO_DEVICE_EXTENSION)DeviceObject->DeviceExtension; 109 FdoDeviceExtension = (PFDO_DEVICE_EXTENSION)PdoDeviceExtension->AttachedFdo->DeviceExtension; 110 111 IoStack = IoGetCurrentIrpStackLocation(Irp); 112 113 Buffer = GetUserBuffer(Irp); 114 DPRINT("Length: %lu\n", IoStack->Parameters.Write.Length); 115 DPRINT("Buffer: %p\n", Buffer); 116 117 for (i = 0; i < IoStack->Parameters.Write.Length; i++) 118 { 119 ulCount = 0; 120 121 do 122 { 123 KeStallExecutionProcessor(10); 124 PortStatus = READ_PORT_UCHAR(UlongToPtr(FdoDeviceExtension->BaseAddress + 1)); 125 ulCount++; 126 } 127 while (ulCount < 500000 && !(PortStatus & LP_PBUSY)); 128 129 if (ulCount == 500000) 130 { 131 DPRINT("Timed out\n"); 132 133 Irp->IoStatus.Information = 0; 134 Irp->IoStatus.Status = STATUS_TIMEOUT; 135 IoCompleteRequest(Irp, IO_NO_INCREMENT); 136 137 return STATUS_TIMEOUT; 138 } 139 140 /* Write character */ 141 WRITE_PORT_UCHAR(UlongToPtr(FdoDeviceExtension->BaseAddress), Buffer[i]); 142 143 KeStallExecutionProcessor(10); 144 145 WRITE_PORT_UCHAR(UlongToPtr(FdoDeviceExtension->BaseAddress + 2), (LP_PSELECP | LP_PINITP | LP_PSTROBE)); 146 147 KeStallExecutionProcessor(10); 148 149 WRITE_PORT_UCHAR(UlongToPtr(FdoDeviceExtension->BaseAddress + 2), (LP_PSELECP | LP_PINITP)); 150 } 151 152 Irp->IoStatus.Information = 0; 153 Irp->IoStatus.Status = STATUS_SUCCESS; 154 IoCompleteRequest(Irp, IO_NO_INCREMENT); 155 return STATUS_SUCCESS; 156 } 157 158 159 NTSTATUS 160 NTAPI 161 PdoPnp(IN PDEVICE_OBJECT DeviceObject, 162 IN PIRP Irp) 163 { 164 NTSTATUS Status; 165 DPRINT("PdoPnp()\n"); 166 167 Status = Irp->IoStatus.Status; 168 IoCompleteRequest(Irp, IO_NO_INCREMENT); 169 return Status; 170 } 171 172 173 NTSTATUS 174 NTAPI 175 PdoPower(IN PDEVICE_OBJECT DeviceObject, 176 IN PIRP Irp) 177 { 178 NTSTATUS Status; 179 PIO_STACK_LOCATION IoStack; 180 181 DPRINT("PdoPower()\n"); 182 183 IoStack = IoGetCurrentIrpStackLocation(Irp); 184 185 switch (IoStack->MinorFunction) 186 { 187 case IRP_MN_SET_POWER: 188 case IRP_MN_QUERY_POWER: 189 Irp->IoStatus.Status = STATUS_SUCCESS; 190 break; 191 } 192 193 Status = Irp->IoStatus.Status; 194 PoStartNextPowerIrp(Irp); 195 IoCompleteRequest(Irp, IO_NO_INCREMENT); 196 return Status; 197 } 198 199 /* EOF */ 200