1 /* $Id: debugout.c,v 1.3 2004/02/10 16:22:55 navaraf Exp $
3 * COPYRIGHT: See COPYING in the top level directory
4 * PROJECT: ReactOS kernel
5 * FILE: drivers/dd/debugout.c
6 * PURPOSE: Debug output device driver
7 * PROGRAMMER: Ge van Geldorp (ge@gse.nl)
11 * In your usermode application, do something like this:
13 * DebugHandle = CreateFile("\\\\.\\DebugOut",
18 * FILE_ATTRIBUTE_NORMAL,
21 * and write to your hearts content to DebugHandle.
25 #include <ddk/ntddk.h>
26 #include <rosrtl/string.h>
30 DebugOutDispatch(IN PDEVICE_OBJECT DeviceObject
, IN PIRP Irp
)
32 PIO_STACK_LOCATION piosStack
= IoGetCurrentIrpStackLocation(Irp
);
39 nErrCode
= STATUS_SUCCESS
;
41 switch(piosStack
->MajorFunction
)
43 /* opening and closing handles to the device */
50 Remaining
= piosStack
->Parameters
.Write
.Length
;
51 Start
= Irp
->AssociatedIrp
.SystemBuffer
;
55 if (sizeof(Buf
) - 1 < Length
)
57 Length
= sizeof(Buf
) - 1;
59 RtlCopyMemory(Buf
, Start
, Length
);
66 Irp
->IoStatus
.Information
= piosStack
->Parameters
.Write
.Length
;
71 Irp
->IoStatus
.Information
= 0;
72 nErrCode
= STATUS_END_OF_FILE
;
75 /* unsupported operations */
77 nErrCode
= STATUS_NOT_IMPLEMENTED
;
80 Irp
->IoStatus
.Status
= nErrCode
;
81 IoCompleteRequest(Irp
, IO_NO_INCREMENT
);
87 DebugOutUnload(PDRIVER_OBJECT DriverObject
)
92 DriverEntry(PDRIVER_OBJECT DriverObject
, PUNICODE_STRING RegistryPath
)
94 PDEVICE_OBJECT DebugOutDevice
;
95 UNICODE_STRING DeviceName
;
96 UNICODE_STRING DosName
;
99 /* register driver routines */
100 DriverObject
->MajorFunction
[IRP_MJ_CLOSE
] = DebugOutDispatch
;
101 DriverObject
->MajorFunction
[IRP_MJ_CREATE
] = DebugOutDispatch
;
102 DriverObject
->MajorFunction
[IRP_MJ_WRITE
] = DebugOutDispatch
;
103 DriverObject
->MajorFunction
[IRP_MJ_READ
] = DebugOutDispatch
;
104 /* DriverObject->MajorFunction[IRP_MJ_QUERY_INFORMATION] = DebugOutDispatch; */
105 DriverObject
->DriverUnload
= DebugOutUnload
;
108 RtlRosInitUnicodeStringFromLiteral(&DeviceName
, L
"\\Device\\DebugOut");
110 Status
= IoCreateDevice(DriverObject
, 0, &DeviceName
, FILE_DEVICE_NULL
,
111 0, FALSE
, &DebugOutDevice
);
112 if (! NT_SUCCESS(Status
))
117 RtlRosInitUnicodeStringFromLiteral(&DosName
, L
"\\DosDevices\\DebugOut");
118 Status
= IoCreateSymbolicLink(&DosName
, &DeviceName
);
119 if (! NT_SUCCESS(Status
))
121 IoDeleteDevice(DebugOutDevice
);
125 DebugOutDevice
->Flags
|= DO_BUFFERED_IO
;