ReactOS 0.4.16-dev-1946-g52006dd
pdo.c
Go to the documentation of this file.
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#define NDEBUG
10#include <debug.h>
11
12/* FUNCTIONS ****************************************************************/
13
17 IN PIRP Irp)
18{
19 PPDO_DEVICE_EXTENSION DeviceExtension;
22
23 DPRINT("PdoCreate()\n");
24
26 DeviceExtension = (PPDO_DEVICE_EXTENSION)DeviceObject->DeviceExtension;
27
28 if (Stack->Parameters.Create.Options & FILE_DIRECTORY_FILE)
29 {
30 DPRINT1("Not a directory\n");
32 goto done;
33 }
34
35 DPRINT("Open LPT%lu: successful\n", DeviceExtension->LptPort);
36 DeviceExtension->OpenCount++;
37
38done:
39 Irp->IoStatus.Status = Status;
40 Irp->IoStatus.Information = 0;
42
43 return Status;
44}
45
46
50 IN PIRP Irp)
51{
52 PPDO_DEVICE_EXTENSION pDeviceExtension;
53
54 DPRINT("PdoClose()\n");
55
56 pDeviceExtension = (PPDO_DEVICE_EXTENSION)DeviceObject->DeviceExtension;
57 pDeviceExtension->OpenCount--;
58
59 Irp->IoStatus.Information = 0;
60 Irp->IoStatus.Status = STATUS_SUCCESS;
62
63 return STATUS_SUCCESS;
64}
65
66
70 IN PIRP Irp)
71{
72 DPRINT("PdoCleanup()\n");
73
74 Irp->IoStatus.Information = 0;
75 Irp->IoStatus.Status = STATUS_SUCCESS;
77 return STATUS_SUCCESS;
78}
79
80
84 IN PIRP Irp)
85{
86 DPRINT("PdoRead()\n");
87
88 Irp->IoStatus.Information = 0;
89 Irp->IoStatus.Status = STATUS_SUCCESS;
91 return STATUS_SUCCESS;
92}
93
94
98 IN PIRP Irp)
99{
100 PPDO_DEVICE_EXTENSION PdoDeviceExtension;
101 PFDO_DEVICE_EXTENSION FdoDeviceExtension;
102 PIO_STACK_LOCATION IoStack;
104 ULONG i;
106 ULONG ulCount;
107
108 DPRINT("PdoWrite()\n");
109
110 PdoDeviceExtension = (PPDO_DEVICE_EXTENSION)DeviceObject->DeviceExtension;
111 FdoDeviceExtension = (PFDO_DEVICE_EXTENSION)PdoDeviceExtension->AttachedFdo->DeviceExtension;
112
114
116 DPRINT("Length: %lu\n", IoStack->Parameters.Write.Length);
117 DPRINT("Buffer: %p\n", Buffer);
118
119 for (i = 0; i < IoStack->Parameters.Write.Length; i++)
120 {
121 ulCount = 0;
122
123 do
124 {
126 PortStatus = READ_PORT_UCHAR(UlongToPtr(FdoDeviceExtension->BaseAddress + 1));
127 ulCount++;
128 }
129 while (ulCount < 500000 && !(PortStatus & LP_PBUSY));
130
131 if (ulCount == 500000)
132 {
133 DPRINT("Timed out\n");
134
135 Irp->IoStatus.Information = 0;
136 Irp->IoStatus.Status = STATUS_TIMEOUT;
138
139 return STATUS_TIMEOUT;
140 }
141
142 /* Write character */
143 WRITE_PORT_UCHAR(UlongToPtr(FdoDeviceExtension->BaseAddress), Buffer[i]);
144
146
147 WRITE_PORT_UCHAR(UlongToPtr(FdoDeviceExtension->BaseAddress + 2), (LP_PSELECP | LP_PINITP | LP_PSTROBE));
148
150
151 WRITE_PORT_UCHAR(UlongToPtr(FdoDeviceExtension->BaseAddress + 2), (LP_PSELECP | LP_PINITP));
152 }
153
154 Irp->IoStatus.Information = 0;
155 Irp->IoStatus.Status = STATUS_SUCCESS;
157 return STATUS_SUCCESS;
158}
159
160
162NTAPI
164 IN PIRP Irp)
165{
167 DPRINT("PdoPnp()\n");
168
169 Status = Irp->IoStatus.Status;
171 return Status;
172}
173
174
176NTAPI
178 IN PIRP Irp)
179{
181 PIO_STACK_LOCATION IoStack;
182
183 DPRINT("PdoPower()\n");
184
186
187 switch (IoStack->MinorFunction)
188 {
189 case IRP_MN_SET_POWER:
191 Irp->IoStatus.Status = STATUS_SUCCESS;
192 break;
193 }
194
195 Status = Irp->IoStatus.Status;
198 return Status;
199}
200
201/* EOF */
static PIO_STACK_LOCATION IoGetCurrentIrpStackLocation(PIRP Irp)
LONG NTSTATUS
Definition: precomp.h:26
#define FILE_DIRECTORY_FILE
Definition: constants.h:491
#define DPRINT1
Definition: precomp.h:8
Definition: bufpool.h:45
_In_ PIRP Irp
Definition: csq.h:116
#define STATUS_TIMEOUT
Definition: d3dkmdt.h:49
struct _PDO_DEVICE_EXTENSION * PPDO_DEVICE_EXTENSION
#define LP_PBUSY
Definition: parallel.h:101
#define LP_PINITP
Definition: parallel.h:114
#define LP_PSTROBE
Definition: parallel.h:116
#define LP_PSELECP
Definition: parallel.h:113
PVOID GetUserBuffer(IN PIRP Irp)
Definition: misc.c:33
#define UlongToPtr(u)
Definition: config.h:106
Status
Definition: gdiplustypes.h:25
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
_Outptr_ PUSB_DEVICE_HANDLE _In_ PUSB_DEVICE_HANDLE _In_ USHORT PortStatus
Definition: hubbusif.h:42
if(dx< 0)
Definition: linetemp.h:194
#define KeStallExecutionProcessor(MicroSeconds)
Definition: precomp.h:27
#define IoCompleteRequest
Definition: irp.c:1240
VOID NTAPI PoStartNextPowerIrp(IN PIRP Irp)
Definition: power.c:758
NTSTATUS NTAPI PdoWrite(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
Definition: pdo.c:97
NTSTATUS NTAPI PdoRead(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
Definition: pdo.c:83
NTSTATUS NTAPI PdoPnp(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
Definition: pdo.c:163
NTSTATUS NTAPI PdoCleanup(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
Definition: pdo.c:69
NTSTATUS NTAPI PdoCreate(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
Definition: pdo.c:16
NTSTATUS NTAPI PdoClose(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
Definition: pdo.c:49
NTSTATUS NTAPI PdoPower(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
Definition: pdo.c:177
#define READ_PORT_UCHAR(p)
Definition: pc98vid.h:22
#define WRITE_PORT_UCHAR(p, d)
Definition: pc98vid.h:21
#define STATUS_SUCCESS
Definition: shellext.h:65
#define DPRINT
Definition: sndvol32.h:73
PVOID DeviceExtension
Definition: env_spec_w32.h:418
struct _IO_STACK_LOCATION::@4278::@4283 Write
union _IO_STACK_LOCATION::@1694 Parameters
PDEVICE_OBJECT AttachedFdo
Definition: parport.h:56
#define NTAPI
Definition: typedefs.h:36
#define IN
Definition: typedefs.h:39
unsigned char * PUCHAR
Definition: typedefs.h:53
uint32_t ULONG
Definition: typedefs.h:59
#define STATUS_NOT_A_DIRECTORY
Definition: udferr_usr.h:169
_In_ PDEVICE_OBJECT DeviceObject
Definition: wdfdevice.h:2061
_In_ WDFREQUEST _In_ PIO_STACK_LOCATION Stack
Definition: wdfrequest.h:639
#define IO_NO_INCREMENT
Definition: iotypes.h:598
#define IRP_MN_SET_POWER
#define IRP_MN_QUERY_POWER
unsigned char UCHAR
Definition: xmlstorage.h:181