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>
29 DebugOutDispatch(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
31 PIO_STACK_LOCATION piosStack = IoGetCurrentIrpStackLocation(Irp);
38 nErrCode = STATUS_SUCCESS;
40 switch(piosStack->MajorFunction)
42 /* opening and closing handles to the device */
49 Remaining = piosStack->Parameters.Write.Length;
50 Start = Irp->AssociatedIrp.SystemBuffer;
54 if (sizeof(Buf) - 1 < Length)
56 Length = sizeof(Buf) - 1;
58 RtlCopyMemory(Buf, Start, Length);
65 Irp->IoStatus.Information = piosStack->Parameters.Write.Length;
70 Irp->IoStatus.Information = 0;
71 nErrCode = STATUS_END_OF_FILE;
74 /* unsupported operations */
76 nErrCode = STATUS_NOT_IMPLEMENTED;
79 Irp->IoStatus.Status = nErrCode;
80 IoCompleteRequest(Irp, IO_NO_INCREMENT);
86 DebugOutUnload(PDRIVER_OBJECT DriverObject)
88 return STATUS_SUCCESS;
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] = (PDRIVER_DISPATCH) DebugOutDispatch;
101 DriverObject->MajorFunction[IRP_MJ_CREATE] = (PDRIVER_DISPATCH) DebugOutDispatch;
102 DriverObject->MajorFunction[IRP_MJ_WRITE] = (PDRIVER_DISPATCH) DebugOutDispatch;
103 DriverObject->MajorFunction[IRP_MJ_READ] = (PDRIVER_DISPATCH) DebugOutDispatch;
104 /* DriverObject->MajorFunction[IRP_MJ_QUERY_INFORMATION] = (PDRIVER_DISPATCH) DebugOutDispatch; */
105 DriverObject->DriverUnload = (PDRIVER_UNLOAD) DebugOutUnload;
108 RtlInitUnicodeStringFromLiteral(&DeviceName, L"\\Device\\DebugOut");
110 Status = IoCreateDevice(DriverObject, 0, &DeviceName, FILE_DEVICE_NULL,
111 0, FALSE, &DebugOutDevice);
112 if (! NT_SUCCESS(Status))
117 RtlInitUnicodeStringFromLiteral(&DosName, L"\\DosDevices\\DebugOut");
118 Status = IoCreateSymbolicLink(&DosName, &DeviceName);
119 if (! NT_SUCCESS(Status))
121 IoDeleteDevice(DebugOutDevice);
125 DebugOutDevice->Flags |= DO_BUFFERED_IO;