scroll mode for very long start menus
[reactos.git] / reactos / drivers / dd / debugout / debugout.c
1 /* $Id: debugout.c,v 1.3 2004/02/10 16:22:55 navaraf Exp $
2 *
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)
8 * UPDATE HISTORY:
9 * 2003/05/22: Created
10 * NOTES:
11 * In your usermode application, do something like this:
12 *
13 * DebugHandle = CreateFile("\\\\.\\DebugOut",
14 * GENERIC_WRITE,
15 * 0,
16 * NULL,
17 * OPEN_EXISTING,
18 * FILE_ATTRIBUTE_NORMAL,
19 * NULL);
20 *
21 * and write to your hearts content to DebugHandle.
22 */
23
24 /* INCLUDES */
25 #include <ddk/ntddk.h>
26 #include <rosrtl/string.h>
27
28 /* FUNCTIONS */
29 NTSTATUS STDCALL
30 DebugOutDispatch(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
31 {
32 PIO_STACK_LOCATION piosStack = IoGetCurrentIrpStackLocation(Irp);
33 NTSTATUS nErrCode;
34 char *Start;
35 char Buf[513];
36 unsigned Remaining;
37 unsigned Length;
38
39 nErrCode = STATUS_SUCCESS;
40
41 switch(piosStack->MajorFunction)
42 {
43 /* opening and closing handles to the device */
44 case IRP_MJ_CREATE:
45 case IRP_MJ_CLOSE:
46 break;
47
48 /* write data */
49 case IRP_MJ_WRITE:
50 Remaining = piosStack->Parameters.Write.Length;
51 Start = Irp->AssociatedIrp.SystemBuffer;
52 while (0 < Remaining)
53 {
54 Length = Remaining;
55 if (sizeof(Buf) - 1 < Length)
56 {
57 Length = sizeof(Buf) - 1;
58 }
59 RtlCopyMemory(Buf, Start, Length);
60 Buf[Length] = '\0';
61 DbgPrint("%s", Buf);
62 Remaining -= Length;
63 Start += Length;
64 }
65
66 Irp->IoStatus.Information = piosStack->Parameters.Write.Length;
67 break;
68
69 /* read data */
70 case IRP_MJ_READ:
71 Irp->IoStatus.Information = 0;
72 nErrCode = STATUS_END_OF_FILE;
73 break;
74
75 /* unsupported operations */
76 default:
77 nErrCode = STATUS_NOT_IMPLEMENTED;
78 }
79
80 Irp->IoStatus.Status = nErrCode;
81 IoCompleteRequest(Irp, IO_NO_INCREMENT);
82
83 return nErrCode;
84 }
85
86 VOID STDCALL
87 DebugOutUnload(PDRIVER_OBJECT DriverObject)
88 {
89 }
90
91 NTSTATUS STDCALL
92 DriverEntry(PDRIVER_OBJECT DriverObject, PUNICODE_STRING RegistryPath)
93 {
94 PDEVICE_OBJECT DebugOutDevice;
95 UNICODE_STRING DeviceName;
96 UNICODE_STRING DosName;
97 NTSTATUS Status;
98
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;
106
107 /* create device */
108 RtlRosInitUnicodeStringFromLiteral(&DeviceName, L"\\Device\\DebugOut");
109
110 Status = IoCreateDevice(DriverObject, 0, &DeviceName, FILE_DEVICE_NULL,
111 0, FALSE, &DebugOutDevice);
112 if (! NT_SUCCESS(Status))
113 {
114 return Status;
115 }
116
117 RtlRosInitUnicodeStringFromLiteral(&DosName, L"\\DosDevices\\DebugOut");
118 Status = IoCreateSymbolicLink(&DosName, &DeviceName);
119 if (! NT_SUCCESS(Status))
120 {
121 IoDeleteDevice(DebugOutDevice);
122 return Status;
123 }
124
125 DebugOutDevice->Flags |= DO_BUFFERED_IO;
126
127 return Status;
128 }
129
130 /* EOF */