ReactOS  0.4.14-dev-1252-g782ff23
parallel.c
Go to the documentation of this file.
1 /*
2  * COPYRIGHT: See COPYING in the top level directory
3  * PROJECT: ReactOS kernel
4  * FILE: services/parallel/parallel.c
5  * PURPOSE: Parallel port driver
6  * PROGRAMMER: David Welch (welch@mcmail.com)
7  * UPDATE HISTORY:
8  * ??/??/??: Created
9  * 18/06/98: Made more NT like
10  */
11 
12 /* FUNCTIONS **************************************************************/
13 
14 #include <wdm.h>
15 
16 #include "parallel.h"
17 
18 #define NDEBUG
19 #include <debug.h>
20 
21 
22 #define LP_B (0x378)
23 #define LP_S (READ_PORT_UCHAR((PUCHAR)(LP_B+1)))
24 #define LP_C (LP_B+2)
25 
28 
29 static void Parallel_Reset(void)
30 /*
31  * FUNCTION: Resets the device attached to the parallel port
32  */
33 {
34  int i;
35 
37  for (i=0;i<LP_DELAY;i++);
39 }
40 
41 static void Parallel_putchar(unsigned char ch)
42 /*
43  * FUNCTION: Writes a character to the parallel port
44  * ARGUMENTS:
45  * ch = character to write
46  */
47 {
48 
49  int count=0;
50  int status;
51  int wait=0;
52 
53  do
54  {
55  status=LP_S;
56  count++;
57  }
58  while ( count < 500000 && !(status & LP_PBUSY) );
59 
60  if (count==500000)
61  {
62  DPRINT("printer_putchar(): timed out\n");
63  return;
64  }
65 
67  while (wait != 10000) { wait++; }
69  while (wait) { wait--; }
71 }
72 
74 static NTSTATUS NTAPI
76 /*
77  * FUNCTION: Handles user mode requests
78  * ARGUMENTS:
79  * DeviceObject = Device for request
80  * Irp = I/O request packet describing request
81  * RETURNS: Success or failure
82  */
83 {
86  ULONG i;
87 
88  switch (Stack->MajorFunction)
89  {
90  case IRP_MJ_CREATE:
91  DPRINT("(Parallel Port Driver) Creating\n");
94  break;
95 
96  case IRP_MJ_CLOSE:
98  break;
99 
100  case IRP_MJ_WRITE:
101  DPRINT("(Parallel Port Driver) Writing %d bytes\n",
102  Stack->Parameters.Write.Length);
103  for (i=0;i<Stack->Parameters.Write.Length;i++)
104  {
105  Parallel_putchar(((char *)Irp->UserBuffer)[i]);
106  }
108  break;
109 
110  default:
112  break;
113  }
114 
115  Irp->IoStatus.Status = status;
116  Irp->IoStatus.Information = 0;
117 
119  return(status);
120 }
121 
124 /*
125  * FUNCTION: Called by the system to initialize the driver
126  * ARGUMENTS:
127  * DriverObject = object describing this driver
128  * RegistryPath = path to our configuration entries
129  * RETURNS: Success or failure
130  */
131 {
133  UNICODE_STRING DeviceName = RTL_CONSTANT_STRING(L"\\Device\\Parallel");
135 
136  DPRINT("Parallel Port Driver 0.0.1\n");
137 
139  0,
140  &DeviceName,
142  0,
143  FALSE,
144  &DeviceObject);
145  if (!NT_SUCCESS(Status))
146  {
147  return(Status);
148  }
149 
150  DeviceObject->Flags=0;
155 
156  return(STATUS_SUCCESS);
157 }
158 
159 /* EOF */
#define IRP_MJ_CREATE
Definition: rdpdr.c:44
#define STATUS_NOT_IMPLEMENTED
Definition: ntstatus.h:225
static void Parallel_putchar(unsigned char ch)
Definition: parallel.c:41
_In_ PIRP Irp
Definition: csq.h:116
GLuint GLuint GLsizei count
Definition: gl.h:1545
unsigned char * PUCHAR
Definition: retypes.h:3
LONG NTSTATUS
Definition: precomp.h:26
NTSTATUS NTAPI DriverEntry(PDRIVER_OBJECT DriverObject, PUNICODE_STRING RegistryPath)
Definition: parallel.c:123
#define LP_DELAY
Definition: parallel.h:134
#define LP_C
Definition: parallel.c:24
WCHAR DeviceName[]
Definition: adapter.cpp:21
#define LP_B
Definition: parallel.c:22
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
NTSTATUS(* NTAPI)(IN PFILE_FULL_EA_INFORMATION EaBuffer, IN ULONG EaLength, OUT PULONG ErrorOffset)
Definition: IoEaTest.cpp:117
#define LP_PINITP
Definition: parallel.h:119
smooth NULL
Definition: ftsmooth.c:416
static PDRIVER_OBJECT DriverObject
Definition: template.c:42
#define IoCompleteRequest
Definition: irp.c:1240
void DPRINT(...)
Definition: polytest.cpp:61
#define LP_PSELECP
Definition: parallel.h:118
static void Parallel_Reset(void)
Definition: parallel.c:29
#define LP_PSTROBE
Definition: parallel.h:121
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:32
#define FILE_DEVICE_PARALLEL_PORT
Definition: winioctl.h:127
#define IRP_MJ_CLOSE
Definition: rdpdr.c:45
static const WCHAR L[]
Definition: oid.c:1250
PDRIVER_UNLOAD DriverUnload
Definition: iotypes.h:2180
DRIVER_DISPATCH(nfs41_FsdDispatch)
Status
Definition: gdiplustypes.h:24
IN PDEVICE_OBJECT DeviceObject
Definition: fatprocs.h:1560
__drv_aliasesMem FORCEINLINE PIO_STACK_LOCATION IoGetCurrentIrpStackLocation(_In_ PIRP Irp)
Definition: iofuncs.h:2745
#define LP_PBUSY
Definition: parallel.h:106
PDRIVER_DISPATCH MajorFunction[IRP_MJ_MAXIMUM_FUNCTION+1]
Definition: iotypes.h:2181
unsigned int ULONG
Definition: retypes.h:1
#define IO_NO_INCREMENT
Definition: iotypes.h:566
NTSTATUS NTAPI IoCreateDevice(IN PDRIVER_OBJECT DriverObject, IN ULONG DeviceExtensionSize, IN PUNICODE_STRING DeviceName, IN DEVICE_TYPE DeviceType, IN ULONG DeviceCharacteristics, IN BOOLEAN Exclusive, OUT PDEVICE_OBJECT *DeviceObject)
Definition: device.c:1031
static DRIVER_DISPATCH Dispatch
Definition: parallel.c:73
void WRITE_PORT_UCHAR(PUCHAR Address, UCHAR Value)
Definition: mach.c:532
_In_ PUNICODE_STRING RegistryPath
Definition: wmip.h:28
#define IRP_MJ_WRITE
Definition: rdpdr.c:47
struct _NAMED_PIPE_CREATE_PARAMETERS * Parameters
Definition: iotypes.h:2772
return STATUS_SUCCESS
Definition: btrfs.c:2938
static SERVICE_STATUS status
Definition: service.c:31
#define LP_S
Definition: parallel.c:23
#define RTL_CONSTANT_STRING(s)
Definition: tunneltest.c:14
Definition: ps.c:97