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
= MIN_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
;
152 RtlInitUnicodeString(&DeviceName
, L
"\\Device\\Afd");
153 Status
= IoCreateDevice(DriverObject
,
154 sizeof(DEVICE_EXTENSION
),
156 FILE_DEVICE_NAMED_PIPE
,
160 if (!NT_SUCCESS(Status
)) {
161 AFD_DbgPrint(MIN_TRACE
, ("Could not create device (0x%X).\n", Status
));
165 DeviceObject
->Flags
|= DO_DIRECT_IO
;
167 DeviceExt
= DeviceObject
->DeviceExtension
;
168 KeInitializeSpinLock(&DeviceExt
->FCBListLock
);
169 InitializeListHead(&DeviceExt
->FCBListHead
);
171 DriverObject
->MajorFunction
[IRP_MJ_CREATE
] = AfdCreate
;
172 DriverObject
->MajorFunction
[IRP_MJ_CLOSE
] = AfdClose
;
173 DriverObject
->MajorFunction
[IRP_MJ_READ
] = AfdRead
;
174 DriverObject
->MajorFunction
[IRP_MJ_WRITE
] = AfdWrite
;
175 DriverObject
->MajorFunction
[IRP_MJ_FILE_SYSTEM_CONTROL
] = AfdFileSystemControl
;
176 DriverObject
->MajorFunction
[IRP_MJ_DEVICE_CONTROL
] = AfdDispatch
;
177 DriverObject
->MajorFunction
[IRP_MJ_CLEANUP
] = AfdClose
;
179 DriverObject
->DriverUnload
= (PDRIVER_UNLOAD
)AfdUnload
;
181 /* ExInitializeNPagedLookasideList(
182 &BufferLookasideList,
187 TAG('A', 'F', 'D', 'B'),
190 /* ExInitializeNPagedLookasideList(
191 &ReadRequestLookasideList,
195 sizeof(AFD_READ_REQUEST),
196 TAG('A', 'F', 'D', 'R'),
200 return STATUS_SUCCESS
;