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
11 #include <rosrtl/string.h>
15 /* See debug.h for debug/trace constants */
16 DWORD DebugTraceLevel
= MID_TRACE
;
17 //DWORD DebugTraceLevel = DEBUG_ULTRA;
22 NPAGED_LOOKASIDE_LIST BufferLookasideList
;
23 NPAGED_LOOKASIDE_LIST ReadRequestLookasideList
;
29 PDEVICE_OBJECT DeviceObject
,
34 Irp
->IoStatus
.Status
= STATUS_UNSUCCESSFUL
;
35 Irp
->IoStatus
.Information
= 0;
36 return STATUS_UNSUCCESSFUL
;
43 PDEVICE_OBJECT DeviceObject
,
46 * FUNCTION: IOCTL dispatch routine
48 * DeviceObject = Pointer to a device object for this driver
49 * Irp = Pointer to a I/O request packet
51 * Status of the operation
55 PIO_STACK_LOCATION IrpSp
;
57 IrpSp
= IoGetCurrentIrpStackLocation(Irp
);
59 AFD_DbgPrint(MAX_TRACE
, ("Called. DeviceObject is at (0x%X), IRP is at (0x%X), IrpSp->FileObject (0x%X).\n",
60 DeviceObject
, Irp
, IrpSp
->FileObject
));
62 Irp
->IoStatus
.Information
= 0;
64 switch (IrpSp
->Parameters
.DeviceIoControl
.IoControlCode
) {
66 Status
= AfdDispBind(Irp
, IrpSp
);
69 case IOCTL_AFD_LISTEN
:
70 Status
= AfdDispListen(Irp
, IrpSp
);
73 case IOCTL_AFD_SENDTO
:
74 Status
= AfdDispSendTo(Irp
, IrpSp
);
77 case IOCTL_AFD_RECVFROM
:
78 Status
= AfdDispRecvFrom(Irp
, IrpSp
);
81 case IOCTL_AFD_SELECT
:
82 Status
= AfdDispSelect(Irp
, IrpSp
);
85 case IOCTL_AFD_EVENTSELECT
:
86 Status
= AfdDispEventSelect(Irp
, IrpSp
);
89 case IOCTL_AFD_ENUMNETWORKEVENTS
:
90 Status
= AfdDispEnumNetworkEvents(Irp
, IrpSp
);
94 Status
= AfdDispRecv(Irp
, IrpSp
);
98 Status
= AfdDispSend(Irp
, IrpSp
);
101 case IOCTL_AFD_CONNECT
:
102 Status
= AfdDispConnect(Irp
, IrpSp
);
106 AFD_DbgPrint(MIN_TRACE
, ("Unknown IOCTL (0x%X).\n",
107 IrpSp
->Parameters
.DeviceIoControl
.IoControlCode
));
108 Status
= STATUS_NOT_IMPLEMENTED
;
112 if (Status
!= STATUS_PENDING
) {
113 Irp
->IoStatus
.Status
= Status
;
114 IoCompleteRequest(Irp
, IO_NETWORK_INCREMENT
);
117 AFD_DbgPrint(MAX_TRACE
, ("Leaving. Status (0x%X).\n", Status
));
124 PDRIVER_OBJECT DriverObject
)
126 * FUNCTION: Unloads the driver
128 * DriverObject = Pointer to driver object created by the system
137 PDRIVER_OBJECT DriverObject
,
138 PUNICODE_STRING RegistryPath
)
140 * FUNCTION: Called by the system to initialize the driver
142 * DriverObject = object describing this driver
143 * RegistryPath = path to our configuration entries
145 * Status of operation
148 PDEVICE_EXTENSION DeviceExt
;
149 PDEVICE_OBJECT DeviceObject
;
150 UNICODE_STRING DeviceName
= ROS_STRING_INITIALIZER(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
] = (PDRIVER_DISPATCH
)AfdCreate
;
172 DriverObject
->MajorFunction
[IRP_MJ_CLOSE
] = (PDRIVER_DISPATCH
)AfdClose
;
173 DriverObject
->MajorFunction
[IRP_MJ_READ
] = (PDRIVER_DISPATCH
)AfdRead
;
174 DriverObject
->MajorFunction
[IRP_MJ_WRITE
] = (PDRIVER_DISPATCH
)AfdWrite
;
175 DriverObject
->MajorFunction
[IRP_MJ_FILE_SYSTEM_CONTROL
] = (PDRIVER_DISPATCH
)AfdFileSystemControl
;
176 DriverObject
->MajorFunction
[IRP_MJ_DEVICE_CONTROL
] = (PDRIVER_DISPATCH
)AfdDispatch
;
177 DriverObject
->MajorFunction
[IRP_MJ_CLEANUP
] = (PDRIVER_DISPATCH
)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
;