[NDISUIO]
[reactos.git] / drivers / network / ndisuio / main.c
1 /*
2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS NDIS User I/O driver
4 * FILE: main.c
5 * PURPOSE: Driver entry point and protocol initialization
6 * PROGRAMMERS: Cameron Gutman (cameron.gutman@reactos.org)
7 */
8
9 #include "ndisuio.h"
10
11 #define NDEBUG
12 #include <debug.h>
13
14 PDEVICE_OBJECT GlobalDeviceObject;
15 NDIS_HANDLE GlobalProtocolHandle;
16
17 VOID NTAPI NduUnload(PDRIVER_OBJECT DriverObject)
18 {
19 IoDeleteDevice(GlobalDeviceObject);
20
21 DPRINT("NDISUIO: Unloaded\n");
22 }
23
24 NTSTATUS
25 NTAPI
26 DriverEntry(PDRIVER_OBJECT DriverObject,
27 PUNICODE_STRING RegistryPath)
28 {
29 NTSTATUS Status;
30 NDIS_PROTOCOL_CHARACTERISTICS Chars;
31
32 /* Setup dispatch functions */
33 DriverObject->MajorFunction[IRP_MJ_CREATE] = NduDispatchCreate;
34 DriverObject->MajorFunction[IRP_MJ_CLOSE] = NduDispatchClose;
35 DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = NduDispatchDeviceControl;
36 DriverObject->MajorFunction[IRP_MJ_READ] = NduDispatchRead;
37 DriverObject->MajorFunction[IRP_MJ_WRITE] = NduDispatchWrite;
38 DriverObject->DriverUnload = NduUnload;
39
40 /* Create the NDISUIO device object */
41 Status = IoCreateDevice(DriverObject,
42 0,
43 NULL, // FIXME
44 NDISUIO_DEVICE_NAME,
45 FILE_DEVICE_SECURE_OPEN,
46 FALSE,
47 &GlobalDeviceObject);
48 if (!NT_SUCCESS(Status))
49 {
50 DPRINT1("Failed to create device object with status 0x%x\n", Status);
51 return Status;
52 }
53
54 /* Register the protocol with NDIS */
55 RtlZeroMemory(&Chars, sizeof(Chars));
56 Chars.MajorNdisVersion = NDIS_MAJOR_VERSION;
57 Chars.MinorNdisVersion = NDIS_MINOR_VERSION;
58 Chars.OpenAdapterCompleteHandler = NduOpenAdapterComplete;
59 Chars.CloseAdapterCompleteHandler = NduCloseAdapterComplete;
60 Chars.SendCompleteHandler = NduSendComplete;
61 Chars.TransferDataCompleteHandler = NduTransferDataComplete;
62 Chars.ResetCompleteHandler = NduResetComplete;
63 Chars.RequestCompleteHandler = NduRequestComplete;
64 Chars.ReceiveHandler = NduReceive;
65 Chars.ReceiveComplete = NduReceiveComplete;
66 Chars.StatusHandler = NduStatus;
67 Chars.StatusCompleteHandler = NduStatusComplete;
68 Chars.Name = NULL; //FIXME
69 Chars.ReceivePacketHandler = NULL; //NduReceivePacket
70 Chars.BindAdapterHandler = NduBindAdapter;
71 Chars.UnbindAdapterHandler = NduUnbindAdapter;
72 Chars.PnPEventHandler = NduPnPEvent;
73
74 NdisRegisterProtocol(&Status,
75 &GlobalProtocolHandle,
76 &Chars,
77 sizeof(Chars));
78 if (Status != NDIS_STATUS_SUCCESS)
79 {
80 DPRINT1("Failed to register protocol with status 0x%x\n", Status);
81 IoDeleteDevice(GlobalDeviceObject);
82 return Status;
83 }
84
85 DPRINT("NDISUIO: Loaded\n");
86
87 return STATUS_SUCCESS;
88 }