2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS Ancillary Function Driver
5 * PURPOSE: MSAFD kernel mode module
6 * PROGRAMMERS: Casper S. Hornstrup (chorns@users.sourceforge.net)
8 * CSH 01/09-2000 Created
14 /* See debug.h for debug/trace constants */
15 DWORD DebugTraceLevel = MID_TRACE;
16 //DWORD DebugTraceLevel = DEBUG_ULTRA;
21 NPAGED_LOOKASIDE_LIST BufferLookasideList;
22 NPAGED_LOOKASIDE_LIST ReadRequestLookasideList;
28 PDEVICE_OBJECT DeviceObject,
33 Irp->IoStatus.Status = STATUS_UNSUCCESSFUL;
34 Irp->IoStatus.Information = 0;
35 return STATUS_UNSUCCESSFUL;
42 PDEVICE_OBJECT DeviceObject,
45 * FUNCTION: IOCTL dispatch routine
47 * DeviceObject = Pointer to a device object for this driver
48 * Irp = Pointer to a I/O request packet
50 * Status of the operation
54 PIO_STACK_LOCATION IrpSp;
56 IrpSp = IoGetCurrentIrpStackLocation(Irp);
58 AFD_DbgPrint(MAX_TRACE, ("Called. DeviceObject is at (0x%X), IRP is at (0x%X), IrpSp->FileObject (0x%X).\n",
59 DeviceObject, Irp, IrpSp->FileObject));
61 Irp->IoStatus.Information = 0;
63 switch (IrpSp->Parameters.DeviceIoControl.IoControlCode) {
65 Status = AfdDispBind(Irp, IrpSp);
68 case IOCTL_AFD_LISTEN:
69 Status = AfdDispListen(Irp, IrpSp);
72 case IOCTL_AFD_SENDTO:
73 Status = AfdDispSendTo(Irp, IrpSp);
76 case IOCTL_AFD_RECVFROM:
77 Status = AfdDispRecvFrom(Irp, IrpSp);
80 case IOCTL_AFD_SELECT:
81 Status = AfdDispSelect(Irp, IrpSp);
84 case IOCTL_AFD_EVENTSELECT:
85 Status = AfdDispEventSelect(Irp, IrpSp);
88 case IOCTL_AFD_ENUMNETWORKEVENTS:
89 Status = AfdDispEnumNetworkEvents(Irp, IrpSp);
93 Status = AfdDispRecv(Irp, IrpSp);
97 Status = AfdDispSend(Irp, IrpSp);
100 case IOCTL_AFD_CONNECT:
101 Status = AfdDispConnect(Irp, IrpSp);
105 AFD_DbgPrint(MIN_TRACE, ("Unknown IOCTL (0x%X).\n",
106 IrpSp->Parameters.DeviceIoControl.IoControlCode));
107 Status = STATUS_NOT_IMPLEMENTED;
111 if (Status != STATUS_PENDING) {
112 Irp->IoStatus.Status = Status;
113 IoCompleteRequest(Irp, IO_NETWORK_INCREMENT);
116 AFD_DbgPrint(MAX_TRACE, ("Leaving. Status (0x%X).\n", Status));
123 PDRIVER_OBJECT DriverObject)
125 * FUNCTION: Unloads the driver
127 * DriverObject = Pointer to driver object created by the system
136 PDRIVER_OBJECT DriverObject,
137 PUNICODE_STRING RegistryPath)
139 * FUNCTION: Called by the system to initialize the driver
141 * DriverObject = object describing this driver
142 * RegistryPath = path to our configuration entries
144 * Status of operation
147 PDEVICE_EXTENSION DeviceExt;
148 PDEVICE_OBJECT DeviceObject;
149 UNICODE_STRING DeviceName = UNICODE_STRING_INITIALIZER(L"\\Device\\Afd");
152 Status = IoCreateDevice(DriverObject,
153 sizeof(DEVICE_EXTENSION),
155 FILE_DEVICE_NAMED_PIPE,
159 if (!NT_SUCCESS(Status)) {
160 AFD_DbgPrint(MIN_TRACE, ("Could not create device (0x%X).\n", Status));
164 DeviceObject->Flags |= DO_DIRECT_IO;
166 DeviceExt = DeviceObject->DeviceExtension;
167 KeInitializeSpinLock(&DeviceExt->FCBListLock);
168 InitializeListHead(&DeviceExt->FCBListHead);
170 DriverObject->MajorFunction[IRP_MJ_CREATE] = (PDRIVER_DISPATCH)AfdCreate;
171 DriverObject->MajorFunction[IRP_MJ_CLOSE] = (PDRIVER_DISPATCH)AfdClose;
172 DriverObject->MajorFunction[IRP_MJ_READ] = (PDRIVER_DISPATCH)AfdRead;
173 DriverObject->MajorFunction[IRP_MJ_WRITE] = (PDRIVER_DISPATCH)AfdWrite;
174 DriverObject->MajorFunction[IRP_MJ_FILE_SYSTEM_CONTROL] = (PDRIVER_DISPATCH)AfdFileSystemControl;
175 DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = (PDRIVER_DISPATCH)AfdDispatch;
176 DriverObject->MajorFunction[IRP_MJ_CLEANUP] = (PDRIVER_DISPATCH)AfdClose;
178 DriverObject->DriverUnload = (PDRIVER_UNLOAD)AfdUnload;
180 /* ExInitializeNPagedLookasideList(
181 &BufferLookasideList,
186 TAG('A', 'F', 'D', 'B'),
189 /* ExInitializeNPagedLookasideList(
190 &ReadRequestLookasideList,
194 sizeof(AFD_READ_REQUEST),
195 TAG('A', 'F', 'D', 'R'),
199 return STATUS_SUCCESS;